leaflet-tual 0.1.0 → 1.0.0

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/react.ts","../package.json","../src/core/shared/constants.ts","../src/core/shared/geo.ts","../src/core/shared/canvas-render.ts","../src/core/entities/arrow/arrow-geometry.ts","../src/core/entities/arrow/render-arrow.ts","../src/core/entities/freedraw/render-freedraw.ts","../src/core/entities/shape/trace-shape.ts","../src/core/entities/shape/render-shape.ts","../src/core/entities/ruler/render-ruler.ts","../src/core/entities/note/note-geometry.ts","../src/core/entities/text/text-geometry.ts","../src/core/features/freedraw-drag-handler.ts","../src/core/features/drawing-drag-handlers.ts","../src/core/features/select-drag-handlers.ts","../src/core/features/canvas-painter.ts","../src/core/features/map-sync.ts","../src/core/features/canvas-controller.ts","../src/core/features/create-leaflet-canvas.ts","../src/core/index.ts","../src/react/entities/shape/InlineShapeLabelEditor.tsx","../src/react/entities/note/NoteOverlay.tsx","../src/react/entities/note/utils.ts","../src/react/entities/note/use-note-drag-resize.ts","../src/react/entities/note/note-resize-handler.ts","../src/react/widgets/CanvasToolbar/icons.tsx","../src/react/entities/note/NoteCardHeader.tsx","../src/react/entities/note/NoteCardView.tsx","../src/react/entities/note/NoteCustomRenderView.tsx","../src/react/entities/text/TextOverlay.tsx","../src/react/entities/text/utils.ts","../src/react/entities/text/use-text-drag.ts","../src/react/entities/text/TextOverlayView.tsx","../src/react/entities/text/TextCustomRenderView.tsx","../src/react/features/use-leaflet-sync.ts","../src/react/features/use-leaflet-canvas.ts","../src/react/features/use-canvas-history.ts","../src/react/features/use-canvas-styles.ts","../src/react/widgets/CanvasToolbar/CanvasToolbar.tsx","../src/react/widgets/CanvasToolbar/constants.ts","../src/react/widgets/CanvasToolbar/toolbar-helpers.ts","../src/react/widgets/CanvasToolbar/types.ts","../src/react/widgets/CanvasToolbar/utils.ts","../src/react/widgets/CanvasToolbar/CollapseButtons.tsx","../src/react/widgets/CanvasToolbar/action-buttons-styles.ts","../src/react/widgets/CanvasToolbar/ActionButtons.tsx","../src/react/widgets/CanvasToolbar/ToolbarToolButtons.tsx","../src/react/widgets/CanvasToolbar/ArrowDropdown.tsx","../src/react/widgets/CanvasToolbar/ShapesModal.tsx","../src/react/widgets/CanvasToolbar/ShapesModalGrid.tsx","../src/react/widgets/CanvasToolbar/PrimaryToolbarStrip.tsx","../src/react/widgets/CanvasToolbar/ContextualSettingsBar.tsx","../src/react/widgets/CanvasToolbar/PixelSelect.tsx","../src/react/widgets/CanvasToolbar/use-toolbar-context.ts","../src/react/widgets/LeafletCanvas/LeafletCanvas.tsx","../src/react/widgets/LeafletCanvas/LeafletCanvasDom.tsx","../src/react/widgets/LeafletCanvas/use-leaflet-canvas-overlay.ts","../src/react/widgets/LeafletCanvas/use-canvas-painter.ts","../src/react/widgets/LeafletCanvas/use-canvas-keyboard-shortcuts.ts","../src/react/widgets/LeafletCanvas/use-select-interactions.ts","../src/react/widgets/LeafletCanvas/use-drawing-interactions.ts","../src/react/widgets/LeafletCanvas/use-block-map-dblclick.ts","../src/react/widgets/LeafletCanvas/use-outside-canvas-deselect.ts"],"sourcesContent":["/**\n * leaflet-tual/react — subpath entry for React components and hooks.\n *\n * Kept as a separate entry point so React peer dependencies are only ever\n * pulled in by consumers who explicitly import `leaflet-tual/react`.\n * The core (`leaflet-tual` / `leaflet-tual/core`) stays framework-agnostic.\n */\n\nexport * from './react/index.js'\n\n","{\n \"name\": \"leaflet-tual\",\n \"version\": \"0.1.0\",\n \"description\": \"Framework-agnostic interactive canvas and annotation toolkit for Leaflet maps — draw arrows, shapes, freehand sketches, rulers, notes, and text pinned to geo-coordinates. Optional React bindings.\",\n \"type\": \"module\",\n \"sideEffects\": false,\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n },\n \"default\": \"./dist/index.js\"\n },\n \"./core\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n },\n \"default\": \"./dist/index.js\"\n },\n \"./react\": {\n \"types\": \"./dist/react.d.ts\",\n \"import\": {\n \"types\": \"./dist/react.d.ts\",\n \"default\": \"./dist/react.js\"\n },\n \"require\": {\n \"types\": \"./dist/react.d.cts\",\n \"default\": \"./dist/react.cjs\"\n },\n \"default\": \"./dist/react.js\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"author\": \"Yusuf Arslan\",\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/yusufarsln98/leaflet-tual.git\",\n \"directory\": \"packages/leaflet-tual\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/yusufarsln98/leaflet-tual/issues\"\n },\n \"publishConfig\": {\n \"access\": \"public\",\n \"registry\": \"https://registry.npmjs.org/\"\n },\n \"keywords\": [\n \"leaflet\",\n \"leaflet-tual\",\n \"tual\",\n \"tuval\",\n \"canvas\",\n \"annotation\",\n \"map-tools\",\n \"arrows\",\n \"notes\",\n \"gis\",\n \"overlay\",\n \"framework-agnostic\",\n \"vanilla-js\",\n \"react\",\n \"react-leaflet\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"lint\": \"eslint src --ext ts,tsx\",\n \"typecheck\": \"tsc --noEmit\",\n \"format\": \"prettier --write \\\"src/**/*.{ts,tsx}\\\"\",\n \"format:check\": \"prettier --check \\\"src/**/*.{ts,tsx}\\\"\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"version\": \"changeset version\",\n \"release\": \"npm run build && changeset publish\"\n },\n \"peerDependencies\": {\n \"leaflet\": \"^1.9.0\",\n \"react\": \"^18.0.0 || ^19.0.0\",\n \"react-dom\": \"^18.0.0 || ^19.0.0\",\n \"react-leaflet\": \"^4.0.0 || ^5.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"react\": {\n \"optional\": true\n },\n \"react-dom\": {\n \"optional\": true\n },\n \"react-leaflet\": {\n \"optional\": true\n }\n },\n \"devDependencies\": {\n \"@changesets/cli\": \"^2.27.1\",\n \"@testing-library/dom\": \"^10.4.0\",\n \"@testing-library/react\": \"^16.2.0\",\n \"@types/leaflet\": \"^1.9.16\",\n \"@types/node\": \"^22.13.0\",\n \"@types/react\": \"^19.0.0\",\n \"@types/react-dom\": \"^19.0.0\",\n \"eslint\": \"^9.20.0\",\n \"eslint-plugin-react-hooks\": \"^5.1.0\",\n \"jsdom\": \"^26.0.0\",\n \"leaflet\": \"^1.9.4\",\n \"prettier\": \"^3.5.0\",\n \"react\": \"^19.0.0\",\n \"react-dom\": \"^19.0.0\",\n \"react-leaflet\": \"^5.0.0\",\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"^5.7.0\",\n \"typescript-eslint\": \"^8.24.0\",\n \"vitest\": \"^3.0.0\"\n }\n}\n","import type { ArrowStyle, CanvasAnnotationTheme } from '../types/index.js'\n\nexport const TOOL_TO_ARROW_STYLE: Record<string, ArrowStyle | undefined> = {\n 'arrow-linear': 'linear',\n 'arrow-curved': 'curved',\n 'arrow-bi': 'bi',\n 'arrow-elbow': 'elbow',\n 'arrow-s-curve': 's-curve',\n}\n\nexport const STROKE_COLORS = [\n '#000000', // Black (Default)\n '#4b5563', // Slate Gray\n '#2563eb', // Blue\n '#dc2626', // Red\n '#16a34a', // Green\n '#d97706', // Amber\n '#9333ea', // Purple\n '#0891b2', // Cyan\n] as const\n\nexport interface NoteColorTheme {\n name: string\n bg: string\n border: string\n header: string\n text: string\n}\n\nexport const NOTE_COLOR_THEMES: readonly NoteColorTheme[] = [\n {\n name: 'Amber',\n bg: '#fef9c3',\n border: '#fde047',\n header: '#fef08a',\n text: '#422006',\n },\n {\n name: 'Sky',\n bg: '#e0f2fe',\n border: '#7dd3fc',\n header: '#bae6fd',\n text: '#0c4a6e',\n },\n {\n name: 'Emerald',\n bg: '#dcfce7',\n border: '#86efac',\n header: '#bbf7d0',\n text: '#064e3b',\n },\n {\n name: 'Rose',\n bg: '#ffe4e6',\n border: '#fda4af',\n header: '#fecdd3',\n text: '#881337',\n },\n {\n name: 'Violet',\n bg: '#f3e8ff',\n border: '#d8b4fe',\n header: '#e9d5ff',\n text: '#3b0764',\n },\n {\n name: 'Dark Slate',\n bg: '#1e293b',\n border: '#334155',\n header: '#0f172a',\n text: '#f8fafc',\n },\n {\n name: 'Midnight',\n bg: '#111827',\n border: '#374151',\n header: '#030712',\n text: '#f9fafb',\n },\n] as const\n\nexport const DEFAULT_STROKE_COLOR = '#000000'\nexport const DEFAULT_STROKE_WIDTH = 2\nexport const DEFAULT_STROKE_WIDTH_OPTIONS: readonly number[] = [\n 1, 2, 3, 4, 5, 6, 8, 10, 12,\n] as const\nexport const STROKE_WIDTH_OPTIONS = DEFAULT_STROKE_WIDTH_OPTIONS\nexport const DEFAULT_NOTE_BG = '#fef9c3'\nexport const DEFAULT_NOTE_TEXT = '#422006'\nexport const DEFAULT_FONT_SIZE = 16\nexport const DEFAULT_FONT_SIZE_OPTIONS: readonly number[] = [\n 10, 12, 14, 16, 18, 20, 24, 28, 32, 36, 40, 48,\n] as const\nexport const FONT_SIZE_OPTIONS = DEFAULT_FONT_SIZE_OPTIONS\n\n/**\n * Super simple unified annotation default theme matching basic HTML element appearance.\n */\nexport const DEFAULT_ANNOTATION_THEME: Readonly<CanvasAnnotationTheme> = {\n selectionGlowColor: 'rgba(0, 0, 0, 0.2)',\n selectionGlowWidth: 6,\n guideLineDash: [4, 4],\n guideLineColor: 'rgba(100, 100, 100, 0.6)',\n guideLineWidth: 1.2,\n endpointHandleColor: '#4f4f4f',\n controlHandleColor: '#4f4f4f',\n handleFillColor: '#ffffff',\n handleRadius: 5,\n handleStrokeWidth: 2,\n shadowColor: 'rgba(0, 0, 0, 0.2)',\n shadowBlur: 3,\n shadowOffsetY: 1.5,\n labelBackgroundColor: '#ffffff',\n labelTextColor: '#000000',\n labelFont: '12px system-ui, -apple-system, sans-serif',\n labelBorderWidth: 1,\n labelBorderRadius: 2,\n labelPaddingX: 6,\n labelPaddingY: 18,\n shapeDefaultFillOpacity: 0.16,\n shapeBorderRadius: 0,\n} as const\n\n\n\n","import type L from 'leaflet'\nimport type { GeoPoint, ScreenPoint } from '../types/index.js'\n\nlet idCounter = 0\n\nexport function createId(prefix = 'rlc'): string {\n idCounter += 1\n const randomPart = Math.random().toString(36).slice(2, 8)\n return `${prefix}-${Date.now().toString(36)}-${idCounter}-${randomPart}`\n}\n\nexport function geoToScreen(map: L.Map, point: GeoPoint): ScreenPoint {\n const containerPt = map.latLngToContainerPoint([point.lat, point.lng])\n return { x: containerPt.x, y: containerPt.y }\n}\n\nexport function screenToGeo(map: L.Map, point: ScreenPoint): GeoPoint {\n const latLng = map.containerPointToLatLng([point.x, point.y])\n return { lat: latLng.lat, lng: latLng.lng }\n}\n\nexport function constrainToAspectRatio(\n anchor: ScreenPoint,\n target: ScreenPoint,\n aspectRatio = 1,\n): ScreenPoint {\n const safeRatio = aspectRatio > 0 ? aspectRatio : 1\n const dx = target.x - anchor.x\n const dy = target.y - anchor.y\n const absDx = Math.abs(dx)\n const absDy = Math.abs(dy)\n const signX = dx >= 0 ? 1 : -1\n const signY = dy >= 0 ? 1 : -1\n\n if (absDx / safeRatio >= absDy) {\n return {\n x: anchor.x + signX * absDx,\n y: anchor.y + signY * (absDx / safeRatio),\n }\n }\n return {\n x: anchor.x + signX * (absDy * safeRatio),\n y: anchor.y + signY * absDy,\n }\n}\n\nexport function constrainAngleTo45Degrees(\n anchor: ScreenPoint,\n target: ScreenPoint,\n): ScreenPoint {\n const dx = target.x - anchor.x\n const dy = target.y - anchor.y\n const dist = Math.hypot(dx, dy)\n if (dist === 0) return target\n const angle = Math.atan2(dy, dx)\n const snapStep = Math.PI / 4\n const snappedAngle = Math.round(angle / snapStep) * snapStep\n return {\n x: anchor.x + Math.cos(snappedAngle) * dist,\n y: anchor.y + Math.sin(snappedAngle) * dist,\n }\n}\n\nexport function computeDefaultControlGeoPoint(\n start: GeoPoint,\n end: GeoPoint,\n curvature = 0.25,\n): GeoPoint {\n const midLat = (start.lat + end.lat) / 2\n const midLng = (start.lng + end.lng) / 2\n const dLat = end.lat - start.lat\n const dLng = end.lng - start.lng\n return {\n lat: midLat + dLng * curvature,\n lng: midLng - dLat * curvature,\n }\n}\n\nexport function getQuadraticBezierPoint(\n p0: ScreenPoint,\n p1: ScreenPoint,\n p2: ScreenPoint,\n t: number,\n): ScreenPoint {\n const invT = 1 - t\n return {\n x: invT * invT * p0.x + 2 * invT * t * p1.x + t * t * p2.x,\n y: invT * invT * p0.y + 2 * invT * t * p1.y + t * t * p2.y,\n }\n}\n\nexport function getQuadraticEndAngle(\n p0: ScreenPoint,\n p1: ScreenPoint,\n p2: ScreenPoint,\n): number {\n const dx = p2.x - p1.x\n const dy = p2.y - p1.y\n if (Math.hypot(dx, dy) < 0.001) {\n return Math.atan2(p2.y - p0.y, p2.x - p0.x)\n }\n return Math.atan2(dy, dx)\n}\n\nexport function distanceToSegment(\n p: ScreenPoint,\n v: ScreenPoint,\n w: ScreenPoint,\n): number {\n const l2 = (w.x - v.x) ** 2 + (w.y - v.y) ** 2\n if (l2 === 0) return Math.hypot(p.x - v.x, p.y - v.y)\n let t = ((p.x - v.x) * (w.x - v.x) + (p.y - v.y) * (w.y - v.y)) / l2\n t = Math.max(0, Math.min(1, t))\n const projX = v.x + t * (w.x - v.x)\n const projY = v.y + t * (w.y - v.y)\n return Math.hypot(p.x - projX, p.y - projY)\n}\n\nexport function distanceToQuadraticBezier(\n p: ScreenPoint,\n p0: ScreenPoint,\n p1: ScreenPoint,\n p2: ScreenPoint,\n steps = 24,\n): number {\n let minDistance = Infinity\n let prev = p0\n for (let i = 1; i <= steps; i += 1) {\n const curr = getQuadraticBezierPoint(p0, p1, p2, i / steps)\n const dist = distanceToSegment(p, prev, curr)\n if (dist < minDistance) minDistance = dist\n prev = curr\n }\n return minDistance\n}\n\nexport function getMapDimensions(\n map: L.Map | null | undefined,\n): { width: number; height: number } | null {\n if (!map) return null\n try {\n const size = map.getSize?.()\n if (size && size.x > 0 && size.y > 0) return { width: size.x, height: size.y }\n } catch { /* ignore */ }\n try {\n const rect = map.getContainer?.()?.getBoundingClientRect?.()\n if (rect && rect.width > 0 && rect.height > 0) return { width: rect.width, height: rect.height }\n } catch { /* ignore */ }\n return null\n}\n\nexport function truncateCanvasText(\n ctx: CanvasRenderingContext2D,\n text: string,\n maxWidth: number,\n): string {\n if (!text || maxWidth <= 0) return ''\n if (ctx.measureText(text).width <= maxWidth) return text\n\n const ellipsis = '…'\n if (ctx.measureText(ellipsis).width >= maxWidth) return ''\n\n let low = 0\n let high = text.length\n let best = ''\n while (low <= high) {\n const mid = Math.floor((low + high) / 2)\n const candidate = text.slice(0, mid) + ellipsis\n if (ctx.measureText(candidate).width <= maxWidth) {\n best = candidate\n low = mid + 1\n } else {\n high = mid - 1\n }\n }\n return best || ellipsis\n}\n\nexport function calculateZoomFontSize(\n initialFontSize = 16,\n currentZoom: number | null,\n baseZoom = 14,\n options?: { min?: number; max?: number; scaleFactor?: number },\n): number {\n if (currentZoom === null || typeof currentZoom !== 'number') return initialFontSize\n const factor = options?.scaleFactor ?? 1.22\n const min = options?.min ?? 9\n const max = options?.max ?? 72\n const scaled = initialFontSize * Math.pow(factor, currentZoom - baseZoom)\n return Math.round(Math.max(min, Math.min(max, scaled)))\n}\n\nexport function calculateGeodesicDistance(p1: GeoPoint, p2: GeoPoint): number {\n const R = 6371000 // Earth radius in meters\n const dLat = ((p2.lat - p1.lat) * Math.PI) / 180\n const dLng = ((p2.lng - p1.lng) * Math.PI) / 180\n const lat1 = (p1.lat * Math.PI) / 180\n const lat2 = (p2.lat * Math.PI) / 180\n\n const sinDLat = Math.sin(dLat / 2)\n const sinDLng = Math.sin(dLng / 2)\n const a = sinDLat * sinDLat + Math.cos(lat1) * Math.cos(lat2) * sinDLng * sinDLng\n const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))\n return R * c\n}\n\nexport function formatRealWorldDistance(\n meters: number,\n unit: 'metric' | 'imperial' = 'metric',\n): string {\n if (unit === 'imperial') {\n const feet = meters * 3.28084\n if (feet < 1000) {\n return `${Math.round(feet)} ft`\n }\n const miles = feet / 5280\n return `${miles >= 10 ? miles.toFixed(1) : miles.toFixed(2)} mi`\n }\n\n if (meters < 1000) {\n return `${Math.round(meters)} m`\n }\n const km = meters / 1000\n return `${km >= 10 ? km.toFixed(1) : km.toFixed(2)} km`\n}\n\nexport function calculateLineDistance(points: GeoPoint[]): number {\n let total = 0\n for (let i = 0; i < points.length - 1; i += 1) {\n total += calculateGeodesicDistance(points[i], points[i + 1])\n }\n return total\n}\n","import type { CanvasAnnotationTheme, ScreenPoint } from '../types/index.js'\nimport { truncateCanvasText } from './geo.js'\n\nexport function drawCanvasHandle(\n ctx: CanvasRenderingContext2D,\n pt: ScreenPoint,\n strokeColor: string,\n fillColor: string,\n radius: number,\n strokeWidth = 2,\n) {\n ctx.save()\n ctx.beginPath()\n ctx.arc(pt.x, pt.y, radius, 0, Math.PI * 2)\n ctx.fillStyle = fillColor\n ctx.fill()\n ctx.lineWidth = strokeWidth\n ctx.strokeStyle = strokeColor\n ctx.stroke()\n ctx.restore()\n}\n\nexport function drawCanvasLabelPill(\n ctx: CanvasRenderingContext2D,\n label: string,\n midX: number,\n midY: number,\n strokeColor: string,\n maxAllowedBoxWidth: number,\n theme?: CanvasAnnotationTheme,\n) {\n ctx.save()\n ctx.font = theme?.labelFont ?? '12px system-ui, -apple-system, sans-serif'\n const padX = theme?.labelPaddingX ?? 6\n const maxTextWidth = Math.max(10, maxAllowedBoxWidth - padX * 2)\n const displayText = truncateCanvasText(ctx, label, maxTextWidth)\n\n if (displayText) {\n const metrics = ctx.measureText(displayText)\n const boxW = Math.round(metrics.width + padX * 2)\n const boxH = theme?.labelPaddingY ?? 18\n const boxX = Math.round(midX - boxW / 2)\n const boxY = Math.round(midY - boxH / 2)\n const borderRadius = theme?.labelBorderRadius ?? 2\n\n if (theme?.labelShadowColor) {\n ctx.shadowColor = theme.labelShadowColor\n ctx.shadowBlur = theme.labelShadowBlur ?? 3\n }\n\n ctx.fillStyle = theme?.labelBackgroundColor ?? '#ffffff'\n ctx.strokeStyle = theme?.labelBorderColor ?? strokeColor\n ctx.lineWidth = theme?.labelBorderWidth ?? 1\n ctx.beginPath()\n if (typeof ctx.roundRect === 'function') {\n ctx.roundRect(boxX, boxY, boxW, boxH, borderRadius)\n } else {\n ctx.rect(boxX, boxY, boxW, boxH)\n }\n ctx.fill()\n ctx.stroke()\n\n ctx.fillStyle = theme?.labelTextColor ?? '#000000'\n ctx.textAlign = 'center'\n ctx.textBaseline = 'middle'\n ctx.fillText(displayText, midX, midY)\n }\n ctx.restore()\n}\n\n","import type { ArrowItem, ScreenPoint } from '../../types/index.js'\nimport type { ProjectedArrow } from './render-arrow.js'\n\nexport function drawArrowHead(\n ctx: CanvasRenderingContext2D,\n tip: ScreenPoint,\n angle: number,\n size: number,\n color: string,\n filled = true,\n) {\n const spread = Math.PI / 6.5\n const x1 = tip.x - size * Math.cos(angle - spread)\n const y1 = tip.y - size * Math.sin(angle - spread)\n const x2 = tip.x - size * Math.cos(angle + spread)\n const y2 = tip.y - size * Math.sin(angle + spread)\n\n ctx.save()\n ctx.setLineDash([])\n ctx.beginPath()\n ctx.moveTo(tip.x, tip.y)\n ctx.lineTo(x1, y1)\n if (filled) {\n ctx.lineTo(x2, y2)\n ctx.closePath()\n ctx.fillStyle = color\n ctx.fill()\n } else {\n ctx.moveTo(tip.x, tip.y)\n ctx.lineTo(x2, y2)\n ctx.strokeStyle = color\n ctx.lineWidth = Math.max(2, size / 4.5)\n ctx.lineCap = 'round'\n ctx.stroke()\n }\n ctx.restore()\n}\n\nexport function traceArrowPath(\n ctx: CanvasRenderingContext2D,\n projected: ProjectedArrow,\n arrowStyle: ArrowItem['arrowStyle'],\n) {\n const { start, end, control } = projected\n ctx.moveTo(start.x, start.y)\n if (arrowStyle === 'curved') {\n ctx.quadraticCurveTo(control.x, control.y, end.x, end.y)\n } else if (arrowStyle === 'elbow') {\n ctx.lineTo(control.x, start.y)\n ctx.lineTo(control.x, end.y)\n ctx.lineTo(end.x, end.y)\n } else if (arrowStyle === 's-curve') {\n const dx = end.x - start.x\n const dy = end.y - start.y\n ctx.bezierCurveTo(start.x + dx * 0.5, start.y, start.x + dx * 0.5, start.y + dy, end.x, end.y)\n } else {\n ctx.lineTo(end.x, end.y)\n }\n}\n\n","import type L from 'leaflet'\nimport type { ArrowItem, ArrowRenderTheme, ScreenPoint } from '../../types/index.js'\nimport {\n computeDefaultControlGeoPoint,\n distanceToQuadraticBezier,\n distanceToSegment,\n geoToScreen,\n getQuadraticBezierPoint,\n getQuadraticEndAngle,\n} from '../../shared/geo.js'\nimport { drawCanvasHandle, drawCanvasLabelPill } from '../../shared/canvas-render.js'\nimport { drawArrowHead, traceArrowPath } from './arrow-geometry.js'\n\nexport type ArrowHandleType = 'start' | 'end' | 'control'\n\nexport interface ProjectedArrow {\n start: ScreenPoint\n end: ScreenPoint\n control: ScreenPoint\n}\n\nexport function projectArrow(map: L.Map, arrow: ArrowItem): ProjectedArrow {\n const start = geoToScreen(map, arrow.start)\n const end = geoToScreen(map, arrow.end)\n const needsOffsetControl =\n arrow.arrowStyle === 'curved' || arrow.arrowStyle === 's-curve'\n const controlGeo = arrow.controlPoint\n ? arrow.controlPoint\n : needsOffsetControl\n ? computeDefaultControlGeoPoint(arrow.start, arrow.end)\n : {\n lat: (arrow.start.lat + arrow.end.lat) / 2,\n lng: (arrow.start.lng + arrow.end.lng) / 2,\n }\n const control = geoToScreen(map, controlGeo)\n return { start, end, control }\n}\n\nexport function renderArrowOnCanvas(\n ctx: CanvasRenderingContext2D,\n projected: ProjectedArrow,\n arrow: Pick<\n ArrowItem,\n 'arrowStyle' | 'color' | 'strokeWidth' | 'dashed' | 'headStyle' | 'label'\n >,\n options: {\n isSelected?: boolean\n isPreview?: boolean\n theme?: ArrowRenderTheme\n } = {},\n) {\n const { start, end, control } = projected\n const dist = Math.hypot(end.x - start.x, end.y - start.y)\n if (dist < 2) return\n\n const theme = options.theme\n const headSize = Math.max(12, arrow.strokeWidth * 3.8)\n\n let endAngle = Math.atan2(end.y - start.y, end.x - start.x)\n let startAngle = Math.atan2(start.y - end.y, start.x - end.x)\n\n if (arrow.arrowStyle === 'curved') {\n endAngle = getQuadraticEndAngle(start, control, end)\n startAngle = getQuadraticEndAngle(end, control, start)\n } else if (arrow.arrowStyle === 'elbow') {\n const dx = end.x - control.x\n const dy = end.y - start.y\n endAngle = Math.abs(dx) > 1 ? Math.atan2(0, dx) : Math.atan2(dy, 0)\n const sdx = start.x - control.x\n startAngle = Math.abs(sdx) > 1 ? Math.atan2(0, sdx) : Math.atan2(-dy, 0)\n } else if (arrow.arrowStyle === 's-curve') {\n const dx = end.x - start.x\n endAngle = getQuadraticEndAngle(start, { x: start.x + dx * 0.5, y: end.y }, end)\n }\n\n ctx.save()\n if (options.isPreview) ctx.globalAlpha = 0.85\n\n if (options.isSelected) {\n ctx.save()\n ctx.beginPath()\n traceArrowPath(ctx, projected, arrow.arrowStyle)\n ctx.strokeStyle = theme?.selectionGlowColor ?? 'rgba(0, 0, 0, 0.2)'\n ctx.lineWidth = arrow.strokeWidth + (theme?.selectionGlowWidth ?? 6)\n ctx.lineCap = 'round'\n ctx.lineJoin = 'round'\n ctx.stroke()\n ctx.restore()\n }\n\n ctx.save()\n ctx.shadowColor = theme?.shadowColor ?? 'rgba(0, 0, 0, 0.2)'\n ctx.shadowBlur = theme?.shadowBlur ?? 3\n ctx.shadowOffsetY = theme?.shadowOffsetY ?? 1.5\n\n ctx.beginPath()\n traceArrowPath(ctx, projected, arrow.arrowStyle)\n ctx.strokeStyle = arrow.color\n ctx.lineWidth = arrow.strokeWidth\n ctx.lineCap = 'round'\n ctx.lineJoin = 'round'\n const isDashed = Boolean(arrow.dashed || (arrow.arrowStyle as string) === 'dashed')\n ctx.setLineDash(isDashed ? [arrow.strokeWidth * 3, arrow.strokeWidth * 2] : [])\n ctx.stroke()\n\n const headStyle = arrow.headStyle ?? (arrow.arrowStyle === 'bi' ? 'both' : 'triangle')\n if (headStyle !== 'none') {\n drawArrowHead(ctx, end, endAngle, headSize, arrow.color, headStyle !== 'open')\n if (headStyle === 'both') {\n drawArrowHead(ctx, start, startAngle, headSize, arrow.color, true)\n }\n }\n ctx.restore()\n\n if (arrow.label) {\n const minArrowSize = typeof theme?.labelMinShapeSize === 'number' ? theme.labelMinShapeSize : 24\n if (minArrowSize <= 0 || dist >= minArrowSize) {\n const rawMid =\n arrow.arrowStyle === 'curved'\n ? getQuadraticBezierPoint(start, control, end, 0.5)\n : arrow.arrowStyle === 'elbow'\n ? { x: control.x, y: (start.y + end.y) / 2 }\n : { x: (start.x + end.x) / 2, y: (start.y + end.y) / 2 }\n const fitToShape = theme?.fitLabelsToShape !== false\n const maxW = theme?.labelMaxTextWidth ?? (fitToShape ? Math.max(48, Math.min(280, dist * 1.6)) : Infinity)\n drawCanvasLabelPill(ctx, arrow.label, Math.round(rawMid.x), Math.round(rawMid.y), arrow.color, maxW, theme)\n }\n }\n\n if (options.isSelected) {\n const handleRadius = theme?.handleRadius ?? 5\n const fill = theme?.handleFillColor ?? '#ffffff'\n const endpointColor = theme?.endpointHandleColor ?? '#4f4f4f'\n const controlColor = theme?.controlHandleColor ?? '#767676'\n const strokeWidth = theme?.handleStrokeWidth ?? 2\n\n if (arrow.arrowStyle === 'curved' || arrow.arrowStyle === 'elbow') {\n ctx.save()\n ctx.beginPath()\n ctx.setLineDash(theme?.guideLineDash ? [...theme.guideLineDash] : [4, 4])\n ctx.moveTo(start.x, start.y)\n ctx.lineTo(control.x, control.y)\n ctx.lineTo(end.x, end.y)\n ctx.strokeStyle = theme?.guideLineColor ?? 'rgba(100, 100, 100, 0.6)'\n ctx.lineWidth = theme?.guideLineWidth ?? 1.2\n ctx.stroke()\n ctx.restore()\n drawCanvasHandle(ctx, control, controlColor, fill, handleRadius + 0.5, strokeWidth)\n }\n drawCanvasHandle(ctx, start, endpointColor, fill, handleRadius, strokeWidth)\n drawCanvasHandle(ctx, end, endpointColor, fill, handleRadius, strokeWidth)\n }\n\n ctx.restore()\n}\n\nexport function hitTestArrowHandle(\n point: ScreenPoint,\n projected: ProjectedArrow,\n arrow: ArrowItem,\n tolerance = 11,\n): ArrowHandleType | null {\n if (Math.hypot(point.x - projected.end.x, point.y - projected.end.y) <= tolerance) return 'end'\n if (Math.hypot(point.x - projected.start.x, point.y - projected.start.y) <= tolerance) return 'start'\n if (\n (arrow.arrowStyle === 'curved' || arrow.arrowStyle === 'elbow') &&\n Math.hypot(point.x - projected.control.x, point.y - projected.control.y) <= tolerance\n ) {\n return 'control'\n }\n return null\n}\n\nexport function hitTestArrow(\n point: ScreenPoint,\n projected: ProjectedArrow,\n arrow: ArrowItem,\n tolerance = 9,\n): boolean {\n const hitThreshold = Math.max(tolerance, arrow.strokeWidth / 2 + 6)\n if (arrow.arrowStyle === 'curved') {\n return distanceToQuadraticBezier(point, projected.start, projected.control, projected.end) <= hitThreshold\n }\n if (arrow.arrowStyle === 'elbow') {\n const c1 = { x: projected.control.x, y: projected.start.y }\n const c2 = { x: projected.control.x, y: projected.end.y }\n return (\n distanceToSegment(point, projected.start, c1) <= hitThreshold ||\n distanceToSegment(point, c1, c2) <= hitThreshold ||\n distanceToSegment(point, c2, projected.end) <= hitThreshold\n )\n }\n return distanceToSegment(point, projected.start, projected.end) <= hitThreshold\n}\n","import type L from 'leaflet'\nimport type {\n CanvasAnnotationTheme,\n FreeDrawItem,\n ScreenPoint,\n} from '../../types/index.js'\nimport { distanceToSegment, geoToScreen } from '../../shared/geo.js'\n\nexport function projectFreeDraw(\n map: L.Map,\n item: Pick<FreeDrawItem, 'points'>,\n): ScreenPoint[] {\n return item.points.map((pt) => geoToScreen(map, pt))\n}\n\nfunction traceSmoothPolyline(\n ctx: CanvasRenderingContext2D,\n points: ScreenPoint[],\n) {\n if (points.length === 0) return\n ctx.moveTo(points[0].x, points[0].y)\n\n if (points.length === 1) {\n ctx.lineTo(points[0].x + 0.5, points[0].y + 0.5)\n return\n }\n\n if (points.length === 2) {\n ctx.lineTo(points[1].x, points[1].y)\n return\n }\n\n for (let i = 1; i < points.length - 1; i += 1) {\n const midX = (points[i].x + points[i + 1].x) / 2\n const midY = (points[i].y + points[i + 1].y) / 2\n ctx.quadraticCurveTo(points[i].x, points[i].y, midX, midY)\n }\n\n const last = points[points.length - 1]\n ctx.lineTo(last.x, last.y)\n}\n\nexport function renderFreeDrawOnCanvas(\n ctx: CanvasRenderingContext2D,\n screenPoints: ScreenPoint[],\n item: Pick<FreeDrawItem, 'color' | 'strokeWidth' | 'dashed'>,\n options: {\n isSelected?: boolean\n isPreview?: boolean\n theme?: CanvasAnnotationTheme\n } = {},\n) {\n if (screenPoints.length === 0) return\n\n const theme = options.theme\n ctx.save()\n\n if (options.isPreview) {\n ctx.globalAlpha = 0.9\n }\n\n if (options.isSelected) {\n ctx.save()\n ctx.beginPath()\n traceSmoothPolyline(ctx, screenPoints)\n ctx.strokeStyle = theme?.selectionGlowColor ?? 'rgba(0, 0, 0, 0.2)'\n ctx.lineWidth = item.strokeWidth + (theme?.selectionGlowWidth ?? 6)\n ctx.lineCap = 'round'\n ctx.lineJoin = 'round'\n ctx.stroke()\n ctx.restore()\n }\n\n ctx.save()\n ctx.shadowColor = theme?.shadowColor ?? 'rgba(0, 0, 0, 0.2)'\n ctx.shadowBlur = theme?.shadowBlur ?? 3\n ctx.shadowOffsetY = theme?.shadowOffsetY ?? 1\n\n ctx.beginPath()\n traceSmoothPolyline(ctx, screenPoints)\n ctx.strokeStyle = item.color\n ctx.lineWidth = item.strokeWidth\n ctx.lineCap = 'round'\n ctx.lineJoin = 'round'\n if (item.dashed) {\n ctx.setLineDash([item.strokeWidth * 3, item.strokeWidth * 2])\n } else {\n ctx.setLineDash([])\n }\n ctx.stroke()\n ctx.restore()\n\n ctx.restore()\n}\n\nexport function hitTestFreeDraw(\n point: ScreenPoint,\n screenPoints: ScreenPoint[],\n item: FreeDrawItem,\n tolerance = 9,\n): boolean {\n if (screenPoints.length === 0) return false\n const threshold = Math.max(tolerance, item.strokeWidth / 2 + 6)\n if (screenPoints.length === 1) {\n return (\n Math.hypot(point.x - screenPoints[0].x, point.y - screenPoints[0].y) <=\n threshold\n )\n }\n\n // Fast bounding box check before segment iteration\n let minX = Infinity\n let minY = Infinity\n let maxX = -Infinity\n let maxY = -Infinity\n for (let i = 0; i < screenPoints.length; i += 1) {\n const p = screenPoints[i]\n if (p.x < minX) minX = p.x\n if (p.y < minY) minY = p.y\n if (p.x > maxX) maxX = p.x\n if (p.y > maxY) maxY = p.y\n }\n if (\n point.x < minX - threshold ||\n point.x > maxX + threshold ||\n point.y < minY - threshold ||\n point.y > maxY + threshold\n ) {\n return false\n }\n\n for (let i = 0; i < screenPoints.length - 1; i += 1) {\n if (\n distanceToSegment(point, screenPoints[i], screenPoints[i + 1]) <=\n threshold\n ) {\n return true\n }\n }\n return false\n}\n\n","import type {\n CanvasAnnotationTheme,\n ShapeKind,\n} from '../../types/index.js'\nimport type { ProjectedShape } from './render-shape.js'\n\nexport function tracePolygonShape(\n ctx: CanvasRenderingContext2D,\n proj: ProjectedShape,\n kind: ShapeKind,\n theme?: CanvasAnnotationTheme,\n) {\n const { minX, minY, maxX, maxY, width, height, cx, cy } = proj\n\n if (kind === 'square') {\n const radius = theme?.shapeBorderRadius ?? 0\n if (radius > 0 && typeof ctx.roundRect === 'function') {\n ctx.roundRect(minX, minY, width, height, radius)\n } else {\n ctx.rect(minX, minY, width, height)\n }\n return\n }\n\n if (kind === 'circle') {\n ctx.ellipse(cx, cy, width / 2, height / 2, 0, 0, Math.PI * 2)\n return\n }\n\n if (kind === 'triangle') {\n ctx.moveTo(cx, minY)\n ctx.lineTo(maxX, maxY)\n ctx.lineTo(minX, maxY)\n ctx.closePath()\n return\n }\n\n if (kind === 'diamond') {\n ctx.moveTo(cx, minY)\n ctx.lineTo(maxX, cy)\n ctx.lineTo(cx, maxY)\n ctx.lineTo(minX, cy)\n ctx.closePath()\n return\n }\n\n if (kind === 'hexagon') {\n const rx = width / 2\n const ry = height / 2\n for (let i = 0; i < 6; i += 1) {\n const angle = (Math.PI / 3) * i - Math.PI / 6\n const px = cx + rx * Math.cos(angle)\n const py = cy + ry * Math.sin(angle)\n if (i === 0) ctx.moveTo(px, py)\n else ctx.lineTo(px, py)\n }\n ctx.closePath()\n return\n }\n\n if (kind === 'star') {\n const spikes = 5\n const outerRx = width / 2\n const outerRy = height / 2\n const innerRx = outerRx * 0.42\n const innerRy = outerRy * 0.42\n for (let i = 0; i < spikes * 2; i += 1) {\n const rx = i % 2 === 0 ? outerRx : innerRx\n const ry = i % 2 === 0 ? outerRy : innerRy\n const angle = (i * Math.PI) / spikes - Math.PI / 2\n const px = cx + rx * Math.cos(angle)\n const py = cy + ry * Math.sin(angle)\n if (i === 0) ctx.moveTo(px, py)\n else ctx.lineTo(px, py)\n }\n ctx.closePath()\n return\n }\n\n if (kind === 'marker' || (kind as string) === 'cloud') {\n const rx = width / 2\n const ry = height * 0.36\n const headCy = minY + ry\n ctx.moveTo(cx, maxY)\n ctx.bezierCurveTo(minX + width * 0.05, minY + height * 0.7, minX, minY + height * 0.5, minX, headCy)\n ctx.ellipse(cx, headCy, rx, ry, 0, Math.PI, 0, false)\n ctx.bezierCurveTo(maxX, minY + height * 0.5, maxX - width * 0.05, minY + height * 0.7, cx, maxY)\n ctx.closePath()\n\n const innerRx = rx * 0.35\n const innerRy = ry * 0.35\n if (innerRx >= 2.5 && innerRy >= 2.5) {\n ctx.moveTo(cx + innerRx, headCy)\n ctx.ellipse(cx, headCy, innerRx, innerRy, 0, Math.PI * 2, 0, true)\n ctx.closePath()\n }\n return\n }\n\n if (kind === 'actor') {\n const headRadius = Math.min(width, height) * 0.16\n const headCy = minY + headRadius + height * 0.04\n const neckY = headCy + headRadius\n const hipY = minY + height * 0.64\n const armY = minY + height * 0.42\n const armSpan = width * 0.36\n const legSpan = width * 0.32\n\n ctx.moveTo(cx + headRadius, headCy)\n ctx.arc(cx, headCy, headRadius, 0, Math.PI * 2)\n ctx.closePath()\n ctx.moveTo(cx, neckY)\n ctx.lineTo(cx, hipY)\n ctx.moveTo(cx - armSpan, armY)\n ctx.lineTo(cx + armSpan, armY)\n ctx.moveTo(cx, hipY)\n ctx.lineTo(cx - legSpan, maxY)\n ctx.moveTo(cx, hipY)\n ctx.lineTo(cx + legSpan, maxY)\n }\n}\n\n","import type L from 'leaflet'\nimport type {\n CanvasAnnotationTheme,\n ScreenPoint,\n ShapeItem,\n} from '../../types/index.js'\nimport { geoToScreen } from '../../shared/geo.js'\nimport { drawCanvasHandle, drawCanvasLabelPill } from '../../shared/canvas-render.js'\nimport { tracePolygonShape } from './trace-shape.js'\n\nexport type ShapeHandleType = 'start' | 'end'\n\nexport interface ProjectedShape {\n start: ScreenPoint\n end: ScreenPoint\n minX: number\n minY: number\n maxX: number\n maxY: number\n width: number\n height: number\n cx: number\n cy: number\n}\n\nexport function projectShape(map: L.Map, shape: ShapeItem): ProjectedShape {\n const start = geoToScreen(map, shape.start)\n const end = geoToScreen(map, shape.end)\n const minX = Math.min(start.x, end.x)\n const minY = Math.min(start.y, end.y)\n const maxX = Math.max(start.x, end.x)\n const maxY = Math.max(start.y, end.y)\n const width = Math.max(4, maxX - minX)\n const height = Math.max(4, maxY - minY)\n return {\n start,\n end,\n minX,\n minY,\n maxX,\n maxY,\n width,\n height,\n cx: minX + width / 2,\n cy: minY + height / 2,\n }\n}\n\nexport function renderShapeOnCanvas(\n ctx: CanvasRenderingContext2D,\n projected: ProjectedShape,\n shape: Pick<\n ShapeItem,\n 'shape' | 'color' | 'fillColor' | 'filled' | 'strokeWidth' | 'dashed' | 'label'\n >,\n options: {\n isSelected?: boolean\n isPreview?: boolean\n theme?: CanvasAnnotationTheme\n } = {},\n) {\n if (projected.width < 4 && projected.height < 4) return\n\n const theme = options.theme\n ctx.save()\n if (options.isPreview) ctx.globalAlpha = 0.85\n\n if (options.isSelected) {\n ctx.save()\n ctx.beginPath()\n tracePolygonShape(ctx, projected, shape.shape, theme)\n ctx.strokeStyle = theme?.selectionGlowColor ?? 'rgba(0, 0, 0, 0.2)'\n ctx.lineWidth = shape.strokeWidth + (theme?.selectionGlowWidth ?? 6)\n ctx.lineCap = 'round'\n ctx.lineJoin = 'round'\n ctx.stroke()\n ctx.restore()\n }\n\n ctx.save()\n ctx.shadowColor = theme?.shadowColor ?? 'rgba(0, 0, 0, 0.2)'\n ctx.shadowBlur = theme?.shadowBlur ?? 3\n ctx.shadowOffsetY = theme?.shadowOffsetY ?? 1.5\n\n ctx.beginPath()\n tracePolygonShape(ctx, projected, shape.shape, theme)\n\n if (shape.filled) {\n const defaultFillOpacity = theme?.shapeDefaultFillOpacity ?? 0.16\n const fillHex = Math.round(Math.min(1, Math.max(0, defaultFillOpacity)) * 255)\n .toString(16)\n .padStart(2, '0')\n ctx.fillStyle = shape.fillColor ?? `${shape.color}${fillHex}`\n ctx.fill()\n }\n\n ctx.strokeStyle = shape.color\n ctx.lineWidth = shape.strokeWidth\n ctx.lineCap = 'round'\n ctx.lineJoin = 'round'\n ctx.setLineDash(shape.dashed ? [shape.strokeWidth * 3, shape.strokeWidth * 2] : [])\n ctx.stroke()\n ctx.restore()\n\n if (shape.label) {\n const minShapeSize = typeof theme?.labelMinShapeSize === 'number' ? theme.labelMinShapeSize : 18\n if (\n minShapeSize <= 0 ||\n (Math.max(projected.width, projected.height) >= minShapeSize &&\n projected.width >= 8 &&\n projected.height >= 8)\n ) {\n const rawLabelY = shape.shape === 'actor' ? projected.maxY + 14 : projected.cy\n const fitToShape = theme?.fitLabelsToShape !== false\n const maxW =\n theme?.labelMaxTextWidth ??\n (fitToShape ? Math.max(48, Math.min(280, projected.width * 2.2)) : Infinity)\n drawCanvasLabelPill(ctx, shape.label, Math.round(projected.cx), Math.round(rawLabelY), shape.color, maxW, theme)\n }\n }\n\n if (options.isSelected) {\n const handleRadius = theme?.handleRadius ?? 5\n const fill = theme?.handleFillColor ?? '#ffffff'\n const endpointColor = theme?.endpointHandleColor ?? '#4f4f4f'\n const strokeWidth = theme?.handleStrokeWidth ?? 2\n\n ctx.save()\n ctx.setLineDash(theme?.guideLineDash ? [...theme.guideLineDash] : [4, 4])\n ctx.strokeStyle = theme?.guideLineColor ?? 'rgba(100, 100, 100, 0.6)'\n ctx.lineWidth = theme?.guideLineWidth ?? 1.2\n ctx.strokeRect(projected.minX, projected.minY, projected.width, projected.height)\n ctx.restore()\n\n drawCanvasHandle(ctx, projected.start, endpointColor, fill, handleRadius, strokeWidth)\n drawCanvasHandle(ctx, projected.end, endpointColor, fill, handleRadius, strokeWidth)\n }\n\n ctx.restore()\n}\n\nexport function hitTestShapeHandle(\n point: ScreenPoint,\n projected: ProjectedShape,\n tolerance = 11,\n): ShapeHandleType | null {\n if (Math.hypot(point.x - projected.end.x, point.y - projected.end.y) <= tolerance) return 'end'\n if (Math.hypot(point.x - projected.start.x, point.y - projected.start.y) <= tolerance) return 'start'\n return null\n}\n\nexport function hitTestShape(\n point: ScreenPoint,\n projected: ProjectedShape,\n tolerance = 8,\n): boolean {\n return (\n point.x >= projected.minX - tolerance &&\n point.x <= projected.maxX + tolerance &&\n point.y >= projected.minY - tolerance &&\n point.y <= projected.maxY + tolerance\n )\n}\n","import type L from 'leaflet'\nimport type {\n CanvasAnnotationTheme,\n RulerItem,\n ScreenPoint,\n} from '../../types/index.js'\nimport {\n calculateGeodesicDistance,\n distanceToSegment,\n formatRealWorldDistance,\n geoToScreen,\n} from '../../shared/geo.js'\nimport {\n drawCanvasHandle,\n drawCanvasLabelPill,\n} from '../../shared/canvas-render.js'\n\nexport type RulerHandleType = 'start' | 'end'\n\nexport interface ProjectedRuler {\n start: ScreenPoint\n end: ScreenPoint\n mid: ScreenPoint\n lengthPx: number\n angle: number\n}\n\nexport function projectRuler(\n map: L.Map,\n ruler: Pick<RulerItem, 'start' | 'end'>,\n): ProjectedRuler {\n const start = geoToScreen(map, ruler.start)\n const end = geoToScreen(map, ruler.end)\n const mid = { x: (start.x + end.x) / 2, y: (start.y + end.y) / 2 }\n const lengthPx = Math.hypot(end.x - start.x, end.y - start.y)\n const angle = Math.atan2(end.y - start.y, end.x - start.x)\n return { start, end, mid, lengthPx, angle }\n}\n\nexport function renderRulerOnCanvas(\n ctx: CanvasRenderingContext2D,\n projected: ProjectedRuler,\n ruler: Pick<\n RulerItem,\n 'start' | 'end' | 'color' | 'strokeWidth' | 'dashed' | 'label' | 'unit'\n >,\n options: {\n isSelected?: boolean\n isPreview?: boolean\n theme?: CanvasAnnotationTheme\n } = {},\n) {\n const { start, end, mid, lengthPx, angle } = projected\n if (lengthPx < 2) return\n\n const theme = options.theme\n ctx.save()\n\n if (options.isPreview) {\n ctx.globalAlpha = 0.9\n }\n\n // Selection Glow\n if (options.isSelected) {\n ctx.save()\n ctx.beginPath()\n ctx.moveTo(start.x, start.y)\n ctx.lineTo(end.x, end.y)\n ctx.strokeStyle = theme?.selectionGlowColor ?? 'rgba(0, 0, 0, 0.2)'\n ctx.lineWidth = ruler.strokeWidth + (theme?.selectionGlowWidth ?? 6)\n ctx.lineCap = 'round'\n ctx.stroke()\n ctx.restore()\n }\n\n // Shadow\n ctx.save()\n ctx.shadowColor = theme?.shadowColor ?? 'rgba(0, 0, 0, 0.2)'\n ctx.shadowBlur = theme?.shadowBlur ?? 3\n ctx.shadowOffsetY = theme?.shadowOffsetY ?? 1.5\n\n // Main measurement line\n ctx.beginPath()\n ctx.moveTo(start.x, start.y)\n ctx.lineTo(end.x, end.y)\n ctx.strokeStyle = ruler.color\n ctx.lineWidth = ruler.strokeWidth\n ctx.lineCap = 'round'\n if (ruler.dashed) {\n ctx.setLineDash([ruler.strokeWidth * 3, ruler.strokeWidth * 2])\n } else {\n ctx.setLineDash([])\n }\n ctx.stroke()\n\n // Perpendicular end tick marks (T-caps)\n const perp = angle + Math.PI / 2\n const tickLen = Math.max(7, ruler.strokeWidth * 3.2)\n const dx = Math.cos(perp) * tickLen\n const dy = Math.sin(perp) * tickLen\n\n ctx.beginPath()\n ctx.setLineDash([])\n // Start cap\n ctx.moveTo(start.x - dx, start.y - dy)\n ctx.lineTo(start.x + dx, start.y + dy)\n // End cap\n ctx.moveTo(end.x - dx, end.y - dy)\n ctx.lineTo(end.x + dx, end.y + dy)\n ctx.stroke()\n ctx.restore()\n\n // Real world distance label badge\n const distMeters = calculateGeodesicDistance(ruler.start, ruler.end)\n const displayLabel = ruler.label\n ? ruler.label\n : formatRealWorldDistance(distMeters, ruler.unit)\n\n if (displayLabel) {\n const fitToShape = theme?.fitLabelsToShape !== false\n const maxW =\n theme?.labelMaxTextWidth ??\n (fitToShape ? Math.max(50, Math.min(300, lengthPx * 1.5)) : Infinity)\n drawCanvasLabelPill(\n ctx,\n displayLabel,\n Math.round(mid.x),\n Math.round(mid.y),\n ruler.color,\n maxW,\n theme,\n )\n }\n\n // Drag handles when selected\n if (options.isSelected) {\n const handleRadius = theme?.handleRadius ?? 5\n const fill = theme?.handleFillColor ?? '#ffffff'\n const endpointColor = theme?.endpointHandleColor ?? '#4f4f4f'\n const strokeWidth = theme?.handleStrokeWidth ?? 2\n\n drawCanvasHandle(ctx, start, endpointColor, fill, handleRadius, strokeWidth)\n drawCanvasHandle(ctx, end, endpointColor, fill, handleRadius, strokeWidth)\n }\n\n ctx.restore()\n}\n\nexport function hitTestRulerHandle(\n point: ScreenPoint,\n projected: ProjectedRuler,\n tolerance = 11,\n): RulerHandleType | null {\n if (Math.hypot(point.x - projected.end.x, point.y - projected.end.y) <= tolerance) {\n return 'end'\n }\n if (Math.hypot(point.x - projected.start.x, point.y - projected.start.y) <= tolerance) {\n return 'start'\n }\n return null\n}\n\nexport function hitTestRuler(\n point: ScreenPoint,\n projected: ProjectedRuler,\n ruler: RulerItem,\n tolerance = 9,\n): boolean {\n const hitThreshold = Math.max(tolerance, ruler.strokeWidth / 2 + 6)\n return distanceToSegment(point, projected.start, projected.end) <= hitThreshold\n}\n\n","import type L from 'leaflet'\nimport type { NoteItem, ScreenPoint } from '../../types/index.js'\nimport { NOTE_COLOR_THEMES } from '../../shared/constants.js'\nimport { getMapDimensions } from '../../shared/geo.js'\n\nexport interface ResolvedNoteTheme {\n name: string\n bg: string\n border: string\n header: string\n text: string\n}\n\nexport function resolveNoteTheme(backgroundColor: string): ResolvedNoteTheme {\n const matchedTheme = NOTE_COLOR_THEMES.find((t) => t.bg === backgroundColor)\n if (matchedTheme) return matchedTheme\n\n const isDarkBg =\n (backgroundColor?.startsWith('#') &&\n backgroundColor.length === 7 &&\n parseInt(backgroundColor.slice(1), 16) < 0x888888) ||\n backgroundColor === '#111827' ||\n backgroundColor === '#1e293b' ||\n backgroundColor === '#0f172a'\n\n return {\n name: 'Custom',\n bg: backgroundColor,\n border: isDarkBg ? 'rgba(255, 255, 255, 0.16)' : 'rgba(0, 0, 0, 0.12)',\n header: isDarkBg ? 'rgba(255, 255, 255, 0.08)' : 'rgba(0, 0, 0, 0.06)',\n text: isDarkBg ? '#f8fafc' : '#0f172a',\n }\n}\n\nexport function clampNotePosition(\n map: L.Map,\n screenPos: ScreenPoint,\n item: NoteItem,\n isCompact: boolean,\n isDragging: boolean,\n clampToViewport = true,\n): ScreenPoint {\n const mapDims = clampToViewport !== false ? getMapDimensions(map) : null\n if (!mapDims || isDragging) return screenPos\n\n const isAnchorNearViewport =\n screenPos.x >= -120 &&\n screenPos.x <= mapDims.width + 120 &&\n screenPos.y >= -120 &&\n screenPos.y <= mapDims.height + 120\n\n if (!isAnchorNearViewport) return screenPos\n\n const cardWidth = isCompact ? 95 : (item.width ?? 230)\n const cardHeight = isCompact ? 22 : (item.height ?? 100)\n const pad = 8\n const minX = 16 + pad\n const maxX = Math.max(minX, mapDims.width - cardWidth + 16 - pad)\n const minY = 12 + pad\n const maxY = Math.max(minY, mapDims.height - cardHeight + 12 - pad)\n\n return {\n x: Math.max(minX, Math.min(maxX, screenPos.x)),\n y: Math.max(minY, Math.min(maxY, screenPos.y)),\n }\n}\n\n","import type L from 'leaflet'\nimport type { ScreenPoint, TextItem } from '../../types/index.js'\nimport { getMapDimensions } from '../../shared/geo.js'\n\nexport function clampTextPosition(\n map: L.Map,\n screenPos: ScreenPoint,\n item: TextItem,\n dynamicFontSize: number,\n isCompact: boolean,\n isDragging: boolean,\n clampToViewport = true,\n): ScreenPoint {\n const mapDims = clampToViewport !== false ? getMapDimensions(map) : null\n if (!mapDims || isDragging) return screenPos\n\n const isAnchorNearViewport =\n screenPos.x >= -100 &&\n screenPos.x <= mapDims.width + 100 &&\n screenPos.y >= -100 &&\n screenPos.y <= mapDims.height + 100\n\n if (!isAnchorNearViewport) return screenPos\n\n const approxHalfW = isCompact\n ? 35\n : Math.max(24, ((item.text || 'Text').length * dynamicFontSize) / 3.6)\n const approxHalfH = isCompact ? 11 : dynamicFontSize / 2 + 4\n const pad = 8\n\n const minX = approxHalfW + pad\n const maxX = Math.max(minX, mapDims.width - approxHalfW - pad)\n const minY = approxHalfH + pad\n const maxY = Math.max(minY, mapDims.height - approxHalfH - pad)\n\n return {\n x: Math.max(minX, Math.min(maxX, screenPos.x)),\n y: Math.max(minY, Math.min(maxY, screenPos.y)),\n }\n}\n\n","import type L from 'leaflet'\nimport type { FreeDrawItem, GeoPoint, ScreenPoint } from '../types/index.js'\nimport { createId, screenToGeo } from '../shared/index.js'\n\nexport function startFreeDrawDrag(\n map: L.Map,\n mapContainer: HTMLElement,\n pt: ScreenPoint,\n geo: GeoPoint,\n activeColor: string,\n strokeWidth: number,\n dashed: boolean,\n draftFreeDrawRef: { current: { screenPoints: ScreenPoint[]; geoPoints: GeoPoint[] } | null },\n rafIdRef: { current: number | null },\n paintCanvas: () => void,\n addItem: (item: FreeDrawItem) => void,\n setActiveTool: (tool: 'select') => void,\n) {\n draftFreeDrawRef.current = { screenPoints: [pt], geoPoints: [geo] }\n map.dragging.disable()\n paintCanvas()\n\n const handleWindowMove = (moveEvent: PointerEvent) => {\n if (!draftFreeDrawRef.current) return\n const rect = mapContainer.getBoundingClientRect()\n const currScreen = { x: moveEvent.clientX - rect.left, y: moveEvent.clientY - rect.top }\n const pts = draftFreeDrawRef.current.screenPoints\n const prevPt = pts[pts.length - 1]\n if (Math.hypot(currScreen.x - prevPt.x, currScreen.y - prevPt.y) < 2.5) return\n pts.push(currScreen)\n draftFreeDrawRef.current.geoPoints.push(screenToGeo(map, currScreen))\n\n if (rafIdRef.current === null) {\n rafIdRef.current = window.requestAnimationFrame(() => {\n rafIdRef.current = null\n paintCanvas()\n })\n }\n }\n\n const handleWindowUp = (upEvent: PointerEvent) => {\n window.removeEventListener('pointermove', handleWindowMove)\n window.removeEventListener('pointerup', handleWindowUp)\n map.dragging.enable()\n if (rafIdRef.current !== null) {\n window.cancelAnimationFrame(rafIdRef.current)\n rafIdRef.current = null\n }\n\n const draft = draftFreeDrawRef.current\n draftFreeDrawRef.current = null\n if (draft && draft.geoPoints.length >= 1) {\n addItem({\n id: createId('freedraw'),\n type: 'freedraw',\n points: draft.geoPoints,\n color: activeColor,\n strokeWidth,\n dashed,\n createdAt: Date.now(),\n })\n if (!upEvent.shiftKey) setActiveTool('select')\n } else {\n paintCanvas()\n }\n }\n\n window.addEventListener('pointermove', handleWindowMove)\n window.addEventListener('pointerup', handleWindowUp)\n}\n\n","import type L from 'leaflet'\nimport type {\n ArrowItem,\n ArrowStyle,\n DraftArrowState,\n DraftRulerState,\n DraftShapeState,\n GeoPoint,\n NoteItem,\n RulerItem,\n ScreenPoint,\n ShapeItem,\n ShapeKind,\n TextItem,\n} from '../types/index.js'\nimport {\n computeDefaultControlGeoPoint,\n constrainAngleTo45Degrees,\n constrainToAspectRatio,\n createId,\n NOTE_COLOR_THEMES,\n screenToGeo,\n} from '../shared/index.js'\n\nexport function createDraftNote(geo: GeoPoint, noteColor: string, defaultTitle = 'Field Note'): NoteItem {\n const theme = NOTE_COLOR_THEMES.find((t) => t.bg === noteColor) ?? NOTE_COLOR_THEMES[0]\n return {\n id: createId('note'),\n type: 'note',\n position: geo,\n title: defaultTitle,\n text: '',\n backgroundColor: theme.bg,\n textColor: theme.text,\n width: 230,\n createdAt: Date.now(),\n }\n}\n\nexport function createDraftText(\n geo: GeoPoint,\n activeColor: string,\n fontSize: number,\n fontWeight: 'normal' | 'bold',\n currentZoom: number,\n): TextItem {\n return {\n id: createId('text'),\n type: 'text',\n position: geo,\n text: '',\n color: activeColor,\n initialFontSize: fontSize,\n baseZoom: currentZoom,\n fontWeight,\n createdAt: Date.now(),\n }\n}\n\nexport { startFreeDrawDrag } from './freedraw-drag-handler.js'\n\nexport function startShapeDrag(\n map: L.Map,\n mapContainer: HTMLElement,\n startScreen: ScreenPoint,\n startGeo: GeoPoint,\n activeShape: ShapeKind,\n activeColor: string,\n shapeFilled: boolean,\n strokeWidth: number,\n dashed: boolean,\n setDraftShape: (draft: DraftShapeState | null) => void,\n addItem: (item: ShapeItem) => void,\n setActiveTool: (tool: 'select') => void,\n) {\n setDraftShape({ shape: activeShape, startGeo, currentGeo: startGeo })\n map.dragging.disable()\n\n const handleWindowMove = (moveEvent: PointerEvent) => {\n const rect = mapContainer.getBoundingClientRect()\n const rawScreen = { x: moveEvent.clientX - rect.left, y: moveEvent.clientY - rect.top }\n const currScreen = moveEvent.shiftKey ? constrainToAspectRatio(startScreen, rawScreen, 1) : rawScreen\n setDraftShape({ shape: activeShape, startGeo, currentGeo: screenToGeo(map, currScreen) })\n }\n\n const handleWindowUp = (upEvent: PointerEvent) => {\n window.removeEventListener('pointermove', handleWindowMove)\n window.removeEventListener('pointerup', handleWindowUp)\n map.dragging.enable()\n\n const rect = mapContainer.getBoundingClientRect()\n const rawEndScreen = { x: upEvent.clientX - rect.left, y: upEvent.clientY - rect.top }\n const endScreen = upEvent.shiftKey ? constrainToAspectRatio(startScreen, rawEndScreen, 1) : rawEndScreen\n const dragDist = Math.hypot(rawEndScreen.x - startScreen.x, rawEndScreen.y - startScreen.y)\n\n const finalStartGeo = dragDist >= 10 ? startGeo : screenToGeo(map, { x: startScreen.x - 45, y: startScreen.y - 45 })\n const finalEndGeo = dragDist >= 10 ? screenToGeo(map, endScreen) : screenToGeo(map, { x: startScreen.x + 45, y: startScreen.y + 45 })\n\n addItem({\n id: createId('shape'),\n type: 'shape',\n shape: activeShape,\n start: finalStartGeo,\n end: finalEndGeo,\n color: activeColor,\n filled: shapeFilled,\n strokeWidth,\n dashed,\n createdAt: Date.now(),\n })\n setDraftShape(null)\n setActiveTool('select')\n }\n\n window.addEventListener('pointermove', handleWindowMove)\n window.addEventListener('pointerup', handleWindowUp)\n}\n\nexport function buildArrowItem(\n arrowStyle: ArrowStyle,\n startGeo: GeoPoint,\n endGeo: GeoPoint,\n activeColor: string,\n strokeWidth: number,\n dashed: boolean,\n): ArrowItem {\n return {\n id: createId('arrow'),\n type: 'arrow',\n arrowStyle,\n start: startGeo,\n end: endGeo,\n controlPoint:\n arrowStyle === 'curved'\n ? computeDefaultControlGeoPoint(startGeo, endGeo)\n : arrowStyle === 'elbow'\n ? { lat: (startGeo.lat + endGeo.lat) / 2, lng: (startGeo.lng + endGeo.lng) / 2 }\n : undefined,\n color: activeColor,\n strokeWidth,\n dashed,\n headStyle: arrowStyle === 'bi' ? 'both' : 'triangle',\n createdAt: Date.now(),\n }\n}\n\nexport function startArrowDrag(\n map: L.Map,\n mapContainer: HTMLElement,\n startScreen: ScreenPoint,\n startGeo: GeoPoint,\n arrowStyle: ArrowStyle,\n activeColor: string,\n strokeWidth: number,\n dashed: boolean,\n setDraftArrow: (draft: DraftArrowState | null) => void,\n addItem: (item: ArrowItem) => void,\n setActiveTool: (tool: 'select') => void,\n) {\n setDraftArrow({ arrowStyle, startGeo, currentGeo: startGeo })\n map.dragging.disable()\n\n const handleWindowMove = (moveEvent: PointerEvent) => {\n const rect = mapContainer.getBoundingClientRect()\n const rawScreen = { x: moveEvent.clientX - rect.left, y: moveEvent.clientY - rect.top }\n const currScreen = moveEvent.shiftKey ? constrainAngleTo45Degrees(startScreen, rawScreen) : rawScreen\n setDraftArrow({ arrowStyle, startGeo, currentGeo: screenToGeo(map, currScreen) })\n }\n\n const handleWindowUp = (upEvent: PointerEvent) => {\n window.removeEventListener('pointermove', handleWindowMove)\n window.removeEventListener('pointerup', handleWindowUp)\n map.dragging.enable()\n\n const rect = mapContainer.getBoundingClientRect()\n const rawEndScreen = { x: upEvent.clientX - rect.left, y: upEvent.clientY - rect.top }\n const endScreen = upEvent.shiftKey ? constrainAngleTo45Degrees(startScreen, rawEndScreen) : rawEndScreen\n if (Math.hypot(rawEndScreen.x - startScreen.x, rawEndScreen.y - startScreen.y) >= 8) {\n addItem(buildArrowItem(arrowStyle, startGeo, screenToGeo(map, endScreen), activeColor, strokeWidth, dashed))\n setDraftArrow(null)\n setActiveTool('select')\n }\n }\n\n window.addEventListener('pointermove', handleWindowMove)\n window.addEventListener('pointerup', handleWindowUp)\n}\n\nexport function buildRulerItem(\n startGeo: GeoPoint,\n endGeo: GeoPoint,\n activeColor: string,\n strokeWidth: number,\n dashed: boolean,\n): RulerItem {\n return {\n id: createId('ruler'),\n type: 'ruler',\n start: startGeo,\n end: endGeo,\n color: activeColor,\n strokeWidth,\n dashed,\n unit: 'metric',\n createdAt: Date.now(),\n }\n}\n\nexport function startRulerDrag(\n map: L.Map,\n mapContainer: HTMLElement,\n startScreen: ScreenPoint,\n startGeo: GeoPoint,\n activeColor: string,\n strokeWidth: number,\n dashed: boolean,\n setDraftRuler: (draft: DraftRulerState | null) => void,\n addItem: (item: RulerItem) => void,\n setActiveTool: (tool: 'select') => void,\n) {\n setDraftRuler({ startGeo, currentGeo: startGeo })\n map.dragging.disable()\n\n const handleWindowMove = (moveEvent: PointerEvent) => {\n const rect = mapContainer.getBoundingClientRect()\n const rawScreen = { x: moveEvent.clientX - rect.left, y: moveEvent.clientY - rect.top }\n const currScreen = moveEvent.shiftKey ? constrainAngleTo45Degrees(startScreen, rawScreen) : rawScreen\n setDraftRuler({ startGeo, currentGeo: screenToGeo(map, currScreen) })\n }\n\n const handleWindowUp = (upEvent: PointerEvent) => {\n window.removeEventListener('pointermove', handleWindowMove)\n window.removeEventListener('pointerup', handleWindowUp)\n map.dragging.enable()\n\n const rect = mapContainer.getBoundingClientRect()\n const rawEndScreen = { x: upEvent.clientX - rect.left, y: upEvent.clientY - rect.top }\n const endScreen = upEvent.shiftKey ? constrainAngleTo45Degrees(startScreen, rawEndScreen) : rawEndScreen\n if (Math.hypot(rawEndScreen.x - startScreen.x, rawEndScreen.y - startScreen.y) >= 8) {\n addItem(buildRulerItem(startGeo, screenToGeo(map, endScreen), activeColor, strokeWidth, dashed))\n setDraftRuler(null)\n setActiveTool('select')\n }\n }\n\n window.addEventListener('pointermove', handleWindowMove)\n window.addEventListener('pointerup', handleWindowUp)\n}\n\n","import type L from 'leaflet'\nimport type { ArrowItem, FreeDrawItem, RulerItem, ScreenPoint, ShapeItem } from '../types/index.js'\nimport {\n constrainAngleTo45Degrees,\n constrainToAspectRatio,\n screenToGeo,\n} from '../shared/geo.js'\nimport type {\n ArrowHandleType,\n ProjectedArrow,\n ProjectedRuler,\n ProjectedShape,\n RulerHandleType,\n ShapeHandleType,\n} from '../entities/index.js'\n\nfunction bindWindowDrag(map: L.Map, onMove: (e: PointerEvent) => void) {\n map.dragging.disable()\n const onUp = () => {\n map.dragging.enable()\n window.removeEventListener('pointermove', onMove)\n window.removeEventListener('pointerup', onUp)\n }\n window.addEventListener('pointermove', onMove)\n window.addEventListener('pointerup', onUp)\n}\n\nexport function startArrowHandleDrag(\n map: L.Map,\n arrow: ArrowItem,\n projected: ProjectedArrow,\n handle: ArrowHandleType,\n getLocalPoint: (e: PointerEvent) => ScreenPoint,\n updateItem: (id: string, patch: Partial<ArrowItem>) => void,\n) {\n bindWindowDrag(map, (moveEvent) => {\n const rawPt = getLocalPoint(moveEvent)\n const shouldLock = moveEvent.shiftKey\n if (handle === 'start') {\n const snappedPt = shouldLock ? constrainAngleTo45Degrees(projected.end, rawPt) : rawPt\n updateItem(arrow.id, { start: screenToGeo(map, snappedPt) })\n } else if (handle === 'end') {\n const snappedPt = shouldLock ? constrainAngleTo45Degrees(projected.start, rawPt) : rawPt\n updateItem(arrow.id, { end: screenToGeo(map, snappedPt) })\n } else if (handle === 'control') {\n updateItem(arrow.id, { controlPoint: screenToGeo(map, rawPt) })\n }\n })\n}\n\nexport function startShapeHandleDrag(\n map: L.Map,\n shape: ShapeItem,\n projected: ProjectedShape,\n handle: ShapeHandleType,\n getLocalPoint: (e: PointerEvent) => ScreenPoint,\n updateItem: (id: string, patch: Partial<ShapeItem>) => void,\n) {\n const anchorScreen = handle === 'start' ? projected.end : projected.start\n const initialRatio = projected.width > 4 && projected.height > 4 ? projected.width / projected.height : 1\n\n bindWindowDrag(map, (moveEvent) => {\n const rawPt = getLocalPoint(moveEvent)\n const nextPt = moveEvent.shiftKey ? constrainToAspectRatio(anchorScreen, rawPt, initialRatio) : rawPt\n const nextGeo = screenToGeo(map, nextPt)\n updateItem(shape.id, handle === 'start' ? { start: nextGeo } : { end: nextGeo })\n })\n}\n\nexport function startArrowBodyDrag(\n map: L.Map,\n arrow: ArrowItem,\n projected: ProjectedArrow,\n originPt: ScreenPoint,\n getLocalPoint: (e: PointerEvent) => ScreenPoint,\n updateItem: (id: string, patch: Partial<ArrowItem>) => void,\n) {\n const initialStartScreen = projected.start\n const initialEndScreen = projected.end\n const initialControlScreen = projected.control\n const hadCustomControl = Boolean(arrow.controlPoint)\n\n bindWindowDrag(map, (moveEvent) => {\n const nextPt = getLocalPoint(moveEvent)\n const dx = nextPt.x - originPt.x\n const dy = nextPt.y - originPt.y\n const patch: Partial<ArrowItem> = {\n start: screenToGeo(map, { x: initialStartScreen.x + dx, y: initialStartScreen.y + dy }),\n end: screenToGeo(map, { x: initialEndScreen.x + dx, y: initialEndScreen.y + dy }),\n }\n if ((arrow.arrowStyle === 'curved' || arrow.arrowStyle === 'elbow') && hadCustomControl) {\n patch.controlPoint = screenToGeo(map, {\n x: initialControlScreen.x + dx,\n y: initialControlScreen.y + dy,\n })\n }\n updateItem(arrow.id, patch)\n })\n}\n\nexport function startShapeBodyDrag(\n map: L.Map,\n shape: ShapeItem,\n projected: ProjectedShape,\n originPt: ScreenPoint,\n getLocalPoint: (e: PointerEvent) => ScreenPoint,\n updateItem: (id: string, patch: Partial<ShapeItem>) => void,\n) {\n const initialStartScreen = projected.start\n const initialEndScreen = projected.end\n\n bindWindowDrag(map, (moveEvent) => {\n const nextPt = getLocalPoint(moveEvent)\n const dx = nextPt.x - originPt.x\n const dy = nextPt.y - originPt.y\n updateItem(shape.id, {\n start: screenToGeo(map, { x: initialStartScreen.x + dx, y: initialStartScreen.y + dy }),\n end: screenToGeo(map, { x: initialEndScreen.x + dx, y: initialEndScreen.y + dy }),\n })\n })\n}\n\nexport function startFreeDrawBodyDrag(\n map: L.Map,\n fd: FreeDrawItem,\n initialScreenPts: ScreenPoint[],\n originPt: ScreenPoint,\n getLocalPoint: (e: PointerEvent) => ScreenPoint,\n updateItem: (id: string, patch: Partial<FreeDrawItem>) => void,\n) {\n bindWindowDrag(map, (moveEvent) => {\n const nextPt = getLocalPoint(moveEvent)\n const dx = nextPt.x - originPt.x\n const dy = nextPt.y - originPt.y\n updateItem(fd.id, {\n points: initialScreenPts.map((sp) => screenToGeo(map, { x: sp.x + dx, y: sp.y + dy })),\n })\n })\n}\n\nexport function startRulerHandleDrag(\n map: L.Map,\n ruler: RulerItem,\n projected: ProjectedRuler,\n handle: RulerHandleType,\n getLocalPoint: (e: PointerEvent) => ScreenPoint,\n updateItem: (id: string, patch: Partial<RulerItem>) => void,\n) {\n bindWindowDrag(map, (moveEvent) => {\n const rawPt = getLocalPoint(moveEvent)\n const shouldLock = moveEvent.shiftKey\n if (handle === 'start') {\n const snappedPt = shouldLock ? constrainAngleTo45Degrees(projected.end, rawPt) : rawPt\n updateItem(ruler.id, { start: screenToGeo(map, snappedPt) })\n } else if (handle === 'end') {\n const snappedPt = shouldLock ? constrainAngleTo45Degrees(projected.start, rawPt) : rawPt\n updateItem(ruler.id, { end: screenToGeo(map, snappedPt) })\n }\n })\n}\n\nexport function startRulerBodyDrag(\n map: L.Map,\n ruler: RulerItem,\n projected: ProjectedRuler,\n originPt: ScreenPoint,\n getLocalPoint: (e: PointerEvent) => ScreenPoint,\n updateItem: (id: string, patch: Partial<RulerItem>) => void,\n) {\n const initialStartScreen = projected.start\n const initialEndScreen = projected.end\n\n bindWindowDrag(map, (moveEvent) => {\n const nextPt = getLocalPoint(moveEvent)\n const dx = nextPt.x - originPt.x\n const dy = nextPt.y - originPt.y\n updateItem(ruler.id, {\n start: screenToGeo(map, { x: initialStartScreen.x + dx, y: initialStartScreen.y + dy }),\n end: screenToGeo(map, { x: initialEndScreen.x + dx, y: initialEndScreen.y + dy }),\n })\n })\n}\n\n","import type L from 'leaflet'\nimport type {\n ArrowItem,\n ArrowRenderTheme,\n CanvasAnnotationTheme,\n DraftArrowState,\n DraftRulerState,\n DraftShapeState,\n FreeDrawItem,\n GeoPoint,\n RulerItem,\n ScreenPoint,\n ShapeItem,\n} from '../types/index.js'\nimport {\n projectArrow,\n projectFreeDraw,\n projectRuler,\n projectShape,\n renderArrowOnCanvas,\n renderFreeDrawOnCanvas,\n renderRulerOnCanvas,\n renderShapeOnCanvas,\n} from '../entities/index.js'\n\nexport interface PaintLeafletCanvasOptions {\n map: L.Map | null\n canvas: HTMLCanvasElement | null\n width: number\n height: number\n arrowItems: ArrowItem[]\n shapeItems: ShapeItem[]\n freeDrawItems: FreeDrawItem[]\n rulerItems: RulerItem[]\n selectedId: string | null\n draftShape: DraftShapeState | null\n draftArrow: DraftArrowState | null\n draftRuler?: DraftRulerState | null\n draftFreeDraw?: {\n screenPoints: ScreenPoint[]\n geoPoints: GeoPoint[]\n } | null\n activeColor: string\n strokeWidth: number\n dashed: boolean\n shapeFilled: boolean\n annotationTheme?: CanvasAnnotationTheme\n arrowTheme?: ArrowRenderTheme\n isReadOnly: boolean\n}\n\nexport function paintLeafletCanvas({\n map,\n canvas,\n width,\n height,\n arrowItems,\n shapeItems,\n freeDrawItems,\n rulerItems,\n selectedId,\n draftShape,\n draftArrow,\n draftRuler,\n draftFreeDraw,\n activeColor,\n strokeWidth,\n dashed,\n shapeFilled,\n annotationTheme,\n arrowTheme,\n isReadOnly,\n}: PaintLeafletCanvasOptions) {\n if (!map || !canvas || width === 0 || height === 0) return\n\n const effectiveTheme = annotationTheme ?? arrowTheme\n const dpr = typeof window !== 'undefined' ? window.devicePixelRatio || 1 : 1\n const targetW = Math.round(width * dpr)\n const targetH = Math.round(height * dpr)\n if (canvas.width !== targetW) {\n canvas.width = targetW\n }\n if (canvas.height !== targetH) {\n canvas.height = targetH\n }\n\n const ctx = canvas.getContext('2d')\n if (!ctx) return\n\n ctx.save()\n if (typeof ctx.scale === 'function') {\n ctx.scale(dpr, dpr)\n }\n ctx.clearRect(0, 0, width, height)\n\n for (const fd of freeDrawItems) {\n const screenPts = projectFreeDraw(map, fd)\n renderFreeDrawOnCanvas(ctx, screenPts, fd, {\n isSelected: !isReadOnly && fd.id === selectedId,\n theme: effectiveTheme,\n })\n }\n\n for (const shp of shapeItems) {\n const projected = projectShape(map, shp)\n renderShapeOnCanvas(ctx, projected, shp, {\n isSelected: !isReadOnly && shp.id === selectedId,\n theme: effectiveTheme,\n })\n }\n\n for (const arrow of arrowItems) {\n const projected = projectArrow(map, arrow)\n renderArrowOnCanvas(ctx, projected, arrow, {\n isSelected: !isReadOnly && arrow.id === selectedId,\n theme: effectiveTheme,\n })\n }\n\n for (const ruler of rulerItems) {\n const projected = projectRuler(map, ruler)\n renderRulerOnCanvas(ctx, projected, ruler, {\n isSelected: !isReadOnly && ruler.id === selectedId,\n theme: effectiveTheme,\n })\n }\n\n if (!isReadOnly && draftFreeDraw && draftFreeDraw.screenPoints.length > 0) {\n renderFreeDrawOnCanvas(\n ctx,\n draftFreeDraw.screenPoints,\n {\n color: activeColor,\n strokeWidth,\n dashed,\n },\n {\n isPreview: true,\n theme: effectiveTheme,\n },\n )\n }\n\n if (!isReadOnly && draftShape) {\n const tempShape: ShapeItem = {\n id: 'draft-shape',\n type: 'shape',\n shape: draftShape.shape,\n start: draftShape.startGeo,\n end: draftShape.currentGeo,\n color: activeColor,\n filled: shapeFilled,\n strokeWidth,\n dashed,\n createdAt: 0,\n }\n const projected = projectShape(map, tempShape)\n renderShapeOnCanvas(ctx, projected, tempShape, {\n isPreview: true,\n isSelected: true,\n theme: effectiveTheme,\n })\n }\n\n if (!isReadOnly && draftArrow) {\n const tempArrow: ArrowItem = {\n id: 'draft-arrow',\n type: 'arrow',\n arrowStyle: draftArrow.arrowStyle,\n start: draftArrow.startGeo,\n end: draftArrow.currentGeo,\n color: activeColor,\n strokeWidth,\n dashed,\n createdAt: 0,\n }\n const projected = projectArrow(map, tempArrow)\n renderArrowOnCanvas(ctx, projected, tempArrow, {\n isPreview: true,\n isSelected: true,\n theme: effectiveTheme,\n })\n }\n\n if (!isReadOnly && draftRuler) {\n const tempRuler: RulerItem = {\n id: 'draft-ruler',\n type: 'ruler',\n start: draftRuler.startGeo,\n end: draftRuler.currentGeo,\n color: activeColor,\n strokeWidth,\n dashed,\n unit: 'metric',\n createdAt: 0,\n }\n const projected = projectRuler(map, tempRuler)\n renderRulerOnCanvas(ctx, projected, tempRuler, {\n isPreview: true,\n isSelected: true,\n theme: effectiveTheme,\n })\n }\n\n ctx.restore()\n}\n\n","import type L from 'leaflet'\n\nexport interface MapViewportDimensions {\n width: number\n height: number\n}\n\nexport function bindLeafletSync(\n map: L.Map,\n onSync: (dimensions: MapViewportDimensions) => void,\n): () => void {\n const sync = () => {\n const size = map.getSize()\n onSync({ width: size.x, height: size.y })\n }\n\n sync()\n\n map.on('move', sync)\n map.on('zoom', sync)\n map.on('zoomanim', sync)\n map.on('viewreset', sync)\n map.on('resize', sync)\n\n return () => {\n map.off('move', sync)\n map.off('zoom', sync)\n map.off('zoomanim', sync)\n map.off('viewreset', sync)\n map.off('resize', sync)\n }\n}\n\ntype LeafletFlaggedElement = HTMLElement & { _leaflet_disable_events?: boolean }\n\nexport function bindBlockMapDblClick(map: L.Map): () => void {\n const container = map.getContainer()\n if (!container) return () => {}\n\n const handleDblClickCapture = (e: MouseEvent) => {\n const target = e.target as LeafletFlaggedElement | null\n if (\n !target?.closest?.(\n '[data-rlc-overlay], input, textarea, select, button, .rlc-overlay',\n )\n ) {\n return\n }\n\n const hadFlag = Object.prototype.hasOwnProperty.call(\n target,\n '_leaflet_disable_events',\n )\n const previous = target._leaflet_disable_events\n target._leaflet_disable_events = true\n\n const wasZoomEnabled = Boolean(map.doubleClickZoom?.enabled?.())\n if (wasZoomEnabled) {\n map.doubleClickZoom.disable()\n }\n\n setTimeout(() => {\n if (hadFlag) {\n target._leaflet_disable_events = previous\n } else {\n delete target._leaflet_disable_events\n }\n if (wasZoomEnabled) {\n map.doubleClickZoom.enable()\n }\n }, 0)\n }\n\n const handleMouseDownCapture = (e: MouseEvent | TouchEvent) => {\n const target = e.target as HTMLElement | null\n if (\n target?.closest?.(\n 'textarea, input, select, button, [data-rlc-note-resize], .rlc-note-resize-handle',\n )\n ) {\n if (map.dragging?.enabled?.()) {\n map.dragging.disable()\n const handleUp = () => {\n map.dragging.enable()\n window.removeEventListener('mouseup', handleUp, true)\n window.removeEventListener('touchend', handleUp, true)\n window.removeEventListener('pointerup', handleUp, true)\n }\n window.addEventListener('mouseup', handleUp, {\n capture: true,\n once: true,\n })\n window.addEventListener('touchend', handleUp, {\n capture: true,\n once: true,\n })\n window.addEventListener('pointerup', handleUp, {\n capture: true,\n once: true,\n })\n }\n }\n }\n\n container.addEventListener('dblclick', handleDblClickCapture, true)\n container.addEventListener('mousedown', handleMouseDownCapture, true)\n container.addEventListener('touchstart', handleMouseDownCapture, true)\n\n return () => {\n container.removeEventListener('dblclick', handleDblClickCapture, true)\n container.removeEventListener('mousedown', handleMouseDownCapture, true)\n container.removeEventListener('touchstart', handleMouseDownCapture, true)\n }\n}\n\n","import type {\n CanvasItem,\n CanvasTool,\n LeafletCanvasController,\n ShapeKind,\n UseLeafletCanvasOptions,\n} from '../types/index.js'\nimport {\n DEFAULT_FONT_SIZE,\n DEFAULT_NOTE_BG,\n DEFAULT_STROKE_COLOR,\n DEFAULT_STROKE_WIDTH,\n NOTE_COLOR_THEMES,\n} from '../shared/constants.js'\n\nexport interface LeafletCanvasStore extends LeafletCanvasController {\n subscribe: (listener: (controller: LeafletCanvasController) => void) => () => void\n getState: () => LeafletCanvasController\n destroy: () => void\n}\n\nexport function createLeafletCanvasController(\n options: UseLeafletCanvasOptions = {},\n): LeafletCanvasStore {\n const maxPast = Math.max(0, (options.maxHistory ?? 50) - 1)\n let past: CanvasItem[][] = []\n let present: CanvasItem[] = options.items ?? options.initialItems ?? []\n let future: CanvasItem[][] = []\n let committedItems: CanvasItem[] = present\n\n let activeTool: CanvasTool = options.initialTool ?? 'select'\n let readOnly = Boolean(options.readOnly ?? false)\n let selectedId: string | null = null\n let isEditingLabel = false\n\n let activeShape: ShapeKind = options.defaultShape ?? 'square'\n let shapeFilled = true\n let activeColor = options.defaultColor ?? DEFAULT_STROKE_COLOR\n let strokeWidth = options.defaultStrokeWidth ?? DEFAULT_STROKE_WIDTH\n let dashed = false\n let noteColor = options.defaultNoteColor ?? DEFAULT_NOTE_BG\n let fontSize = options.defaultFontSize ?? DEFAULT_FONT_SIZE\n let fontWeight: 'normal' | 'bold' = 'bold'\n\n const listeners = new Set<(controller: LeafletCanvasController) => void>()\n\n const notifyListeners = () => {\n for (const listener of listeners) {\n listener(store)\n }\n }\n\n const triggerChange = (next: CanvasItem[]) => {\n options.onItemsChange?.(next)\n options.onChange?.(next)\n }\n\n const triggerChangeComplete = (finalItems: CanvasItem[], targetItem?: CanvasItem | null) => {\n options.onItemsChangeComplete?.(finalItems, targetItem)\n options.onChangeComplete?.(finalItems, targetItem)\n options.onEditEnd?.(finalItems, targetItem)\n options.onEditComplete?.(finalItems, targetItem)\n if (targetItem) options.onItemChangeComplete?.(targetItem)\n }\n\n const commitItems = (updater: (prev: CanvasItem[]) => CanvasItem[]) => {\n const next = updater(present)\n present = next\n triggerChange(next)\n notifyListeners()\n return next\n }\n\n const notifyChangeComplete = (targetItem?: CanvasItem | null) => {\n if (present === committedItems) return\n const anchor = committedItems\n committedItems = present\n past = [...past, anchor].slice(-maxPast)\n future = []\n triggerChangeComplete(present, targetItem)\n notifyListeners()\n }\n\n const setSelectedId = (id: string | null) => {\n if (selectedId !== id) {\n const prev = selectedId\n selectedId = id\n isEditingLabel = false\n if (prev !== null && id === null) notifyChangeComplete()\n options.onItemSelect?.(present.find((it) => it.id === id) ?? null)\n notifyListeners()\n }\n }\n\n const setActiveTool = (tool: CanvasTool) => {\n if (readOnly && tool !== 'select') return\n activeTool = tool\n options.onToolChange?.(tool)\n notifyListeners()\n }\n\n const setReadOnly = (nextReadOnly: boolean) => {\n readOnly = Boolean(nextReadOnly)\n if (readOnly && activeTool !== 'select') {\n activeTool = 'select'\n }\n notifyListeners()\n }\n\n const patchSelected = (predicate: (it: CanvasItem) => boolean, patcher: (it: any) => any) => {\n if (!selectedId) return\n commitItems((prev) =>\n prev.map((it) => (it.id === selectedId && predicate(it) ? patcher(it) : it)),\n )\n }\n\n const setActiveShape = (shape: ShapeKind) => {\n if (readOnly) return\n activeShape = shape\n patchSelected((it) => it.type === 'shape', (it) => ({ ...it, shape }))\n notifyListeners()\n }\n\n const setShapeFilled = (filled: boolean) => {\n if (readOnly) return\n shapeFilled = filled\n patchSelected((it) => it.type === 'shape', (it) => ({ ...it, filled }))\n notifyListeners()\n }\n\n const setActiveColor = (color: string) => {\n if (readOnly) return\n activeColor = color\n patchSelected((it) => it.type !== 'note', (it) => ({ ...it, color }))\n notifyListeners()\n }\n\n const setStrokeWidth = (width: number) => {\n if (readOnly) return\n strokeWidth = width\n patchSelected(\n (it) =>\n it.type === 'arrow' ||\n it.type === 'freedraw' ||\n it.type === 'shape' ||\n it.type === 'ruler',\n (it) => ({ ...it, strokeWidth: width }),\n )\n notifyListeners()\n }\n\n const setDashed = (nextDashed: boolean) => {\n if (readOnly) return\n dashed = nextDashed\n patchSelected(\n (it) =>\n it.type === 'arrow' ||\n it.type === 'freedraw' ||\n it.type === 'shape' ||\n it.type === 'ruler',\n (it) => ({ ...it, dashed: nextDashed }),\n )\n notifyListeners()\n }\n\n const setNoteColor = (bg: string) => {\n if (readOnly) return\n noteColor = bg\n const theme = NOTE_COLOR_THEMES.find((t) => t.bg === bg)\n patchSelected(\n (it) => it.type === 'note',\n (it) => ({ ...it, backgroundColor: bg, textColor: theme?.text ?? it.textColor }),\n )\n notifyListeners()\n }\n\n const setFontSize = (size: number) => {\n if (readOnly) return\n fontSize = size\n patchSelected((it) => it.type === 'text', (it) => ({ ...it, initialFontSize: size }))\n notifyListeners()\n }\n\n const setFontWeight = (weight: 'normal' | 'bold') => {\n if (readOnly) return\n fontWeight = weight\n patchSelected((it) => it.type === 'text', (it) => ({ ...it, fontWeight: weight }))\n notifyListeners()\n }\n\n const setEditingLabel = (editing: boolean) => {\n isEditingLabel = editing\n notifyListeners()\n }\n\n const addItem = (item: CanvasItem) => {\n if (readOnly) return\n commitItems((prev) => [...prev, item])\n setSelectedId(item.id)\n options.onItemCreate?.(item)\n }\n\n const updateItem = (id: string, patch: Partial<CanvasItem>) => {\n if (readOnly) {\n const patchKeys = Object.keys(patch)\n if (patchKeys.length !== 1 || patchKeys[0] !== 'minimized') return\n }\n let updated: CanvasItem | undefined\n commitItems((prev) =>\n prev.map((item) => {\n if (item.id === id) {\n updated = { ...item, ...patch } as CanvasItem\n return updated\n }\n return item\n }),\n )\n if (updated) options.onItemChange?.(updated)\n }\n\n const removeItem = (id: string) => {\n if (readOnly) return\n commitItems((prev) => prev.filter((item) => item.id !== id))\n if (selectedId === id) setSelectedId(null)\n options.onItemDelete?.(id)\n notifyChangeComplete()\n }\n\n const deleteSelected = () => {\n if (!readOnly && selectedId) removeItem(selectedId)\n }\n\n const clearAll = () => {\n if (readOnly) return\n commitItems(() => [])\n setSelectedId(null)\n notifyChangeComplete()\n }\n\n const undo = () => {\n if (readOnly || past.length === 0) return\n const restored = past[past.length - 1]\n future = [present, ...future]\n past = past.slice(0, -1)\n present = restored\n committedItems = restored\n triggerChange(restored)\n triggerChangeComplete(restored, null)\n notifyListeners()\n }\n\n const redo = () => {\n if (readOnly || future.length === 0) return\n const next = future[0]\n past = [...past, present]\n future = future.slice(1)\n present = next\n committedItems = next\n triggerChange(next)\n triggerChangeComplete(next, null)\n notifyListeners()\n }\n\n const exportJSON = () => JSON.stringify(present, null, 2)\n\n const importJSON = (json: string): boolean => {\n if (readOnly) return false\n try {\n const parsed = JSON.parse(json)\n if (!Array.isArray(parsed)) return false\n commitItems(() => parsed as CanvasItem[])\n setSelectedId(null)\n notifyChangeComplete()\n return true\n } catch {\n return false\n }\n }\n\n const store: LeafletCanvasStore = {\n get items() {\n return present\n },\n get activeTool() {\n return activeTool\n },\n setActiveTool,\n get readOnly() {\n return readOnly\n },\n setReadOnly,\n get activeShape() {\n return activeShape\n },\n setActiveShape,\n get shapeFilled() {\n return shapeFilled\n },\n setShapeFilled,\n get selectedId() {\n return selectedId\n },\n setSelectedId,\n get selectedItem() {\n return present.find((it) => it.id === selectedId) ?? null\n },\n get isEditingLabel() {\n return isEditingLabel\n },\n setEditingLabel,\n get labelEditMode() {\n return isEditingLabel\n },\n setLabelEditMode: setEditingLabel,\n get activeColor() {\n return activeColor\n },\n setActiveColor,\n get strokeWidth() {\n return strokeWidth\n },\n setStrokeWidth,\n get dashed() {\n return dashed\n },\n setDashed,\n get noteColor() {\n return noteColor\n },\n setNoteColor,\n get fontSize() {\n return fontSize\n },\n setFontSize,\n get fontWeight() {\n return fontWeight\n },\n setFontWeight,\n addItem,\n updateItem,\n removeItem,\n deleteSelected,\n clearAll,\n clear: clearAll,\n deleteItem: removeItem,\n setTool: setActiveTool,\n selectItem: setSelectedId,\n undo,\n redo,\n get canUndo() {\n return !readOnly && past.length > 0\n },\n get canRedo() {\n return !readOnly && future.length > 0\n },\n notifyChangeComplete,\n exportJSON,\n importJSON,\n subscribe(listener) {\n listeners.add(listener)\n return () => {\n listeners.delete(listener)\n }\n },\n getState() {\n return store\n },\n destroy() {\n listeners.clear()\n },\n }\n\n return store\n}\n\nexport const createLeafletTualController = createLeafletCanvasController\n\n\n","import type L from 'leaflet'\nimport type {\n ArrowItem,\n ArrowRenderTheme,\n CanvasAnnotationTheme,\n CanvasLabels,\n DraftArrowState,\n DraftRulerState,\n DraftShapeState,\n FreeDrawItem,\n GeoPoint,\n RulerItem,\n ScreenPoint,\n ShapeItem,\n UseLeafletCanvasOptions,\n} from '../types/index.js'\nimport {\n constrainAngleTo45Degrees,\n geoToScreen,\n screenToGeo,\n TOOL_TO_ARROW_STYLE,\n} from '../shared/index.js'\nimport {\n hitTestArrow,\n hitTestArrowHandle,\n hitTestFreeDraw,\n hitTestRuler,\n hitTestRulerHandle,\n hitTestShape,\n hitTestShapeHandle,\n projectArrow,\n projectFreeDraw,\n projectRuler,\n projectShape,\n} from '../entities/index.js'\nimport {\n buildArrowItem,\n createDraftNote,\n createDraftText,\n startArrowDrag,\n startFreeDrawDrag,\n startRulerDrag,\n startShapeDrag,\n} from './drawing-drag-handlers.js'\nimport {\n startArrowBodyDrag,\n startArrowHandleDrag,\n startFreeDrawBodyDrag,\n startRulerBodyDrag,\n startRulerHandleDrag,\n startShapeBodyDrag,\n startShapeHandleDrag,\n} from './select-drag-handlers.js'\nimport { paintLeafletCanvas } from './canvas-painter.js'\nimport { bindBlockMapDblClick, bindLeafletSync } from './map-sync.js'\nimport {\n createLeafletCanvasController,\n type LeafletCanvasStore,\n} from './canvas-controller.js'\n\nexport interface CreateLeafletCanvasOptions extends UseLeafletCanvasOptions {\n controller?: LeafletCanvasStore\n annotationTheme?: CanvasAnnotationTheme\n arrowTheme?: ArrowRenderTheme\n labels?: CanvasLabels\n}\n\nexport interface LeafletCanvasInstance {\n controller: LeafletCanvasStore\n container: HTMLDivElement\n canvas: HTMLCanvasElement\n repaint: () => void\n destroy: () => void\n}\n\nexport function createLeafletCanvas(\n map: L.Map,\n options: CreateLeafletCanvasOptions = {},\n): LeafletCanvasInstance {\n const {\n controller: externalController,\n annotationTheme,\n arrowTheme,\n labels,\n zIndex = 650,\n ...controllerOptions\n } = options\n\n const controller = externalController ?? createLeafletCanvasController(controllerOptions)\n const mapContainer = map.getContainer()\n\n const container = document.createElement('div')\n container.setAttribute('data-rlc-overlay', 'true')\n container.style.position = 'absolute'\n container.style.inset = '0'\n container.style.pointerEvents = 'none'\n container.style.zIndex = String(zIndex)\n container.style.overflow = 'hidden'\n\n const canvas = document.createElement('canvas')\n canvas.style.position = 'absolute'\n canvas.style.top = '0'\n canvas.style.left = '0'\n canvas.style.pointerEvents = 'none'\n\n const drawingSurface = document.createElement('div')\n drawingSurface.style.position = 'absolute'\n drawingSurface.style.inset = '0'\n drawingSurface.style.pointerEvents = 'none'\n\n container.appendChild(canvas)\n container.appendChild(drawingSurface)\n mapContainer.appendChild(container)\n\n let viewport = { width: 0, height: 0 }\n let draftArrow: DraftArrowState | null = null\n let draftShape: DraftShapeState | null = null\n let draftRuler: DraftRulerState | null = null\n const draftFreeDrawRef: {\n current: { screenPoints: ScreenPoint[]; geoPoints: GeoPoint[] } | null\n } = { current: null }\n const rafIdRef: { current: number | null } = { current: null }\n\n const setDraftArrow = (next: DraftArrowState | null) => {\n draftArrow = next\n repaint()\n }\n\n const setDraftShape = (next: DraftShapeState | null) => {\n draftShape = next\n repaint()\n }\n\n const setDraftRuler = (next: DraftRulerState | null) => {\n draftRuler = next\n repaint()\n }\n\n const clearDraftFreeDraw = () => {\n draftFreeDrawRef.current = null\n if (rafIdRef.current !== null && typeof window !== 'undefined') {\n window.cancelAnimationFrame(rafIdRef.current)\n rafIdRef.current = null\n }\n }\n\n const updateSurfaceInteractivity = () => {\n const isDrawing = !controller.readOnly && controller.activeTool !== 'select'\n drawingSurface.style.pointerEvents = isDrawing ? 'auto' : 'none'\n drawingSurface.style.cursor = isDrawing ? 'crosshair' : 'default'\n canvas.style.width = `${viewport.width}px`\n canvas.style.height = `${viewport.height}px`\n }\n\n const repaint = () => {\n updateSurfaceInteractivity()\n const items = controller.items\n paintLeafletCanvas({\n map,\n canvas,\n width: viewport.width,\n height: viewport.height,\n arrowItems: items.filter((it): it is ArrowItem => it.type === 'arrow'),\n shapeItems: items.filter((it): it is ShapeItem => it.type === 'shape'),\n freeDrawItems: items.filter((it): it is FreeDrawItem => it.type === 'freedraw'),\n rulerItems: items.filter((it): it is RulerItem => it.type === 'ruler'),\n selectedId: controller.selectedId,\n draftShape,\n draftArrow,\n draftRuler,\n draftFreeDraw: draftFreeDrawRef.current,\n activeColor: controller.activeColor,\n strokeWidth: controller.strokeWidth,\n dashed: controller.dashed,\n shapeFilled: controller.shapeFilled,\n annotationTheme,\n arrowTheme,\n isReadOnly: controller.readOnly,\n })\n }\n\n const getLocalPoint = (e: PointerEvent | MouseEvent): ScreenPoint => {\n const rect = mapContainer.getBoundingClientRect()\n return { x: e.clientX - rect.left, y: e.clientY - rect.top }\n }\n\n const handleSurfacePointerDown = (e: PointerEvent) => {\n if (e.button !== 0 || controller.readOnly) return\n e.stopPropagation()\n e.preventDefault()\n\n const pt = getLocalPoint(e)\n const geo = screenToGeo(map, pt)\n const { activeTool, activeShape, shapeFilled, activeColor, strokeWidth, dashed, noteColor, fontSize, fontWeight } =\n controller\n\n if (activeTool === 'freedraw') {\n startFreeDrawDrag(\n map,\n mapContainer,\n pt,\n geo,\n activeColor,\n strokeWidth,\n dashed,\n draftFreeDrawRef,\n rafIdRef,\n repaint,\n controller.addItem,\n controller.setActiveTool,\n )\n return\n }\n\n if (activeTool === 'shape') {\n startShapeDrag(\n map,\n mapContainer,\n pt,\n geo,\n activeShape,\n activeColor,\n shapeFilled,\n strokeWidth,\n dashed,\n setDraftShape,\n controller.addItem,\n controller.setActiveTool,\n )\n return\n }\n\n if (activeTool === 'note') {\n controller.addItem(createDraftNote(geo, noteColor, labels?.noteDefaultTitle ?? 'Field Note'))\n controller.setActiveTool('select')\n return\n }\n\n if (activeTool === 'text') {\n controller.addItem(\n createDraftText(geo, activeColor, fontSize, fontWeight, map.getZoom?.() ?? 14),\n )\n controller.setActiveTool('select')\n return\n }\n\n if (activeTool === 'ruler') {\n startRulerDrag(\n map,\n mapContainer,\n pt,\n geo,\n activeColor,\n strokeWidth,\n dashed,\n setDraftRuler,\n controller.addItem,\n controller.setActiveTool,\n )\n return\n }\n\n const arrowStyle = TOOL_TO_ARROW_STYLE[activeTool]\n if (!arrowStyle) return\n\n if (!draftArrow) {\n startArrowDrag(\n map,\n mapContainer,\n pt,\n geo,\n arrowStyle,\n activeColor,\n strokeWidth,\n dashed,\n setDraftArrow,\n controller.addItem,\n controller.setActiveTool,\n )\n } else {\n const startScreen = geoToScreen(map, draftArrow.startGeo)\n const endScreen = e.shiftKey ? constrainAngleTo45Degrees(startScreen, pt) : pt\n if (Math.hypot(endScreen.x - startScreen.x, endScreen.y - startScreen.y) >= 4) {\n controller.addItem(\n buildArrowItem(\n draftArrow.arrowStyle,\n draftArrow.startGeo,\n screenToGeo(map, endScreen),\n activeColor,\n strokeWidth,\n dashed,\n ),\n )\n }\n setDraftArrow(null)\n controller.setActiveTool('select')\n }\n }\n\n const handleSurfacePointerMove = (e: PointerEvent) => {\n if (!draftArrow) return\n const rawPt = getLocalPoint(e)\n const startScreen = geoToScreen(map, draftArrow.startGeo)\n const nextPt = e.shiftKey ? constrainAngleTo45Degrees(startScreen, rawPt) : rawPt\n setDraftArrow({ ...draftArrow, currentGeo: screenToGeo(map, nextPt) })\n }\n\n const handleContainerPointerDown = (e: PointerEvent) => {\n if (e.button !== 0 || controller.readOnly || controller.activeTool !== 'select') return\n const target = e.target as HTMLElement | null\n if (target?.closest('[data-rlc-toolbar], [data-rlc-note], [data-rlc-text], .leaflet-control')) {\n return\n }\n\n const pt = getLocalPoint(e)\n const items = controller.items\n const arrowItems = items.filter((it): it is ArrowItem => it.type === 'arrow')\n const shapeItems = items.filter((it): it is ShapeItem => it.type === 'shape')\n const freeDrawItems = items.filter((it): it is FreeDrawItem => it.type === 'freedraw')\n const rulerItems = items.filter((it): it is RulerItem => it.type === 'ruler')\n const selectedId = controller.selectedId\n\n const selectedArrow = arrowItems.find((a) => a.id === selectedId)\n if (selectedArrow) {\n const projected = projectArrow(map, selectedArrow)\n const handle = hitTestArrowHandle(pt, projected, selectedArrow)\n if (handle) {\n e.stopPropagation()\n e.preventDefault()\n startArrowHandleDrag(map, selectedArrow, projected, handle, getLocalPoint, controller.updateItem)\n return\n }\n }\n\n const selectedShape = shapeItems.find((s) => s.id === selectedId)\n if (selectedShape) {\n const projected = projectShape(map, selectedShape)\n const handle = hitTestShapeHandle(pt, projected)\n if (handle) {\n e.stopPropagation()\n e.preventDefault()\n startShapeHandleDrag(map, selectedShape, projected, handle, getLocalPoint, controller.updateItem)\n return\n }\n }\n\n const selectedRuler = rulerItems.find((r) => r.id === selectedId)\n if (selectedRuler) {\n const projected = projectRuler(map, selectedRuler)\n const handle = hitTestRulerHandle(pt, projected)\n if (handle) {\n e.stopPropagation()\n e.preventDefault()\n startRulerHandleDrag(map, selectedRuler, projected, handle, getLocalPoint, controller.updateItem)\n return\n }\n }\n\n for (let i = arrowItems.length - 1; i >= 0; i -= 1) {\n const arrow = arrowItems[i]\n const projected = projectArrow(map, arrow)\n if (hitTestArrow(pt, projected, arrow)) {\n e.stopPropagation()\n e.preventDefault()\n controller.setSelectedId(arrow.id)\n startArrowBodyDrag(map, arrow, projected, pt, getLocalPoint, controller.updateItem)\n return\n }\n }\n\n for (let i = shapeItems.length - 1; i >= 0; i -= 1) {\n const shp = shapeItems[i]\n const projected = projectShape(map, shp)\n if (hitTestShape(pt, projected)) {\n e.stopPropagation()\n e.preventDefault()\n controller.setSelectedId(shp.id)\n startShapeBodyDrag(map, shp, projected, pt, getLocalPoint, controller.updateItem)\n return\n }\n }\n\n for (let i = freeDrawItems.length - 1; i >= 0; i -= 1) {\n const fd = freeDrawItems[i]\n const initialScreenPts = projectFreeDraw(map, fd)\n if (hitTestFreeDraw(pt, initialScreenPts, fd)) {\n e.stopPropagation()\n e.preventDefault()\n controller.setSelectedId(fd.id)\n startFreeDrawBodyDrag(map, fd, initialScreenPts, pt, getLocalPoint, controller.updateItem)\n return\n }\n }\n\n for (let i = rulerItems.length - 1; i >= 0; i -= 1) {\n const ruler = rulerItems[i]\n const projected = projectRuler(map, ruler)\n if (hitTestRuler(pt, projected, ruler)) {\n e.stopPropagation()\n e.preventDefault()\n controller.setSelectedId(ruler.id)\n startRulerBodyDrag(map, ruler, projected, pt, getLocalPoint, controller.updateItem)\n return\n }\n }\n\n if (selectedId) {\n controller.setSelectedId(null)\n controller.notifyChangeComplete()\n }\n }\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (controller.readOnly) return\n const target = e.target as HTMLElement | null\n if (\n target &&\n (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable)\n ) {\n return\n }\n if (e.key === 'Escape') {\n draftArrow = null\n draftShape = null\n draftRuler = null\n clearDraftFreeDraw()\n controller.setSelectedId(null)\n controller.setActiveTool('select')\n controller.notifyChangeComplete()\n repaint()\n } else if ((e.key === 'Delete' || e.key === 'Backspace') && controller.selectedId) {\n e.preventDefault()\n controller.deleteSelected()\n }\n }\n\n drawingSurface.addEventListener('pointerdown', handleSurfacePointerDown)\n drawingSurface.addEventListener('pointermove', handleSurfacePointerMove)\n mapContainer.addEventListener('pointerdown', handleContainerPointerDown, { capture: true })\n if (typeof window !== 'undefined') {\n window.addEventListener('keydown', handleKeyDown)\n }\n\n const unbindSync = bindLeafletSync(map, (dims) => {\n viewport = dims\n repaint()\n })\n const unbindDblClick = bindBlockMapDblClick(map)\n const unsubscribeController = controller.subscribe(() => {\n repaint()\n })\n\n repaint()\n\n return {\n controller,\n container,\n canvas,\n repaint,\n destroy() {\n drawingSurface.removeEventListener('pointerdown', handleSurfacePointerDown)\n drawingSurface.removeEventListener('pointermove', handleSurfacePointerMove)\n mapContainer.removeEventListener('pointerdown', handleContainerPointerDown, { capture: true })\n if (typeof window !== 'undefined') {\n window.removeEventListener('keydown', handleKeyDown)\n }\n clearDraftFreeDraw()\n unbindSync()\n unbindDblClick()\n unsubscribeController()\n if (!externalController) {\n controller.destroy()\n }\n container.remove()\n },\n }\n}\n\nexport const createLeafletTual = createLeafletCanvas\n\n\n","/**\n * leaflet-tual — core (framework-agnostic)\n *\n * Interactive canvas and annotation toolkit for Leaflet maps — draw vector\n * arrows, geometric shapes, freehand sketches, rulers, sticky notes, and text\n * overlays that stay geographically synchronized with Leaflet across panning\n * and zooming.\n *\n * This module is the entire framework-agnostic public surface. It has zero\n * dependency on React or any UI framework, so it can be used directly from\n * vanilla JavaScript, TypeScript, Vue, Svelte, Angular, or a plain `<script>` tag.\n *\n * React users: see `leaflet-tual/react` for `<LeafletCanvas>`, `<CanvasToolbar>`,\n * `useLeafletCanvas`, and `useLeafletSync`.\n */\n\nimport pkg from '../../package.json'\n\nexport * from './types/index.js'\nexport * from './shared/index.js'\nexport * from './entities/index.js'\nexport * from './features/index.js'\n\nexport const VERSION: string = pkg.version\n\n","'use client'\n\nimport { useEffect, useRef, useState } from 'react'\nimport type L from 'leaflet'\nimport type { CanvasLabels, ShapeItem } from '../../types/index.js'\nimport { projectShape } from '../../../core/entities/shape/render-shape.js'\n\nexport interface InlineShapeLabelEditorProps {\n shape: ShapeItem\n map: L.Map\n labels?: CanvasLabels\n onUpdate: (id: string, patch: Partial<ShapeItem>) => void\n onClose: () => void\n}\n\nexport function InlineShapeLabelEditor({\n shape,\n map,\n labels,\n onUpdate,\n onClose,\n}: InlineShapeLabelEditorProps) {\n const [text, setText] = useState(shape.label ?? '')\n const inputRef = useRef<HTMLInputElement | null>(null)\n\n useEffect(() => {\n inputRef.current?.focus()\n inputRef.current?.select()\n }, [])\n\n const projected = projectShape(map, shape)\n const midX = Math.round(projected.cx)\n const midY = Math.round(\n shape.shape === 'actor' ? projected.maxY + 14 : projected.cy,\n )\n\n return (\n <div\n data-rlc-inline-shape-label\n style={{\n position: 'absolute',\n left: `${midX}px`,\n top: `${midY}px`,\n transform: 'translate(-50%, -50%)',\n zIndex: 1000,\n pointerEvents: 'auto',\n }}\n onClick={(e) => e.stopPropagation()}\n onPointerDown={(e) => e.stopPropagation()}\n >\n <input\n ref={inputRef}\n type=\"text\"\n data-rlc-shape-label-input={shape.id}\n data-testid=\"inline-shape-label-input\"\n data-label-mode=\"true\"\n placeholder={labels?.shapeLabelPlaceholder ?? 'Shape label...'}\n value={text}\n onChange={(e) => {\n setText(e.target.value)\n onUpdate(shape.id, { label: e.target.value })\n }}\n onBlur={onClose}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === 'Escape') {\n e.preventDefault()\n onClose()\n }\n }}\n style={{\n minWidth: '100px',\n padding: '2px 6px',\n borderRadius: '4px',\n border: '1px solid #2563eb',\n backgroundColor: '#ffffff',\n color: '#000000',\n fontSize: '12px',\n boxShadow: '0 2px 6px rgba(0, 0, 0, 0.25)',\n outline: 'none',\n }}\n />\n </div>\n )\n}\n","import React, { useEffect, useRef, useState } from 'react'\nimport type { NoteOverlayProps } from './types.js'\nimport { clampNotePosition, getDefaultNoteCardStyle, resolveNoteTheme } from './utils.js'\nimport { useNoteDragResize } from './use-note-drag-resize.js'\nimport { NoteCardView } from './NoteCardView.js'\nimport { NoteCustomRenderView } from './NoteCustomRenderView.js'\n\nexport type { NoteOverlayProps } from './types.js'\n\nexport const NoteOverlay = React.memo(function NoteOverlay({\n item,\n screenPos,\n isSelected,\n map,\n readOnly = false,\n labels,\n icons,\n unstyled = false,\n classNames,\n styles,\n clampToViewport = true,\n autoMinimizeZoomThreshold,\n renderNote,\n onSelect,\n onUpdate,\n onDelete,\n onComplete,\n}: NoteOverlayProps) {\n const cardRef = useRef<HTMLDivElement | null>(null)\n const textareaRef = useRef<HTMLTextAreaElement | null>(null)\n\n const currentZoom = typeof map?.getZoom === 'function' ? map.getZoom() : null\n const [expandedLocally, setExpandedLocally] = useState(false)\n const lastZoomRef = useRef<number | null>(currentZoom)\n\n useEffect(() => {\n if (currentZoom !== null) {\n if (lastZoomRef.current !== null && lastZoomRef.current !== currentZoom) setExpandedLocally(false)\n lastZoomRef.current = currentZoom\n }\n }, [currentZoom])\n\n const autoCompact =\n typeof autoMinimizeZoomThreshold === 'number' && currentZoom !== null && !expandedLocally && currentZoom < autoMinimizeZoomThreshold\n\n const isCompact =\n !expandedLocally &&\n (autoCompact || item.collapseState === 'compact' || item.collapseState === 'collapsed' || item.minimized === true || item.minimized === 'compact')\n\n const {\n isDragging,\n didDragRef,\n handleHeaderPointerDown,\n handleResizePointerDown,\n handleTextareaPointerDown,\n } = useNoteDragResize({\n item,\n screenPos,\n map,\n readOnly,\n isCompact,\n cardRef,\n textareaRef,\n onSelect,\n onUpdate,\n onComplete,\n })\n\n useEffect(() => {\n const el = cardRef.current\n if (!el) return\n const stopPropagation = (e: Event) => {\n const target = e.target as HTMLElement | null\n if (target?.closest('.rlc-note-header') && !target.closest('button, input')) return\n e.stopPropagation()\n }\n el.addEventListener('mousedown', stopPropagation)\n el.addEventListener('touchstart', stopPropagation)\n return () => {\n el.removeEventListener('mousedown', stopPropagation)\n el.removeEventListener('touchstart', stopPropagation)\n }\n }, [])\n\n const handleExpandFromCompact = (e?: React.MouseEvent) => {\n e?.stopPropagation()\n setExpandedLocally(true)\n if (!readOnly) onSelect(item.id)\n onUpdate(item.id, { minimized: false })\n }\n\n const theme = resolveNoteTheme(item.backgroundColor)\n const { x: renderX, y: renderY } = clampNotePosition(\n map,\n screenPos,\n item,\n isCompact,\n isDragging,\n clampToViewport,\n )\n\n const structuralRootStyle: React.CSSProperties = {\n position: 'absolute',\n left: `${renderX}px`,\n top: `${renderY}px`,\n pointerEvents: 'auto',\n zIndex: !readOnly && isSelected ? 30 : 20,\n userSelect: readOnly ? 'text' : 'none',\n }\n\n const cardClassName = [\n 'rlc-note-card',\n isCompact ? 'rlc-note-compact rlc-note-collapsed' : undefined,\n classNames?.noteCard,\n isCompact ? classNames?.noteCompact : undefined,\n isCompact ? classNames?.noteCollapsed : undefined,\n !readOnly && isSelected ? classNames?.noteCardSelected : undefined,\n ]\n .filter(Boolean)\n .join(' ')\n\n const handleCardClick = (e: React.MouseEvent) => {\n e.stopPropagation()\n if (didDragRef.current) {\n didDragRef.current = false\n return\n }\n if (isCompact) {\n handleExpandFromCompact(e)\n return\n }\n if (!readOnly) onSelect(item.id)\n }\n\n const handleCardDoubleClick = (e: React.MouseEvent) => {\n e.stopPropagation()\n if (didDragRef.current) {\n didDragRef.current = false\n return\n }\n if (isCompact) handleExpandFromCompact(e)\n }\n\n if (renderNote) {\n return (\n <NoteCustomRenderView\n item={item}\n screenPos={screenPos}\n isSelected={isSelected}\n isDragging={isDragging}\n readOnly={readOnly}\n isCompact={isCompact}\n cardClassName={cardClassName}\n structuralRootStyle={structuralRootStyle}\n styles={styles}\n renderNote={renderNote}\n onCardClick={handleCardClick}\n onCardDoubleClick={handleCardDoubleClick}\n handleHeaderPointerDown={handleHeaderPointerDown}\n handleResizePointerDown={handleResizePointerDown}\n onSelect={onSelect}\n onUpdate={onUpdate}\n onDelete={onDelete}\n />\n )\n }\n\n return (\n <div\n ref={cardRef}\n data-rlc-note={item.id}\n data-collapsed={isCompact ? 'true' : undefined}\n data-compact={isCompact ? 'true' : undefined}\n data-selected={(!readOnly && isSelected) || undefined}\n data-dragging={isDragging || undefined}\n className={cardClassName}\n onClick={handleCardClick}\n onDoubleClick={handleCardDoubleClick}\n onWheel={(e) => e.stopPropagation()}\n style={{\n ...structuralRootStyle,\n ...getDefaultNoteCardStyle(item, theme, isCompact, isSelected, readOnly, isDragging, unstyled),\n ...styles?.noteCard,\n ...(isCompact ? { borderRadius: '9999px', ...styles?.noteCollapsed, ...styles?.noteCompact } : undefined),\n ...(!readOnly && isSelected ? styles?.noteCardSelected : undefined),\n }}\n >\n <NoteCardView\n item={item}\n theme={theme}\n isCompact={isCompact}\n isDragging={isDragging}\n readOnly={readOnly}\n unstyled={unstyled}\n labels={labels}\n icons={icons}\n classNames={classNames}\n styles={styles}\n textareaRef={textareaRef}\n onHeaderPointerDown={handleHeaderPointerDown}\n onExpandFromCompact={handleExpandFromCompact}\n onCollapse={() => {\n setExpandedLocally(false)\n onUpdate(item.id, { minimized: true })\n }}\n onSelect={onSelect}\n onUpdate={onUpdate}\n onDelete={onDelete}\n onComplete={onComplete}\n onTextareaPointerDown={handleTextareaPointerDown}\n />\n </div>\n )\n})\n","import type React from 'react'\nimport type L from 'leaflet'\nimport type { NoteItem, ScreenPoint } from '../../types/index.js'\nimport { NOTE_COLOR_THEMES } from '../../shared/constants.js'\nimport { getMapDimensions } from '../../shared/geo.js'\nimport type { ResolvedNoteTheme } from './types.js'\n\nexport function resolveNoteTheme(backgroundColor: string): ResolvedNoteTheme {\n const matchedTheme = NOTE_COLOR_THEMES.find((t) => t.bg === backgroundColor)\n if (matchedTheme) return matchedTheme\n\n const isDarkBg =\n (backgroundColor?.startsWith('#') &&\n backgroundColor.length === 7 &&\n parseInt(backgroundColor.slice(1), 16) < 0x888888) ||\n backgroundColor === '#111827' ||\n backgroundColor === '#1e293b' ||\n backgroundColor === '#0f172a'\n\n return {\n name: 'Custom',\n bg: backgroundColor,\n border: isDarkBg ? 'rgba(255, 255, 255, 0.16)' : 'rgba(0, 0, 0, 0.12)',\n header: isDarkBg ? 'rgba(255, 255, 255, 0.08)' : 'rgba(0, 0, 0, 0.06)',\n text: isDarkBg ? '#f8fafc' : '#0f172a',\n }\n}\n\nexport function clampNotePosition(\n map: L.Map,\n screenPos: ScreenPoint,\n item: NoteItem,\n isCompact: boolean,\n isDragging: boolean,\n clampToViewport = true,\n): ScreenPoint {\n const mapDims = clampToViewport !== false ? getMapDimensions(map) : null\n if (!mapDims || isDragging) return screenPos\n\n const isAnchorNearViewport =\n screenPos.x >= -120 &&\n screenPos.x <= mapDims.width + 120 &&\n screenPos.y >= -120 &&\n screenPos.y <= mapDims.height + 120\n\n if (!isAnchorNearViewport) return screenPos\n\n const cardWidth = isCompact ? 95 : (item.width ?? 230)\n const cardHeight = isCompact ? 22 : (item.height ?? 100)\n const pad = 8\n const minX = 16 + pad\n const maxX = Math.max(minX, mapDims.width - cardWidth + 16 - pad)\n const minY = 12 + pad\n const maxY = Math.max(minY, mapDims.height - cardHeight + 12 - pad)\n\n return {\n x: Math.max(minX, Math.min(maxX, screenPos.x)),\n y: Math.max(minY, Math.min(maxY, screenPos.y)),\n }\n}\n\nexport function getDefaultNoteCardStyle(\n item: NoteItem,\n theme: ResolvedNoteTheme,\n isCompact: boolean,\n isSelected: boolean,\n readOnly: boolean,\n isDragging: boolean,\n unstyled: boolean,\n): React.CSSProperties {\n if (unstyled) return { transform: 'translate(-16px, -12px)' }\n\n if (isCompact) {\n return {\n transform: 'translate(-16px, -12px)',\n width: 'auto',\n minWidth: '24px',\n maxWidth: '130px',\n height: '22px',\n boxSizing: 'border-box',\n backgroundColor: item.backgroundColor,\n color: item.textColor || theme.text,\n border: `1px solid ${!readOnly && isSelected ? '#4b5563' : theme.border}`,\n borderRadius: '9999px',\n overflow: 'hidden',\n boxShadow:\n !readOnly && isSelected\n ? '0 2px 6px rgba(0, 0, 0, 0.25)'\n : '0 1px 3px rgba(0, 0, 0, 0.12)',\n fontFamily: 'Inter, system-ui, -apple-system, sans-serif',\n display: 'inline-flex',\n alignItems: 'center',\n padding: '0 8px',\n gap: '4px',\n cursor: readOnly ? 'default' : isDragging ? 'grabbing' : 'grab',\n transition: 'none',\n }\n }\n\n return {\n transform: 'translate(-16px, -12px)',\n width: `${item.width ?? 230}px`,\n boxSizing: 'border-box',\n backgroundColor: item.backgroundColor,\n color: item.textColor || theme.text,\n border: `1px solid ${!readOnly && isSelected ? '#4b5563' : theme.border}`,\n borderRadius: '2px',\n overflow: 'hidden',\n boxShadow:\n !readOnly && isSelected\n ? '0 2px 6px rgba(0, 0, 0, 0.2)'\n : '0 1px 3px rgba(0, 0, 0, 0.12)',\n fontFamily: 'Inter, system-ui, -apple-system, sans-serif',\n transition: 'none',\n }\n}\n\n","import { useEffect, useRef, useState } from 'react'\nimport type React from 'react'\nimport type L from 'leaflet'\nimport type { NoteItem, ScreenPoint } from '../../types/index.js'\nimport { screenToGeo } from '../../shared/geo.js'\nimport { startNoteResize } from './note-resize-handler.js'\n\nexport interface UseNoteDragResizeOptions {\n item: NoteItem\n screenPos: ScreenPoint\n map: L.Map\n readOnly: boolean\n isCompact: boolean\n cardRef: React.RefObject<HTMLDivElement | null>\n textareaRef: React.RefObject<HTMLTextAreaElement | null>\n onSelect: (id: string) => void\n onUpdate: (id: string, patch: Partial<NoteItem>) => void\n onComplete?: () => void\n}\n\nexport function useNoteDragResize({\n item,\n screenPos,\n map,\n readOnly,\n isCompact,\n cardRef,\n textareaRef,\n onSelect,\n onUpdate,\n onComplete,\n}: UseNoteDragResizeOptions) {\n const [isDragging, setIsDragging] = useState(false)\n const dragOffsetRef = useRef({ dx: 0, dy: 0 })\n const didDragRef = useRef(false)\n const dragStartPosRef = useRef({ x: 0, y: 0 })\n const pendingCommitRef = useRef<{ timer: ReturnType<typeof setTimeout> | null }>({ timer: null })\n\n const commitResize = (nextW: number, nextH: number) => {\n if (pendingCommitRef.current.timer) {\n clearTimeout(pendingCommitRef.current.timer)\n pendingCommitRef.current.timer = null\n }\n map.dragging?.enable?.()\n if (cardRef.current) cardRef.current.style.transition = 'none'\n\n const patch: Partial<NoteItem> = {}\n if (nextW > 0 && Math.abs(nextW - (item.width ?? 230)) > 2) {\n patch.width = Math.max(160, Math.min(600, nextW))\n }\n if (nextH > 0 && Math.abs(nextH - (item.height ?? 0)) > 2) {\n patch.height = Math.max(50, Math.min(800, nextH))\n }\n if (Object.keys(patch).length > 0) {\n onUpdate(item.id, patch)\n onComplete?.()\n }\n }\n\n useEffect(() => {\n const textarea = textareaRef.current\n if (!textarea || typeof ResizeObserver === 'undefined') return\n\n const ro = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const measuredW = Math.round(entry.borderBoxSize?.[0]?.inlineSize ?? entry.contentRect.width)\n const measuredH = Math.round(entry.borderBoxSize?.[0]?.blockSize ?? entry.contentRect.height)\n if (measuredW < 50 || measuredH < 20) continue\n\n const widthDiff = Math.abs(measuredW - (item.width ?? 230))\n const heightDiff = Math.abs(measuredH - (item.height ?? textarea.offsetHeight))\n if (widthDiff > 2 || heightDiff > 2) {\n if (cardRef.current && widthDiff > 2) {\n cardRef.current.style.transition = 'none'\n cardRef.current.style.width = `${measuredW}px`\n }\n map.dragging?.disable?.()\n if (pendingCommitRef.current.timer) clearTimeout(pendingCommitRef.current.timer)\n pendingCommitRef.current.timer = setTimeout(() => {\n commitResize(measuredW, measuredH)\n }, 150)\n }\n }\n })\n ro.observe(textarea)\n\n const handleWindowPointerUp = () => {\n if (pendingCommitRef.current.timer) {\n commitResize(textareaRef.current?.offsetWidth ?? 0, textareaRef.current?.offsetHeight ?? 0)\n }\n }\n window.addEventListener('pointerup', handleWindowPointerUp)\n window.addEventListener('mouseup', handleWindowPointerUp)\n\n return () => {\n ro.disconnect()\n window.removeEventListener('pointerup', handleWindowPointerUp)\n window.removeEventListener('mouseup', handleWindowPointerUp)\n if (pendingCommitRef.current.timer) {\n clearTimeout(pendingCommitRef.current.timer)\n pendingCommitRef.current.timer = null\n }\n }\n }, [item.id, item.width, item.height, map, onUpdate, onComplete])\n\n const handleResizePointerDown = (e: React.PointerEvent<HTMLElement>) => {\n if (readOnly || isCompact) return\n startNoteResize({ e, item, map, cardRef, textareaRef, onSelect, onUpdate, onComplete })\n }\n\n const handleHeaderPointerDown = (e: React.PointerEvent<HTMLElement>) => {\n if (readOnly || (e.target as HTMLElement).closest('button, input, textarea')) return\n e.stopPropagation()\n e.preventDefault()\n onSelect(item.id)\n setIsDragging(true)\n didDragRef.current = false\n dragStartPosRef.current = { x: e.clientX, y: e.clientY }\n\n const rect = map.getContainer().getBoundingClientRect()\n dragOffsetRef.current = {\n dx: e.clientX - rect.left - screenPos.x,\n dy: e.clientY - rect.top - screenPos.y,\n }\n map.dragging.disable()\n\n let dragRafId: number | null = null\n let latestGeo = item.position\n const isTestEnv = typeof process !== 'undefined' && process.env?.NODE_ENV === 'test'\n\n const flushDrag = () => {\n dragRafId = null\n onUpdate(item.id, { position: latestGeo })\n }\n\n const handlePointerMove = (moveEvent: PointerEvent) => {\n if (Math.hypot(moveEvent.clientX - dragStartPosRef.current.x, moveEvent.clientY - dragStartPosRef.current.y) > 2) {\n didDragRef.current = true\n }\n const nextX = moveEvent.clientX - rect.left - dragOffsetRef.current.dx\n const nextY = moveEvent.clientY - rect.top - dragOffsetRef.current.dy\n if (cardRef.current) {\n cardRef.current.style.left = `${nextX}px`\n cardRef.current.style.top = `${nextY}px`\n }\n latestGeo = screenToGeo(map, { x: nextX, y: nextY })\n if (isTestEnv) flushDrag()\n else if (dragRafId === null) dragRafId = requestAnimationFrame(flushDrag)\n }\n\n const handlePointerUp = () => {\n if (dragRafId !== null) cancelAnimationFrame(dragRafId)\n setIsDragging(false)\n map.dragging.enable()\n if (didDragRef.current) {\n onUpdate(item.id, { position: latestGeo })\n onComplete?.()\n }\n window.removeEventListener('pointermove', handlePointerMove)\n window.removeEventListener('pointerup', handlePointerUp)\n window.removeEventListener('pointercancel', handlePointerUp)\n }\n\n window.addEventListener('pointermove', handlePointerMove)\n window.addEventListener('pointerup', handlePointerUp)\n window.addEventListener('pointercancel', handlePointerUp)\n }\n\n const handleTextareaPointerDown = (e: React.PointerEvent) => {\n e.stopPropagation()\n map.dragging.disable()\n const startW = textareaRef.current?.offsetWidth ?? 0\n const startH = textareaRef.current?.offsetHeight ?? 0\n if (cardRef.current) cardRef.current.style.transition = 'none'\n const handleUp = () => {\n const currentW = textareaRef.current?.offsetWidth ?? 0\n const currentH = textareaRef.current?.offsetHeight ?? 0\n if (Math.abs(currentW - startW) > 2 || Math.abs(currentH - startH) > 2) {\n commitResize(currentW, currentH)\n } else {\n map.dragging?.enable?.()\n if (cardRef.current) cardRef.current.style.transition = 'none'\n }\n window.removeEventListener('pointerup', handleUp)\n window.removeEventListener('mouseup', handleUp)\n }\n window.addEventListener('pointerup', handleUp, { once: true })\n window.addEventListener('mouseup', handleUp, { once: true })\n }\n\n return {\n isDragging,\n didDragRef,\n commitResize,\n handleHeaderPointerDown,\n handleResizePointerDown,\n handleTextareaPointerDown,\n }\n}\n","import type React from 'react'\nimport type L from 'leaflet'\nimport type { NoteItem } from '../../types/index.js'\n\nexport interface StartNoteResizeOptions {\n e: React.PointerEvent<HTMLElement>\n item: NoteItem\n map: L.Map\n cardRef: React.RefObject<HTMLDivElement | null>\n textareaRef: React.RefObject<HTMLTextAreaElement | null>\n onSelect: (id: string) => void\n onUpdate: (id: string, patch: Partial<NoteItem>) => void\n onComplete?: () => void\n}\n\nexport function startNoteResize(options: StartNoteResizeOptions) {\n const { e, item, map, cardRef, textareaRef, onSelect, onUpdate, onComplete } = options\n e.stopPropagation()\n e.preventDefault()\n onSelect(item.id)\n\n if (cardRef.current) {\n cardRef.current.style.transition = 'none'\n cardRef.current.setAttribute('data-resizing', 'true')\n }\n const target = e.currentTarget\n const pointerId = e.pointerId\n try { target?.setPointerCapture?.(pointerId) } catch { /* ignore */ }\n\n const startX = e.clientX\n const startY = e.clientY\n const startWidth = item.width ?? 230\n const startHeight = item.height ?? textareaRef.current?.offsetHeight ?? 62\n map.dragging.disable()\n\n let rafId: number | null = null\n let latestWidth = startWidth\n let latestHeight = startHeight\n let hasMovedY = false\n const isTestEnv = typeof process !== 'undefined' && process.env?.NODE_ENV === 'test'\n\n const flushUpdate = () => {\n rafId = null\n const patch: Partial<NoteItem> = { width: latestWidth }\n if (hasMovedY || item.height !== undefined) patch.height = latestHeight\n onUpdate(item.id, patch)\n }\n\n const handlePointerMove = (moveEvent: PointerEvent) => {\n const dx = moveEvent.clientX - startX\n const dy = moveEvent.clientY - startY\n latestWidth = Math.max(160, Math.min(600, Math.round(startWidth + dx)))\n latestHeight = Math.max(50, Math.min(800, Math.round(startHeight + dy)))\n if (dy !== 0) hasMovedY = true\n if (cardRef.current) cardRef.current.style.width = `${latestWidth}px`\n if (textareaRef.current && (hasMovedY || item.height !== undefined)) {\n textareaRef.current.style.height = `${latestHeight}px`\n }\n if (isTestEnv) flushUpdate()\n else if (rafId === null) rafId = requestAnimationFrame(flushUpdate)\n }\n\n const handlePointerUp = () => {\n if (rafId !== null) cancelAnimationFrame(rafId)\n if (cardRef.current) {\n cardRef.current.style.transition = 'none'\n cardRef.current.removeAttribute('data-resizing')\n }\n map.dragging.enable()\n try { target?.releasePointerCapture?.(pointerId) } catch { /* ignore */ }\n const patch: Partial<NoteItem> = { width: latestWidth }\n if (hasMovedY || item.height !== undefined) patch.height = latestHeight\n onUpdate(item.id, patch)\n onComplete?.()\n window.removeEventListener('pointermove', handlePointerMove)\n window.removeEventListener('pointerup', handlePointerUp)\n window.removeEventListener('pointercancel', handlePointerUp)\n }\n\n window.addEventListener('pointermove', handlePointerMove)\n window.addEventListener('pointerup', handlePointerUp)\n window.addEventListener('pointercancel', handlePointerUp)\n}\n\n","export const DEFAULT_ICONS = {\n select: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"m3 3 7.07 16.97 2.51-7.39 7.39-2.51L3 3z\" />\n <path d=\"m13 13 6 6\" />\n </svg>\n ),\n freedraw: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z\" />\n <path d=\"m15 5 4 4\" />\n </svg>\n ),\n arrowLinear: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"M7 7h10v10\" />\n <path d=\"M7 17 17 7\" />\n </svg>\n ),\n arrowCurved: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"M4 19C4 10 11 5 20 5\" />\n <polyline points=\"15 2 20 5 16 10\" />\n </svg>\n ),\n arrowBi: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"M11 19H5v-6\" />\n <path d=\"M13 5h6v6\" />\n <path d=\"M19 5 5 19\" />\n </svg>\n ),\n arrowElbow: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <polyline points=\"4 18 12 18 12 6 20 6\" />\n <polyline points=\"16 2 20 6 16 10\" />\n </svg>\n ),\n arrowSCurve: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"M5 19C9 19 11 15 12 12C13 9 15 9 19 5\" />\n <polyline points=\"13 5 19 5 19 11\" />\n </svg>\n ),\n shapesGroup: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"M8.3 10a.7.7 0 0 1-.626-1.079L11.4 3a.7.7 0 0 1 1.198-.043L16.3 8.9a.7.7 0 0 1-.572 1.1Z\" />\n <rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" />\n <circle cx=\"17.5\" cy=\"17.5\" r=\"3.5\" />\n </svg>\n ),\n shapeSquare: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n </svg>\n ),\n shapeCircle: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n </svg>\n ),\n shapeStar: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z\" />\n </svg>\n ),\n shapeActor: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\" />\n <circle cx=\"12\" cy=\"7\" r=\"4\" />\n </svg>\n ),\n shapeTriangle: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"M13.73 4a2 2 0 0 0-3.46 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z\" />\n </svg>\n ),\n shapeDiamond: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"M2.7 10.3a2.41 2.41 0 0 0 0 3.41l7.59 7.59a2.41 2.41 0 0 0 3.41 0l7.59-7.59a2.41 2.41 0 0 0 0-3.41l-7.59-7.59a2.41 2.41 0 0 0-3.41 0Z\" />\n </svg>\n ),\n shapeHexagon: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z\" />\n </svg>\n ),\n shapeMarker: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0\" />\n <circle cx=\"12\" cy=\"10\" r=\"3\" />\n </svg>\n ),\n dropdownChevron: (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n ),\n ruler: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"M21.3 8.7 8.7 21.3a1 1 0 0 1-1.4 0l-4.6-4.6a1 1 0 0 1 0-1.4L15.3 2.7a1 1 0 0 1 1.4 0l4.6 4.6a1 1 0 0 1 0 1.4Z\" />\n <path d=\"m14.5 3.5 2 2\" />\n <path d=\"m11.5 6.5 2 2\" />\n <path d=\"m8.5 9.5 2 2\" />\n <path d=\"m5.5 12.5 2 2\" />\n </svg>\n ),\n note: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"M21 9a2.4 2.4 0 0 0-.706-1.706l-3.588-3.588A2.4 2.4 0 0 0 15 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2z\" />\n <path d=\"M15 3v5a1 1 0 0 0 1 1h5\" />\n </svg>\n ),\n text: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"M12 4v16\" />\n <path d=\"M4 7V5a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v2\" />\n <path d=\"M9 20h6\" />\n </svg>\n ),\n undo: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"M9 14 4 9l5-5\" />\n <path d=\"M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5a5.5 5.5 0 0 1-5.5 5.5H11\" />\n </svg>\n ),\n redo: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"m15 14 5-5-5-5\" />\n <path d=\"M20 9H9.5A5.5 5.5 0 0 0 4 14.5A5.5 5.5 0 0 0 9.5 20H13\" />\n </svg>\n ),\n collapseToolbar: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"m18 15-6-6-6 6\" />\n </svg>\n ),\n expandToolbar: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n ),\n delete: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"M10 11v6\" />\n <path d=\"M14 11v6\" />\n <path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\" />\n <path d=\"M3 6h18\" />\n <path d=\"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" />\n </svg>\n ),\n clear: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"m15 9-6 6\" />\n <path d=\"m9 9 6 6\" />\n </svg>\n ),\n noteExpand: (\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n ),\n noteCollapse: (\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"M5 12h14\" />\n </svg>\n ),\n noteDelete: (\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n ),\n textBold: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"M6 12h9a4 4 0 0 1 0 8H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h7a4 4 0 0 1 0 8\" />\n </svg>\n ),\n}\n","import type React from 'react'\nimport type {\n CanvasIcons,\n CanvasLabels,\n LeafletCanvasClassNames,\n LeafletCanvasStyles,\n NoteItem,\n} from '../../types/index.js'\nimport { DEFAULT_ICONS } from '../../widgets/CanvasToolbar/icons.js'\nimport type { ResolvedNoteTheme } from './types.js'\n\nexport interface NoteCardHeaderProps {\n item: NoteItem\n theme: ResolvedNoteTheme\n readOnly: boolean\n unstyled: boolean\n labels?: CanvasLabels\n icons?: CanvasIcons\n classNames?: LeafletCanvasClassNames\n styles?: LeafletCanvasStyles\n onHeaderPointerDown: (e: React.PointerEvent<HTMLElement>) => void\n onCollapse: () => void\n onSelect: (id: string) => void\n onUpdate: (id: string, patch: Partial<NoteItem>) => void\n onDelete: (id: string) => void\n onComplete?: () => void\n}\n\nexport function NoteCardHeader({\n item,\n theme,\n readOnly,\n unstyled,\n labels,\n icons,\n classNames,\n styles,\n onHeaderPointerDown,\n onCollapse,\n onSelect,\n onUpdate,\n onDelete,\n onComplete,\n}: NoteCardHeaderProps) {\n const headerBtnBaseStyle: React.CSSProperties = unstyled\n ? {}\n : {\n border: 'none',\n background: 'transparent',\n color: item.textColor || theme.text,\n width: '20px',\n height: '20px',\n padding: 0,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n fontSize: '12px',\n fontWeight: 700,\n lineHeight: 1,\n opacity: 0.75,\n borderRadius: '2px',\n flexShrink: 0,\n }\n\n return (\n <div\n onPointerDown={onHeaderPointerDown}\n className={['rlc-note-header', classNames?.noteHeader].filter(Boolean).join(' ')}\n style={{\n cursor: readOnly ? 'default' : 'grab',\n ...(unstyled\n ? {}\n : {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '6px',\n padding: '6px 8px 6px 10px',\n backgroundColor: theme.header,\n borderBottom: `1px solid ${theme.border}`,\n boxSizing: 'border-box',\n }),\n ...styles?.noteHeader,\n }}\n >\n <input\n type=\"text\"\n readOnly={readOnly}\n value={item.title ?? ''}\n placeholder={labels?.noteTitlePlaceholder ?? 'Note title...'}\n aria-label={labels?.noteTitlePlaceholder ?? 'Note title'}\n title={item.title || labels?.noteTitlePlaceholder || 'Note'}\n className={['rlc-note-title-input', classNames?.noteTitleInput].filter(Boolean).join(' ')}\n onFocus={() => { if (!readOnly) onSelect(item.id) }}\n onBlur={() => onComplete?.()}\n onChange={(e) => { if (!readOnly) onUpdate(item.id, { title: e.target.value }) }}\n onPointerDown={(e) => e.stopPropagation()}\n style={{\n ...(unstyled\n ? {}\n : {\n flex: 1,\n minWidth: 0,\n background: 'transparent',\n border: 'none',\n outline: 'none',\n fontWeight: 600,\n fontSize: '12px',\n color: item.textColor || theme.text,\n fontFamily: 'inherit',\n cursor: readOnly ? 'default' : 'text',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n }),\n ...styles?.noteTitleInput,\n }}\n />\n\n <div\n className={['rlc-note-header-actions', classNames?.noteHeaderActions].filter(Boolean).join(' ')}\n style={{\n ...(unstyled ? {} : { display: 'flex', alignItems: 'center', gap: '3px', flexShrink: 0 }),\n ...styles?.noteHeaderActions,\n }}\n >\n <button\n type=\"button\"\n title={labels?.noteCollapse ?? 'Collapse note'}\n aria-label={labels?.noteCollapse ?? 'Collapse note'}\n className={['rlc-note-header-btn', classNames?.noteHeaderButton].filter(Boolean).join(' ')}\n onClick={(e) => {\n e.stopPropagation()\n onCollapse()\n }}\n style={{ ...headerBtnBaseStyle, ...styles?.noteHeaderButton }}\n >\n {icons?.noteCollapse ?? DEFAULT_ICONS.noteCollapse}\n </button>\n\n {!readOnly && (\n <button\n type=\"button\"\n title={labels?.noteDelete ?? 'Delete note'}\n aria-label={labels?.noteDelete ?? 'Delete note'}\n className={['rlc-note-header-btn', 'rlc-note-delete-btn', classNames?.noteHeaderButton, classNames?.noteDeleteButton].filter(Boolean).join(' ')}\n onClick={(e) => {\n e.stopPropagation()\n onDelete(item.id)\n }}\n style={{\n ...headerBtnBaseStyle,\n ...styles?.noteHeaderButton,\n ...styles?.noteDeleteButton,\n }}\n >\n {icons?.noteDelete ?? DEFAULT_ICONS.noteDelete}\n </button>\n )}\n </div>\n </div>\n )\n}\n\n","import type React from 'react'\nimport type {\n CanvasIcons,\n CanvasLabels,\n LeafletCanvasClassNames,\n LeafletCanvasStyles,\n NoteItem,\n} from '../../types/index.js'\nimport { DEFAULT_ICONS } from '../../widgets/CanvasToolbar/icons.js'\nimport type { ResolvedNoteTheme } from './types.js'\nimport { NoteCardHeader } from './NoteCardHeader.js'\n\nexport interface NoteCardViewProps {\n item: NoteItem\n theme: ResolvedNoteTheme\n isCompact: boolean\n isDragging: boolean\n readOnly: boolean\n unstyled: boolean\n labels?: CanvasLabels\n icons?: CanvasIcons\n classNames?: LeafletCanvasClassNames\n styles?: LeafletCanvasStyles\n textareaRef: React.RefObject<HTMLTextAreaElement | null>\n onHeaderPointerDown: (e: React.PointerEvent<HTMLElement>) => void\n onExpandFromCompact: (e?: React.MouseEvent) => void\n onCollapse: () => void\n onSelect: (id: string) => void\n onUpdate: (id: string, patch: Partial<NoteItem>) => void\n onDelete: (id: string) => void\n onComplete?: () => void\n onTextareaPointerDown: (e: React.PointerEvent<HTMLTextAreaElement>) => void\n}\n\nexport function NoteCardView({\n item,\n theme,\n isCompact,\n isDragging,\n readOnly,\n unstyled,\n labels,\n icons,\n classNames,\n styles,\n textareaRef,\n onHeaderPointerDown,\n onExpandFromCompact,\n onCollapse,\n onSelect,\n onUpdate,\n onDelete,\n onComplete,\n onTextareaPointerDown,\n}: NoteCardViewProps) {\n if (isCompact) {\n return (\n <div\n onPointerDown={onHeaderPointerDown}\n className={['rlc-note-header', classNames?.noteHeader].filter(Boolean).join(' ')}\n style={{\n cursor: readOnly ? 'default' : isDragging ? 'grabbing' : 'grab',\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n width: '100%',\n height: '100%',\n userSelect: 'none',\n }}\n >\n <span\n style={{\n fontSize: '11px',\n fontWeight: 600,\n lineHeight: 1,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n maxWidth: '90px',\n color: item.textColor || theme.text,\n }}\n title={item.title || labels?.noteTitlePlaceholder || 'Note'}\n >\n {item.title || labels?.noteTitlePlaceholder || 'Note'}\n </span>\n <button\n type=\"button\"\n title={labels?.noteExpand ?? 'Expand note'}\n aria-label={labels?.noteExpand ?? 'Expand note'}\n className={['rlc-note-header-btn', classNames?.noteHeaderButton].filter(Boolean).join(' ')}\n onClick={onExpandFromCompact}\n style={{\n border: 'none',\n background: 'transparent',\n color: item.textColor || theme.text,\n width: '12px',\n height: '12px',\n padding: 0,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n opacity: 0.75,\n flexShrink: 0,\n }}\n >\n {icons?.noteExpand ?? DEFAULT_ICONS.noteExpand}\n </button>\n </div>\n )\n }\n\n return (\n <>\n <NoteCardHeader\n item={item}\n theme={theme}\n readOnly={readOnly}\n unstyled={unstyled}\n labels={labels}\n icons={icons}\n classNames={classNames}\n styles={styles}\n onHeaderPointerDown={onHeaderPointerDown}\n onCollapse={onCollapse}\n onSelect={onSelect}\n onUpdate={onUpdate}\n onDelete={onDelete}\n onComplete={onComplete}\n />\n\n <div\n className={['rlc-note-body', classNames?.noteBody].filter(Boolean).join(' ')}\n style={{ ...(unstyled ? {} : { padding: 0 }), ...styles?.noteBody }}\n >\n <textarea\n ref={textareaRef}\n readOnly={readOnly}\n value={item.text}\n placeholder={labels?.noteTextPlaceholder ?? 'Write a note on the map...'}\n aria-label={labels?.noteTextPlaceholder ?? 'Note text'}\n rows={3}\n className={['rlc-note-textarea', classNames?.noteTextarea].filter(Boolean).join(' ')}\n onFocus={() => { if (!readOnly) onSelect(item.id) }}\n onBlur={() => onComplete?.()}\n onChange={(e) => { if (!readOnly) onUpdate(item.id, { text: e.target.value }) }}\n onPointerDown={onTextareaPointerDown}\n onMouseDown={(e) => e.stopPropagation()}\n style={{\n ...(unstyled\n ? {}\n : {\n width: '100%',\n height: item.height ? `${item.height}px` : undefined,\n boxSizing: 'border-box',\n display: 'block',\n margin: 0,\n background: 'transparent',\n border: 'none',\n borderRadius: 0,\n padding: '6px 10px 8px',\n outline: 'none',\n resize: readOnly ? 'none' : 'both',\n minWidth: '160px',\n maxWidth: '600px',\n minHeight: '56px',\n maxHeight: '800px',\n fontSize: '12px',\n lineHeight: 1.45,\n color: item.textColor || theme.text,\n fontFamily: 'inherit',\n cursor: readOnly ? 'default' : 'text',\n }),\n ...styles?.noteTextarea,\n }}\n />\n </div>\n </>\n )\n}\n","import type React from 'react'\nimport type { NoteItem, RenderNoteProps, ScreenPoint } from '../../types/index.js'\n\nexport interface NoteCustomRenderViewProps {\n item: NoteItem\n screenPos: ScreenPoint\n isSelected: boolean\n isDragging: boolean\n readOnly: boolean\n isCompact: boolean\n cardClassName: string\n structuralRootStyle: React.CSSProperties\n styles?: { noteCard?: React.CSSProperties; noteCollapsed?: React.CSSProperties; noteCompact?: React.CSSProperties; noteCardSelected?: React.CSSProperties }\n renderNote: (props: RenderNoteProps) => React.ReactNode\n onCardClick: (e: React.MouseEvent) => void\n onCardDoubleClick: (e: React.MouseEvent) => void\n handleHeaderPointerDown: (e: React.PointerEvent<HTMLElement>) => void\n handleResizePointerDown: (e: React.PointerEvent<HTMLElement>) => void\n onSelect: (id: string) => void\n onUpdate: (id: string, patch: Partial<NoteItem>) => void\n onDelete: (id: string) => void\n}\n\nexport function NoteCustomRenderView({\n item,\n screenPos,\n isSelected,\n isDragging,\n readOnly,\n isCompact,\n cardClassName,\n structuralRootStyle,\n styles,\n renderNote,\n onCardClick,\n onCardDoubleClick,\n handleHeaderPointerDown,\n handleResizePointerDown,\n onSelect,\n onUpdate,\n onDelete,\n}: NoteCustomRenderViewProps) {\n return (\n <div\n data-rlc-note={item.id}\n data-collapsed={isCompact ? 'true' : undefined}\n data-compact={isCompact ? 'true' : undefined}\n data-selected={(!readOnly && isSelected) || undefined}\n className={cardClassName}\n onClick={onCardClick}\n onDoubleClick={onCardDoubleClick}\n onWheel={(e) => e.stopPropagation()}\n style={{\n ...structuralRootStyle,\n ...styles?.noteCard,\n ...(isCompact ? { ...styles?.noteCollapsed, ...styles?.noteCompact } : undefined),\n ...(!readOnly && isSelected ? styles?.noteCardSelected : undefined),\n }}\n >\n {renderNote({\n item,\n screenPos,\n isSelected: !readOnly && isSelected,\n isDragging,\n readOnly,\n isCompact,\n dragHandleProps: {\n onPointerDown: handleHeaderPointerDown,\n style: { cursor: readOnly ? 'default' : isDragging ? 'grabbing' : 'grab' },\n },\n resizeHandleProps: {\n onPointerDown: handleResizePointerDown,\n style: { cursor: readOnly || isCompact ? 'default' : 'nwse-resize' },\n },\n onSelect: () => { if (!readOnly) onSelect(item.id) },\n onUpdate: (patch) => {\n if (!readOnly || (Object.keys(patch).length <= 2 && ('minimized' in patch || 'collapseState' in patch))) {\n onUpdate(item.id, patch)\n }\n },\n onDelete: () => { if (!readOnly) onDelete(item.id) },\n })}\n </div>\n )\n}\n\n","import React, { useEffect, useRef, useState } from 'react'\nimport { calculateZoomFontSize } from '../../shared/geo.js'\nimport type { TextOverlayProps } from './types.js'\nimport { clampTextPosition, getTextCursor } from './utils.js'\nimport { useTextDrag } from './use-text-drag.js'\nimport { TextOverlayView } from './TextOverlayView.js'\nimport { TextCustomRenderView } from './TextCustomRenderView.js'\n\nexport type { TextOverlayProps } from './types.js'\n\nexport const TextOverlay = React.memo(function TextOverlay({\n item,\n screenPos,\n isSelected,\n isEditingLabel,\n map,\n readOnly = false,\n labels,\n icons: _icons,\n unstyled = false,\n classNames,\n styles,\n clampToViewport = true,\n autoMinimizeZoomThreshold,\n renderText,\n onSelect,\n onUpdate,\n onDelete,\n onComplete,\n}: TextOverlayProps) {\n const [isEditing, setIsEditing] = useState(!readOnly && item.text === '')\n const [expandedLocally, setExpandedLocally] = useState(false)\n const inputRef = useRef<HTMLTextAreaElement | null>(null)\n\n const { isDragging, didDragRef, handlePointerDown } = useTextDrag({\n item,\n screenPos,\n map,\n readOnly,\n isEditing,\n onSelect,\n onUpdate,\n })\n\n const currentZoom = typeof map?.getZoom === 'function' ? map.getZoom() : null\n const lastZoomRef = useRef<number | null>(currentZoom)\n\n const initialSize = item.initialFontSize ?? (item as { fontSize?: number }).fontSize ?? 16\n const baseZoom = item.baseZoom ?? 14\n const dynamicFontSize = calculateZoomFontSize(initialSize, currentZoom, baseZoom)\n\n useEffect(() => {\n if (currentZoom !== null) {\n if (lastZoomRef.current !== null && lastZoomRef.current !== currentZoom) {\n setExpandedLocally(false)\n }\n lastZoomRef.current = currentZoom\n }\n }, [currentZoom])\n\n const isLowZoom =\n typeof autoMinimizeZoomThreshold === 'number' &&\n currentZoom !== null &&\n currentZoom < autoMinimizeZoomThreshold\n\n const isCompact = isLowZoom && !isSelected && !isEditing && !expandedLocally\n\n useEffect(() => {\n if (isSelected && isEditingLabel && !readOnly) {\n setIsEditing(true)\n }\n }, [isSelected, isEditingLabel, readOnly])\n\n useEffect(() => {\n if (isEditing && inputRef.current) {\n inputRef.current.focus()\n inputRef.current.select()\n }\n }, [isEditing])\n\n const cursor = getTextCursor(readOnly, isEditing, isDragging, isCompact)\n const dragHandleProps = {\n onPointerDown: handlePointerDown,\n style: { cursor } as React.CSSProperties,\n }\n\n const wrapperClassName = [\n 'rlc-text-wrapper',\n isCompact ? 'rlc-text-compact' : undefined,\n classNames?.textWrapper,\n isCompact ? classNames?.textCompact : undefined,\n !readOnly && isSelected ? classNames?.textWrapperSelected : undefined,\n ]\n .filter(Boolean)\n .join(' ')\n\n const { x: renderX, y: renderY } = clampTextPosition(\n map,\n screenPos,\n item,\n dynamicFontSize,\n isCompact,\n isDragging,\n clampToViewport,\n )\n\n const structuralWrapperStyle: React.CSSProperties = {\n position: 'absolute',\n left: `${renderX}px`,\n top: `${renderY}px`,\n transform: 'translate(-50%, -50%)',\n pointerEvents: 'auto',\n zIndex: !readOnly && isSelected ? 28 : 18,\n cursor,\n userSelect: readOnly || isEditing ? 'text' : 'none',\n }\n\n const handleClick = (e: React.MouseEvent) => {\n e.stopPropagation()\n if (didDragRef.current) {\n didDragRef.current = false\n return\n }\n if (isCompact) setExpandedLocally(true)\n if (!readOnly) onSelect(item.id)\n }\n\n const handleDoubleClick = (e: React.MouseEvent) => {\n e.stopPropagation()\n if (isCompact) setExpandedLocally(true)\n if (!readOnly) {\n onSelect(item.id)\n setIsEditing(true)\n }\n }\n\n if (renderText) {\n return (\n <TextCustomRenderView\n item={item}\n screenPos={screenPos}\n isSelected={isSelected}\n isEditing={isEditing}\n isDragging={isDragging}\n readOnly={readOnly}\n isCompact={isCompact}\n dynamicFontSize={dynamicFontSize}\n dragHandleProps={dragHandleProps}\n wrapperClassName={wrapperClassName}\n structuralWrapperStyle={structuralWrapperStyle}\n styles={styles}\n renderText={renderText}\n onClick={handleClick}\n onDoubleClick={handleDoubleClick}\n setIsEditing={(ed) => { if (!readOnly) setIsEditing(ed) }}\n onSelect={onSelect}\n onUpdate={onUpdate}\n onDelete={onDelete}\n />\n )\n }\n\n return (\n <div\n data-rlc-text={item.id}\n data-compact={isCompact ? 'true' : undefined}\n data-selected={(!readOnly && isSelected) || undefined}\n className={wrapperClassName}\n onPointerDown={handlePointerDown}\n onClick={handleClick}\n onDoubleClick={handleDoubleClick}\n onWheel={(e) => e.stopPropagation()}\n style={{\n ...structuralWrapperStyle,\n ...(unstyled ? {} : { fontFamily: 'Inter, system-ui, -apple-system, sans-serif' }),\n ...styles?.textWrapper,\n ...(isCompact ? styles?.textCompact : undefined),\n ...(!readOnly && isSelected ? styles?.textWrapperSelected : undefined),\n }}\n >\n <TextOverlayView\n item={item}\n map={map}\n isCompact={isCompact}\n isEditing={isEditing}\n isSelected={isSelected}\n readOnly={readOnly}\n unstyled={unstyled}\n dynamicFontSize={dynamicFontSize}\n labels={labels}\n classNames={classNames}\n styles={styles}\n inputRef={inputRef}\n setIsEditing={setIsEditing}\n onUpdate={onUpdate}\n onComplete={onComplete}\n />\n </div>\n )\n})\n","import type React from 'react'\nimport type L from 'leaflet'\nimport type { ScreenPoint, TextItem } from '../../types/index.js'\nimport { getMapDimensions } from '../../shared/geo.js'\n\nexport function clampTextPosition(\n map: L.Map,\n screenPos: ScreenPoint,\n item: TextItem,\n dynamicFontSize: number,\n isCompact: boolean,\n isDragging: boolean,\n clampToViewport = true,\n): ScreenPoint {\n const mapDims = clampToViewport !== false ? getMapDimensions(map) : null\n if (!mapDims || isDragging) return screenPos\n\n const isAnchorNearViewport =\n screenPos.x >= -100 &&\n screenPos.x <= mapDims.width + 100 &&\n screenPos.y >= -100 &&\n screenPos.y <= mapDims.height + 100\n\n if (!isAnchorNearViewport) return screenPos\n\n const approxHalfW = isCompact\n ? 35\n : Math.max(24, ((item.text || 'Text').length * dynamicFontSize) / 3.6)\n const approxHalfH = isCompact ? 11 : dynamicFontSize / 2 + 4\n const pad = 8\n\n const minX = approxHalfW + pad\n const maxX = Math.max(minX, mapDims.width - approxHalfW - pad)\n const minY = approxHalfH + pad\n const maxY = Math.max(minY, mapDims.height - approxHalfH - pad)\n\n return {\n x: Math.max(minX, Math.min(maxX, screenPos.x)),\n y: Math.max(minY, Math.min(maxY, screenPos.y)),\n }\n}\n\nexport function getTextCursor(\n readOnly: boolean,\n isEditing: boolean,\n isDragging: boolean,\n isCompact: boolean,\n): React.CSSProperties['cursor'] {\n if (readOnly) return isCompact ? 'pointer' : 'default'\n if (isEditing) return 'text'\n if (isDragging) return 'grabbing'\n return isCompact ? 'pointer' : 'grab'\n}\n\n","import { useRef, useState } from 'react'\nimport type React from 'react'\nimport type L from 'leaflet'\nimport type { ScreenPoint, TextItem } from '../../types/index.js'\nimport { screenToGeo } from '../../shared/geo.js'\n\nexport interface UseTextDragOptions {\n item: TextItem\n screenPos: ScreenPoint\n map: L.Map\n readOnly: boolean\n isEditing: boolean\n onSelect: (id: string) => void\n onUpdate: (id: string, patch: Partial<TextItem>) => void\n}\n\nexport function useTextDrag({\n item,\n screenPos,\n map,\n readOnly,\n isEditing,\n onSelect,\n onUpdate,\n}: UseTextDragOptions) {\n const [isDragging, setIsDragging] = useState(false)\n const dragOffsetRef = useRef({ dx: 0, dy: 0 })\n const didDragRef = useRef(false)\n const dragStartPosRef = useRef({ x: 0, y: 0 })\n\n const handlePointerDown = (e: React.PointerEvent<HTMLElement>) => {\n if (readOnly || isEditing || (e.target as HTMLElement).closest('button, textarea, input')) {\n return\n }\n e.stopPropagation()\n e.preventDefault()\n onSelect(item.id)\n setIsDragging(true)\n\n didDragRef.current = false\n dragStartPosRef.current = { x: e.clientX, y: e.clientY }\n\n const rect = map.getContainer().getBoundingClientRect()\n dragOffsetRef.current = {\n dx: e.clientX - rect.left - screenPos.x,\n dy: e.clientY - rect.top - screenPos.y,\n }\n map.dragging.disable()\n\n const handlePointerMove = (moveEvent: PointerEvent) => {\n if (Math.hypot(moveEvent.clientX - dragStartPosRef.current.x, moveEvent.clientY - dragStartPosRef.current.y) > 2) {\n didDragRef.current = true\n }\n const nextX = moveEvent.clientX - rect.left - dragOffsetRef.current.dx\n const nextY = moveEvent.clientY - rect.top - dragOffsetRef.current.dy\n onUpdate(item.id, { position: screenToGeo(map, { x: nextX, y: nextY }) })\n }\n\n const handlePointerUp = () => {\n setIsDragging(false)\n map.dragging.enable()\n window.removeEventListener('pointermove', handlePointerMove)\n window.removeEventListener('pointerup', handlePointerUp)\n }\n\n window.addEventListener('pointermove', handlePointerMove)\n window.addEventListener('pointerup', handlePointerUp)\n }\n\n return { isDragging, didDragRef, handlePointerDown }\n}\n\n","import type React from 'react'\nimport type L from 'leaflet'\nimport type {\n CanvasLabels,\n LeafletCanvasClassNames,\n LeafletCanvasStyles,\n TextItem,\n} from '../../types/index.js'\n\nexport interface TextOverlayViewProps {\n item: TextItem\n map: L.Map\n isCompact: boolean\n isEditing: boolean\n isSelected: boolean\n readOnly: boolean\n unstyled: boolean\n dynamicFontSize: number\n labels?: CanvasLabels\n classNames?: LeafletCanvasClassNames\n styles?: LeafletCanvasStyles\n inputRef: React.RefObject<HTMLTextAreaElement | null>\n setIsEditing: (editing: boolean) => void\n onUpdate: (id: string, patch: Partial<TextItem>) => void\n onComplete?: () => void\n}\n\nexport function TextOverlayView({\n item,\n map,\n isCompact,\n isEditing,\n isSelected,\n readOnly,\n unstyled,\n dynamicFontSize,\n labels,\n classNames,\n styles,\n inputRef,\n setIsEditing,\n onUpdate,\n onComplete,\n}: TextOverlayViewProps) {\n if (isCompact) {\n return (\n <div\n data-compact=\"true\"\n className={[\n 'rlc-text-display',\n 'rlc-text-compact-pill',\n classNames?.textDisplay,\n classNames?.textCompact,\n ]\n .filter(Boolean)\n .join(' ')}\n style={{\n ...(unstyled\n ? {}\n : {\n display: 'inline-flex',\n alignItems: 'center',\n height: '22px',\n padding: '0 8px',\n backgroundColor: item.backgroundColor ?? '#ffffff',\n color: item.color,\n border: `1px solid ${item.color ? `${item.color}40` : '#cbd5e1'}`,\n borderRadius: '9999px',\n fontSize: '11px',\n fontWeight: 600,\n lineHeight: 1,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n maxWidth: '120px',\n boxShadow: '0 1px 3px rgba(0, 0, 0, 0.12)',\n cursor: 'pointer',\n userSelect: 'none',\n }),\n ...styles?.textDisplay,\n ...styles?.textCompact,\n }}\n title={item.text || 'Text'}\n >\n {item.text || labels?.textEmptyFallback || 'Text'}\n </div>\n )\n }\n\n const finishEditing = () => {\n setIsEditing(false)\n if (!item.text.trim()) {\n onUpdate(item.id, { text: labels?.textEmptyFallback ?? 'Label' })\n }\n onComplete?.()\n }\n\n if (isEditing) {\n return (\n <textarea\n ref={inputRef}\n value={item.text}\n placeholder={labels?.textPlaceholder ?? 'Type text...'}\n aria-label={labels?.textPlaceholder ?? 'Map text annotation'}\n rows={Math.max(1, item.text.split('\\n').length)}\n className={['rlc-text-input', classNames?.textInput].filter(Boolean).join(' ')}\n onChange={(e) => onUpdate(item.id, { text: e.target.value })}\n onBlur={finishEditing}\n onKeyDown={(e) => {\n if (e.key === 'Escape' || (e.key === 'Enter' && !e.shiftKey)) {\n e.preventDefault()\n finishEditing()\n }\n }}\n onPointerDown={(e) => {\n e.stopPropagation()\n map.dragging.disable()\n const handleUp = () => {\n map.dragging.enable()\n window.removeEventListener('pointerup', handleUp)\n }\n window.addEventListener('pointerup', handleUp)\n }}\n onMouseDown={(e) => {\n e.stopPropagation()\n map.dragging.disable()\n const handleUp = () => {\n map.dragging.enable()\n window.removeEventListener('mouseup', handleUp)\n }\n window.addEventListener('mouseup', handleUp)\n }}\n style={{\n fontSize: `${dynamicFontSize}px`,\n fontWeight: item.fontWeight ?? 'bold',\n color: item.color,\n ...(unstyled\n ? {}\n : {\n minWidth: '80px',\n padding: '2px 4px',\n backgroundColor: '#ffffff',\n border: '1px solid #767676',\n borderRadius: '2px',\n outline: 'none',\n fontFamily: 'inherit',\n resize: 'both',\n lineHeight: 1.25,\n boxShadow: 'none',\n }),\n ...styles?.textInput,\n }}\n />\n )\n }\n\n return (\n <div\n className={['rlc-text-display', classNames?.textDisplay].filter(Boolean).join(' ')}\n style={{\n fontSize: `${dynamicFontSize}px`,\n fontWeight: item.fontWeight ?? 'bold',\n color: item.color,\n ...(unstyled\n ? {}\n : {\n padding: '2px 4px',\n backgroundColor: item.backgroundColor ?? '#ffffff',\n borderRadius: '2px',\n border: !readOnly && isSelected ? '1px dashed #767676' : '1px solid transparent',\n boxShadow: 'none',\n whiteSpace: 'pre-wrap',\n lineHeight: 1.25,\n }),\n ...styles?.textDisplay,\n }}\n >\n {item.text || (readOnly ? '' : (labels?.textEmptyFallback ?? 'Double-click to edit'))}\n </div>\n )\n}\n\n","import type React from 'react'\nimport type { RenderTextProps, ScreenPoint, TextItem } from '../../types/index.js'\n\nexport interface TextCustomRenderViewProps {\n item: TextItem\n screenPos: ScreenPoint\n isSelected: boolean\n isEditing: boolean\n isDragging: boolean\n readOnly: boolean\n isCompact: boolean\n dynamicFontSize: number\n dragHandleProps: { onPointerDown: (e: React.PointerEvent<HTMLElement>) => void; style: React.CSSProperties }\n wrapperClassName: string\n structuralWrapperStyle: React.CSSProperties\n styles?: { textWrapper?: React.CSSProperties; textCompact?: React.CSSProperties; textWrapperSelected?: React.CSSProperties }\n renderText: (props: RenderTextProps) => React.ReactNode\n onClick: (e: React.MouseEvent) => void\n onDoubleClick: (e: React.MouseEvent) => void\n setIsEditing: (editing: boolean) => void\n onSelect: (id: string) => void\n onUpdate: (id: string, patch: Partial<TextItem>) => void\n onDelete: (id: string) => void\n}\n\nexport function TextCustomRenderView({\n item,\n screenPos,\n isSelected,\n isEditing,\n isDragging,\n readOnly,\n isCompact,\n dynamicFontSize,\n dragHandleProps,\n wrapperClassName,\n structuralWrapperStyle,\n styles,\n renderText,\n onClick,\n onDoubleClick,\n setIsEditing,\n onSelect,\n onUpdate,\n onDelete,\n}: TextCustomRenderViewProps) {\n return (\n <div\n data-rlc-text={item.id}\n data-compact={isCompact ? 'true' : undefined}\n data-selected={(!readOnly && isSelected) || undefined}\n className={wrapperClassName}\n onClick={onClick}\n onDoubleClick={onDoubleClick}\n onWheel={(e) => e.stopPropagation()}\n style={{\n ...structuralWrapperStyle,\n ...styles?.textWrapper,\n ...(isCompact ? styles?.textCompact : undefined),\n ...(!readOnly && isSelected ? styles?.textWrapperSelected : undefined),\n }}\n >\n {renderText({\n item,\n screenPos,\n isSelected: !readOnly && isSelected,\n isEditing: !readOnly && isEditing,\n isDragging,\n readOnly,\n isCompact,\n dynamicFontSize,\n setIsEditing,\n dragHandleProps,\n onSelect: () => { if (!readOnly) onSelect(item.id) },\n onUpdate: (patch) => { if (!readOnly) onUpdate(item.id, patch) },\n onDelete: () => { if (!readOnly) onDelete(item.id) },\n })}\n </div>\n )\n}\n\n","import { useEffect, useState } from 'react'\nimport type L from 'leaflet'\nimport { bindLeafletSync } from '../../core/features/map-sync.js'\n\nexport interface MapViewportState {\n width: number\n height: number\n tick: number\n}\n\n/**\n * Synchronizes React state and canvas redraws with a Leaflet map's pan, zoom, and resize events.\n */\nexport function useLeafletSync(map: L.Map | null): MapViewportState {\n const [viewport, setViewport] = useState<MapViewportState>({\n width: 0,\n height: 0,\n tick: 0,\n })\n\n useEffect(() => {\n if (!map) return\n return bindLeafletSync(map, ({ width, height }) => {\n setViewport((prev) => ({\n width,\n height,\n tick: prev.tick + 1,\n }))\n })\n }, [map])\n\n return viewport\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport type {\n CanvasItem,\n CanvasTool,\n LeafletCanvasController,\n UseLeafletCanvasOptions,\n} from '../types/index.js'\nimport { useCanvasHistory } from './use-canvas-history.js'\nimport { useCanvasStyles } from './use-canvas-styles.js'\n\nexport function useLeafletCanvas(\n options: UseLeafletCanvasOptions = {},\n): LeafletCanvasController {\n const {\n items: controlledItems,\n initialTool = 'select',\n defaultColor,\n defaultStrokeWidth,\n defaultNoteColor,\n defaultFontSize,\n defaultShape,\n } = options\n\n const {\n items,\n history,\n historyRef,\n callbacksRef,\n commitItems,\n notifyChangeComplete,\n undo: rawUndo,\n redo: rawRedo,\n } = useCanvasHistory(options)\n\n const [activeToolState, setActiveToolState] = useState<CanvasTool>(initialTool)\n const [readOnly, setReadOnly] = useState<boolean>(Boolean(options.readOnly ?? false))\n const prevOptionReadOnly = useRef(options.readOnly)\n useEffect(() => {\n if (options.readOnly !== undefined && options.readOnly !== prevOptionReadOnly.current) {\n prevOptionReadOnly.current = options.readOnly\n setReadOnly(Boolean(options.readOnly))\n }\n }, [options.readOnly])\n\n const [selectedId, setSelectedIdState] = useState<string | null>(null)\n const [isEditingLabel, setIsEditingLabel] = useState<boolean>(false)\n\n const styles = useCanvasStyles({\n defaultColor,\n defaultStrokeWidth,\n defaultNoteColor,\n defaultFontSize,\n defaultShape,\n readOnly,\n selectedId,\n commitItems,\n })\n\n const setSelectedId = useCallback(\n (idOrUpdater: string | null | ((prev: string | null) => string | null)) => {\n setSelectedIdState((prev) => {\n const nextId = typeof idOrUpdater === 'function' ? idOrUpdater(prev) : idOrUpdater\n if (prev !== nextId) {\n setIsEditingLabel(false)\n if (prev !== null && nextId === null) notifyChangeComplete()\n const currentList = controlledItems ?? historyRef.current.present\n callbacksRef.current.onItemSelect?.(currentList.find((it) => it.id === nextId) ?? null)\n }\n return nextId\n })\n },\n [controlledItems, notifyChangeComplete, historyRef, callbacksRef],\n )\n\n const setActiveTool = useCallback(\n (tool: CanvasTool) => {\n if (readOnly && tool !== 'select') return\n setActiveToolState(tool)\n callbacksRef.current.onToolChange?.(tool)\n },\n [readOnly, callbacksRef],\n )\n\n const addItem = useCallback(\n (item: CanvasItem) => {\n if (readOnly) return\n commitItems((prev) => [...prev, item])\n setSelectedId(item.id)\n callbacksRef.current.onItemCreate?.(item)\n },\n [readOnly, commitItems, setSelectedId, callbacksRef],\n )\n\n const updateItem = useCallback(\n (id: string, patch: Partial<CanvasItem>) => {\n if (readOnly) {\n const patchKeys = Object.keys(patch)\n if (patchKeys.length !== 1 || patchKeys[0] !== 'minimized') return\n }\n let updated: CanvasItem | undefined\n commitItems((prev) =>\n prev.map((item) => {\n if (item.id === id) {\n updated = { ...item, ...patch } as CanvasItem\n return updated\n }\n return item\n }),\n )\n if (updated) callbacksRef.current.onItemChange?.(updated)\n },\n [readOnly, commitItems, callbacksRef],\n )\n\n const removeItem = useCallback(\n (id: string) => {\n if (readOnly) return\n commitItems((prev) => prev.filter((item) => item.id !== id))\n setSelectedId((prev) => (prev === id ? null : prev))\n callbacksRef.current.onItemDelete?.(id)\n notifyChangeComplete()\n },\n [readOnly, commitItems, setSelectedId, notifyChangeComplete, callbacksRef],\n )\n\n const deleteSelected = useCallback(() => {\n if (!readOnly && selectedId) removeItem(selectedId)\n }, [readOnly, selectedId, removeItem])\n\n const clearAll = useCallback(() => {\n if (readOnly) return\n commitItems(() => [])\n setSelectedId(null)\n notifyChangeComplete()\n }, [readOnly, commitItems, setSelectedId, notifyChangeComplete])\n\n const selectedItem = useMemo(\n () => items.find((item) => item.id === selectedId) ?? null,\n [items, selectedId],\n )\n\n const exportJSON = useCallback(() => JSON.stringify(items, null, 2), [items])\n\n const importJSON = useCallback(\n (json: string): boolean => {\n if (readOnly) return false\n try {\n const parsed = JSON.parse(json)\n if (!Array.isArray(parsed)) return false\n commitItems(() => parsed as CanvasItem[])\n setSelectedId(null)\n notifyChangeComplete()\n return true\n } catch {\n return false\n }\n },\n [readOnly, commitItems, setSelectedId, notifyChangeComplete],\n )\n\n return {\n items,\n activeTool: activeToolState,\n setActiveTool,\n readOnly,\n setReadOnly,\n ...styles,\n selectedId,\n setSelectedId,\n selectedItem,\n isEditingLabel,\n setEditingLabel: setIsEditingLabel,\n labelEditMode: isEditingLabel,\n setLabelEditMode: setIsEditingLabel,\n addItem,\n updateItem,\n removeItem,\n deleteSelected,\n clearAll,\n clear: clearAll,\n deleteItem: removeItem,\n setTool: setActiveTool,\n selectItem: setSelectedId,\n undo: useCallback(() => rawUndo(readOnly), [rawUndo, readOnly]),\n redo: useCallback(() => rawRedo(readOnly), [rawRedo, readOnly]),\n canUndo: !readOnly && history.past.length > 0,\n canRedo: !readOnly && history.future.length > 0,\n notifyChangeComplete,\n exportJSON,\n importJSON,\n }\n}\n\nexport const useLeafletTual = useLeafletCanvas\n\n","import { useCallback, useRef, useState } from 'react'\nimport type { CanvasItem, UseLeafletCanvasOptions } from '../types/index.js'\n\ninterface HistoryState {\n past: CanvasItem[][]\n present: CanvasItem[]\n future: CanvasItem[][]\n}\n\nexport function useCanvasHistory(options: UseLeafletCanvasOptions) {\n const { initialItems = [], items: controlledItems, maxHistory = 50 } = options\n const maxPast = Math.max(0, maxHistory - 1)\n\n const callbacksRef = useRef(options)\n callbacksRef.current = options\n\n const [history, setHistory] = useState<HistoryState>({\n past: [],\n present: initialItems,\n future: [],\n })\n const historyRef = useRef(history)\n historyRef.current = history\n\n const items = controlledItems ?? history.present\n const currentItemsRef = useRef<CanvasItem[]>(items)\n currentItemsRef.current = items\n\n // Items as of the last completed edit — the snapshot pushed into `past`.\n const committedItemsRef = useRef<CanvasItem[]>(items)\n\n const triggerChange = useCallback((next: CanvasItem[]) => {\n callbacksRef.current.onItemsChange?.(next)\n callbacksRef.current.onChange?.(next)\n }, [])\n\n const triggerChangeComplete = useCallback(\n (finalItems: CanvasItem[], targetItem?: CanvasItem | null) => {\n callbacksRef.current.onItemsChangeComplete?.(finalItems, targetItem)\n callbacksRef.current.onChangeComplete?.(finalItems, targetItem)\n callbacksRef.current.onEditEnd?.(finalItems, targetItem)\n callbacksRef.current.onEditComplete?.(finalItems, targetItem)\n if (targetItem) callbacksRef.current.onItemChangeComplete?.(targetItem)\n },\n [],\n )\n\n const commitItems = useCallback(\n (updater: (prev: CanvasItem[]) => CanvasItem[]) => {\n const next = updater(currentItemsRef.current)\n currentItemsRef.current = next\n triggerChange(next)\n setHistory((prev) => ({ ...prev, present: next }))\n return next\n },\n [triggerChange],\n )\n\n // Records one history snapshot per completed edit (drag, style tweak, add,\n // delete, import, ...) and then reports it. No-op when nothing changed since\n // the last completion.\n const notifyChangeComplete = useCallback(\n (targetItem?: CanvasItem | null) => {\n const current = currentItemsRef.current\n if (current === committedItemsRef.current) return\n const anchor = committedItemsRef.current\n committedItemsRef.current = current\n setHistory((prev) => ({\n past: [...prev.past, anchor].slice(-maxPast),\n present: current,\n future: [],\n }))\n triggerChangeComplete(current, targetItem)\n },\n [maxPast, triggerChangeComplete],\n )\n\n const undo = useCallback(\n (readOnly: boolean) => {\n if (readOnly) return\n setHistory((prev) => {\n if (prev.past.length === 0) return prev\n const restored = prev.past[prev.past.length - 1]\n currentItemsRef.current = restored\n committedItemsRef.current = restored\n triggerChange(restored)\n triggerChangeComplete(restored, null)\n return {\n past: prev.past.slice(0, -1),\n present: restored,\n future: [prev.present, ...prev.future],\n }\n })\n },\n [triggerChange, triggerChangeComplete],\n )\n\n const redo = useCallback(\n (readOnly: boolean) => {\n if (readOnly) return\n setHistory((prev) => {\n if (prev.future.length === 0) return prev\n const restored = prev.future[0]\n currentItemsRef.current = restored\n committedItemsRef.current = restored\n triggerChange(restored)\n triggerChangeComplete(restored, null)\n return {\n past: [...prev.past, prev.present],\n present: restored,\n future: prev.future.slice(1),\n }\n })\n },\n [triggerChange, triggerChangeComplete],\n )\n\n return {\n items,\n history,\n historyRef,\n callbacksRef,\n commitItems,\n notifyChangeComplete,\n undo,\n redo,\n }\n}\n","import { useCallback, useState } from 'react'\nimport type { CanvasItem, ShapeKind } from '../types/index.js'\nimport {\n DEFAULT_FONT_SIZE,\n DEFAULT_NOTE_BG,\n DEFAULT_STROKE_COLOR,\n DEFAULT_STROKE_WIDTH,\n NOTE_COLOR_THEMES,\n} from '../shared/constants.js'\n\nexport interface UseCanvasStylesOptions {\n defaultColor?: string\n defaultStrokeWidth?: number\n defaultNoteColor?: string\n defaultFontSize?: number\n defaultShape?: ShapeKind\n readOnly: boolean\n selectedId: string | null\n commitItems: (updater: (prev: CanvasItem[]) => CanvasItem[]) => CanvasItem[]\n}\n\nexport function useCanvasStyles(options: UseCanvasStylesOptions) {\n const {\n defaultColor = DEFAULT_STROKE_COLOR,\n defaultStrokeWidth = DEFAULT_STROKE_WIDTH,\n defaultNoteColor = DEFAULT_NOTE_BG,\n defaultFontSize = DEFAULT_FONT_SIZE,\n defaultShape = 'square',\n readOnly,\n selectedId,\n commitItems,\n } = options\n\n const [activeShape, setActiveShapeState] = useState<ShapeKind>(defaultShape)\n const [shapeFilled, setShapeFilledState] = useState<boolean>(true)\n const [activeColor, setActiveColorState] = useState<string>(defaultColor)\n const [strokeWidth, setStrokeWidthState] = useState<number>(defaultStrokeWidth)\n const [dashed, setDashedState] = useState<boolean>(false)\n const [noteColor, setNoteColorState] = useState<string>(defaultNoteColor)\n const [fontSize, setFontSizeState] = useState<number>(defaultFontSize)\n const [fontWeight, setFontWeightState] = useState<'normal' | 'bold'>('bold')\n\n const patchSelected = useCallback(\n (predicate: (it: CanvasItem) => boolean, patcher: (it: any) => any) => {\n if (!selectedId) return\n commitItems((prev) =>\n prev.map((it) => (it.id === selectedId && predicate(it) ? patcher(it) : it)),\n )\n },\n [selectedId, commitItems],\n )\n\n const setActiveShape = useCallback(\n (shape: ShapeKind) => {\n if (readOnly) return\n setActiveShapeState(shape)\n patchSelected((it) => it.type === 'shape', (it) => ({ ...it, shape }))\n },\n [readOnly, patchSelected],\n )\n\n const setShapeFilled = useCallback(\n (filled: boolean) => {\n if (readOnly) return\n setShapeFilledState(filled)\n patchSelected((it) => it.type === 'shape', (it) => ({ ...it, filled }))\n },\n [readOnly, patchSelected],\n )\n\n const setActiveColor = useCallback(\n (color: string) => {\n if (readOnly) return\n setActiveColorState(color)\n patchSelected((it) => it.type !== 'note', (it) => ({ ...it, color }))\n },\n [readOnly, patchSelected],\n )\n\n const setStrokeWidth = useCallback(\n (width: number) => {\n if (readOnly) return\n setStrokeWidthState(width)\n patchSelected(\n (it) =>\n it.type === 'arrow' ||\n it.type === 'freedraw' ||\n it.type === 'shape' ||\n it.type === 'ruler',\n (it) => ({ ...it, strokeWidth: width }),\n )\n },\n [readOnly, patchSelected],\n )\n\n const setDashed = useCallback(\n (nextDashed: boolean) => {\n if (readOnly) return\n setDashedState(nextDashed)\n patchSelected(\n (it) =>\n it.type === 'arrow' ||\n it.type === 'freedraw' ||\n it.type === 'shape' ||\n it.type === 'ruler',\n (it) => ({ ...it, dashed: nextDashed }),\n )\n },\n [readOnly, patchSelected],\n )\n\n const setNoteColor = useCallback(\n (bg: string) => {\n if (readOnly) return\n setNoteColorState(bg)\n const theme = NOTE_COLOR_THEMES.find((t) => t.bg === bg)\n patchSelected(\n (it) => it.type === 'note',\n (it) => ({ ...it, backgroundColor: bg, textColor: theme?.text ?? it.textColor }),\n )\n },\n [readOnly, patchSelected],\n )\n\n const setFontSize = useCallback(\n (size: number) => {\n if (readOnly) return\n setFontSizeState(size)\n patchSelected((it) => it.type === 'text', (it) => ({ ...it, initialFontSize: size }))\n },\n [readOnly, patchSelected],\n )\n\n const setFontWeight = useCallback(\n (weight: 'normal' | 'bold') => {\n if (readOnly) return\n setFontWeightState(weight)\n patchSelected((it) => it.type === 'text', (it) => ({ ...it, fontWeight: weight }))\n },\n [readOnly, patchSelected],\n )\n\n return {\n activeShape,\n setActiveShape,\n shapeFilled,\n setShapeFilled,\n activeColor,\n setActiveColor,\n strokeWidth,\n setStrokeWidth,\n dashed,\n setDashed,\n noteColor,\n setNoteColor,\n fontSize,\n setFontSize,\n fontWeight,\n setFontWeight,\n }\n}\n\n","'use client'\n\nimport { useState } from 'react'\nimport type { ArrowItem, ShapeItem, TextItem } from '../../types/index.js'\nimport { STROKE_COLORS } from '../../shared/constants.js'\nimport { DEFAULT_ENABLED_TOOLS, POSITION_STYLES } from './constants.js'\nimport { DEFAULT_ICONS } from './icons.js'\nimport type { CanvasToolbarProps } from './types.js'\nimport {\n buildArrowOptions,\n buildShapeOptions,\n getActiveToolInfo,\n getToolbarButtonClassName,\n getToolbarButtonStyle,\n getToolbarContainerStyle,\n} from './toolbar-helpers.js'\nimport { ExpandTriggerButton } from './CollapseButtons.js'\nimport { PrimaryToolbarStrip } from './PrimaryToolbarStrip.js'\nimport { ContextualSettingsBar } from './ContextualSettingsBar.js'\nimport { useToolbarContext } from './use-toolbar-context.js'\n\nexport function CanvasToolbar({\n controller,\n position = 'top-center',\n orientation: propOrientation,\n collapsible = true,\n defaultCollapsed = false,\n collapsed: propCollapsed,\n onCollapsedChange,\n showCollapseButton = true,\n readOnly: propReadOnly,\n enabledTools = DEFAULT_ENABLED_TOOLS,\n customTools,\n showHistoryControls = true,\n showDeleteButton = true,\n showClearButton = true,\n showToolLabels: explicitShowToolLabels,\n labels,\n icons,\n unstyled = false,\n classNames,\n styles,\n strokeColors = STROKE_COLORS,\n strokeWidthOptions,\n fontSizeOptions,\n className,\n style,\n}: CanvasToolbarProps) {\n const readOnly = Boolean(propReadOnly ?? controller.readOnly)\n const isVerticalPosition = position === 'left' || position === 'right' || position === 'left-center' || position === 'right-center'\n const orientation = propOrientation ?? (isVerticalPosition ? 'vertical' : 'horizontal')\n const isVertical = orientation === 'vertical'\n const showToolLabels = explicitShowToolLabels ?? !isVertical\n\n const [internalCollapsed, setInternalCollapsed] = useState(defaultCollapsed)\n const isCollapsed = propCollapsed !== undefined ? propCollapsed : internalCollapsed\n const handleToggleCollapse = (next: boolean) => {\n if (propCollapsed === undefined) setInternalCollapsed(next)\n onCollapsedChange?.(next)\n }\n\n const { activeTool, activeShape, selectedItem } = controller\n\n const {\n isArrowToolActive,\n isShapeToolActive,\n isArrowContext,\n isFreeDrawContext,\n isShapeContext,\n isRulerContext,\n isNoteContext,\n isTextContext,\n showSettingsBar,\n arrowDropdownOpen,\n setArrowDropdownOpen,\n shapesModalOpen,\n setShapesModalOpen,\n arrowGroupRef,\n shapesGroupRef,\n } = useToolbarContext(controller, readOnly)\n\n const arrowOptions = buildArrowOptions(labels, icons)\n const shapeOptions = buildShapeOptions(labels, icons)\n\n const activeArrowDef = arrowOptions.find((a) => a.id === activeTool)\n const arrowGroupLabel = labels?.arrowGroup ?? (activeArrowDef ? activeArrowDef.label : 'Arrows')\n const currentArrowIcon = icons?.arrowGroup ?? (activeArrowDef ? activeArrowDef.icon : DEFAULT_ICONS.arrowLinear)\n\n const activeShapeDef = shapeOptions.find((s) => s.kind === activeShape)\n const shapesGroupLabel = labels?.shapesGroup ?? (isShapeToolActive && activeShapeDef ? activeShapeDef.label : 'Shapes')\n const currentShapeIcon = icons?.shapesGroup ?? (isShapeToolActive && activeShapeDef ? activeShapeDef.icon : DEFAULT_ICONS.shapesGroup)\n\n const activeToolInfo = getActiveToolInfo(\n activeTool,\n isArrowToolActive,\n currentArrowIcon,\n arrowGroupLabel,\n currentShapeIcon,\n shapesGroupLabel,\n icons,\n labels,\n )\n\n const stopEvent = (e: React.SyntheticEvent) => e.stopPropagation()\n\n if (isCollapsed) {\n return (\n <div\n data-rlc-toolbar\n data-readonly={readOnly || undefined}\n data-position={position}\n data-orientation={orientation}\n data-collapsed=\"true\"\n className={['rlc-toolbar', 'rlc-toolbar-collapsed', readOnly ? 'rlc-toolbar-readonly' : undefined, classNames?.toolbar, classNames?.toolbarCollapsed, className].filter(Boolean).join(' ')}\n onClick={stopEvent}\n onDoubleClick={stopEvent}\n onPointerDown={stopEvent}\n onWheel={stopEvent}\n style={{ position: 'absolute', zIndex: 1000, pointerEvents: 'auto', userSelect: 'none', ...POSITION_STYLES[position], ...styles?.toolbar, ...styles?.toolbarCollapsed, ...style }}\n >\n <ExpandTriggerButton position={position} orientation={orientation} showToolLabels={showToolLabels} unstyled={unstyled} activeToolInfo={activeToolInfo} labels={labels} icons={icons} classNames={classNames} styles={styles} onExpand={() => handleToggleCollapse(false)} />\n </div>\n )\n }\n\n return (\n <div\n data-rlc-toolbar\n data-readonly={readOnly || undefined}\n data-position={position}\n data-orientation={orientation}\n className={['rlc-toolbar', readOnly ? 'rlc-toolbar-readonly' : undefined, classNames?.toolbar, className].filter(Boolean).join(' ')}\n onClick={stopEvent}\n onDoubleClick={stopEvent}\n onPointerDown={stopEvent}\n onWheel={stopEvent}\n style={{\n position: 'absolute',\n zIndex: 1000,\n pointerEvents: 'auto',\n userSelect: 'none',\n ...POSITION_STYLES[position],\n ...getToolbarContainerStyle(position, isVertical, unstyled),\n ...styles?.toolbar,\n ...style,\n }}\n >\n <PrimaryToolbarStrip\n controller={controller}\n readOnly={readOnly}\n position={position}\n orientation={orientation}\n isVertical={isVertical}\n showToolLabels={showToolLabels}\n collapsible={collapsible}\n showCollapseButton={showCollapseButton}\n enabledTools={enabledTools}\n customTools={customTools}\n showHistoryControls={showHistoryControls}\n showDeleteButton={showDeleteButton}\n showClearButton={showClearButton}\n labels={labels}\n icons={icons}\n unstyled={unstyled}\n classNames={classNames}\n styles={styles}\n arrowOptions={arrowOptions}\n shapeOptions={shapeOptions}\n arrowGroupLabel={arrowGroupLabel}\n currentArrowIcon={currentArrowIcon}\n shapesGroupLabel={shapesGroupLabel}\n currentShapeIcon={currentShapeIcon}\n isArrowToolActive={isArrowToolActive}\n isShapeToolActive={isShapeToolActive}\n arrowDropdownOpen={arrowDropdownOpen}\n shapesModalOpen={shapesModalOpen}\n arrowGroupRef={arrowGroupRef}\n shapesGroupRef={shapesGroupRef}\n setArrowDropdownOpen={setArrowDropdownOpen}\n setShapesModalOpen={setShapesModalOpen}\n getButtonClassName={(active) => getToolbarButtonClassName(active, classNames)}\n getButtonStyle={(active) => getToolbarButtonStyle(active, isVertical, showToolLabels, readOnly, unstyled, styles)}\n onCollapse={() => handleToggleCollapse(true)}\n />\n\n {showSettingsBar && (\n <ContextualSettingsBar\n isArrowContext={isArrowContext}\n isFreeDrawContext={isFreeDrawContext}\n isShapeContext={isShapeContext}\n isRulerContext={isRulerContext}\n isTextContext={isTextContext}\n isNoteContext={isNoteContext}\n selectedItem={selectedItem}\n selectedShape={selectedItem?.type === 'shape' ? (selectedItem as ShapeItem) : null}\n selectedArrow={selectedItem?.type === 'arrow' ? (selectedItem as ArrowItem) : null}\n selectedText={selectedItem?.type === 'text' ? (selectedItem as TextItem) : null}\n activeColor={controller.activeColor} setActiveColor={controller.setActiveColor}\n strokeWidth={controller.strokeWidth} setStrokeWidth={controller.setStrokeWidth}\n strokeWidthOptions={strokeWidthOptions}\n dashed={controller.dashed} setDashed={controller.setDashed}\n shapeFilled={controller.shapeFilled} setShapeFilled={controller.setShapeFilled}\n noteColor={controller.noteColor} setNoteColor={controller.setNoteColor}\n fontSize={controller.fontSize} setFontSize={controller.setFontSize}\n fontSizeOptions={fontSizeOptions}\n fontWeight={controller.fontWeight} setFontWeight={controller.setFontWeight}\n updateItem={controller.updateItem}\n notifyChangeComplete={controller.notifyChangeComplete}\n isEditingLabel={controller.isEditingLabel}\n setEditingLabel={controller.setEditingLabel}\n strokeColors={strokeColors}\n orientation={orientation}\n labels={labels}\n icons={icons}\n unstyled={unstyled}\n classNames={classNames}\n styles={styles}\n />\n )}\n </div>\n )\n}\n","import type React from 'react'\nimport type { ToolbarPosition, ToolbarToolGroupId } from '../../types/index.js'\n\nexport const DEFAULT_ENABLED_TOOLS: readonly ToolbarToolGroupId[] = [\n 'select',\n 'freedraw',\n 'arrow',\n 'shape',\n 'ruler',\n 'note',\n 'text',\n]\n\nexport const POSITION_STYLES: Record<ToolbarPosition, React.CSSProperties> = {\n top: {\n top: '14px',\n left: '50%',\n transform: 'translateX(-50%)',\n },\n bottom: {\n bottom: '24px',\n left: '50%',\n transform: 'translateX(-50%)',\n },\n left: {\n top: '50%',\n left: '14px',\n transform: 'translateY(-50%)',\n },\n right: {\n top: '50%',\n right: '14px',\n transform: 'translateY(-50%)',\n },\n 'top-center': {\n top: '14px',\n left: '50%',\n transform: 'translateX(-50%)',\n },\n 'bottom-center': {\n bottom: '24px',\n left: '50%',\n transform: 'translateX(-50%)',\n },\n 'left-center': {\n top: '50%',\n left: '14px',\n transform: 'translateY(-50%)',\n },\n 'right-center': {\n top: '50%',\n right: '14px',\n transform: 'translateY(-50%)',\n },\n}\n","import type React from 'react'\nimport type {\n CanvasIcons,\n CanvasLabels,\n LeafletCanvasClassNames,\n LeafletCanvasStyles,\n ToolbarOrientation,\n ToolbarPosition,\n} from '../../types/index.js'\nimport { DEFAULT_ICONS } from './icons.js'\nimport type { ArrowOption, ShapeOption } from './types.js'\n\nexport function buildArrowOptions(labels?: CanvasLabels, icons?: CanvasIcons): readonly ArrowOption[] {\n return [\n {\n id: 'arrow-linear',\n style: 'linear',\n label: labels?.arrowLinear ?? 'Linear Arrow',\n shortcut: 'A',\n icon: icons?.arrowLinear ?? DEFAULT_ICONS.arrowLinear,\n },\n {\n id: 'arrow-curved',\n style: 'curved',\n label: labels?.arrowCurved ?? 'Curved Arrow',\n shortcut: 'C',\n icon: icons?.arrowCurved ?? DEFAULT_ICONS.arrowCurved,\n },\n {\n id: 'arrow-bi',\n style: 'bi',\n label: labels?.arrowBi ?? 'Double-Headed',\n shortcut: 'B',\n icon: icons?.arrowBi ?? DEFAULT_ICONS.arrowBi,\n },\n {\n id: 'arrow-elbow',\n style: 'elbow',\n label: labels?.arrowElbow ?? 'Elbow / Step',\n shortcut: 'E',\n icon: icons?.arrowElbow ?? DEFAULT_ICONS.arrowElbow,\n },\n {\n id: 'arrow-s-curve',\n style: 's-curve',\n label: labels?.arrowSCurve ?? 'S-Curve Arrow',\n shortcut: 'S',\n icon: icons?.arrowSCurve ?? DEFAULT_ICONS.arrowSCurve,\n },\n ]\n}\n\nexport function buildShapeOptions(labels?: CanvasLabels, icons?: CanvasIcons): readonly ShapeOption[] {\n return [\n { kind: 'square', label: labels?.shapeSquare ?? 'Square', icon: icons?.shapeSquare ?? DEFAULT_ICONS.shapeSquare },\n { kind: 'circle', label: labels?.shapeCircle ?? 'Circle', icon: icons?.shapeCircle ?? DEFAULT_ICONS.shapeCircle },\n { kind: 'star', label: labels?.shapeStar ?? 'Star', icon: icons?.shapeStar ?? DEFAULT_ICONS.shapeStar },\n { kind: 'actor', label: labels?.shapeActor ?? 'Actor', icon: icons?.shapeActor ?? DEFAULT_ICONS.shapeActor },\n { kind: 'triangle', label: labels?.shapeTriangle ?? 'Triangle', icon: icons?.shapeTriangle ?? DEFAULT_ICONS.shapeTriangle },\n { kind: 'diamond', label: labels?.shapeDiamond ?? 'Diamond', icon: icons?.shapeDiamond ?? DEFAULT_ICONS.shapeDiamond },\n { kind: 'hexagon', label: labels?.shapeHexagon ?? 'Hexagon', icon: icons?.shapeHexagon ?? DEFAULT_ICONS.shapeHexagon },\n { kind: 'marker', label: labels?.shapeMarker ?? 'Marker', icon: icons?.shapeMarker ?? DEFAULT_ICONS.shapeMarker },\n ]\n}\n\nexport function getToolbarButtonStyle(\n isActive: boolean,\n isVertical: boolean,\n showToolLabels: boolean,\n readOnly: boolean,\n unstyled: boolean,\n styles?: LeafletCanvasStyles,\n): React.CSSProperties {\n const baseStyle: React.CSSProperties = unstyled\n ? {}\n : isVertical && showToolLabels\n ? {\n display: 'grid',\n gridTemplateColumns: '20px 1fr auto',\n alignItems: 'center',\n columnGap: '10px',\n padding: '8px 12px',\n textAlign: 'left',\n width: '100%',\n height: 'auto',\n borderRadius: '2px',\n border: isActive ? '1px solid #4f4f4f' : '1px solid #767676',\n boxSizing: 'border-box',\n backgroundColor: isActive ? '#e0e0e0' : '#efefef',\n color: '#000000',\n fontWeight: 'normal',\n fontSize: '12px',\n lineHeight: '16px',\n cursor: 'pointer',\n boxShadow: isActive ? 'inset 1px 1px 2px rgba(0, 0, 0, 0.2)' : 'none',\n flexShrink: 0,\n whiteSpace: 'nowrap',\n }\n : {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n position: 'relative',\n gap: showToolLabels ? '6px' : '0px',\n padding: isVertical ? '0' : showToolLabels ? '2px 7px' : '3px 6px',\n width: isVertical ? '30px' : 'auto',\n height: isVertical ? '30px' : 'auto',\n minWidth: isVertical ? '30px' : undefined,\n minHeight: isVertical ? '30px' : undefined,\n borderRadius: '2px',\n border: isActive ? '1px solid #4f4f4f' : '1px solid #767676',\n boxSizing: 'border-box',\n backgroundColor: isActive ? '#e0e0e0' : '#efefef',\n color: '#000000',\n fontWeight: 'normal',\n fontSize: '12px',\n lineHeight: '16px',\n cursor: 'pointer',\n boxShadow: isActive ? 'inset 1px 1px 2px rgba(0, 0, 0, 0.2)' : 'none',\n flexShrink: 0,\n whiteSpace: 'nowrap',\n }\n\n return {\n ...baseStyle,\n ...styles?.toolButton,\n ...(isActive ? styles?.toolButtonActive : undefined),\n ...(isVertical && !showToolLabels\n ? {\n padding: '0',\n width: styles?.toolButton?.width ?? '30px',\n height: styles?.toolButton?.height ?? '30px',\n }\n : undefined),\n ...(readOnly && !isActive ? { opacity: 0.45, cursor: 'not-allowed' } : undefined),\n }\n}\n\nexport function getToolbarButtonClassName(\n isActive: boolean,\n classNames?: LeafletCanvasClassNames,\n): string {\n return ['rlc-tool-btn', classNames?.toolButton, isActive ? classNames?.toolButtonActive : undefined]\n .filter(Boolean)\n .join(' ')\n}\n\nexport function getPopupPlacementStyle(\n position: ToolbarPosition,\n orientation: ToolbarOrientation,\n centerHorizontally = false,\n): React.CSSProperties {\n const isVertical = orientation === 'vertical'\n const isRight = position.includes('right')\n const isLeft = position.includes('left')\n const isBottom = position.includes('bottom')\n\n if (isVertical) {\n return {\n ...(isBottom ? { bottom: 0 } : { top: 0 }),\n ...(isRight ? { right: 'calc(100% + 8px)' } : { left: 'calc(100% + 8px)' }),\n }\n }\n\n return {\n ...(isRight\n ? { right: 0 }\n : isLeft || !centerHorizontally\n ? { left: 0 }\n : { left: '50%', transform: 'translateX(-50%)' }),\n ...(isBottom ? { bottom: 'calc(100% + 8px)' } : { top: 'calc(100% + 8px)' }),\n }\n}\n\nexport function getToolbarContainerStyle(\n position: ToolbarPosition,\n isVertical: boolean,\n unstyled: boolean,\n): React.CSSProperties {\n if (unstyled) return {}\n return isVertical\n ? {\n display: 'flex',\n flexDirection: position === 'right' || position === 'right-center' ? 'row-reverse' : 'row',\n alignItems: 'flex-start',\n gap: '8px',\n fontFamily: 'Inter, system-ui, -apple-system, sans-serif',\n }\n : {\n display: 'flex',\n flexDirection: position === 'bottom' || position === 'bottom-center' ? 'column-reverse' : 'column',\n alignItems: 'center',\n gap: '8px',\n fontFamily: 'Inter, system-ui, -apple-system, sans-serif',\n }\n}\n\nexport function getActiveToolInfo(\n activeTool: string,\n isArrowToolActive: boolean,\n currentArrowIcon: React.ReactNode,\n arrowGroupLabel: string,\n currentShapeIcon: React.ReactNode,\n shapesGroupLabel: string,\n icons?: CanvasIcons,\n labels?: CanvasLabels,\n): { icon: React.ReactNode; label: string } {\n if (activeTool === 'select') return { icon: icons?.select ?? DEFAULT_ICONS.select, label: labels?.select ?? 'Select' }\n if (activeTool === 'freedraw') return { icon: icons?.freedraw ?? DEFAULT_ICONS.freedraw, label: labels?.freedraw ?? 'Free Draw' }\n if (activeTool === 'ruler') return { icon: icons?.ruler ?? DEFAULT_ICONS.ruler, label: labels?.ruler ?? 'Ruler' }\n if (isArrowToolActive) return { icon: currentArrowIcon, label: arrowGroupLabel }\n if (activeTool === 'shape') return { icon: currentShapeIcon, label: shapesGroupLabel }\n if (activeTool === 'note') return { icon: icons?.note ?? DEFAULT_ICONS.note, label: labels?.note ?? 'Note Card' }\n if (activeTool === 'text') return { icon: icons?.text ?? DEFAULT_ICONS.text, label: labels?.text ?? 'Normal Text' }\n return { icon: icons?.shapesGroup ?? DEFAULT_ICONS.shapesGroup, label: 'Tools' }\n}\n\n","import type React from 'react'\nimport type {\n ArrowStyle,\n CanvasIcons,\n CanvasLabels,\n CustomToolbarItem,\n LeafletCanvasClassNames,\n LeafletCanvasController,\n LeafletCanvasStyles,\n ShapeKind,\n ToolbarOrientation,\n ToolbarPosition,\n ToolbarToolGroupId,\n} from '../../types/index.js'\n\nexport interface CanvasToolbarProps {\n controller: LeafletCanvasController\n position?: ToolbarPosition\n orientation?: ToolbarOrientation\n collapsible?: boolean\n defaultCollapsed?: boolean\n collapsed?: boolean\n onCollapsedChange?: (collapsed: boolean) => void\n showCollapseButton?: boolean\n readOnly?: boolean\n enabledTools?: readonly ToolbarToolGroupId[]\n customTools?: readonly CustomToolbarItem[]\n showHistoryControls?: boolean\n showDeleteButton?: boolean\n showClearButton?: boolean\n showToolLabels?: boolean\n labels?: CanvasLabels\n icons?: CanvasIcons\n unstyled?: boolean\n classNames?: LeafletCanvasClassNames\n styles?: LeafletCanvasStyles\n strokeColors?: readonly string[]\n strokeWidthOptions?: readonly number[]\n fontSizeOptions?: readonly number[]\n className?: string\n style?: React.CSSProperties\n}\n\nexport const ARROW_TOOL_IDS = [\n 'arrow-linear',\n 'arrow-curved',\n 'arrow-bi',\n 'arrow-elbow',\n 'arrow-s-curve',\n] as const\n\nexport type ArrowToolId = (typeof ARROW_TOOL_IDS)[number]\n\nexport interface ArrowOption {\n id: ArrowToolId\n style: ArrowStyle\n label: string\n shortcut: string\n icon: React.ReactNode\n}\n\nexport interface ShapeOption {\n kind: ShapeKind\n label: string\n icon: React.ReactNode\n}\n","import type { ToolbarOrientation, ToolbarPosition } from '../../types/index.js'\nimport { ARROW_TOOL_IDS, type ArrowToolId } from './types.js'\n\nexport function isArrowTool(tool: string): tool is ArrowToolId {\n return (ARROW_TOOL_IDS as readonly string[]).includes(tool)\n}\n\n/**\n * Returns rotation transform for dropdown indicator chevron (base shape: points down `v`).\n * When closed: points towards the opening direction.\n * When open: flips 180 degrees.\n */\nexport function getDropdownChevronRotation(\n isOpen: boolean,\n position: ToolbarPosition = 'top-center',\n orientation: ToolbarOrientation = 'horizontal',\n): string {\n if (orientation === 'vertical') {\n const isRight = position === 'right' || position === 'right-center'\n if (isRight) {\n // Menu opens to the left\n return isOpen ? 'rotate(-90deg)' : 'rotate(90deg)'\n }\n // Menu opens to the right\n return isOpen ? 'rotate(90deg)' : 'rotate(-90deg)'\n }\n\n const isBottom = position === 'bottom' || position === 'bottom-center'\n if (isBottom) {\n // Menu opens upwards\n return isOpen ? 'rotate(0deg)' : 'rotate(180deg)'\n }\n // Menu opens downwards\n return isOpen ? 'rotate(180deg)' : 'rotate(0deg)'\n}\n\n/**\n * Returns rotation transform for collapse button chevron (base shape: points up `^`).\n * Points towards the screen edge the toolbar collapses into.\n */\nexport function getCollapseChevronRotation(\n position: ToolbarPosition = 'top-center',\n orientation: ToolbarOrientation = 'horizontal',\n): string {\n if (orientation === 'vertical') {\n const isRight = position === 'right' || position === 'right-center'\n return isRight ? 'rotate(90deg)' : 'rotate(-90deg)'\n }\n\n const isBottom = position === 'bottom' || position === 'bottom-center'\n return isBottom ? 'rotate(180deg)' : 'rotate(0deg)'\n}\n\n/**\n * Returns rotation transform for expand button chevron (base shape: points down `v`).\n * Points towards the map interior where the toolbar will expand into.\n */\nexport function getExpandChevronRotation(\n position: ToolbarPosition = 'top-center',\n orientation: ToolbarOrientation = 'horizontal',\n): string {\n if (orientation === 'vertical') {\n const isRight = position === 'right' || position === 'right-center'\n return isRight ? 'rotate(90deg)' : 'rotate(-90deg)'\n }\n\n const isBottom = position === 'bottom' || position === 'bottom-center'\n return isBottom ? 'rotate(180deg)' : 'rotate(0deg)'\n}\n","import type React from 'react'\nimport type {\n CanvasIcons,\n CanvasLabels,\n LeafletCanvasClassNames,\n LeafletCanvasStyles,\n ToolbarOrientation,\n ToolbarPosition,\n} from '../../types/index.js'\nimport { DEFAULT_ICONS } from './icons.js'\nimport { getCollapseChevronRotation, getExpandChevronRotation } from './utils.js'\n\nexport interface CollapseTriggerButtonProps {\n position: ToolbarPosition\n orientation: ToolbarOrientation\n isVertical: boolean\n showToolLabels: boolean\n unstyled: boolean\n labels?: CanvasLabels\n icons?: CanvasIcons\n classNames?: LeafletCanvasClassNames\n styles?: LeafletCanvasStyles\n onCollapse: () => void\n}\n\nexport function CollapseTriggerButton({\n position,\n orientation,\n isVertical,\n showToolLabels,\n unstyled,\n labels,\n icons,\n classNames,\n styles,\n onCollapse,\n}: CollapseTriggerButtonProps) {\n const rotation = getCollapseChevronRotation(position, orientation)\n const icon = icons?.collapseToolbar ?? DEFAULT_ICONS.collapseToolbar\n\n return (\n <button\n type=\"button\"\n aria-label={labels?.collapseToolbar ?? 'Collapse toolbar'}\n title={labels?.collapseToolbar ?? 'Collapse toolbar'}\n data-toolbar-collapse=\"true\"\n className={['rlc-toolbar-collapse-btn', classNames?.toolbarCollapseButton].filter(Boolean).join(' ')}\n onClick={onCollapse}\n style={{\n ...(unstyled\n ? {}\n : isVertical && showToolLabels\n ? {\n display: 'grid',\n gridTemplateColumns: '20px 1fr auto',\n alignItems: 'center',\n columnGap: '10px',\n padding: '8px 12px',\n textAlign: 'left',\n width: '100%',\n height: 'auto',\n borderRadius: '2px',\n border: '1px solid #767676',\n boxSizing: 'border-box',\n backgroundColor: '#efefef',\n color: '#000000',\n cursor: 'pointer',\n boxShadow: 'none',\n flexShrink: 0,\n whiteSpace: 'nowrap',\n }\n : {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: isVertical ? '0' : showToolLabels ? '2px 6px' : '3px 6px',\n width: isVertical ? '30px' : 'auto',\n height: isVertical ? '30px' : 'auto',\n borderRadius: '2px',\n border: '1px solid #767676',\n boxSizing: 'border-box',\n backgroundColor: '#efefef',\n color: '#000000',\n cursor: 'pointer',\n boxShadow: 'none',\n flexShrink: 0,\n }),\n ...styles?.toolButton,\n ...styles?.toolbarCollapseButton,\n }}\n >\n {isVertical && showToolLabels ? (\n <>\n <span style={{ display: 'inline-flex', alignItems: 'center', justifyContent: 'center', width: '20px' }}>\n <span style={{ display: 'inline-flex', alignItems: 'center', justifyContent: 'center', transform: rotation, transition: 'transform 0.15s ease' }}>\n {icon}\n </span>\n </span>\n <span style={{ whiteSpace: 'nowrap' }}>{labels?.collapseToolbar ?? 'Collapse'}</span>\n <span />\n </>\n ) : (\n <span style={{ display: 'inline-flex', alignItems: 'center', justifyContent: 'center', transform: rotation, transition: 'transform 0.15s ease' }}>\n {icon}\n </span>\n )}\n </button>\n )\n}\n\nexport interface ExpandTriggerButtonProps {\n position: ToolbarPosition\n orientation: ToolbarOrientation\n showToolLabels: boolean\n unstyled: boolean\n activeToolInfo: { icon: React.ReactNode; label: string }\n labels?: CanvasLabels\n icons?: CanvasIcons\n classNames?: LeafletCanvasClassNames\n styles?: LeafletCanvasStyles\n onExpand: () => void\n}\n\nexport function ExpandTriggerButton({\n position,\n orientation,\n showToolLabels,\n unstyled,\n activeToolInfo,\n labels,\n icons,\n classNames,\n styles,\n onExpand,\n}: ExpandTriggerButtonProps) {\n return (\n <button\n type=\"button\"\n aria-label={labels?.expandToolbar ?? 'Expand toolbar'}\n title={labels?.expandToolbar ?? 'Expand toolbar'}\n data-toolbar-expand=\"true\"\n className={['rlc-toolbar-expand-btn', classNames?.toolbarCollapseButton].filter(Boolean).join(' ')}\n onClick={onExpand}\n style={{\n ...(unstyled\n ? {}\n : {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '4px',\n padding: '3px 7px',\n borderRadius: '2px',\n backgroundColor: '#efefef',\n border: '1px solid #767676',\n boxShadow: '0 1px 2px rgba(0, 0, 0, 0.15)',\n color: '#000000',\n cursor: 'pointer',\n fontSize: '12px',\n fontWeight: 'normal',\n boxSizing: 'border-box',\n }),\n ...styles?.toolbarCollapseButton,\n }}\n >\n {activeToolInfo.icon}\n {showToolLabels && <span>{activeToolInfo.label}</span>}\n <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n opacity: 0.8,\n transform: getExpandChevronRotation(position, orientation),\n transition: 'transform 0.15s ease',\n }}\n >\n {icons?.expandToolbar ?? DEFAULT_ICONS.expandToolbar}\n </span>\n </button>\n )\n}\n\n","import type React from 'react'\nimport type { LeafletCanvasStyles } from '../../types/index.js'\n\nexport function getHistoryBtnStyle(\n enabled: boolean,\n isVertical: boolean,\n showToolLabels: boolean,\n unstyled: boolean,\n styles?: LeafletCanvasStyles,\n): React.CSSProperties {\n const base: React.CSSProperties = unstyled\n ? {}\n : isVertical && showToolLabels\n ? {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '6px',\n padding: '8px 10px',\n flexGrow: 1,\n flexShrink: 0,\n flexBasis: 0,\n width: 'auto',\n height: 'auto',\n minHeight: '28px',\n borderRadius: '2px',\n border: '1px solid #767676',\n boxSizing: 'border-box',\n backgroundColor: '#efefef',\n color: '#000000',\n opacity: enabled ? 1 : 0.45,\n cursor: enabled ? 'pointer' : 'not-allowed',\n boxShadow: 'none',\n fontSize: '12px',\n fontWeight: 'normal',\n whiteSpace: 'nowrap',\n }\n : {\n padding: isVertical ? '0' : showToolLabels ? '2px 6px' : '3px 6px',\n width: isVertical ? '30px' : 'auto',\n height: isVertical ? '30px' : 'auto',\n borderRadius: '2px',\n border: '1px solid #767676',\n boxSizing: 'border-box',\n backgroundColor: '#efefef',\n color: '#000000',\n opacity: enabled ? 1 : 0.45,\n cursor: enabled ? 'pointer' : 'not-allowed',\n boxShadow: 'none',\n fontSize: '12px',\n fontWeight: 'normal',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '4px',\n flexShrink: 0,\n }\n return {\n ...base,\n ...styles?.actionButton,\n ...(isVertical && !showToolLabels\n ? {\n padding: '0',\n width: styles?.actionButton?.width ?? '30px',\n height: styles?.actionButton?.height ?? '30px',\n }\n : undefined),\n ...(enabled ? undefined : styles?.actionButtonDisabled),\n }\n}\n\nexport function getActionRowStyle(\n color: string,\n isVertical: boolean,\n showToolLabels: boolean,\n unstyled: boolean,\n styles?: LeafletCanvasStyles,\n extraStyle?: React.CSSProperties,\n): React.CSSProperties {\n const base: React.CSSProperties = unstyled\n ? {}\n : isVertical && showToolLabels\n ? {\n display: 'grid',\n gridTemplateColumns: '20px 1fr auto',\n alignItems: 'center',\n columnGap: '10px',\n padding: '8px 12px',\n textAlign: 'left',\n width: '100%',\n height: 'auto',\n borderRadius: '2px',\n border: '1px solid #767676',\n boxSizing: 'border-box',\n backgroundColor: '#efefef',\n color,\n cursor: 'pointer',\n fontSize: '12px',\n fontWeight: 'normal',\n whiteSpace: 'nowrap',\n boxShadow: 'none',\n flexShrink: 0,\n }\n : {\n padding: isVertical ? '0' : showToolLabels ? '2px 6px' : '3px 6px',\n width: isVertical ? '30px' : 'auto',\n height: isVertical ? '30px' : 'auto',\n borderRadius: '2px',\n border: '1px solid #767676',\n boxSizing: 'border-box',\n backgroundColor: '#efefef',\n color,\n cursor: 'pointer',\n fontSize: '12px',\n fontWeight: 'normal',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '4px',\n boxShadow: 'none',\n flexShrink: 0,\n }\n return {\n ...base,\n ...extraStyle,\n ...styles?.actionButton,\n ...(isVertical && !showToolLabels\n ? {\n padding: '0',\n width: styles?.actionButton?.width ?? '30px',\n height: styles?.actionButton?.height ?? '30px',\n }\n : undefined),\n }\n}\n\n","import type React from 'react'\nimport type {\n CanvasIcons,\n CanvasItem,\n CanvasLabels,\n LeafletCanvasClassNames,\n LeafletCanvasStyles,\n ToolbarOrientation,\n} from '../../types/index.js'\nimport { DEFAULT_ICONS } from './icons.js'\nimport { getActionRowStyle, getHistoryBtnStyle } from './action-buttons-styles.js'\n\nexport interface ActionButtonsProps {\n readOnly: boolean\n showHistoryControls: boolean\n showDeleteButton: boolean\n showClearButton: boolean\n showToolLabels?: boolean\n selectedItem: CanvasItem | null | undefined\n itemsCount: number\n canUndo: boolean\n canRedo: boolean\n undo: () => void\n redo: () => void\n deleteSelected: () => void\n clearAll: () => void\n orientation?: ToolbarOrientation\n labels?: CanvasLabels\n icons?: CanvasIcons\n unstyled?: boolean\n classNames?: LeafletCanvasClassNames\n styles?: LeafletCanvasStyles\n}\n\nexport function ActionButtons({\n readOnly,\n showHistoryControls,\n showDeleteButton,\n showClearButton,\n showToolLabels = true,\n selectedItem,\n itemsCount,\n canUndo,\n canRedo,\n undo,\n redo,\n deleteSelected,\n clearAll,\n orientation = 'horizontal',\n labels,\n icons,\n unstyled,\n classNames,\n styles,\n}: ActionButtonsProps) {\n const isVertical = orientation === 'vertical'\n\n const showDivider =\n showHistoryControls ||\n (!readOnly && showDeleteButton && selectedItem) ||\n (!readOnly && showClearButton && itemsCount > 0)\n\n if (!showDivider) return null\n\n const renderActionContent = (icon: React.ReactNode, label: string) =>\n isVertical && showToolLabels ? (\n <>\n <span style={{ display: 'inline-flex', alignItems: 'center', justifyContent: 'center', width: '20px' }}>\n {icon}\n </span>\n <span style={{ whiteSpace: 'nowrap' }}>{label}</span>\n <span />\n </>\n ) : (\n <>\n {icon}\n {showToolLabels && <span>{label}</span>}\n </>\n )\n\n const getHistoryBtnClass = (enabled: boolean) => [\n 'rlc-action-btn',\n !enabled ? 'rlc-action-btn-disabled' : undefined,\n classNames?.actionButton,\n !enabled ? classNames?.actionButtonDisabled : undefined,\n ].filter(Boolean).join(' ')\n\n const undoBtn = (\n <button\n key=\"undo\"\n type=\"button\"\n title={labels?.undo ?? 'Undo'}\n aria-label={labels?.undo ?? 'Undo'}\n disabled={!canUndo}\n className={getHistoryBtnClass(canUndo)}\n onClick={undo}\n style={getHistoryBtnStyle(canUndo, isVertical, showToolLabels, Boolean(unstyled), styles)}\n >\n {icons?.undo ?? DEFAULT_ICONS.undo}\n </button>\n )\n\n const redoBtn = (\n <button\n key=\"redo\"\n type=\"button\"\n title={labels?.redo ?? 'Redo'}\n aria-label={labels?.redo ?? 'Redo'}\n disabled={!canRedo}\n className={getHistoryBtnClass(canRedo)}\n onClick={redo}\n style={getHistoryBtnStyle(canRedo, isVertical, showToolLabels, Boolean(unstyled), styles)}\n >\n {icons?.redo ?? DEFAULT_ICONS.redo}\n </button>\n )\n\n return (\n <>\n <div\n className={['rlc-toolbar-divider', classNames?.toolbarDivider].filter(Boolean).join(' ')}\n style={{\n ...(unstyled\n ? {}\n : isVertical\n ? { width: showToolLabels ? '100%' : '18px', height: '1px', backgroundColor: '#767676', margin: showToolLabels ? '3px 0' : '3px auto' }\n : { width: '1px', height: '18px', backgroundColor: '#767676', margin: '0 3px' }),\n ...styles?.toolbarDivider,\n }}\n />\n\n {showHistoryControls &&\n (isVertical ? (\n <div\n style={{\n display: 'flex',\n flexDirection: showToolLabels ? 'row' : 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '4px',\n width: showToolLabels ? '100%' : 'auto',\n }}\n >\n {undoBtn}\n {redoBtn}\n </div>\n ) : (\n <>\n {undoBtn}\n {redoBtn}\n </>\n ))}\n\n {!readOnly && showDeleteButton && selectedItem && (\n <button\n type=\"button\"\n title={labels?.delete ?? 'Delete selected item (Del)'}\n aria-label={labels?.delete ?? 'Delete selected item'}\n className={['rlc-action-btn', 'rlc-delete-btn', classNames?.actionButton, classNames?.deleteButton].filter(Boolean).join(' ')}\n onClick={deleteSelected}\n style={getActionRowStyle('#b91c1c', isVertical, showToolLabels, Boolean(unstyled), styles, styles?.deleteButton)}\n >\n {renderActionContent(icons?.delete ?? DEFAULT_ICONS.delete, labels?.delete ?? 'Delete')}\n </button>\n )}\n\n {!readOnly && showClearButton && itemsCount > 0 && (\n <button\n type=\"button\"\n title={labels?.clear ?? 'Clear all annotations'}\n aria-label={labels?.clear ?? 'Clear all annotations'}\n className={['rlc-action-btn', classNames?.actionButton].filter(Boolean).join(' ')}\n onClick={clearAll}\n style={getActionRowStyle('#000000', isVertical, showToolLabels, Boolean(unstyled), styles)}\n >\n {renderActionContent(icons?.clear ?? DEFAULT_ICONS.clear, labels?.clear ?? 'Clear')}\n </button>\n )}\n </>\n )\n}\n","import React from 'react'\nimport type {\n CanvasIcons,\n CanvasLabels,\n CanvasTool,\n CustomToolbarItem,\n LeafletCanvasController,\n ShapeKind,\n ToolbarOrientation,\n ToolbarPosition,\n ToolbarToolGroupId,\n} from '../../types/index.js'\nimport { DEFAULT_ICONS } from './icons.js'\nimport type { ArrowOption, ArrowToolId, ShapeOption } from './types.js'\nimport { ArrowDropdown } from './ArrowDropdown.js'\nimport { ShapesModal } from './ShapesModal.js'\n\nexport interface ToolbarToolButtonsProps {\n controller: LeafletCanvasController\n readOnly: boolean\n position: ToolbarPosition\n orientation: ToolbarOrientation\n isVertical: boolean\n showToolLabels: boolean\n enabledTools: readonly ToolbarToolGroupId[]\n customTools?: readonly CustomToolbarItem[]\n labels?: CanvasLabels\n icons?: CanvasIcons\n unstyled: boolean\n classNames?: any\n styles?: any\n arrowOptions: readonly ArrowOption[]\n shapeOptions: readonly ShapeOption[]\n arrowGroupLabel: string\n currentArrowIcon: React.ReactNode\n shapesGroupLabel: string\n currentShapeIcon: React.ReactNode\n isArrowToolActive: boolean\n isShapeToolActive: boolean\n arrowDropdownOpen: boolean\n shapesModalOpen: boolean\n arrowGroupRef: React.RefObject<HTMLDivElement | null>\n shapesGroupRef: React.RefObject<HTMLDivElement | null>\n setArrowDropdownOpen: React.Dispatch<React.SetStateAction<boolean>>\n setShapesModalOpen: React.Dispatch<React.SetStateAction<boolean>>\n getButtonClassName: (isActive: boolean) => string\n getButtonStyle: (isActive: boolean) => React.CSSProperties\n}\n\nexport function ToolbarToolButtons(props: ToolbarToolButtonsProps) {\n const {\n controller,\n readOnly,\n position,\n orientation,\n isVertical,\n showToolLabels,\n enabledTools,\n customTools,\n labels,\n icons,\n unstyled,\n classNames,\n styles,\n arrowOptions,\n shapeOptions,\n arrowGroupLabel,\n currentArrowIcon,\n shapesGroupLabel,\n currentShapeIcon,\n isArrowToolActive,\n isShapeToolActive,\n arrowDropdownOpen,\n shapesModalOpen,\n arrowGroupRef,\n shapesGroupRef,\n setArrowDropdownOpen,\n setShapesModalOpen,\n getButtonClassName,\n getButtonStyle,\n } = props\n\n const { activeTool, setActiveTool, activeShape, setActiveShape } = controller\n\n const renderToolButtonInner = (icon: React.ReactNode, label: string) =>\n isVertical && showToolLabels ? (\n <>\n <span style={{ display: 'inline-flex', alignItems: 'center', justifyContent: 'center', width: '20px' }}>{icon}</span>\n <span style={{ whiteSpace: 'nowrap' }}>{label}</span>\n <span />\n </>\n ) : (\n <>\n {icon}\n {showToolLabels && <span>{label}</span>}\n </>\n )\n\n const renderSimpleToolBtn = (tool: CanvasTool, label: string, shortcut: string, icon: React.ReactNode, allowInReadOnly = false) => {\n const isActive = activeTool === tool\n return (\n <button\n key={tool}\n type=\"button\"\n disabled={!allowInReadOnly && readOnly}\n aria-disabled={!allowInReadOnly && readOnly ? true : undefined}\n aria-pressed={isActive}\n data-tool={tool}\n data-active={isActive || undefined}\n title={`${label} (${shortcut})`}\n className={getButtonClassName(isActive)}\n onClick={() => {\n if (!allowInReadOnly && readOnly) return\n setActiveTool(tool)\n setArrowDropdownOpen(false)\n setShapesModalOpen(false)\n }}\n style={getButtonStyle(isActive)}\n >\n {renderToolButtonInner(icon, label)}\n </button>\n )\n }\n\n return (\n <>\n {enabledTools.map((groupId) => {\n if (groupId === 'select') return renderSimpleToolBtn('select', labels?.select ?? 'Select', 'V', icons?.select ?? DEFAULT_ICONS.select, true)\n if (groupId === 'freedraw') return renderSimpleToolBtn('freedraw', labels?.freedraw ?? 'Free Draw', 'P', icons?.freedraw ?? DEFAULT_ICONS.freedraw)\n if (groupId === 'ruler') return renderSimpleToolBtn('ruler', labels?.ruler ?? 'Ruler', 'R', icons?.ruler ?? DEFAULT_ICONS.ruler)\n if (groupId === 'note') return renderSimpleToolBtn('note', labels?.note ?? 'Note Card', 'N', icons?.note ?? DEFAULT_ICONS.note)\n if (groupId === 'text') return renderSimpleToolBtn('text', labels?.text ?? 'Normal Text', 'T', icons?.text ?? DEFAULT_ICONS.text)\n\n if (groupId === 'arrow') {\n return (\n <ArrowDropdown\n key=\"arrow\"\n isOpen={arrowDropdownOpen}\n readOnly={readOnly}\n isArrowToolActive={isArrowToolActive}\n activeTool={activeTool}\n arrowOptions={arrowOptions}\n arrowGroupLabel={arrowGroupLabel}\n currentArrowIcon={currentArrowIcon}\n showToolLabels={showToolLabels}\n labels={labels}\n icons={icons}\n unstyled={unstyled}\n classNames={classNames}\n styles={styles}\n position={position}\n orientation={orientation}\n arrowGroupRef={arrowGroupRef}\n getButtonClassName={getButtonClassName}\n getButtonStyle={getButtonStyle}\n onToggle={() => { if (!readOnly) { setShapesModalOpen(false); setArrowDropdownOpen((o) => !o) } }}\n onSelectOption={(id: ArrowToolId) => { setActiveTool(id); setArrowDropdownOpen(false) }}\n />\n )\n }\n\n if (groupId === 'shape') {\n return (\n <ShapesModal\n key=\"shape\"\n isOpen={shapesModalOpen}\n readOnly={readOnly}\n isShapeToolActive={isShapeToolActive}\n activeShape={activeShape}\n shapeOptions={shapeOptions}\n shapesGroupLabel={shapesGroupLabel}\n currentShapeIcon={currentShapeIcon}\n showToolLabels={showToolLabels}\n labels={labels}\n icons={icons}\n unstyled={unstyled}\n classNames={classNames}\n styles={styles}\n position={position}\n orientation={orientation}\n shapesGroupRef={shapesGroupRef}\n getButtonClassName={getButtonClassName}\n getButtonStyle={getButtonStyle}\n onToggle={() => { if (!readOnly) { setArrowDropdownOpen(false); setShapesModalOpen((o) => !o) } }}\n onSelectShape={(kind: ShapeKind) => { setActiveShape(kind); setActiveTool('shape'); setShapesModalOpen(false) }}\n />\n )\n }\n return null\n })}\n\n {customTools?.map((custom) => {\n if (custom.render) return <React.Fragment key={custom.id}>{custom.render(controller)}</React.Fragment>\n const isActive = Boolean(custom.isActive)\n return (\n <button key={custom.id} type=\"button\" disabled={custom.disabled} aria-pressed={isActive} title={custom.title ?? custom.label} className={getButtonClassName(isActive)} onClick={() => custom.onClick?.(controller)} style={getButtonStyle(isActive)}>\n {renderToolButtonInner(custom.icon, custom.label ?? '')}\n </button>\n )\n })}\n </>\n )\n}\n\n","import React from 'react'\nimport type {\n CanvasIcons,\n CanvasLabels,\n LeafletCanvasClassNames,\n LeafletCanvasStyles,\n ToolbarOrientation,\n ToolbarPosition,\n} from '../../types/index.js'\nimport { DEFAULT_ICONS } from './icons.js'\nimport type { ArrowOption, ArrowToolId } from './types.js'\nimport { getDropdownChevronRotation } from './utils.js'\nimport { getPopupPlacementStyle } from './toolbar-helpers.js'\n\nexport interface ArrowDropdownProps {\n isOpen: boolean\n readOnly: boolean\n isArrowToolActive: boolean\n activeTool: string\n arrowOptions: readonly ArrowOption[]\n arrowGroupLabel: string\n currentArrowIcon: React.ReactNode\n showToolLabels?: boolean\n labels?: CanvasLabels\n icons?: CanvasIcons\n unstyled?: boolean\n classNames?: LeafletCanvasClassNames\n styles?: LeafletCanvasStyles\n position?: ToolbarPosition\n orientation?: ToolbarOrientation\n arrowGroupRef: React.RefObject<HTMLDivElement | null>\n getButtonClassName: (isActive: boolean) => string\n getButtonStyle: (isActive: boolean) => React.CSSProperties\n onToggle: () => void\n onSelectOption: (id: ArrowToolId) => void\n}\n\nexport function ArrowDropdown({\n isOpen,\n readOnly,\n isArrowToolActive,\n activeTool,\n arrowOptions,\n arrowGroupLabel,\n currentArrowIcon,\n showToolLabels,\n icons,\n unstyled,\n classNames,\n styles,\n position = 'top-center',\n orientation = 'horizontal',\n arrowGroupRef,\n getButtonClassName,\n getButtonStyle,\n onToggle,\n onSelectOption,\n}: ArrowDropdownProps) {\n const [hoveredOption, setHoveredOption] = React.useState<string | null>(null)\n const isVertical = orientation === 'vertical'\n const popupPlacementStyle = getPopupPlacementStyle(position, orientation)\n const chevronRotation = getDropdownChevronRotation(isOpen, position, orientation)\n const chevronIcon = icons?.dropdownChevron ?? DEFAULT_ICONS.dropdownChevron\n\n return (\n <div\n ref={arrowGroupRef}\n className={['rlc-arrow-group', classNames?.arrowGroupWrapper].filter(Boolean).join(' ')}\n style={{\n position: 'relative',\n display: isVertical ? 'flex' : 'inline-flex',\n width: isVertical ? (showToolLabels ? '100%' : '30px') : 'auto',\n height: isVertical ? (showToolLabels ? 'auto' : '30px') : 'auto',\n alignItems: 'center',\n justifyContent: 'center',\n boxSizing: 'border-box',\n ...styles?.arrowGroupWrapper,\n }}\n >\n <button\n type=\"button\"\n disabled={readOnly}\n aria-disabled={readOnly || undefined}\n aria-pressed={isArrowToolActive}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n data-tool=\"arrow-group\"\n data-active={isArrowToolActive || undefined}\n title={`${arrowGroupLabel} — click to choose arrow type`}\n className={getButtonClassName(isArrowToolActive)}\n onClick={onToggle}\n style={getButtonStyle(isArrowToolActive)}\n >\n {isVertical && showToolLabels ? (\n <>\n <span style={{ display: 'inline-flex', alignItems: 'center', justifyContent: 'center', width: '20px' }}>\n {currentArrowIcon}\n </span>\n <span style={{ whiteSpace: 'nowrap' }}>{arrowGroupLabel}</span>\n <span style={{ display: 'inline-flex', alignItems: 'center', justifyContent: 'center', opacity: 0.9, transform: chevronRotation, transition: 'transform 0.15s ease' }}>\n {chevronIcon}\n </span>\n </>\n ) : (\n <>\n <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: showToolLabels ? '6px' : '0px',\n ...(isVertical && !showToolLabels ? { transform: 'translate(-1px, -1px)' } : undefined),\n }}\n >\n {currentArrowIcon}\n {showToolLabels && <span>{arrowGroupLabel}</span>}\n </span>\n <span\n aria-hidden=\"true\"\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n opacity: 0.85,\n ...(isVertical && !showToolLabels\n ? {\n position: 'absolute',\n right: '2px',\n bottom: '2px',\n width: '8px',\n height: '8px',\n lineHeight: 0,\n pointerEvents: 'none',\n }\n : { marginLeft: showToolLabels ? '6px' : '2px' }),\n transform: isVertical && !showToolLabels\n ? (isOpen ? 'rotate(180deg)' : 'rotate(0deg)')\n : chevronRotation,\n transition: 'transform 0.15s ease',\n }}\n >\n {isVertical && !showToolLabels && React.isValidElement(chevronIcon)\n ? React.cloneElement(chevronIcon as React.ReactElement<any>, {\n width: '100%',\n height: '100%',\n style: {\n width: '100%',\n height: '100%',\n display: 'block',\n ...((chevronIcon as React.ReactElement<any>).props?.style ?? {}),\n },\n })\n : chevronIcon}\n </span>\n </>\n )}\n </button>\n\n {isOpen && (\n <div\n role=\"menu\"\n aria-label=\"Arrow type options\"\n className={['rlc-arrow-dropdown', classNames?.arrowDropdownMenu].filter(Boolean).join(' ')}\n style={{\n position: 'absolute',\n zIndex: 1020,\n ...popupPlacementStyle,\n ...(unstyled\n ? {}\n : {\n minWidth: '190px',\n display: 'flex',\n flexDirection: 'column',\n gap: '2px',\n padding: '4px',\n backgroundColor: '#f0f0f0',\n border: '1px solid #767676',\n borderRadius: '2px',\n boxShadow: '2px 2px 5px rgba(0, 0, 0, 0.25)',\n color: 'inherit',\n boxSizing: 'border-box',\n }),\n ...styles?.arrowDropdownMenu,\n }}\n >\n {arrowOptions.map((option) => {\n const isOptionActive = activeTool === option.id\n const isHovered = hoveredOption === option.id\n return (\n <button\n key={option.id}\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={isOptionActive}\n data-tool={option.id}\n data-active={isOptionActive || undefined}\n className={[\n 'rlc-arrow-dropdown-item',\n classNames?.arrowDropdownItem,\n isOptionActive ? classNames?.arrowDropdownItemActive : undefined,\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => onSelectOption(option.id)}\n onPointerEnter={() => setHoveredOption(option.id)}\n onPointerLeave={() => setHoveredOption(null)}\n style={{\n ...(unstyled\n ? {}\n : {\n display: 'grid',\n gridTemplateColumns: '20px 1fr auto',\n alignItems: 'center',\n columnGap: '10px',\n width: '100%',\n padding: '6px 10px',\n borderRadius: '2px',\n border: isOptionActive ? '1px solid #4f4f4f' : '1px solid #767676',\n boxSizing: 'border-box',\n backgroundColor: isOptionActive ? '#e0e0e0' : isHovered ? '#e8e8e8' : '#efefef',\n color: 'inherit',\n fontSize: '12px',\n fontWeight: 'normal',\n cursor: 'pointer',\n textAlign: 'left',\n boxShadow: isOptionActive ? 'inset 1px 1px 2px rgba(0, 0, 0, 0.2)' : 'none',\n }),\n ...styles?.arrowDropdownItem,\n ...(isOptionActive ? styles?.arrowDropdownItemActive : undefined),\n }}\n >\n <span style={{ display: 'inline-flex', alignItems: 'center', justifyContent: 'center', width: '20px' }}>\n {option.icon}\n </span>\n <span style={{ whiteSpace: 'nowrap' }}>{option.label}</span>\n <span style={{ fontSize: '11px', opacity: isOptionActive ? 0.9 : 0.65, fontWeight: 500 }}>\n {option.shortcut}\n </span>\n </button>\n )\n })}\n </div>\n )}\n </div>\n )\n}\n","import React from 'react'\nimport type {\n CanvasIcons,\n CanvasLabels,\n LeafletCanvasClassNames,\n LeafletCanvasStyles,\n ShapeKind,\n ToolbarOrientation,\n ToolbarPosition,\n} from '../../types/index.js'\nimport { DEFAULT_ICONS } from './icons.js'\nimport type { ShapeOption } from './types.js'\nimport { getDropdownChevronRotation } from './utils.js'\nimport { getPopupPlacementStyle } from './toolbar-helpers.js'\nimport { ShapesModalGrid } from './ShapesModalGrid.js'\n\nexport interface ShapesModalProps {\n isOpen: boolean\n readOnly: boolean\n isShapeToolActive: boolean\n activeShape: ShapeKind\n shapeOptions: readonly ShapeOption[]\n shapesGroupLabel: string\n currentShapeIcon: React.ReactNode\n showToolLabels?: boolean\n labels?: CanvasLabels\n icons?: CanvasIcons\n unstyled?: boolean\n classNames?: LeafletCanvasClassNames\n styles?: LeafletCanvasStyles\n position?: ToolbarPosition\n orientation?: ToolbarOrientation\n shapesGroupRef: React.RefObject<HTMLDivElement | null>\n getButtonClassName: (isActive: boolean) => string\n getButtonStyle: (isActive: boolean) => React.CSSProperties\n onToggle: () => void\n onSelectShape: (kind: ShapeKind) => void\n}\n\nexport function ShapesModal({\n isOpen,\n readOnly,\n isShapeToolActive,\n activeShape,\n shapeOptions,\n shapesGroupLabel,\n currentShapeIcon,\n showToolLabels,\n labels,\n icons,\n unstyled,\n classNames,\n styles,\n position = 'top-center',\n orientation = 'horizontal',\n shapesGroupRef,\n getButtonClassName,\n getButtonStyle,\n onToggle,\n onSelectShape,\n}: ShapesModalProps) {\n const isVertical = orientation === 'vertical'\n const popupPlacementStyle = getPopupPlacementStyle(position, orientation)\n const chevronRotation = getDropdownChevronRotation(isOpen, position, orientation)\n const chevronIcon = icons?.dropdownChevron ?? DEFAULT_ICONS.dropdownChevron\n\n return (\n <div\n ref={shapesGroupRef}\n className={['rlc-shapes-group', classNames?.shapesGroupWrapper].filter(Boolean).join(' ')}\n style={{\n position: 'relative',\n display: isVertical ? 'flex' : 'inline-flex',\n width: isVertical ? (showToolLabels ? '100%' : '30px') : 'auto',\n height: isVertical ? (showToolLabels ? 'auto' : '30px') : 'auto',\n alignItems: 'center',\n justifyContent: 'center',\n boxSizing: 'border-box',\n ...styles?.shapesGroupWrapper,\n }}\n >\n <button\n type=\"button\"\n disabled={readOnly}\n aria-disabled={readOnly || undefined}\n aria-pressed={isShapeToolActive}\n aria-haspopup=\"dialog\"\n aria-expanded={isOpen}\n data-tool=\"shape-group\"\n data-active={isShapeToolActive || undefined}\n title={`${shapesGroupLabel} — open shapes modal`}\n className={getButtonClassName(isShapeToolActive)}\n onClick={onToggle}\n style={getButtonStyle(isShapeToolActive)}\n >\n {isVertical && showToolLabels ? (\n <>\n <span style={{ display: 'inline-flex', alignItems: 'center', justifyContent: 'center', width: '20px' }}>\n {currentShapeIcon}\n </span>\n <span style={{ whiteSpace: 'nowrap' }}>{shapesGroupLabel}</span>\n <span style={{ display: 'inline-flex', alignItems: 'center', justifyContent: 'center', opacity: 0.9, transform: chevronRotation, transition: 'transform 0.15s ease' }}>\n {chevronIcon}\n </span>\n </>\n ) : (\n <>\n <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: showToolLabels ? '6px' : '0px',\n ...(isVertical && !showToolLabels ? { transform: 'translate(-1px, -1px)' } : undefined),\n }}\n >\n {currentShapeIcon}\n {showToolLabels && <span>{shapesGroupLabel}</span>}\n </span>\n <span\n aria-hidden=\"true\"\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n opacity: 0.85,\n ...(isVertical && !showToolLabels\n ? {\n position: 'absolute',\n right: '2px',\n bottom: '2px',\n width: '8px',\n height: '8px',\n lineHeight: 0,\n pointerEvents: 'none',\n }\n : { marginLeft: showToolLabels ? '6px' : '2px' }),\n transform: isVertical && !showToolLabels\n ? (isOpen ? 'rotate(180deg)' : 'rotate(0deg)')\n : chevronRotation,\n transition: 'transform 0.15s ease',\n }}\n >\n {isVertical && !showToolLabels && React.isValidElement(chevronIcon)\n ? React.cloneElement(chevronIcon as React.ReactElement<any>, {\n width: '100%',\n height: '100%',\n style: {\n width: '100%',\n height: '100%',\n display: 'block',\n ...((chevronIcon as React.ReactElement<any>).props?.style ?? {}),\n },\n })\n : chevronIcon}\n </span>\n </>\n )}\n </button>\n\n {isOpen && (\n <div\n role=\"dialog\"\n aria-label={labels?.shapesModalTitle ?? 'Select a Shape'}\n className={['rlc-shapes-modal', classNames?.shapesModal].filter(Boolean).join(' ')}\n onKeyDown={(e) => {\n if (e.key === 'Escape') {\n e.stopPropagation()\n onToggle()\n }\n }}\n style={{\n position: 'absolute',\n zIndex: 1020,\n ...popupPlacementStyle,\n ...(unstyled\n ? {}\n : {\n width: '240px',\n maxWidth: 'calc(100vw - 24px)',\n maxHeight: 'calc(100vh - 80px)',\n overflowY: 'auto',\n overflowX: 'hidden',\n padding: '4px',\n backgroundColor: '#f0f0f0',\n border: '1px solid #767676',\n borderRadius: '2px',\n boxShadow: '2px 2px 5px rgba(0, 0, 0, 0.25)',\n color: 'inherit',\n boxSizing: 'border-box',\n }),\n ...styles?.shapesModal,\n }}\n >\n {labels?.shapesModalTitle && (\n <div\n className={['rlc-shapes-modal-header', classNames?.shapesModalHeader].filter(Boolean).join(' ')}\n style={{\n ...(unstyled\n ? {}\n : {\n padding: '2px 4px 4px',\n fontSize: '11px',\n fontWeight: 600,\n letterSpacing: '0.04em',\n color: '#000000',\n textTransform: 'uppercase',\n borderBottom: '1px solid #767676',\n marginBottom: '4px',\n }),\n ...styles?.shapesModalHeader,\n }}\n >\n {labels.shapesModalTitle}\n </div>\n )}\n\n <ShapesModalGrid\n shapeOptions={shapeOptions}\n activeShape={activeShape}\n isShapeToolActive={isShapeToolActive}\n unstyled={unstyled}\n classNames={classNames}\n styles={styles}\n onSelectShape={onSelectShape}\n />\n </div>\n )}\n </div>\n )\n}\n","import React from 'react'\nimport type {\n LeafletCanvasClassNames,\n LeafletCanvasStyles,\n ShapeKind,\n} from '../../types/index.js'\nimport type { ShapeOption } from './types.js'\n\nexport interface ShapesModalGridProps {\n shapeOptions: readonly ShapeOption[]\n activeShape: ShapeKind\n isShapeToolActive: boolean\n unstyled?: boolean\n classNames?: LeafletCanvasClassNames\n styles?: LeafletCanvasStyles\n onSelectShape: (kind: ShapeKind) => void\n}\n\nexport function ShapesModalGrid({\n shapeOptions,\n activeShape,\n isShapeToolActive,\n unstyled,\n classNames,\n styles,\n onSelectShape,\n}: ShapesModalGridProps) {\n const [hoveredKind, setHoveredKind] = React.useState<string | null>(null)\n\n return (\n <div\n className={['rlc-shapes-modal-grid', classNames?.shapesModalGrid].filter(Boolean).join(' ')}\n style={{\n ...(unstyled\n ? {}\n : {\n display: 'grid',\n gridTemplateColumns: 'repeat(2, minmax(0, 1fr))',\n gap: '4px',\n width: '100%',\n boxSizing: 'border-box',\n }),\n ...styles?.shapesModalGrid,\n }}\n >\n {shapeOptions.map((shapeOpt) => {\n const isSelectedShape = isShapeToolActive && activeShape === shapeOpt.kind\n const isHovered = hoveredKind === shapeOpt.kind\n return (\n <button\n key={shapeOpt.kind}\n type=\"button\"\n data-shape={shapeOpt.kind}\n data-active={isSelectedShape || undefined}\n className={[\n 'rlc-shapes-modal-item',\n classNames?.shapesModalItem,\n isSelectedShape ? classNames?.shapesModalItemActive : undefined,\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => onSelectShape(shapeOpt.kind)}\n onPointerEnter={() => setHoveredKind(shapeOpt.kind)}\n onPointerLeave={() => setHoveredKind(null)}\n style={{\n ...(unstyled\n ? {}\n : {\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n gap: '8px',\n width: '100%',\n minWidth: 0,\n padding: '6px 8px',\n borderRadius: '2px',\n border: isSelectedShape ? '1px solid #4f4f4f' : '1px solid #767676',\n boxSizing: 'border-box',\n backgroundColor: isSelectedShape ? '#e0e0e0' : isHovered ? '#e8e8e8' : '#efefef',\n color: '#000000',\n fontSize: '12px',\n fontWeight: isSelectedShape ? 600 : 'normal',\n cursor: 'pointer',\n textAlign: 'left',\n transition: 'background-color 0.1s ease',\n boxShadow: isSelectedShape ? 'inset 1px 1px 2px rgba(0, 0, 0, 0.2)' : 'none',\n }),\n ...styles?.shapesModalItem,\n ...(isSelectedShape ? styles?.shapesModalItemActive : undefined),\n }}\n >\n <span style={{ display: 'inline-flex', alignItems: 'center', justifyContent: 'center', flexShrink: 0, width: '18px', height: '18px' }}>\n {shapeOpt.icon}\n </span>\n <span style={{ flex: 1, minWidth: 0, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', textAlign: 'left' }}>\n {shapeOpt.label}\n </span>\n </button>\n )\n })}\n </div>\n )\n}\n\n","import type React from 'react'\nimport type {\n CanvasIcons,\n CanvasLabels,\n CustomToolbarItem,\n LeafletCanvasClassNames,\n LeafletCanvasController,\n LeafletCanvasStyles,\n ToolbarOrientation,\n ToolbarPosition,\n ToolbarToolGroupId,\n} from '../../types/index.js'\nimport type { ArrowOption, ShapeOption } from './types.js'\nimport { ActionButtons } from './ActionButtons.js'\nimport { CollapseTriggerButton } from './CollapseButtons.js'\nimport { ToolbarToolButtons } from './ToolbarToolButtons.js'\n\nexport interface PrimaryToolbarStripProps {\n controller: LeafletCanvasController\n readOnly: boolean\n position: ToolbarPosition\n orientation: ToolbarOrientation\n isVertical: boolean\n showToolLabels: boolean\n collapsible: boolean\n showCollapseButton: boolean\n enabledTools: readonly ToolbarToolGroupId[]\n customTools?: readonly CustomToolbarItem[]\n showHistoryControls: boolean\n showDeleteButton: boolean\n showClearButton: boolean\n labels?: CanvasLabels\n icons?: CanvasIcons\n unstyled: boolean\n classNames?: LeafletCanvasClassNames\n styles?: LeafletCanvasStyles\n arrowOptions: readonly ArrowOption[]\n shapeOptions: readonly ShapeOption[]\n arrowGroupLabel: string\n currentArrowIcon: React.ReactNode\n shapesGroupLabel: string\n currentShapeIcon: React.ReactNode\n isArrowToolActive: boolean\n isShapeToolActive: boolean\n arrowDropdownOpen: boolean\n shapesModalOpen: boolean\n arrowGroupRef: React.RefObject<HTMLDivElement | null>\n shapesGroupRef: React.RefObject<HTMLDivElement | null>\n setArrowDropdownOpen: React.Dispatch<React.SetStateAction<boolean>>\n setShapesModalOpen: React.Dispatch<React.SetStateAction<boolean>>\n getButtonClassName: (isActive: boolean) => string\n getButtonStyle: (isActive: boolean) => React.CSSProperties\n onCollapse: () => void\n}\n\nexport function PrimaryToolbarStrip(props: PrimaryToolbarStripProps) {\n const {\n controller,\n readOnly,\n position,\n orientation,\n isVertical,\n showToolLabels,\n collapsible,\n showCollapseButton,\n enabledTools,\n customTools,\n showHistoryControls,\n showDeleteButton,\n showClearButton,\n labels,\n icons,\n unstyled,\n classNames,\n styles,\n arrowOptions,\n shapeOptions,\n arrowGroupLabel,\n currentArrowIcon,\n shapesGroupLabel,\n currentShapeIcon,\n isArrowToolActive,\n isShapeToolActive,\n arrowDropdownOpen,\n shapesModalOpen,\n arrowGroupRef,\n shapesGroupRef,\n setArrowDropdownOpen,\n setShapesModalOpen,\n getButtonClassName,\n getButtonStyle,\n onCollapse,\n } = props\n\n return (\n <div\n role=\"toolbar\"\n aria-label=\"Map annotation tools\"\n className={['rlc-toolbar-primary', classNames?.toolbarPrimary].filter(Boolean).join(' ')}\n style={{\n ...(unstyled\n ? {}\n : {\n display: 'flex',\n flexDirection: isVertical ? 'column' : 'row',\n alignItems: isVertical && showToolLabels ? 'stretch' : 'center',\n gap: '3px',\n padding: '3px',\n boxSizing: 'border-box',\n minWidth: isVertical ? (showToolLabels ? 'auto' : '38px') : undefined,\n width: isVertical ? (showToolLabels ? 'auto' : '38px') : undefined,\n backgroundColor: '#f0f0f0',\n border: '1px solid #767676',\n borderRadius: '2px',\n boxShadow: '0 1px 3px rgba(0, 0, 0, 0.2)',\n color: '#000000',\n }),\n ...styles?.toolbarPrimary,\n }}\n >\n <ToolbarToolButtons\n controller={controller}\n readOnly={readOnly}\n position={position}\n orientation={orientation}\n isVertical={isVertical}\n showToolLabels={showToolLabels}\n enabledTools={enabledTools}\n customTools={customTools}\n labels={labels}\n icons={icons}\n unstyled={unstyled}\n classNames={classNames}\n styles={styles}\n arrowOptions={arrowOptions}\n shapeOptions={shapeOptions}\n arrowGroupLabel={arrowGroupLabel}\n currentArrowIcon={currentArrowIcon}\n shapesGroupLabel={shapesGroupLabel}\n currentShapeIcon={currentShapeIcon}\n isArrowToolActive={isArrowToolActive}\n isShapeToolActive={isShapeToolActive}\n arrowDropdownOpen={arrowDropdownOpen}\n shapesModalOpen={shapesModalOpen}\n arrowGroupRef={arrowGroupRef}\n shapesGroupRef={shapesGroupRef}\n setArrowDropdownOpen={setArrowDropdownOpen}\n setShapesModalOpen={setShapesModalOpen}\n getButtonClassName={getButtonClassName}\n getButtonStyle={getButtonStyle}\n />\n\n <ActionButtons\n readOnly={readOnly}\n showHistoryControls={showHistoryControls}\n showDeleteButton={showDeleteButton}\n showClearButton={showClearButton}\n showToolLabels={showToolLabels}\n selectedItem={controller.selectedItem}\n itemsCount={controller.items.length}\n canUndo={controller.canUndo}\n canRedo={controller.canRedo}\n undo={controller.undo}\n redo={controller.redo}\n deleteSelected={controller.deleteSelected}\n clearAll={controller.clearAll}\n orientation={orientation}\n labels={labels}\n icons={icons}\n unstyled={unstyled}\n classNames={classNames}\n styles={styles}\n />\n\n {collapsible && showCollapseButton && (\n <CollapseTriggerButton\n position={position}\n orientation={orientation}\n isVertical={isVertical}\n showToolLabels={showToolLabels}\n unstyled={unstyled}\n labels={labels}\n icons={icons}\n classNames={classNames}\n styles={styles}\n onCollapse={onCollapse}\n />\n )}\n </div>\n )\n}\n","import React, { useEffect, useRef } from 'react'\nimport type {\n ArrowItem,\n CanvasIcons,\n CanvasItem,\n CanvasLabels,\n LeafletCanvasClassNames,\n LeafletCanvasStyles,\n ShapeItem,\n TextItem,\n ToolbarOrientation,\n} from '../../types/index.js'\nimport {\n DEFAULT_FONT_SIZE_OPTIONS,\n DEFAULT_STROKE_WIDTH_OPTIONS,\n NOTE_COLOR_THEMES,\n} from '../../shared/constants.js'\nimport { DEFAULT_ICONS } from './icons.js'\nimport { PixelSelect } from './PixelSelect.js'\n\nexport interface ContextualSettingsBarProps {\n isArrowContext: boolean\n isFreeDrawContext: boolean\n isShapeContext: boolean\n isRulerContext?: boolean\n isTextContext: boolean\n isNoteContext: boolean\n selectedItem: CanvasItem | null | undefined\n selectedShape: ShapeItem | null\n selectedArrow: ArrowItem | null\n selectedText?: TextItem | null\n activeColor: string\n setActiveColor: (color: string) => void\n strokeWidth: number\n setStrokeWidth: (width: number) => void\n strokeWidthOptions?: readonly number[]\n dashed: boolean\n setDashed: (dashed: boolean) => void\n shapeFilled: boolean\n setShapeFilled: (filled: boolean) => void\n noteColor: string\n setNoteColor: (color: string) => void\n fontSize?: number\n setFontSize?: (size: number) => void\n fontSizeOptions?: readonly number[]\n fontWeight?: 'normal' | 'bold'\n setFontWeight?: (weight: 'normal' | 'bold') => void\n updateItem: (id: string, patch: any) => void\n notifyChangeComplete?: (targetItem?: CanvasItem | null) => void\n isEditingLabel?: boolean\n setEditingLabel?: (editing: boolean) => void\n strokeColors: readonly string[]\n orientation?: ToolbarOrientation\n labels?: CanvasLabels\n icons?: CanvasIcons\n unstyled?: boolean\n classNames?: LeafletCanvasClassNames\n styles?: LeafletCanvasStyles\n}\n\nexport function ContextualSettingsBar(props: ContextualSettingsBarProps) {\n const {\n isArrowContext,\n isFreeDrawContext,\n isShapeContext,\n isRulerContext,\n isTextContext,\n isNoteContext,\n selectedItem,\n selectedShape,\n selectedArrow,\n selectedText,\n activeColor,\n setActiveColor,\n strokeWidth,\n setStrokeWidth,\n strokeWidthOptions,\n dashed,\n setDashed,\n shapeFilled,\n setShapeFilled,\n noteColor,\n setNoteColor,\n fontSize,\n setFontSize,\n fontSizeOptions,\n fontWeight,\n setFontWeight,\n updateItem,\n notifyChangeComplete,\n isEditingLabel,\n setEditingLabel,\n strokeColors,\n orientation = 'horizontal',\n labels,\n icons,\n unstyled,\n classNames,\n styles,\n } = props\n const isVertical = orientation === 'vertical'\n\n const shapeInputRef = useRef<HTMLInputElement | null>(null)\n const arrowInputRef = useRef<HTMLInputElement | null>(null)\n const textInputRef = useRef<HTMLInputElement | null>(null)\n\n const hasShapeLabelMode = selectedShape\n ? selectedShape.labelMode !== false && (selectedShape as any).hasLabelMode !== false\n : false\n const hasArrowLabelMode = selectedArrow\n ? selectedArrow.labelMode !== false && (selectedArrow as any).hasLabelMode !== false\n : false\n\n useEffect(() => {\n if (isEditingLabel) {\n if (selectedShape && hasShapeLabelMode && shapeInputRef.current) {\n shapeInputRef.current.focus()\n shapeInputRef.current.select()\n } else if (selectedArrow && hasArrowLabelMode && arrowInputRef.current) {\n arrowInputRef.current.focus()\n arrowInputRef.current.select()\n }\n }\n }, [\n isEditingLabel,\n selectedShape?.id,\n selectedArrow?.id,\n hasShapeLabelMode,\n hasArrowLabelMode,\n ])\n\n const getToggleBtnStyle = (active: boolean, bold = false): React.CSSProperties => ({\n ...(unstyled ? {} : { padding: '2px 6px', borderRadius: '2px', border: active ? '1px solid #4f4f4f' : '1px solid #767676', backgroundColor: active ? '#e0e0e0' : '#efefef', color: '#000000', boxShadow: active ? 'inset 1px 1px 2px rgba(0, 0, 0, 0.2)' : 'none', fontSize: '12px', fontWeight: bold ? 700 : undefined, cursor: 'pointer' }),\n ...styles?.actionButton,\n ...(active ? styles?.toolButtonActive : undefined),\n })\n const getToggleBtnClass = (active: boolean) => ['rlc-action-btn', classNames?.actionButton, active ? classNames?.toolButtonActive : undefined].filter(Boolean).join(' ')\n const getInputStyle = (w = '105px'): React.CSSProperties => ({\n ...(unstyled ? {} : { minWidth: '100px', width: isVertical ? 'auto' : w, flex: isVertical ? '1 1 auto' : undefined, boxSizing: 'border-box', padding: '2px 4px', borderRadius: '2px', border: '1px solid #767676', backgroundColor: '#ffffff', color: '#000000', fontSize: '12px' }),\n ...styles?.toolbarInput,\n })\n const dividerEl = (\n <div\n className={['rlc-toolbar-divider', classNames?.toolbarDivider].filter(Boolean).join(' ')}\n style={{ ...(unstyled ? {} : isVertical ? { width: '100%', height: '1px', backgroundColor: '#767676' } : { width: '1px', height: '16px', backgroundColor: '#767676' }), ...styles?.toolbarDivider }}\n />\n )\n\n const isDashedActive = Boolean(\n selectedItem &&\n (selectedItem.type === 'arrow' ||\n selectedItem.type === 'freedraw' ||\n selectedItem.type === 'shape' ||\n selectedItem.type === 'ruler')\n ? selectedItem.dashed\n : dashed,\n )\n const isFilledActive = Boolean(selectedShape ? selectedShape.filled : shapeFilled)\n const isBold = Boolean(selectedText ? selectedText.fontWeight === 'bold' : (fontWeight ?? 'bold') === 'bold')\n\n return (\n <div\n className={['rlc-toolbar-secondary', classNames?.toolbarSecondary].filter(Boolean).join(' ')}\n style={{\n ...(unstyled ? {} : { display: 'flex', flexDirection: 'row', flexWrap: isVertical ? 'wrap' : 'nowrap', alignItems: 'center', gap: isVertical ? '5px' : '6px', padding: isVertical ? '6px 8px' : '3px 6px', width: isVertical ? '230px' : undefined, maxWidth: isVertical ? '230px' : 'min(92vw, 620px)', overflowX: isVertical ? 'visible' : 'auto', scrollbarWidth: 'none', boxSizing: 'border-box', backgroundColor: '#f0f0f0', border: '1px solid #767676', borderRadius: '2px', boxShadow: '0 1px 3px rgba(0, 0, 0, 0.2)', color: '#000000', fontSize: '12px' }),\n ...styles?.toolbarSecondary,\n }}\n >\n {(isArrowContext || isFreeDrawContext || isShapeContext || isRulerContext || isTextContext) && (\n <div style={{ display: 'flex', alignItems: 'center', gap: '4px', width: isVertical ? '100%' : undefined }}>\n <span style={{ fontSize: '12px', color: 'inherit' }}>{labels?.color ?? 'Color'}</span>\n {strokeColors.map((c) => {\n const selected = (selectedItem && selectedItem.type !== 'note' ? selectedItem.color : activeColor) === c\n return (\n <button\n key={c}\n type=\"button\"\n title={`${labels?.color ?? 'Color'} ${c}`}\n data-active={selected || undefined}\n className={['rlc-swatch-btn', classNames?.swatchButton, selected ? classNames?.swatchButtonActive : undefined].filter(Boolean).join(' ')}\n onClick={() => setActiveColor(c)}\n style={{ backgroundColor: c, ...(unstyled ? {} : { width: '16px', height: '16px', borderRadius: '999px', border: selected ? '2px solid #000000' : '1px solid #767676', boxShadow: selected ? '0 0 0 1px #000000' : 'none', cursor: 'pointer', padding: 0 }), ...styles?.swatchButton, ...(selected ? styles?.swatchButtonActive : undefined) }}\n />\n )\n })}\n </div>\n )}\n\n {(isArrowContext || isFreeDrawContext || isShapeContext || isRulerContext) && (\n <>\n {dividerEl}\n <PixelSelect label={labels?.width ?? 'Width'} control=\"stroke-width\" value={selectedItem && (selectedItem.type === 'arrow' || selectedItem.type === 'freedraw' || selectedItem.type === 'shape' || selectedItem.type === 'ruler') ? selectedItem.strokeWidth : strokeWidth} options={strokeWidthOptions ?? DEFAULT_STROKE_WIDTH_OPTIONS} onChange={setStrokeWidth} unstyled={unstyled} classNames={classNames} styles={styles} icons={icons} />\n <button type=\"button\" data-active={isDashedActive || undefined} className={getToggleBtnClass(isDashedActive)} onClick={() => setDashed(!isDashedActive)} style={getToggleBtnStyle(isDashedActive)}>\n {labels?.dashed ?? 'Dashed'}\n </button>\n </>\n )}\n\n {isShapeContext && (\n <>\n <button type=\"button\" data-active={isFilledActive || undefined} className={getToggleBtnClass(isFilledActive)} onClick={() => setShapeFilled(!isFilledActive)} style={getToggleBtnStyle(isFilledActive)}>\n {labels?.filled ?? 'Fill'}\n </button>\n {selectedShape && hasShapeLabelMode && (\n <input\n ref={shapeInputRef}\n type=\"text\"\n data-rlc-shape-label-input={selectedShape.id}\n data-testid=\"shape-label-input\"\n data-label-mode=\"true\"\n data-editing-label={isEditingLabel ? 'true' : undefined}\n placeholder={labels?.shapeLabelPlaceholder ?? 'Shape label...'}\n value={selectedShape.label ?? ''}\n className={['rlc-toolbar-input', classNames?.toolbarInput].filter(Boolean).join(' ')}\n onChange={(e) => updateItem(selectedShape.id, { label: e.target.value })}\n onFocus={() => setEditingLabel?.(true)}\n onBlur={(e) => {\n const next = e.relatedTarget as HTMLElement | null\n if (\n next?.tagName === 'INPUT' ||\n next?.tagName === 'TEXTAREA' ||\n next?.closest('[data-rlc-toolbar], [data-rlc-inline-shape-label]')\n ) {\n return\n }\n setEditingLabel?.(false)\n notifyChangeComplete?.(selectedShape)\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === 'Escape') {\n e.preventDefault()\n setEditingLabel?.(false)\n e.currentTarget.blur()\n notifyChangeComplete?.(selectedShape)\n }\n }}\n style={getInputStyle()}\n />\n )}\n </>\n )}\n\n {selectedArrow && hasArrowLabelMode && (\n <input\n ref={arrowInputRef}\n type=\"text\"\n data-rlc-arrow-label-input={selectedArrow.id}\n data-testid=\"arrow-label-input\"\n data-label-mode=\"true\"\n data-editing-label={isEditingLabel ? 'true' : undefined}\n placeholder={labels?.arrowLabelPlaceholder ?? 'Arrow label...'}\n value={selectedArrow.label ?? ''}\n className={['rlc-toolbar-input', classNames?.toolbarInput].filter(Boolean).join(' ')}\n onChange={(e) => updateItem(selectedArrow.id, { label: e.target.value })}\n onFocus={() => setEditingLabel?.(true)}\n onBlur={() => {\n setEditingLabel?.(false)\n notifyChangeComplete?.(selectedArrow)\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === 'Escape') {\n e.preventDefault()\n setEditingLabel?.(false)\n e.currentTarget.blur()\n notifyChangeComplete?.(selectedArrow)\n }\n }}\n style={getInputStyle()}\n />\n )}\n\n {isTextContext && (\n <>\n {dividerEl}\n <PixelSelect label={labels?.fontSize ?? 'Size'} control=\"font-size\" value={selectedText ? (selectedText.initialFontSize ?? fontSize ?? 16) : (fontSize ?? 16)} options={fontSizeOptions ?? DEFAULT_FONT_SIZE_OPTIONS} onChange={(val) => setFontSize?.(val)} unstyled={unstyled} classNames={classNames} styles={styles} icons={icons} />\n <button type=\"button\" data-active={isBold || undefined} title={labels?.textBold ?? 'Toggle bold'} aria-pressed={isBold} className={getToggleBtnClass(isBold)} onClick={() => setFontWeight?.(isBold ? 'normal' : 'bold')} style={getToggleBtnStyle(isBold, true)}>\n {icons?.textBold ?? DEFAULT_ICONS.textBold ?? labels?.textBold ?? 'B'}\n </button>\n {selectedText && (\n <input\n ref={textInputRef}\n type=\"text\"\n data-rlc-text-input={selectedText.id}\n data-testid=\"text-input\"\n data-editing-label={isEditingLabel ? 'true' : undefined}\n placeholder={labels?.textPlaceholder ?? 'Text...'}\n value={selectedText.text ?? ''}\n className={['rlc-toolbar-input', classNames?.toolbarInput].filter(Boolean).join(' ')}\n onChange={(e) => updateItem(selectedText.id, { text: e.target.value })}\n onFocus={() => setEditingLabel?.(true)}\n onBlur={(e) => {\n const next = e.relatedTarget as HTMLElement | null\n if (\n next?.tagName === 'INPUT' ||\n next?.tagName === 'TEXTAREA' ||\n next?.closest('[data-rlc-text], [data-rlc-toolbar]')\n ) {\n return\n }\n setEditingLabel?.(false)\n notifyChangeComplete?.(selectedText)\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === 'Escape') {\n e.preventDefault()\n setEditingLabel?.(false)\n e.currentTarget.blur()\n notifyChangeComplete?.(selectedText)\n }\n }}\n style={getInputStyle('120px')}\n />\n )}\n </>\n )}\n\n {isNoteContext && (\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n <span style={{ opacity: 0.75, fontSize: '11px' }}>{labels?.noteTheme ?? 'Theme'}</span>\n {NOTE_COLOR_THEMES.map((theme) => {\n const selected = (selectedItem?.type === 'note' ? selectedItem.backgroundColor : noteColor) === theme.bg\n return (\n <button\n key={theme.name}\n type=\"button\"\n title={theme.name}\n data-active={selected || undefined}\n className={['rlc-swatch-btn', classNames?.swatchButton, selected ? classNames?.swatchButtonActive : undefined].filter(Boolean).join(' ')}\n onClick={() => setNoteColor(theme.bg)}\n style={{ backgroundColor: theme.header, ...(unstyled ? {} : { width: '18px', height: '18px', borderRadius: '999px', border: selected ? '2px solid #111827' : `1px solid ${theme.border}`, boxShadow: selected ? '0 0 0 1px #111827' : 'none', cursor: 'pointer', padding: 0 }), ...styles?.swatchButton, ...(selected ? styles?.swatchButtonActive : undefined) }}\n />\n )\n })}\n </div>\n )}\n </div>\n )\n}\n","import type {\n CanvasIcons,\n LeafletCanvasClassNames,\n LeafletCanvasStyles,\n} from '../../types/index.js'\nimport { DEFAULT_ICONS } from './icons.js'\n\nexport interface PixelSelectProps {\n /** Visible label and accessible name. */\n label: string\n /** Currently applied value in pixels. */\n value: number\n /** Preset pixel values. The current value is merged in if missing. */\n options: readonly number[]\n onChange: (value: number) => void\n /** Optional data attribute to distinguish multiple selects. */\n control?: string\n unstyled?: boolean\n classNames?: LeafletCanvasClassNames\n styles?: LeafletCanvasStyles\n icons?: CanvasIcons\n}\n\n/**\n * Labeled `<select>` listing pixel values (e.g. `1px`, `2px`, ...).\n * Styled via the `toolbarSelect` slot and `rlc-toolbar-select` class.\n */\nexport function PixelSelect({\n label,\n value,\n options,\n onChange,\n control,\n unstyled,\n classNames,\n styles,\n icons,\n}: PixelSelectProps) {\n const merged = Array.from(new Set([...options, value])).sort((a, b) => a - b)\n const chevronIcon = icons?.dropdownChevron ?? DEFAULT_ICONS.dropdownChevron\n\n return (\n <div style={{ display: 'flex', alignItems: 'center', gap: '4px' }}>\n <span style={{ fontSize: '12px', color: 'inherit' }}>{label}</span>\n <div style={{ position: 'relative', display: 'inline-flex', alignItems: 'center' }}>\n <select\n aria-label={label}\n data-control={control}\n value={value}\n onChange={(e) => onChange(Number(e.target.value))}\n className={['rlc-toolbar-select', classNames?.toolbarSelect]\n .filter(Boolean)\n .join(' ')}\n style={{\n ...(unstyled\n ? {}\n : {\n padding: '1px 16px 1px 4px',\n borderRadius: '2px',\n border: '1px solid #767676',\n backgroundColor: '#efefef',\n color: '#000000',\n fontSize: '12px',\n cursor: 'pointer',\n appearance: 'none',\n WebkitAppearance: 'none',\n }),\n ...styles?.toolbarSelect,\n }}\n >\n {merged.map((v) => (\n <option\n key={v}\n value={v}\n >\n {v}px\n </option>\n ))}\n </select>\n {!unstyled && (\n <span\n aria-hidden=\"true\"\n style={{\n position: 'absolute',\n right: '3px',\n top: '50%',\n transform: 'translateY(-50%)',\n pointerEvents: 'none',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n opacity: 0.7,\n color: 'currentColor',\n }}\n >\n {chevronIcon}\n </span>\n )}\n </div>\n </div>\n )\n}\n","import { useEffect, useRef, useState } from 'react'\nimport type { LeafletCanvasController } from '../../types/index.js'\nimport { isArrowTool } from './utils.js'\n\nexport function useToolbarContext(controller: LeafletCanvasController, readOnly: boolean) {\n const { activeTool, selectedItem } = controller\n const [arrowDropdownOpen, setArrowDropdownOpen] = useState(false)\n const [shapesModalOpen, setShapesModalOpen] = useState(false)\n const arrowGroupRef = useRef<HTMLDivElement | null>(null)\n const shapesGroupRef = useRef<HTMLDivElement | null>(null)\n\n useEffect(() => {\n if (!arrowDropdownOpen && !shapesModalOpen) return\n const handleOutsideClick = (e: PointerEvent) => {\n if (arrowDropdownOpen && arrowGroupRef.current && !arrowGroupRef.current.contains(e.target as Node)) {\n setArrowDropdownOpen(false)\n }\n if (shapesModalOpen && shapesGroupRef.current && !shapesGroupRef.current.contains(e.target as Node)) {\n setShapesModalOpen(false)\n }\n }\n window.addEventListener('pointerdown', handleOutsideClick)\n return () => window.removeEventListener('pointerdown', handleOutsideClick)\n }, [arrowDropdownOpen, shapesModalOpen])\n\n const isArrowToolActive = isArrowTool(activeTool)\n const isShapeToolActive = activeTool === 'shape'\n const isArrowContext = isArrowToolActive || selectedItem?.type === 'arrow'\n const isFreeDrawContext = activeTool === 'freedraw' || selectedItem?.type === 'freedraw'\n const isShapeContext = isShapeToolActive || selectedItem?.type === 'shape'\n const isRulerContext = activeTool === 'ruler' || selectedItem?.type === 'ruler'\n const isNoteContext = activeTool === 'note' || selectedItem?.type === 'note'\n const isTextContext = activeTool === 'text' || selectedItem?.type === 'text'\n\n const showSettingsBar =\n !readOnly &&\n !arrowDropdownOpen &&\n !shapesModalOpen &&\n (isArrowContext || isFreeDrawContext || isShapeContext || isRulerContext || isTextContext || isNoteContext)\n\n return {\n isArrowToolActive,\n isShapeToolActive,\n isArrowContext,\n isFreeDrawContext,\n isShapeContext,\n isRulerContext,\n isNoteContext,\n isTextContext,\n showSettingsBar,\n arrowDropdownOpen,\n setArrowDropdownOpen,\n shapesModalOpen,\n setShapesModalOpen,\n arrowGroupRef,\n shapesGroupRef,\n }\n}\n","'use client'\n\nimport { createPortal } from 'react-dom'\nimport { useMap } from 'react-leaflet'\nimport type L from 'leaflet'\nimport type { LeafletCanvasProps } from '../../types/index.js'\nimport { LeafletCanvasDom } from './LeafletCanvasDom.js'\nimport { useLeafletCanvasOverlay } from './use-leaflet-canvas-overlay.js'\n\nfunction LeafletCanvasWithContext(props: Omit<LeafletCanvasProps, 'map'>) {\n const map = useMap()\n return <LeafletCanvasOverlay {...props} map={map} />\n}\n\nexport function LeafletCanvas(props: LeafletCanvasProps) {\n if (props.map !== undefined) {\n return <LeafletCanvasOverlay {...props} map={props.map} />\n }\n return <LeafletCanvasWithContext {...props} />\n}\n\nexport const LeafletTual = LeafletCanvas\n\nfunction LeafletCanvasOverlay(props: LeafletCanvasProps & { map: L.Map | null }) {\n const {\n map,\n toolbarPosition = 'top-center',\n toolbarOrientation,\n orientation: propOrientation,\n collapsible,\n defaultCollapsed,\n collapsed,\n onCollapsedChange,\n showCollapseButton,\n enabledTools,\n customTools,\n showHistoryControls,\n showDeleteButton,\n showClearButton,\n showToolLabels,\n labels,\n icons,\n zIndex = 650,\n unstyled = false,\n classNames,\n styles,\n strokeColors,\n strokeWidthOptions,\n fontSizeOptions,\n renderToolbar,\n renderNote,\n renderText,\n clampOverlaysToViewport = true,\n autoMinimizeNotesZoom,\n autoMinimizeTextZoom,\n className,\n style,\n } = props\n\n const overlayState = useLeafletCanvasOverlay(props)\n\n if (!map) return null\n\n return createPortal(\n <LeafletCanvasDom\n map={map}\n canvasRef={overlayState.canvasRef}\n viewport={overlayState.viewport}\n isReadOnly={overlayState.isReadOnly}\n isDrawingTool={overlayState.isDrawingTool}\n activeTool={overlayState.controller.activeTool}\n hoverCursor={overlayState.hoverCursor}\n zIndex={zIndex}\n className={className}\n style={style}\n classNames={classNames}\n styles={styles}\n handleInteractionPointerDown={overlayState.handleInteractionPointerDown}\n handleInteractionPointerMove={overlayState.handleInteractionPointerMove}\n noteItems={overlayState.noteItems}\n textItems={overlayState.textItems}\n selectedId={overlayState.selectedId}\n labels={labels}\n icons={icons}\n unstyled={unstyled}\n clampOverlaysToViewport={clampOverlaysToViewport}\n autoMinimizeNotesZoom={autoMinimizeNotesZoom}\n autoMinimizeTextZoom={autoMinimizeTextZoom}\n renderNote={renderNote}\n renderText={renderText}\n setSelectedId={overlayState.setSelectedId}\n updateItem={overlayState.updateItem}\n removeItem={overlayState.removeItem}\n notifyChangeComplete={overlayState.notifyChangeComplete}\n renderToolbar={renderToolbar}\n showToolbar={overlayState.showToolbar}\n controller={overlayState.controller}\n toolbarPosition={toolbarPosition}\n toolbarOrientation={toolbarOrientation ?? propOrientation}\n collapsible={collapsible}\n defaultCollapsed={defaultCollapsed}\n collapsed={collapsed}\n onCollapsedChange={onCollapsedChange}\n showCollapseButton={showCollapseButton}\n enabledTools={enabledTools}\n customTools={customTools}\n showHistoryControls={showHistoryControls}\n showDeleteButton={showDeleteButton}\n showClearButton={showClearButton}\n showToolLabels={showToolLabels}\n strokeColors={strokeColors}\n strokeWidthOptions={strokeWidthOptions}\n fontSizeOptions={fontSizeOptions}\n />,\n map.getContainer(),\n )\n}\n","import React from 'react'\nimport type L from 'leaflet'\nimport type {\n CanvasIcons,\n CanvasItem,\n CanvasLabels,\n CustomToolbarItem,\n LeafletCanvasClassNames,\n LeafletCanvasController,\n LeafletCanvasStyles,\n NoteItem,\n RenderNoteProps,\n RenderTextProps,\n ShapeItem,\n TextItem,\n ToolbarOrientation,\n ToolbarPosition,\n ToolbarToolGroupId,\n} from '../../types/index.js'\nimport { geoToScreen } from '../../shared/index.js'\nimport { InlineShapeLabelEditor, NoteOverlay, TextOverlay } from '../../entities/index.js'\nimport { CanvasToolbar } from '../CanvasToolbar/index.js'\n\nexport interface LeafletCanvasDomProps {\n map: L.Map\n canvasRef: React.RefObject<HTMLCanvasElement | null>\n viewport: { width: number; height: number; tick: number }\n isReadOnly: boolean\n isDrawingTool: boolean\n activeTool: string\n hoverCursor: string | null\n zIndex: number\n className?: string\n style?: React.CSSProperties\n classNames?: LeafletCanvasClassNames\n styles?: LeafletCanvasStyles\n handleInteractionPointerDown: (e: React.PointerEvent<HTMLDivElement>) => void\n handleInteractionPointerMove: (e: React.PointerEvent<HTMLDivElement>) => void\n noteItems: NoteItem[]\n textItems: TextItem[]\n selectedId: string | null\n labels?: CanvasLabels\n icons?: CanvasIcons\n unstyled?: boolean\n clampOverlaysToViewport?: boolean\n autoMinimizeNotesZoom?: number\n autoMinimizeTextZoom?: number\n renderNote?: (props: RenderNoteProps) => React.ReactNode\n renderText?: (props: RenderTextProps) => React.ReactNode\n setSelectedId: (id: string | null) => void\n updateItem: (id: string, patch: any) => void\n removeItem: (id: string) => void\n notifyChangeComplete: (targetItem?: CanvasItem | null) => void\n renderToolbar?: (controller: LeafletCanvasController) => React.ReactNode\n showToolbar: boolean\n controller: LeafletCanvasController\n toolbarPosition: ToolbarPosition\n toolbarOrientation?: ToolbarOrientation\n collapsible?: boolean\n defaultCollapsed?: boolean\n collapsed?: boolean\n onCollapsedChange?: (collapsed: boolean) => void\n showCollapseButton?: boolean\n enabledTools?: readonly ToolbarToolGroupId[]\n customTools?: readonly CustomToolbarItem[]\n showHistoryControls?: boolean\n showDeleteButton?: boolean\n showClearButton?: boolean\n showToolLabels?: boolean\n strokeColors?: readonly string[]\n strokeWidthOptions?: readonly number[]\n fontSizeOptions?: readonly number[]\n}\n\nexport function LeafletCanvasDom(props: LeafletCanvasDomProps) {\n const {\n map,\n canvasRef,\n viewport,\n isReadOnly,\n isDrawingTool,\n activeTool,\n hoverCursor,\n zIndex,\n className,\n style,\n classNames,\n styles,\n handleInteractionPointerDown,\n handleInteractionPointerMove,\n noteItems,\n textItems,\n selectedId,\n labels,\n icons,\n unstyled,\n clampOverlaysToViewport,\n autoMinimizeNotesZoom,\n autoMinimizeTextZoom,\n renderNote,\n renderText,\n setSelectedId,\n updateItem,\n removeItem,\n notifyChangeComplete,\n renderToolbar,\n showToolbar,\n controller,\n toolbarPosition,\n toolbarOrientation,\n collapsible,\n defaultCollapsed,\n collapsed,\n onCollapsedChange,\n showCollapseButton,\n enabledTools,\n customTools,\n showHistoryControls,\n showDeleteButton,\n showClearButton,\n showToolLabels,\n strokeColors,\n strokeWidthOptions,\n fontSizeOptions,\n } = props\n\n return (\n <div\n className={['rlc-overlay', isReadOnly ? 'rlc-readonly' : undefined, classNames?.overlay, className].filter(Boolean).join(' ')}\n data-rlc-overlay\n data-readonly={isReadOnly || undefined}\n style={{ position: 'absolute', inset: 0, zIndex, pointerEvents: 'none', overflow: 'hidden', ...styles?.overlay, ...style }}\n >\n <canvas\n ref={canvasRef}\n className={['rlc-canvas', classNames?.canvas].filter(Boolean).join(' ')}\n style={{ position: 'absolute', inset: 0, width: `${viewport.width}px`, height: `${viewport.height}px`, pointerEvents: 'none', ...styles?.canvas }}\n />\n\n {isDrawingTool && (\n <div\n data-rlc-drawing-surface\n className={['rlc-drawing-surface', classNames?.drawingSurface].filter(Boolean).join(' ')}\n onPointerDown={handleInteractionPointerDown}\n onPointerMove={handleInteractionPointerMove}\n style={{ position: 'absolute', inset: 0, pointerEvents: 'auto', cursor: activeTool === 'text' ? 'text' : 'crosshair', ...styles?.drawingSurface }}\n />\n )}\n\n {hoverCursor && !isDrawingTool && <style>{`.leaflet-container { cursor: ${hoverCursor} !important; }`}</style>}\n\n <div\n className={['rlc-items-container', classNames?.itemsContainer].filter(Boolean).join(' ')}\n style={{ position: 'absolute', inset: 0, pointerEvents: 'none', ...styles?.itemsContainer }}\n >\n {noteItems.map((note) => (\n <NoteOverlay key={note.id} item={note} screenPos={geoToScreen(map, note.position)} isSelected={!isReadOnly && note.id === selectedId} map={map} readOnly={isReadOnly} labels={labels} icons={icons} unstyled={unstyled} classNames={classNames} styles={styles} clampToViewport={clampOverlaysToViewport} autoMinimizeZoomThreshold={autoMinimizeNotesZoom} renderNote={renderNote} onSelect={setSelectedId} onUpdate={updateItem} onDelete={removeItem} onComplete={notifyChangeComplete} />\n ))}\n {textItems.map((txt) => (\n <TextOverlay key={txt.id} item={txt} screenPos={geoToScreen(map, txt.position)} isSelected={!isReadOnly && txt.id === selectedId} isEditingLabel={!isReadOnly && txt.id === selectedId && Boolean(controller.isEditingLabel)} map={map} readOnly={isReadOnly} labels={labels} icons={icons} unstyled={unstyled} classNames={classNames} styles={styles} clampToViewport={clampOverlaysToViewport} autoMinimizeZoomThreshold={autoMinimizeTextZoom} renderText={renderText} onSelect={setSelectedId} onUpdate={updateItem} onDelete={removeItem} onComplete={notifyChangeComplete} />\n ))}\n {!showToolbar && controller.isEditingLabel && selectedId && (() => {\n const selectedShape = controller.items.find((s) => s.id === selectedId && s.type === 'shape') as ShapeItem | undefined\n if (!selectedShape) return null\n const hasLabelMode =\n selectedShape.labelMode !== false && (selectedShape as any).hasLabelMode !== false\n if (!hasLabelMode) return null\n return (\n <InlineShapeLabelEditor\n shape={selectedShape}\n map={map}\n labels={labels}\n onUpdate={updateItem}\n onClose={() => {\n controller.setEditingLabel?.(false)\n notifyChangeComplete(selectedShape)\n }}\n />\n )\n })()}\n </div>\n\n {renderToolbar\n ? renderToolbar(controller)\n : showToolbar && (\n <CanvasToolbar\n controller={controller}\n position={toolbarPosition}\n orientation={toolbarOrientation}\n collapsible={collapsible}\n defaultCollapsed={defaultCollapsed}\n collapsed={collapsed}\n onCollapsedChange={onCollapsedChange}\n showCollapseButton={showCollapseButton}\n readOnly={isReadOnly}\n enabledTools={enabledTools}\n customTools={customTools}\n showHistoryControls={showHistoryControls}\n showDeleteButton={showDeleteButton}\n showClearButton={showClearButton}\n showToolLabels={showToolLabels}\n labels={labels}\n icons={icons}\n unstyled={unstyled}\n classNames={classNames}\n styles={styles}\n strokeColors={strokeColors}\n strokeWidthOptions={strokeWidthOptions}\n fontSizeOptions={fontSizeOptions}\n />\n )}\n </div>\n )\n}\n\n","import { useCallback, useRef } from 'react'\nimport type L from 'leaflet'\nimport type {\n ArrowItem,\n CanvasItem,\n FreeDrawItem,\n LeafletCanvasProps,\n NoteItem,\n RulerItem,\n ShapeItem,\n TextItem,\n} from '../../types/index.js'\nimport { useLeafletCanvas, useLeafletSync } from '../../features/index.js'\nimport { useCanvasPainter } from './use-canvas-painter.js'\nimport { useCanvasKeyboardShortcuts } from './use-canvas-keyboard-shortcuts.js'\nimport { useSelectInteractions } from './use-select-interactions.js'\nimport { useDrawingInteractions } from './use-drawing-interactions.js'\nimport { useBlockMapDblClick } from './use-block-map-dblclick.js'\nimport {\n useOutsideCanvasPointerDown,\n useStableItemArray,\n} from './use-outside-canvas-deselect.js'\n\nexport function useLeafletCanvasOverlay(\n props: LeafletCanvasProps & { map: L.Map | null },\n) {\n const {\n map,\n controller: externalController,\n readOnly: propReadOnly,\n showToolbar: propShowToolbar,\n annotationTheme,\n arrowTheme,\n labels,\n ...hookOptions\n } = props\n\n const isReadOnly = Boolean(propReadOnly ?? externalController?.readOnly ?? false)\n const internalController = useLeafletCanvas({ ...hookOptions, readOnly: isReadOnly })\n const controller = externalController ?? internalController\n const showToolbar = propShowToolbar ?? !isReadOnly\n\n const propCallbacksRef = useRef(hookOptions)\n propCallbacksRef.current = hookOptions\n\n const notifyChangeComplete = useCallback(\n (targetItem?: CanvasItem | null) => {\n controller.notifyChangeComplete(targetItem)\n if (externalController) {\n propCallbacksRef.current.onItemsChangeComplete?.(controller.items, targetItem)\n propCallbacksRef.current.onChangeComplete?.(controller.items, targetItem)\n propCallbacksRef.current.onEditEnd?.(controller.items, targetItem)\n propCallbacksRef.current.onEditComplete?.(controller.items, targetItem)\n if (targetItem) propCallbacksRef.current.onItemChangeComplete?.(targetItem)\n }\n },\n [controller, externalController],\n )\n\n const {\n items,\n activeTool,\n setActiveTool,\n activeShape,\n shapeFilled,\n selectedId,\n setSelectedId,\n activeColor,\n strokeWidth,\n dashed,\n noteColor,\n fontSize,\n fontWeight,\n addItem,\n updateItem,\n removeItem,\n deleteSelected,\n } = controller\n\n useOutsideCanvasPointerDown(map, isReadOnly, activeTool, setActiveTool, selectedId, setSelectedId, notifyChangeComplete)\n\n const viewport = useLeafletSync(map)\n const canvasRef = useRef<HTMLCanvasElement | null>(null)\n\n const arrowItems = useStableItemArray<ArrowItem>(items, 'arrow')\n const freeDrawItems = useStableItemArray<FreeDrawItem>(items, 'freedraw')\n const shapeItems = useStableItemArray<ShapeItem>(items, 'shape')\n const rulerItems = useStableItemArray<RulerItem>(items, 'ruler')\n const noteItems = useStableItemArray<NoteItem>(items, 'note')\n const textItems = useStableItemArray<TextItem>(items, 'text')\n\n const {\n draftArrow,\n setDraftArrow,\n draftShape,\n setDraftShape,\n draftRuler,\n setDraftRuler,\n draftFreeDrawRef,\n clearDraftFreeDraw,\n handleInteractionPointerDown,\n handleInteractionPointerMove,\n } = useDrawingInteractions({\n map,\n activeTool,\n setActiveTool,\n activeShape,\n shapeFilled,\n activeColor,\n strokeWidth,\n dashed,\n noteColor,\n fontSize,\n fontWeight,\n labels,\n addItem,\n paintCanvas: () => paintCanvas(),\n })\n\n const paintCanvas = useCanvasPainter({\n map,\n viewport,\n canvasRef,\n arrowItems,\n shapeItems,\n freeDrawItems,\n rulerItems,\n selectedId,\n draftShape,\n draftArrow,\n draftRuler,\n draftFreeDrawRef,\n activeColor,\n strokeWidth,\n dashed,\n shapeFilled,\n annotationTheme: annotationTheme ?? arrowTheme,\n isReadOnly,\n })\n\n useCanvasKeyboardShortcuts({\n isReadOnly,\n selectedId,\n selectedItem: controller.selectedItem,\n items: controller.items,\n isEditingLabel: controller.isEditingLabel,\n setEditingLabel: controller.setEditingLabel,\n deleteSelected,\n setSelectedId,\n setActiveTool,\n setDraftArrow,\n setDraftShape,\n setDraftRuler,\n clearDraftFreeDraw,\n notifyChangeComplete,\n })\n\n useBlockMapDblClick(map)\n\n const hoverCursor = useSelectInteractions({\n map,\n activeTool,\n isReadOnly,\n arrowItems,\n shapeItems,\n freeDrawItems,\n rulerItems,\n selectedId,\n setSelectedId,\n setEditingLabel: controller.setEditingLabel,\n updateItem,\n notifyChangeComplete,\n })\n\n const isDrawingTool = !isReadOnly && activeTool !== 'select'\n\n return {\n controller,\n isReadOnly,\n showToolbar,\n viewport,\n canvasRef,\n isDrawingTool,\n hoverCursor,\n arrowItems,\n shapeItems,\n freeDrawItems,\n noteItems,\n textItems,\n selectedId,\n setSelectedId,\n updateItem,\n removeItem,\n notifyChangeComplete,\n handleInteractionPointerDown,\n handleInteractionPointerMove,\n }\n}\n\n","import { useCallback, useEffect } from 'react'\nimport type L from 'leaflet'\nimport type {\n ArrowItem,\n ArrowRenderTheme,\n CanvasAnnotationTheme,\n FreeDrawItem,\n GeoPoint,\n RulerItem,\n ScreenPoint,\n ShapeItem,\n} from '../../types/index.js'\nimport { paintLeafletCanvas } from '../../../core/features/canvas-painter.js'\nimport type { DraftArrowState, DraftRulerState, DraftShapeState } from './types.js'\n\nexport interface UseCanvasPainterOptions {\n map: L.Map | null\n viewport: { width: number; height: number; tick: number }\n canvasRef: React.RefObject<HTMLCanvasElement | null>\n arrowItems: ArrowItem[]\n shapeItems: ShapeItem[]\n freeDrawItems: FreeDrawItem[]\n rulerItems: RulerItem[]\n selectedId: string | null\n draftShape: DraftShapeState | null\n draftArrow: DraftArrowState | null\n draftRuler?: DraftRulerState | null\n draftFreeDrawRef: React.RefObject<{\n screenPoints: ScreenPoint[]\n geoPoints: GeoPoint[]\n } | null>\n activeColor: string\n strokeWidth: number\n dashed: boolean\n shapeFilled: boolean\n annotationTheme?: CanvasAnnotationTheme\n arrowTheme?: ArrowRenderTheme\n isReadOnly: boolean\n}\n\nexport function useCanvasPainter({\n map,\n viewport,\n canvasRef,\n arrowItems,\n shapeItems,\n freeDrawItems,\n rulerItems,\n selectedId,\n draftShape,\n draftArrow,\n draftRuler,\n draftFreeDrawRef,\n activeColor,\n strokeWidth,\n dashed,\n shapeFilled,\n annotationTheme,\n arrowTheme,\n isReadOnly,\n}: UseCanvasPainterOptions) {\n const paintCanvas = useCallback(() => {\n paintLeafletCanvas({\n map,\n canvas: canvasRef.current,\n width: viewport.width,\n height: viewport.height,\n arrowItems,\n shapeItems,\n freeDrawItems,\n rulerItems,\n selectedId,\n draftShape,\n draftArrow,\n draftRuler,\n draftFreeDraw: draftFreeDrawRef.current,\n activeColor,\n strokeWidth,\n dashed,\n shapeFilled,\n annotationTheme,\n arrowTheme,\n isReadOnly,\n })\n }, [\n map,\n canvasRef,\n viewport.width,\n viewport.height,\n freeDrawItems,\n shapeItems,\n arrowItems,\n rulerItems,\n selectedId,\n draftShape,\n draftArrow,\n draftRuler,\n draftFreeDrawRef,\n activeColor,\n strokeWidth,\n dashed,\n shapeFilled,\n annotationTheme,\n arrowTheme,\n isReadOnly,\n ])\n\n useEffect(() => {\n paintCanvas()\n }, [paintCanvas, viewport.tick])\n\n return paintCanvas\n}\n","import { useEffect } from 'react'\nimport type { ArrowItem, CanvasItem, CanvasTool, ShapeItem } from '../../types/index.js'\nimport type { DraftArrowState, DraftRulerState, DraftShapeState } from './types.js'\n\nexport interface UseCanvasKeyboardShortcutsOptions {\n isReadOnly: boolean\n selectedId: string | null\n selectedItem?: CanvasItem | null\n items?: CanvasItem[]\n isEditingLabel?: boolean\n setEditingLabel?: (editing: boolean) => void\n deleteSelected: () => void\n setSelectedId: (id: string | null) => void\n setActiveTool: (tool: CanvasTool) => void\n setDraftArrow: (draft: DraftArrowState | null) => void\n setDraftShape: (draft: DraftShapeState | null) => void\n setDraftRuler?: (draft: DraftRulerState | null) => void\n clearDraftFreeDraw: () => void\n notifyChangeComplete?: () => void\n}\n\nexport function useCanvasKeyboardShortcuts({\n isReadOnly,\n selectedId,\n selectedItem,\n items,\n isEditingLabel: _isEditingLabel,\n setEditingLabel,\n deleteSelected,\n setSelectedId,\n setActiveTool,\n setDraftArrow,\n setDraftShape,\n setDraftRuler,\n clearDraftFreeDraw,\n notifyChangeComplete,\n}: UseCanvasKeyboardShortcutsOptions) {\n useEffect(() => {\n if (isReadOnly) return\n\n const handleKeyDown = (e: KeyboardEvent) => {\n const target = e.target as HTMLElement | null\n if (\n target &&\n (target.tagName === 'INPUT' ||\n target.tagName === 'TEXTAREA' ||\n target.isContentEditable)\n ) {\n return\n }\n\n if (e.key === 'Escape') {\n setDraftArrow(null)\n setDraftShape(null)\n setDraftRuler?.(null)\n clearDraftFreeDraw()\n setSelectedId(null)\n setActiveTool('select')\n notifyChangeComplete?.()\n } else if (e.key === 'Delete' || e.key === 'Backspace') {\n if (selectedId) {\n e.preventDefault()\n deleteSelected()\n }\n } else if (e.key === 'Enter') {\n const item = selectedItem ?? items?.find((it) => it.id === selectedId)\n if (item && item.type === 'shape') {\n const shape = item as ShapeItem\n const hasLabelMode =\n shape.labelMode !== false && (shape as any).hasLabelMode !== false\n if (hasLabelMode) {\n e.preventDefault()\n setEditingLabel?.(true)\n const focusInput = () => {\n const input = document.querySelector<HTMLInputElement>(\n `[data-rlc-shape-label-input=\"${shape.id}\"], [data-rlc-shape-label-input], input[placeholder*=\"Shape label\"]`,\n )\n if (input) {\n input.focus()\n input.select()\n }\n }\n focusInput()\n if (typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(focusInput)\n }\n setTimeout(focusInput, 0)\n }\n } else if (item && item.type === 'text') {\n e.preventDefault()\n setEditingLabel?.(true)\n const focusInput = () => {\n const input = document.querySelector<HTMLInputElement | HTMLTextAreaElement>(\n `[data-rlc-text=\"${item.id}\"] textarea, [data-rlc-text=\"${item.id}\"] input, [data-rlc-text] textarea`,\n )\n if (input) {\n input.focus()\n if ('select' in input && typeof input.select === 'function') {\n input.select()\n }\n }\n }\n focusInput()\n if (typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(focusInput)\n }\n setTimeout(focusInput, 0)\n } else if (item && item.type === 'note') {\n e.preventDefault()\n setEditingLabel?.(true)\n const focusInput = () => {\n const input = document.querySelector<HTMLInputElement | HTMLTextAreaElement>(\n `[data-rlc-note=\"${item.id}\"] textarea, [data-rlc-note=\"${item.id}\"] input, [data-rlc-note] textarea`,\n )\n if (input) {\n input.focus()\n }\n }\n focusInput()\n if (typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(focusInput)\n }\n setTimeout(focusInput, 0)\n } else if (item && item.type === 'arrow') {\n const arrow = item as ArrowItem\n const hasLabelMode =\n arrow.labelMode !== false && (arrow as any).hasLabelMode !== false\n if (hasLabelMode) {\n e.preventDefault()\n setEditingLabel?.(true)\n const focusInput = () => {\n const input = document.querySelector<HTMLInputElement>(\n `[data-rlc-arrow-label-input=\"${arrow.id}\"], [data-rlc-arrow-label-input], input[placeholder*=\"Arrow label\"]`,\n )\n if (input) {\n input.focus()\n input.select()\n }\n }\n focusInput()\n if (typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(focusInput)\n }\n setTimeout(focusInput, 0)\n }\n }\n } else if (!e.metaKey && !e.ctrlKey && !e.altKey) {\n const key = e.key.toLowerCase()\n if (key === 'v') setActiveTool('select')\n else if (key === 'p') setActiveTool('freedraw')\n else if (key === 'r') setActiveTool('ruler')\n else if (key === 'a') setActiveTool('arrow-linear')\n else if (key === 'c') setActiveTool('arrow-curved')\n else if (key === 'b') setActiveTool('arrow-bi')\n else if (key === 'e') setActiveTool('arrow-elbow')\n else if (key === 's') setActiveTool('arrow-s-curve')\n else if (key === 'n') setActiveTool('note')\n else if (key === 't') setActiveTool('text')\n }\n }\n\n window.addEventListener('keydown', handleKeyDown)\n return () => window.removeEventListener('keydown', handleKeyDown)\n }, [\n isReadOnly,\n selectedId,\n selectedItem,\n items,\n setEditingLabel,\n deleteSelected,\n setSelectedId,\n setActiveTool,\n setDraftArrow,\n setDraftShape,\n setDraftRuler,\n clearDraftFreeDraw,\n notifyChangeComplete,\n ])\n}\n","import { useEffect, useState } from 'react'\nimport type L from 'leaflet'\nimport type {\n ArrowItem,\n FreeDrawItem,\n RulerItem,\n ScreenPoint,\n ShapeItem,\n} from '../../types/index.js'\nimport {\n hitTestArrow,\n hitTestArrowHandle,\n hitTestFreeDraw,\n hitTestRuler,\n hitTestRulerHandle,\n hitTestShape,\n hitTestShapeHandle,\n projectArrow,\n projectFreeDraw,\n projectRuler,\n projectShape,\n} from '../../entities/index.js'\nimport {\n startArrowBodyDrag,\n startArrowHandleDrag,\n startFreeDrawBodyDrag,\n startRulerBodyDrag,\n startRulerHandleDrag,\n startShapeBodyDrag,\n startShapeHandleDrag,\n} from './select-drag-handlers.js'\n\nexport interface UseSelectInteractionsOptions {\n map: L.Map | null\n activeTool: string\n isReadOnly: boolean\n arrowItems: ArrowItem[]\n shapeItems: ShapeItem[]\n freeDrawItems: FreeDrawItem[]\n rulerItems: RulerItem[]\n selectedId: string | null\n setSelectedId: (id: string | null) => void\n setEditingLabel?: (editing: boolean) => void\n updateItem: (id: string, patch: any) => void\n notifyChangeComplete?: () => void\n}\n\nexport function useSelectInteractions({\n map,\n activeTool,\n isReadOnly,\n arrowItems,\n shapeItems,\n freeDrawItems,\n rulerItems,\n selectedId,\n setSelectedId,\n setEditingLabel,\n updateItem,\n notifyChangeComplete,\n}: UseSelectInteractionsOptions) {\n const [hoverCursor, setHoverCursor] = useState<string | null>(null)\n\n useEffect(() => {\n if (!map || activeTool !== 'select' || isReadOnly) {\n setHoverCursor(null)\n return\n }\n\n const container = map.getContainer()\n\n const getLocalPoint = (e: PointerEvent): ScreenPoint => {\n const rect = container.getBoundingClientRect()\n return { x: e.clientX - rect.left, y: e.clientY - rect.top }\n }\n\n const handlePointerMove = (e: PointerEvent) => {\n const target = e.target as HTMLElement | null\n if (target?.closest('[data-rlc-toolbar], [data-rlc-note], [data-rlc-text]')) {\n setHoverCursor(null)\n return\n }\n\n const pt = getLocalPoint(e)\n\n const selectedArrow = arrowItems.find((a) => a.id === selectedId)\n if (selectedArrow && hitTestArrowHandle(pt, projectArrow(map, selectedArrow), selectedArrow)) {\n setHoverCursor('crosshair')\n return\n }\n\n const selectedShape = shapeItems.find((s) => s.id === selectedId)\n if (selectedShape && hitTestShapeHandle(pt, projectShape(map, selectedShape))) {\n setHoverCursor('nwse-resize')\n return\n }\n\n const selectedRuler = rulerItems.find((r) => r.id === selectedId)\n if (selectedRuler && hitTestRulerHandle(pt, projectRuler(map, selectedRuler))) {\n setHoverCursor('crosshair')\n return\n }\n\n for (let i = arrowItems.length - 1; i >= 0; i -= 1) {\n const arrow = arrowItems[i]\n if (hitTestArrow(pt, projectArrow(map, arrow), arrow)) {\n setHoverCursor('pointer')\n return\n }\n }\n\n for (let i = shapeItems.length - 1; i >= 0; i -= 1) {\n if (hitTestShape(pt, projectShape(map, shapeItems[i]))) {\n setHoverCursor('pointer')\n return\n }\n }\n\n for (let i = freeDrawItems.length - 1; i >= 0; i -= 1) {\n const fd = freeDrawItems[i]\n if (hitTestFreeDraw(pt, projectFreeDraw(map, fd), fd)) {\n setHoverCursor('pointer')\n return\n }\n }\n\n for (let i = rulerItems.length - 1; i >= 0; i -= 1) {\n const ruler = rulerItems[i]\n if (hitTestRuler(pt, projectRuler(map, ruler), ruler)) {\n setHoverCursor('pointer')\n return\n }\n }\n\n setHoverCursor(null)\n }\n\n const handlePointerDown = (e: PointerEvent) => {\n if (e.button !== 0) return\n const target = e.target as HTMLElement | null\n if (target?.closest('[data-rlc-toolbar], [data-rlc-note], [data-rlc-text], .leaflet-control')) {\n return\n }\n\n const pt = getLocalPoint(e)\n\n const selectedArrow = arrowItems.find((a) => a.id === selectedId)\n if (selectedArrow) {\n const projected = projectArrow(map, selectedArrow)\n const handle = hitTestArrowHandle(pt, projected, selectedArrow)\n if (handle) {\n e.stopPropagation()\n e.preventDefault()\n startArrowHandleDrag(map, selectedArrow, projected, handle, getLocalPoint, updateItem)\n return\n }\n }\n\n const selectedShape = shapeItems.find((s) => s.id === selectedId)\n if (selectedShape) {\n const projected = projectShape(map, selectedShape)\n const handle = hitTestShapeHandle(pt, projected)\n if (handle) {\n e.stopPropagation()\n e.preventDefault()\n startShapeHandleDrag(map, selectedShape, projected, handle, getLocalPoint, updateItem)\n return\n }\n }\n\n const selectedRuler = rulerItems.find((r) => r.id === selectedId)\n if (selectedRuler) {\n const projected = projectRuler(map, selectedRuler)\n const handle = hitTestRulerHandle(pt, projected)\n if (handle) {\n e.stopPropagation()\n e.preventDefault()\n startRulerHandleDrag(map, selectedRuler, projected, handle, getLocalPoint, updateItem)\n return\n }\n }\n\n for (let i = arrowItems.length - 1; i >= 0; i -= 1) {\n const arrow = arrowItems[i]\n const projected = projectArrow(map, arrow)\n if (hitTestArrow(pt, projected, arrow)) {\n e.stopPropagation()\n e.preventDefault()\n setSelectedId(arrow.id)\n startArrowBodyDrag(map, arrow, projected, pt, getLocalPoint, updateItem)\n return\n }\n }\n\n for (let i = shapeItems.length - 1; i >= 0; i -= 1) {\n const shp = shapeItems[i]\n const projected = projectShape(map, shp)\n if (hitTestShape(pt, projected)) {\n e.stopPropagation()\n e.preventDefault()\n setSelectedId(shp.id)\n startShapeBodyDrag(map, shp, projected, pt, getLocalPoint, updateItem)\n return\n }\n }\n\n for (let i = freeDrawItems.length - 1; i >= 0; i -= 1) {\n const fd = freeDrawItems[i]\n const initialScreenPts = projectFreeDraw(map, fd)\n if (hitTestFreeDraw(pt, initialScreenPts, fd)) {\n e.stopPropagation()\n e.preventDefault()\n setSelectedId(fd.id)\n startFreeDrawBodyDrag(map, fd, initialScreenPts, pt, getLocalPoint, updateItem)\n return\n }\n }\n\n for (let i = rulerItems.length - 1; i >= 0; i -= 1) {\n const ruler = rulerItems[i]\n const projected = projectRuler(map, ruler)\n if (hitTestRuler(pt, projected, ruler)) {\n e.stopPropagation()\n e.preventDefault()\n setSelectedId(ruler.id)\n startRulerBodyDrag(map, ruler, projected, pt, getLocalPoint, updateItem)\n return\n }\n }\n\n if (selectedId) {\n setSelectedId(null)\n notifyChangeComplete?.()\n }\n }\n\n const handleDblClick = (e: MouseEvent) => {\n const target = e.target as HTMLElement | null\n if (\n target?.closest(\n '[data-rlc-toolbar], [data-rlc-note], [data-rlc-text], .leaflet-control',\n )\n ) {\n return\n }\n\n const rect = container.getBoundingClientRect()\n const pt: ScreenPoint = {\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n }\n\n for (let i = shapeItems.length - 1; i >= 0; i -= 1) {\n const shp = shapeItems[i]\n const projected = projectShape(map, shp)\n if (hitTestShape(pt, projected)) {\n e.stopPropagation()\n e.preventDefault()\n setSelectedId(shp.id)\n const hasLabelMode =\n shp.labelMode !== false && (shp as any).hasLabelMode !== false\n if (hasLabelMode) {\n setEditingLabel?.(true)\n const focusInput = () => {\n const input = document.querySelector<HTMLInputElement>(\n `[data-rlc-shape-label-input=\"${shp.id}\"], [data-rlc-shape-label-input], input[placeholder*=\"Shape label\"]`,\n )\n if (input) {\n input.focus()\n input.select()\n }\n }\n focusInput()\n if (typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(focusInput)\n }\n setTimeout(focusInput, 0)\n }\n return\n }\n }\n }\n\n container.addEventListener('pointermove', handlePointerMove)\n container.addEventListener('pointerdown', handlePointerDown, { capture: true })\n container.addEventListener('dblclick', handleDblClick, { capture: true })\n\n return () => {\n container.removeEventListener('pointermove', handlePointerMove)\n container.removeEventListener('pointerdown', handlePointerDown, { capture: true })\n container.removeEventListener('dblclick', handleDblClick, { capture: true })\n }\n }, [\n map,\n activeTool,\n arrowItems,\n shapeItems,\n freeDrawItems,\n selectedId,\n setSelectedId,\n setEditingLabel,\n updateItem,\n isReadOnly,\n ])\n\n return hoverCursor\n}\n","import { useRef, useState } from 'react'\nimport type React from 'react'\nimport type L from 'leaflet'\nimport type {\n CanvasLabels,\n CanvasTool,\n GeoPoint,\n ScreenPoint,\n ShapeKind,\n} from '../../types/index.js'\nimport {\n constrainAngleTo45Degrees,\n geoToScreen,\n screenToGeo,\n} from '../../shared/index.js'\nimport { TOOL_TO_ARROW_STYLE } from './constants.js'\nimport type { DraftArrowState, DraftRulerState, DraftShapeState } from './types.js'\nimport {\n buildArrowItem,\n createDraftNote,\n createDraftText,\n startArrowDrag,\n startFreeDrawDrag,\n startRulerDrag,\n startShapeDrag,\n} from './drawing-drag-handlers.js'\n\nexport interface UseDrawingInteractionsOptions {\n map: L.Map | null\n activeTool: CanvasTool\n setActiveTool: (tool: CanvasTool) => void\n activeShape: ShapeKind\n shapeFilled: boolean\n activeColor: string\n strokeWidth: number\n dashed: boolean\n noteColor: string\n fontSize: number\n fontWeight: 'normal' | 'bold'\n labels?: CanvasLabels\n addItem: (item: any) => void\n paintCanvas: () => void\n}\n\nexport function useDrawingInteractions({\n map,\n activeTool,\n setActiveTool,\n activeShape,\n shapeFilled,\n activeColor,\n strokeWidth,\n dashed,\n noteColor,\n fontSize,\n fontWeight,\n labels,\n addItem,\n paintCanvas,\n}: UseDrawingInteractionsOptions) {\n const [draftArrow, setDraftArrow] = useState<DraftArrowState | null>(null)\n const [draftShape, setDraftShape] = useState<DraftShapeState | null>(null)\n const [draftRuler, setDraftRuler] = useState<DraftRulerState | null>(null)\n\n const draftFreeDrawRef = useRef<{\n screenPoints: ScreenPoint[]\n geoPoints: GeoPoint[]\n } | null>(null)\n const rafIdRef = useRef<number | null>(null)\n\n const clearDraftFreeDraw = () => {\n draftFreeDrawRef.current = null\n if (rafIdRef.current !== null) {\n window.cancelAnimationFrame(rafIdRef.current)\n rafIdRef.current = null\n }\n }\n\n const getRelativeScreenPoint = (e: React.PointerEvent<HTMLDivElement>): ScreenPoint => {\n if (!map) return { x: 0, y: 0 }\n const rect = map.getContainer().getBoundingClientRect()\n return { x: e.clientX - rect.left, y: e.clientY - rect.top }\n }\n\n const handleInteractionPointerDown = (e: React.PointerEvent<HTMLDivElement>) => {\n if (e.button !== 0 || !map) return\n e.stopPropagation()\n e.preventDefault()\n\n const mapContainer = map.getContainer()\n const pt = getRelativeScreenPoint(e)\n const geo = screenToGeo(map, pt)\n\n if (activeTool === 'freedraw') {\n startFreeDrawDrag(map, mapContainer, pt, geo, activeColor, strokeWidth, dashed, draftFreeDrawRef, rafIdRef, paintCanvas, addItem, setActiveTool)\n return\n }\n\n if (activeTool === 'shape') {\n startShapeDrag(map, mapContainer, pt, geo, activeShape, activeColor, shapeFilled, strokeWidth, dashed, setDraftShape, addItem, setActiveTool)\n return\n }\n\n if (activeTool === 'ruler') {\n startRulerDrag(map, mapContainer, pt, geo, activeColor, strokeWidth, dashed, setDraftRuler, addItem, setActiveTool)\n return\n }\n\n if (activeTool === 'note') {\n addItem(createDraftNote(geo, noteColor, labels?.noteDefaultTitle))\n if (!e.shiftKey) setActiveTool('select')\n return\n }\n\n if (activeTool === 'text') {\n const zoom = typeof map?.getZoom === 'function' ? map.getZoom() : 14\n addItem(createDraftText(geo, activeColor, fontSize, fontWeight, zoom))\n if (!e.shiftKey) setActiveTool('select')\n return\n }\n\n const arrowStyle = TOOL_TO_ARROW_STYLE[activeTool]\n if (arrowStyle) {\n if (draftArrow) {\n const startScreen = geoToScreen(map, draftArrow.startGeo)\n const finalScreen = e.shiftKey ? constrainAngleTo45Degrees(startScreen, pt) : pt\n addItem(buildArrowItem(draftArrow.arrowStyle, draftArrow.startGeo, screenToGeo(map, finalScreen), activeColor, strokeWidth, dashed))\n setDraftArrow(null)\n setActiveTool('select')\n return\n }\n\n startArrowDrag(map, mapContainer, pt, geo, arrowStyle, activeColor, strokeWidth, dashed, setDraftArrow, addItem, setActiveTool)\n }\n }\n\n const handleInteractionPointerMove = (e: React.PointerEvent<HTMLDivElement>) => {\n if (!draftArrow || !map) return\n const rawPt = getRelativeScreenPoint(e)\n const startScreen = geoToScreen(map, draftArrow.startGeo)\n const pt = e.shiftKey ? constrainAngleTo45Degrees(startScreen, rawPt) : rawPt\n setDraftArrow((prev) => (prev ? { ...prev, currentGeo: screenToGeo(map, pt) } : null))\n }\n\n return {\n draftArrow,\n setDraftArrow,\n draftShape,\n setDraftShape,\n draftRuler,\n setDraftRuler,\n draftFreeDrawRef,\n clearDraftFreeDraw,\n handleInteractionPointerDown,\n handleInteractionPointerMove,\n }\n}\n","'use client'\n\nimport { useEffect } from 'react'\nimport type L from 'leaflet'\nimport { bindBlockMapDblClick } from '../../../core/features/map-sync.js'\n\nexport function useBlockMapDblClick(map: L.Map | null) {\n useEffect(() => {\n if (!map) return\n return bindBlockMapDblClick(map)\n }, [map])\n}\n","import { useEffect, useMemo, useRef } from 'react'\nimport type L from 'leaflet'\nimport type { CanvasItem, CanvasTool } from '../../types/index.js'\n\nexport function useStableItemArray<T extends CanvasItem>(\n items: CanvasItem[],\n type: T['type'],\n): T[] {\n const prevRef = useRef<T[]>([])\n return useMemo(() => {\n const next = items.filter((it): it is T => it.type === type)\n if (\n prevRef.current.length === next.length &&\n prevRef.current.every((item, i) => item === next[i])\n ) {\n return prevRef.current\n }\n prevRef.current = next\n return next\n }, [items, type])\n}\n\nexport function useOutsideCanvasPointerDown(\n map: L.Map | null,\n isReadOnly: boolean,\n activeTool: CanvasTool,\n setActiveTool: (tool: CanvasTool) => void,\n selectedId: string | null,\n setSelectedId: (id: string | null) => void,\n notifyChangeComplete: () => void,\n) {\n useEffect(() => {\n if (!map || isReadOnly) return\n\n const handleWindowPointerDown = (e: PointerEvent) => {\n if (e.button !== 0) return\n const target = e.target as HTMLElement | null\n const mapEl = map.getContainer()\n if (\n mapEl.contains(target) ||\n target?.closest?.(\n '[data-rlc-overlay], [data-rlc-toolbar], [data-rlc-note], [data-rlc-text], .leaflet-control',\n )\n ) {\n return\n }\n\n if (activeTool !== 'select') setActiveTool('select')\n if (selectedId) setSelectedId(null)\n notifyChangeComplete()\n }\n\n window.addEventListener('pointerdown', handleWindowPointerDown)\n return () => window.removeEventListener('pointerdown', handleWindowPointerDown)\n }, [map, isReadOnly, activeTool, setActiveTool, selectedId, setSelectedId, notifyChangeComplete])\n}\n\n"],"mappings":";+kBAAA,IAAAA,GAAA,GAAAC,GAAAD,GAAA,mBAAAE,GAAA,6BAAAC,GAAA,sBAAAC,GAAA,8BAAAC,GAAA,oBAAAC,GAAA,sBAAAC,GAAA,yBAAAC,GAAA,yBAAAC,GAAA,iCAAAC,GAAA,sBAAAC,GAAA,2BAAAC,GAAA,kBAAAC,GAAA,sBAAAC,GAAA,gBAAAC,GAAA,gBAAAC,GAAA,kBAAAC,GAAA,yBAAAC,GAAA,wBAAAC,GAAA,gBAAAC,GAAA,YAAAC,GAAA,yBAAAC,GAAA,oBAAAC,GAAA,mBAAAC,GAAA,mBAAAC,GAAA,8BAAAC,GAAA,0BAAAC,GAAA,0BAAAC,GAAA,sBAAAC,GAAA,sBAAAC,GAAA,kCAAAC,GAAA,8BAAAC,GAAA,2BAAAC,GAAA,oBAAAC,GAAA,oBAAAC,GAAA,aAAAC,GAAA,wBAAAC,GAAA,kCAAAC,GAAA,sBAAAC,GAAA,gCAAAC,GAAA,8BAAAC,GAAA,sBAAAC,GAAA,kBAAAC,GAAA,qBAAAC,GAAA,wBAAAC,GAAA,4BAAAC,GAAA,gBAAAC,GAAA,+BAAAC,GAAA,+BAAAC,GAAA,6BAAAC,GAAA,qBAAAC,GAAA,4BAAAC,GAAA,yBAAAC,GAAA,iBAAAC,GAAA,uBAAAC,GAAA,oBAAAC,GAAA,iBAAAC,GAAA,uBAAAC,GAAA,iBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,iBAAAC,GAAA,oBAAAC,GAAA,iBAAAC,GAAA,iBAAAC,GAAA,wBAAAC,GAAA,2BAAAC,GAAA,wBAAAC,GAAA,wBAAAC,GAAA,qBAAAC,GAAA,gBAAAC,EAAA,uBAAAC,GAAA,mBAAAC,GAAA,yBAAAC,GAAA,0BAAAC,GAAA,sBAAAC,GAAA,uBAAAC,GAAA,mBAAAC,GAAA,yBAAAC,GAAA,uBAAAC,GAAA,mBAAAC,GAAA,yBAAAC,GAAA,mBAAAC,GAAA,sBAAAC,GAAA,uBAAAC,GAAA,qBAAAC,GAAA,mBAAAC,GAAA,mBAAAC,KAAA,eAAAC,GAAAzF,ICAA,IAAA0F,GAAA,CACE,KAAQ,eACR,QAAW,QACX,YAAe,2MACf,KAAQ,SACR,YAAe,GACf,KAAQ,mBACR,OAAU,kBACV,MAAS,oBACT,QAAW,CACT,IAAK,CACH,MAAS,oBACT,OAAU,CACR,MAAS,oBACT,QAAW,iBACb,EACA,QAAW,CACT,MAAS,qBACT,QAAW,kBACb,EACA,QAAW,iBACb,EACA,SAAU,CACR,MAAS,oBACT,OAAU,CACR,MAAS,oBACT,QAAW,iBACb,EACA,QAAW,CACT,MAAS,qBACT,QAAW,kBACb,EACA,QAAW,iBACb,EACA,UAAW,CACT,MAAS,oBACT,OAAU,CACR,MAAS,oBACT,QAAW,iBACb,EACA,QAAW,CACT,MAAS,qBACT,QAAW,kBACb,EACA,QAAW,iBACb,EACA,iBAAkB,gBACpB,EACA,MAAS,CACP,OACA,WACF,EACA,OAAU,eACV,QAAW,MACX,WAAc,CACZ,KAAQ,MACR,IAAO,uDACP,UAAa,uBACf,EACA,KAAQ,CACN,IAAO,qDACT,EACA,cAAiB,CACf,OAAU,SACV,SAAY,6BACd,EACA,SAAY,CACV,UACA,eACA,OACA,QACA,SACA,aACA,YACA,SACA,QACA,MACA,UACA,qBACA,aACA,QACA,eACF,EACA,QAAW,CACT,MAAS,OACT,IAAO,eACP,KAAQ,0BACR,UAAa,eACb,OAAU,uCACV,eAAgB,uCAChB,KAAQ,aACR,aAAc,SACd,QAAW,oBACX,QAAW,oCACb,EACA,iBAAoB,CAClB,QAAW,SACX,MAAS,qBACT,YAAa,qBACb,gBAAiB,kBACnB,EACA,qBAAwB,CACtB,MAAS,CACP,SAAY,EACd,EACA,YAAa,CACX,SAAY,EACd,EACA,gBAAiB,CACf,SAAY,EACd,CACF,EACA,gBAAmB,CACjB,kBAAmB,UACnB,uBAAwB,UACxB,yBAA0B,UAC1B,iBAAkB,UAClB,cAAe,WACf,eAAgB,UAChB,mBAAoB,UACpB,OAAU,UACV,4BAA6B,SAC7B,MAAS,UACT,QAAW,SACX,SAAY,SACZ,MAAS,UACT,YAAa,UACb,gBAAiB,SACjB,KAAQ,SACR,WAAc,SACd,oBAAqB,UACrB,OAAU,QACZ,CACF,ECnIO,IAAMC,GAA8D,CACzE,eAAgB,SAChB,eAAgB,SAChB,WAAY,KACZ,cAAe,QACf,gBAAiB,SACnB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","names":["react_exports","__export","CanvasToolbar","DEFAULT_ANNOTATION_THEME","DEFAULT_FONT_SIZE","DEFAULT_FONT_SIZE_OPTIONS","DEFAULT_NOTE_BG","DEFAULT_NOTE_TEXT","DEFAULT_STROKE_COLOR","DEFAULT_STROKE_WIDTH","DEFAULT_STROKE_WIDTH_OPTIONS","FONT_SIZE_OPTIONS","InlineShapeLabelEditor","LeafletCanvas","NOTE_COLOR_THEMES","NoteOverlay","PixelSelect","STROKE_COLORS","STROKE_WIDTH_OPTIONS","TOOL_TO_ARROW_STYLE","TextOverlay","VERSION","bindBlockMapDblClick","bindLeafletSync","buildArrowItem","buildRulerItem","calculateGeodesicDistance","calculateLineDistance","calculateZoomFontSize","clampNotePosition","clampTextPosition","computeDefaultControlGeoPoint","constrainAngleTo45Degrees","constrainToAspectRatio","createDraftNote","createDraftText","createId","createLeafletCanvas","createLeafletCanvasController","createLeafletTual","createLeafletTualController","distanceToQuadraticBezier","distanceToSegment","drawArrowHead","drawCanvasHandle","drawCanvasLabelPill","formatRealWorldDistance","geoToScreen","getCollapseChevronRotation","getDropdownChevronRotation","getExpandChevronRotation","getMapDimensions","getQuadraticBezierPoint","getQuadraticEndAngle","hitTestArrow","hitTestArrowHandle","hitTestFreeDraw","hitTestRuler","hitTestRulerHandle","hitTestShape","hitTestShapeHandle","paintLeafletCanvas","projectArrow","projectFreeDraw","projectRuler","projectShape","renderArrowOnCanvas","renderFreeDrawOnCanvas","renderRulerOnCanvas","renderShapeOnCanvas","resolveNoteTheme","screenToGeo","startArrowBodyDrag","startArrowDrag","startArrowHandleDrag","startFreeDrawBodyDrag","startFreeDrawDrag","startRulerBodyDrag","startRulerDrag","startRulerHandleDrag","startShapeBodyDrag","startShapeDrag","startShapeHandleDrag","traceArrowPath","tracePolygonShape","truncateCanvasText","useLeafletCanvas","useLeafletSync","useLeafletTual","__toCommonJS","package_default","TOOL_TO_ARROW_STYLE","STROKE_COLORS","NOTE_COLOR_THEMES","DEFAULT_STROKE_COLOR","DEFAULT_STROKE_WIDTH","DEFAULT_STROKE_WIDTH_OPTIONS","STROKE_WIDTH_OPTIONS","DEFAULT_NOTE_BG","DEFAULT_NOTE_TEXT","DEFAULT_FONT_SIZE","DEFAULT_FONT_SIZE_OPTIONS","FONT_SIZE_OPTIONS","DEFAULT_ANNOTATION_THEME","idCounter","createId","prefix","randomPart","geoToScreen","map","point","containerPt","screenToGeo","latLng","constrainToAspectRatio","anchor","target","aspectRatio","safeRatio","dx","dy","absDx","absDy","signX","signY","constrainAngleTo45Degrees","dist","angle","snapStep","snappedAngle","computeDefaultControlGeoPoint","start","end","curvature","midLat","midLng","dLat","dLng","getQuadraticBezierPoint","p0","p1","p2","t","invT","getQuadraticEndAngle","distanceToSegment","p","v","w","l2","projX","projY","distanceToQuadraticBezier","steps","minDistance","prev","i","curr","getMapDimensions","size","rect","truncateCanvasText","ctx","text","maxWidth","ellipsis","low","high","best","mid","candidate","calculateZoomFontSize","initialFontSize","currentZoom","baseZoom","options","factor","min","max","scaled","calculateGeodesicDistance","lat1","lat2","sinDLat","sinDLng","a","formatRealWorldDistance","meters","unit","feet","miles","km","calculateLineDistance","points","total","drawCanvasHandle","ctx","pt","strokeColor","fillColor","radius","strokeWidth","drawCanvasLabelPill","label","midX","midY","maxAllowedBoxWidth","theme","padX","maxTextWidth","displayText","truncateCanvasText","metrics","boxW","boxH","boxX","boxY","borderRadius","drawArrowHead","ctx","tip","angle","size","color","filled","spread","x1","y1","x2","y2","traceArrowPath","projected","arrowStyle","start","end","control","dx","dy","projectArrow","map","arrow","start","geoToScreen","end","needsOffsetControl","controlGeo","computeDefaultControlGeoPoint","control","renderArrowOnCanvas","ctx","projected","options","dist","theme","headSize","endAngle","startAngle","getQuadraticEndAngle","dx","dy","sdx","traceArrowPath","isDashed","headStyle","drawArrowHead","minArrowSize","rawMid","getQuadraticBezierPoint","fitToShape","maxW","drawCanvasLabelPill","handleRadius","fill","endpointColor","controlColor","strokeWidth","drawCanvasHandle","hitTestArrowHandle","point","tolerance","hitTestArrow","hitThreshold","distanceToQuadraticBezier","c1","c2","distanceToSegment","projectFreeDraw","map","item","pt","geoToScreen","traceSmoothPolyline","ctx","points","i","midX","midY","last","renderFreeDrawOnCanvas","screenPoints","options","theme","hitTestFreeDraw","point","tolerance","threshold","minX","minY","maxX","maxY","p","distanceToSegment","tracePolygonShape","ctx","proj","kind","theme","minX","minY","maxX","maxY","width","height","cx","cy","radius","rx","ry","i","angle","px","py","outerRx","outerRy","innerRx","innerRy","headCy","headRadius","neckY","hipY","armY","armSpan","legSpan","projectShape","map","shape","start","geoToScreen","end","minX","minY","maxX","maxY","width","height","renderShapeOnCanvas","ctx","projected","options","theme","tracePolygonShape","defaultFillOpacity","fillHex","minShapeSize","rawLabelY","fitToShape","maxW","drawCanvasLabelPill","handleRadius","fill","endpointColor","strokeWidth","drawCanvasHandle","hitTestShapeHandle","point","tolerance","hitTestShape","projectRuler","map","ruler","start","geoToScreen","end","mid","lengthPx","angle","renderRulerOnCanvas","ctx","projected","options","theme","perp","tickLen","dx","dy","distMeters","calculateGeodesicDistance","displayLabel","formatRealWorldDistance","fitToShape","maxW","drawCanvasLabelPill","handleRadius","fill","endpointColor","strokeWidth","drawCanvasHandle","hitTestRulerHandle","point","tolerance","hitTestRuler","hitThreshold","distanceToSegment","resolveNoteTheme","backgroundColor","matchedTheme","NOTE_COLOR_THEMES","t","isDarkBg","clampNotePosition","map","screenPos","item","isCompact","isDragging","clampToViewport","mapDims","getMapDimensions","cardWidth","cardHeight","pad","minX","maxX","minY","maxY","clampTextPosition","map","screenPos","item","dynamicFontSize","isCompact","isDragging","clampToViewport","mapDims","getMapDimensions","approxHalfW","approxHalfH","pad","minX","maxX","minY","maxY","startFreeDrawDrag","map","mapContainer","pt","geo","activeColor","strokeWidth","dashed","draftFreeDrawRef","rafIdRef","paintCanvas","addItem","setActiveTool","handleWindowMove","moveEvent","rect","currScreen","pts","prevPt","screenToGeo","handleWindowUp","upEvent","draft","createId","createDraftNote","geo","noteColor","defaultTitle","theme","NOTE_COLOR_THEMES","t","createId","createDraftText","activeColor","fontSize","fontWeight","currentZoom","startShapeDrag","map","mapContainer","startScreen","startGeo","activeShape","shapeFilled","strokeWidth","dashed","setDraftShape","addItem","setActiveTool","handleWindowMove","moveEvent","rect","rawScreen","currScreen","constrainToAspectRatio","screenToGeo","handleWindowUp","upEvent","rawEndScreen","endScreen","dragDist","finalStartGeo","finalEndGeo","buildArrowItem","arrowStyle","endGeo","computeDefaultControlGeoPoint","startArrowDrag","setDraftArrow","constrainAngleTo45Degrees","buildRulerItem","startRulerDrag","setDraftRuler","bindWindowDrag","map","onMove","onUp","startArrowHandleDrag","arrow","projected","handle","getLocalPoint","updateItem","moveEvent","rawPt","shouldLock","snappedPt","constrainAngleTo45Degrees","screenToGeo","startShapeHandleDrag","shape","anchorScreen","initialRatio","nextPt","constrainToAspectRatio","nextGeo","startArrowBodyDrag","originPt","initialStartScreen","initialEndScreen","initialControlScreen","hadCustomControl","dx","dy","patch","startShapeBodyDrag","startFreeDrawBodyDrag","fd","initialScreenPts","sp","startRulerHandleDrag","ruler","startRulerBodyDrag","paintLeafletCanvas","map","canvas","width","height","arrowItems","shapeItems","freeDrawItems","rulerItems","selectedId","draftShape","draftArrow","draftRuler","draftFreeDraw","activeColor","strokeWidth","dashed","shapeFilled","annotationTheme","arrowTheme","isReadOnly","effectiveTheme","dpr","targetW","targetH","ctx","fd","screenPts","projectFreeDraw","renderFreeDrawOnCanvas","shp","projected","projectShape","renderShapeOnCanvas","arrow","projectArrow","renderArrowOnCanvas","ruler","projectRuler","renderRulerOnCanvas","tempShape","tempArrow","tempRuler","bindLeafletSync","map","onSync","sync","size","bindBlockMapDblClick","container","handleDblClickCapture","e","target","hadFlag","previous","wasZoomEnabled","handleMouseDownCapture","handleUp","createLeafletCanvasController","options","maxPast","past","present","future","committedItems","activeTool","readOnly","selectedId","isEditingLabel","activeShape","shapeFilled","activeColor","DEFAULT_STROKE_COLOR","strokeWidth","DEFAULT_STROKE_WIDTH","dashed","noteColor","DEFAULT_NOTE_BG","fontSize","DEFAULT_FONT_SIZE","fontWeight","listeners","notifyListeners","listener","store","triggerChange","next","triggerChangeComplete","finalItems","targetItem","commitItems","updater","notifyChangeComplete","anchor","setSelectedId","id","prev","it","setActiveTool","tool","setReadOnly","nextReadOnly","patchSelected","predicate","patcher","setActiveShape","shape","setShapeFilled","filled","setActiveColor","color","setStrokeWidth","width","setDashed","nextDashed","setNoteColor","bg","theme","NOTE_COLOR_THEMES","t","setFontSize","size","setFontWeight","weight","setEditingLabel","editing","addItem","item","updateItem","patch","patchKeys","updated","removeItem","deleteSelected","clearAll","restored","json","parsed","createLeafletTualController","createLeafletCanvas","map","options","externalController","annotationTheme","arrowTheme","labels","zIndex","controllerOptions","controller","createLeafletCanvasController","mapContainer","container","canvas","drawingSurface","viewport","draftArrow","draftShape","draftRuler","draftFreeDrawRef","rafIdRef","setDraftArrow","next","repaint","setDraftShape","setDraftRuler","clearDraftFreeDraw","updateSurfaceInteractivity","isDrawing","items","paintLeafletCanvas","it","getLocalPoint","e","rect","handleSurfacePointerDown","pt","geo","screenToGeo","activeTool","activeShape","shapeFilled","activeColor","strokeWidth","dashed","noteColor","fontSize","fontWeight","startFreeDrawDrag","startShapeDrag","createDraftNote","createDraftText","startRulerDrag","arrowStyle","TOOL_TO_ARROW_STYLE","startArrowDrag","startScreen","geoToScreen","endScreen","constrainAngleTo45Degrees","buildArrowItem","handleSurfacePointerMove","rawPt","nextPt","handleContainerPointerDown","arrowItems","shapeItems","freeDrawItems","rulerItems","selectedId","selectedArrow","a","projected","projectArrow","handle","hitTestArrowHandle","startArrowHandleDrag","selectedShape","s","projectShape","hitTestShapeHandle","startShapeHandleDrag","selectedRuler","r","projectRuler","hitTestRulerHandle","startRulerHandleDrag","i","arrow","hitTestArrow","startArrowBodyDrag","shp","hitTestShape","startShapeBodyDrag","fd","initialScreenPts","projectFreeDraw","hitTestFreeDraw","startFreeDrawBodyDrag","ruler","hitTestRuler","startRulerBodyDrag","handleKeyDown","target","unbindSync","bindLeafletSync","dims","unbindDblClick","bindBlockMapDblClick","unsubscribeController","createLeafletTual","VERSION","package_default","import_react","import_jsx_runtime","InlineShapeLabelEditor","shape","map","labels","onUpdate","onClose","text","setText","inputRef","projected","projectShape","midX","midY","e","import_react","resolveNoteTheme","backgroundColor","matchedTheme","NOTE_COLOR_THEMES","t","isDarkBg","clampNotePosition","map","screenPos","item","isCompact","isDragging","clampToViewport","mapDims","getMapDimensions","cardWidth","cardHeight","pad","minX","maxX","minY","maxY","getDefaultNoteCardStyle","theme","isSelected","readOnly","unstyled","import_react","startNoteResize","options","e","item","map","cardRef","textareaRef","onSelect","onUpdate","onComplete","target","pointerId","startX","startY","startWidth","startHeight","rafId","latestWidth","latestHeight","hasMovedY","isTestEnv","flushUpdate","patch","handlePointerMove","moveEvent","dx","dy","handlePointerUp","useNoteDragResize","item","screenPos","map","readOnly","isCompact","cardRef","textareaRef","onSelect","onUpdate","onComplete","isDragging","setIsDragging","dragOffsetRef","didDragRef","dragStartPosRef","pendingCommitRef","commitResize","nextW","nextH","patch","textarea","ro","entries","entry","measuredW","measuredH","widthDiff","heightDiff","handleWindowPointerUp","e","rect","dragRafId","latestGeo","isTestEnv","flushDrag","handlePointerMove","moveEvent","nextX","nextY","screenToGeo","handlePointerUp","startNoteResize","startW","startH","handleUp","currentW","currentH","import_jsx_runtime","DEFAULT_ICONS","import_jsx_runtime","NoteCardHeader","item","theme","readOnly","unstyled","labels","icons","classNames","styles","onHeaderPointerDown","onCollapse","onSelect","onUpdate","onDelete","onComplete","headerBtnBaseStyle","e","DEFAULT_ICONS","import_jsx_runtime","NoteCardView","item","theme","isCompact","isDragging","readOnly","unstyled","labels","icons","classNames","styles","textareaRef","onHeaderPointerDown","onExpandFromCompact","onCollapse","onSelect","onUpdate","onDelete","onComplete","onTextareaPointerDown","DEFAULT_ICONS","NoteCardHeader","e","import_jsx_runtime","NoteCustomRenderView","item","screenPos","isSelected","isDragging","readOnly","isCompact","cardClassName","structuralRootStyle","styles","renderNote","onCardClick","onCardDoubleClick","handleHeaderPointerDown","handleResizePointerDown","onSelect","onUpdate","onDelete","e","patch","import_jsx_runtime","NoteOverlay","React","item","screenPos","isSelected","map","readOnly","labels","icons","unstyled","classNames","styles","clampToViewport","autoMinimizeZoomThreshold","renderNote","onSelect","onUpdate","onDelete","onComplete","cardRef","textareaRef","currentZoom","expandedLocally","setExpandedLocally","lastZoomRef","autoCompact","isCompact","isDragging","didDragRef","handleHeaderPointerDown","handleResizePointerDown","handleTextareaPointerDown","useNoteDragResize","el","stopPropagation","e","target","handleExpandFromCompact","theme","resolveNoteTheme","renderX","renderY","clampNotePosition","structuralRootStyle","cardClassName","handleCardClick","handleCardDoubleClick","NoteCustomRenderView","getDefaultNoteCardStyle","NoteCardView","import_react","clampTextPosition","map","screenPos","item","dynamicFontSize","isCompact","isDragging","clampToViewport","mapDims","getMapDimensions","approxHalfW","approxHalfH","pad","minX","maxX","minY","maxY","getTextCursor","readOnly","isEditing","import_react","useTextDrag","item","screenPos","map","readOnly","isEditing","onSelect","onUpdate","isDragging","setIsDragging","dragOffsetRef","didDragRef","dragStartPosRef","e","rect","handlePointerMove","moveEvent","nextX","nextY","screenToGeo","handlePointerUp","import_jsx_runtime","TextOverlayView","item","map","isCompact","isEditing","isSelected","readOnly","unstyled","dynamicFontSize","labels","classNames","styles","inputRef","setIsEditing","onUpdate","onComplete","finishEditing","e","handleUp","import_jsx_runtime","TextCustomRenderView","item","screenPos","isSelected","isEditing","isDragging","readOnly","isCompact","dynamicFontSize","dragHandleProps","wrapperClassName","structuralWrapperStyle","styles","renderText","onClick","onDoubleClick","setIsEditing","onSelect","onUpdate","onDelete","e","patch","import_jsx_runtime","TextOverlay","React","item","screenPos","isSelected","isEditingLabel","map","readOnly","labels","_icons","unstyled","classNames","styles","clampToViewport","autoMinimizeZoomThreshold","renderText","onSelect","onUpdate","onDelete","onComplete","isEditing","setIsEditing","expandedLocally","setExpandedLocally","inputRef","isDragging","didDragRef","handlePointerDown","useTextDrag","currentZoom","lastZoomRef","initialSize","baseZoom","dynamicFontSize","calculateZoomFontSize","isCompact","cursor","getTextCursor","dragHandleProps","wrapperClassName","renderX","renderY","clampTextPosition","structuralWrapperStyle","handleClick","e","handleDoubleClick","TextCustomRenderView","ed","TextOverlayView","import_react","useLeafletSync","map","viewport","setViewport","bindLeafletSync","width","height","prev","import_react","import_react","useCanvasHistory","options","initialItems","controlledItems","maxHistory","maxPast","callbacksRef","history","setHistory","historyRef","items","currentItemsRef","committedItemsRef","triggerChange","next","triggerChangeComplete","finalItems","targetItem","commitItems","updater","prev","notifyChangeComplete","current","anchor","undo","readOnly","restored","redo","import_react","useCanvasStyles","options","defaultColor","DEFAULT_STROKE_COLOR","defaultStrokeWidth","DEFAULT_STROKE_WIDTH","defaultNoteColor","DEFAULT_NOTE_BG","defaultFontSize","DEFAULT_FONT_SIZE","defaultShape","readOnly","selectedId","commitItems","activeShape","setActiveShapeState","shapeFilled","setShapeFilledState","activeColor","setActiveColorState","strokeWidth","setStrokeWidthState","dashed","setDashedState","noteColor","setNoteColorState","fontSize","setFontSizeState","fontWeight","setFontWeightState","patchSelected","predicate","patcher","prev","it","setActiveShape","shape","setShapeFilled","filled","setActiveColor","color","setStrokeWidth","width","setDashed","nextDashed","setNoteColor","bg","theme","NOTE_COLOR_THEMES","t","setFontSize","size","setFontWeight","weight","useLeafletCanvas","options","controlledItems","initialTool","defaultColor","defaultStrokeWidth","defaultNoteColor","defaultFontSize","defaultShape","items","history","historyRef","callbacksRef","commitItems","notifyChangeComplete","rawUndo","rawRedo","useCanvasHistory","activeToolState","setActiveToolState","readOnly","setReadOnly","prevOptionReadOnly","selectedId","setSelectedIdState","isEditingLabel","setIsEditingLabel","styles","useCanvasStyles","setSelectedId","idOrUpdater","prev","nextId","currentList","it","setActiveTool","tool","addItem","item","updateItem","id","patch","patchKeys","updated","removeItem","deleteSelected","clearAll","selectedItem","exportJSON","importJSON","json","parsed","useLeafletTual","import_react","DEFAULT_ENABLED_TOOLS","POSITION_STYLES","buildArrowOptions","labels","icons","DEFAULT_ICONS","buildShapeOptions","getToolbarButtonStyle","isActive","isVertical","showToolLabels","readOnly","unstyled","styles","getToolbarButtonClassName","classNames","getPopupPlacementStyle","position","orientation","centerHorizontally","isRight","isLeft","isBottom","getToolbarContainerStyle","getActiveToolInfo","activeTool","isArrowToolActive","currentArrowIcon","arrowGroupLabel","currentShapeIcon","shapesGroupLabel","ARROW_TOOL_IDS","isArrowTool","tool","ARROW_TOOL_IDS","getDropdownChevronRotation","isOpen","position","orientation","getCollapseChevronRotation","getExpandChevronRotation","import_jsx_runtime","CollapseTriggerButton","position","orientation","isVertical","showToolLabels","unstyled","labels","icons","classNames","styles","onCollapse","rotation","getCollapseChevronRotation","icon","DEFAULT_ICONS","ExpandTriggerButton","activeToolInfo","onExpand","getExpandChevronRotation","getHistoryBtnStyle","enabled","isVertical","showToolLabels","unstyled","styles","getActionRowStyle","color","extraStyle","import_jsx_runtime","ActionButtons","readOnly","showHistoryControls","showDeleteButton","showClearButton","showToolLabels","selectedItem","itemsCount","canUndo","canRedo","undo","redo","deleteSelected","clearAll","orientation","labels","icons","unstyled","classNames","styles","isVertical","renderActionContent","icon","label","getHistoryBtnClass","enabled","undoBtn","getHistoryBtnStyle","DEFAULT_ICONS","redoBtn","getActionRowStyle","import_react","import_react","import_jsx_runtime","ArrowDropdown","isOpen","readOnly","isArrowToolActive","activeTool","arrowOptions","arrowGroupLabel","currentArrowIcon","showToolLabels","icons","unstyled","classNames","styles","position","orientation","arrowGroupRef","getButtonClassName","getButtonStyle","onToggle","onSelectOption","hoveredOption","setHoveredOption","React","isVertical","popupPlacementStyle","getPopupPlacementStyle","chevronRotation","getDropdownChevronRotation","chevronIcon","DEFAULT_ICONS","option","isOptionActive","isHovered","import_react","import_react","import_jsx_runtime","ShapesModalGrid","shapeOptions","activeShape","isShapeToolActive","unstyled","classNames","styles","onSelectShape","hoveredKind","setHoveredKind","React","shapeOpt","isSelectedShape","isHovered","import_jsx_runtime","ShapesModal","isOpen","readOnly","isShapeToolActive","activeShape","shapeOptions","shapesGroupLabel","currentShapeIcon","showToolLabels","labels","icons","unstyled","classNames","styles","position","orientation","shapesGroupRef","getButtonClassName","getButtonStyle","onToggle","onSelectShape","isVertical","popupPlacementStyle","getPopupPlacementStyle","chevronRotation","getDropdownChevronRotation","chevronIcon","DEFAULT_ICONS","React","e","ShapesModalGrid","import_jsx_runtime","ToolbarToolButtons","props","controller","readOnly","position","orientation","isVertical","showToolLabels","enabledTools","customTools","labels","icons","unstyled","classNames","styles","arrowOptions","shapeOptions","arrowGroupLabel","currentArrowIcon","shapesGroupLabel","currentShapeIcon","isArrowToolActive","isShapeToolActive","arrowDropdownOpen","shapesModalOpen","arrowGroupRef","shapesGroupRef","setArrowDropdownOpen","setShapesModalOpen","getButtonClassName","getButtonStyle","activeTool","setActiveTool","activeShape","setActiveShape","renderToolButtonInner","icon","label","renderSimpleToolBtn","tool","shortcut","allowInReadOnly","isActive","groupId","DEFAULT_ICONS","ArrowDropdown","o","id","ShapesModal","kind","custom","React","import_jsx_runtime","PrimaryToolbarStrip","props","controller","readOnly","position","orientation","isVertical","showToolLabels","collapsible","showCollapseButton","enabledTools","customTools","showHistoryControls","showDeleteButton","showClearButton","labels","icons","unstyled","classNames","styles","arrowOptions","shapeOptions","arrowGroupLabel","currentArrowIcon","shapesGroupLabel","currentShapeIcon","isArrowToolActive","isShapeToolActive","arrowDropdownOpen","shapesModalOpen","arrowGroupRef","shapesGroupRef","setArrowDropdownOpen","setShapesModalOpen","getButtonClassName","getButtonStyle","onCollapse","ToolbarToolButtons","ActionButtons","CollapseTriggerButton","import_react","import_jsx_runtime","PixelSelect","label","value","options","onChange","control","unstyled","classNames","styles","icons","merged","a","chevronIcon","DEFAULT_ICONS","e","v","import_jsx_runtime","ContextualSettingsBar","props","isArrowContext","isFreeDrawContext","isShapeContext","isRulerContext","isTextContext","isNoteContext","selectedItem","selectedShape","selectedArrow","selectedText","activeColor","setActiveColor","strokeWidth","setStrokeWidth","strokeWidthOptions","dashed","setDashed","shapeFilled","setShapeFilled","noteColor","setNoteColor","fontSize","setFontSize","fontSizeOptions","fontWeight","setFontWeight","updateItem","notifyChangeComplete","isEditingLabel","setEditingLabel","strokeColors","orientation","labels","icons","unstyled","classNames","styles","isVertical","shapeInputRef","arrowInputRef","textInputRef","hasShapeLabelMode","hasArrowLabelMode","getToggleBtnStyle","active","bold","getToggleBtnClass","getInputStyle","w","dividerEl","isDashedActive","isFilledActive","isBold","c","selected","PixelSelect","DEFAULT_STROKE_WIDTH_OPTIONS","e","next","DEFAULT_FONT_SIZE_OPTIONS","val","DEFAULT_ICONS","NOTE_COLOR_THEMES","theme","import_react","useToolbarContext","controller","readOnly","activeTool","selectedItem","arrowDropdownOpen","setArrowDropdownOpen","shapesModalOpen","setShapesModalOpen","arrowGroupRef","shapesGroupRef","handleOutsideClick","e","isArrowToolActive","isArrowTool","isShapeToolActive","isArrowContext","isFreeDrawContext","isShapeContext","isRulerContext","isNoteContext","isTextContext","import_jsx_runtime","CanvasToolbar","controller","position","propOrientation","collapsible","defaultCollapsed","propCollapsed","onCollapsedChange","showCollapseButton","propReadOnly","enabledTools","DEFAULT_ENABLED_TOOLS","customTools","showHistoryControls","showDeleteButton","showClearButton","explicitShowToolLabels","labels","icons","unstyled","classNames","styles","strokeColors","STROKE_COLORS","strokeWidthOptions","fontSizeOptions","className","style","readOnly","orientation","isVertical","showToolLabels","internalCollapsed","setInternalCollapsed","isCollapsed","handleToggleCollapse","next","activeTool","activeShape","selectedItem","isArrowToolActive","isShapeToolActive","isArrowContext","isFreeDrawContext","isShapeContext","isRulerContext","isNoteContext","isTextContext","showSettingsBar","arrowDropdownOpen","setArrowDropdownOpen","shapesModalOpen","setShapesModalOpen","arrowGroupRef","shapesGroupRef","useToolbarContext","arrowOptions","buildArrowOptions","shapeOptions","buildShapeOptions","activeArrowDef","a","arrowGroupLabel","currentArrowIcon","DEFAULT_ICONS","activeShapeDef","s","shapesGroupLabel","currentShapeIcon","activeToolInfo","getActiveToolInfo","stopEvent","e","POSITION_STYLES","ExpandTriggerButton","getToolbarContainerStyle","PrimaryToolbarStrip","active","getToolbarButtonClassName","getToolbarButtonStyle","ContextualSettingsBar","import_react_dom","import_react_leaflet","import_jsx_runtime","LeafletCanvasDom","props","map","canvasRef","viewport","isReadOnly","isDrawingTool","activeTool","hoverCursor","zIndex","className","style","classNames","styles","handleInteractionPointerDown","handleInteractionPointerMove","noteItems","textItems","selectedId","labels","icons","unstyled","clampOverlaysToViewport","autoMinimizeNotesZoom","autoMinimizeTextZoom","renderNote","renderText","setSelectedId","updateItem","removeItem","notifyChangeComplete","renderToolbar","showToolbar","controller","toolbarPosition","toolbarOrientation","collapsible","defaultCollapsed","collapsed","onCollapsedChange","showCollapseButton","enabledTools","customTools","showHistoryControls","showDeleteButton","showClearButton","showToolLabels","strokeColors","strokeWidthOptions","fontSizeOptions","note","NoteOverlay","geoToScreen","txt","TextOverlay","selectedShape","s","InlineShapeLabelEditor","CanvasToolbar","import_react","import_react","useCanvasPainter","map","viewport","canvasRef","arrowItems","shapeItems","freeDrawItems","rulerItems","selectedId","draftShape","draftArrow","draftRuler","draftFreeDrawRef","activeColor","strokeWidth","dashed","shapeFilled","annotationTheme","arrowTheme","isReadOnly","paintCanvas","paintLeafletCanvas","import_react","useCanvasKeyboardShortcuts","isReadOnly","selectedId","selectedItem","items","_isEditingLabel","setEditingLabel","deleteSelected","setSelectedId","setActiveTool","setDraftArrow","setDraftShape","setDraftRuler","clearDraftFreeDraw","notifyChangeComplete","handleKeyDown","e","target","item","it","shape","focusInput","input","arrow","key","import_react","useSelectInteractions","map","activeTool","isReadOnly","arrowItems","shapeItems","freeDrawItems","rulerItems","selectedId","setSelectedId","setEditingLabel","updateItem","notifyChangeComplete","hoverCursor","setHoverCursor","container","getLocalPoint","e","rect","handlePointerMove","pt","selectedArrow","a","hitTestArrowHandle","projectArrow","selectedShape","s","hitTestShapeHandle","projectShape","selectedRuler","r","hitTestRulerHandle","projectRuler","i","arrow","hitTestArrow","hitTestShape","fd","hitTestFreeDraw","projectFreeDraw","ruler","hitTestRuler","handlePointerDown","projected","handle","startArrowHandleDrag","startShapeHandleDrag","startRulerHandleDrag","startArrowBodyDrag","shp","startShapeBodyDrag","initialScreenPts","startFreeDrawBodyDrag","startRulerBodyDrag","handleDblClick","focusInput","input","import_react","useDrawingInteractions","map","activeTool","setActiveTool","activeShape","shapeFilled","activeColor","strokeWidth","dashed","noteColor","fontSize","fontWeight","labels","addItem","paintCanvas","draftArrow","setDraftArrow","draftShape","setDraftShape","draftRuler","setDraftRuler","draftFreeDrawRef","rafIdRef","clearDraftFreeDraw","getRelativeScreenPoint","e","rect","mapContainer","pt","geo","screenToGeo","startFreeDrawDrag","startShapeDrag","startRulerDrag","createDraftNote","zoom","createDraftText","arrowStyle","TOOL_TO_ARROW_STYLE","startScreen","geoToScreen","finalScreen","constrainAngleTo45Degrees","buildArrowItem","startArrowDrag","rawPt","prev","import_react","useBlockMapDblClick","map","bindBlockMapDblClick","import_react","useStableItemArray","items","type","prevRef","next","it","item","i","useOutsideCanvasPointerDown","map","isReadOnly","activeTool","setActiveTool","selectedId","setSelectedId","notifyChangeComplete","handleWindowPointerDown","e","target","useLeafletCanvasOverlay","props","map","externalController","propReadOnly","propShowToolbar","annotationTheme","arrowTheme","labels","hookOptions","isReadOnly","internalController","useLeafletCanvas","controller","showToolbar","propCallbacksRef","notifyChangeComplete","targetItem","items","activeTool","setActiveTool","activeShape","shapeFilled","selectedId","setSelectedId","activeColor","strokeWidth","dashed","noteColor","fontSize","fontWeight","addItem","updateItem","removeItem","deleteSelected","useOutsideCanvasPointerDown","viewport","useLeafletSync","canvasRef","arrowItems","useStableItemArray","freeDrawItems","shapeItems","rulerItems","noteItems","textItems","draftArrow","setDraftArrow","draftShape","setDraftShape","draftRuler","setDraftRuler","draftFreeDrawRef","clearDraftFreeDraw","handleInteractionPointerDown","handleInteractionPointerMove","useDrawingInteractions","paintCanvas","useCanvasPainter","useCanvasKeyboardShortcuts","useBlockMapDblClick","hoverCursor","useSelectInteractions","import_jsx_runtime","LeafletCanvasWithContext","props","map","LeafletCanvasOverlay","LeafletCanvas","LeafletCanvasOverlay","props","map","toolbarPosition","toolbarOrientation","propOrientation","collapsible","defaultCollapsed","collapsed","onCollapsedChange","showCollapseButton","enabledTools","customTools","showHistoryControls","showDeleteButton","showClearButton","showToolLabels","labels","icons","zIndex","unstyled","classNames","styles","strokeColors","strokeWidthOptions","fontSizeOptions","renderToolbar","renderNote","renderText","clampOverlaysToViewport","autoMinimizeNotesZoom","autoMinimizeTextZoom","className","style","overlayState","useLeafletCanvasOverlay","LeafletCanvasDom"]}
1
+ {"version":3,"sources":["../src/react.ts","../package.json","../src/core/shared/constants.ts","../src/core/shared/geo.ts","../src/core/shared/tual-render.ts","../src/core/entities/arrow/arrow-geometry.ts","../src/core/entities/arrow/render-arrow.ts","../src/core/entities/freedraw/render-freedraw.ts","../src/core/entities/shape/trace-shape.ts","../src/core/entities/shape/render-shape.ts","../src/core/entities/ruler/render-ruler.ts","../src/core/entities/note/note-geometry.ts","../src/core/entities/text/text-geometry.ts","../src/core/features/freedraw-drag-handler.ts","../src/core/features/drawing-drag-handlers.ts","../src/core/features/select-drag-handlers.ts","../src/core/features/tual-painter.ts","../src/core/features/map-sync.ts","../src/core/features/tual-controller.ts","../src/core/features/create-leaflet-tual.ts","../src/core/index.ts","../src/react/entities/shape/InlineShapeLabelEditor.tsx","../src/react/entities/note/NoteOverlay.tsx","../src/react/entities/note/utils.ts","../src/react/entities/note/use-note-drag-resize.ts","../src/react/entities/note/note-resize-handler.ts","../src/react/widgets/TualToolbar/icons.tsx","../src/react/entities/note/NoteCardHeader.tsx","../src/react/entities/note/NoteCardView.tsx","../src/react/entities/note/NoteCustomRenderView.tsx","../src/react/entities/text/TextOverlay.tsx","../src/react/entities/text/utils.ts","../src/react/entities/text/use-text-drag.ts","../src/react/entities/text/TextOverlayView.tsx","../src/react/entities/text/TextCustomRenderView.tsx","../src/react/features/use-leaflet-sync.ts","../src/react/features/use-leaflet-tual.ts","../src/react/features/use-tual-history.ts","../src/react/features/use-tual-styles.ts","../src/react/widgets/TualToolbar/TualToolbar.tsx","../src/react/widgets/TualToolbar/constants.ts","../src/react/widgets/TualToolbar/toolbar-helpers.ts","../src/react/widgets/TualToolbar/types.ts","../src/react/widgets/TualToolbar/utils.ts","../src/react/widgets/TualToolbar/CollapseButtons.tsx","../src/react/widgets/TualToolbar/action-buttons-styles.ts","../src/react/widgets/TualToolbar/ActionButtons.tsx","../src/react/widgets/TualToolbar/ToolbarToolButtons.tsx","../src/react/widgets/TualToolbar/ArrowDropdown.tsx","../src/react/widgets/TualToolbar/ShapesModal.tsx","../src/react/widgets/TualToolbar/ShapesModalGrid.tsx","../src/react/widgets/TualToolbar/PrimaryToolbarStrip.tsx","../src/react/widgets/TualToolbar/ContextualSettingsBar.tsx","../src/react/widgets/TualToolbar/PixelSelect.tsx","../src/react/widgets/TualToolbar/use-toolbar-context.ts","../src/react/widgets/LeafletTual/LeafletTual.tsx","../src/react/widgets/LeafletTual/LeafletTualDom.tsx","../src/react/widgets/LeafletTual/use-leaflet-tual-overlay.ts","../src/react/widgets/LeafletTual/use-tual-painter.ts","../src/react/widgets/LeafletTual/use-tual-keyboard-shortcuts.ts","../src/react/widgets/LeafletTual/use-select-interactions.ts","../src/react/widgets/LeafletTual/use-drawing-interactions.ts","../src/react/widgets/LeafletTual/use-block-map-dblclick.ts","../src/react/widgets/LeafletTual/use-outside-tual-deselect.ts"],"sourcesContent":["/**\n * leaflet-tual/react — subpath entry for React components and hooks.\n *\n * Kept as a separate entry point so React peer dependencies are only ever\n * pulled in by consumers who explicitly import `leaflet-tual/react`.\n * The core (`leaflet-tual` / `leaflet-tual/core`) stays framework-agnostic.\n */\n\nexport * from './react/index.js'\n\n","{\n \"name\": \"leaflet-tual\",\n \"version\": \"1.0.0\",\n \"description\": \"Framework-agnostic interactive canvas and annotation toolkit for Leaflet maps — draw arrows, shapes, freehand sketches, rulers, notes, and text pinned to geo-coordinates. Optional React bindings.\",\n \"type\": \"module\",\n \"sideEffects\": false,\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n },\n \"default\": \"./dist/index.js\"\n },\n \"./core\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n },\n \"default\": \"./dist/index.js\"\n },\n \"./react\": {\n \"types\": \"./dist/react.d.ts\",\n \"import\": {\n \"types\": \"./dist/react.d.ts\",\n \"default\": \"./dist/react.js\"\n },\n \"require\": {\n \"types\": \"./dist/react.d.cts\",\n \"default\": \"./dist/react.cjs\"\n },\n \"default\": \"./dist/react.js\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"author\": \"Yusuf Arslan\",\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/yusufarsln98/leaflet-tual.git\",\n \"directory\": \"packages/leaflet-tual\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/yusufarsln98/leaflet-tual/issues\"\n },\n \"publishConfig\": {\n \"access\": \"public\",\n \"registry\": \"https://registry.npmjs.org/\"\n },\n \"keywords\": [\n \"leaflet\",\n \"leaflet-tual\",\n \"tual\",\n \"tuval\",\n \"canvas\",\n \"annotation\",\n \"map-tools\",\n \"arrows\",\n \"notes\",\n \"gis\",\n \"overlay\",\n \"framework-agnostic\",\n \"vanilla-js\",\n \"react\",\n \"react-leaflet\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"lint\": \"eslint src --ext ts,tsx\",\n \"typecheck\": \"tsc --noEmit\",\n \"format\": \"prettier --write \\\"src/**/*.{ts,tsx}\\\"\",\n \"format:check\": \"prettier --check \\\"src/**/*.{ts,tsx}\\\"\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"version\": \"changeset version\",\n \"release\": \"npm run build && changeset publish\"\n },\n \"peerDependencies\": {\n \"leaflet\": \"^1.9.0\",\n \"react\": \"^18.0.0 || ^19.0.0\",\n \"react-dom\": \"^18.0.0 || ^19.0.0\",\n \"react-leaflet\": \"^4.0.0 || ^5.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"react\": {\n \"optional\": true\n },\n \"react-dom\": {\n \"optional\": true\n },\n \"react-leaflet\": {\n \"optional\": true\n }\n },\n \"devDependencies\": {\n \"@changesets/cli\": \"^2.27.1\",\n \"@testing-library/dom\": \"^10.4.0\",\n \"@testing-library/react\": \"^16.2.0\",\n \"@types/leaflet\": \"^1.9.16\",\n \"@types/node\": \"^22.13.0\",\n \"@types/react\": \"^19.0.0\",\n \"@types/react-dom\": \"^19.0.0\",\n \"eslint\": \"^9.20.0\",\n \"eslint-plugin-react-hooks\": \"^5.1.0\",\n \"jsdom\": \"^26.0.0\",\n \"leaflet\": \"^1.9.4\",\n \"prettier\": \"^3.5.0\",\n \"react\": \"^19.0.0\",\n \"react-dom\": \"^19.0.0\",\n \"react-leaflet\": \"^5.0.0\",\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"^5.7.0\",\n \"typescript-eslint\": \"^8.24.0\",\n \"vitest\": \"^3.0.0\"\n }\n}\n","import type { ArrowStyle, TualAnnotationTheme } from '../types/index.js'\n\nexport const TOOL_TO_ARROW_STYLE: Record<string, ArrowStyle | undefined> = {\n 'arrow-linear': 'linear',\n 'arrow-curved': 'curved',\n 'arrow-bi': 'bi',\n 'arrow-elbow': 'elbow',\n 'arrow-s-curve': 's-curve',\n}\n\nexport const STROKE_COLORS = [\n '#000000', // Black (Default)\n '#4b5563', // Slate Gray\n '#2563eb', // Blue\n '#dc2626', // Red\n '#16a34a', // Green\n '#d97706', // Amber\n '#9333ea', // Purple\n '#0891b2', // Cyan\n] as const\n\nexport interface NoteColorTheme {\n name: string\n bg: string\n border: string\n header: string\n text: string\n}\n\nexport const NOTE_COLOR_THEMES: readonly NoteColorTheme[] = [\n {\n name: 'Amber',\n bg: '#fef9c3',\n border: '#fde047',\n header: '#fef08a',\n text: '#422006',\n },\n {\n name: 'Sky',\n bg: '#e0f2fe',\n border: '#7dd3fc',\n header: '#bae6fd',\n text: '#0c4a6e',\n },\n {\n name: 'Emerald',\n bg: '#dcfce7',\n border: '#86efac',\n header: '#bbf7d0',\n text: '#064e3b',\n },\n {\n name: 'Rose',\n bg: '#ffe4e6',\n border: '#fda4af',\n header: '#fecdd3',\n text: '#881337',\n },\n {\n name: 'Violet',\n bg: '#f3e8ff',\n border: '#d8b4fe',\n header: '#e9d5ff',\n text: '#3b0764',\n },\n {\n name: 'Dark Slate',\n bg: '#1e293b',\n border: '#334155',\n header: '#0f172a',\n text: '#f8fafc',\n },\n {\n name: 'Midnight',\n bg: '#111827',\n border: '#374151',\n header: '#030712',\n text: '#f9fafb',\n },\n] as const\n\nexport const DEFAULT_STROKE_COLOR = '#000000'\nexport const DEFAULT_STROKE_WIDTH = 2\nexport const DEFAULT_STROKE_WIDTH_OPTIONS: readonly number[] = [\n 1, 2, 3, 4, 5, 6, 8, 10, 12,\n] as const\nexport const STROKE_WIDTH_OPTIONS = DEFAULT_STROKE_WIDTH_OPTIONS\nexport const DEFAULT_NOTE_BG = '#fef9c3'\nexport const DEFAULT_NOTE_TEXT = '#422006'\nexport const DEFAULT_FONT_SIZE = 16\nexport const DEFAULT_FONT_SIZE_OPTIONS: readonly number[] = [\n 10, 12, 14, 16, 18, 20, 24, 28, 32, 36, 40, 48,\n] as const\nexport const FONT_SIZE_OPTIONS = DEFAULT_FONT_SIZE_OPTIONS\n\n/**\n * Super simple unified annotation default theme matching basic HTML element appearance.\n */\nexport const DEFAULT_ANNOTATION_THEME: Readonly<TualAnnotationTheme> = {\n selectionGlowColor: 'rgba(0, 0, 0, 0.2)',\n selectionGlowWidth: 6,\n guideLineDash: [4, 4],\n guideLineColor: 'rgba(100, 100, 100, 0.6)',\n guideLineWidth: 1.2,\n endpointHandleColor: '#4f4f4f',\n controlHandleColor: '#4f4f4f',\n handleFillColor: '#ffffff',\n handleRadius: 5,\n handleStrokeWidth: 2,\n shadowColor: 'rgba(0, 0, 0, 0.2)',\n shadowBlur: 3,\n shadowOffsetY: 1.5,\n labelBackgroundColor: '#ffffff',\n labelTextColor: '#000000',\n labelFont: '12px system-ui, -apple-system, sans-serif',\n labelBorderWidth: 1,\n labelBorderRadius: 2,\n labelPaddingX: 6,\n labelPaddingY: 18,\n shapeDefaultFillOpacity: 0.16,\n shapeBorderRadius: 0,\n} as const\n\n\n\n","import type L from 'leaflet'\nimport type { GeoPoint, ScreenPoint } from '../types/index.js'\n\nlet idCounter = 0\n\nexport function createId(prefix = 'rlc'): string {\n idCounter += 1\n const randomPart = Math.random().toString(36).slice(2, 8)\n return `${prefix}-${Date.now().toString(36)}-${idCounter}-${randomPart}`\n}\n\nexport function geoToScreen(map: L.Map, point: GeoPoint): ScreenPoint {\n const containerPt = map.latLngToContainerPoint([point.lat, point.lng])\n return { x: containerPt.x, y: containerPt.y }\n}\n\nexport function screenToGeo(map: L.Map, point: ScreenPoint): GeoPoint {\n const latLng = map.containerPointToLatLng([point.x, point.y])\n return { lat: latLng.lat, lng: latLng.lng }\n}\n\nexport function constrainToAspectRatio(\n anchor: ScreenPoint,\n target: ScreenPoint,\n aspectRatio = 1,\n): ScreenPoint {\n const safeRatio = aspectRatio > 0 ? aspectRatio : 1\n const dx = target.x - anchor.x\n const dy = target.y - anchor.y\n const absDx = Math.abs(dx)\n const absDy = Math.abs(dy)\n const signX = dx >= 0 ? 1 : -1\n const signY = dy >= 0 ? 1 : -1\n\n if (absDx / safeRatio >= absDy) {\n return {\n x: anchor.x + signX * absDx,\n y: anchor.y + signY * (absDx / safeRatio),\n }\n }\n return {\n x: anchor.x + signX * (absDy * safeRatio),\n y: anchor.y + signY * absDy,\n }\n}\n\nexport function constrainAngleTo45Degrees(\n anchor: ScreenPoint,\n target: ScreenPoint,\n): ScreenPoint {\n const dx = target.x - anchor.x\n const dy = target.y - anchor.y\n const dist = Math.hypot(dx, dy)\n if (dist === 0) return target\n const angle = Math.atan2(dy, dx)\n const snapStep = Math.PI / 4\n const snappedAngle = Math.round(angle / snapStep) * snapStep\n return {\n x: anchor.x + Math.cos(snappedAngle) * dist,\n y: anchor.y + Math.sin(snappedAngle) * dist,\n }\n}\n\nexport function computeDefaultControlGeoPoint(\n start: GeoPoint,\n end: GeoPoint,\n curvature = 0.25,\n): GeoPoint {\n const midLat = (start.lat + end.lat) / 2\n const midLng = (start.lng + end.lng) / 2\n const dLat = end.lat - start.lat\n const dLng = end.lng - start.lng\n return {\n lat: midLat + dLng * curvature,\n lng: midLng - dLat * curvature,\n }\n}\n\nexport function getQuadraticBezierPoint(\n p0: ScreenPoint,\n p1: ScreenPoint,\n p2: ScreenPoint,\n t: number,\n): ScreenPoint {\n const invT = 1 - t\n return {\n x: invT * invT * p0.x + 2 * invT * t * p1.x + t * t * p2.x,\n y: invT * invT * p0.y + 2 * invT * t * p1.y + t * t * p2.y,\n }\n}\n\nexport function getQuadraticEndAngle(\n p0: ScreenPoint,\n p1: ScreenPoint,\n p2: ScreenPoint,\n): number {\n const dx = p2.x - p1.x\n const dy = p2.y - p1.y\n if (Math.hypot(dx, dy) < 0.001) {\n return Math.atan2(p2.y - p0.y, p2.x - p0.x)\n }\n return Math.atan2(dy, dx)\n}\n\nexport function distanceToSegment(\n p: ScreenPoint,\n v: ScreenPoint,\n w: ScreenPoint,\n): number {\n const l2 = (w.x - v.x) ** 2 + (w.y - v.y) ** 2\n if (l2 === 0) return Math.hypot(p.x - v.x, p.y - v.y)\n let t = ((p.x - v.x) * (w.x - v.x) + (p.y - v.y) * (w.y - v.y)) / l2\n t = Math.max(0, Math.min(1, t))\n const projX = v.x + t * (w.x - v.x)\n const projY = v.y + t * (w.y - v.y)\n return Math.hypot(p.x - projX, p.y - projY)\n}\n\nexport function distanceToQuadraticBezier(\n p: ScreenPoint,\n p0: ScreenPoint,\n p1: ScreenPoint,\n p2: ScreenPoint,\n steps = 24,\n): number {\n let minDistance = Infinity\n let prev = p0\n for (let i = 1; i <= steps; i += 1) {\n const curr = getQuadraticBezierPoint(p0, p1, p2, i / steps)\n const dist = distanceToSegment(p, prev, curr)\n if (dist < minDistance) minDistance = dist\n prev = curr\n }\n return minDistance\n}\n\nexport function getMapDimensions(\n map: L.Map | null | undefined,\n): { width: number; height: number } | null {\n if (!map) return null\n try {\n const size = map.getSize?.()\n if (size && size.x > 0 && size.y > 0) return { width: size.x, height: size.y }\n } catch { /* ignore */ }\n try {\n const rect = map.getContainer?.()?.getBoundingClientRect?.()\n if (rect && rect.width > 0 && rect.height > 0) return { width: rect.width, height: rect.height }\n } catch { /* ignore */ }\n return null\n}\n\nexport function truncateTualText(\n ctx: CanvasRenderingContext2D,\n text: string,\n maxWidth: number,\n): string {\n if (!text || maxWidth <= 0) return ''\n if (ctx.measureText(text).width <= maxWidth) return text\n\n const ellipsis = '…'\n if (ctx.measureText(ellipsis).width >= maxWidth) return ''\n\n let low = 0\n let high = text.length\n let best = ''\n while (low <= high) {\n const mid = Math.floor((low + high) / 2)\n const candidate = text.slice(0, mid) + ellipsis\n if (ctx.measureText(candidate).width <= maxWidth) {\n best = candidate\n low = mid + 1\n } else {\n high = mid - 1\n }\n }\n return best || ellipsis\n}\n\nexport function calculateZoomFontSize(\n initialFontSize = 16,\n currentZoom: number | null,\n baseZoom = 14,\n options?: { min?: number; max?: number; scaleFactor?: number },\n): number {\n if (currentZoom === null || typeof currentZoom !== 'number') return initialFontSize\n const factor = options?.scaleFactor ?? 1.22\n const min = options?.min ?? 9\n const max = options?.max ?? 72\n const scaled = initialFontSize * Math.pow(factor, currentZoom - baseZoom)\n return Math.round(Math.max(min, Math.min(max, scaled)))\n}\n\nexport function calculateGeodesicDistance(p1: GeoPoint, p2: GeoPoint): number {\n const R = 6371000 // Earth radius in meters\n const dLat = ((p2.lat - p1.lat) * Math.PI) / 180\n const dLng = ((p2.lng - p1.lng) * Math.PI) / 180\n const lat1 = (p1.lat * Math.PI) / 180\n const lat2 = (p2.lat * Math.PI) / 180\n\n const sinDLat = Math.sin(dLat / 2)\n const sinDLng = Math.sin(dLng / 2)\n const a = sinDLat * sinDLat + Math.cos(lat1) * Math.cos(lat2) * sinDLng * sinDLng\n const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))\n return R * c\n}\n\nexport function formatRealWorldDistance(\n meters: number,\n unit: 'metric' | 'imperial' = 'metric',\n): string {\n if (unit === 'imperial') {\n const feet = meters * 3.28084\n if (feet < 1000) {\n return `${Math.round(feet)} ft`\n }\n const miles = feet / 5280\n return `${miles >= 10 ? miles.toFixed(1) : miles.toFixed(2)} mi`\n }\n\n if (meters < 1000) {\n return `${Math.round(meters)} m`\n }\n const km = meters / 1000\n return `${km >= 10 ? km.toFixed(1) : km.toFixed(2)} km`\n}\n\nexport function calculateLineDistance(points: GeoPoint[]): number {\n let total = 0\n for (let i = 0; i < points.length - 1; i += 1) {\n total += calculateGeodesicDistance(points[i], points[i + 1])\n }\n return total\n}\n","import type { TualAnnotationTheme, ScreenPoint } from '../types/index.js'\nimport { truncateTualText } from './geo.js'\n\nexport function drawTualHandle(\n ctx: CanvasRenderingContext2D,\n pt: ScreenPoint,\n strokeColor: string,\n fillColor: string,\n radius: number,\n strokeWidth = 2,\n) {\n ctx.save()\n ctx.beginPath()\n ctx.arc(pt.x, pt.y, radius, 0, Math.PI * 2)\n ctx.fillStyle = fillColor\n ctx.fill()\n ctx.lineWidth = strokeWidth\n ctx.strokeStyle = strokeColor\n ctx.stroke()\n ctx.restore()\n}\n\nexport function drawTualLabelPill(\n ctx: CanvasRenderingContext2D,\n label: string,\n midX: number,\n midY: number,\n strokeColor: string,\n maxAllowedBoxWidth: number,\n theme?: TualAnnotationTheme,\n) {\n ctx.save()\n ctx.font = theme?.labelFont ?? '12px system-ui, -apple-system, sans-serif'\n const padX = theme?.labelPaddingX ?? 6\n const maxTextWidth = Math.max(10, maxAllowedBoxWidth - padX * 2)\n const displayText = truncateTualText(ctx, label, maxTextWidth)\n\n if (displayText) {\n const metrics = ctx.measureText(displayText)\n const boxW = Math.round(metrics.width + padX * 2)\n const boxH = theme?.labelPaddingY ?? 18\n const boxX = Math.round(midX - boxW / 2)\n const boxY = Math.round(midY - boxH / 2)\n const borderRadius = theme?.labelBorderRadius ?? 2\n\n if (theme?.labelShadowColor) {\n ctx.shadowColor = theme.labelShadowColor\n ctx.shadowBlur = theme.labelShadowBlur ?? 3\n }\n\n ctx.fillStyle = theme?.labelBackgroundColor ?? '#ffffff'\n ctx.strokeStyle = theme?.labelBorderColor ?? strokeColor\n ctx.lineWidth = theme?.labelBorderWidth ?? 1\n ctx.beginPath()\n if (typeof ctx.roundRect === 'function') {\n ctx.roundRect(boxX, boxY, boxW, boxH, borderRadius)\n } else {\n ctx.rect(boxX, boxY, boxW, boxH)\n }\n ctx.fill()\n ctx.stroke()\n\n ctx.fillStyle = theme?.labelTextColor ?? '#000000'\n ctx.textAlign = 'center'\n ctx.textBaseline = 'middle'\n ctx.fillText(displayText, midX, midY)\n }\n ctx.restore()\n}\n\n","import type { ArrowItem, ScreenPoint } from '../../types/index.js'\nimport type { ProjectedArrow } from './render-arrow.js'\n\nexport function drawArrowHead(\n ctx: CanvasRenderingContext2D,\n tip: ScreenPoint,\n angle: number,\n size: number,\n color: string,\n filled = true,\n) {\n const spread = Math.PI / 6.5\n const x1 = tip.x - size * Math.cos(angle - spread)\n const y1 = tip.y - size * Math.sin(angle - spread)\n const x2 = tip.x - size * Math.cos(angle + spread)\n const y2 = tip.y - size * Math.sin(angle + spread)\n\n ctx.save()\n ctx.setLineDash([])\n ctx.beginPath()\n ctx.moveTo(tip.x, tip.y)\n ctx.lineTo(x1, y1)\n if (filled) {\n ctx.lineTo(x2, y2)\n ctx.closePath()\n ctx.fillStyle = color\n ctx.fill()\n } else {\n ctx.moveTo(tip.x, tip.y)\n ctx.lineTo(x2, y2)\n ctx.strokeStyle = color\n ctx.lineWidth = Math.max(2, size / 4.5)\n ctx.lineCap = 'round'\n ctx.stroke()\n }\n ctx.restore()\n}\n\nexport function traceArrowPath(\n ctx: CanvasRenderingContext2D,\n projected: ProjectedArrow,\n arrowStyle: ArrowItem['arrowStyle'],\n) {\n const { start, end, control } = projected\n ctx.moveTo(start.x, start.y)\n if (arrowStyle === 'curved') {\n ctx.quadraticCurveTo(control.x, control.y, end.x, end.y)\n } else if (arrowStyle === 'elbow') {\n ctx.lineTo(control.x, start.y)\n ctx.lineTo(control.x, end.y)\n ctx.lineTo(end.x, end.y)\n } else if (arrowStyle === 's-curve') {\n const dx = end.x - start.x\n const dy = end.y - start.y\n ctx.bezierCurveTo(start.x + dx * 0.5, start.y, start.x + dx * 0.5, start.y + dy, end.x, end.y)\n } else {\n ctx.lineTo(end.x, end.y)\n }\n}\n\n","import type L from 'leaflet'\nimport type { ArrowItem, ArrowRenderTheme, ScreenPoint } from '../../types/index.js'\nimport {\n computeDefaultControlGeoPoint,\n distanceToQuadraticBezier,\n distanceToSegment,\n geoToScreen,\n getQuadraticBezierPoint,\n getQuadraticEndAngle,\n} from '../../shared/geo.js'\nimport { drawTualHandle, drawTualLabelPill } from '../../shared/tual-render.js'\nimport { drawArrowHead, traceArrowPath } from './arrow-geometry.js'\n\nexport type ArrowHandleType = 'start' | 'end' | 'control'\n\nexport interface ProjectedArrow {\n start: ScreenPoint\n end: ScreenPoint\n control: ScreenPoint\n}\n\nexport function projectArrow(map: L.Map, arrow: ArrowItem): ProjectedArrow {\n const start = geoToScreen(map, arrow.start)\n const end = geoToScreen(map, arrow.end)\n const needsOffsetControl =\n arrow.arrowStyle === 'curved' || arrow.arrowStyle === 's-curve'\n const controlGeo = arrow.controlPoint\n ? arrow.controlPoint\n : needsOffsetControl\n ? computeDefaultControlGeoPoint(arrow.start, arrow.end)\n : {\n lat: (arrow.start.lat + arrow.end.lat) / 2,\n lng: (arrow.start.lng + arrow.end.lng) / 2,\n }\n const control = geoToScreen(map, controlGeo)\n return { start, end, control }\n}\n\nexport function renderArrowOnCanvas(\n ctx: CanvasRenderingContext2D,\n projected: ProjectedArrow,\n arrow: Pick<\n ArrowItem,\n 'arrowStyle' | 'color' | 'strokeWidth' | 'dashed' | 'headStyle' | 'label'\n >,\n options: {\n isSelected?: boolean\n isPreview?: boolean\n theme?: ArrowRenderTheme\n } = {},\n) {\n const { start, end, control } = projected\n const dist = Math.hypot(end.x - start.x, end.y - start.y)\n if (dist < 2) return\n\n const theme = options.theme\n const headSize = Math.max(12, arrow.strokeWidth * 3.8)\n\n let endAngle = Math.atan2(end.y - start.y, end.x - start.x)\n let startAngle = Math.atan2(start.y - end.y, start.x - end.x)\n\n if (arrow.arrowStyle === 'curved') {\n endAngle = getQuadraticEndAngle(start, control, end)\n startAngle = getQuadraticEndAngle(end, control, start)\n } else if (arrow.arrowStyle === 'elbow') {\n const dx = end.x - control.x\n const dy = end.y - start.y\n endAngle = Math.abs(dx) > 1 ? Math.atan2(0, dx) : Math.atan2(dy, 0)\n const sdx = start.x - control.x\n startAngle = Math.abs(sdx) > 1 ? Math.atan2(0, sdx) : Math.atan2(-dy, 0)\n } else if (arrow.arrowStyle === 's-curve') {\n const dx = end.x - start.x\n endAngle = getQuadraticEndAngle(start, { x: start.x + dx * 0.5, y: end.y }, end)\n }\n\n ctx.save()\n if (options.isPreview) ctx.globalAlpha = 0.85\n\n if (options.isSelected) {\n ctx.save()\n ctx.beginPath()\n traceArrowPath(ctx, projected, arrow.arrowStyle)\n ctx.strokeStyle = theme?.selectionGlowColor ?? 'rgba(0, 0, 0, 0.2)'\n ctx.lineWidth = arrow.strokeWidth + (theme?.selectionGlowWidth ?? 6)\n ctx.lineCap = 'round'\n ctx.lineJoin = 'round'\n ctx.stroke()\n ctx.restore()\n }\n\n ctx.save()\n ctx.shadowColor = theme?.shadowColor ?? 'rgba(0, 0, 0, 0.2)'\n ctx.shadowBlur = theme?.shadowBlur ?? 3\n ctx.shadowOffsetY = theme?.shadowOffsetY ?? 1.5\n\n ctx.beginPath()\n traceArrowPath(ctx, projected, arrow.arrowStyle)\n ctx.strokeStyle = arrow.color\n ctx.lineWidth = arrow.strokeWidth\n ctx.lineCap = 'round'\n ctx.lineJoin = 'round'\n const isDashed = Boolean(arrow.dashed || (arrow.arrowStyle as string) === 'dashed')\n ctx.setLineDash(isDashed ? [arrow.strokeWidth * 3, arrow.strokeWidth * 2] : [])\n ctx.stroke()\n\n const headStyle = arrow.headStyle ?? (arrow.arrowStyle === 'bi' ? 'both' : 'triangle')\n if (headStyle !== 'none') {\n drawArrowHead(ctx, end, endAngle, headSize, arrow.color, headStyle !== 'open')\n if (headStyle === 'both') {\n drawArrowHead(ctx, start, startAngle, headSize, arrow.color, true)\n }\n }\n ctx.restore()\n\n if (arrow.label) {\n const minArrowSize = typeof theme?.labelMinShapeSize === 'number' ? theme.labelMinShapeSize : 24\n if (minArrowSize <= 0 || dist >= minArrowSize) {\n const rawMid =\n arrow.arrowStyle === 'curved'\n ? getQuadraticBezierPoint(start, control, end, 0.5)\n : arrow.arrowStyle === 'elbow'\n ? { x: control.x, y: (start.y + end.y) / 2 }\n : { x: (start.x + end.x) / 2, y: (start.y + end.y) / 2 }\n const fitToShape = theme?.fitLabelsToShape !== false\n const maxW = theme?.labelMaxTextWidth ?? (fitToShape ? Math.max(48, Math.min(280, dist * 1.6)) : Infinity)\n drawTualLabelPill(ctx, arrow.label, Math.round(rawMid.x), Math.round(rawMid.y), arrow.color, maxW, theme)\n }\n }\n\n if (options.isSelected) {\n const handleRadius = theme?.handleRadius ?? 5\n const fill = theme?.handleFillColor ?? '#ffffff'\n const endpointColor = theme?.endpointHandleColor ?? '#4f4f4f'\n const controlColor = theme?.controlHandleColor ?? '#767676'\n const strokeWidth = theme?.handleStrokeWidth ?? 2\n\n if (arrow.arrowStyle === 'curved' || arrow.arrowStyle === 'elbow') {\n ctx.save()\n ctx.beginPath()\n ctx.setLineDash(theme?.guideLineDash ? [...theme.guideLineDash] : [4, 4])\n ctx.moveTo(start.x, start.y)\n ctx.lineTo(control.x, control.y)\n ctx.lineTo(end.x, end.y)\n ctx.strokeStyle = theme?.guideLineColor ?? 'rgba(100, 100, 100, 0.6)'\n ctx.lineWidth = theme?.guideLineWidth ?? 1.2\n ctx.stroke()\n ctx.restore()\n drawTualHandle(ctx, control, controlColor, fill, handleRadius + 0.5, strokeWidth)\n }\n drawTualHandle(ctx, start, endpointColor, fill, handleRadius, strokeWidth)\n drawTualHandle(ctx, end, endpointColor, fill, handleRadius, strokeWidth)\n }\n\n ctx.restore()\n}\n\nexport function hitTestArrowHandle(\n point: ScreenPoint,\n projected: ProjectedArrow,\n arrow: ArrowItem,\n tolerance = 11,\n): ArrowHandleType | null {\n if (Math.hypot(point.x - projected.end.x, point.y - projected.end.y) <= tolerance) return 'end'\n if (Math.hypot(point.x - projected.start.x, point.y - projected.start.y) <= tolerance) return 'start'\n if (\n (arrow.arrowStyle === 'curved' || arrow.arrowStyle === 'elbow') &&\n Math.hypot(point.x - projected.control.x, point.y - projected.control.y) <= tolerance\n ) {\n return 'control'\n }\n return null\n}\n\nexport function hitTestArrow(\n point: ScreenPoint,\n projected: ProjectedArrow,\n arrow: ArrowItem,\n tolerance = 9,\n): boolean {\n const hitThreshold = Math.max(tolerance, arrow.strokeWidth / 2 + 6)\n if (arrow.arrowStyle === 'curved') {\n return distanceToQuadraticBezier(point, projected.start, projected.control, projected.end) <= hitThreshold\n }\n if (arrow.arrowStyle === 'elbow') {\n const c1 = { x: projected.control.x, y: projected.start.y }\n const c2 = { x: projected.control.x, y: projected.end.y }\n return (\n distanceToSegment(point, projected.start, c1) <= hitThreshold ||\n distanceToSegment(point, c1, c2) <= hitThreshold ||\n distanceToSegment(point, c2, projected.end) <= hitThreshold\n )\n }\n return distanceToSegment(point, projected.start, projected.end) <= hitThreshold\n}\n","import type L from 'leaflet'\nimport type {\n TualAnnotationTheme,\n FreeDrawItem,\n ScreenPoint,\n} from '../../types/index.js'\nimport { distanceToSegment, geoToScreen } from '../../shared/geo.js'\n\nexport function projectFreeDraw(\n map: L.Map,\n item: Pick<FreeDrawItem, 'points'>,\n): ScreenPoint[] {\n return item.points.map((pt) => geoToScreen(map, pt))\n}\n\nfunction traceSmoothPolyline(\n ctx: CanvasRenderingContext2D,\n points: ScreenPoint[],\n) {\n if (points.length === 0) return\n ctx.moveTo(points[0].x, points[0].y)\n\n if (points.length === 1) {\n ctx.lineTo(points[0].x + 0.5, points[0].y + 0.5)\n return\n }\n\n if (points.length === 2) {\n ctx.lineTo(points[1].x, points[1].y)\n return\n }\n\n for (let i = 1; i < points.length - 1; i += 1) {\n const midX = (points[i].x + points[i + 1].x) / 2\n const midY = (points[i].y + points[i + 1].y) / 2\n ctx.quadraticCurveTo(points[i].x, points[i].y, midX, midY)\n }\n\n const last = points[points.length - 1]\n ctx.lineTo(last.x, last.y)\n}\n\nexport function renderFreeDrawOnCanvas(\n ctx: CanvasRenderingContext2D,\n screenPoints: ScreenPoint[],\n item: Pick<FreeDrawItem, 'color' | 'strokeWidth' | 'dashed'>,\n options: {\n isSelected?: boolean\n isPreview?: boolean\n theme?: TualAnnotationTheme\n } = {},\n) {\n if (screenPoints.length === 0) return\n\n const theme = options.theme\n ctx.save()\n\n if (options.isPreview) {\n ctx.globalAlpha = 0.9\n }\n\n if (options.isSelected) {\n ctx.save()\n ctx.beginPath()\n traceSmoothPolyline(ctx, screenPoints)\n ctx.strokeStyle = theme?.selectionGlowColor ?? 'rgba(0, 0, 0, 0.2)'\n ctx.lineWidth = item.strokeWidth + (theme?.selectionGlowWidth ?? 6)\n ctx.lineCap = 'round'\n ctx.lineJoin = 'round'\n ctx.stroke()\n ctx.restore()\n }\n\n ctx.save()\n ctx.shadowColor = theme?.shadowColor ?? 'rgba(0, 0, 0, 0.2)'\n ctx.shadowBlur = theme?.shadowBlur ?? 3\n ctx.shadowOffsetY = theme?.shadowOffsetY ?? 1\n\n ctx.beginPath()\n traceSmoothPolyline(ctx, screenPoints)\n ctx.strokeStyle = item.color\n ctx.lineWidth = item.strokeWidth\n ctx.lineCap = 'round'\n ctx.lineJoin = 'round'\n if (item.dashed) {\n ctx.setLineDash([item.strokeWidth * 3, item.strokeWidth * 2])\n } else {\n ctx.setLineDash([])\n }\n ctx.stroke()\n ctx.restore()\n\n ctx.restore()\n}\n\nexport function hitTestFreeDraw(\n point: ScreenPoint,\n screenPoints: ScreenPoint[],\n item: FreeDrawItem,\n tolerance = 9,\n): boolean {\n if (screenPoints.length === 0) return false\n const threshold = Math.max(tolerance, item.strokeWidth / 2 + 6)\n if (screenPoints.length === 1) {\n return (\n Math.hypot(point.x - screenPoints[0].x, point.y - screenPoints[0].y) <=\n threshold\n )\n }\n\n // Fast bounding box check before segment iteration\n let minX = Infinity\n let minY = Infinity\n let maxX = -Infinity\n let maxY = -Infinity\n for (let i = 0; i < screenPoints.length; i += 1) {\n const p = screenPoints[i]\n if (p.x < minX) minX = p.x\n if (p.y < minY) minY = p.y\n if (p.x > maxX) maxX = p.x\n if (p.y > maxY) maxY = p.y\n }\n if (\n point.x < minX - threshold ||\n point.x > maxX + threshold ||\n point.y < minY - threshold ||\n point.y > maxY + threshold\n ) {\n return false\n }\n\n for (let i = 0; i < screenPoints.length - 1; i += 1) {\n if (\n distanceToSegment(point, screenPoints[i], screenPoints[i + 1]) <=\n threshold\n ) {\n return true\n }\n }\n return false\n}\n\n","import type {\n TualAnnotationTheme,\n ShapeKind,\n} from '../../types/index.js'\nimport type { ProjectedShape } from './render-shape.js'\n\nexport function tracePolygonShape(\n ctx: CanvasRenderingContext2D,\n proj: ProjectedShape,\n kind: ShapeKind,\n theme?: TualAnnotationTheme,\n) {\n const { minX, minY, maxX, maxY, width, height, cx, cy } = proj\n\n if (kind === 'square') {\n const radius = theme?.shapeBorderRadius ?? 0\n if (radius > 0 && typeof ctx.roundRect === 'function') {\n ctx.roundRect(minX, minY, width, height, radius)\n } else {\n ctx.rect(minX, minY, width, height)\n }\n return\n }\n\n if (kind === 'circle') {\n ctx.ellipse(cx, cy, width / 2, height / 2, 0, 0, Math.PI * 2)\n return\n }\n\n if (kind === 'triangle') {\n ctx.moveTo(cx, minY)\n ctx.lineTo(maxX, maxY)\n ctx.lineTo(minX, maxY)\n ctx.closePath()\n return\n }\n\n if (kind === 'diamond') {\n ctx.moveTo(cx, minY)\n ctx.lineTo(maxX, cy)\n ctx.lineTo(cx, maxY)\n ctx.lineTo(minX, cy)\n ctx.closePath()\n return\n }\n\n if (kind === 'hexagon') {\n const rx = width / 2\n const ry = height / 2\n for (let i = 0; i < 6; i += 1) {\n const angle = (Math.PI / 3) * i - Math.PI / 6\n const px = cx + rx * Math.cos(angle)\n const py = cy + ry * Math.sin(angle)\n if (i === 0) ctx.moveTo(px, py)\n else ctx.lineTo(px, py)\n }\n ctx.closePath()\n return\n }\n\n if (kind === 'star') {\n const spikes = 5\n const outerRx = width / 2\n const outerRy = height / 2\n const innerRx = outerRx * 0.42\n const innerRy = outerRy * 0.42\n for (let i = 0; i < spikes * 2; i += 1) {\n const rx = i % 2 === 0 ? outerRx : innerRx\n const ry = i % 2 === 0 ? outerRy : innerRy\n const angle = (i * Math.PI) / spikes - Math.PI / 2\n const px = cx + rx * Math.cos(angle)\n const py = cy + ry * Math.sin(angle)\n if (i === 0) ctx.moveTo(px, py)\n else ctx.lineTo(px, py)\n }\n ctx.closePath()\n return\n }\n\n if (kind === 'marker' || (kind as string) === 'cloud') {\n const rx = width / 2\n const ry = height * 0.36\n const headCy = minY + ry\n ctx.moveTo(cx, maxY)\n ctx.bezierCurveTo(minX + width * 0.05, minY + height * 0.7, minX, minY + height * 0.5, minX, headCy)\n ctx.ellipse(cx, headCy, rx, ry, 0, Math.PI, 0, false)\n ctx.bezierCurveTo(maxX, minY + height * 0.5, maxX - width * 0.05, minY + height * 0.7, cx, maxY)\n ctx.closePath()\n\n const innerRx = rx * 0.35\n const innerRy = ry * 0.35\n if (innerRx >= 2.5 && innerRy >= 2.5) {\n ctx.moveTo(cx + innerRx, headCy)\n ctx.ellipse(cx, headCy, innerRx, innerRy, 0, Math.PI * 2, 0, true)\n ctx.closePath()\n }\n return\n }\n\n if (kind === 'actor') {\n const headRadius = Math.min(width, height) * 0.16\n const headCy = minY + headRadius + height * 0.04\n const neckY = headCy + headRadius\n const hipY = minY + height * 0.64\n const armY = minY + height * 0.42\n const armSpan = width * 0.36\n const legSpan = width * 0.32\n\n ctx.moveTo(cx + headRadius, headCy)\n ctx.arc(cx, headCy, headRadius, 0, Math.PI * 2)\n ctx.closePath()\n ctx.moveTo(cx, neckY)\n ctx.lineTo(cx, hipY)\n ctx.moveTo(cx - armSpan, armY)\n ctx.lineTo(cx + armSpan, armY)\n ctx.moveTo(cx, hipY)\n ctx.lineTo(cx - legSpan, maxY)\n ctx.moveTo(cx, hipY)\n ctx.lineTo(cx + legSpan, maxY)\n }\n}\n\n","import type L from 'leaflet'\nimport type {\n TualAnnotationTheme,\n ScreenPoint,\n ShapeItem,\n} from '../../types/index.js'\nimport { geoToScreen } from '../../shared/geo.js'\nimport { drawTualHandle, drawTualLabelPill } from '../../shared/tual-render.js'\nimport { tracePolygonShape } from './trace-shape.js'\n\nexport type ShapeHandleType = 'start' | 'end'\n\nexport interface ProjectedShape {\n start: ScreenPoint\n end: ScreenPoint\n minX: number\n minY: number\n maxX: number\n maxY: number\n width: number\n height: number\n cx: number\n cy: number\n}\n\nexport function projectShape(map: L.Map, shape: ShapeItem): ProjectedShape {\n const start = geoToScreen(map, shape.start)\n const end = geoToScreen(map, shape.end)\n const minX = Math.min(start.x, end.x)\n const minY = Math.min(start.y, end.y)\n const maxX = Math.max(start.x, end.x)\n const maxY = Math.max(start.y, end.y)\n const width = Math.max(4, maxX - minX)\n const height = Math.max(4, maxY - minY)\n return {\n start,\n end,\n minX,\n minY,\n maxX,\n maxY,\n width,\n height,\n cx: minX + width / 2,\n cy: minY + height / 2,\n }\n}\n\nexport function renderShapeOnCanvas(\n ctx: CanvasRenderingContext2D,\n projected: ProjectedShape,\n shape: Pick<\n ShapeItem,\n 'shape' | 'color' | 'fillColor' | 'filled' | 'strokeWidth' | 'dashed' | 'label'\n >,\n options: {\n isSelected?: boolean\n isPreview?: boolean\n theme?: TualAnnotationTheme\n } = {},\n) {\n if (projected.width < 4 && projected.height < 4) return\n\n const theme = options.theme\n ctx.save()\n if (options.isPreview) ctx.globalAlpha = 0.85\n\n if (options.isSelected) {\n ctx.save()\n ctx.beginPath()\n tracePolygonShape(ctx, projected, shape.shape, theme)\n ctx.strokeStyle = theme?.selectionGlowColor ?? 'rgba(0, 0, 0, 0.2)'\n ctx.lineWidth = shape.strokeWidth + (theme?.selectionGlowWidth ?? 6)\n ctx.lineCap = 'round'\n ctx.lineJoin = 'round'\n ctx.stroke()\n ctx.restore()\n }\n\n ctx.save()\n ctx.shadowColor = theme?.shadowColor ?? 'rgba(0, 0, 0, 0.2)'\n ctx.shadowBlur = theme?.shadowBlur ?? 3\n ctx.shadowOffsetY = theme?.shadowOffsetY ?? 1.5\n\n ctx.beginPath()\n tracePolygonShape(ctx, projected, shape.shape, theme)\n\n if (shape.filled) {\n const defaultFillOpacity = theme?.shapeDefaultFillOpacity ?? 0.16\n const fillHex = Math.round(Math.min(1, Math.max(0, defaultFillOpacity)) * 255)\n .toString(16)\n .padStart(2, '0')\n ctx.fillStyle = shape.fillColor ?? `${shape.color}${fillHex}`\n ctx.fill()\n }\n\n ctx.strokeStyle = shape.color\n ctx.lineWidth = shape.strokeWidth\n ctx.lineCap = 'round'\n ctx.lineJoin = 'round'\n ctx.setLineDash(shape.dashed ? [shape.strokeWidth * 3, shape.strokeWidth * 2] : [])\n ctx.stroke()\n ctx.restore()\n\n if (shape.label) {\n const minShapeSize = typeof theme?.labelMinShapeSize === 'number' ? theme.labelMinShapeSize : 18\n if (\n minShapeSize <= 0 ||\n (Math.max(projected.width, projected.height) >= minShapeSize &&\n projected.width >= 8 &&\n projected.height >= 8)\n ) {\n const rawLabelY = shape.shape === 'actor' ? projected.maxY + 14 : projected.cy\n const fitToShape = theme?.fitLabelsToShape !== false\n const maxW =\n theme?.labelMaxTextWidth ??\n (fitToShape ? Math.max(48, Math.min(280, projected.width * 2.2)) : Infinity)\n drawTualLabelPill(ctx, shape.label, Math.round(projected.cx), Math.round(rawLabelY), shape.color, maxW, theme)\n }\n }\n\n if (options.isSelected) {\n const handleRadius = theme?.handleRadius ?? 5\n const fill = theme?.handleFillColor ?? '#ffffff'\n const endpointColor = theme?.endpointHandleColor ?? '#4f4f4f'\n const strokeWidth = theme?.handleStrokeWidth ?? 2\n\n ctx.save()\n ctx.setLineDash(theme?.guideLineDash ? [...theme.guideLineDash] : [4, 4])\n ctx.strokeStyle = theme?.guideLineColor ?? 'rgba(100, 100, 100, 0.6)'\n ctx.lineWidth = theme?.guideLineWidth ?? 1.2\n ctx.strokeRect(projected.minX, projected.minY, projected.width, projected.height)\n ctx.restore()\n\n drawTualHandle(ctx, projected.start, endpointColor, fill, handleRadius, strokeWidth)\n drawTualHandle(ctx, projected.end, endpointColor, fill, handleRadius, strokeWidth)\n }\n\n ctx.restore()\n}\n\nexport function hitTestShapeHandle(\n point: ScreenPoint,\n projected: ProjectedShape,\n tolerance = 11,\n): ShapeHandleType | null {\n if (Math.hypot(point.x - projected.end.x, point.y - projected.end.y) <= tolerance) return 'end'\n if (Math.hypot(point.x - projected.start.x, point.y - projected.start.y) <= tolerance) return 'start'\n return null\n}\n\nexport function hitTestShape(\n point: ScreenPoint,\n projected: ProjectedShape,\n tolerance = 8,\n): boolean {\n return (\n point.x >= projected.minX - tolerance &&\n point.x <= projected.maxX + tolerance &&\n point.y >= projected.minY - tolerance &&\n point.y <= projected.maxY + tolerance\n )\n}\n","import type L from 'leaflet'\nimport type {\n TualAnnotationTheme,\n RulerItem,\n ScreenPoint,\n} from '../../types/index.js'\nimport {\n calculateGeodesicDistance,\n distanceToSegment,\n formatRealWorldDistance,\n geoToScreen,\n} from '../../shared/geo.js'\nimport {\n drawTualHandle,\n drawTualLabelPill,\n} from '../../shared/tual-render.js'\n\nexport type RulerHandleType = 'start' | 'end'\n\nexport interface ProjectedRuler {\n start: ScreenPoint\n end: ScreenPoint\n mid: ScreenPoint\n lengthPx: number\n angle: number\n}\n\nexport function projectRuler(\n map: L.Map,\n ruler: Pick<RulerItem, 'start' | 'end'>,\n): ProjectedRuler {\n const start = geoToScreen(map, ruler.start)\n const end = geoToScreen(map, ruler.end)\n const mid = { x: (start.x + end.x) / 2, y: (start.y + end.y) / 2 }\n const lengthPx = Math.hypot(end.x - start.x, end.y - start.y)\n const angle = Math.atan2(end.y - start.y, end.x - start.x)\n return { start, end, mid, lengthPx, angle }\n}\n\nexport function renderRulerOnCanvas(\n ctx: CanvasRenderingContext2D,\n projected: ProjectedRuler,\n ruler: Pick<\n RulerItem,\n 'start' | 'end' | 'color' | 'strokeWidth' | 'dashed' | 'label' | 'unit'\n >,\n options: {\n isSelected?: boolean\n isPreview?: boolean\n theme?: TualAnnotationTheme\n } = {},\n) {\n const { start, end, mid, lengthPx, angle } = projected\n if (lengthPx < 2) return\n\n const theme = options.theme\n ctx.save()\n\n if (options.isPreview) {\n ctx.globalAlpha = 0.9\n }\n\n // Selection Glow\n if (options.isSelected) {\n ctx.save()\n ctx.beginPath()\n ctx.moveTo(start.x, start.y)\n ctx.lineTo(end.x, end.y)\n ctx.strokeStyle = theme?.selectionGlowColor ?? 'rgba(0, 0, 0, 0.2)'\n ctx.lineWidth = ruler.strokeWidth + (theme?.selectionGlowWidth ?? 6)\n ctx.lineCap = 'round'\n ctx.stroke()\n ctx.restore()\n }\n\n // Shadow\n ctx.save()\n ctx.shadowColor = theme?.shadowColor ?? 'rgba(0, 0, 0, 0.2)'\n ctx.shadowBlur = theme?.shadowBlur ?? 3\n ctx.shadowOffsetY = theme?.shadowOffsetY ?? 1.5\n\n // Main measurement line\n ctx.beginPath()\n ctx.moveTo(start.x, start.y)\n ctx.lineTo(end.x, end.y)\n ctx.strokeStyle = ruler.color\n ctx.lineWidth = ruler.strokeWidth\n ctx.lineCap = 'round'\n if (ruler.dashed) {\n ctx.setLineDash([ruler.strokeWidth * 3, ruler.strokeWidth * 2])\n } else {\n ctx.setLineDash([])\n }\n ctx.stroke()\n\n // Perpendicular end tick marks (T-caps)\n const perp = angle + Math.PI / 2\n const tickLen = Math.max(7, ruler.strokeWidth * 3.2)\n const dx = Math.cos(perp) * tickLen\n const dy = Math.sin(perp) * tickLen\n\n ctx.beginPath()\n ctx.setLineDash([])\n // Start cap\n ctx.moveTo(start.x - dx, start.y - dy)\n ctx.lineTo(start.x + dx, start.y + dy)\n // End cap\n ctx.moveTo(end.x - dx, end.y - dy)\n ctx.lineTo(end.x + dx, end.y + dy)\n ctx.stroke()\n ctx.restore()\n\n // Real world distance label badge\n const distMeters = calculateGeodesicDistance(ruler.start, ruler.end)\n const displayLabel = ruler.label\n ? ruler.label\n : formatRealWorldDistance(distMeters, ruler.unit)\n\n if (displayLabel) {\n const fitToShape = theme?.fitLabelsToShape !== false\n const maxW =\n theme?.labelMaxTextWidth ??\n (fitToShape ? Math.max(50, Math.min(300, lengthPx * 1.5)) : Infinity)\n drawTualLabelPill(\n ctx,\n displayLabel,\n Math.round(mid.x),\n Math.round(mid.y),\n ruler.color,\n maxW,\n theme,\n )\n }\n\n // Drag handles when selected\n if (options.isSelected) {\n const handleRadius = theme?.handleRadius ?? 5\n const fill = theme?.handleFillColor ?? '#ffffff'\n const endpointColor = theme?.endpointHandleColor ?? '#4f4f4f'\n const strokeWidth = theme?.handleStrokeWidth ?? 2\n\n drawTualHandle(ctx, start, endpointColor, fill, handleRadius, strokeWidth)\n drawTualHandle(ctx, end, endpointColor, fill, handleRadius, strokeWidth)\n }\n\n ctx.restore()\n}\n\nexport function hitTestRulerHandle(\n point: ScreenPoint,\n projected: ProjectedRuler,\n tolerance = 11,\n): RulerHandleType | null {\n if (Math.hypot(point.x - projected.end.x, point.y - projected.end.y) <= tolerance) {\n return 'end'\n }\n if (Math.hypot(point.x - projected.start.x, point.y - projected.start.y) <= tolerance) {\n return 'start'\n }\n return null\n}\n\nexport function hitTestRuler(\n point: ScreenPoint,\n projected: ProjectedRuler,\n ruler: RulerItem,\n tolerance = 9,\n): boolean {\n const hitThreshold = Math.max(tolerance, ruler.strokeWidth / 2 + 6)\n return distanceToSegment(point, projected.start, projected.end) <= hitThreshold\n}\n\n","import type L from 'leaflet'\nimport type { NoteItem, ScreenPoint } from '../../types/index.js'\nimport { NOTE_COLOR_THEMES } from '../../shared/constants.js'\nimport { getMapDimensions } from '../../shared/geo.js'\n\nexport interface ResolvedNoteTheme {\n name: string\n bg: string\n border: string\n header: string\n text: string\n}\n\nexport function resolveNoteTheme(backgroundColor: string): ResolvedNoteTheme {\n const matchedTheme = NOTE_COLOR_THEMES.find((t) => t.bg === backgroundColor)\n if (matchedTheme) return matchedTheme\n\n const isDarkBg =\n (backgroundColor?.startsWith('#') &&\n backgroundColor.length === 7 &&\n parseInt(backgroundColor.slice(1), 16) < 0x888888) ||\n backgroundColor === '#111827' ||\n backgroundColor === '#1e293b' ||\n backgroundColor === '#0f172a'\n\n return {\n name: 'Custom',\n bg: backgroundColor,\n border: isDarkBg ? 'rgba(255, 255, 255, 0.16)' : 'rgba(0, 0, 0, 0.12)',\n header: isDarkBg ? 'rgba(255, 255, 255, 0.08)' : 'rgba(0, 0, 0, 0.06)',\n text: isDarkBg ? '#f8fafc' : '#0f172a',\n }\n}\n\nexport function clampNotePosition(\n map: L.Map,\n screenPos: ScreenPoint,\n item: NoteItem,\n isCompact: boolean,\n isDragging: boolean,\n clampToViewport = true,\n): ScreenPoint {\n const mapDims = clampToViewport !== false ? getMapDimensions(map) : null\n if (!mapDims || isDragging) return screenPos\n\n const isAnchorNearViewport =\n screenPos.x >= -120 &&\n screenPos.x <= mapDims.width + 120 &&\n screenPos.y >= -120 &&\n screenPos.y <= mapDims.height + 120\n\n if (!isAnchorNearViewport) return screenPos\n\n const cardWidth = isCompact ? 95 : (item.width ?? 230)\n const cardHeight = isCompact ? 22 : (item.height ?? 100)\n const pad = 8\n const minX = 16 + pad\n const maxX = Math.max(minX, mapDims.width - cardWidth + 16 - pad)\n const minY = 12 + pad\n const maxY = Math.max(minY, mapDims.height - cardHeight + 12 - pad)\n\n return {\n x: Math.max(minX, Math.min(maxX, screenPos.x)),\n y: Math.max(minY, Math.min(maxY, screenPos.y)),\n }\n}\n\n","import type L from 'leaflet'\nimport type { ScreenPoint, TextItem } from '../../types/index.js'\nimport { getMapDimensions } from '../../shared/geo.js'\n\nexport function clampTextPosition(\n map: L.Map,\n screenPos: ScreenPoint,\n item: TextItem,\n dynamicFontSize: number,\n isCompact: boolean,\n isDragging: boolean,\n clampToViewport = true,\n): ScreenPoint {\n const mapDims = clampToViewport !== false ? getMapDimensions(map) : null\n if (!mapDims || isDragging) return screenPos\n\n const isAnchorNearViewport =\n screenPos.x >= -100 &&\n screenPos.x <= mapDims.width + 100 &&\n screenPos.y >= -100 &&\n screenPos.y <= mapDims.height + 100\n\n if (!isAnchorNearViewport) return screenPos\n\n const approxHalfW = isCompact\n ? 35\n : Math.max(24, ((item.text || 'Text').length * dynamicFontSize) / 3.6)\n const approxHalfH = isCompact ? 11 : dynamicFontSize / 2 + 4\n const pad = 8\n\n const minX = approxHalfW + pad\n const maxX = Math.max(minX, mapDims.width - approxHalfW - pad)\n const minY = approxHalfH + pad\n const maxY = Math.max(minY, mapDims.height - approxHalfH - pad)\n\n return {\n x: Math.max(minX, Math.min(maxX, screenPos.x)),\n y: Math.max(minY, Math.min(maxY, screenPos.y)),\n }\n}\n\n","import type L from 'leaflet'\nimport type { FreeDrawItem, GeoPoint, ScreenPoint } from '../types/index.js'\nimport { createId, screenToGeo } from '../shared/index.js'\n\nexport function startFreeDrawDrag(\n map: L.Map,\n mapContainer: HTMLElement,\n pt: ScreenPoint,\n geo: GeoPoint,\n activeColor: string,\n strokeWidth: number,\n dashed: boolean,\n draftFreeDrawRef: { current: { screenPoints: ScreenPoint[]; geoPoints: GeoPoint[] } | null },\n rafIdRef: { current: number | null },\n paintCanvas: () => void,\n addItem: (item: FreeDrawItem) => void,\n setActiveTool: (tool: 'select') => void,\n) {\n draftFreeDrawRef.current = { screenPoints: [pt], geoPoints: [geo] }\n map.dragging.disable()\n paintCanvas()\n\n const handleWindowMove = (moveEvent: PointerEvent) => {\n if (!draftFreeDrawRef.current) return\n const rect = mapContainer.getBoundingClientRect()\n const currScreen = { x: moveEvent.clientX - rect.left, y: moveEvent.clientY - rect.top }\n const pts = draftFreeDrawRef.current.screenPoints\n const prevPt = pts[pts.length - 1]\n if (Math.hypot(currScreen.x - prevPt.x, currScreen.y - prevPt.y) < 2.5) return\n pts.push(currScreen)\n draftFreeDrawRef.current.geoPoints.push(screenToGeo(map, currScreen))\n\n if (rafIdRef.current === null) {\n rafIdRef.current = window.requestAnimationFrame(() => {\n rafIdRef.current = null\n paintCanvas()\n })\n }\n }\n\n const handleWindowUp = (upEvent: PointerEvent) => {\n window.removeEventListener('pointermove', handleWindowMove)\n window.removeEventListener('pointerup', handleWindowUp)\n map.dragging.enable()\n if (rafIdRef.current !== null) {\n window.cancelAnimationFrame(rafIdRef.current)\n rafIdRef.current = null\n }\n\n const draft = draftFreeDrawRef.current\n draftFreeDrawRef.current = null\n if (draft && draft.geoPoints.length >= 1) {\n addItem({\n id: createId('freedraw'),\n type: 'freedraw',\n points: draft.geoPoints,\n color: activeColor,\n strokeWidth,\n dashed,\n createdAt: Date.now(),\n })\n if (!upEvent.shiftKey) setActiveTool('select')\n } else {\n paintCanvas()\n }\n }\n\n window.addEventListener('pointermove', handleWindowMove)\n window.addEventListener('pointerup', handleWindowUp)\n}\n\n","import type L from 'leaflet'\nimport type {\n ArrowItem,\n ArrowStyle,\n DraftArrowState,\n DraftRulerState,\n DraftShapeState,\n GeoPoint,\n NoteItem,\n RulerItem,\n ScreenPoint,\n ShapeItem,\n ShapeKind,\n TextItem,\n} from '../types/index.js'\nimport {\n computeDefaultControlGeoPoint,\n constrainAngleTo45Degrees,\n constrainToAspectRatio,\n createId,\n NOTE_COLOR_THEMES,\n screenToGeo,\n} from '../shared/index.js'\n\nexport function createDraftNote(geo: GeoPoint, noteColor: string, defaultTitle = 'Field Note'): NoteItem {\n const theme = NOTE_COLOR_THEMES.find((t) => t.bg === noteColor) ?? NOTE_COLOR_THEMES[0]\n return {\n id: createId('note'),\n type: 'note',\n position: geo,\n title: defaultTitle,\n text: '',\n backgroundColor: theme.bg,\n textColor: theme.text,\n width: 230,\n createdAt: Date.now(),\n }\n}\n\nexport function createDraftText(\n geo: GeoPoint,\n activeColor: string,\n fontSize: number,\n fontWeight: 'normal' | 'bold',\n currentZoom: number,\n): TextItem {\n return {\n id: createId('text'),\n type: 'text',\n position: geo,\n text: '',\n color: activeColor,\n initialFontSize: fontSize,\n baseZoom: currentZoom,\n fontWeight,\n createdAt: Date.now(),\n }\n}\n\nexport { startFreeDrawDrag } from './freedraw-drag-handler.js'\n\nexport function startShapeDrag(\n map: L.Map,\n mapContainer: HTMLElement,\n startScreen: ScreenPoint,\n startGeo: GeoPoint,\n activeShape: ShapeKind,\n activeColor: string,\n shapeFilled: boolean,\n strokeWidth: number,\n dashed: boolean,\n setDraftShape: (draft: DraftShapeState | null) => void,\n addItem: (item: ShapeItem) => void,\n setActiveTool: (tool: 'select') => void,\n) {\n setDraftShape({ shape: activeShape, startGeo, currentGeo: startGeo })\n map.dragging.disable()\n\n const handleWindowMove = (moveEvent: PointerEvent) => {\n const rect = mapContainer.getBoundingClientRect()\n const rawScreen = { x: moveEvent.clientX - rect.left, y: moveEvent.clientY - rect.top }\n const currScreen = moveEvent.shiftKey ? constrainToAspectRatio(startScreen, rawScreen, 1) : rawScreen\n setDraftShape({ shape: activeShape, startGeo, currentGeo: screenToGeo(map, currScreen) })\n }\n\n const handleWindowUp = (upEvent: PointerEvent) => {\n window.removeEventListener('pointermove', handleWindowMove)\n window.removeEventListener('pointerup', handleWindowUp)\n map.dragging.enable()\n\n const rect = mapContainer.getBoundingClientRect()\n const rawEndScreen = { x: upEvent.clientX - rect.left, y: upEvent.clientY - rect.top }\n const endScreen = upEvent.shiftKey ? constrainToAspectRatio(startScreen, rawEndScreen, 1) : rawEndScreen\n const dragDist = Math.hypot(rawEndScreen.x - startScreen.x, rawEndScreen.y - startScreen.y)\n\n const finalStartGeo = dragDist >= 10 ? startGeo : screenToGeo(map, { x: startScreen.x - 45, y: startScreen.y - 45 })\n const finalEndGeo = dragDist >= 10 ? screenToGeo(map, endScreen) : screenToGeo(map, { x: startScreen.x + 45, y: startScreen.y + 45 })\n\n addItem({\n id: createId('shape'),\n type: 'shape',\n shape: activeShape,\n start: finalStartGeo,\n end: finalEndGeo,\n color: activeColor,\n filled: shapeFilled,\n strokeWidth,\n dashed,\n createdAt: Date.now(),\n })\n setDraftShape(null)\n setActiveTool('select')\n }\n\n window.addEventListener('pointermove', handleWindowMove)\n window.addEventListener('pointerup', handleWindowUp)\n}\n\nexport function buildArrowItem(\n arrowStyle: ArrowStyle,\n startGeo: GeoPoint,\n endGeo: GeoPoint,\n activeColor: string,\n strokeWidth: number,\n dashed: boolean,\n): ArrowItem {\n return {\n id: createId('arrow'),\n type: 'arrow',\n arrowStyle,\n start: startGeo,\n end: endGeo,\n controlPoint:\n arrowStyle === 'curved'\n ? computeDefaultControlGeoPoint(startGeo, endGeo)\n : arrowStyle === 'elbow'\n ? { lat: (startGeo.lat + endGeo.lat) / 2, lng: (startGeo.lng + endGeo.lng) / 2 }\n : undefined,\n color: activeColor,\n strokeWidth,\n dashed,\n headStyle: arrowStyle === 'bi' ? 'both' : 'triangle',\n createdAt: Date.now(),\n }\n}\n\nexport function startArrowDrag(\n map: L.Map,\n mapContainer: HTMLElement,\n startScreen: ScreenPoint,\n startGeo: GeoPoint,\n arrowStyle: ArrowStyle,\n activeColor: string,\n strokeWidth: number,\n dashed: boolean,\n setDraftArrow: (draft: DraftArrowState | null) => void,\n addItem: (item: ArrowItem) => void,\n setActiveTool: (tool: 'select') => void,\n) {\n setDraftArrow({ arrowStyle, startGeo, currentGeo: startGeo })\n map.dragging.disable()\n\n const handleWindowMove = (moveEvent: PointerEvent) => {\n const rect = mapContainer.getBoundingClientRect()\n const rawScreen = { x: moveEvent.clientX - rect.left, y: moveEvent.clientY - rect.top }\n const currScreen = moveEvent.shiftKey ? constrainAngleTo45Degrees(startScreen, rawScreen) : rawScreen\n setDraftArrow({ arrowStyle, startGeo, currentGeo: screenToGeo(map, currScreen) })\n }\n\n const handleWindowUp = (upEvent: PointerEvent) => {\n window.removeEventListener('pointermove', handleWindowMove)\n window.removeEventListener('pointerup', handleWindowUp)\n map.dragging.enable()\n\n const rect = mapContainer.getBoundingClientRect()\n const rawEndScreen = { x: upEvent.clientX - rect.left, y: upEvent.clientY - rect.top }\n const endScreen = upEvent.shiftKey ? constrainAngleTo45Degrees(startScreen, rawEndScreen) : rawEndScreen\n if (Math.hypot(rawEndScreen.x - startScreen.x, rawEndScreen.y - startScreen.y) >= 8) {\n addItem(buildArrowItem(arrowStyle, startGeo, screenToGeo(map, endScreen), activeColor, strokeWidth, dashed))\n setDraftArrow(null)\n setActiveTool('select')\n }\n }\n\n window.addEventListener('pointermove', handleWindowMove)\n window.addEventListener('pointerup', handleWindowUp)\n}\n\nexport function buildRulerItem(\n startGeo: GeoPoint,\n endGeo: GeoPoint,\n activeColor: string,\n strokeWidth: number,\n dashed: boolean,\n): RulerItem {\n return {\n id: createId('ruler'),\n type: 'ruler',\n start: startGeo,\n end: endGeo,\n color: activeColor,\n strokeWidth,\n dashed,\n unit: 'metric',\n createdAt: Date.now(),\n }\n}\n\nexport function startRulerDrag(\n map: L.Map,\n mapContainer: HTMLElement,\n startScreen: ScreenPoint,\n startGeo: GeoPoint,\n activeColor: string,\n strokeWidth: number,\n dashed: boolean,\n setDraftRuler: (draft: DraftRulerState | null) => void,\n addItem: (item: RulerItem) => void,\n setActiveTool: (tool: 'select') => void,\n) {\n setDraftRuler({ startGeo, currentGeo: startGeo })\n map.dragging.disable()\n\n const handleWindowMove = (moveEvent: PointerEvent) => {\n const rect = mapContainer.getBoundingClientRect()\n const rawScreen = { x: moveEvent.clientX - rect.left, y: moveEvent.clientY - rect.top }\n const currScreen = moveEvent.shiftKey ? constrainAngleTo45Degrees(startScreen, rawScreen) : rawScreen\n setDraftRuler({ startGeo, currentGeo: screenToGeo(map, currScreen) })\n }\n\n const handleWindowUp = (upEvent: PointerEvent) => {\n window.removeEventListener('pointermove', handleWindowMove)\n window.removeEventListener('pointerup', handleWindowUp)\n map.dragging.enable()\n\n const rect = mapContainer.getBoundingClientRect()\n const rawEndScreen = { x: upEvent.clientX - rect.left, y: upEvent.clientY - rect.top }\n const endScreen = upEvent.shiftKey ? constrainAngleTo45Degrees(startScreen, rawEndScreen) : rawEndScreen\n if (Math.hypot(rawEndScreen.x - startScreen.x, rawEndScreen.y - startScreen.y) >= 8) {\n addItem(buildRulerItem(startGeo, screenToGeo(map, endScreen), activeColor, strokeWidth, dashed))\n setDraftRuler(null)\n setActiveTool('select')\n }\n }\n\n window.addEventListener('pointermove', handleWindowMove)\n window.addEventListener('pointerup', handleWindowUp)\n}\n\n","import type L from 'leaflet'\nimport type { ArrowItem, FreeDrawItem, RulerItem, ScreenPoint, ShapeItem } from '../types/index.js'\nimport {\n constrainAngleTo45Degrees,\n constrainToAspectRatio,\n screenToGeo,\n} from '../shared/geo.js'\nimport type {\n ArrowHandleType,\n ProjectedArrow,\n ProjectedRuler,\n ProjectedShape,\n RulerHandleType,\n ShapeHandleType,\n} from '../entities/index.js'\n\nfunction bindWindowDrag(map: L.Map, onMove: (e: PointerEvent) => void) {\n map.dragging.disable()\n const onUp = () => {\n map.dragging.enable()\n window.removeEventListener('pointermove', onMove)\n window.removeEventListener('pointerup', onUp)\n }\n window.addEventListener('pointermove', onMove)\n window.addEventListener('pointerup', onUp)\n}\n\nexport function startArrowHandleDrag(\n map: L.Map,\n arrow: ArrowItem,\n projected: ProjectedArrow,\n handle: ArrowHandleType,\n getLocalPoint: (e: PointerEvent) => ScreenPoint,\n updateItem: (id: string, patch: Partial<ArrowItem>) => void,\n) {\n bindWindowDrag(map, (moveEvent) => {\n const rawPt = getLocalPoint(moveEvent)\n const shouldLock = moveEvent.shiftKey\n if (handle === 'start') {\n const snappedPt = shouldLock ? constrainAngleTo45Degrees(projected.end, rawPt) : rawPt\n updateItem(arrow.id, { start: screenToGeo(map, snappedPt) })\n } else if (handle === 'end') {\n const snappedPt = shouldLock ? constrainAngleTo45Degrees(projected.start, rawPt) : rawPt\n updateItem(arrow.id, { end: screenToGeo(map, snappedPt) })\n } else if (handle === 'control') {\n updateItem(arrow.id, { controlPoint: screenToGeo(map, rawPt) })\n }\n })\n}\n\nexport function startShapeHandleDrag(\n map: L.Map,\n shape: ShapeItem,\n projected: ProjectedShape,\n handle: ShapeHandleType,\n getLocalPoint: (e: PointerEvent) => ScreenPoint,\n updateItem: (id: string, patch: Partial<ShapeItem>) => void,\n) {\n const anchorScreen = handle === 'start' ? projected.end : projected.start\n const initialRatio = projected.width > 4 && projected.height > 4 ? projected.width / projected.height : 1\n\n bindWindowDrag(map, (moveEvent) => {\n const rawPt = getLocalPoint(moveEvent)\n const nextPt = moveEvent.shiftKey ? constrainToAspectRatio(anchorScreen, rawPt, initialRatio) : rawPt\n const nextGeo = screenToGeo(map, nextPt)\n updateItem(shape.id, handle === 'start' ? { start: nextGeo } : { end: nextGeo })\n })\n}\n\nexport function startArrowBodyDrag(\n map: L.Map,\n arrow: ArrowItem,\n projected: ProjectedArrow,\n originPt: ScreenPoint,\n getLocalPoint: (e: PointerEvent) => ScreenPoint,\n updateItem: (id: string, patch: Partial<ArrowItem>) => void,\n) {\n const initialStartScreen = projected.start\n const initialEndScreen = projected.end\n const initialControlScreen = projected.control\n const hadCustomControl = Boolean(arrow.controlPoint)\n\n bindWindowDrag(map, (moveEvent) => {\n const nextPt = getLocalPoint(moveEvent)\n const dx = nextPt.x - originPt.x\n const dy = nextPt.y - originPt.y\n const patch: Partial<ArrowItem> = {\n start: screenToGeo(map, { x: initialStartScreen.x + dx, y: initialStartScreen.y + dy }),\n end: screenToGeo(map, { x: initialEndScreen.x + dx, y: initialEndScreen.y + dy }),\n }\n if ((arrow.arrowStyle === 'curved' || arrow.arrowStyle === 'elbow') && hadCustomControl) {\n patch.controlPoint = screenToGeo(map, {\n x: initialControlScreen.x + dx,\n y: initialControlScreen.y + dy,\n })\n }\n updateItem(arrow.id, patch)\n })\n}\n\nexport function startShapeBodyDrag(\n map: L.Map,\n shape: ShapeItem,\n projected: ProjectedShape,\n originPt: ScreenPoint,\n getLocalPoint: (e: PointerEvent) => ScreenPoint,\n updateItem: (id: string, patch: Partial<ShapeItem>) => void,\n) {\n const initialStartScreen = projected.start\n const initialEndScreen = projected.end\n\n bindWindowDrag(map, (moveEvent) => {\n const nextPt = getLocalPoint(moveEvent)\n const dx = nextPt.x - originPt.x\n const dy = nextPt.y - originPt.y\n updateItem(shape.id, {\n start: screenToGeo(map, { x: initialStartScreen.x + dx, y: initialStartScreen.y + dy }),\n end: screenToGeo(map, { x: initialEndScreen.x + dx, y: initialEndScreen.y + dy }),\n })\n })\n}\n\nexport function startFreeDrawBodyDrag(\n map: L.Map,\n fd: FreeDrawItem,\n initialScreenPts: ScreenPoint[],\n originPt: ScreenPoint,\n getLocalPoint: (e: PointerEvent) => ScreenPoint,\n updateItem: (id: string, patch: Partial<FreeDrawItem>) => void,\n) {\n bindWindowDrag(map, (moveEvent) => {\n const nextPt = getLocalPoint(moveEvent)\n const dx = nextPt.x - originPt.x\n const dy = nextPt.y - originPt.y\n updateItem(fd.id, {\n points: initialScreenPts.map((sp) => screenToGeo(map, { x: sp.x + dx, y: sp.y + dy })),\n })\n })\n}\n\nexport function startRulerHandleDrag(\n map: L.Map,\n ruler: RulerItem,\n projected: ProjectedRuler,\n handle: RulerHandleType,\n getLocalPoint: (e: PointerEvent) => ScreenPoint,\n updateItem: (id: string, patch: Partial<RulerItem>) => void,\n) {\n bindWindowDrag(map, (moveEvent) => {\n const rawPt = getLocalPoint(moveEvent)\n const shouldLock = moveEvent.shiftKey\n if (handle === 'start') {\n const snappedPt = shouldLock ? constrainAngleTo45Degrees(projected.end, rawPt) : rawPt\n updateItem(ruler.id, { start: screenToGeo(map, snappedPt) })\n } else if (handle === 'end') {\n const snappedPt = shouldLock ? constrainAngleTo45Degrees(projected.start, rawPt) : rawPt\n updateItem(ruler.id, { end: screenToGeo(map, snappedPt) })\n }\n })\n}\n\nexport function startRulerBodyDrag(\n map: L.Map,\n ruler: RulerItem,\n projected: ProjectedRuler,\n originPt: ScreenPoint,\n getLocalPoint: (e: PointerEvent) => ScreenPoint,\n updateItem: (id: string, patch: Partial<RulerItem>) => void,\n) {\n const initialStartScreen = projected.start\n const initialEndScreen = projected.end\n\n bindWindowDrag(map, (moveEvent) => {\n const nextPt = getLocalPoint(moveEvent)\n const dx = nextPt.x - originPt.x\n const dy = nextPt.y - originPt.y\n updateItem(ruler.id, {\n start: screenToGeo(map, { x: initialStartScreen.x + dx, y: initialStartScreen.y + dy }),\n end: screenToGeo(map, { x: initialEndScreen.x + dx, y: initialEndScreen.y + dy }),\n })\n })\n}\n\n","import type L from 'leaflet'\nimport type {\n ArrowItem,\n ArrowRenderTheme,\n TualAnnotationTheme,\n DraftArrowState,\n DraftRulerState,\n DraftShapeState,\n FreeDrawItem,\n GeoPoint,\n RulerItem,\n ScreenPoint,\n ShapeItem,\n} from '../types/index.js'\nimport {\n projectArrow,\n projectFreeDraw,\n projectRuler,\n projectShape,\n renderArrowOnCanvas,\n renderFreeDrawOnCanvas,\n renderRulerOnCanvas,\n renderShapeOnCanvas,\n} from '../entities/index.js'\n\nexport interface PaintLeafletTualOptions {\n map: L.Map | null\n canvas: HTMLCanvasElement | null\n width: number\n height: number\n arrowItems: ArrowItem[]\n shapeItems: ShapeItem[]\n freeDrawItems: FreeDrawItem[]\n rulerItems: RulerItem[]\n selectedId: string | null\n draftShape: DraftShapeState | null\n draftArrow: DraftArrowState | null\n draftRuler?: DraftRulerState | null\n draftFreeDraw?: {\n screenPoints: ScreenPoint[]\n geoPoints: GeoPoint[]\n } | null\n activeColor: string\n strokeWidth: number\n dashed: boolean\n shapeFilled: boolean\n annotationTheme?: TualAnnotationTheme\n arrowTheme?: ArrowRenderTheme\n isReadOnly: boolean\n}\n\nexport function paintLeafletTual({\n map,\n canvas,\n width,\n height,\n arrowItems,\n shapeItems,\n freeDrawItems,\n rulerItems,\n selectedId,\n draftShape,\n draftArrow,\n draftRuler,\n draftFreeDraw,\n activeColor,\n strokeWidth,\n dashed,\n shapeFilled,\n annotationTheme,\n arrowTheme,\n isReadOnly,\n}: PaintLeafletTualOptions) {\n if (!map || !canvas || width === 0 || height === 0) return\n\n const effectiveTheme = annotationTheme ?? arrowTheme\n const dpr = typeof window !== 'undefined' ? window.devicePixelRatio || 1 : 1\n const targetW = Math.round(width * dpr)\n const targetH = Math.round(height * dpr)\n if (canvas.width !== targetW) {\n canvas.width = targetW\n }\n if (canvas.height !== targetH) {\n canvas.height = targetH\n }\n\n const ctx = canvas.getContext('2d')\n if (!ctx) return\n\n ctx.save()\n if (typeof ctx.scale === 'function') {\n ctx.scale(dpr, dpr)\n }\n ctx.clearRect(0, 0, width, height)\n\n for (const fd of freeDrawItems) {\n const screenPts = projectFreeDraw(map, fd)\n renderFreeDrawOnCanvas(ctx, screenPts, fd, {\n isSelected: !isReadOnly && fd.id === selectedId,\n theme: effectiveTheme,\n })\n }\n\n for (const shp of shapeItems) {\n const projected = projectShape(map, shp)\n renderShapeOnCanvas(ctx, projected, shp, {\n isSelected: !isReadOnly && shp.id === selectedId,\n theme: effectiveTheme,\n })\n }\n\n for (const arrow of arrowItems) {\n const projected = projectArrow(map, arrow)\n renderArrowOnCanvas(ctx, projected, arrow, {\n isSelected: !isReadOnly && arrow.id === selectedId,\n theme: effectiveTheme,\n })\n }\n\n for (const ruler of rulerItems) {\n const projected = projectRuler(map, ruler)\n renderRulerOnCanvas(ctx, projected, ruler, {\n isSelected: !isReadOnly && ruler.id === selectedId,\n theme: effectiveTheme,\n })\n }\n\n if (!isReadOnly && draftFreeDraw && draftFreeDraw.screenPoints.length > 0) {\n renderFreeDrawOnCanvas(\n ctx,\n draftFreeDraw.screenPoints,\n {\n color: activeColor,\n strokeWidth,\n dashed,\n },\n {\n isPreview: true,\n theme: effectiveTheme,\n },\n )\n }\n\n if (!isReadOnly && draftShape) {\n const tempShape: ShapeItem = {\n id: 'draft-shape',\n type: 'shape',\n shape: draftShape.shape,\n start: draftShape.startGeo,\n end: draftShape.currentGeo,\n color: activeColor,\n filled: shapeFilled,\n strokeWidth,\n dashed,\n createdAt: 0,\n }\n const projected = projectShape(map, tempShape)\n renderShapeOnCanvas(ctx, projected, tempShape, {\n isPreview: true,\n isSelected: true,\n theme: effectiveTheme,\n })\n }\n\n if (!isReadOnly && draftArrow) {\n const tempArrow: ArrowItem = {\n id: 'draft-arrow',\n type: 'arrow',\n arrowStyle: draftArrow.arrowStyle,\n start: draftArrow.startGeo,\n end: draftArrow.currentGeo,\n color: activeColor,\n strokeWidth,\n dashed,\n createdAt: 0,\n }\n const projected = projectArrow(map, tempArrow)\n renderArrowOnCanvas(ctx, projected, tempArrow, {\n isPreview: true,\n isSelected: true,\n theme: effectiveTheme,\n })\n }\n\n if (!isReadOnly && draftRuler) {\n const tempRuler: RulerItem = {\n id: 'draft-ruler',\n type: 'ruler',\n start: draftRuler.startGeo,\n end: draftRuler.currentGeo,\n color: activeColor,\n strokeWidth,\n dashed,\n unit: 'metric',\n createdAt: 0,\n }\n const projected = projectRuler(map, tempRuler)\n renderRulerOnCanvas(ctx, projected, tempRuler, {\n isPreview: true,\n isSelected: true,\n theme: effectiveTheme,\n })\n }\n\n ctx.restore()\n}\n\n\n","import type L from 'leaflet'\n\nexport interface MapViewportDimensions {\n width: number\n height: number\n}\n\nexport function bindLeafletSync(\n map: L.Map,\n onSync: (dimensions: MapViewportDimensions) => void,\n): () => void {\n const sync = () => {\n const size = map.getSize()\n onSync({ width: size.x, height: size.y })\n }\n\n sync()\n\n map.on('move', sync)\n map.on('zoom', sync)\n map.on('zoomanim', sync)\n map.on('viewreset', sync)\n map.on('resize', sync)\n\n return () => {\n map.off('move', sync)\n map.off('zoom', sync)\n map.off('zoomanim', sync)\n map.off('viewreset', sync)\n map.off('resize', sync)\n }\n}\n\ntype LeafletFlaggedElement = HTMLElement & { _leaflet_disable_events?: boolean }\n\nexport function bindBlockMapDblClick(map: L.Map): () => void {\n const container = map.getContainer()\n if (!container) return () => {}\n\n const handleDblClickCapture = (e: MouseEvent) => {\n const target = e.target as LeafletFlaggedElement | null\n if (\n !target?.closest?.(\n '[data-tual-overlay], input, textarea, select, button, .rlc-overlay',\n )\n ) {\n return\n }\n\n const hadFlag = Object.prototype.hasOwnProperty.call(\n target,\n '_leaflet_disable_events',\n )\n const previous = target._leaflet_disable_events\n target._leaflet_disable_events = true\n\n const wasZoomEnabled = Boolean(map.doubleClickZoom?.enabled?.())\n if (wasZoomEnabled) {\n map.doubleClickZoom.disable()\n }\n\n setTimeout(() => {\n if (hadFlag) {\n target._leaflet_disable_events = previous\n } else {\n delete target._leaflet_disable_events\n }\n if (wasZoomEnabled) {\n map.doubleClickZoom.enable()\n }\n }, 0)\n }\n\n const handleMouseDownCapture = (e: MouseEvent | TouchEvent) => {\n const target = e.target as HTMLElement | null\n if (\n target?.closest?.(\n 'textarea, input, select, button, [data-tual-note-resize], .rlc-note-resize-handle',\n )\n ) {\n if (map.dragging?.enabled?.()) {\n map.dragging.disable()\n const handleUp = () => {\n map.dragging.enable()\n window.removeEventListener('mouseup', handleUp, true)\n window.removeEventListener('touchend', handleUp, true)\n window.removeEventListener('pointerup', handleUp, true)\n }\n window.addEventListener('mouseup', handleUp, {\n capture: true,\n once: true,\n })\n window.addEventListener('touchend', handleUp, {\n capture: true,\n once: true,\n })\n window.addEventListener('pointerup', handleUp, {\n capture: true,\n once: true,\n })\n }\n }\n }\n\n container.addEventListener('dblclick', handleDblClickCapture, true)\n container.addEventListener('mousedown', handleMouseDownCapture, true)\n container.addEventListener('touchstart', handleMouseDownCapture, true)\n\n return () => {\n container.removeEventListener('dblclick', handleDblClickCapture, true)\n container.removeEventListener('mousedown', handleMouseDownCapture, true)\n container.removeEventListener('touchstart', handleMouseDownCapture, true)\n }\n}\n\n","import type {\n TualItem,\n TualTool,\n LeafletTualController,\n ShapeKind,\n UseLeafletTualOptions,\n} from '../types/index.js'\nimport {\n DEFAULT_FONT_SIZE,\n DEFAULT_NOTE_BG,\n DEFAULT_STROKE_COLOR,\n DEFAULT_STROKE_WIDTH,\n NOTE_COLOR_THEMES,\n} from '../shared/constants.js'\n\nexport interface LeafletTualStore extends LeafletTualController {\n subscribe: (listener: (controller: LeafletTualController) => void) => () => void\n getState: () => LeafletTualController\n destroy: () => void\n}\n\nexport function createLeafletTualController(\n options: UseLeafletTualOptions = {},\n): LeafletTualStore {\n const maxPast = Math.max(0, (options.maxHistory ?? 50) - 1)\n let past: TualItem[][] = []\n let present: TualItem[] = options.items ?? options.initialItems ?? []\n let future: TualItem[][] = []\n let committedItems: TualItem[] = present\n\n let activeTool: TualTool = options.initialTool ?? 'select'\n let readOnly = Boolean(options.readOnly ?? false)\n let selectedId: string | null = null\n let isEditingLabel = false\n\n let activeShape: ShapeKind = options.defaultShape ?? 'square'\n let shapeFilled = true\n let activeColor = options.defaultColor ?? DEFAULT_STROKE_COLOR\n let strokeWidth = options.defaultStrokeWidth ?? DEFAULT_STROKE_WIDTH\n let dashed = false\n let noteColor = options.defaultNoteColor ?? DEFAULT_NOTE_BG\n let fontSize = options.defaultFontSize ?? DEFAULT_FONT_SIZE\n let fontWeight: 'normal' | 'bold' = 'bold'\n\n const listeners = new Set<(controller: LeafletTualController) => void>()\n\n const notifyListeners = () => {\n for (const listener of listeners) {\n listener(store)\n }\n }\n\n const triggerChange = (next: TualItem[]) => {\n options.onItemsChange?.(next)\n options.onChange?.(next)\n }\n\n const triggerChangeComplete = (finalItems: TualItem[], targetItem?: TualItem | null) => {\n options.onItemsChangeComplete?.(finalItems, targetItem)\n options.onChangeComplete?.(finalItems, targetItem)\n options.onEditEnd?.(finalItems, targetItem)\n options.onEditComplete?.(finalItems, targetItem)\n if (targetItem) options.onItemChangeComplete?.(targetItem)\n }\n\n const commitItems = (updater: (prev: TualItem[]) => TualItem[]) => {\n const next = updater(present)\n present = next\n triggerChange(next)\n notifyListeners()\n return next\n }\n\n const notifyChangeComplete = (targetItem?: TualItem | null) => {\n if (present === committedItems) return\n const anchor = committedItems\n committedItems = present\n past = [...past, anchor].slice(-maxPast)\n future = []\n triggerChangeComplete(present, targetItem)\n notifyListeners()\n }\n\n const setSelectedId = (id: string | null) => {\n if (selectedId !== id) {\n const prev = selectedId\n selectedId = id\n isEditingLabel = false\n if (prev !== null && id === null) notifyChangeComplete()\n options.onItemSelect?.(present.find((it) => it.id === id) ?? null)\n notifyListeners()\n }\n }\n\n const setActiveTool = (tool: TualTool) => {\n if (readOnly && tool !== 'select') return\n activeTool = tool\n options.onToolChange?.(tool)\n notifyListeners()\n }\n\n const setReadOnly = (nextReadOnly: boolean) => {\n readOnly = Boolean(nextReadOnly)\n if (readOnly && activeTool !== 'select') {\n activeTool = 'select'\n }\n notifyListeners()\n }\n\n const patchSelected = (predicate: (it: TualItem) => boolean, patcher: (it: any) => any) => {\n if (!selectedId) return\n commitItems((prev) =>\n prev.map((it) => (it.id === selectedId && predicate(it) ? patcher(it) : it)),\n )\n }\n\n const setActiveShape = (shape: ShapeKind) => {\n if (readOnly) return\n activeShape = shape\n patchSelected((it) => it.type === 'shape', (it) => ({ ...it, shape }))\n notifyListeners()\n }\n\n const setShapeFilled = (filled: boolean) => {\n if (readOnly) return\n shapeFilled = filled\n patchSelected((it) => it.type === 'shape', (it) => ({ ...it, filled }))\n notifyListeners()\n }\n\n const setActiveColor = (color: string) => {\n if (readOnly) return\n activeColor = color\n patchSelected((it) => it.type !== 'note', (it) => ({ ...it, color }))\n notifyListeners()\n }\n\n const setStrokeWidth = (width: number) => {\n if (readOnly) return\n strokeWidth = width\n patchSelected(\n (it) =>\n it.type === 'arrow' ||\n it.type === 'freedraw' ||\n it.type === 'shape' ||\n it.type === 'ruler',\n (it) => ({ ...it, strokeWidth: width }),\n )\n notifyListeners()\n }\n\n const setDashed = (nextDashed: boolean) => {\n if (readOnly) return\n dashed = nextDashed\n patchSelected(\n (it) =>\n it.type === 'arrow' ||\n it.type === 'freedraw' ||\n it.type === 'shape' ||\n it.type === 'ruler',\n (it) => ({ ...it, dashed: nextDashed }),\n )\n notifyListeners()\n }\n\n const setNoteColor = (bg: string) => {\n if (readOnly) return\n noteColor = bg\n const theme = NOTE_COLOR_THEMES.find((t) => t.bg === bg)\n patchSelected(\n (it) => it.type === 'note',\n (it) => ({ ...it, backgroundColor: bg, textColor: theme?.text ?? it.textColor }),\n )\n notifyListeners()\n }\n\n const setFontSize = (size: number) => {\n if (readOnly) return\n fontSize = size\n patchSelected((it) => it.type === 'text', (it) => ({ ...it, initialFontSize: size }))\n notifyListeners()\n }\n\n const setFontWeight = (weight: 'normal' | 'bold') => {\n if (readOnly) return\n fontWeight = weight\n patchSelected((it) => it.type === 'text', (it) => ({ ...it, fontWeight: weight }))\n notifyListeners()\n }\n\n const setEditingLabel = (editing: boolean) => {\n isEditingLabel = editing\n notifyListeners()\n }\n\n const addItem = (item: TualItem) => {\n if (readOnly) return\n commitItems((prev) => [...prev, item])\n setSelectedId(item.id)\n options.onItemCreate?.(item)\n }\n\n const updateItem = (id: string, patch: Partial<TualItem>) => {\n if (readOnly) {\n const patchKeys = Object.keys(patch)\n if (patchKeys.length !== 1 || patchKeys[0] !== 'minimized') return\n }\n let updated: TualItem | undefined\n commitItems((prev) =>\n prev.map((item) => {\n if (item.id === id) {\n updated = { ...item, ...patch } as TualItem\n return updated\n }\n return item\n }),\n )\n if (updated) options.onItemChange?.(updated)\n }\n\n const removeItem = (id: string) => {\n if (readOnly) return\n commitItems((prev) => prev.filter((item) => item.id !== id))\n if (selectedId === id) setSelectedId(null)\n options.onItemDelete?.(id)\n notifyChangeComplete()\n }\n\n const deleteSelected = () => {\n if (!readOnly && selectedId) removeItem(selectedId)\n }\n\n const clearAll = () => {\n if (readOnly) return\n commitItems(() => [])\n setSelectedId(null)\n notifyChangeComplete()\n }\n\n const undo = () => {\n if (readOnly || past.length === 0) return\n const restored = past[past.length - 1]\n future = [present, ...future]\n past = past.slice(0, -1)\n present = restored\n committedItems = restored\n triggerChange(restored)\n triggerChangeComplete(restored, null)\n notifyListeners()\n }\n\n const redo = () => {\n if (readOnly || future.length === 0) return\n const next = future[0]\n past = [...past, present]\n future = future.slice(1)\n present = next\n committedItems = next\n triggerChange(next)\n triggerChangeComplete(next, null)\n notifyListeners()\n }\n\n const exportJSON = () => JSON.stringify(present, null, 2)\n\n const importJSON = (json: string): boolean => {\n if (readOnly) return false\n try {\n const parsed = JSON.parse(json)\n if (!Array.isArray(parsed)) return false\n commitItems(() => parsed as TualItem[])\n setSelectedId(null)\n notifyChangeComplete()\n return true\n } catch {\n return false\n }\n }\n\n const store: LeafletTualStore = {\n get items() {\n return present\n },\n get activeTool() {\n return activeTool\n },\n setActiveTool,\n get readOnly() {\n return readOnly\n },\n setReadOnly,\n get activeShape() {\n return activeShape\n },\n setActiveShape,\n get shapeFilled() {\n return shapeFilled\n },\n setShapeFilled,\n get selectedId() {\n return selectedId\n },\n setSelectedId,\n get selectedItem() {\n return present.find((it) => it.id === selectedId) ?? null\n },\n get isEditingLabel() {\n return isEditingLabel\n },\n setEditingLabel,\n get labelEditMode() {\n return isEditingLabel\n },\n setLabelEditMode: setEditingLabel,\n get activeColor() {\n return activeColor\n },\n setActiveColor,\n get strokeWidth() {\n return strokeWidth\n },\n setStrokeWidth,\n get dashed() {\n return dashed\n },\n setDashed,\n get noteColor() {\n return noteColor\n },\n setNoteColor,\n get fontSize() {\n return fontSize\n },\n setFontSize,\n get fontWeight() {\n return fontWeight\n },\n setFontWeight,\n addItem,\n updateItem,\n removeItem,\n deleteSelected,\n clearAll,\n clear: clearAll,\n deleteItem: removeItem,\n setTool: setActiveTool,\n selectItem: setSelectedId,\n undo,\n redo,\n get canUndo() {\n return !readOnly && past.length > 0\n },\n get canRedo() {\n return !readOnly && future.length > 0\n },\n notifyChangeComplete,\n exportJSON,\n importJSON,\n subscribe(listener) {\n listeners.add(listener)\n return () => {\n listeners.delete(listener)\n }\n },\n getState() {\n return store\n },\n destroy() {\n listeners.clear()\n },\n }\n\n return store\n}\n\n\n","import type L from 'leaflet'\nimport type {\n ArrowItem,\n ArrowRenderTheme,\n TualAnnotationTheme,\n TualLabels,\n DraftArrowState,\n DraftRulerState,\n DraftShapeState,\n FreeDrawItem,\n GeoPoint,\n RulerItem,\n ScreenPoint,\n ShapeItem,\n UseLeafletTualOptions,\n} from '../types/index.js'\nimport {\n constrainAngleTo45Degrees,\n geoToScreen,\n screenToGeo,\n TOOL_TO_ARROW_STYLE,\n} from '../shared/index.js'\nimport {\n hitTestArrow,\n hitTestArrowHandle,\n hitTestFreeDraw,\n hitTestRuler,\n hitTestRulerHandle,\n hitTestShape,\n hitTestShapeHandle,\n projectArrow,\n projectFreeDraw,\n projectRuler,\n projectShape,\n} from '../entities/index.js'\nimport {\n buildArrowItem,\n createDraftNote,\n createDraftText,\n startArrowDrag,\n startFreeDrawDrag,\n startRulerDrag,\n startShapeDrag,\n} from './drawing-drag-handlers.js'\nimport {\n startArrowBodyDrag,\n startArrowHandleDrag,\n startFreeDrawBodyDrag,\n startRulerBodyDrag,\n startRulerHandleDrag,\n startShapeBodyDrag,\n startShapeHandleDrag,\n} from './select-drag-handlers.js'\nimport { paintLeafletTual } from './tual-painter.js'\nimport { bindBlockMapDblClick, bindLeafletSync } from './map-sync.js'\nimport {\n createLeafletTualController,\n type LeafletTualStore,\n} from './tual-controller.js'\n\nexport interface CreateLeafletTualOptions extends UseLeafletTualOptions {\n controller?: LeafletTualStore\n annotationTheme?: TualAnnotationTheme\n arrowTheme?: ArrowRenderTheme\n labels?: TualLabels\n}\n\nexport interface LeafletTualInstance {\n controller: LeafletTualStore\n container: HTMLDivElement\n canvas: HTMLCanvasElement\n repaint: () => void\n destroy: () => void\n}\n\nexport function createLeafletTual(\n map: L.Map,\n options: CreateLeafletTualOptions = {},\n): LeafletTualInstance {\n const {\n controller: externalController,\n annotationTheme,\n arrowTheme,\n labels,\n zIndex = 650,\n ...controllerOptions\n } = options\n\n const controller = externalController ?? createLeafletTualController(controllerOptions)\n const mapContainer = map.getContainer()\n\n const container = document.createElement('div')\n container.setAttribute('data-tual-overlay', 'true')\n container.style.position = 'absolute'\n container.style.inset = '0'\n container.style.pointerEvents = 'none'\n container.style.zIndex = String(zIndex)\n container.style.overflow = 'hidden'\n\n const canvas = document.createElement('canvas')\n canvas.style.position = 'absolute'\n canvas.style.top = '0'\n canvas.style.left = '0'\n canvas.style.pointerEvents = 'none'\n\n const drawingSurface = document.createElement('div')\n drawingSurface.style.position = 'absolute'\n drawingSurface.style.inset = '0'\n drawingSurface.style.pointerEvents = 'none'\n\n container.appendChild(canvas)\n container.appendChild(drawingSurface)\n mapContainer.appendChild(container)\n\n let viewport = { width: 0, height: 0 }\n let draftArrow: DraftArrowState | null = null\n let draftShape: DraftShapeState | null = null\n let draftRuler: DraftRulerState | null = null\n const draftFreeDrawRef: {\n current: { screenPoints: ScreenPoint[]; geoPoints: GeoPoint[] } | null\n } = { current: null }\n const rafIdRef: { current: number | null } = { current: null }\n\n const setDraftArrow = (next: DraftArrowState | null) => {\n draftArrow = next\n repaint()\n }\n\n const setDraftShape = (next: DraftShapeState | null) => {\n draftShape = next\n repaint()\n }\n\n const setDraftRuler = (next: DraftRulerState | null) => {\n draftRuler = next\n repaint()\n }\n\n const clearDraftFreeDraw = () => {\n draftFreeDrawRef.current = null\n if (rafIdRef.current !== null && typeof window !== 'undefined') {\n window.cancelAnimationFrame(rafIdRef.current)\n rafIdRef.current = null\n }\n }\n\n const updateSurfaceInteractivity = () => {\n const isDrawing = !controller.readOnly && controller.activeTool !== 'select'\n drawingSurface.style.pointerEvents = isDrawing ? 'auto' : 'none'\n drawingSurface.style.cursor = isDrawing ? 'crosshair' : 'default'\n canvas.style.width = `${viewport.width}px`\n canvas.style.height = `${viewport.height}px`\n }\n\n const repaint = () => {\n updateSurfaceInteractivity()\n const items = controller.items\n paintLeafletTual({\n map,\n canvas,\n width: viewport.width,\n height: viewport.height,\n arrowItems: items.filter((it): it is ArrowItem => it.type === 'arrow'),\n shapeItems: items.filter((it): it is ShapeItem => it.type === 'shape'),\n freeDrawItems: items.filter((it): it is FreeDrawItem => it.type === 'freedraw'),\n rulerItems: items.filter((it): it is RulerItem => it.type === 'ruler'),\n selectedId: controller.selectedId,\n draftShape,\n draftArrow,\n draftRuler,\n draftFreeDraw: draftFreeDrawRef.current,\n activeColor: controller.activeColor,\n strokeWidth: controller.strokeWidth,\n dashed: controller.dashed,\n shapeFilled: controller.shapeFilled,\n annotationTheme,\n arrowTheme,\n isReadOnly: controller.readOnly,\n })\n }\n\n const getLocalPoint = (e: PointerEvent | MouseEvent): ScreenPoint => {\n const rect = mapContainer.getBoundingClientRect()\n return { x: e.clientX - rect.left, y: e.clientY - rect.top }\n }\n\n const handleSurfacePointerDown = (e: PointerEvent) => {\n if (e.button !== 0 || controller.readOnly) return\n e.stopPropagation()\n e.preventDefault()\n\n const pt = getLocalPoint(e)\n const geo = screenToGeo(map, pt)\n const { activeTool, activeShape, shapeFilled, activeColor, strokeWidth, dashed, noteColor, fontSize, fontWeight } =\n controller\n\n if (activeTool === 'freedraw') {\n startFreeDrawDrag(\n map,\n mapContainer,\n pt,\n geo,\n activeColor,\n strokeWidth,\n dashed,\n draftFreeDrawRef,\n rafIdRef,\n repaint,\n controller.addItem,\n controller.setActiveTool,\n )\n return\n }\n\n if (activeTool === 'shape') {\n startShapeDrag(\n map,\n mapContainer,\n pt,\n geo,\n activeShape,\n activeColor,\n shapeFilled,\n strokeWidth,\n dashed,\n setDraftShape,\n controller.addItem,\n controller.setActiveTool,\n )\n return\n }\n\n if (activeTool === 'note') {\n controller.addItem(createDraftNote(geo, noteColor, labels?.noteDefaultTitle ?? 'Field Note'))\n controller.setActiveTool('select')\n return\n }\n\n if (activeTool === 'text') {\n controller.addItem(\n createDraftText(geo, activeColor, fontSize, fontWeight, map.getZoom?.() ?? 14),\n )\n controller.setActiveTool('select')\n return\n }\n\n if (activeTool === 'ruler') {\n startRulerDrag(\n map,\n mapContainer,\n pt,\n geo,\n activeColor,\n strokeWidth,\n dashed,\n setDraftRuler,\n controller.addItem,\n controller.setActiveTool,\n )\n return\n }\n\n const arrowStyle = TOOL_TO_ARROW_STYLE[activeTool]\n if (!arrowStyle) return\n\n if (!draftArrow) {\n startArrowDrag(\n map,\n mapContainer,\n pt,\n geo,\n arrowStyle,\n activeColor,\n strokeWidth,\n dashed,\n setDraftArrow,\n controller.addItem,\n controller.setActiveTool,\n )\n } else {\n const startScreen = geoToScreen(map, draftArrow.startGeo)\n const endScreen = e.shiftKey ? constrainAngleTo45Degrees(startScreen, pt) : pt\n if (Math.hypot(endScreen.x - startScreen.x, endScreen.y - startScreen.y) >= 4) {\n controller.addItem(\n buildArrowItem(\n draftArrow.arrowStyle,\n draftArrow.startGeo,\n screenToGeo(map, endScreen),\n activeColor,\n strokeWidth,\n dashed,\n ),\n )\n }\n setDraftArrow(null)\n controller.setActiveTool('select')\n }\n }\n\n const handleSurfacePointerMove = (e: PointerEvent) => {\n if (!draftArrow) return\n const rawPt = getLocalPoint(e)\n const startScreen = geoToScreen(map, draftArrow.startGeo)\n const nextPt = e.shiftKey ? constrainAngleTo45Degrees(startScreen, rawPt) : rawPt\n setDraftArrow({ ...draftArrow, currentGeo: screenToGeo(map, nextPt) })\n }\n\n const handleContainerPointerDown = (e: PointerEvent) => {\n if (e.button !== 0 || controller.readOnly || controller.activeTool !== 'select') return\n const target = e.target as HTMLElement | null\n if (target?.closest('[data-tual-toolbar], [data-tual-note], [data-tual-text], .leaflet-control')) {\n return\n }\n\n const pt = getLocalPoint(e)\n const items = controller.items\n const arrowItems = items.filter((it): it is ArrowItem => it.type === 'arrow')\n const shapeItems = items.filter((it): it is ShapeItem => it.type === 'shape')\n const freeDrawItems = items.filter((it): it is FreeDrawItem => it.type === 'freedraw')\n const rulerItems = items.filter((it): it is RulerItem => it.type === 'ruler')\n const selectedId = controller.selectedId\n\n const selectedArrow = arrowItems.find((a) => a.id === selectedId)\n if (selectedArrow) {\n const projected = projectArrow(map, selectedArrow)\n const handle = hitTestArrowHandle(pt, projected, selectedArrow)\n if (handle) {\n e.stopPropagation()\n e.preventDefault()\n startArrowHandleDrag(map, selectedArrow, projected, handle, getLocalPoint, controller.updateItem)\n return\n }\n }\n\n const selectedShape = shapeItems.find((s) => s.id === selectedId)\n if (selectedShape) {\n const projected = projectShape(map, selectedShape)\n const handle = hitTestShapeHandle(pt, projected)\n if (handle) {\n e.stopPropagation()\n e.preventDefault()\n startShapeHandleDrag(map, selectedShape, projected, handle, getLocalPoint, controller.updateItem)\n return\n }\n }\n\n const selectedRuler = rulerItems.find((r) => r.id === selectedId)\n if (selectedRuler) {\n const projected = projectRuler(map, selectedRuler)\n const handle = hitTestRulerHandle(pt, projected)\n if (handle) {\n e.stopPropagation()\n e.preventDefault()\n startRulerHandleDrag(map, selectedRuler, projected, handle, getLocalPoint, controller.updateItem)\n return\n }\n }\n\n for (let i = arrowItems.length - 1; i >= 0; i -= 1) {\n const arrow = arrowItems[i]\n const projected = projectArrow(map, arrow)\n if (hitTestArrow(pt, projected, arrow)) {\n e.stopPropagation()\n e.preventDefault()\n controller.setSelectedId(arrow.id)\n startArrowBodyDrag(map, arrow, projected, pt, getLocalPoint, controller.updateItem)\n return\n }\n }\n\n for (let i = shapeItems.length - 1; i >= 0; i -= 1) {\n const shp = shapeItems[i]\n const projected = projectShape(map, shp)\n if (hitTestShape(pt, projected)) {\n e.stopPropagation()\n e.preventDefault()\n controller.setSelectedId(shp.id)\n startShapeBodyDrag(map, shp, projected, pt, getLocalPoint, controller.updateItem)\n return\n }\n }\n\n for (let i = freeDrawItems.length - 1; i >= 0; i -= 1) {\n const fd = freeDrawItems[i]\n const initialScreenPts = projectFreeDraw(map, fd)\n if (hitTestFreeDraw(pt, initialScreenPts, fd)) {\n e.stopPropagation()\n e.preventDefault()\n controller.setSelectedId(fd.id)\n startFreeDrawBodyDrag(map, fd, initialScreenPts, pt, getLocalPoint, controller.updateItem)\n return\n }\n }\n\n for (let i = rulerItems.length - 1; i >= 0; i -= 1) {\n const ruler = rulerItems[i]\n const projected = projectRuler(map, ruler)\n if (hitTestRuler(pt, projected, ruler)) {\n e.stopPropagation()\n e.preventDefault()\n controller.setSelectedId(ruler.id)\n startRulerBodyDrag(map, ruler, projected, pt, getLocalPoint, controller.updateItem)\n return\n }\n }\n\n if (selectedId) {\n controller.setSelectedId(null)\n controller.notifyChangeComplete()\n }\n }\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (controller.readOnly) return\n const target = e.target as HTMLElement | null\n if (\n target &&\n (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable)\n ) {\n return\n }\n if (e.key === 'Escape') {\n draftArrow = null\n draftShape = null\n draftRuler = null\n clearDraftFreeDraw()\n controller.setSelectedId(null)\n controller.setActiveTool('select')\n controller.notifyChangeComplete()\n repaint()\n } else if ((e.key === 'Delete' || e.key === 'Backspace') && controller.selectedId) {\n e.preventDefault()\n controller.deleteSelected()\n }\n }\n\n drawingSurface.addEventListener('pointerdown', handleSurfacePointerDown)\n drawingSurface.addEventListener('pointermove', handleSurfacePointerMove)\n mapContainer.addEventListener('pointerdown', handleContainerPointerDown, { capture: true })\n if (typeof window !== 'undefined') {\n window.addEventListener('keydown', handleKeyDown)\n }\n\n const unbindSync = bindLeafletSync(map, (dims) => {\n viewport = dims\n repaint()\n })\n const unbindDblClick = bindBlockMapDblClick(map)\n const unsubscribeController = controller.subscribe(() => {\n repaint()\n })\n\n repaint()\n\n return {\n controller,\n container,\n canvas,\n repaint,\n destroy() {\n drawingSurface.removeEventListener('pointerdown', handleSurfacePointerDown)\n drawingSurface.removeEventListener('pointermove', handleSurfacePointerMove)\n mapContainer.removeEventListener('pointerdown', handleContainerPointerDown, { capture: true })\n if (typeof window !== 'undefined') {\n window.removeEventListener('keydown', handleKeyDown)\n }\n clearDraftFreeDraw()\n unbindSync()\n unbindDblClick()\n unsubscribeController()\n if (!externalController) {\n controller.destroy()\n }\n container.remove()\n },\n }\n}\n\n\n","/**\n * leaflet-tual — core (framework-agnostic)\n *\n * Interactive canvas and annotation toolkit for Leaflet maps — draw vector\n * arrows, geometric shapes, freehand sketches, rulers, sticky notes, and text\n * overlays that stay geographically synchronized with Leaflet across panning\n * and zooming.\n *\n * This module is the entire framework-agnostic public surface. It has zero\n * dependency on React or any UI framework, so it can be used directly from\n * vanilla JavaScript, TypeScript, Vue, Svelte, Angular, or a plain `<script>` tag.\n *\n * React users: see `leaflet-tual/react` for `<LeafletTual>`, `<TualToolbar>`,\n * `useLeafletTual`, and `useLeafletSync`.\n */\n\nimport pkg from '../../package.json'\n\nexport * from './types/index.js'\nexport * from './shared/index.js'\nexport * from './entities/index.js'\nexport * from './features/index.js'\n\nexport const VERSION: string = pkg.version\n\n","'use client'\n\nimport { useEffect, useRef, useState } from 'react'\nimport type L from 'leaflet'\nimport type { TualLabels, ShapeItem } from '../../types/index.js'\nimport { projectShape } from '../../../core/entities/shape/render-shape.js'\n\nexport interface InlineShapeLabelEditorProps {\n shape: ShapeItem\n map: L.Map\n labels?: TualLabels\n onUpdate: (id: string, patch: Partial<ShapeItem>) => void\n onClose: () => void\n}\n\nexport function InlineShapeLabelEditor({\n shape,\n map,\n labels,\n onUpdate,\n onClose,\n}: InlineShapeLabelEditorProps) {\n const [text, setText] = useState(shape.label ?? '')\n const inputRef = useRef<HTMLInputElement | null>(null)\n\n useEffect(() => {\n inputRef.current?.focus()\n inputRef.current?.select()\n }, [])\n\n const projected = projectShape(map, shape)\n const midX = Math.round(projected.cx)\n const midY = Math.round(\n shape.shape === 'actor' ? projected.maxY + 14 : projected.cy,\n )\n\n return (\n <div\n data-tual-inline-shape-label\n style={{\n position: 'absolute',\n left: `${midX}px`,\n top: `${midY}px`,\n transform: 'translate(-50%, -50%)',\n zIndex: 1000,\n pointerEvents: 'auto',\n }}\n onClick={(e) => e.stopPropagation()}\n onPointerDown={(e) => e.stopPropagation()}\n >\n <input\n ref={inputRef}\n type=\"text\"\n data-tual-shape-label-input={shape.id}\n data-testid=\"inline-shape-label-input\"\n data-label-mode=\"true\"\n placeholder={labels?.shapeLabelPlaceholder ?? 'Shape label...'}\n value={text}\n onChange={(e) => {\n setText(e.target.value)\n onUpdate(shape.id, { label: e.target.value })\n }}\n onBlur={onClose}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === 'Escape') {\n e.preventDefault()\n onClose()\n }\n }}\n style={{\n minWidth: '100px',\n padding: '2px 6px',\n borderRadius: '4px',\n border: '1px solid #2563eb',\n backgroundColor: '#ffffff',\n color: '#000000',\n fontSize: '12px',\n boxShadow: '0 2px 6px rgba(0, 0, 0, 0.25)',\n outline: 'none',\n }}\n />\n </div>\n )\n}\n","import React, { useEffect, useRef, useState } from 'react'\nimport type { NoteOverlayProps } from './types.js'\nimport { clampNotePosition, getDefaultNoteCardStyle, resolveNoteTheme } from './utils.js'\nimport { useNoteDragResize } from './use-note-drag-resize.js'\nimport { NoteCardView } from './NoteCardView.js'\nimport { NoteCustomRenderView } from './NoteCustomRenderView.js'\n\nexport type { NoteOverlayProps } from './types.js'\n\nexport const NoteOverlay = React.memo(function NoteOverlay({\n item,\n screenPos,\n isSelected,\n map,\n readOnly = false,\n labels,\n icons,\n unstyled = false,\n classNames,\n styles,\n clampToViewport = true,\n autoMinimizeZoomThreshold,\n renderNote,\n onSelect,\n onUpdate,\n onDelete,\n onComplete,\n}: NoteOverlayProps) {\n const cardRef = useRef<HTMLDivElement | null>(null)\n const textareaRef = useRef<HTMLTextAreaElement | null>(null)\n\n const currentZoom = typeof map?.getZoom === 'function' ? map.getZoom() : null\n const [expandedLocally, setExpandedLocally] = useState(false)\n const lastZoomRef = useRef<number | null>(currentZoom)\n\n useEffect(() => {\n if (currentZoom !== null) {\n if (lastZoomRef.current !== null && lastZoomRef.current !== currentZoom) setExpandedLocally(false)\n lastZoomRef.current = currentZoom\n }\n }, [currentZoom])\n\n const autoCompact =\n typeof autoMinimizeZoomThreshold === 'number' && currentZoom !== null && !expandedLocally && currentZoom < autoMinimizeZoomThreshold\n\n const isCompact =\n !expandedLocally &&\n (autoCompact || item.collapseState === 'compact' || item.collapseState === 'collapsed' || item.minimized === true || item.minimized === 'compact')\n\n const {\n isDragging,\n didDragRef,\n handleHeaderPointerDown,\n handleResizePointerDown,\n handleTextareaPointerDown,\n } = useNoteDragResize({\n item,\n screenPos,\n map,\n readOnly,\n isCompact,\n cardRef,\n textareaRef,\n onSelect,\n onUpdate,\n onComplete,\n })\n\n useEffect(() => {\n const el = cardRef.current\n if (!el) return\n const stopPropagation = (e: Event) => {\n const target = e.target as HTMLElement | null\n if (target?.closest('.rlc-note-header') && !target.closest('button, input')) return\n e.stopPropagation()\n }\n el.addEventListener('mousedown', stopPropagation)\n el.addEventListener('touchstart', stopPropagation)\n return () => {\n el.removeEventListener('mousedown', stopPropagation)\n el.removeEventListener('touchstart', stopPropagation)\n }\n }, [])\n\n const handleExpandFromCompact = (e?: React.MouseEvent) => {\n e?.stopPropagation()\n setExpandedLocally(true)\n if (!readOnly) onSelect(item.id)\n onUpdate(item.id, { minimized: false })\n }\n\n const theme = resolveNoteTheme(item.backgroundColor)\n const { x: renderX, y: renderY } = clampNotePosition(\n map,\n screenPos,\n item,\n isCompact,\n isDragging,\n clampToViewport,\n )\n\n const structuralRootStyle: React.CSSProperties = {\n position: 'absolute',\n left: `${renderX}px`,\n top: `${renderY}px`,\n pointerEvents: 'auto',\n zIndex: !readOnly && isSelected ? 30 : 20,\n userSelect: readOnly ? 'text' : 'none',\n }\n\n const cardClassName = [\n 'rlc-note-card',\n isCompact ? 'rlc-note-compact rlc-note-collapsed' : undefined,\n classNames?.noteCard,\n isCompact ? classNames?.noteCompact : undefined,\n isCompact ? classNames?.noteCollapsed : undefined,\n !readOnly && isSelected ? classNames?.noteCardSelected : undefined,\n ]\n .filter(Boolean)\n .join(' ')\n\n const handleCardClick = (e: React.MouseEvent) => {\n e.stopPropagation()\n if (didDragRef.current) {\n didDragRef.current = false\n return\n }\n if (isCompact) {\n handleExpandFromCompact(e)\n return\n }\n if (!readOnly) onSelect(item.id)\n }\n\n const handleCardDoubleClick = (e: React.MouseEvent) => {\n e.stopPropagation()\n if (didDragRef.current) {\n didDragRef.current = false\n return\n }\n if (isCompact) handleExpandFromCompact(e)\n }\n\n if (renderNote) {\n return (\n <NoteCustomRenderView\n item={item}\n screenPos={screenPos}\n isSelected={isSelected}\n isDragging={isDragging}\n readOnly={readOnly}\n isCompact={isCompact}\n cardClassName={cardClassName}\n structuralRootStyle={structuralRootStyle}\n styles={styles}\n renderNote={renderNote}\n onCardClick={handleCardClick}\n onCardDoubleClick={handleCardDoubleClick}\n handleHeaderPointerDown={handleHeaderPointerDown}\n handleResizePointerDown={handleResizePointerDown}\n onSelect={onSelect}\n onUpdate={onUpdate}\n onDelete={onDelete}\n />\n )\n }\n\n return (\n <div\n ref={cardRef}\n data-tual-note={item.id}\n data-collapsed={isCompact ? 'true' : undefined}\n data-compact={isCompact ? 'true' : undefined}\n data-selected={(!readOnly && isSelected) || undefined}\n data-dragging={isDragging || undefined}\n className={cardClassName}\n onClick={handleCardClick}\n onDoubleClick={handleCardDoubleClick}\n onWheel={(e) => e.stopPropagation()}\n style={{\n ...structuralRootStyle,\n ...getDefaultNoteCardStyle(item, theme, isCompact, isSelected, readOnly, isDragging, unstyled),\n ...styles?.noteCard,\n ...(isCompact ? { borderRadius: '9999px', ...styles?.noteCollapsed, ...styles?.noteCompact } : undefined),\n ...(!readOnly && isSelected ? styles?.noteCardSelected : undefined),\n }}\n >\n <NoteCardView\n item={item}\n theme={theme}\n isCompact={isCompact}\n isDragging={isDragging}\n readOnly={readOnly}\n unstyled={unstyled}\n labels={labels}\n icons={icons}\n classNames={classNames}\n styles={styles}\n textareaRef={textareaRef}\n onHeaderPointerDown={handleHeaderPointerDown}\n onExpandFromCompact={handleExpandFromCompact}\n onCollapse={() => {\n setExpandedLocally(false)\n onUpdate(item.id, { minimized: true })\n }}\n onSelect={onSelect}\n onUpdate={onUpdate}\n onDelete={onDelete}\n onComplete={onComplete}\n onTextareaPointerDown={handleTextareaPointerDown}\n />\n </div>\n )\n})\n","import type React from 'react'\nimport type L from 'leaflet'\nimport type { NoteItem, ScreenPoint } from '../../types/index.js'\nimport { NOTE_COLOR_THEMES } from '../../shared/constants.js'\nimport { getMapDimensions } from '../../shared/geo.js'\nimport type { ResolvedNoteTheme } from './types.js'\n\nexport function resolveNoteTheme(backgroundColor: string): ResolvedNoteTheme {\n const matchedTheme = NOTE_COLOR_THEMES.find((t) => t.bg === backgroundColor)\n if (matchedTheme) return matchedTheme\n\n const isDarkBg =\n (backgroundColor?.startsWith('#') &&\n backgroundColor.length === 7 &&\n parseInt(backgroundColor.slice(1), 16) < 0x888888) ||\n backgroundColor === '#111827' ||\n backgroundColor === '#1e293b' ||\n backgroundColor === '#0f172a'\n\n return {\n name: 'Custom',\n bg: backgroundColor,\n border: isDarkBg ? 'rgba(255, 255, 255, 0.16)' : 'rgba(0, 0, 0, 0.12)',\n header: isDarkBg ? 'rgba(255, 255, 255, 0.08)' : 'rgba(0, 0, 0, 0.06)',\n text: isDarkBg ? '#f8fafc' : '#0f172a',\n }\n}\n\nexport function clampNotePosition(\n map: L.Map,\n screenPos: ScreenPoint,\n item: NoteItem,\n isCompact: boolean,\n isDragging: boolean,\n clampToViewport = true,\n): ScreenPoint {\n const mapDims = clampToViewport !== false ? getMapDimensions(map) : null\n if (!mapDims || isDragging) return screenPos\n\n const isAnchorNearViewport =\n screenPos.x >= -120 &&\n screenPos.x <= mapDims.width + 120 &&\n screenPos.y >= -120 &&\n screenPos.y <= mapDims.height + 120\n\n if (!isAnchorNearViewport) return screenPos\n\n const cardWidth = isCompact ? 95 : (item.width ?? 230)\n const cardHeight = isCompact ? 22 : (item.height ?? 100)\n const pad = 8\n const minX = 16 + pad\n const maxX = Math.max(minX, mapDims.width - cardWidth + 16 - pad)\n const minY = 12 + pad\n const maxY = Math.max(minY, mapDims.height - cardHeight + 12 - pad)\n\n return {\n x: Math.max(minX, Math.min(maxX, screenPos.x)),\n y: Math.max(minY, Math.min(maxY, screenPos.y)),\n }\n}\n\nexport function getDefaultNoteCardStyle(\n item: NoteItem,\n theme: ResolvedNoteTheme,\n isCompact: boolean,\n isSelected: boolean,\n readOnly: boolean,\n isDragging: boolean,\n unstyled: boolean,\n): React.CSSProperties {\n if (unstyled) return { transform: 'translate(-16px, -12px)' }\n\n if (isCompact) {\n return {\n transform: 'translate(-16px, -12px)',\n width: 'auto',\n minWidth: '24px',\n maxWidth: '130px',\n height: '22px',\n boxSizing: 'border-box',\n backgroundColor: item.backgroundColor,\n color: item.textColor || theme.text,\n border: `1px solid ${!readOnly && isSelected ? '#4b5563' : theme.border}`,\n borderRadius: '9999px',\n overflow: 'hidden',\n boxShadow:\n !readOnly && isSelected\n ? '0 2px 6px rgba(0, 0, 0, 0.25)'\n : '0 1px 3px rgba(0, 0, 0, 0.12)',\n fontFamily: 'Inter, system-ui, -apple-system, sans-serif',\n display: 'inline-flex',\n alignItems: 'center',\n padding: '0 8px',\n gap: '4px',\n cursor: readOnly ? 'default' : isDragging ? 'grabbing' : 'grab',\n transition: 'none',\n }\n }\n\n return {\n transform: 'translate(-16px, -12px)',\n width: `${item.width ?? 230}px`,\n boxSizing: 'border-box',\n backgroundColor: item.backgroundColor,\n color: item.textColor || theme.text,\n border: `1px solid ${!readOnly && isSelected ? '#4b5563' : theme.border}`,\n borderRadius: '2px',\n overflow: 'hidden',\n boxShadow:\n !readOnly && isSelected\n ? '0 2px 6px rgba(0, 0, 0, 0.2)'\n : '0 1px 3px rgba(0, 0, 0, 0.12)',\n fontFamily: 'Inter, system-ui, -apple-system, sans-serif',\n transition: 'none',\n }\n}\n\n","import { useEffect, useRef, useState } from 'react'\nimport type React from 'react'\nimport type L from 'leaflet'\nimport type { NoteItem, ScreenPoint } from '../../types/index.js'\nimport { screenToGeo } from '../../shared/geo.js'\nimport { startNoteResize } from './note-resize-handler.js'\n\nexport interface UseNoteDragResizeOptions {\n item: NoteItem\n screenPos: ScreenPoint\n map: L.Map\n readOnly: boolean\n isCompact: boolean\n cardRef: React.RefObject<HTMLDivElement | null>\n textareaRef: React.RefObject<HTMLTextAreaElement | null>\n onSelect: (id: string) => void\n onUpdate: (id: string, patch: Partial<NoteItem>) => void\n onComplete?: () => void\n}\n\nexport function useNoteDragResize({\n item,\n screenPos,\n map,\n readOnly,\n isCompact,\n cardRef,\n textareaRef,\n onSelect,\n onUpdate,\n onComplete,\n}: UseNoteDragResizeOptions) {\n const [isDragging, setIsDragging] = useState(false)\n const dragOffsetRef = useRef({ dx: 0, dy: 0 })\n const didDragRef = useRef(false)\n const dragStartPosRef = useRef({ x: 0, y: 0 })\n const pendingCommitRef = useRef<{ timer: ReturnType<typeof setTimeout> | null }>({ timer: null })\n\n const commitResize = (nextW: number, nextH: number) => {\n if (pendingCommitRef.current.timer) {\n clearTimeout(pendingCommitRef.current.timer)\n pendingCommitRef.current.timer = null\n }\n map.dragging?.enable?.()\n if (cardRef.current) cardRef.current.style.transition = 'none'\n\n const patch: Partial<NoteItem> = {}\n if (nextW > 0 && Math.abs(nextW - (item.width ?? 230)) > 2) {\n patch.width = Math.max(160, Math.min(600, nextW))\n }\n if (nextH > 0 && Math.abs(nextH - (item.height ?? 0)) > 2) {\n patch.height = Math.max(50, Math.min(800, nextH))\n }\n if (Object.keys(patch).length > 0) {\n onUpdate(item.id, patch)\n onComplete?.()\n }\n }\n\n useEffect(() => {\n const textarea = textareaRef.current\n if (!textarea || typeof ResizeObserver === 'undefined') return\n\n const ro = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const measuredW = Math.round(entry.borderBoxSize?.[0]?.inlineSize ?? entry.contentRect.width)\n const measuredH = Math.round(entry.borderBoxSize?.[0]?.blockSize ?? entry.contentRect.height)\n if (measuredW < 50 || measuredH < 20) continue\n\n const widthDiff = Math.abs(measuredW - (item.width ?? 230))\n const heightDiff = Math.abs(measuredH - (item.height ?? textarea.offsetHeight))\n if (widthDiff > 2 || heightDiff > 2) {\n if (cardRef.current && widthDiff > 2) {\n cardRef.current.style.transition = 'none'\n cardRef.current.style.width = `${measuredW}px`\n }\n map.dragging?.disable?.()\n if (pendingCommitRef.current.timer) clearTimeout(pendingCommitRef.current.timer)\n pendingCommitRef.current.timer = setTimeout(() => {\n commitResize(measuredW, measuredH)\n }, 150)\n }\n }\n })\n ro.observe(textarea)\n\n const handleWindowPointerUp = () => {\n if (pendingCommitRef.current.timer) {\n commitResize(textareaRef.current?.offsetWidth ?? 0, textareaRef.current?.offsetHeight ?? 0)\n }\n }\n window.addEventListener('pointerup', handleWindowPointerUp)\n window.addEventListener('mouseup', handleWindowPointerUp)\n\n return () => {\n ro.disconnect()\n window.removeEventListener('pointerup', handleWindowPointerUp)\n window.removeEventListener('mouseup', handleWindowPointerUp)\n if (pendingCommitRef.current.timer) {\n clearTimeout(pendingCommitRef.current.timer)\n pendingCommitRef.current.timer = null\n }\n }\n }, [item.id, item.width, item.height, map, onUpdate, onComplete])\n\n const handleResizePointerDown = (e: React.PointerEvent<HTMLElement>) => {\n if (readOnly || isCompact) return\n startNoteResize({ e, item, map, cardRef, textareaRef, onSelect, onUpdate, onComplete })\n }\n\n const handleHeaderPointerDown = (e: React.PointerEvent<HTMLElement>) => {\n if (readOnly || (e.target as HTMLElement).closest('button, input, textarea')) return\n e.stopPropagation()\n e.preventDefault()\n onSelect(item.id)\n setIsDragging(true)\n didDragRef.current = false\n dragStartPosRef.current = { x: e.clientX, y: e.clientY }\n\n const rect = map.getContainer().getBoundingClientRect()\n dragOffsetRef.current = {\n dx: e.clientX - rect.left - screenPos.x,\n dy: e.clientY - rect.top - screenPos.y,\n }\n map.dragging.disable()\n\n let dragRafId: number | null = null\n let latestGeo = item.position\n const isTestEnv = typeof process !== 'undefined' && process.env?.NODE_ENV === 'test'\n\n const flushDrag = () => {\n dragRafId = null\n onUpdate(item.id, { position: latestGeo })\n }\n\n const handlePointerMove = (moveEvent: PointerEvent) => {\n if (Math.hypot(moveEvent.clientX - dragStartPosRef.current.x, moveEvent.clientY - dragStartPosRef.current.y) > 2) {\n didDragRef.current = true\n }\n const nextX = moveEvent.clientX - rect.left - dragOffsetRef.current.dx\n const nextY = moveEvent.clientY - rect.top - dragOffsetRef.current.dy\n if (cardRef.current) {\n cardRef.current.style.left = `${nextX}px`\n cardRef.current.style.top = `${nextY}px`\n }\n latestGeo = screenToGeo(map, { x: nextX, y: nextY })\n if (isTestEnv) flushDrag()\n else if (dragRafId === null) dragRafId = requestAnimationFrame(flushDrag)\n }\n\n const handlePointerUp = () => {\n if (dragRafId !== null) cancelAnimationFrame(dragRafId)\n setIsDragging(false)\n map.dragging.enable()\n if (didDragRef.current) {\n onUpdate(item.id, { position: latestGeo })\n onComplete?.()\n }\n window.removeEventListener('pointermove', handlePointerMove)\n window.removeEventListener('pointerup', handlePointerUp)\n window.removeEventListener('pointercancel', handlePointerUp)\n }\n\n window.addEventListener('pointermove', handlePointerMove)\n window.addEventListener('pointerup', handlePointerUp)\n window.addEventListener('pointercancel', handlePointerUp)\n }\n\n const handleTextareaPointerDown = (e: React.PointerEvent) => {\n e.stopPropagation()\n map.dragging.disable()\n const startW = textareaRef.current?.offsetWidth ?? 0\n const startH = textareaRef.current?.offsetHeight ?? 0\n if (cardRef.current) cardRef.current.style.transition = 'none'\n const handleUp = () => {\n const currentW = textareaRef.current?.offsetWidth ?? 0\n const currentH = textareaRef.current?.offsetHeight ?? 0\n if (Math.abs(currentW - startW) > 2 || Math.abs(currentH - startH) > 2) {\n commitResize(currentW, currentH)\n } else {\n map.dragging?.enable?.()\n if (cardRef.current) cardRef.current.style.transition = 'none'\n }\n window.removeEventListener('pointerup', handleUp)\n window.removeEventListener('mouseup', handleUp)\n }\n window.addEventListener('pointerup', handleUp, { once: true })\n window.addEventListener('mouseup', handleUp, { once: true })\n }\n\n return {\n isDragging,\n didDragRef,\n commitResize,\n handleHeaderPointerDown,\n handleResizePointerDown,\n handleTextareaPointerDown,\n }\n}\n","import type React from 'react'\nimport type L from 'leaflet'\nimport type { NoteItem } from '../../types/index.js'\n\nexport interface StartNoteResizeOptions {\n e: React.PointerEvent<HTMLElement>\n item: NoteItem\n map: L.Map\n cardRef: React.RefObject<HTMLDivElement | null>\n textareaRef: React.RefObject<HTMLTextAreaElement | null>\n onSelect: (id: string) => void\n onUpdate: (id: string, patch: Partial<NoteItem>) => void\n onComplete?: () => void\n}\n\nexport function startNoteResize(options: StartNoteResizeOptions) {\n const { e, item, map, cardRef, textareaRef, onSelect, onUpdate, onComplete } = options\n e.stopPropagation()\n e.preventDefault()\n onSelect(item.id)\n\n if (cardRef.current) {\n cardRef.current.style.transition = 'none'\n cardRef.current.setAttribute('data-resizing', 'true')\n }\n const target = e.currentTarget\n const pointerId = e.pointerId\n try { target?.setPointerCapture?.(pointerId) } catch { /* ignore */ }\n\n const startX = e.clientX\n const startY = e.clientY\n const startWidth = item.width ?? 230\n const startHeight = item.height ?? textareaRef.current?.offsetHeight ?? 62\n map.dragging.disable()\n\n let rafId: number | null = null\n let latestWidth = startWidth\n let latestHeight = startHeight\n let hasMovedY = false\n const isTestEnv = typeof process !== 'undefined' && process.env?.NODE_ENV === 'test'\n\n const flushUpdate = () => {\n rafId = null\n const patch: Partial<NoteItem> = { width: latestWidth }\n if (hasMovedY || item.height !== undefined) patch.height = latestHeight\n onUpdate(item.id, patch)\n }\n\n const handlePointerMove = (moveEvent: PointerEvent) => {\n const dx = moveEvent.clientX - startX\n const dy = moveEvent.clientY - startY\n latestWidth = Math.max(160, Math.min(600, Math.round(startWidth + dx)))\n latestHeight = Math.max(50, Math.min(800, Math.round(startHeight + dy)))\n if (dy !== 0) hasMovedY = true\n if (cardRef.current) cardRef.current.style.width = `${latestWidth}px`\n if (textareaRef.current && (hasMovedY || item.height !== undefined)) {\n textareaRef.current.style.height = `${latestHeight}px`\n }\n if (isTestEnv) flushUpdate()\n else if (rafId === null) rafId = requestAnimationFrame(flushUpdate)\n }\n\n const handlePointerUp = () => {\n if (rafId !== null) cancelAnimationFrame(rafId)\n if (cardRef.current) {\n cardRef.current.style.transition = 'none'\n cardRef.current.removeAttribute('data-resizing')\n }\n map.dragging.enable()\n try { target?.releasePointerCapture?.(pointerId) } catch { /* ignore */ }\n const patch: Partial<NoteItem> = { width: latestWidth }\n if (hasMovedY || item.height !== undefined) patch.height = latestHeight\n onUpdate(item.id, patch)\n onComplete?.()\n window.removeEventListener('pointermove', handlePointerMove)\n window.removeEventListener('pointerup', handlePointerUp)\n window.removeEventListener('pointercancel', handlePointerUp)\n }\n\n window.addEventListener('pointermove', handlePointerMove)\n window.addEventListener('pointerup', handlePointerUp)\n window.addEventListener('pointercancel', handlePointerUp)\n}\n\n","export const DEFAULT_ICONS = {\n select: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"m3 3 7.07 16.97 2.51-7.39 7.39-2.51L3 3z\" />\n <path d=\"m13 13 6 6\" />\n </svg>\n ),\n freedraw: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z\" />\n <path d=\"m15 5 4 4\" />\n </svg>\n ),\n arrowLinear: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"M7 7h10v10\" />\n <path d=\"M7 17 17 7\" />\n </svg>\n ),\n arrowCurved: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"M4 19C4 10 11 5 20 5\" />\n <polyline points=\"15 2 20 5 16 10\" />\n </svg>\n ),\n arrowBi: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"M11 19H5v-6\" />\n <path d=\"M13 5h6v6\" />\n <path d=\"M19 5 5 19\" />\n </svg>\n ),\n arrowElbow: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <polyline points=\"4 18 12 18 12 6 20 6\" />\n <polyline points=\"16 2 20 6 16 10\" />\n </svg>\n ),\n arrowSCurve: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"M5 19C9 19 11 15 12 12C13 9 15 9 19 5\" />\n <polyline points=\"13 5 19 5 19 11\" />\n </svg>\n ),\n shapesGroup: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"M8.3 10a.7.7 0 0 1-.626-1.079L11.4 3a.7.7 0 0 1 1.198-.043L16.3 8.9a.7.7 0 0 1-.572 1.1Z\" />\n <rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" />\n <circle cx=\"17.5\" cy=\"17.5\" r=\"3.5\" />\n </svg>\n ),\n shapeSquare: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n </svg>\n ),\n shapeCircle: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n </svg>\n ),\n shapeStar: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z\" />\n </svg>\n ),\n shapeActor: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\" />\n <circle cx=\"12\" cy=\"7\" r=\"4\" />\n </svg>\n ),\n shapeTriangle: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"M13.73 4a2 2 0 0 0-3.46 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z\" />\n </svg>\n ),\n shapeDiamond: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"M2.7 10.3a2.41 2.41 0 0 0 0 3.41l7.59 7.59a2.41 2.41 0 0 0 3.41 0l7.59-7.59a2.41 2.41 0 0 0 0-3.41l-7.59-7.59a2.41 2.41 0 0 0-3.41 0Z\" />\n </svg>\n ),\n shapeHexagon: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z\" />\n </svg>\n ),\n shapeMarker: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0\" />\n <circle cx=\"12\" cy=\"10\" r=\"3\" />\n </svg>\n ),\n dropdownChevron: (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n ),\n ruler: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"M21.3 8.7 8.7 21.3a1 1 0 0 1-1.4 0l-4.6-4.6a1 1 0 0 1 0-1.4L15.3 2.7a1 1 0 0 1 1.4 0l4.6 4.6a1 1 0 0 1 0 1.4Z\" />\n <path d=\"m14.5 3.5 2 2\" />\n <path d=\"m11.5 6.5 2 2\" />\n <path d=\"m8.5 9.5 2 2\" />\n <path d=\"m5.5 12.5 2 2\" />\n </svg>\n ),\n note: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"M21 9a2.4 2.4 0 0 0-.706-1.706l-3.588-3.588A2.4 2.4 0 0 0 15 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2z\" />\n <path d=\"M15 3v5a1 1 0 0 0 1 1h5\" />\n </svg>\n ),\n text: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"M12 4v16\" />\n <path d=\"M4 7V5a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v2\" />\n <path d=\"M9 20h6\" />\n </svg>\n ),\n undo: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"M9 14 4 9l5-5\" />\n <path d=\"M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5a5.5 5.5 0 0 1-5.5 5.5H11\" />\n </svg>\n ),\n redo: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"m15 14 5-5-5-5\" />\n <path d=\"M20 9H9.5A5.5 5.5 0 0 0 4 14.5A5.5 5.5 0 0 0 9.5 20H13\" />\n </svg>\n ),\n collapseToolbar: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"m18 15-6-6-6 6\" />\n </svg>\n ),\n expandToolbar: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n ),\n delete: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"M10 11v6\" />\n <path d=\"M14 11v6\" />\n <path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\" />\n <path d=\"M3 6h18\" />\n <path d=\"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" />\n </svg>\n ),\n clear: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"m15 9-6 6\" />\n <path d=\"m9 9 6 6\" />\n </svg>\n ),\n noteExpand: (\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n ),\n noteCollapse: (\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"M5 12h14\" />\n </svg>\n ),\n noteDelete: (\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n ),\n textBold: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" shapeRendering=\"geometricPrecision\">\n <path d=\"M6 12h9a4 4 0 0 1 0 8H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h7a4 4 0 0 1 0 8\" />\n </svg>\n ),\n}\n","import type React from 'react'\nimport type {\n TualIcons,\n TualLabels,\n LeafletTualClassNames,\n LeafletTualStyles,\n NoteItem,\n} from '../../types/index.js'\nimport { DEFAULT_ICONS } from '../../widgets/TualToolbar/icons.js'\nimport type { ResolvedNoteTheme } from './types.js'\n\nexport interface NoteCardHeaderProps {\n item: NoteItem\n theme: ResolvedNoteTheme\n readOnly: boolean\n unstyled: boolean\n labels?: TualLabels\n icons?: TualIcons\n classNames?: LeafletTualClassNames\n styles?: LeafletTualStyles\n onHeaderPointerDown: (e: React.PointerEvent<HTMLElement>) => void\n onCollapse: () => void\n onSelect: (id: string) => void\n onUpdate: (id: string, patch: Partial<NoteItem>) => void\n onDelete: (id: string) => void\n onComplete?: () => void\n}\n\nexport function NoteCardHeader({\n item,\n theme,\n readOnly,\n unstyled,\n labels,\n icons,\n classNames,\n styles,\n onHeaderPointerDown,\n onCollapse,\n onSelect,\n onUpdate,\n onDelete,\n onComplete,\n}: NoteCardHeaderProps) {\n const headerBtnBaseStyle: React.CSSProperties = unstyled\n ? {}\n : {\n border: 'none',\n background: 'transparent',\n color: item.textColor || theme.text,\n width: '20px',\n height: '20px',\n padding: 0,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n fontSize: '12px',\n fontWeight: 700,\n lineHeight: 1,\n opacity: 0.75,\n borderRadius: '2px',\n flexShrink: 0,\n }\n\n return (\n <div\n onPointerDown={onHeaderPointerDown}\n className={['rlc-note-header', classNames?.noteHeader].filter(Boolean).join(' ')}\n style={{\n cursor: readOnly ? 'default' : 'grab',\n ...(unstyled\n ? {}\n : {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '6px',\n padding: '6px 8px 6px 10px',\n backgroundColor: theme.header,\n borderBottom: `1px solid ${theme.border}`,\n boxSizing: 'border-box',\n }),\n ...styles?.noteHeader,\n }}\n >\n <input\n type=\"text\"\n readOnly={readOnly}\n value={item.title ?? ''}\n placeholder={labels?.noteTitlePlaceholder ?? 'Note title...'}\n aria-label={labels?.noteTitlePlaceholder ?? 'Note title'}\n title={item.title || labels?.noteTitlePlaceholder || 'Note'}\n className={['rlc-note-title-input', classNames?.noteTitleInput].filter(Boolean).join(' ')}\n onFocus={() => { if (!readOnly) onSelect(item.id) }}\n onBlur={() => onComplete?.()}\n onChange={(e) => { if (!readOnly) onUpdate(item.id, { title: e.target.value }) }}\n onPointerDown={(e) => e.stopPropagation()}\n style={{\n ...(unstyled\n ? {}\n : {\n flex: 1,\n minWidth: 0,\n background: 'transparent',\n border: 'none',\n outline: 'none',\n fontWeight: 600,\n fontSize: '12px',\n color: item.textColor || theme.text,\n fontFamily: 'inherit',\n cursor: readOnly ? 'default' : 'text',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n }),\n ...styles?.noteTitleInput,\n }}\n />\n\n <div\n className={['rlc-note-header-actions', classNames?.noteHeaderActions].filter(Boolean).join(' ')}\n style={{\n ...(unstyled ? {} : { display: 'flex', alignItems: 'center', gap: '3px', flexShrink: 0 }),\n ...styles?.noteHeaderActions,\n }}\n >\n <button\n type=\"button\"\n title={labels?.noteCollapse ?? 'Collapse note'}\n aria-label={labels?.noteCollapse ?? 'Collapse note'}\n className={['rlc-note-header-btn', classNames?.noteHeaderButton].filter(Boolean).join(' ')}\n onClick={(e) => {\n e.stopPropagation()\n onCollapse()\n }}\n style={{ ...headerBtnBaseStyle, ...styles?.noteHeaderButton }}\n >\n {icons?.noteCollapse ?? DEFAULT_ICONS.noteCollapse}\n </button>\n\n {!readOnly && (\n <button\n type=\"button\"\n title={labels?.noteDelete ?? 'Delete note'}\n aria-label={labels?.noteDelete ?? 'Delete note'}\n className={['rlc-note-header-btn', 'rlc-note-delete-btn', classNames?.noteHeaderButton, classNames?.noteDeleteButton].filter(Boolean).join(' ')}\n onClick={(e) => {\n e.stopPropagation()\n onDelete(item.id)\n }}\n style={{\n ...headerBtnBaseStyle,\n ...styles?.noteHeaderButton,\n ...styles?.noteDeleteButton,\n }}\n >\n {icons?.noteDelete ?? DEFAULT_ICONS.noteDelete}\n </button>\n )}\n </div>\n </div>\n )\n}\n\n","import type React from 'react'\nimport type {\n TualIcons,\n TualLabels,\n LeafletTualClassNames,\n LeafletTualStyles,\n NoteItem,\n} from '../../types/index.js'\nimport { DEFAULT_ICONS } from '../../widgets/TualToolbar/icons.js'\nimport type { ResolvedNoteTheme } from './types.js'\nimport { NoteCardHeader } from './NoteCardHeader.js'\n\nexport interface NoteCardViewProps {\n item: NoteItem\n theme: ResolvedNoteTheme\n isCompact: boolean\n isDragging: boolean\n readOnly: boolean\n unstyled: boolean\n labels?: TualLabels\n icons?: TualIcons\n classNames?: LeafletTualClassNames\n styles?: LeafletTualStyles\n textareaRef: React.RefObject<HTMLTextAreaElement | null>\n onHeaderPointerDown: (e: React.PointerEvent<HTMLElement>) => void\n onExpandFromCompact: (e?: React.MouseEvent) => void\n onCollapse: () => void\n onSelect: (id: string) => void\n onUpdate: (id: string, patch: Partial<NoteItem>) => void\n onDelete: (id: string) => void\n onComplete?: () => void\n onTextareaPointerDown: (e: React.PointerEvent<HTMLTextAreaElement>) => void\n}\n\nexport function NoteCardView({\n item,\n theme,\n isCompact,\n isDragging,\n readOnly,\n unstyled,\n labels,\n icons,\n classNames,\n styles,\n textareaRef,\n onHeaderPointerDown,\n onExpandFromCompact,\n onCollapse,\n onSelect,\n onUpdate,\n onDelete,\n onComplete,\n onTextareaPointerDown,\n}: NoteCardViewProps) {\n if (isCompact) {\n return (\n <div\n onPointerDown={onHeaderPointerDown}\n className={['rlc-note-header', classNames?.noteHeader].filter(Boolean).join(' ')}\n style={{\n cursor: readOnly ? 'default' : isDragging ? 'grabbing' : 'grab',\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n width: '100%',\n height: '100%',\n userSelect: 'none',\n }}\n >\n <span\n style={{\n fontSize: '11px',\n fontWeight: 600,\n lineHeight: 1,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n maxWidth: '90px',\n color: item.textColor || theme.text,\n }}\n title={item.title || labels?.noteTitlePlaceholder || 'Note'}\n >\n {item.title || labels?.noteTitlePlaceholder || 'Note'}\n </span>\n <button\n type=\"button\"\n title={labels?.noteExpand ?? 'Expand note'}\n aria-label={labels?.noteExpand ?? 'Expand note'}\n className={['rlc-note-header-btn', classNames?.noteHeaderButton].filter(Boolean).join(' ')}\n onClick={onExpandFromCompact}\n style={{\n border: 'none',\n background: 'transparent',\n color: item.textColor || theme.text,\n width: '12px',\n height: '12px',\n padding: 0,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n opacity: 0.75,\n flexShrink: 0,\n }}\n >\n {icons?.noteExpand ?? DEFAULT_ICONS.noteExpand}\n </button>\n </div>\n )\n }\n\n return (\n <>\n <NoteCardHeader\n item={item}\n theme={theme}\n readOnly={readOnly}\n unstyled={unstyled}\n labels={labels}\n icons={icons}\n classNames={classNames}\n styles={styles}\n onHeaderPointerDown={onHeaderPointerDown}\n onCollapse={onCollapse}\n onSelect={onSelect}\n onUpdate={onUpdate}\n onDelete={onDelete}\n onComplete={onComplete}\n />\n\n <div\n className={['rlc-note-body', classNames?.noteBody].filter(Boolean).join(' ')}\n style={{ ...(unstyled ? {} : { padding: 0 }), ...styles?.noteBody }}\n >\n <textarea\n ref={textareaRef}\n readOnly={readOnly}\n value={item.text}\n placeholder={labels?.noteTextPlaceholder ?? 'Write a note on the map...'}\n aria-label={labels?.noteTextPlaceholder ?? 'Note text'}\n rows={3}\n className={['rlc-note-textarea', classNames?.noteTextarea].filter(Boolean).join(' ')}\n onFocus={() => { if (!readOnly) onSelect(item.id) }}\n onBlur={() => onComplete?.()}\n onChange={(e) => { if (!readOnly) onUpdate(item.id, { text: e.target.value }) }}\n onPointerDown={onTextareaPointerDown}\n onMouseDown={(e) => e.stopPropagation()}\n style={{\n ...(unstyled\n ? {}\n : {\n width: '100%',\n height: item.height ? `${item.height}px` : undefined,\n boxSizing: 'border-box',\n display: 'block',\n margin: 0,\n background: 'transparent',\n border: 'none',\n borderRadius: 0,\n padding: '6px 10px 8px',\n outline: 'none',\n resize: readOnly ? 'none' : 'both',\n minWidth: '160px',\n maxWidth: '600px',\n minHeight: '56px',\n maxHeight: '800px',\n fontSize: '12px',\n lineHeight: 1.45,\n color: item.textColor || theme.text,\n fontFamily: 'inherit',\n cursor: readOnly ? 'default' : 'text',\n }),\n ...styles?.noteTextarea,\n }}\n />\n </div>\n </>\n )\n}\n","import type React from 'react'\nimport type { NoteItem, RenderNoteProps, ScreenPoint } from '../../types/index.js'\n\nexport interface NoteCustomRenderViewProps {\n item: NoteItem\n screenPos: ScreenPoint\n isSelected: boolean\n isDragging: boolean\n readOnly: boolean\n isCompact: boolean\n cardClassName: string\n structuralRootStyle: React.CSSProperties\n styles?: { noteCard?: React.CSSProperties; noteCollapsed?: React.CSSProperties; noteCompact?: React.CSSProperties; noteCardSelected?: React.CSSProperties }\n renderNote: (props: RenderNoteProps) => React.ReactNode\n onCardClick: (e: React.MouseEvent) => void\n onCardDoubleClick: (e: React.MouseEvent) => void\n handleHeaderPointerDown: (e: React.PointerEvent<HTMLElement>) => void\n handleResizePointerDown: (e: React.PointerEvent<HTMLElement>) => void\n onSelect: (id: string) => void\n onUpdate: (id: string, patch: Partial<NoteItem>) => void\n onDelete: (id: string) => void\n}\n\nexport function NoteCustomRenderView({\n item,\n screenPos,\n isSelected,\n isDragging,\n readOnly,\n isCompact,\n cardClassName,\n structuralRootStyle,\n styles,\n renderNote,\n onCardClick,\n onCardDoubleClick,\n handleHeaderPointerDown,\n handleResizePointerDown,\n onSelect,\n onUpdate,\n onDelete,\n}: NoteCustomRenderViewProps) {\n return (\n <div\n data-tual-note={item.id}\n data-collapsed={isCompact ? 'true' : undefined}\n data-compact={isCompact ? 'true' : undefined}\n data-selected={(!readOnly && isSelected) || undefined}\n className={cardClassName}\n onClick={onCardClick}\n onDoubleClick={onCardDoubleClick}\n onWheel={(e) => e.stopPropagation()}\n style={{\n ...structuralRootStyle,\n ...styles?.noteCard,\n ...(isCompact ? { ...styles?.noteCollapsed, ...styles?.noteCompact } : undefined),\n ...(!readOnly && isSelected ? styles?.noteCardSelected : undefined),\n }}\n >\n {renderNote({\n item,\n screenPos,\n isSelected: !readOnly && isSelected,\n isDragging,\n readOnly,\n isCompact,\n dragHandleProps: {\n onPointerDown: handleHeaderPointerDown,\n style: { cursor: readOnly ? 'default' : isDragging ? 'grabbing' : 'grab' },\n },\n resizeHandleProps: {\n onPointerDown: handleResizePointerDown,\n style: { cursor: readOnly || isCompact ? 'default' : 'nwse-resize' },\n },\n onSelect: () => { if (!readOnly) onSelect(item.id) },\n onUpdate: (patch) => {\n if (!readOnly || (Object.keys(patch).length <= 2 && ('minimized' in patch || 'collapseState' in patch))) {\n onUpdate(item.id, patch)\n }\n },\n onDelete: () => { if (!readOnly) onDelete(item.id) },\n })}\n </div>\n )\n}\n\n","import React, { useEffect, useRef, useState } from 'react'\nimport { calculateZoomFontSize } from '../../shared/geo.js'\nimport type { TextOverlayProps } from './types.js'\nimport { clampTextPosition, getTextCursor } from './utils.js'\nimport { useTextDrag } from './use-text-drag.js'\nimport { TextOverlayView } from './TextOverlayView.js'\nimport { TextCustomRenderView } from './TextCustomRenderView.js'\n\nexport type { TextOverlayProps } from './types.js'\n\nexport const TextOverlay = React.memo(function TextOverlay({\n item,\n screenPos,\n isSelected,\n isEditingLabel,\n map,\n readOnly = false,\n labels,\n icons: _icons,\n unstyled = false,\n classNames,\n styles,\n clampToViewport = true,\n autoMinimizeZoomThreshold,\n renderText,\n onSelect,\n onUpdate,\n onDelete,\n onComplete,\n}: TextOverlayProps) {\n const [isEditing, setIsEditing] = useState(!readOnly && item.text === '')\n const [expandedLocally, setExpandedLocally] = useState(false)\n const inputRef = useRef<HTMLTextAreaElement | null>(null)\n\n const { isDragging, didDragRef, handlePointerDown } = useTextDrag({\n item,\n screenPos,\n map,\n readOnly,\n isEditing,\n onSelect,\n onUpdate,\n })\n\n const currentZoom = typeof map?.getZoom === 'function' ? map.getZoom() : null\n const lastZoomRef = useRef<number | null>(currentZoom)\n\n const initialSize = item.initialFontSize ?? (item as { fontSize?: number }).fontSize ?? 16\n const baseZoom = item.baseZoom ?? 14\n const dynamicFontSize = calculateZoomFontSize(initialSize, currentZoom, baseZoom)\n\n useEffect(() => {\n if (currentZoom !== null) {\n if (lastZoomRef.current !== null && lastZoomRef.current !== currentZoom) {\n setExpandedLocally(false)\n }\n lastZoomRef.current = currentZoom\n }\n }, [currentZoom])\n\n const isLowZoom =\n typeof autoMinimizeZoomThreshold === 'number' &&\n currentZoom !== null &&\n currentZoom < autoMinimizeZoomThreshold\n\n const isCompact = isLowZoom && !isSelected && !isEditing && !expandedLocally\n\n useEffect(() => {\n if (isSelected && isEditingLabel && !readOnly) {\n setIsEditing(true)\n }\n }, [isSelected, isEditingLabel, readOnly])\n\n useEffect(() => {\n if (isEditing && inputRef.current) {\n inputRef.current.focus()\n inputRef.current.select()\n }\n }, [isEditing])\n\n const cursor = getTextCursor(readOnly, isEditing, isDragging, isCompact)\n const dragHandleProps = {\n onPointerDown: handlePointerDown,\n style: { cursor } as React.CSSProperties,\n }\n\n const wrapperClassName = [\n 'rlc-text-wrapper',\n isCompact ? 'rlc-text-compact' : undefined,\n classNames?.textWrapper,\n isCompact ? classNames?.textCompact : undefined,\n !readOnly && isSelected ? classNames?.textWrapperSelected : undefined,\n ]\n .filter(Boolean)\n .join(' ')\n\n const { x: renderX, y: renderY } = clampTextPosition(\n map,\n screenPos,\n item,\n dynamicFontSize,\n isCompact,\n isDragging,\n clampToViewport,\n )\n\n const structuralWrapperStyle: React.CSSProperties = {\n position: 'absolute',\n left: `${renderX}px`,\n top: `${renderY}px`,\n transform: 'translate(-50%, -50%)',\n pointerEvents: 'auto',\n zIndex: !readOnly && isSelected ? 28 : 18,\n cursor,\n userSelect: readOnly || isEditing ? 'text' : 'none',\n }\n\n const handleClick = (e: React.MouseEvent) => {\n e.stopPropagation()\n if (didDragRef.current) {\n didDragRef.current = false\n return\n }\n if (isCompact) setExpandedLocally(true)\n if (!readOnly) onSelect(item.id)\n }\n\n const handleDoubleClick = (e: React.MouseEvent) => {\n e.stopPropagation()\n if (isCompact) setExpandedLocally(true)\n if (!readOnly) {\n onSelect(item.id)\n setIsEditing(true)\n }\n }\n\n if (renderText) {\n return (\n <TextCustomRenderView\n item={item}\n screenPos={screenPos}\n isSelected={isSelected}\n isEditing={isEditing}\n isDragging={isDragging}\n readOnly={readOnly}\n isCompact={isCompact}\n dynamicFontSize={dynamicFontSize}\n dragHandleProps={dragHandleProps}\n wrapperClassName={wrapperClassName}\n structuralWrapperStyle={structuralWrapperStyle}\n styles={styles}\n renderText={renderText}\n onClick={handleClick}\n onDoubleClick={handleDoubleClick}\n setIsEditing={(ed) => { if (!readOnly) setIsEditing(ed) }}\n onSelect={onSelect}\n onUpdate={onUpdate}\n onDelete={onDelete}\n />\n )\n }\n\n return (\n <div\n data-tual-text={item.id}\n data-compact={isCompact ? 'true' : undefined}\n data-selected={(!readOnly && isSelected) || undefined}\n className={wrapperClassName}\n onPointerDown={handlePointerDown}\n onClick={handleClick}\n onDoubleClick={handleDoubleClick}\n onWheel={(e) => e.stopPropagation()}\n style={{\n ...structuralWrapperStyle,\n ...(unstyled ? {} : { fontFamily: 'Inter, system-ui, -apple-system, sans-serif' }),\n ...styles?.textWrapper,\n ...(isCompact ? styles?.textCompact : undefined),\n ...(!readOnly && isSelected ? styles?.textWrapperSelected : undefined),\n }}\n >\n <TextOverlayView\n item={item}\n map={map}\n isCompact={isCompact}\n isEditing={isEditing}\n isSelected={isSelected}\n readOnly={readOnly}\n unstyled={unstyled}\n dynamicFontSize={dynamicFontSize}\n labels={labels}\n classNames={classNames}\n styles={styles}\n inputRef={inputRef}\n setIsEditing={setIsEditing}\n onUpdate={onUpdate}\n onComplete={onComplete}\n />\n </div>\n )\n})\n","import type React from 'react'\nimport type L from 'leaflet'\nimport type { ScreenPoint, TextItem } from '../../types/index.js'\nimport { getMapDimensions } from '../../shared/geo.js'\n\nexport function clampTextPosition(\n map: L.Map,\n screenPos: ScreenPoint,\n item: TextItem,\n dynamicFontSize: number,\n isCompact: boolean,\n isDragging: boolean,\n clampToViewport = true,\n): ScreenPoint {\n const mapDims = clampToViewport !== false ? getMapDimensions(map) : null\n if (!mapDims || isDragging) return screenPos\n\n const isAnchorNearViewport =\n screenPos.x >= -100 &&\n screenPos.x <= mapDims.width + 100 &&\n screenPos.y >= -100 &&\n screenPos.y <= mapDims.height + 100\n\n if (!isAnchorNearViewport) return screenPos\n\n const approxHalfW = isCompact\n ? 35\n : Math.max(24, ((item.text || 'Text').length * dynamicFontSize) / 3.6)\n const approxHalfH = isCompact ? 11 : dynamicFontSize / 2 + 4\n const pad = 8\n\n const minX = approxHalfW + pad\n const maxX = Math.max(minX, mapDims.width - approxHalfW - pad)\n const minY = approxHalfH + pad\n const maxY = Math.max(minY, mapDims.height - approxHalfH - pad)\n\n return {\n x: Math.max(minX, Math.min(maxX, screenPos.x)),\n y: Math.max(minY, Math.min(maxY, screenPos.y)),\n }\n}\n\nexport function getTextCursor(\n readOnly: boolean,\n isEditing: boolean,\n isDragging: boolean,\n isCompact: boolean,\n): React.CSSProperties['cursor'] {\n if (readOnly) return isCompact ? 'pointer' : 'default'\n if (isEditing) return 'text'\n if (isDragging) return 'grabbing'\n return isCompact ? 'pointer' : 'grab'\n}\n\n","import { useRef, useState } from 'react'\nimport type React from 'react'\nimport type L from 'leaflet'\nimport type { ScreenPoint, TextItem } from '../../types/index.js'\nimport { screenToGeo } from '../../shared/geo.js'\n\nexport interface UseTextDragOptions {\n item: TextItem\n screenPos: ScreenPoint\n map: L.Map\n readOnly: boolean\n isEditing: boolean\n onSelect: (id: string) => void\n onUpdate: (id: string, patch: Partial<TextItem>) => void\n}\n\nexport function useTextDrag({\n item,\n screenPos,\n map,\n readOnly,\n isEditing,\n onSelect,\n onUpdate,\n}: UseTextDragOptions) {\n const [isDragging, setIsDragging] = useState(false)\n const dragOffsetRef = useRef({ dx: 0, dy: 0 })\n const didDragRef = useRef(false)\n const dragStartPosRef = useRef({ x: 0, y: 0 })\n\n const handlePointerDown = (e: React.PointerEvent<HTMLElement>) => {\n if (readOnly || isEditing || (e.target as HTMLElement).closest('button, textarea, input')) {\n return\n }\n e.stopPropagation()\n e.preventDefault()\n onSelect(item.id)\n setIsDragging(true)\n\n didDragRef.current = false\n dragStartPosRef.current = { x: e.clientX, y: e.clientY }\n\n const rect = map.getContainer().getBoundingClientRect()\n dragOffsetRef.current = {\n dx: e.clientX - rect.left - screenPos.x,\n dy: e.clientY - rect.top - screenPos.y,\n }\n map.dragging.disable()\n\n const handlePointerMove = (moveEvent: PointerEvent) => {\n if (Math.hypot(moveEvent.clientX - dragStartPosRef.current.x, moveEvent.clientY - dragStartPosRef.current.y) > 2) {\n didDragRef.current = true\n }\n const nextX = moveEvent.clientX - rect.left - dragOffsetRef.current.dx\n const nextY = moveEvent.clientY - rect.top - dragOffsetRef.current.dy\n onUpdate(item.id, { position: screenToGeo(map, { x: nextX, y: nextY }) })\n }\n\n const handlePointerUp = () => {\n setIsDragging(false)\n map.dragging.enable()\n window.removeEventListener('pointermove', handlePointerMove)\n window.removeEventListener('pointerup', handlePointerUp)\n }\n\n window.addEventListener('pointermove', handlePointerMove)\n window.addEventListener('pointerup', handlePointerUp)\n }\n\n return { isDragging, didDragRef, handlePointerDown }\n}\n\n","import type React from 'react'\nimport type L from 'leaflet'\nimport type {\n TualLabels,\n LeafletTualClassNames,\n LeafletTualStyles,\n TextItem,\n} from '../../types/index.js'\n\nexport interface TextOverlayViewProps {\n item: TextItem\n map: L.Map\n isCompact: boolean\n isEditing: boolean\n isSelected: boolean\n readOnly: boolean\n unstyled: boolean\n dynamicFontSize: number\n labels?: TualLabels\n classNames?: LeafletTualClassNames\n styles?: LeafletTualStyles\n inputRef: React.RefObject<HTMLTextAreaElement | null>\n setIsEditing: (editing: boolean) => void\n onUpdate: (id: string, patch: Partial<TextItem>) => void\n onComplete?: () => void\n}\n\nexport function TextOverlayView({\n item,\n map,\n isCompact,\n isEditing,\n isSelected,\n readOnly,\n unstyled,\n dynamicFontSize,\n labels,\n classNames,\n styles,\n inputRef,\n setIsEditing,\n onUpdate,\n onComplete,\n}: TextOverlayViewProps) {\n if (isCompact) {\n return (\n <div\n data-compact=\"true\"\n className={[\n 'rlc-text-display',\n 'rlc-text-compact-pill',\n classNames?.textDisplay,\n classNames?.textCompact,\n ]\n .filter(Boolean)\n .join(' ')}\n style={{\n ...(unstyled\n ? {}\n : {\n display: 'inline-flex',\n alignItems: 'center',\n height: '22px',\n padding: '0 8px',\n backgroundColor: item.backgroundColor ?? '#ffffff',\n color: item.color,\n border: `1px solid ${item.color ? `${item.color}40` : '#cbd5e1'}`,\n borderRadius: '9999px',\n fontSize: '11px',\n fontWeight: 600,\n lineHeight: 1,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n maxWidth: '120px',\n boxShadow: '0 1px 3px rgba(0, 0, 0, 0.12)',\n cursor: 'pointer',\n userSelect: 'none',\n }),\n ...styles?.textDisplay,\n ...styles?.textCompact,\n }}\n title={item.text || 'Text'}\n >\n {item.text || labels?.textEmptyFallback || 'Text'}\n </div>\n )\n }\n\n const finishEditing = () => {\n setIsEditing(false)\n if (!item.text.trim()) {\n onUpdate(item.id, { text: labels?.textEmptyFallback ?? 'Label' })\n }\n onComplete?.()\n }\n\n if (isEditing) {\n return (\n <textarea\n ref={inputRef}\n value={item.text}\n placeholder={labels?.textPlaceholder ?? 'Type text...'}\n aria-label={labels?.textPlaceholder ?? 'Map text annotation'}\n rows={Math.max(1, item.text.split('\\n').length)}\n className={['rlc-text-input', classNames?.textInput].filter(Boolean).join(' ')}\n onChange={(e) => onUpdate(item.id, { text: e.target.value })}\n onBlur={finishEditing}\n onKeyDown={(e) => {\n if (e.key === 'Escape' || (e.key === 'Enter' && !e.shiftKey)) {\n e.preventDefault()\n finishEditing()\n }\n }}\n onPointerDown={(e) => {\n e.stopPropagation()\n map.dragging.disable()\n const handleUp = () => {\n map.dragging.enable()\n window.removeEventListener('pointerup', handleUp)\n }\n window.addEventListener('pointerup', handleUp)\n }}\n onMouseDown={(e) => {\n e.stopPropagation()\n map.dragging.disable()\n const handleUp = () => {\n map.dragging.enable()\n window.removeEventListener('mouseup', handleUp)\n }\n window.addEventListener('mouseup', handleUp)\n }}\n style={{\n fontSize: `${dynamicFontSize}px`,\n fontWeight: item.fontWeight ?? 'bold',\n color: item.color,\n ...(unstyled\n ? {}\n : {\n minWidth: '80px',\n padding: '2px 4px',\n backgroundColor: '#ffffff',\n border: '1px solid #767676',\n borderRadius: '2px',\n outline: 'none',\n fontFamily: 'inherit',\n resize: 'both',\n lineHeight: 1.25,\n boxShadow: 'none',\n }),\n ...styles?.textInput,\n }}\n />\n )\n }\n\n return (\n <div\n className={['rlc-text-display', classNames?.textDisplay].filter(Boolean).join(' ')}\n style={{\n fontSize: `${dynamicFontSize}px`,\n fontWeight: item.fontWeight ?? 'bold',\n color: item.color,\n ...(unstyled\n ? {}\n : {\n padding: '2px 4px',\n backgroundColor: item.backgroundColor ?? '#ffffff',\n borderRadius: '2px',\n border: !readOnly && isSelected ? '1px dashed #767676' : '1px solid transparent',\n boxShadow: 'none',\n whiteSpace: 'pre-wrap',\n lineHeight: 1.25,\n }),\n ...styles?.textDisplay,\n }}\n >\n {item.text || (readOnly ? '' : (labels?.textEmptyFallback ?? 'Double-click to edit'))}\n </div>\n )\n}\n\n","import type React from 'react'\nimport type { RenderTextProps, ScreenPoint, TextItem } from '../../types/index.js'\n\nexport interface TextCustomRenderViewProps {\n item: TextItem\n screenPos: ScreenPoint\n isSelected: boolean\n isEditing: boolean\n isDragging: boolean\n readOnly: boolean\n isCompact: boolean\n dynamicFontSize: number\n dragHandleProps: { onPointerDown: (e: React.PointerEvent<HTMLElement>) => void; style: React.CSSProperties }\n wrapperClassName: string\n structuralWrapperStyle: React.CSSProperties\n styles?: { textWrapper?: React.CSSProperties; textCompact?: React.CSSProperties; textWrapperSelected?: React.CSSProperties }\n renderText: (props: RenderTextProps) => React.ReactNode\n onClick: (e: React.MouseEvent) => void\n onDoubleClick: (e: React.MouseEvent) => void\n setIsEditing: (editing: boolean) => void\n onSelect: (id: string) => void\n onUpdate: (id: string, patch: Partial<TextItem>) => void\n onDelete: (id: string) => void\n}\n\nexport function TextCustomRenderView({\n item,\n screenPos,\n isSelected,\n isEditing,\n isDragging,\n readOnly,\n isCompact,\n dynamicFontSize,\n dragHandleProps,\n wrapperClassName,\n structuralWrapperStyle,\n styles,\n renderText,\n onClick,\n onDoubleClick,\n setIsEditing,\n onSelect,\n onUpdate,\n onDelete,\n}: TextCustomRenderViewProps) {\n return (\n <div\n data-tual-text={item.id}\n data-compact={isCompact ? 'true' : undefined}\n data-selected={(!readOnly && isSelected) || undefined}\n className={wrapperClassName}\n onClick={onClick}\n onDoubleClick={onDoubleClick}\n onWheel={(e) => e.stopPropagation()}\n style={{\n ...structuralWrapperStyle,\n ...styles?.textWrapper,\n ...(isCompact ? styles?.textCompact : undefined),\n ...(!readOnly && isSelected ? styles?.textWrapperSelected : undefined),\n }}\n >\n {renderText({\n item,\n screenPos,\n isSelected: !readOnly && isSelected,\n isEditing: !readOnly && isEditing,\n isDragging,\n readOnly,\n isCompact,\n dynamicFontSize,\n setIsEditing,\n dragHandleProps,\n onSelect: () => { if (!readOnly) onSelect(item.id) },\n onUpdate: (patch) => { if (!readOnly) onUpdate(item.id, patch) },\n onDelete: () => { if (!readOnly) onDelete(item.id) },\n })}\n </div>\n )\n}\n\n","import { useEffect, useState } from 'react'\nimport type L from 'leaflet'\nimport { bindLeafletSync } from '../../core/features/map-sync.js'\n\nexport interface MapViewportState {\n width: number\n height: number\n tick: number\n}\n\n/**\n * Synchronizes React state and canvas redraws with a Leaflet map's pan, zoom, and resize events.\n */\nexport function useLeafletSync(map: L.Map | null): MapViewportState {\n const [viewport, setViewport] = useState<MapViewportState>({\n width: 0,\n height: 0,\n tick: 0,\n })\n\n useEffect(() => {\n if (!map) return\n return bindLeafletSync(map, ({ width, height }) => {\n setViewport((prev) => ({\n width,\n height,\n tick: prev.tick + 1,\n }))\n })\n }, [map])\n\n return viewport\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport type {\n TualItem,\n TualTool,\n LeafletTualController,\n UseLeafletTualOptions,\n} from '../types/index.js'\nimport { useTualHistory } from './use-tual-history.js'\nimport { useTualStyles } from './use-tual-styles.js'\n\nexport function useLeafletTual(\n options: UseLeafletTualOptions = {},\n): LeafletTualController {\n const {\n items: controlledItems,\n initialTool = 'select',\n defaultColor,\n defaultStrokeWidth,\n defaultNoteColor,\n defaultFontSize,\n defaultShape,\n } = options\n\n const {\n items,\n history,\n historyRef,\n callbacksRef,\n commitItems,\n notifyChangeComplete,\n undo: rawUndo,\n redo: rawRedo,\n } = useTualHistory(options)\n\n const [activeToolState, setActiveToolState] = useState<TualTool>(initialTool)\n const [readOnly, setReadOnly] = useState<boolean>(Boolean(options.readOnly ?? false))\n const prevOptionReadOnly = useRef(options.readOnly)\n useEffect(() => {\n if (options.readOnly !== undefined && options.readOnly !== prevOptionReadOnly.current) {\n prevOptionReadOnly.current = options.readOnly\n setReadOnly(Boolean(options.readOnly))\n }\n }, [options.readOnly])\n\n const [selectedId, setSelectedIdState] = useState<string | null>(null)\n const [isEditingLabel, setIsEditingLabel] = useState<boolean>(false)\n\n const styles = useTualStyles({\n defaultColor,\n defaultStrokeWidth,\n defaultNoteColor,\n defaultFontSize,\n defaultShape,\n readOnly,\n selectedId,\n commitItems,\n })\n\n const setSelectedId = useCallback(\n (idOrUpdater: string | null | ((prev: string | null) => string | null)) => {\n setSelectedIdState((prev) => {\n const nextId = typeof idOrUpdater === 'function' ? idOrUpdater(prev) : idOrUpdater\n if (prev !== nextId) {\n setIsEditingLabel(false)\n if (prev !== null && nextId === null) notifyChangeComplete()\n const currentList = controlledItems ?? historyRef.current.present\n callbacksRef.current.onItemSelect?.(currentList.find((it) => it.id === nextId) ?? null)\n }\n return nextId\n })\n },\n [controlledItems, notifyChangeComplete, historyRef, callbacksRef],\n )\n\n const setActiveTool = useCallback(\n (tool: TualTool) => {\n if (readOnly && tool !== 'select') return\n setActiveToolState(tool)\n callbacksRef.current.onToolChange?.(tool)\n },\n [readOnly, callbacksRef],\n )\n\n const addItem = useCallback(\n (item: TualItem) => {\n if (readOnly) return\n commitItems((prev) => [...prev, item])\n setSelectedId(item.id)\n callbacksRef.current.onItemCreate?.(item)\n },\n [readOnly, commitItems, setSelectedId, callbacksRef],\n )\n\n const updateItem = useCallback(\n (id: string, patch: Partial<TualItem>) => {\n if (readOnly) {\n const patchKeys = Object.keys(patch)\n if (patchKeys.length !== 1 || patchKeys[0] !== 'minimized') return\n }\n let updated: TualItem | undefined\n commitItems((prev) =>\n prev.map((item) => {\n if (item.id === id) {\n updated = { ...item, ...patch } as TualItem\n return updated\n }\n return item\n }),\n )\n if (updated) callbacksRef.current.onItemChange?.(updated)\n },\n [readOnly, commitItems, callbacksRef],\n )\n\n const removeItem = useCallback(\n (id: string) => {\n if (readOnly) return\n commitItems((prev) => prev.filter((item) => item.id !== id))\n setSelectedId((prev) => (prev === id ? null : prev))\n callbacksRef.current.onItemDelete?.(id)\n notifyChangeComplete()\n },\n [readOnly, commitItems, setSelectedId, notifyChangeComplete, callbacksRef],\n )\n\n const deleteSelected = useCallback(() => {\n if (!readOnly && selectedId) removeItem(selectedId)\n }, [readOnly, selectedId, removeItem])\n\n const clearAll = useCallback(() => {\n if (readOnly) return\n commitItems(() => [])\n setSelectedId(null)\n notifyChangeComplete()\n }, [readOnly, commitItems, setSelectedId, notifyChangeComplete])\n\n const selectedItem = useMemo(\n () => items.find((item) => item.id === selectedId) ?? null,\n [items, selectedId],\n )\n\n const exportJSON = useCallback(() => JSON.stringify(items, null, 2), [items])\n\n const importJSON = useCallback(\n (json: string): boolean => {\n if (readOnly) return false\n try {\n const parsed = JSON.parse(json)\n if (!Array.isArray(parsed)) return false\n commitItems(() => parsed as TualItem[])\n setSelectedId(null)\n notifyChangeComplete()\n return true\n } catch {\n return false\n }\n },\n [readOnly, commitItems, setSelectedId, notifyChangeComplete],\n )\n\n return {\n items,\n activeTool: activeToolState,\n setActiveTool,\n readOnly,\n setReadOnly,\n ...styles,\n selectedId,\n setSelectedId,\n selectedItem,\n isEditingLabel,\n setEditingLabel: setIsEditingLabel,\n labelEditMode: isEditingLabel,\n setLabelEditMode: setIsEditingLabel,\n addItem,\n updateItem,\n removeItem,\n deleteSelected,\n clearAll,\n clear: clearAll,\n deleteItem: removeItem,\n setTool: setActiveTool,\n selectItem: setSelectedId,\n undo: useCallback(() => rawUndo(readOnly), [rawUndo, readOnly]),\n redo: useCallback(() => rawRedo(readOnly), [rawRedo, readOnly]),\n canUndo: !readOnly && history.past.length > 0,\n canRedo: !readOnly && history.future.length > 0,\n notifyChangeComplete,\n exportJSON,\n importJSON,\n }\n}\n\n","import { useCallback, useRef, useState } from 'react'\nimport type { TualItem, UseLeafletTualOptions } from '../types/index.js'\n\ninterface HistoryState {\n past: TualItem[][]\n present: TualItem[]\n future: TualItem[][]\n}\n\nexport function useTualHistory(options: UseLeafletTualOptions) {\n const { initialItems = [], items: controlledItems, maxHistory = 50 } = options\n const maxPast = Math.max(0, maxHistory - 1)\n\n const callbacksRef = useRef(options)\n callbacksRef.current = options\n\n const [history, setHistory] = useState<HistoryState>({\n past: [],\n present: initialItems,\n future: [],\n })\n const historyRef = useRef(history)\n historyRef.current = history\n\n const items = controlledItems ?? history.present\n const currentItemsRef = useRef<TualItem[]>(items)\n currentItemsRef.current = items\n\n // Items as of the last completed edit — the snapshot pushed into `past`.\n const committedItemsRef = useRef<TualItem[]>(items)\n\n const triggerChange = useCallback((next: TualItem[]) => {\n callbacksRef.current.onItemsChange?.(next)\n callbacksRef.current.onChange?.(next)\n }, [])\n\n const triggerChangeComplete = useCallback(\n (finalItems: TualItem[], targetItem?: TualItem | null) => {\n callbacksRef.current.onItemsChangeComplete?.(finalItems, targetItem)\n callbacksRef.current.onChangeComplete?.(finalItems, targetItem)\n callbacksRef.current.onEditEnd?.(finalItems, targetItem)\n callbacksRef.current.onEditComplete?.(finalItems, targetItem)\n if (targetItem) callbacksRef.current.onItemChangeComplete?.(targetItem)\n },\n [],\n )\n\n const commitItems = useCallback(\n (updater: (prev: TualItem[]) => TualItem[]) => {\n const next = updater(currentItemsRef.current)\n currentItemsRef.current = next\n triggerChange(next)\n setHistory((prev) => ({ ...prev, present: next }))\n return next\n },\n [triggerChange],\n )\n\n // Records one history snapshot per completed edit (drag, style tweak, add,\n // delete, import, ...) and then reports it. No-op when nothing changed since\n // the last completion.\n const notifyChangeComplete = useCallback(\n (targetItem?: TualItem | null) => {\n const current = currentItemsRef.current\n if (current === committedItemsRef.current) return\n const anchor = committedItemsRef.current\n committedItemsRef.current = current\n setHistory((prev) => ({\n past: [...prev.past, anchor].slice(-maxPast),\n present: current,\n future: [],\n }))\n triggerChangeComplete(current, targetItem)\n },\n [maxPast, triggerChangeComplete],\n )\n\n const undo = useCallback(\n (readOnly: boolean) => {\n if (readOnly) return\n setHistory((prev) => {\n if (prev.past.length === 0) return prev\n const restored = prev.past[prev.past.length - 1]\n currentItemsRef.current = restored\n committedItemsRef.current = restored\n triggerChange(restored)\n triggerChangeComplete(restored, null)\n return {\n past: prev.past.slice(0, -1),\n present: restored,\n future: [prev.present, ...prev.future],\n }\n })\n },\n [triggerChange, triggerChangeComplete],\n )\n\n const redo = useCallback(\n (readOnly: boolean) => {\n if (readOnly) return\n setHistory((prev) => {\n if (prev.future.length === 0) return prev\n const restored = prev.future[0]\n currentItemsRef.current = restored\n committedItemsRef.current = restored\n triggerChange(restored)\n triggerChangeComplete(restored, null)\n return {\n past: [...prev.past, prev.present],\n present: restored,\n future: prev.future.slice(1),\n }\n })\n },\n [triggerChange, triggerChangeComplete],\n )\n\n return {\n items,\n history,\n historyRef,\n callbacksRef,\n commitItems,\n notifyChangeComplete,\n undo,\n redo,\n }\n}\n","import { useCallback, useState } from 'react'\nimport type { TualItem, ShapeKind } from '../types/index.js'\nimport {\n DEFAULT_FONT_SIZE,\n DEFAULT_NOTE_BG,\n DEFAULT_STROKE_COLOR,\n DEFAULT_STROKE_WIDTH,\n NOTE_COLOR_THEMES,\n} from '../shared/constants.js'\n\nexport interface UseCanvasStylesOptions {\n defaultColor?: string\n defaultStrokeWidth?: number\n defaultNoteColor?: string\n defaultFontSize?: number\n defaultShape?: ShapeKind\n readOnly: boolean\n selectedId: string | null\n commitItems: (updater: (prev: TualItem[]) => TualItem[]) => TualItem[]\n}\n\nexport function useTualStyles(options: UseCanvasStylesOptions) {\n const {\n defaultColor = DEFAULT_STROKE_COLOR,\n defaultStrokeWidth = DEFAULT_STROKE_WIDTH,\n defaultNoteColor = DEFAULT_NOTE_BG,\n defaultFontSize = DEFAULT_FONT_SIZE,\n defaultShape = 'square',\n readOnly,\n selectedId,\n commitItems,\n } = options\n\n const [activeShape, setActiveShapeState] = useState<ShapeKind>(defaultShape)\n const [shapeFilled, setShapeFilledState] = useState<boolean>(true)\n const [activeColor, setActiveColorState] = useState<string>(defaultColor)\n const [strokeWidth, setStrokeWidthState] = useState<number>(defaultStrokeWidth)\n const [dashed, setDashedState] = useState<boolean>(false)\n const [noteColor, setNoteColorState] = useState<string>(defaultNoteColor)\n const [fontSize, setFontSizeState] = useState<number>(defaultFontSize)\n const [fontWeight, setFontWeightState] = useState<'normal' | 'bold'>('bold')\n\n const patchSelected = useCallback(\n (predicate: (it: TualItem) => boolean, patcher: (it: any) => any) => {\n if (!selectedId) return\n commitItems((prev) =>\n prev.map((it) => (it.id === selectedId && predicate(it) ? patcher(it) : it)),\n )\n },\n [selectedId, commitItems],\n )\n\n const setActiveShape = useCallback(\n (shape: ShapeKind) => {\n if (readOnly) return\n setActiveShapeState(shape)\n patchSelected((it) => it.type === 'shape', (it) => ({ ...it, shape }))\n },\n [readOnly, patchSelected],\n )\n\n const setShapeFilled = useCallback(\n (filled: boolean) => {\n if (readOnly) return\n setShapeFilledState(filled)\n patchSelected((it) => it.type === 'shape', (it) => ({ ...it, filled }))\n },\n [readOnly, patchSelected],\n )\n\n const setActiveColor = useCallback(\n (color: string) => {\n if (readOnly) return\n setActiveColorState(color)\n patchSelected((it) => it.type !== 'note', (it) => ({ ...it, color }))\n },\n [readOnly, patchSelected],\n )\n\n const setStrokeWidth = useCallback(\n (width: number) => {\n if (readOnly) return\n setStrokeWidthState(width)\n patchSelected(\n (it) =>\n it.type === 'arrow' ||\n it.type === 'freedraw' ||\n it.type === 'shape' ||\n it.type === 'ruler',\n (it) => ({ ...it, strokeWidth: width }),\n )\n },\n [readOnly, patchSelected],\n )\n\n const setDashed = useCallback(\n (nextDashed: boolean) => {\n if (readOnly) return\n setDashedState(nextDashed)\n patchSelected(\n (it) =>\n it.type === 'arrow' ||\n it.type === 'freedraw' ||\n it.type === 'shape' ||\n it.type === 'ruler',\n (it) => ({ ...it, dashed: nextDashed }),\n )\n },\n [readOnly, patchSelected],\n )\n\n const setNoteColor = useCallback(\n (bg: string) => {\n if (readOnly) return\n setNoteColorState(bg)\n const theme = NOTE_COLOR_THEMES.find((t) => t.bg === bg)\n patchSelected(\n (it) => it.type === 'note',\n (it) => ({ ...it, backgroundColor: bg, textColor: theme?.text ?? it.textColor }),\n )\n },\n [readOnly, patchSelected],\n )\n\n const setFontSize = useCallback(\n (size: number) => {\n if (readOnly) return\n setFontSizeState(size)\n patchSelected((it) => it.type === 'text', (it) => ({ ...it, initialFontSize: size }))\n },\n [readOnly, patchSelected],\n )\n\n const setFontWeight = useCallback(\n (weight: 'normal' | 'bold') => {\n if (readOnly) return\n setFontWeightState(weight)\n patchSelected((it) => it.type === 'text', (it) => ({ ...it, fontWeight: weight }))\n },\n [readOnly, patchSelected],\n )\n\n return {\n activeShape,\n setActiveShape,\n shapeFilled,\n setShapeFilled,\n activeColor,\n setActiveColor,\n strokeWidth,\n setStrokeWidth,\n dashed,\n setDashed,\n noteColor,\n setNoteColor,\n fontSize,\n setFontSize,\n fontWeight,\n setFontWeight,\n }\n}\n\n","'use client'\n\nimport { useState } from 'react'\nimport type { ArrowItem, ShapeItem, TextItem } from '../../types/index.js'\nimport { STROKE_COLORS } from '../../shared/constants.js'\nimport { DEFAULT_ENABLED_TOOLS, POSITION_STYLES } from './constants.js'\nimport { DEFAULT_ICONS } from './icons.js'\nimport type { TualToolbarProps } from './types.js'\nimport {\n buildArrowOptions,\n buildShapeOptions,\n getActiveToolInfo,\n getToolbarButtonClassName,\n getToolbarButtonStyle,\n getToolbarContainerStyle,\n} from './toolbar-helpers.js'\nimport { ExpandTriggerButton } from './CollapseButtons.js'\nimport { PrimaryToolbarStrip } from './PrimaryToolbarStrip.js'\nimport { ContextualSettingsBar } from './ContextualSettingsBar.js'\nimport { useToolbarContext } from './use-toolbar-context.js'\n\nexport function TualToolbar({\n controller,\n position = 'top-center',\n orientation: propOrientation,\n collapsible = true,\n defaultCollapsed = false,\n collapsed: propCollapsed,\n onCollapsedChange,\n showCollapseButton = true,\n readOnly: propReadOnly,\n enabledTools = DEFAULT_ENABLED_TOOLS,\n customTools,\n showHistoryControls = true,\n showDeleteButton = true,\n showClearButton = true,\n showToolLabels: explicitShowToolLabels,\n labels,\n icons,\n unstyled = false,\n classNames,\n styles,\n strokeColors = STROKE_COLORS,\n strokeWidthOptions,\n fontSizeOptions,\n className,\n style,\n}: TualToolbarProps) {\n const readOnly = Boolean(propReadOnly ?? controller.readOnly)\n const isVerticalPosition = position === 'left' || position === 'right' || position === 'left-center' || position === 'right-center'\n const orientation = propOrientation ?? (isVerticalPosition ? 'vertical' : 'horizontal')\n const isVertical = orientation === 'vertical'\n const showToolLabels = explicitShowToolLabels ?? !isVertical\n\n const [internalCollapsed, setInternalCollapsed] = useState(defaultCollapsed)\n const isCollapsed = propCollapsed !== undefined ? propCollapsed : internalCollapsed\n const handleToggleCollapse = (next: boolean) => {\n if (propCollapsed === undefined) setInternalCollapsed(next)\n onCollapsedChange?.(next)\n }\n\n const { activeTool, activeShape, selectedItem } = controller\n\n const {\n isArrowToolActive,\n isShapeToolActive,\n isArrowContext,\n isFreeDrawContext,\n isShapeContext,\n isRulerContext,\n isNoteContext,\n isTextContext,\n showSettingsBar,\n arrowDropdownOpen,\n setArrowDropdownOpen,\n shapesModalOpen,\n setShapesModalOpen,\n arrowGroupRef,\n shapesGroupRef,\n } = useToolbarContext(controller, readOnly)\n\n const arrowOptions = buildArrowOptions(labels, icons)\n const shapeOptions = buildShapeOptions(labels, icons)\n\n const activeArrowDef = arrowOptions.find((a) => a.id === activeTool)\n const arrowGroupLabel = labels?.arrowGroup ?? (activeArrowDef ? activeArrowDef.label : 'Arrows')\n const currentArrowIcon = icons?.arrowGroup ?? (activeArrowDef ? activeArrowDef.icon : DEFAULT_ICONS.arrowLinear)\n\n const activeShapeDef = shapeOptions.find((s) => s.kind === activeShape)\n const shapesGroupLabel = labels?.shapesGroup ?? (isShapeToolActive && activeShapeDef ? activeShapeDef.label : 'Shapes')\n const currentShapeIcon = icons?.shapesGroup ?? (isShapeToolActive && activeShapeDef ? activeShapeDef.icon : DEFAULT_ICONS.shapesGroup)\n\n const activeToolInfo = getActiveToolInfo(\n activeTool,\n isArrowToolActive,\n currentArrowIcon,\n arrowGroupLabel,\n currentShapeIcon,\n shapesGroupLabel,\n icons,\n labels,\n )\n\n const stopEvent = (e: React.SyntheticEvent) => e.stopPropagation()\n\n if (isCollapsed) {\n return (\n <div\n data-tual-toolbar\n data-readonly={readOnly || undefined}\n data-position={position}\n data-orientation={orientation}\n data-collapsed=\"true\"\n className={['rlc-toolbar', 'rlc-toolbar-collapsed', readOnly ? 'rlc-toolbar-readonly' : undefined, classNames?.toolbar, classNames?.toolbarCollapsed, className].filter(Boolean).join(' ')}\n onClick={stopEvent}\n onDoubleClick={stopEvent}\n onPointerDown={stopEvent}\n onWheel={stopEvent}\n style={{ position: 'absolute', zIndex: 1000, pointerEvents: 'auto', userSelect: 'none', ...POSITION_STYLES[position], ...styles?.toolbar, ...styles?.toolbarCollapsed, ...style }}\n >\n <ExpandTriggerButton position={position} orientation={orientation} showToolLabels={showToolLabels} unstyled={unstyled} activeToolInfo={activeToolInfo} labels={labels} icons={icons} classNames={classNames} styles={styles} onExpand={() => handleToggleCollapse(false)} />\n </div>\n )\n }\n\n return (\n <div\n data-tual-toolbar\n data-readonly={readOnly || undefined}\n data-position={position}\n data-orientation={orientation}\n className={['rlc-toolbar', readOnly ? 'rlc-toolbar-readonly' : undefined, classNames?.toolbar, className].filter(Boolean).join(' ')}\n onClick={stopEvent}\n onDoubleClick={stopEvent}\n onPointerDown={stopEvent}\n onWheel={stopEvent}\n style={{\n position: 'absolute',\n zIndex: 1000,\n pointerEvents: 'auto',\n userSelect: 'none',\n ...POSITION_STYLES[position],\n ...getToolbarContainerStyle(position, isVertical, unstyled),\n ...styles?.toolbar,\n ...style,\n }}\n >\n <PrimaryToolbarStrip\n controller={controller}\n readOnly={readOnly}\n position={position}\n orientation={orientation}\n isVertical={isVertical}\n showToolLabels={showToolLabels}\n collapsible={collapsible}\n showCollapseButton={showCollapseButton}\n enabledTools={enabledTools}\n customTools={customTools}\n showHistoryControls={showHistoryControls}\n showDeleteButton={showDeleteButton}\n showClearButton={showClearButton}\n labels={labels}\n icons={icons}\n unstyled={unstyled}\n classNames={classNames}\n styles={styles}\n arrowOptions={arrowOptions}\n shapeOptions={shapeOptions}\n arrowGroupLabel={arrowGroupLabel}\n currentArrowIcon={currentArrowIcon}\n shapesGroupLabel={shapesGroupLabel}\n currentShapeIcon={currentShapeIcon}\n isArrowToolActive={isArrowToolActive}\n isShapeToolActive={isShapeToolActive}\n arrowDropdownOpen={arrowDropdownOpen}\n shapesModalOpen={shapesModalOpen}\n arrowGroupRef={arrowGroupRef}\n shapesGroupRef={shapesGroupRef}\n setArrowDropdownOpen={setArrowDropdownOpen}\n setShapesModalOpen={setShapesModalOpen}\n getButtonClassName={(active) => getToolbarButtonClassName(active, classNames)}\n getButtonStyle={(active) => getToolbarButtonStyle(active, isVertical, showToolLabels, readOnly, unstyled, styles)}\n onCollapse={() => handleToggleCollapse(true)}\n />\n\n {showSettingsBar && (\n <ContextualSettingsBar\n isArrowContext={isArrowContext}\n isFreeDrawContext={isFreeDrawContext}\n isShapeContext={isShapeContext}\n isRulerContext={isRulerContext}\n isTextContext={isTextContext}\n isNoteContext={isNoteContext}\n selectedItem={selectedItem}\n selectedShape={selectedItem?.type === 'shape' ? (selectedItem as ShapeItem) : null}\n selectedArrow={selectedItem?.type === 'arrow' ? (selectedItem as ArrowItem) : null}\n selectedText={selectedItem?.type === 'text' ? (selectedItem as TextItem) : null}\n activeColor={controller.activeColor} setActiveColor={controller.setActiveColor}\n strokeWidth={controller.strokeWidth} setStrokeWidth={controller.setStrokeWidth}\n strokeWidthOptions={strokeWidthOptions}\n dashed={controller.dashed} setDashed={controller.setDashed}\n shapeFilled={controller.shapeFilled} setShapeFilled={controller.setShapeFilled}\n noteColor={controller.noteColor} setNoteColor={controller.setNoteColor}\n fontSize={controller.fontSize} setFontSize={controller.setFontSize}\n fontSizeOptions={fontSizeOptions}\n fontWeight={controller.fontWeight} setFontWeight={controller.setFontWeight}\n updateItem={controller.updateItem}\n notifyChangeComplete={controller.notifyChangeComplete}\n isEditingLabel={controller.isEditingLabel}\n setEditingLabel={controller.setEditingLabel}\n strokeColors={strokeColors}\n orientation={orientation}\n labels={labels}\n icons={icons}\n unstyled={unstyled}\n classNames={classNames}\n styles={styles}\n />\n )}\n </div>\n )\n}\n","import type React from 'react'\nimport type { ToolbarPosition, ToolbarToolGroupId } from '../../types/index.js'\n\nexport const DEFAULT_ENABLED_TOOLS: readonly ToolbarToolGroupId[] = [\n 'select',\n 'freedraw',\n 'arrow',\n 'shape',\n 'ruler',\n 'note',\n 'text',\n]\n\nexport const POSITION_STYLES: Record<ToolbarPosition, React.CSSProperties> = {\n top: {\n top: '14px',\n left: '50%',\n transform: 'translateX(-50%)',\n },\n bottom: {\n bottom: '24px',\n left: '50%',\n transform: 'translateX(-50%)',\n },\n left: {\n top: '50%',\n left: '14px',\n transform: 'translateY(-50%)',\n },\n right: {\n top: '50%',\n right: '14px',\n transform: 'translateY(-50%)',\n },\n 'top-center': {\n top: '14px',\n left: '50%',\n transform: 'translateX(-50%)',\n },\n 'bottom-center': {\n bottom: '24px',\n left: '50%',\n transform: 'translateX(-50%)',\n },\n 'left-center': {\n top: '50%',\n left: '14px',\n transform: 'translateY(-50%)',\n },\n 'right-center': {\n top: '50%',\n right: '14px',\n transform: 'translateY(-50%)',\n },\n}\n","import type React from 'react'\nimport type {\n TualIcons,\n TualLabels,\n LeafletTualClassNames,\n LeafletTualStyles,\n ToolbarOrientation,\n ToolbarPosition,\n} from '../../types/index.js'\nimport { DEFAULT_ICONS } from './icons.js'\nimport type { ArrowOption, ShapeOption } from './types.js'\n\nexport function buildArrowOptions(labels?: TualLabels, icons?: TualIcons): readonly ArrowOption[] {\n return [\n {\n id: 'arrow-linear',\n style: 'linear',\n label: labels?.arrowLinear ?? 'Linear Arrow',\n shortcut: 'A',\n icon: icons?.arrowLinear ?? DEFAULT_ICONS.arrowLinear,\n },\n {\n id: 'arrow-curved',\n style: 'curved',\n label: labels?.arrowCurved ?? 'Curved Arrow',\n shortcut: 'C',\n icon: icons?.arrowCurved ?? DEFAULT_ICONS.arrowCurved,\n },\n {\n id: 'arrow-bi',\n style: 'bi',\n label: labels?.arrowBi ?? 'Double-Headed',\n shortcut: 'B',\n icon: icons?.arrowBi ?? DEFAULT_ICONS.arrowBi,\n },\n {\n id: 'arrow-elbow',\n style: 'elbow',\n label: labels?.arrowElbow ?? 'Elbow / Step',\n shortcut: 'E',\n icon: icons?.arrowElbow ?? DEFAULT_ICONS.arrowElbow,\n },\n {\n id: 'arrow-s-curve',\n style: 's-curve',\n label: labels?.arrowSCurve ?? 'S-Curve Arrow',\n shortcut: 'S',\n icon: icons?.arrowSCurve ?? DEFAULT_ICONS.arrowSCurve,\n },\n ]\n}\n\nexport function buildShapeOptions(labels?: TualLabels, icons?: TualIcons): readonly ShapeOption[] {\n return [\n { kind: 'square', label: labels?.shapeSquare ?? 'Square', icon: icons?.shapeSquare ?? DEFAULT_ICONS.shapeSquare },\n { kind: 'circle', label: labels?.shapeCircle ?? 'Circle', icon: icons?.shapeCircle ?? DEFAULT_ICONS.shapeCircle },\n { kind: 'star', label: labels?.shapeStar ?? 'Star', icon: icons?.shapeStar ?? DEFAULT_ICONS.shapeStar },\n { kind: 'actor', label: labels?.shapeActor ?? 'Actor', icon: icons?.shapeActor ?? DEFAULT_ICONS.shapeActor },\n { kind: 'triangle', label: labels?.shapeTriangle ?? 'Triangle', icon: icons?.shapeTriangle ?? DEFAULT_ICONS.shapeTriangle },\n { kind: 'diamond', label: labels?.shapeDiamond ?? 'Diamond', icon: icons?.shapeDiamond ?? DEFAULT_ICONS.shapeDiamond },\n { kind: 'hexagon', label: labels?.shapeHexagon ?? 'Hexagon', icon: icons?.shapeHexagon ?? DEFAULT_ICONS.shapeHexagon },\n { kind: 'marker', label: labels?.shapeMarker ?? 'Marker', icon: icons?.shapeMarker ?? DEFAULT_ICONS.shapeMarker },\n ]\n}\n\nexport function getToolbarButtonStyle(\n isActive: boolean,\n isVertical: boolean,\n showToolLabels: boolean,\n readOnly: boolean,\n unstyled: boolean,\n styles?: LeafletTualStyles,\n): React.CSSProperties {\n const baseStyle: React.CSSProperties = unstyled\n ? {}\n : isVertical && showToolLabels\n ? {\n display: 'grid',\n gridTemplateColumns: '20px 1fr auto',\n alignItems: 'center',\n columnGap: '10px',\n padding: '8px 12px',\n textAlign: 'left',\n width: '100%',\n height: 'auto',\n borderRadius: '2px',\n border: isActive ? '1px solid #4f4f4f' : '1px solid #767676',\n boxSizing: 'border-box',\n backgroundColor: isActive ? '#e0e0e0' : '#efefef',\n color: '#000000',\n fontWeight: 'normal',\n fontSize: '12px',\n lineHeight: '16px',\n cursor: 'pointer',\n boxShadow: isActive ? 'inset 1px 1px 2px rgba(0, 0, 0, 0.2)' : 'none',\n flexShrink: 0,\n whiteSpace: 'nowrap',\n }\n : {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n position: 'relative',\n gap: showToolLabels ? '6px' : '0px',\n padding: isVertical ? '0' : showToolLabels ? '2px 7px' : '3px 6px',\n width: isVertical ? '30px' : 'auto',\n height: isVertical ? '30px' : 'auto',\n minWidth: isVertical ? '30px' : undefined,\n minHeight: isVertical ? '30px' : undefined,\n borderRadius: '2px',\n border: isActive ? '1px solid #4f4f4f' : '1px solid #767676',\n boxSizing: 'border-box',\n backgroundColor: isActive ? '#e0e0e0' : '#efefef',\n color: '#000000',\n fontWeight: 'normal',\n fontSize: '12px',\n lineHeight: '16px',\n cursor: 'pointer',\n boxShadow: isActive ? 'inset 1px 1px 2px rgba(0, 0, 0, 0.2)' : 'none',\n flexShrink: 0,\n whiteSpace: 'nowrap',\n }\n\n return {\n ...baseStyle,\n ...styles?.toolButton,\n ...(isActive ? styles?.toolButtonActive : undefined),\n ...(isVertical && !showToolLabels\n ? {\n padding: '0',\n width: styles?.toolButton?.width ?? '30px',\n height: styles?.toolButton?.height ?? '30px',\n }\n : undefined),\n ...(readOnly && !isActive ? { opacity: 0.45, cursor: 'not-allowed' } : undefined),\n }\n}\n\nexport function getToolbarButtonClassName(\n isActive: boolean,\n classNames?: LeafletTualClassNames,\n): string {\n return ['rlc-tool-btn', classNames?.toolButton, isActive ? classNames?.toolButtonActive : undefined]\n .filter(Boolean)\n .join(' ')\n}\n\nexport function getPopupPlacementStyle(\n position: ToolbarPosition,\n orientation: ToolbarOrientation,\n centerHorizontally = false,\n): React.CSSProperties {\n const isVertical = orientation === 'vertical'\n const isRight = position.includes('right')\n const isLeft = position.includes('left')\n const isBottom = position.includes('bottom')\n\n if (isVertical) {\n return {\n ...(isBottom ? { bottom: 0 } : { top: 0 }),\n ...(isRight ? { right: 'calc(100% + 8px)' } : { left: 'calc(100% + 8px)' }),\n }\n }\n\n return {\n ...(isRight\n ? { right: 0 }\n : isLeft || !centerHorizontally\n ? { left: 0 }\n : { left: '50%', transform: 'translateX(-50%)' }),\n ...(isBottom ? { bottom: 'calc(100% + 8px)' } : { top: 'calc(100% + 8px)' }),\n }\n}\n\nexport function getToolbarContainerStyle(\n position: ToolbarPosition,\n isVertical: boolean,\n unstyled: boolean,\n): React.CSSProperties {\n if (unstyled) return {}\n return isVertical\n ? {\n display: 'flex',\n flexDirection: position === 'right' || position === 'right-center' ? 'row-reverse' : 'row',\n alignItems: 'flex-start',\n gap: '8px',\n fontFamily: 'Inter, system-ui, -apple-system, sans-serif',\n }\n : {\n display: 'flex',\n flexDirection: position === 'bottom' || position === 'bottom-center' ? 'column-reverse' : 'column',\n alignItems: 'center',\n gap: '8px',\n fontFamily: 'Inter, system-ui, -apple-system, sans-serif',\n }\n}\n\nexport function getActiveToolInfo(\n activeTool: string,\n isArrowToolActive: boolean,\n currentArrowIcon: React.ReactNode,\n arrowGroupLabel: string,\n currentShapeIcon: React.ReactNode,\n shapesGroupLabel: string,\n icons?: TualIcons,\n labels?: TualLabels,\n): { icon: React.ReactNode; label: string } {\n if (activeTool === 'select') return { icon: icons?.select ?? DEFAULT_ICONS.select, label: labels?.select ?? 'Select' }\n if (activeTool === 'freedraw') return { icon: icons?.freedraw ?? DEFAULT_ICONS.freedraw, label: labels?.freedraw ?? 'Free Draw' }\n if (activeTool === 'ruler') return { icon: icons?.ruler ?? DEFAULT_ICONS.ruler, label: labels?.ruler ?? 'Ruler' }\n if (isArrowToolActive) return { icon: currentArrowIcon, label: arrowGroupLabel }\n if (activeTool === 'shape') return { icon: currentShapeIcon, label: shapesGroupLabel }\n if (activeTool === 'note') return { icon: icons?.note ?? DEFAULT_ICONS.note, label: labels?.note ?? 'Note Card' }\n if (activeTool === 'text') return { icon: icons?.text ?? DEFAULT_ICONS.text, label: labels?.text ?? 'Normal Text' }\n return { icon: icons?.shapesGroup ?? DEFAULT_ICONS.shapesGroup, label: 'Tools' }\n}\n\n","import type React from 'react'\nimport type {\n ArrowStyle,\n TualIcons,\n TualLabels,\n CustomToolbarItem,\n LeafletTualClassNames,\n LeafletTualController,\n LeafletTualStyles,\n ShapeKind,\n ToolbarOrientation,\n ToolbarPosition,\n ToolbarToolGroupId,\n} from '../../types/index.js'\n\nexport interface TualToolbarProps {\n controller: LeafletTualController\n position?: ToolbarPosition\n orientation?: ToolbarOrientation\n collapsible?: boolean\n defaultCollapsed?: boolean\n collapsed?: boolean\n onCollapsedChange?: (collapsed: boolean) => void\n showCollapseButton?: boolean\n readOnly?: boolean\n enabledTools?: readonly ToolbarToolGroupId[]\n customTools?: readonly CustomToolbarItem[]\n showHistoryControls?: boolean\n showDeleteButton?: boolean\n showClearButton?: boolean\n showToolLabels?: boolean\n labels?: TualLabels\n icons?: TualIcons\n unstyled?: boolean\n classNames?: LeafletTualClassNames\n styles?: LeafletTualStyles\n strokeColors?: readonly string[]\n strokeWidthOptions?: readonly number[]\n fontSizeOptions?: readonly number[]\n className?: string\n style?: React.CSSProperties\n}\n\nexport const ARROW_TOOL_IDS = [\n 'arrow-linear',\n 'arrow-curved',\n 'arrow-bi',\n 'arrow-elbow',\n 'arrow-s-curve',\n] as const\n\nexport type ArrowToolId = (typeof ARROW_TOOL_IDS)[number]\n\nexport interface ArrowOption {\n id: ArrowToolId\n style: ArrowStyle\n label: string\n shortcut: string\n icon: React.ReactNode\n}\n\nexport interface ShapeOption {\n kind: ShapeKind\n label: string\n icon: React.ReactNode\n}\n","import type { ToolbarOrientation, ToolbarPosition } from '../../types/index.js'\nimport { ARROW_TOOL_IDS, type ArrowToolId } from './types.js'\n\nexport function isArrowTool(tool: string): tool is ArrowToolId {\n return (ARROW_TOOL_IDS as readonly string[]).includes(tool)\n}\n\n/**\n * Returns rotation transform for dropdown indicator chevron (base shape: points down `v`).\n * When closed: points towards the opening direction.\n * When open: flips 180 degrees.\n */\nexport function getDropdownChevronRotation(\n isOpen: boolean,\n position: ToolbarPosition = 'top-center',\n orientation: ToolbarOrientation = 'horizontal',\n): string {\n if (orientation === 'vertical') {\n const isRight = position === 'right' || position === 'right-center'\n if (isRight) {\n // Menu opens to the left\n return isOpen ? 'rotate(-90deg)' : 'rotate(90deg)'\n }\n // Menu opens to the right\n return isOpen ? 'rotate(90deg)' : 'rotate(-90deg)'\n }\n\n const isBottom = position === 'bottom' || position === 'bottom-center'\n if (isBottom) {\n // Menu opens upwards\n return isOpen ? 'rotate(0deg)' : 'rotate(180deg)'\n }\n // Menu opens downwards\n return isOpen ? 'rotate(180deg)' : 'rotate(0deg)'\n}\n\n/**\n * Returns rotation transform for collapse button chevron (base shape: points up `^`).\n * Points towards the screen edge the toolbar collapses into.\n */\nexport function getCollapseChevronRotation(\n position: ToolbarPosition = 'top-center',\n orientation: ToolbarOrientation = 'horizontal',\n): string {\n if (orientation === 'vertical') {\n const isRight = position === 'right' || position === 'right-center'\n return isRight ? 'rotate(90deg)' : 'rotate(-90deg)'\n }\n\n const isBottom = position === 'bottom' || position === 'bottom-center'\n return isBottom ? 'rotate(180deg)' : 'rotate(0deg)'\n}\n\n/**\n * Returns rotation transform for expand button chevron (base shape: points down `v`).\n * Points towards the map interior where the toolbar will expand into.\n */\nexport function getExpandChevronRotation(\n position: ToolbarPosition = 'top-center',\n orientation: ToolbarOrientation = 'horizontal',\n): string {\n if (orientation === 'vertical') {\n const isRight = position === 'right' || position === 'right-center'\n return isRight ? 'rotate(90deg)' : 'rotate(-90deg)'\n }\n\n const isBottom = position === 'bottom' || position === 'bottom-center'\n return isBottom ? 'rotate(180deg)' : 'rotate(0deg)'\n}\n","import type React from 'react'\nimport type {\n TualIcons,\n TualLabels,\n LeafletTualClassNames,\n LeafletTualStyles,\n ToolbarOrientation,\n ToolbarPosition,\n} from '../../types/index.js'\nimport { DEFAULT_ICONS } from './icons.js'\nimport { getCollapseChevronRotation, getExpandChevronRotation } from './utils.js'\n\nexport interface CollapseTriggerButtonProps {\n position: ToolbarPosition\n orientation: ToolbarOrientation\n isVertical: boolean\n showToolLabels: boolean\n unstyled: boolean\n labels?: TualLabels\n icons?: TualIcons\n classNames?: LeafletTualClassNames\n styles?: LeafletTualStyles\n onCollapse: () => void\n}\n\nexport function CollapseTriggerButton({\n position,\n orientation,\n isVertical,\n showToolLabels,\n unstyled,\n labels,\n icons,\n classNames,\n styles,\n onCollapse,\n}: CollapseTriggerButtonProps) {\n const rotation = getCollapseChevronRotation(position, orientation)\n const icon = icons?.collapseToolbar ?? DEFAULT_ICONS.collapseToolbar\n\n return (\n <button\n type=\"button\"\n aria-label={labels?.collapseToolbar ?? 'Collapse toolbar'}\n title={labels?.collapseToolbar ?? 'Collapse toolbar'}\n data-toolbar-collapse=\"true\"\n className={['rlc-toolbar-collapse-btn', classNames?.toolbarCollapseButton].filter(Boolean).join(' ')}\n onClick={onCollapse}\n style={{\n ...(unstyled\n ? {}\n : isVertical && showToolLabels\n ? {\n display: 'grid',\n gridTemplateColumns: '20px 1fr auto',\n alignItems: 'center',\n columnGap: '10px',\n padding: '8px 12px',\n textAlign: 'left',\n width: '100%',\n height: 'auto',\n borderRadius: '2px',\n border: '1px solid #767676',\n boxSizing: 'border-box',\n backgroundColor: '#efefef',\n color: '#000000',\n cursor: 'pointer',\n boxShadow: 'none',\n flexShrink: 0,\n whiteSpace: 'nowrap',\n }\n : {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: isVertical ? '0' : showToolLabels ? '2px 6px' : '3px 6px',\n width: isVertical ? '30px' : 'auto',\n height: isVertical ? '30px' : 'auto',\n borderRadius: '2px',\n border: '1px solid #767676',\n boxSizing: 'border-box',\n backgroundColor: '#efefef',\n color: '#000000',\n cursor: 'pointer',\n boxShadow: 'none',\n flexShrink: 0,\n }),\n ...styles?.toolButton,\n ...styles?.toolbarCollapseButton,\n }}\n >\n {isVertical && showToolLabels ? (\n <>\n <span style={{ display: 'inline-flex', alignItems: 'center', justifyContent: 'center', width: '20px' }}>\n <span style={{ display: 'inline-flex', alignItems: 'center', justifyContent: 'center', transform: rotation, transition: 'transform 0.15s ease' }}>\n {icon}\n </span>\n </span>\n <span style={{ whiteSpace: 'nowrap' }}>{labels?.collapseToolbar ?? 'Collapse'}</span>\n <span />\n </>\n ) : (\n <span style={{ display: 'inline-flex', alignItems: 'center', justifyContent: 'center', transform: rotation, transition: 'transform 0.15s ease' }}>\n {icon}\n </span>\n )}\n </button>\n )\n}\n\nexport interface ExpandTriggerButtonProps {\n position: ToolbarPosition\n orientation: ToolbarOrientation\n showToolLabels: boolean\n unstyled: boolean\n activeToolInfo: { icon: React.ReactNode; label: string }\n labels?: TualLabels\n icons?: TualIcons\n classNames?: LeafletTualClassNames\n styles?: LeafletTualStyles\n onExpand: () => void\n}\n\nexport function ExpandTriggerButton({\n position,\n orientation,\n showToolLabels,\n unstyled,\n activeToolInfo,\n labels,\n icons,\n classNames,\n styles,\n onExpand,\n}: ExpandTriggerButtonProps) {\n return (\n <button\n type=\"button\"\n aria-label={labels?.expandToolbar ?? 'Expand toolbar'}\n title={labels?.expandToolbar ?? 'Expand toolbar'}\n data-toolbar-expand=\"true\"\n className={['rlc-toolbar-expand-btn', classNames?.toolbarCollapseButton].filter(Boolean).join(' ')}\n onClick={onExpand}\n style={{\n ...(unstyled\n ? {}\n : {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '4px',\n padding: '3px 7px',\n borderRadius: '2px',\n backgroundColor: '#efefef',\n border: '1px solid #767676',\n boxShadow: '0 1px 2px rgba(0, 0, 0, 0.15)',\n color: '#000000',\n cursor: 'pointer',\n fontSize: '12px',\n fontWeight: 'normal',\n boxSizing: 'border-box',\n }),\n ...styles?.toolbarCollapseButton,\n }}\n >\n {activeToolInfo.icon}\n {showToolLabels && <span>{activeToolInfo.label}</span>}\n <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n opacity: 0.8,\n transform: getExpandChevronRotation(position, orientation),\n transition: 'transform 0.15s ease',\n }}\n >\n {icons?.expandToolbar ?? DEFAULT_ICONS.expandToolbar}\n </span>\n </button>\n )\n}\n\n","import type React from 'react'\nimport type { LeafletTualStyles } from '../../types/index.js'\n\nexport function getHistoryBtnStyle(\n enabled: boolean,\n isVertical: boolean,\n showToolLabels: boolean,\n unstyled: boolean,\n styles?: LeafletTualStyles,\n): React.CSSProperties {\n const base: React.CSSProperties = unstyled\n ? {}\n : isVertical && showToolLabels\n ? {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '6px',\n padding: '8px 10px',\n flexGrow: 1,\n flexShrink: 0,\n flexBasis: 0,\n width: 'auto',\n height: 'auto',\n minHeight: '28px',\n borderRadius: '2px',\n border: '1px solid #767676',\n boxSizing: 'border-box',\n backgroundColor: '#efefef',\n color: '#000000',\n opacity: enabled ? 1 : 0.45,\n cursor: enabled ? 'pointer' : 'not-allowed',\n boxShadow: 'none',\n fontSize: '12px',\n fontWeight: 'normal',\n whiteSpace: 'nowrap',\n }\n : {\n padding: isVertical ? '0' : showToolLabels ? '2px 6px' : '3px 6px',\n width: isVertical ? '30px' : 'auto',\n height: isVertical ? '30px' : 'auto',\n borderRadius: '2px',\n border: '1px solid #767676',\n boxSizing: 'border-box',\n backgroundColor: '#efefef',\n color: '#000000',\n opacity: enabled ? 1 : 0.45,\n cursor: enabled ? 'pointer' : 'not-allowed',\n boxShadow: 'none',\n fontSize: '12px',\n fontWeight: 'normal',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '4px',\n flexShrink: 0,\n }\n return {\n ...base,\n ...styles?.actionButton,\n ...(isVertical && !showToolLabels\n ? {\n padding: '0',\n width: styles?.actionButton?.width ?? '30px',\n height: styles?.actionButton?.height ?? '30px',\n }\n : undefined),\n ...(enabled ? undefined : styles?.actionButtonDisabled),\n }\n}\n\nexport function getActionRowStyle(\n color: string,\n isVertical: boolean,\n showToolLabels: boolean,\n unstyled: boolean,\n styles?: LeafletTualStyles,\n extraStyle?: React.CSSProperties,\n): React.CSSProperties {\n const base: React.CSSProperties = unstyled\n ? {}\n : isVertical && showToolLabels\n ? {\n display: 'grid',\n gridTemplateColumns: '20px 1fr auto',\n alignItems: 'center',\n columnGap: '10px',\n padding: '8px 12px',\n textAlign: 'left',\n width: '100%',\n height: 'auto',\n borderRadius: '2px',\n border: '1px solid #767676',\n boxSizing: 'border-box',\n backgroundColor: '#efefef',\n color,\n cursor: 'pointer',\n fontSize: '12px',\n fontWeight: 'normal',\n whiteSpace: 'nowrap',\n boxShadow: 'none',\n flexShrink: 0,\n }\n : {\n padding: isVertical ? '0' : showToolLabels ? '2px 6px' : '3px 6px',\n width: isVertical ? '30px' : 'auto',\n height: isVertical ? '30px' : 'auto',\n borderRadius: '2px',\n border: '1px solid #767676',\n boxSizing: 'border-box',\n backgroundColor: '#efefef',\n color,\n cursor: 'pointer',\n fontSize: '12px',\n fontWeight: 'normal',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '4px',\n boxShadow: 'none',\n flexShrink: 0,\n }\n return {\n ...base,\n ...extraStyle,\n ...styles?.actionButton,\n ...(isVertical && !showToolLabels\n ? {\n padding: '0',\n width: styles?.actionButton?.width ?? '30px',\n height: styles?.actionButton?.height ?? '30px',\n }\n : undefined),\n }\n}\n\n","import type React from 'react'\nimport type {\n TualIcons,\n TualItem,\n TualLabels,\n LeafletTualClassNames,\n LeafletTualStyles,\n ToolbarOrientation,\n} from '../../types/index.js'\nimport { DEFAULT_ICONS } from './icons.js'\nimport { getActionRowStyle, getHistoryBtnStyle } from './action-buttons-styles.js'\n\nexport interface ActionButtonsProps {\n readOnly: boolean\n showHistoryControls: boolean\n showDeleteButton: boolean\n showClearButton: boolean\n showToolLabels?: boolean\n selectedItem: TualItem | null | undefined\n itemsCount: number\n canUndo: boolean\n canRedo: boolean\n undo: () => void\n redo: () => void\n deleteSelected: () => void\n clearAll: () => void\n orientation?: ToolbarOrientation\n labels?: TualLabels\n icons?: TualIcons\n unstyled?: boolean\n classNames?: LeafletTualClassNames\n styles?: LeafletTualStyles\n}\n\nexport function ActionButtons({\n readOnly,\n showHistoryControls,\n showDeleteButton,\n showClearButton,\n showToolLabels = true,\n selectedItem,\n itemsCount,\n canUndo,\n canRedo,\n undo,\n redo,\n deleteSelected,\n clearAll,\n orientation = 'horizontal',\n labels,\n icons,\n unstyled,\n classNames,\n styles,\n}: ActionButtonsProps) {\n const isVertical = orientation === 'vertical'\n\n const showDivider =\n showHistoryControls ||\n (!readOnly && showDeleteButton && selectedItem) ||\n (!readOnly && showClearButton && itemsCount > 0)\n\n if (!showDivider) return null\n\n const renderActionContent = (icon: React.ReactNode, label: string) =>\n isVertical && showToolLabels ? (\n <>\n <span style={{ display: 'inline-flex', alignItems: 'center', justifyContent: 'center', width: '20px' }}>\n {icon}\n </span>\n <span style={{ whiteSpace: 'nowrap' }}>{label}</span>\n <span />\n </>\n ) : (\n <>\n {icon}\n {showToolLabels && <span>{label}</span>}\n </>\n )\n\n const getHistoryBtnClass = (enabled: boolean) => [\n 'rlc-action-btn',\n !enabled ? 'rlc-action-btn-disabled' : undefined,\n classNames?.actionButton,\n !enabled ? classNames?.actionButtonDisabled : undefined,\n ].filter(Boolean).join(' ')\n\n const undoBtn = (\n <button\n key=\"undo\"\n type=\"button\"\n title={labels?.undo ?? 'Undo'}\n aria-label={labels?.undo ?? 'Undo'}\n disabled={!canUndo}\n className={getHistoryBtnClass(canUndo)}\n onClick={undo}\n style={getHistoryBtnStyle(canUndo, isVertical, showToolLabels, Boolean(unstyled), styles)}\n >\n {icons?.undo ?? DEFAULT_ICONS.undo}\n </button>\n )\n\n const redoBtn = (\n <button\n key=\"redo\"\n type=\"button\"\n title={labels?.redo ?? 'Redo'}\n aria-label={labels?.redo ?? 'Redo'}\n disabled={!canRedo}\n className={getHistoryBtnClass(canRedo)}\n onClick={redo}\n style={getHistoryBtnStyle(canRedo, isVertical, showToolLabels, Boolean(unstyled), styles)}\n >\n {icons?.redo ?? DEFAULT_ICONS.redo}\n </button>\n )\n\n return (\n <>\n <div\n className={['rlc-toolbar-divider', classNames?.toolbarDivider].filter(Boolean).join(' ')}\n style={{\n ...(unstyled\n ? {}\n : isVertical\n ? { width: showToolLabels ? '100%' : '18px', height: '1px', backgroundColor: '#767676', margin: showToolLabels ? '3px 0' : '3px auto' }\n : { width: '1px', height: '18px', backgroundColor: '#767676', margin: '0 3px' }),\n ...styles?.toolbarDivider,\n }}\n />\n\n {showHistoryControls &&\n (isVertical ? (\n <div\n style={{\n display: 'flex',\n flexDirection: showToolLabels ? 'row' : 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '4px',\n width: showToolLabels ? '100%' : 'auto',\n }}\n >\n {undoBtn}\n {redoBtn}\n </div>\n ) : (\n <>\n {undoBtn}\n {redoBtn}\n </>\n ))}\n\n {!readOnly && showDeleteButton && selectedItem && (\n <button\n type=\"button\"\n title={labels?.delete ?? 'Delete selected item (Del)'}\n aria-label={labels?.delete ?? 'Delete selected item'}\n className={['rlc-action-btn', 'rlc-delete-btn', classNames?.actionButton, classNames?.deleteButton].filter(Boolean).join(' ')}\n onClick={deleteSelected}\n style={getActionRowStyle('#b91c1c', isVertical, showToolLabels, Boolean(unstyled), styles, styles?.deleteButton)}\n >\n {renderActionContent(icons?.delete ?? DEFAULT_ICONS.delete, labels?.delete ?? 'Delete')}\n </button>\n )}\n\n {!readOnly && showClearButton && itemsCount > 0 && (\n <button\n type=\"button\"\n title={labels?.clear ?? 'Clear all annotations'}\n aria-label={labels?.clear ?? 'Clear all annotations'}\n className={['rlc-action-btn', classNames?.actionButton].filter(Boolean).join(' ')}\n onClick={clearAll}\n style={getActionRowStyle('#000000', isVertical, showToolLabels, Boolean(unstyled), styles)}\n >\n {renderActionContent(icons?.clear ?? DEFAULT_ICONS.clear, labels?.clear ?? 'Clear')}\n </button>\n )}\n </>\n )\n}\n","import React from 'react'\nimport type {\n TualIcons,\n TualLabels,\n TualTool,\n CustomToolbarItem,\n LeafletTualController,\n ShapeKind,\n ToolbarOrientation,\n ToolbarPosition,\n ToolbarToolGroupId,\n} from '../../types/index.js'\nimport { DEFAULT_ICONS } from './icons.js'\nimport type { ArrowOption, ArrowToolId, ShapeOption } from './types.js'\nimport { ArrowDropdown } from './ArrowDropdown.js'\nimport { ShapesModal } from './ShapesModal.js'\n\nexport interface ToolbarToolButtonsProps {\n controller: LeafletTualController\n readOnly: boolean\n position: ToolbarPosition\n orientation: ToolbarOrientation\n isVertical: boolean\n showToolLabels: boolean\n enabledTools: readonly ToolbarToolGroupId[]\n customTools?: readonly CustomToolbarItem[]\n labels?: TualLabels\n icons?: TualIcons\n unstyled: boolean\n classNames?: any\n styles?: any\n arrowOptions: readonly ArrowOption[]\n shapeOptions: readonly ShapeOption[]\n arrowGroupLabel: string\n currentArrowIcon: React.ReactNode\n shapesGroupLabel: string\n currentShapeIcon: React.ReactNode\n isArrowToolActive: boolean\n isShapeToolActive: boolean\n arrowDropdownOpen: boolean\n shapesModalOpen: boolean\n arrowGroupRef: React.RefObject<HTMLDivElement | null>\n shapesGroupRef: React.RefObject<HTMLDivElement | null>\n setArrowDropdownOpen: React.Dispatch<React.SetStateAction<boolean>>\n setShapesModalOpen: React.Dispatch<React.SetStateAction<boolean>>\n getButtonClassName: (isActive: boolean) => string\n getButtonStyle: (isActive: boolean) => React.CSSProperties\n}\n\nexport function ToolbarToolButtons(props: ToolbarToolButtonsProps) {\n const {\n controller,\n readOnly,\n position,\n orientation,\n isVertical,\n showToolLabels,\n enabledTools,\n customTools,\n labels,\n icons,\n unstyled,\n classNames,\n styles,\n arrowOptions,\n shapeOptions,\n arrowGroupLabel,\n currentArrowIcon,\n shapesGroupLabel,\n currentShapeIcon,\n isArrowToolActive,\n isShapeToolActive,\n arrowDropdownOpen,\n shapesModalOpen,\n arrowGroupRef,\n shapesGroupRef,\n setArrowDropdownOpen,\n setShapesModalOpen,\n getButtonClassName,\n getButtonStyle,\n } = props\n\n const { activeTool, setActiveTool, activeShape, setActiveShape } = controller\n\n const renderToolButtonInner = (icon: React.ReactNode, label: string) =>\n isVertical && showToolLabels ? (\n <>\n <span style={{ display: 'inline-flex', alignItems: 'center', justifyContent: 'center', width: '20px' }}>{icon}</span>\n <span style={{ whiteSpace: 'nowrap' }}>{label}</span>\n <span />\n </>\n ) : (\n <>\n {icon}\n {showToolLabels && <span>{label}</span>}\n </>\n )\n\n const renderSimpleToolBtn = (tool: TualTool, label: string, shortcut: string, icon: React.ReactNode, allowInReadOnly = false) => {\n const isActive = activeTool === tool\n return (\n <button\n key={tool}\n type=\"button\"\n disabled={!allowInReadOnly && readOnly}\n aria-disabled={!allowInReadOnly && readOnly ? true : undefined}\n aria-pressed={isActive}\n data-tool={tool}\n data-active={isActive || undefined}\n title={`${label} (${shortcut})`}\n className={getButtonClassName(isActive)}\n onClick={() => {\n if (!allowInReadOnly && readOnly) return\n setActiveTool(tool)\n setArrowDropdownOpen(false)\n setShapesModalOpen(false)\n }}\n style={getButtonStyle(isActive)}\n >\n {renderToolButtonInner(icon, label)}\n </button>\n )\n }\n\n return (\n <>\n {enabledTools.map((groupId) => {\n if (groupId === 'select') return renderSimpleToolBtn('select', labels?.select ?? 'Select', 'V', icons?.select ?? DEFAULT_ICONS.select, true)\n if (groupId === 'freedraw') return renderSimpleToolBtn('freedraw', labels?.freedraw ?? 'Free Draw', 'P', icons?.freedraw ?? DEFAULT_ICONS.freedraw)\n if (groupId === 'ruler') return renderSimpleToolBtn('ruler', labels?.ruler ?? 'Ruler', 'R', icons?.ruler ?? DEFAULT_ICONS.ruler)\n if (groupId === 'note') return renderSimpleToolBtn('note', labels?.note ?? 'Note Card', 'N', icons?.note ?? DEFAULT_ICONS.note)\n if (groupId === 'text') return renderSimpleToolBtn('text', labels?.text ?? 'Normal Text', 'T', icons?.text ?? DEFAULT_ICONS.text)\n\n if (groupId === 'arrow') {\n return (\n <ArrowDropdown\n key=\"arrow\"\n isOpen={arrowDropdownOpen}\n readOnly={readOnly}\n isArrowToolActive={isArrowToolActive}\n activeTool={activeTool}\n arrowOptions={arrowOptions}\n arrowGroupLabel={arrowGroupLabel}\n currentArrowIcon={currentArrowIcon}\n showToolLabels={showToolLabels}\n labels={labels}\n icons={icons}\n unstyled={unstyled}\n classNames={classNames}\n styles={styles}\n position={position}\n orientation={orientation}\n arrowGroupRef={arrowGroupRef}\n getButtonClassName={getButtonClassName}\n getButtonStyle={getButtonStyle}\n onToggle={() => { if (!readOnly) { setShapesModalOpen(false); setArrowDropdownOpen((o) => !o) } }}\n onSelectOption={(id: ArrowToolId) => { setActiveTool(id); setArrowDropdownOpen(false) }}\n />\n )\n }\n\n if (groupId === 'shape') {\n return (\n <ShapesModal\n key=\"shape\"\n isOpen={shapesModalOpen}\n readOnly={readOnly}\n isShapeToolActive={isShapeToolActive}\n activeShape={activeShape}\n shapeOptions={shapeOptions}\n shapesGroupLabel={shapesGroupLabel}\n currentShapeIcon={currentShapeIcon}\n showToolLabels={showToolLabels}\n labels={labels}\n icons={icons}\n unstyled={unstyled}\n classNames={classNames}\n styles={styles}\n position={position}\n orientation={orientation}\n shapesGroupRef={shapesGroupRef}\n getButtonClassName={getButtonClassName}\n getButtonStyle={getButtonStyle}\n onToggle={() => { if (!readOnly) { setArrowDropdownOpen(false); setShapesModalOpen((o) => !o) } }}\n onSelectShape={(kind: ShapeKind) => { setActiveShape(kind); setActiveTool('shape'); setShapesModalOpen(false) }}\n />\n )\n }\n return null\n })}\n\n {customTools?.map((custom) => {\n if (custom.render) return <React.Fragment key={custom.id}>{custom.render(controller)}</React.Fragment>\n const isActive = Boolean(custom.isActive)\n return (\n <button key={custom.id} type=\"button\" disabled={custom.disabled} aria-pressed={isActive} title={custom.title ?? custom.label} className={getButtonClassName(isActive)} onClick={() => custom.onClick?.(controller)} style={getButtonStyle(isActive)}>\n {renderToolButtonInner(custom.icon, custom.label ?? '')}\n </button>\n )\n })}\n </>\n )\n}\n\n","import React from 'react'\nimport type {\n TualIcons,\n TualLabels,\n LeafletTualClassNames,\n LeafletTualStyles,\n ToolbarOrientation,\n ToolbarPosition,\n} from '../../types/index.js'\nimport { DEFAULT_ICONS } from './icons.js'\nimport type { ArrowOption, ArrowToolId } from './types.js'\nimport { getDropdownChevronRotation } from './utils.js'\nimport { getPopupPlacementStyle } from './toolbar-helpers.js'\n\nexport interface ArrowDropdownProps {\n isOpen: boolean\n readOnly: boolean\n isArrowToolActive: boolean\n activeTool: string\n arrowOptions: readonly ArrowOption[]\n arrowGroupLabel: string\n currentArrowIcon: React.ReactNode\n showToolLabels?: boolean\n labels?: TualLabels\n icons?: TualIcons\n unstyled?: boolean\n classNames?: LeafletTualClassNames\n styles?: LeafletTualStyles\n position?: ToolbarPosition\n orientation?: ToolbarOrientation\n arrowGroupRef: React.RefObject<HTMLDivElement | null>\n getButtonClassName: (isActive: boolean) => string\n getButtonStyle: (isActive: boolean) => React.CSSProperties\n onToggle: () => void\n onSelectOption: (id: ArrowToolId) => void\n}\n\nexport function ArrowDropdown({\n isOpen,\n readOnly,\n isArrowToolActive,\n activeTool,\n arrowOptions,\n arrowGroupLabel,\n currentArrowIcon,\n showToolLabels,\n icons,\n unstyled,\n classNames,\n styles,\n position = 'top-center',\n orientation = 'horizontal',\n arrowGroupRef,\n getButtonClassName,\n getButtonStyle,\n onToggle,\n onSelectOption,\n}: ArrowDropdownProps) {\n const [hoveredOption, setHoveredOption] = React.useState<string | null>(null)\n const isVertical = orientation === 'vertical'\n const popupPlacementStyle = getPopupPlacementStyle(position, orientation)\n const chevronRotation = getDropdownChevronRotation(isOpen, position, orientation)\n const chevronIcon = icons?.dropdownChevron ?? DEFAULT_ICONS.dropdownChevron\n\n return (\n <div\n ref={arrowGroupRef}\n className={['rlc-arrow-group', classNames?.arrowGroupWrapper].filter(Boolean).join(' ')}\n style={{\n position: 'relative',\n display: isVertical ? 'flex' : 'inline-flex',\n width: isVertical ? (showToolLabels ? '100%' : '30px') : 'auto',\n height: isVertical ? (showToolLabels ? 'auto' : '30px') : 'auto',\n alignItems: 'center',\n justifyContent: 'center',\n boxSizing: 'border-box',\n ...styles?.arrowGroupWrapper,\n }}\n >\n <button\n type=\"button\"\n disabled={readOnly}\n aria-disabled={readOnly || undefined}\n aria-pressed={isArrowToolActive}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n data-tool=\"arrow-group\"\n data-active={isArrowToolActive || undefined}\n title={`${arrowGroupLabel} — click to choose arrow type`}\n className={getButtonClassName(isArrowToolActive)}\n onClick={onToggle}\n style={getButtonStyle(isArrowToolActive)}\n >\n {isVertical && showToolLabels ? (\n <>\n <span style={{ display: 'inline-flex', alignItems: 'center', justifyContent: 'center', width: '20px' }}>\n {currentArrowIcon}\n </span>\n <span style={{ whiteSpace: 'nowrap' }}>{arrowGroupLabel}</span>\n <span style={{ display: 'inline-flex', alignItems: 'center', justifyContent: 'center', opacity: 0.9, transform: chevronRotation, transition: 'transform 0.15s ease' }}>\n {chevronIcon}\n </span>\n </>\n ) : (\n <>\n <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: showToolLabels ? '6px' : '0px',\n ...(isVertical && !showToolLabels ? { transform: 'translate(-1px, -1px)' } : undefined),\n }}\n >\n {currentArrowIcon}\n {showToolLabels && <span>{arrowGroupLabel}</span>}\n </span>\n <span\n aria-hidden=\"true\"\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n opacity: 0.85,\n ...(isVertical && !showToolLabels\n ? {\n position: 'absolute',\n right: '2px',\n bottom: '2px',\n width: '8px',\n height: '8px',\n lineHeight: 0,\n pointerEvents: 'none',\n }\n : { marginLeft: showToolLabels ? '6px' : '2px' }),\n transform: isVertical && !showToolLabels\n ? (isOpen ? 'rotate(180deg)' : 'rotate(0deg)')\n : chevronRotation,\n transition: 'transform 0.15s ease',\n }}\n >\n {isVertical && !showToolLabels && React.isValidElement(chevronIcon)\n ? React.cloneElement(chevronIcon as React.ReactElement<any>, {\n width: '100%',\n height: '100%',\n style: {\n width: '100%',\n height: '100%',\n display: 'block',\n ...((chevronIcon as React.ReactElement<any>).props?.style ?? {}),\n },\n })\n : chevronIcon}\n </span>\n </>\n )}\n </button>\n\n {isOpen && (\n <div\n role=\"menu\"\n aria-label=\"Arrow type options\"\n className={['rlc-arrow-dropdown', classNames?.arrowDropdownMenu].filter(Boolean).join(' ')}\n style={{\n position: 'absolute',\n zIndex: 1020,\n ...popupPlacementStyle,\n ...(unstyled\n ? {}\n : {\n minWidth: '190px',\n display: 'flex',\n flexDirection: 'column',\n gap: '2px',\n padding: '4px',\n backgroundColor: '#f0f0f0',\n border: '1px solid #767676',\n borderRadius: '2px',\n boxShadow: '2px 2px 5px rgba(0, 0, 0, 0.25)',\n color: 'inherit',\n boxSizing: 'border-box',\n }),\n ...styles?.arrowDropdownMenu,\n }}\n >\n {arrowOptions.map((option) => {\n const isOptionActive = activeTool === option.id\n const isHovered = hoveredOption === option.id\n return (\n <button\n key={option.id}\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={isOptionActive}\n data-tool={option.id}\n data-active={isOptionActive || undefined}\n className={[\n 'rlc-arrow-dropdown-item',\n classNames?.arrowDropdownItem,\n isOptionActive ? classNames?.arrowDropdownItemActive : undefined,\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => onSelectOption(option.id)}\n onPointerEnter={() => setHoveredOption(option.id)}\n onPointerLeave={() => setHoveredOption(null)}\n style={{\n ...(unstyled\n ? {}\n : {\n display: 'grid',\n gridTemplateColumns: '20px 1fr auto',\n alignItems: 'center',\n columnGap: '10px',\n width: '100%',\n padding: '6px 10px',\n borderRadius: '2px',\n border: isOptionActive ? '1px solid #4f4f4f' : '1px solid #767676',\n boxSizing: 'border-box',\n backgroundColor: isOptionActive ? '#e0e0e0' : isHovered ? '#e8e8e8' : '#efefef',\n color: 'inherit',\n fontSize: '12px',\n fontWeight: 'normal',\n cursor: 'pointer',\n textAlign: 'left',\n boxShadow: isOptionActive ? 'inset 1px 1px 2px rgba(0, 0, 0, 0.2)' : 'none',\n }),\n ...styles?.arrowDropdownItem,\n ...(isOptionActive ? styles?.arrowDropdownItemActive : undefined),\n }}\n >\n <span style={{ display: 'inline-flex', alignItems: 'center', justifyContent: 'center', width: '20px' }}>\n {option.icon}\n </span>\n <span style={{ whiteSpace: 'nowrap' }}>{option.label}</span>\n <span style={{ fontSize: '11px', opacity: isOptionActive ? 0.9 : 0.65, fontWeight: 500 }}>\n {option.shortcut}\n </span>\n </button>\n )\n })}\n </div>\n )}\n </div>\n )\n}\n","import React from 'react'\nimport type {\n TualIcons,\n TualLabels,\n LeafletTualClassNames,\n LeafletTualStyles,\n ShapeKind,\n ToolbarOrientation,\n ToolbarPosition,\n} from '../../types/index.js'\nimport { DEFAULT_ICONS } from './icons.js'\nimport type { ShapeOption } from './types.js'\nimport { getDropdownChevronRotation } from './utils.js'\nimport { getPopupPlacementStyle } from './toolbar-helpers.js'\nimport { ShapesModalGrid } from './ShapesModalGrid.js'\n\nexport interface ShapesModalProps {\n isOpen: boolean\n readOnly: boolean\n isShapeToolActive: boolean\n activeShape: ShapeKind\n shapeOptions: readonly ShapeOption[]\n shapesGroupLabel: string\n currentShapeIcon: React.ReactNode\n showToolLabels?: boolean\n labels?: TualLabels\n icons?: TualIcons\n unstyled?: boolean\n classNames?: LeafletTualClassNames\n styles?: LeafletTualStyles\n position?: ToolbarPosition\n orientation?: ToolbarOrientation\n shapesGroupRef: React.RefObject<HTMLDivElement | null>\n getButtonClassName: (isActive: boolean) => string\n getButtonStyle: (isActive: boolean) => React.CSSProperties\n onToggle: () => void\n onSelectShape: (kind: ShapeKind) => void\n}\n\nexport function ShapesModal({\n isOpen,\n readOnly,\n isShapeToolActive,\n activeShape,\n shapeOptions,\n shapesGroupLabel,\n currentShapeIcon,\n showToolLabels,\n labels,\n icons,\n unstyled,\n classNames,\n styles,\n position = 'top-center',\n orientation = 'horizontal',\n shapesGroupRef,\n getButtonClassName,\n getButtonStyle,\n onToggle,\n onSelectShape,\n}: ShapesModalProps) {\n const isVertical = orientation === 'vertical'\n const popupPlacementStyle = getPopupPlacementStyle(position, orientation)\n const chevronRotation = getDropdownChevronRotation(isOpen, position, orientation)\n const chevronIcon = icons?.dropdownChevron ?? DEFAULT_ICONS.dropdownChevron\n\n return (\n <div\n ref={shapesGroupRef}\n className={['rlc-shapes-group', classNames?.shapesGroupWrapper].filter(Boolean).join(' ')}\n style={{\n position: 'relative',\n display: isVertical ? 'flex' : 'inline-flex',\n width: isVertical ? (showToolLabels ? '100%' : '30px') : 'auto',\n height: isVertical ? (showToolLabels ? 'auto' : '30px') : 'auto',\n alignItems: 'center',\n justifyContent: 'center',\n boxSizing: 'border-box',\n ...styles?.shapesGroupWrapper,\n }}\n >\n <button\n type=\"button\"\n disabled={readOnly}\n aria-disabled={readOnly || undefined}\n aria-pressed={isShapeToolActive}\n aria-haspopup=\"dialog\"\n aria-expanded={isOpen}\n data-tool=\"shape-group\"\n data-active={isShapeToolActive || undefined}\n title={`${shapesGroupLabel} — open shapes modal`}\n className={getButtonClassName(isShapeToolActive)}\n onClick={onToggle}\n style={getButtonStyle(isShapeToolActive)}\n >\n {isVertical && showToolLabels ? (\n <>\n <span style={{ display: 'inline-flex', alignItems: 'center', justifyContent: 'center', width: '20px' }}>\n {currentShapeIcon}\n </span>\n <span style={{ whiteSpace: 'nowrap' }}>{shapesGroupLabel}</span>\n <span style={{ display: 'inline-flex', alignItems: 'center', justifyContent: 'center', opacity: 0.9, transform: chevronRotation, transition: 'transform 0.15s ease' }}>\n {chevronIcon}\n </span>\n </>\n ) : (\n <>\n <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: showToolLabels ? '6px' : '0px',\n ...(isVertical && !showToolLabels ? { transform: 'translate(-1px, -1px)' } : undefined),\n }}\n >\n {currentShapeIcon}\n {showToolLabels && <span>{shapesGroupLabel}</span>}\n </span>\n <span\n aria-hidden=\"true\"\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n opacity: 0.85,\n ...(isVertical && !showToolLabels\n ? {\n position: 'absolute',\n right: '2px',\n bottom: '2px',\n width: '8px',\n height: '8px',\n lineHeight: 0,\n pointerEvents: 'none',\n }\n : { marginLeft: showToolLabels ? '6px' : '2px' }),\n transform: isVertical && !showToolLabels\n ? (isOpen ? 'rotate(180deg)' : 'rotate(0deg)')\n : chevronRotation,\n transition: 'transform 0.15s ease',\n }}\n >\n {isVertical && !showToolLabels && React.isValidElement(chevronIcon)\n ? React.cloneElement(chevronIcon as React.ReactElement<any>, {\n width: '100%',\n height: '100%',\n style: {\n width: '100%',\n height: '100%',\n display: 'block',\n ...((chevronIcon as React.ReactElement<any>).props?.style ?? {}),\n },\n })\n : chevronIcon}\n </span>\n </>\n )}\n </button>\n\n {isOpen && (\n <div\n role=\"dialog\"\n aria-label={labels?.shapesModalTitle ?? 'Select a Shape'}\n className={['rlc-shapes-modal', classNames?.shapesModal].filter(Boolean).join(' ')}\n onKeyDown={(e) => {\n if (e.key === 'Escape') {\n e.stopPropagation()\n onToggle()\n }\n }}\n style={{\n position: 'absolute',\n zIndex: 1020,\n ...popupPlacementStyle,\n ...(unstyled\n ? {}\n : {\n width: '240px',\n maxWidth: 'calc(100vw - 24px)',\n maxHeight: 'calc(100vh - 80px)',\n overflowY: 'auto',\n overflowX: 'hidden',\n padding: '4px',\n backgroundColor: '#f0f0f0',\n border: '1px solid #767676',\n borderRadius: '2px',\n boxShadow: '2px 2px 5px rgba(0, 0, 0, 0.25)',\n color: 'inherit',\n boxSizing: 'border-box',\n }),\n ...styles?.shapesModal,\n }}\n >\n {labels?.shapesModalTitle && (\n <div\n className={['rlc-shapes-modal-header', classNames?.shapesModalHeader].filter(Boolean).join(' ')}\n style={{\n ...(unstyled\n ? {}\n : {\n padding: '2px 4px 4px',\n fontSize: '11px',\n fontWeight: 600,\n letterSpacing: '0.04em',\n color: '#000000',\n textTransform: 'uppercase',\n borderBottom: '1px solid #767676',\n marginBottom: '4px',\n }),\n ...styles?.shapesModalHeader,\n }}\n >\n {labels.shapesModalTitle}\n </div>\n )}\n\n <ShapesModalGrid\n shapeOptions={shapeOptions}\n activeShape={activeShape}\n isShapeToolActive={isShapeToolActive}\n unstyled={unstyled}\n classNames={classNames}\n styles={styles}\n onSelectShape={onSelectShape}\n />\n </div>\n )}\n </div>\n )\n}\n","import React from 'react'\nimport type {\n LeafletTualClassNames,\n LeafletTualStyles,\n ShapeKind,\n} from '../../types/index.js'\nimport type { ShapeOption } from './types.js'\n\nexport interface ShapesModalGridProps {\n shapeOptions: readonly ShapeOption[]\n activeShape: ShapeKind\n isShapeToolActive: boolean\n unstyled?: boolean\n classNames?: LeafletTualClassNames\n styles?: LeafletTualStyles\n onSelectShape: (kind: ShapeKind) => void\n}\n\nexport function ShapesModalGrid({\n shapeOptions,\n activeShape,\n isShapeToolActive,\n unstyled,\n classNames,\n styles,\n onSelectShape,\n}: ShapesModalGridProps) {\n const [hoveredKind, setHoveredKind] = React.useState<string | null>(null)\n\n return (\n <div\n className={['rlc-shapes-modal-grid', classNames?.shapesModalGrid].filter(Boolean).join(' ')}\n style={{\n ...(unstyled\n ? {}\n : {\n display: 'grid',\n gridTemplateColumns: 'repeat(2, minmax(0, 1fr))',\n gap: '4px',\n width: '100%',\n boxSizing: 'border-box',\n }),\n ...styles?.shapesModalGrid,\n }}\n >\n {shapeOptions.map((shapeOpt) => {\n const isSelectedShape = isShapeToolActive && activeShape === shapeOpt.kind\n const isHovered = hoveredKind === shapeOpt.kind\n return (\n <button\n key={shapeOpt.kind}\n type=\"button\"\n data-shape={shapeOpt.kind}\n data-active={isSelectedShape || undefined}\n className={[\n 'rlc-shapes-modal-item',\n classNames?.shapesModalItem,\n isSelectedShape ? classNames?.shapesModalItemActive : undefined,\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => onSelectShape(shapeOpt.kind)}\n onPointerEnter={() => setHoveredKind(shapeOpt.kind)}\n onPointerLeave={() => setHoveredKind(null)}\n style={{\n ...(unstyled\n ? {}\n : {\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n gap: '8px',\n width: '100%',\n minWidth: 0,\n padding: '6px 8px',\n borderRadius: '2px',\n border: isSelectedShape ? '1px solid #4f4f4f' : '1px solid #767676',\n boxSizing: 'border-box',\n backgroundColor: isSelectedShape ? '#e0e0e0' : isHovered ? '#e8e8e8' : '#efefef',\n color: '#000000',\n fontSize: '12px',\n fontWeight: isSelectedShape ? 600 : 'normal',\n cursor: 'pointer',\n textAlign: 'left',\n transition: 'background-color 0.1s ease',\n boxShadow: isSelectedShape ? 'inset 1px 1px 2px rgba(0, 0, 0, 0.2)' : 'none',\n }),\n ...styles?.shapesModalItem,\n ...(isSelectedShape ? styles?.shapesModalItemActive : undefined),\n }}\n >\n <span style={{ display: 'inline-flex', alignItems: 'center', justifyContent: 'center', flexShrink: 0, width: '18px', height: '18px' }}>\n {shapeOpt.icon}\n </span>\n <span style={{ flex: 1, minWidth: 0, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', textAlign: 'left' }}>\n {shapeOpt.label}\n </span>\n </button>\n )\n })}\n </div>\n )\n}\n\n","import type React from 'react'\nimport type {\n TualIcons,\n TualLabels,\n CustomToolbarItem,\n LeafletTualClassNames,\n LeafletTualController,\n LeafletTualStyles,\n ToolbarOrientation,\n ToolbarPosition,\n ToolbarToolGroupId,\n} from '../../types/index.js'\nimport type { ArrowOption, ShapeOption } from './types.js'\nimport { ActionButtons } from './ActionButtons.js'\nimport { CollapseTriggerButton } from './CollapseButtons.js'\nimport { ToolbarToolButtons } from './ToolbarToolButtons.js'\n\nexport interface PrimaryToolbarStripProps {\n controller: LeafletTualController\n readOnly: boolean\n position: ToolbarPosition\n orientation: ToolbarOrientation\n isVertical: boolean\n showToolLabels: boolean\n collapsible: boolean\n showCollapseButton: boolean\n enabledTools: readonly ToolbarToolGroupId[]\n customTools?: readonly CustomToolbarItem[]\n showHistoryControls: boolean\n showDeleteButton: boolean\n showClearButton: boolean\n labels?: TualLabels\n icons?: TualIcons\n unstyled: boolean\n classNames?: LeafletTualClassNames\n styles?: LeafletTualStyles\n arrowOptions: readonly ArrowOption[]\n shapeOptions: readonly ShapeOption[]\n arrowGroupLabel: string\n currentArrowIcon: React.ReactNode\n shapesGroupLabel: string\n currentShapeIcon: React.ReactNode\n isArrowToolActive: boolean\n isShapeToolActive: boolean\n arrowDropdownOpen: boolean\n shapesModalOpen: boolean\n arrowGroupRef: React.RefObject<HTMLDivElement | null>\n shapesGroupRef: React.RefObject<HTMLDivElement | null>\n setArrowDropdownOpen: React.Dispatch<React.SetStateAction<boolean>>\n setShapesModalOpen: React.Dispatch<React.SetStateAction<boolean>>\n getButtonClassName: (isActive: boolean) => string\n getButtonStyle: (isActive: boolean) => React.CSSProperties\n onCollapse: () => void\n}\n\nexport function PrimaryToolbarStrip(props: PrimaryToolbarStripProps) {\n const {\n controller,\n readOnly,\n position,\n orientation,\n isVertical,\n showToolLabels,\n collapsible,\n showCollapseButton,\n enabledTools,\n customTools,\n showHistoryControls,\n showDeleteButton,\n showClearButton,\n labels,\n icons,\n unstyled,\n classNames,\n styles,\n arrowOptions,\n shapeOptions,\n arrowGroupLabel,\n currentArrowIcon,\n shapesGroupLabel,\n currentShapeIcon,\n isArrowToolActive,\n isShapeToolActive,\n arrowDropdownOpen,\n shapesModalOpen,\n arrowGroupRef,\n shapesGroupRef,\n setArrowDropdownOpen,\n setShapesModalOpen,\n getButtonClassName,\n getButtonStyle,\n onCollapse,\n } = props\n\n return (\n <div\n role=\"toolbar\"\n aria-label=\"Map annotation tools\"\n className={['rlc-toolbar-primary', classNames?.toolbarPrimary].filter(Boolean).join(' ')}\n style={{\n ...(unstyled\n ? {}\n : {\n display: 'flex',\n flexDirection: isVertical ? 'column' : 'row',\n alignItems: isVertical && showToolLabels ? 'stretch' : 'center',\n gap: '3px',\n padding: '3px',\n boxSizing: 'border-box',\n minWidth: isVertical ? (showToolLabels ? 'auto' : '38px') : undefined,\n width: isVertical ? (showToolLabels ? 'auto' : '38px') : undefined,\n backgroundColor: '#f0f0f0',\n border: '1px solid #767676',\n borderRadius: '2px',\n boxShadow: '0 1px 3px rgba(0, 0, 0, 0.2)',\n color: '#000000',\n }),\n ...styles?.toolbarPrimary,\n }}\n >\n <ToolbarToolButtons\n controller={controller}\n readOnly={readOnly}\n position={position}\n orientation={orientation}\n isVertical={isVertical}\n showToolLabels={showToolLabels}\n enabledTools={enabledTools}\n customTools={customTools}\n labels={labels}\n icons={icons}\n unstyled={unstyled}\n classNames={classNames}\n styles={styles}\n arrowOptions={arrowOptions}\n shapeOptions={shapeOptions}\n arrowGroupLabel={arrowGroupLabel}\n currentArrowIcon={currentArrowIcon}\n shapesGroupLabel={shapesGroupLabel}\n currentShapeIcon={currentShapeIcon}\n isArrowToolActive={isArrowToolActive}\n isShapeToolActive={isShapeToolActive}\n arrowDropdownOpen={arrowDropdownOpen}\n shapesModalOpen={shapesModalOpen}\n arrowGroupRef={arrowGroupRef}\n shapesGroupRef={shapesGroupRef}\n setArrowDropdownOpen={setArrowDropdownOpen}\n setShapesModalOpen={setShapesModalOpen}\n getButtonClassName={getButtonClassName}\n getButtonStyle={getButtonStyle}\n />\n\n <ActionButtons\n readOnly={readOnly}\n showHistoryControls={showHistoryControls}\n showDeleteButton={showDeleteButton}\n showClearButton={showClearButton}\n showToolLabels={showToolLabels}\n selectedItem={controller.selectedItem}\n itemsCount={controller.items.length}\n canUndo={controller.canUndo}\n canRedo={controller.canRedo}\n undo={controller.undo}\n redo={controller.redo}\n deleteSelected={controller.deleteSelected}\n clearAll={controller.clearAll}\n orientation={orientation}\n labels={labels}\n icons={icons}\n unstyled={unstyled}\n classNames={classNames}\n styles={styles}\n />\n\n {collapsible && showCollapseButton && (\n <CollapseTriggerButton\n position={position}\n orientation={orientation}\n isVertical={isVertical}\n showToolLabels={showToolLabels}\n unstyled={unstyled}\n labels={labels}\n icons={icons}\n classNames={classNames}\n styles={styles}\n onCollapse={onCollapse}\n />\n )}\n </div>\n )\n}\n","import React, { useEffect, useRef } from 'react'\nimport type {\n ArrowItem,\n TualIcons,\n TualItem,\n TualLabels,\n LeafletTualClassNames,\n LeafletTualStyles,\n ShapeItem,\n TextItem,\n ToolbarOrientation,\n} from '../../types/index.js'\nimport {\n DEFAULT_FONT_SIZE_OPTIONS,\n DEFAULT_STROKE_WIDTH_OPTIONS,\n NOTE_COLOR_THEMES,\n} from '../../shared/constants.js'\nimport { DEFAULT_ICONS } from './icons.js'\nimport { PixelSelect } from './PixelSelect.js'\n\nexport interface ContextualSettingsBarProps {\n isArrowContext: boolean\n isFreeDrawContext: boolean\n isShapeContext: boolean\n isRulerContext?: boolean\n isTextContext: boolean\n isNoteContext: boolean\n selectedItem: TualItem | null | undefined\n selectedShape: ShapeItem | null\n selectedArrow: ArrowItem | null\n selectedText?: TextItem | null\n activeColor: string\n setActiveColor: (color: string) => void\n strokeWidth: number\n setStrokeWidth: (width: number) => void\n strokeWidthOptions?: readonly number[]\n dashed: boolean\n setDashed: (dashed: boolean) => void\n shapeFilled: boolean\n setShapeFilled: (filled: boolean) => void\n noteColor: string\n setNoteColor: (color: string) => void\n fontSize?: number\n setFontSize?: (size: number) => void\n fontSizeOptions?: readonly number[]\n fontWeight?: 'normal' | 'bold'\n setFontWeight?: (weight: 'normal' | 'bold') => void\n updateItem: (id: string, patch: any) => void\n notifyChangeComplete?: (targetItem?: TualItem | null) => void\n isEditingLabel?: boolean\n setEditingLabel?: (editing: boolean) => void\n strokeColors: readonly string[]\n orientation?: ToolbarOrientation\n labels?: TualLabels\n icons?: TualIcons\n unstyled?: boolean\n classNames?: LeafletTualClassNames\n styles?: LeafletTualStyles\n}\n\nexport function ContextualSettingsBar(props: ContextualSettingsBarProps) {\n const {\n isArrowContext,\n isFreeDrawContext,\n isShapeContext,\n isRulerContext,\n isTextContext,\n isNoteContext,\n selectedItem,\n selectedShape,\n selectedArrow,\n selectedText,\n activeColor,\n setActiveColor,\n strokeWidth,\n setStrokeWidth,\n strokeWidthOptions,\n dashed,\n setDashed,\n shapeFilled,\n setShapeFilled,\n noteColor,\n setNoteColor,\n fontSize,\n setFontSize,\n fontSizeOptions,\n fontWeight,\n setFontWeight,\n updateItem,\n notifyChangeComplete,\n isEditingLabel,\n setEditingLabel,\n strokeColors,\n orientation = 'horizontal',\n labels,\n icons,\n unstyled,\n classNames,\n styles,\n } = props\n const isVertical = orientation === 'vertical'\n\n const shapeInputRef = useRef<HTMLInputElement | null>(null)\n const arrowInputRef = useRef<HTMLInputElement | null>(null)\n const textInputRef = useRef<HTMLInputElement | null>(null)\n\n const hasShapeLabelMode = selectedShape\n ? selectedShape.labelMode !== false && (selectedShape as any).hasLabelMode !== false\n : false\n const hasArrowLabelMode = selectedArrow\n ? selectedArrow.labelMode !== false && (selectedArrow as any).hasLabelMode !== false\n : false\n\n useEffect(() => {\n if (isEditingLabel) {\n if (selectedShape && hasShapeLabelMode && shapeInputRef.current) {\n shapeInputRef.current.focus()\n shapeInputRef.current.select()\n } else if (selectedArrow && hasArrowLabelMode && arrowInputRef.current) {\n arrowInputRef.current.focus()\n arrowInputRef.current.select()\n }\n }\n }, [\n isEditingLabel,\n selectedShape?.id,\n selectedArrow?.id,\n hasShapeLabelMode,\n hasArrowLabelMode,\n ])\n\n const getToggleBtnStyle = (active: boolean, bold = false): React.CSSProperties => ({\n ...(unstyled ? {} : { padding: '2px 6px', borderRadius: '2px', border: active ? '1px solid #4f4f4f' : '1px solid #767676', backgroundColor: active ? '#e0e0e0' : '#efefef', color: '#000000', boxShadow: active ? 'inset 1px 1px 2px rgba(0, 0, 0, 0.2)' : 'none', fontSize: '12px', fontWeight: bold ? 700 : undefined, cursor: 'pointer' }),\n ...styles?.actionButton,\n ...(active ? styles?.toolButtonActive : undefined),\n })\n const getToggleBtnClass = (active: boolean) => ['rlc-action-btn', classNames?.actionButton, active ? classNames?.toolButtonActive : undefined].filter(Boolean).join(' ')\n const getInputStyle = (w = '105px'): React.CSSProperties => ({\n ...(unstyled ? {} : { minWidth: '100px', width: isVertical ? 'auto' : w, flex: isVertical ? '1 1 auto' : undefined, boxSizing: 'border-box', padding: '2px 4px', borderRadius: '2px', border: '1px solid #767676', backgroundColor: '#ffffff', color: '#000000', fontSize: '12px' }),\n ...styles?.toolbarInput,\n })\n const dividerEl = (\n <div\n className={['rlc-toolbar-divider', classNames?.toolbarDivider].filter(Boolean).join(' ')}\n style={{ ...(unstyled ? {} : isVertical ? { width: '100%', height: '1px', backgroundColor: '#767676' } : { width: '1px', height: '16px', backgroundColor: '#767676' }), ...styles?.toolbarDivider }}\n />\n )\n\n const isDashedActive = Boolean(\n selectedItem &&\n (selectedItem.type === 'arrow' ||\n selectedItem.type === 'freedraw' ||\n selectedItem.type === 'shape' ||\n selectedItem.type === 'ruler')\n ? selectedItem.dashed\n : dashed,\n )\n const isFilledActive = Boolean(selectedShape ? selectedShape.filled : shapeFilled)\n const isBold = Boolean(selectedText ? selectedText.fontWeight === 'bold' : (fontWeight ?? 'bold') === 'bold')\n\n return (\n <div\n className={['rlc-toolbar-secondary', classNames?.toolbarSecondary].filter(Boolean).join(' ')}\n style={{\n ...(unstyled ? {} : { display: 'flex', flexDirection: 'row', flexWrap: isVertical ? 'wrap' : 'nowrap', alignItems: 'center', gap: isVertical ? '5px' : '6px', padding: isVertical ? '6px 8px' : '3px 6px', width: isVertical ? '230px' : undefined, maxWidth: isVertical ? '230px' : 'min(92vw, 620px)', overflowX: isVertical ? 'visible' : 'auto', scrollbarWidth: 'none', boxSizing: 'border-box', backgroundColor: '#f0f0f0', border: '1px solid #767676', borderRadius: '2px', boxShadow: '0 1px 3px rgba(0, 0, 0, 0.2)', color: '#000000', fontSize: '12px' }),\n ...styles?.toolbarSecondary,\n }}\n >\n {(isArrowContext || isFreeDrawContext || isShapeContext || isRulerContext || isTextContext) && (\n <div style={{ display: 'flex', alignItems: 'center', gap: '4px', width: isVertical ? '100%' : undefined }}>\n <span style={{ fontSize: '12px', color: 'inherit' }}>{labels?.color ?? 'Color'}</span>\n {strokeColors.map((c) => {\n const selected = (selectedItem && selectedItem.type !== 'note' ? selectedItem.color : activeColor) === c\n return (\n <button\n key={c}\n type=\"button\"\n title={`${labels?.color ?? 'Color'} ${c}`}\n data-active={selected || undefined}\n className={['rlc-swatch-btn', classNames?.swatchButton, selected ? classNames?.swatchButtonActive : undefined].filter(Boolean).join(' ')}\n onClick={() => setActiveColor(c)}\n style={{ backgroundColor: c, ...(unstyled ? {} : { width: '16px', height: '16px', borderRadius: '999px', border: selected ? '2px solid #000000' : '1px solid #767676', boxShadow: selected ? '0 0 0 1px #000000' : 'none', cursor: 'pointer', padding: 0 }), ...styles?.swatchButton, ...(selected ? styles?.swatchButtonActive : undefined) }}\n />\n )\n })}\n </div>\n )}\n\n {(isArrowContext || isFreeDrawContext || isShapeContext || isRulerContext) && (\n <>\n {dividerEl}\n <PixelSelect label={labels?.width ?? 'Width'} control=\"stroke-width\" value={selectedItem && (selectedItem.type === 'arrow' || selectedItem.type === 'freedraw' || selectedItem.type === 'shape' || selectedItem.type === 'ruler') ? selectedItem.strokeWidth : strokeWidth} options={strokeWidthOptions ?? DEFAULT_STROKE_WIDTH_OPTIONS} onChange={setStrokeWidth} unstyled={unstyled} classNames={classNames} styles={styles} icons={icons} />\n <button type=\"button\" data-active={isDashedActive || undefined} className={getToggleBtnClass(isDashedActive)} onClick={() => setDashed(!isDashedActive)} style={getToggleBtnStyle(isDashedActive)}>\n {labels?.dashed ?? 'Dashed'}\n </button>\n </>\n )}\n\n {isShapeContext && (\n <>\n <button type=\"button\" data-active={isFilledActive || undefined} className={getToggleBtnClass(isFilledActive)} onClick={() => setShapeFilled(!isFilledActive)} style={getToggleBtnStyle(isFilledActive)}>\n {labels?.filled ?? 'Fill'}\n </button>\n {selectedShape && hasShapeLabelMode && (\n <input\n ref={shapeInputRef}\n type=\"text\"\n data-tual-shape-label-input={selectedShape.id}\n data-testid=\"shape-label-input\"\n data-label-mode=\"true\"\n data-editing-label={isEditingLabel ? 'true' : undefined}\n placeholder={labels?.shapeLabelPlaceholder ?? 'Shape label...'}\n value={selectedShape.label ?? ''}\n className={['rlc-toolbar-input', classNames?.toolbarInput].filter(Boolean).join(' ')}\n onChange={(e) => updateItem(selectedShape.id, { label: e.target.value })}\n onFocus={() => setEditingLabel?.(true)}\n onBlur={(e) => {\n const next = e.relatedTarget as HTMLElement | null\n if (\n next?.tagName === 'INPUT' ||\n next?.tagName === 'TEXTAREA' ||\n next?.closest('[data-tual-toolbar], [data-tual-inline-shape-label]')\n ) {\n return\n }\n setEditingLabel?.(false)\n notifyChangeComplete?.(selectedShape)\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === 'Escape') {\n e.preventDefault()\n setEditingLabel?.(false)\n e.currentTarget.blur()\n notifyChangeComplete?.(selectedShape)\n }\n }}\n style={getInputStyle()}\n />\n )}\n </>\n )}\n\n {selectedArrow && hasArrowLabelMode && (\n <input\n ref={arrowInputRef}\n type=\"text\"\n data-tual-arrow-label-input={selectedArrow.id}\n data-testid=\"arrow-label-input\"\n data-label-mode=\"true\"\n data-editing-label={isEditingLabel ? 'true' : undefined}\n placeholder={labels?.arrowLabelPlaceholder ?? 'Arrow label...'}\n value={selectedArrow.label ?? ''}\n className={['rlc-toolbar-input', classNames?.toolbarInput].filter(Boolean).join(' ')}\n onChange={(e) => updateItem(selectedArrow.id, { label: e.target.value })}\n onFocus={() => setEditingLabel?.(true)}\n onBlur={() => {\n setEditingLabel?.(false)\n notifyChangeComplete?.(selectedArrow)\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === 'Escape') {\n e.preventDefault()\n setEditingLabel?.(false)\n e.currentTarget.blur()\n notifyChangeComplete?.(selectedArrow)\n }\n }}\n style={getInputStyle()}\n />\n )}\n\n {isTextContext && (\n <>\n {dividerEl}\n <PixelSelect label={labels?.fontSize ?? 'Size'} control=\"font-size\" value={selectedText ? (selectedText.initialFontSize ?? fontSize ?? 16) : (fontSize ?? 16)} options={fontSizeOptions ?? DEFAULT_FONT_SIZE_OPTIONS} onChange={(val) => setFontSize?.(val)} unstyled={unstyled} classNames={classNames} styles={styles} icons={icons} />\n <button type=\"button\" data-active={isBold || undefined} title={labels?.textBold ?? 'Toggle bold'} aria-pressed={isBold} className={getToggleBtnClass(isBold)} onClick={() => setFontWeight?.(isBold ? 'normal' : 'bold')} style={getToggleBtnStyle(isBold, true)}>\n {icons?.textBold ?? DEFAULT_ICONS.textBold ?? labels?.textBold ?? 'B'}\n </button>\n {selectedText && (\n <input\n ref={textInputRef}\n type=\"text\"\n data-tual-text-input={selectedText.id}\n data-testid=\"text-input\"\n data-editing-label={isEditingLabel ? 'true' : undefined}\n placeholder={labels?.textPlaceholder ?? 'Text...'}\n value={selectedText.text ?? ''}\n className={['rlc-toolbar-input', classNames?.toolbarInput].filter(Boolean).join(' ')}\n onChange={(e) => updateItem(selectedText.id, { text: e.target.value })}\n onFocus={() => setEditingLabel?.(true)}\n onBlur={(e) => {\n const next = e.relatedTarget as HTMLElement | null\n if (\n next?.tagName === 'INPUT' ||\n next?.tagName === 'TEXTAREA' ||\n next?.closest('[data-tual-text], [data-tual-toolbar]')\n ) {\n return\n }\n setEditingLabel?.(false)\n notifyChangeComplete?.(selectedText)\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === 'Escape') {\n e.preventDefault()\n setEditingLabel?.(false)\n e.currentTarget.blur()\n notifyChangeComplete?.(selectedText)\n }\n }}\n style={getInputStyle('120px')}\n />\n )}\n </>\n )}\n\n {isNoteContext && (\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n <span style={{ opacity: 0.75, fontSize: '11px' }}>{labels?.noteTheme ?? 'Theme'}</span>\n {NOTE_COLOR_THEMES.map((theme) => {\n const selected = (selectedItem?.type === 'note' ? selectedItem.backgroundColor : noteColor) === theme.bg\n return (\n <button\n key={theme.name}\n type=\"button\"\n title={theme.name}\n data-active={selected || undefined}\n className={['rlc-swatch-btn', classNames?.swatchButton, selected ? classNames?.swatchButtonActive : undefined].filter(Boolean).join(' ')}\n onClick={() => setNoteColor(theme.bg)}\n style={{ backgroundColor: theme.header, ...(unstyled ? {} : { width: '18px', height: '18px', borderRadius: '999px', border: selected ? '2px solid #111827' : `1px solid ${theme.border}`, boxShadow: selected ? '0 0 0 1px #111827' : 'none', cursor: 'pointer', padding: 0 }), ...styles?.swatchButton, ...(selected ? styles?.swatchButtonActive : undefined) }}\n />\n )\n })}\n </div>\n )}\n </div>\n )\n}\n","import type {\n TualIcons,\n LeafletTualClassNames,\n LeafletTualStyles,\n} from '../../types/index.js'\nimport { DEFAULT_ICONS } from './icons.js'\n\nexport interface PixelSelectProps {\n /** Visible label and accessible name. */\n label: string\n /** Currently applied value in pixels. */\n value: number\n /** Preset pixel values. The current value is merged in if missing. */\n options: readonly number[]\n onChange: (value: number) => void\n /** Optional data attribute to distinguish multiple selects. */\n control?: string\n unstyled?: boolean\n classNames?: LeafletTualClassNames\n styles?: LeafletTualStyles\n icons?: TualIcons\n}\n\n/**\n * Labeled `<select>` listing pixel values (e.g. `1px`, `2px`, ...).\n * Styled via the `toolbarSelect` slot and `rlc-toolbar-select` class.\n */\nexport function PixelSelect({\n label,\n value,\n options,\n onChange,\n control,\n unstyled,\n classNames,\n styles,\n icons,\n}: PixelSelectProps) {\n const merged = Array.from(new Set([...options, value])).sort((a, b) => a - b)\n const chevronIcon = icons?.dropdownChevron ?? DEFAULT_ICONS.dropdownChevron\n\n return (\n <div style={{ display: 'flex', alignItems: 'center', gap: '4px' }}>\n <span style={{ fontSize: '12px', color: 'inherit' }}>{label}</span>\n <div style={{ position: 'relative', display: 'inline-flex', alignItems: 'center' }}>\n <select\n aria-label={label}\n data-control={control}\n value={value}\n onChange={(e) => onChange(Number(e.target.value))}\n className={['rlc-toolbar-select', classNames?.toolbarSelect]\n .filter(Boolean)\n .join(' ')}\n style={{\n ...(unstyled\n ? {}\n : {\n padding: '1px 16px 1px 4px',\n borderRadius: '2px',\n border: '1px solid #767676',\n backgroundColor: '#efefef',\n color: '#000000',\n fontSize: '12px',\n cursor: 'pointer',\n appearance: 'none',\n WebkitAppearance: 'none',\n }),\n ...styles?.toolbarSelect,\n }}\n >\n {merged.map((v) => (\n <option\n key={v}\n value={v}\n >\n {v}px\n </option>\n ))}\n </select>\n {!unstyled && (\n <span\n aria-hidden=\"true\"\n style={{\n position: 'absolute',\n right: '3px',\n top: '50%',\n transform: 'translateY(-50%)',\n pointerEvents: 'none',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n opacity: 0.7,\n color: 'currentColor',\n }}\n >\n {chevronIcon}\n </span>\n )}\n </div>\n </div>\n )\n}\n","import { useEffect, useRef, useState } from 'react'\nimport type { LeafletTualController } from '../../types/index.js'\nimport { isArrowTool } from './utils.js'\n\nexport function useToolbarContext(controller: LeafletTualController, readOnly: boolean) {\n const { activeTool, selectedItem } = controller\n const [arrowDropdownOpen, setArrowDropdownOpen] = useState(false)\n const [shapesModalOpen, setShapesModalOpen] = useState(false)\n const arrowGroupRef = useRef<HTMLDivElement | null>(null)\n const shapesGroupRef = useRef<HTMLDivElement | null>(null)\n\n useEffect(() => {\n if (!arrowDropdownOpen && !shapesModalOpen) return\n const handleOutsideClick = (e: PointerEvent) => {\n if (arrowDropdownOpen && arrowGroupRef.current && !arrowGroupRef.current.contains(e.target as Node)) {\n setArrowDropdownOpen(false)\n }\n if (shapesModalOpen && shapesGroupRef.current && !shapesGroupRef.current.contains(e.target as Node)) {\n setShapesModalOpen(false)\n }\n }\n window.addEventListener('pointerdown', handleOutsideClick)\n return () => window.removeEventListener('pointerdown', handleOutsideClick)\n }, [arrowDropdownOpen, shapesModalOpen])\n\n const isArrowToolActive = isArrowTool(activeTool)\n const isShapeToolActive = activeTool === 'shape'\n const isArrowContext = isArrowToolActive || selectedItem?.type === 'arrow'\n const isFreeDrawContext = activeTool === 'freedraw' || selectedItem?.type === 'freedraw'\n const isShapeContext = isShapeToolActive || selectedItem?.type === 'shape'\n const isRulerContext = activeTool === 'ruler' || selectedItem?.type === 'ruler'\n const isNoteContext = activeTool === 'note' || selectedItem?.type === 'note'\n const isTextContext = activeTool === 'text' || selectedItem?.type === 'text'\n\n const showSettingsBar =\n !readOnly &&\n !arrowDropdownOpen &&\n !shapesModalOpen &&\n (isArrowContext || isFreeDrawContext || isShapeContext || isRulerContext || isTextContext || isNoteContext)\n\n return {\n isArrowToolActive,\n isShapeToolActive,\n isArrowContext,\n isFreeDrawContext,\n isShapeContext,\n isRulerContext,\n isNoteContext,\n isTextContext,\n showSettingsBar,\n arrowDropdownOpen,\n setArrowDropdownOpen,\n shapesModalOpen,\n setShapesModalOpen,\n arrowGroupRef,\n shapesGroupRef,\n }\n}\n","'use client'\n\nimport { createPortal } from 'react-dom'\nimport { useMap } from 'react-leaflet'\nimport type L from 'leaflet'\nimport type { LeafletTualProps } from '../../types/index.js'\nimport { LeafletTualDom } from './LeafletTualDom.js'\nimport { useLeafletTualOverlay } from './use-leaflet-tual-overlay.js'\n\nfunction LeafletTualWithContext(props: Omit<LeafletTualProps, 'map'>) {\n const map = useMap()\n return <LeafletTualOverlay {...props} map={map} />\n}\n\nexport function LeafletTual(props: LeafletTualProps) {\n if (props.map !== undefined) {\n return <LeafletTualOverlay {...props} map={props.map} />\n }\n return <LeafletTualWithContext {...props} />\n}\n\nfunction LeafletTualOverlay(props: LeafletTualProps & { map: L.Map | null }) {\n const {\n map,\n toolbarPosition = 'top-center',\n toolbarOrientation,\n orientation: propOrientation,\n collapsible,\n defaultCollapsed,\n collapsed,\n onCollapsedChange,\n showCollapseButton,\n enabledTools,\n customTools,\n showHistoryControls,\n showDeleteButton,\n showClearButton,\n showToolLabels,\n labels,\n icons,\n zIndex = 650,\n unstyled = false,\n classNames,\n styles,\n strokeColors,\n strokeWidthOptions,\n fontSizeOptions,\n renderToolbar,\n renderNote,\n renderText,\n clampOverlaysToViewport = true,\n autoMinimizeNotesZoom,\n autoMinimizeTextZoom,\n className,\n style,\n } = props\n\n const overlayState = useLeafletTualOverlay(props)\n\n if (!map) return null\n\n return createPortal(\n <LeafletTualDom\n map={map}\n canvasRef={overlayState.canvasRef}\n viewport={overlayState.viewport}\n isReadOnly={overlayState.isReadOnly}\n isDrawingTool={overlayState.isDrawingTool}\n activeTool={overlayState.controller.activeTool}\n hoverCursor={overlayState.hoverCursor}\n zIndex={zIndex}\n className={className}\n style={style}\n classNames={classNames}\n styles={styles}\n handleInteractionPointerDown={overlayState.handleInteractionPointerDown}\n handleInteractionPointerMove={overlayState.handleInteractionPointerMove}\n noteItems={overlayState.noteItems}\n textItems={overlayState.textItems}\n selectedId={overlayState.selectedId}\n labels={labels}\n icons={icons}\n unstyled={unstyled}\n clampOverlaysToViewport={clampOverlaysToViewport}\n autoMinimizeNotesZoom={autoMinimizeNotesZoom}\n autoMinimizeTextZoom={autoMinimizeTextZoom}\n renderNote={renderNote}\n renderText={renderText}\n setSelectedId={overlayState.setSelectedId}\n updateItem={overlayState.updateItem}\n removeItem={overlayState.removeItem}\n notifyChangeComplete={overlayState.notifyChangeComplete}\n renderToolbar={renderToolbar}\n showToolbar={overlayState.showToolbar}\n controller={overlayState.controller}\n toolbarPosition={toolbarPosition}\n toolbarOrientation={toolbarOrientation ?? propOrientation}\n collapsible={collapsible}\n defaultCollapsed={defaultCollapsed}\n collapsed={collapsed}\n onCollapsedChange={onCollapsedChange}\n showCollapseButton={showCollapseButton}\n enabledTools={enabledTools}\n customTools={customTools}\n showHistoryControls={showHistoryControls}\n showDeleteButton={showDeleteButton}\n showClearButton={showClearButton}\n showToolLabels={showToolLabels}\n strokeColors={strokeColors}\n strokeWidthOptions={strokeWidthOptions}\n fontSizeOptions={fontSizeOptions}\n />,\n map.getContainer(),\n )\n}\n","import React from 'react'\nimport type L from 'leaflet'\nimport type {\n TualIcons,\n TualItem,\n TualLabels,\n CustomToolbarItem,\n LeafletTualClassNames,\n LeafletTualController,\n LeafletTualStyles,\n NoteItem,\n RenderNoteProps,\n RenderTextProps,\n ShapeItem,\n TextItem,\n ToolbarOrientation,\n ToolbarPosition,\n ToolbarToolGroupId,\n} from '../../types/index.js'\nimport { geoToScreen } from '../../shared/index.js'\nimport { InlineShapeLabelEditor, NoteOverlay, TextOverlay } from '../../entities/index.js'\nimport { TualToolbar } from '../TualToolbar/index.js'\n\nexport interface LeafletTualDomProps {\n map: L.Map\n canvasRef: React.RefObject<HTMLCanvasElement | null>\n viewport: { width: number; height: number; tick: number }\n isReadOnly: boolean\n isDrawingTool: boolean\n activeTool: string\n hoverCursor: string | null\n zIndex: number\n className?: string\n style?: React.CSSProperties\n classNames?: LeafletTualClassNames\n styles?: LeafletTualStyles\n handleInteractionPointerDown: (e: React.PointerEvent<HTMLDivElement>) => void\n handleInteractionPointerMove: (e: React.PointerEvent<HTMLDivElement>) => void\n noteItems: NoteItem[]\n textItems: TextItem[]\n selectedId: string | null\n labels?: TualLabels\n icons?: TualIcons\n unstyled?: boolean\n clampOverlaysToViewport?: boolean\n autoMinimizeNotesZoom?: number\n autoMinimizeTextZoom?: number\n renderNote?: (props: RenderNoteProps) => React.ReactNode\n renderText?: (props: RenderTextProps) => React.ReactNode\n setSelectedId: (id: string | null) => void\n updateItem: (id: string, patch: any) => void\n removeItem: (id: string) => void\n notifyChangeComplete: (targetItem?: TualItem | null) => void\n renderToolbar?: (controller: LeafletTualController) => React.ReactNode\n showToolbar: boolean\n controller: LeafletTualController\n toolbarPosition: ToolbarPosition\n toolbarOrientation?: ToolbarOrientation\n collapsible?: boolean\n defaultCollapsed?: boolean\n collapsed?: boolean\n onCollapsedChange?: (collapsed: boolean) => void\n showCollapseButton?: boolean\n enabledTools?: readonly ToolbarToolGroupId[]\n customTools?: readonly CustomToolbarItem[]\n showHistoryControls?: boolean\n showDeleteButton?: boolean\n showClearButton?: boolean\n showToolLabels?: boolean\n strokeColors?: readonly string[]\n strokeWidthOptions?: readonly number[]\n fontSizeOptions?: readonly number[]\n}\n\nexport function LeafletTualDom(props: LeafletTualDomProps) {\n const {\n map,\n canvasRef,\n viewport,\n isReadOnly,\n isDrawingTool,\n activeTool,\n hoverCursor,\n zIndex,\n className,\n style,\n classNames,\n styles,\n handleInteractionPointerDown,\n handleInteractionPointerMove,\n noteItems,\n textItems,\n selectedId,\n labels,\n icons,\n unstyled,\n clampOverlaysToViewport,\n autoMinimizeNotesZoom,\n autoMinimizeTextZoom,\n renderNote,\n renderText,\n setSelectedId,\n updateItem,\n removeItem,\n notifyChangeComplete,\n renderToolbar,\n showToolbar,\n controller,\n toolbarPosition,\n toolbarOrientation,\n collapsible,\n defaultCollapsed,\n collapsed,\n onCollapsedChange,\n showCollapseButton,\n enabledTools,\n customTools,\n showHistoryControls,\n showDeleteButton,\n showClearButton,\n showToolLabels,\n strokeColors,\n strokeWidthOptions,\n fontSizeOptions,\n } = props\n\n return (\n <div\n className={['rlc-overlay', isReadOnly ? 'rlc-readonly' : undefined, classNames?.overlay, className].filter(Boolean).join(' ')}\n data-tual-overlay\n data-readonly={isReadOnly || undefined}\n style={{ position: 'absolute', inset: 0, zIndex, pointerEvents: 'none', overflow: 'hidden', ...styles?.overlay, ...style }}\n >\n <canvas\n ref={canvasRef}\n className={['rlc-canvas', classNames?.canvas].filter(Boolean).join(' ')}\n style={{ position: 'absolute', inset: 0, width: `${viewport.width}px`, height: `${viewport.height}px`, pointerEvents: 'none', ...styles?.canvas }}\n />\n\n {isDrawingTool && (\n <div\n data-tual-drawing-surface\n className={['rlc-drawing-surface', classNames?.drawingSurface].filter(Boolean).join(' ')}\n onPointerDown={handleInteractionPointerDown}\n onPointerMove={handleInteractionPointerMove}\n style={{ position: 'absolute', inset: 0, pointerEvents: 'auto', cursor: activeTool === 'text' ? 'text' : 'crosshair', ...styles?.drawingSurface }}\n />\n )}\n\n {hoverCursor && !isDrawingTool && <style>{`.leaflet-container { cursor: ${hoverCursor} !important; }`}</style>}\n\n <div\n className={['rlc-items-container', classNames?.itemsContainer].filter(Boolean).join(' ')}\n style={{ position: 'absolute', inset: 0, pointerEvents: 'none', ...styles?.itemsContainer }}\n >\n {noteItems.map((note) => (\n <NoteOverlay key={note.id} item={note} screenPos={geoToScreen(map, note.position)} isSelected={!isReadOnly && note.id === selectedId} map={map} readOnly={isReadOnly} labels={labels} icons={icons} unstyled={unstyled} classNames={classNames} styles={styles} clampToViewport={clampOverlaysToViewport} autoMinimizeZoomThreshold={autoMinimizeNotesZoom} renderNote={renderNote} onSelect={setSelectedId} onUpdate={updateItem} onDelete={removeItem} onComplete={notifyChangeComplete} />\n ))}\n {textItems.map((txt) => (\n <TextOverlay key={txt.id} item={txt} screenPos={geoToScreen(map, txt.position)} isSelected={!isReadOnly && txt.id === selectedId} isEditingLabel={!isReadOnly && txt.id === selectedId && Boolean(controller.isEditingLabel)} map={map} readOnly={isReadOnly} labels={labels} icons={icons} unstyled={unstyled} classNames={classNames} styles={styles} clampToViewport={clampOverlaysToViewport} autoMinimizeZoomThreshold={autoMinimizeTextZoom} renderText={renderText} onSelect={setSelectedId} onUpdate={updateItem} onDelete={removeItem} onComplete={notifyChangeComplete} />\n ))}\n {!showToolbar && controller.isEditingLabel && selectedId && (() => {\n const selectedShape = controller.items.find((s) => s.id === selectedId && s.type === 'shape') as ShapeItem | undefined\n if (!selectedShape) return null\n const hasLabelMode =\n selectedShape.labelMode !== false && (selectedShape as any).hasLabelMode !== false\n if (!hasLabelMode) return null\n return (\n <InlineShapeLabelEditor\n shape={selectedShape}\n map={map}\n labels={labels}\n onUpdate={updateItem}\n onClose={() => {\n controller.setEditingLabel?.(false)\n notifyChangeComplete(selectedShape)\n }}\n />\n )\n })()}\n </div>\n\n {renderToolbar\n ? renderToolbar(controller)\n : showToolbar && (\n <TualToolbar\n controller={controller}\n position={toolbarPosition}\n orientation={toolbarOrientation}\n collapsible={collapsible}\n defaultCollapsed={defaultCollapsed}\n collapsed={collapsed}\n onCollapsedChange={onCollapsedChange}\n showCollapseButton={showCollapseButton}\n readOnly={isReadOnly}\n enabledTools={enabledTools}\n customTools={customTools}\n showHistoryControls={showHistoryControls}\n showDeleteButton={showDeleteButton}\n showClearButton={showClearButton}\n showToolLabels={showToolLabels}\n labels={labels}\n icons={icons}\n unstyled={unstyled}\n classNames={classNames}\n styles={styles}\n strokeColors={strokeColors}\n strokeWidthOptions={strokeWidthOptions}\n fontSizeOptions={fontSizeOptions}\n />\n )}\n </div>\n )\n}\n\n","import { useCallback, useRef } from 'react'\nimport type L from 'leaflet'\nimport type {\n ArrowItem,\n TualItem,\n FreeDrawItem,\n LeafletTualProps,\n NoteItem,\n RulerItem,\n ShapeItem,\n TextItem,\n} from '../../types/index.js'\nimport { useLeafletTual, useLeafletSync } from '../../features/index.js'\nimport { useTualPainter } from './use-tual-painter.js'\nimport { useTualKeyboardShortcuts } from './use-tual-keyboard-shortcuts.js'\nimport { useSelectInteractions } from './use-select-interactions.js'\nimport { useDrawingInteractions } from './use-drawing-interactions.js'\nimport { useBlockMapDblClick } from './use-block-map-dblclick.js'\nimport {\n useOutsideTualPointerDown,\n useStableItemArray,\n} from './use-outside-tual-deselect.js'\n\nexport function useLeafletTualOverlay(\n props: LeafletTualProps & { map: L.Map | null },\n) {\n const {\n map,\n controller: externalController,\n readOnly: propReadOnly,\n showToolbar: propShowToolbar,\n annotationTheme,\n arrowTheme,\n labels,\n ...hookOptions\n } = props\n\n const isReadOnly = Boolean(propReadOnly ?? externalController?.readOnly ?? false)\n const internalController = useLeafletTual({ ...hookOptions, readOnly: isReadOnly })\n const controller = externalController ?? internalController\n const showToolbar = propShowToolbar ?? !isReadOnly\n\n const propCallbacksRef = useRef(hookOptions)\n propCallbacksRef.current = hookOptions\n\n const notifyChangeComplete = useCallback(\n (targetItem?: TualItem | null) => {\n controller.notifyChangeComplete(targetItem)\n if (externalController) {\n propCallbacksRef.current.onItemsChangeComplete?.(controller.items, targetItem)\n propCallbacksRef.current.onChangeComplete?.(controller.items, targetItem)\n propCallbacksRef.current.onEditEnd?.(controller.items, targetItem)\n propCallbacksRef.current.onEditComplete?.(controller.items, targetItem)\n if (targetItem) propCallbacksRef.current.onItemChangeComplete?.(targetItem)\n }\n },\n [controller, externalController],\n )\n\n const {\n items,\n activeTool,\n setActiveTool,\n activeShape,\n shapeFilled,\n selectedId,\n setSelectedId,\n activeColor,\n strokeWidth,\n dashed,\n noteColor,\n fontSize,\n fontWeight,\n addItem,\n updateItem,\n removeItem,\n deleteSelected,\n } = controller\n\n useOutsideTualPointerDown(map, isReadOnly, activeTool, setActiveTool, selectedId, setSelectedId, notifyChangeComplete)\n\n const viewport = useLeafletSync(map)\n const canvasRef = useRef<HTMLCanvasElement | null>(null)\n\n const arrowItems = useStableItemArray<ArrowItem>(items, 'arrow')\n const freeDrawItems = useStableItemArray<FreeDrawItem>(items, 'freedraw')\n const shapeItems = useStableItemArray<ShapeItem>(items, 'shape')\n const rulerItems = useStableItemArray<RulerItem>(items, 'ruler')\n const noteItems = useStableItemArray<NoteItem>(items, 'note')\n const textItems = useStableItemArray<TextItem>(items, 'text')\n\n const {\n draftArrow,\n setDraftArrow,\n draftShape,\n setDraftShape,\n draftRuler,\n setDraftRuler,\n draftFreeDrawRef,\n clearDraftFreeDraw,\n handleInteractionPointerDown,\n handleInteractionPointerMove,\n } = useDrawingInteractions({\n map,\n activeTool,\n setActiveTool,\n activeShape,\n shapeFilled,\n activeColor,\n strokeWidth,\n dashed,\n noteColor,\n fontSize,\n fontWeight,\n labels,\n addItem,\n paintCanvas: () => paintCanvas(),\n })\n\n const paintCanvas = useTualPainter({\n map,\n viewport,\n canvasRef,\n arrowItems,\n shapeItems,\n freeDrawItems,\n rulerItems,\n selectedId,\n draftShape,\n draftArrow,\n draftRuler,\n draftFreeDrawRef,\n activeColor,\n strokeWidth,\n dashed,\n shapeFilled,\n annotationTheme: annotationTheme ?? arrowTheme,\n isReadOnly,\n })\n\n useTualKeyboardShortcuts({\n isReadOnly,\n selectedId,\n selectedItem: controller.selectedItem,\n items: controller.items,\n isEditingLabel: controller.isEditingLabel,\n setEditingLabel: controller.setEditingLabel,\n deleteSelected,\n setSelectedId,\n setActiveTool,\n setDraftArrow,\n setDraftShape,\n setDraftRuler,\n clearDraftFreeDraw,\n notifyChangeComplete,\n })\n\n useBlockMapDblClick(map)\n\n const hoverCursor = useSelectInteractions({\n map,\n activeTool,\n isReadOnly,\n arrowItems,\n shapeItems,\n freeDrawItems,\n rulerItems,\n selectedId,\n setSelectedId,\n setEditingLabel: controller.setEditingLabel,\n updateItem,\n notifyChangeComplete,\n })\n\n const isDrawingTool = !isReadOnly && activeTool !== 'select'\n\n return {\n controller,\n isReadOnly,\n showToolbar,\n viewport,\n canvasRef,\n isDrawingTool,\n hoverCursor,\n arrowItems,\n shapeItems,\n freeDrawItems,\n noteItems,\n textItems,\n selectedId,\n setSelectedId,\n updateItem,\n removeItem,\n notifyChangeComplete,\n handleInteractionPointerDown,\n handleInteractionPointerMove,\n }\n}\n\n\n","import { useCallback, useEffect } from 'react'\nimport type L from 'leaflet'\nimport type {\n ArrowItem,\n ArrowRenderTheme,\n TualAnnotationTheme,\n FreeDrawItem,\n GeoPoint,\n RulerItem,\n ScreenPoint,\n ShapeItem,\n} from '../../types/index.js'\nimport { paintLeafletTual } from '../../../core/features/tual-painter.js'\nimport type { DraftArrowState, DraftRulerState, DraftShapeState } from './types.js'\n\nexport interface UseCanvasPainterOptions {\n map: L.Map | null\n viewport: { width: number; height: number; tick: number }\n canvasRef: React.RefObject<HTMLCanvasElement | null>\n arrowItems: ArrowItem[]\n shapeItems: ShapeItem[]\n freeDrawItems: FreeDrawItem[]\n rulerItems: RulerItem[]\n selectedId: string | null\n draftShape: DraftShapeState | null\n draftArrow: DraftArrowState | null\n draftRuler?: DraftRulerState | null\n draftFreeDrawRef: React.RefObject<{\n screenPoints: ScreenPoint[]\n geoPoints: GeoPoint[]\n } | null>\n activeColor: string\n strokeWidth: number\n dashed: boolean\n shapeFilled: boolean\n annotationTheme?: TualAnnotationTheme\n arrowTheme?: ArrowRenderTheme\n isReadOnly: boolean\n}\n\nexport function useTualPainter({\n map,\n viewport,\n canvasRef,\n arrowItems,\n shapeItems,\n freeDrawItems,\n rulerItems,\n selectedId,\n draftShape,\n draftArrow,\n draftRuler,\n draftFreeDrawRef,\n activeColor,\n strokeWidth,\n dashed,\n shapeFilled,\n annotationTheme,\n arrowTheme,\n isReadOnly,\n}: UseCanvasPainterOptions) {\n const paintCanvas = useCallback(() => {\n paintLeafletTual({\n map,\n canvas: canvasRef.current,\n width: viewport.width,\n height: viewport.height,\n arrowItems,\n shapeItems,\n freeDrawItems,\n rulerItems,\n selectedId,\n draftShape,\n draftArrow,\n draftRuler,\n draftFreeDraw: draftFreeDrawRef.current,\n activeColor,\n strokeWidth,\n dashed,\n shapeFilled,\n annotationTheme,\n arrowTheme,\n isReadOnly,\n })\n }, [\n map,\n canvasRef,\n viewport.width,\n viewport.height,\n freeDrawItems,\n shapeItems,\n arrowItems,\n rulerItems,\n selectedId,\n draftShape,\n draftArrow,\n draftRuler,\n draftFreeDrawRef,\n activeColor,\n strokeWidth,\n dashed,\n shapeFilled,\n annotationTheme,\n arrowTheme,\n isReadOnly,\n ])\n\n useEffect(() => {\n paintCanvas()\n }, [paintCanvas, viewport.tick])\n\n return paintCanvas\n}\n","import { useEffect } from 'react'\nimport type { ArrowItem, TualItem, TualTool, ShapeItem } from '../../types/index.js'\nimport type { DraftArrowState, DraftRulerState, DraftShapeState } from './types.js'\n\nexport interface UseCanvasKeyboardShortcutsOptions {\n isReadOnly: boolean\n selectedId: string | null\n selectedItem?: TualItem | null\n items?: TualItem[]\n isEditingLabel?: boolean\n setEditingLabel?: (editing: boolean) => void\n deleteSelected: () => void\n setSelectedId: (id: string | null) => void\n setActiveTool: (tool: TualTool) => void\n setDraftArrow: (draft: DraftArrowState | null) => void\n setDraftShape: (draft: DraftShapeState | null) => void\n setDraftRuler?: (draft: DraftRulerState | null) => void\n clearDraftFreeDraw: () => void\n notifyChangeComplete?: () => void\n}\n\nexport function useTualKeyboardShortcuts({\n isReadOnly,\n selectedId,\n selectedItem,\n items,\n isEditingLabel: _isEditingLabel,\n setEditingLabel,\n deleteSelected,\n setSelectedId,\n setActiveTool,\n setDraftArrow,\n setDraftShape,\n setDraftRuler,\n clearDraftFreeDraw,\n notifyChangeComplete,\n}: UseCanvasKeyboardShortcutsOptions) {\n useEffect(() => {\n if (isReadOnly) return\n\n const handleKeyDown = (e: KeyboardEvent) => {\n const target = e.target as HTMLElement | null\n if (\n target &&\n (target.tagName === 'INPUT' ||\n target.tagName === 'TEXTAREA' ||\n target.isContentEditable)\n ) {\n return\n }\n\n if (e.key === 'Escape') {\n setDraftArrow(null)\n setDraftShape(null)\n setDraftRuler?.(null)\n clearDraftFreeDraw()\n setSelectedId(null)\n setActiveTool('select')\n notifyChangeComplete?.()\n } else if (e.key === 'Delete' || e.key === 'Backspace') {\n if (selectedId) {\n e.preventDefault()\n deleteSelected()\n }\n } else if (e.key === 'Enter') {\n const item = selectedItem ?? items?.find((it) => it.id === selectedId)\n if (item && item.type === 'shape') {\n const shape = item as ShapeItem\n const hasLabelMode =\n shape.labelMode !== false && (shape as any).hasLabelMode !== false\n if (hasLabelMode) {\n e.preventDefault()\n setEditingLabel?.(true)\n const focusInput = () => {\n const input = document.querySelector<HTMLInputElement>(\n `[data-tual-shape-label-input=\"${shape.id}\"], [data-tual-shape-label-input], input[placeholder*=\"Shape label\"]`,\n )\n if (input) {\n input.focus()\n input.select()\n }\n }\n focusInput()\n if (typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(focusInput)\n }\n setTimeout(focusInput, 0)\n }\n } else if (item && item.type === 'text') {\n e.preventDefault()\n setEditingLabel?.(true)\n const focusInput = () => {\n const input = document.querySelector<HTMLInputElement | HTMLTextAreaElement>(\n `[data-tual-text=\"${item.id}\"] textarea, [data-tual-text=\"${item.id}\"] input, [data-tual-text] textarea`,\n )\n if (input) {\n input.focus()\n if ('select' in input && typeof input.select === 'function') {\n input.select()\n }\n }\n }\n focusInput()\n if (typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(focusInput)\n }\n setTimeout(focusInput, 0)\n } else if (item && item.type === 'note') {\n e.preventDefault()\n setEditingLabel?.(true)\n const focusInput = () => {\n const input = document.querySelector<HTMLInputElement | HTMLTextAreaElement>(\n `[data-tual-note=\"${item.id}\"] textarea, [data-tual-note=\"${item.id}\"] input, [data-tual-note] textarea`,\n )\n if (input) {\n input.focus()\n }\n }\n focusInput()\n if (typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(focusInput)\n }\n setTimeout(focusInput, 0)\n } else if (item && item.type === 'arrow') {\n const arrow = item as ArrowItem\n const hasLabelMode =\n arrow.labelMode !== false && (arrow as any).hasLabelMode !== false\n if (hasLabelMode) {\n e.preventDefault()\n setEditingLabel?.(true)\n const focusInput = () => {\n const input = document.querySelector<HTMLInputElement>(\n `[data-tual-arrow-label-input=\"${arrow.id}\"], [data-tual-arrow-label-input], input[placeholder*=\"Arrow label\"]`,\n )\n if (input) {\n input.focus()\n input.select()\n }\n }\n focusInput()\n if (typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(focusInput)\n }\n setTimeout(focusInput, 0)\n }\n }\n } else if (!e.metaKey && !e.ctrlKey && !e.altKey) {\n const key = e.key.toLowerCase()\n if (key === 'v') setActiveTool('select')\n else if (key === 'p') setActiveTool('freedraw')\n else if (key === 'r') setActiveTool('ruler')\n else if (key === 'a') setActiveTool('arrow-linear')\n else if (key === 'c') setActiveTool('arrow-curved')\n else if (key === 'b') setActiveTool('arrow-bi')\n else if (key === 'e') setActiveTool('arrow-elbow')\n else if (key === 's') setActiveTool('arrow-s-curve')\n else if (key === 'n') setActiveTool('note')\n else if (key === 't') setActiveTool('text')\n }\n }\n\n window.addEventListener('keydown', handleKeyDown)\n return () => window.removeEventListener('keydown', handleKeyDown)\n }, [\n isReadOnly,\n selectedId,\n selectedItem,\n items,\n setEditingLabel,\n deleteSelected,\n setSelectedId,\n setActiveTool,\n setDraftArrow,\n setDraftShape,\n setDraftRuler,\n clearDraftFreeDraw,\n notifyChangeComplete,\n ])\n}\n","import { useEffect, useState } from 'react'\nimport type L from 'leaflet'\nimport type {\n ArrowItem,\n FreeDrawItem,\n RulerItem,\n ScreenPoint,\n ShapeItem,\n} from '../../types/index.js'\nimport {\n hitTestArrow,\n hitTestArrowHandle,\n hitTestFreeDraw,\n hitTestRuler,\n hitTestRulerHandle,\n hitTestShape,\n hitTestShapeHandle,\n projectArrow,\n projectFreeDraw,\n projectRuler,\n projectShape,\n} from '../../entities/index.js'\nimport {\n startArrowBodyDrag,\n startArrowHandleDrag,\n startFreeDrawBodyDrag,\n startRulerBodyDrag,\n startRulerHandleDrag,\n startShapeBodyDrag,\n startShapeHandleDrag,\n} from './select-drag-handlers.js'\n\nexport interface UseSelectInteractionsOptions {\n map: L.Map | null\n activeTool: string\n isReadOnly: boolean\n arrowItems: ArrowItem[]\n shapeItems: ShapeItem[]\n freeDrawItems: FreeDrawItem[]\n rulerItems: RulerItem[]\n selectedId: string | null\n setSelectedId: (id: string | null) => void\n setEditingLabel?: (editing: boolean) => void\n updateItem: (id: string, patch: any) => void\n notifyChangeComplete?: () => void\n}\n\nexport function useSelectInteractions({\n map,\n activeTool,\n isReadOnly,\n arrowItems,\n shapeItems,\n freeDrawItems,\n rulerItems,\n selectedId,\n setSelectedId,\n setEditingLabel,\n updateItem,\n notifyChangeComplete,\n}: UseSelectInteractionsOptions) {\n const [hoverCursor, setHoverCursor] = useState<string | null>(null)\n\n useEffect(() => {\n if (!map || activeTool !== 'select' || isReadOnly) {\n setHoverCursor(null)\n return\n }\n\n const container = map.getContainer()\n\n const getLocalPoint = (e: PointerEvent): ScreenPoint => {\n const rect = container.getBoundingClientRect()\n return { x: e.clientX - rect.left, y: e.clientY - rect.top }\n }\n\n const handlePointerMove = (e: PointerEvent) => {\n const target = e.target as HTMLElement | null\n if (target?.closest('[data-tual-toolbar], [data-tual-note], [data-tual-text]')) {\n setHoverCursor(null)\n return\n }\n\n const pt = getLocalPoint(e)\n\n const selectedArrow = arrowItems.find((a) => a.id === selectedId)\n if (selectedArrow && hitTestArrowHandle(pt, projectArrow(map, selectedArrow), selectedArrow)) {\n setHoverCursor('crosshair')\n return\n }\n\n const selectedShape = shapeItems.find((s) => s.id === selectedId)\n if (selectedShape && hitTestShapeHandle(pt, projectShape(map, selectedShape))) {\n setHoverCursor('nwse-resize')\n return\n }\n\n const selectedRuler = rulerItems.find((r) => r.id === selectedId)\n if (selectedRuler && hitTestRulerHandle(pt, projectRuler(map, selectedRuler))) {\n setHoverCursor('crosshair')\n return\n }\n\n for (let i = arrowItems.length - 1; i >= 0; i -= 1) {\n const arrow = arrowItems[i]\n if (hitTestArrow(pt, projectArrow(map, arrow), arrow)) {\n setHoverCursor('pointer')\n return\n }\n }\n\n for (let i = shapeItems.length - 1; i >= 0; i -= 1) {\n if (hitTestShape(pt, projectShape(map, shapeItems[i]))) {\n setHoverCursor('pointer')\n return\n }\n }\n\n for (let i = freeDrawItems.length - 1; i >= 0; i -= 1) {\n const fd = freeDrawItems[i]\n if (hitTestFreeDraw(pt, projectFreeDraw(map, fd), fd)) {\n setHoverCursor('pointer')\n return\n }\n }\n\n for (let i = rulerItems.length - 1; i >= 0; i -= 1) {\n const ruler = rulerItems[i]\n if (hitTestRuler(pt, projectRuler(map, ruler), ruler)) {\n setHoverCursor('pointer')\n return\n }\n }\n\n setHoverCursor(null)\n }\n\n const handlePointerDown = (e: PointerEvent) => {\n if (e.button !== 0) return\n const target = e.target as HTMLElement | null\n if (target?.closest('[data-tual-toolbar], [data-tual-note], [data-tual-text], .leaflet-control')) {\n return\n }\n\n const pt = getLocalPoint(e)\n\n const selectedArrow = arrowItems.find((a) => a.id === selectedId)\n if (selectedArrow) {\n const projected = projectArrow(map, selectedArrow)\n const handle = hitTestArrowHandle(pt, projected, selectedArrow)\n if (handle) {\n e.stopPropagation()\n e.preventDefault()\n startArrowHandleDrag(map, selectedArrow, projected, handle, getLocalPoint, updateItem)\n return\n }\n }\n\n const selectedShape = shapeItems.find((s) => s.id === selectedId)\n if (selectedShape) {\n const projected = projectShape(map, selectedShape)\n const handle = hitTestShapeHandle(pt, projected)\n if (handle) {\n e.stopPropagation()\n e.preventDefault()\n startShapeHandleDrag(map, selectedShape, projected, handle, getLocalPoint, updateItem)\n return\n }\n }\n\n const selectedRuler = rulerItems.find((r) => r.id === selectedId)\n if (selectedRuler) {\n const projected = projectRuler(map, selectedRuler)\n const handle = hitTestRulerHandle(pt, projected)\n if (handle) {\n e.stopPropagation()\n e.preventDefault()\n startRulerHandleDrag(map, selectedRuler, projected, handle, getLocalPoint, updateItem)\n return\n }\n }\n\n for (let i = arrowItems.length - 1; i >= 0; i -= 1) {\n const arrow = arrowItems[i]\n const projected = projectArrow(map, arrow)\n if (hitTestArrow(pt, projected, arrow)) {\n e.stopPropagation()\n e.preventDefault()\n setSelectedId(arrow.id)\n startArrowBodyDrag(map, arrow, projected, pt, getLocalPoint, updateItem)\n return\n }\n }\n\n for (let i = shapeItems.length - 1; i >= 0; i -= 1) {\n const shp = shapeItems[i]\n const projected = projectShape(map, shp)\n if (hitTestShape(pt, projected)) {\n e.stopPropagation()\n e.preventDefault()\n setSelectedId(shp.id)\n startShapeBodyDrag(map, shp, projected, pt, getLocalPoint, updateItem)\n return\n }\n }\n\n for (let i = freeDrawItems.length - 1; i >= 0; i -= 1) {\n const fd = freeDrawItems[i]\n const initialScreenPts = projectFreeDraw(map, fd)\n if (hitTestFreeDraw(pt, initialScreenPts, fd)) {\n e.stopPropagation()\n e.preventDefault()\n setSelectedId(fd.id)\n startFreeDrawBodyDrag(map, fd, initialScreenPts, pt, getLocalPoint, updateItem)\n return\n }\n }\n\n for (let i = rulerItems.length - 1; i >= 0; i -= 1) {\n const ruler = rulerItems[i]\n const projected = projectRuler(map, ruler)\n if (hitTestRuler(pt, projected, ruler)) {\n e.stopPropagation()\n e.preventDefault()\n setSelectedId(ruler.id)\n startRulerBodyDrag(map, ruler, projected, pt, getLocalPoint, updateItem)\n return\n }\n }\n\n if (selectedId) {\n setSelectedId(null)\n notifyChangeComplete?.()\n }\n }\n\n const handleDblClick = (e: MouseEvent) => {\n const target = e.target as HTMLElement | null\n if (\n target?.closest(\n '[data-tual-toolbar], [data-tual-note], [data-tual-text], .leaflet-control',\n )\n ) {\n return\n }\n\n const rect = container.getBoundingClientRect()\n const pt: ScreenPoint = {\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n }\n\n for (let i = shapeItems.length - 1; i >= 0; i -= 1) {\n const shp = shapeItems[i]\n const projected = projectShape(map, shp)\n if (hitTestShape(pt, projected)) {\n e.stopPropagation()\n e.preventDefault()\n setSelectedId(shp.id)\n const hasLabelMode =\n shp.labelMode !== false && (shp as any).hasLabelMode !== false\n if (hasLabelMode) {\n setEditingLabel?.(true)\n const focusInput = () => {\n const input = document.querySelector<HTMLInputElement>(\n `[data-tual-shape-label-input=\"${shp.id}\"], [data-tual-shape-label-input], input[placeholder*=\"Shape label\"]`,\n )\n if (input) {\n input.focus()\n input.select()\n }\n }\n focusInput()\n if (typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(focusInput)\n }\n setTimeout(focusInput, 0)\n }\n return\n }\n }\n }\n\n container.addEventListener('pointermove', handlePointerMove)\n container.addEventListener('pointerdown', handlePointerDown, { capture: true })\n container.addEventListener('dblclick', handleDblClick, { capture: true })\n\n return () => {\n container.removeEventListener('pointermove', handlePointerMove)\n container.removeEventListener('pointerdown', handlePointerDown, { capture: true })\n container.removeEventListener('dblclick', handleDblClick, { capture: true })\n }\n }, [\n map,\n activeTool,\n arrowItems,\n shapeItems,\n freeDrawItems,\n selectedId,\n setSelectedId,\n setEditingLabel,\n updateItem,\n isReadOnly,\n ])\n\n return hoverCursor\n}\n","import { useRef, useState } from 'react'\nimport type React from 'react'\nimport type L from 'leaflet'\nimport type {\n TualLabels,\n TualTool,\n GeoPoint,\n ScreenPoint,\n ShapeKind,\n} from '../../types/index.js'\nimport {\n constrainAngleTo45Degrees,\n geoToScreen,\n screenToGeo,\n} from '../../shared/index.js'\nimport { TOOL_TO_ARROW_STYLE } from './constants.js'\nimport type { DraftArrowState, DraftRulerState, DraftShapeState } from './types.js'\nimport {\n buildArrowItem,\n createDraftNote,\n createDraftText,\n startArrowDrag,\n startFreeDrawDrag,\n startRulerDrag,\n startShapeDrag,\n} from './drawing-drag-handlers.js'\n\nexport interface UseDrawingInteractionsOptions {\n map: L.Map | null\n activeTool: TualTool\n setActiveTool: (tool: TualTool) => void\n activeShape: ShapeKind\n shapeFilled: boolean\n activeColor: string\n strokeWidth: number\n dashed: boolean\n noteColor: string\n fontSize: number\n fontWeight: 'normal' | 'bold'\n labels?: TualLabels\n addItem: (item: any) => void\n paintCanvas: () => void\n}\n\nexport function useDrawingInteractions({\n map,\n activeTool,\n setActiveTool,\n activeShape,\n shapeFilled,\n activeColor,\n strokeWidth,\n dashed,\n noteColor,\n fontSize,\n fontWeight,\n labels,\n addItem,\n paintCanvas,\n}: UseDrawingInteractionsOptions) {\n const [draftArrow, setDraftArrow] = useState<DraftArrowState | null>(null)\n const [draftShape, setDraftShape] = useState<DraftShapeState | null>(null)\n const [draftRuler, setDraftRuler] = useState<DraftRulerState | null>(null)\n\n const draftFreeDrawRef = useRef<{\n screenPoints: ScreenPoint[]\n geoPoints: GeoPoint[]\n } | null>(null)\n const rafIdRef = useRef<number | null>(null)\n\n const clearDraftFreeDraw = () => {\n draftFreeDrawRef.current = null\n if (rafIdRef.current !== null) {\n window.cancelAnimationFrame(rafIdRef.current)\n rafIdRef.current = null\n }\n }\n\n const getRelativeScreenPoint = (e: React.PointerEvent<HTMLDivElement>): ScreenPoint => {\n if (!map) return { x: 0, y: 0 }\n const rect = map.getContainer().getBoundingClientRect()\n return { x: e.clientX - rect.left, y: e.clientY - rect.top }\n }\n\n const handleInteractionPointerDown = (e: React.PointerEvent<HTMLDivElement>) => {\n if (e.button !== 0 || !map) return\n e.stopPropagation()\n e.preventDefault()\n\n const mapContainer = map.getContainer()\n const pt = getRelativeScreenPoint(e)\n const geo = screenToGeo(map, pt)\n\n if (activeTool === 'freedraw') {\n startFreeDrawDrag(map, mapContainer, pt, geo, activeColor, strokeWidth, dashed, draftFreeDrawRef, rafIdRef, paintCanvas, addItem, setActiveTool)\n return\n }\n\n if (activeTool === 'shape') {\n startShapeDrag(map, mapContainer, pt, geo, activeShape, activeColor, shapeFilled, strokeWidth, dashed, setDraftShape, addItem, setActiveTool)\n return\n }\n\n if (activeTool === 'ruler') {\n startRulerDrag(map, mapContainer, pt, geo, activeColor, strokeWidth, dashed, setDraftRuler, addItem, setActiveTool)\n return\n }\n\n if (activeTool === 'note') {\n addItem(createDraftNote(geo, noteColor, labels?.noteDefaultTitle))\n if (!e.shiftKey) setActiveTool('select')\n return\n }\n\n if (activeTool === 'text') {\n const zoom = typeof map?.getZoom === 'function' ? map.getZoom() : 14\n addItem(createDraftText(geo, activeColor, fontSize, fontWeight, zoom))\n if (!e.shiftKey) setActiveTool('select')\n return\n }\n\n const arrowStyle = TOOL_TO_ARROW_STYLE[activeTool]\n if (arrowStyle) {\n if (draftArrow) {\n const startScreen = geoToScreen(map, draftArrow.startGeo)\n const finalScreen = e.shiftKey ? constrainAngleTo45Degrees(startScreen, pt) : pt\n addItem(buildArrowItem(draftArrow.arrowStyle, draftArrow.startGeo, screenToGeo(map, finalScreen), activeColor, strokeWidth, dashed))\n setDraftArrow(null)\n setActiveTool('select')\n return\n }\n\n startArrowDrag(map, mapContainer, pt, geo, arrowStyle, activeColor, strokeWidth, dashed, setDraftArrow, addItem, setActiveTool)\n }\n }\n\n const handleInteractionPointerMove = (e: React.PointerEvent<HTMLDivElement>) => {\n if (!draftArrow || !map) return\n const rawPt = getRelativeScreenPoint(e)\n const startScreen = geoToScreen(map, draftArrow.startGeo)\n const pt = e.shiftKey ? constrainAngleTo45Degrees(startScreen, rawPt) : rawPt\n setDraftArrow((prev) => (prev ? { ...prev, currentGeo: screenToGeo(map, pt) } : null))\n }\n\n return {\n draftArrow,\n setDraftArrow,\n draftShape,\n setDraftShape,\n draftRuler,\n setDraftRuler,\n draftFreeDrawRef,\n clearDraftFreeDraw,\n handleInteractionPointerDown,\n handleInteractionPointerMove,\n }\n}\n","'use client'\n\nimport { useEffect } from 'react'\nimport type L from 'leaflet'\nimport { bindBlockMapDblClick } from '../../../core/features/map-sync.js'\n\nexport function useBlockMapDblClick(map: L.Map | null) {\n useEffect(() => {\n if (!map) return\n return bindBlockMapDblClick(map)\n }, [map])\n}\n","import { useEffect, useMemo, useRef } from 'react'\nimport type L from 'leaflet'\nimport type { TualItem, TualTool } from '../../types/index.js'\n\nexport function useStableItemArray<T extends TualItem>(\n items: TualItem[],\n type: T['type'],\n): T[] {\n const prevRef = useRef<T[]>([])\n return useMemo(() => {\n const next = items.filter((it): it is T => it.type === type)\n if (\n prevRef.current.length === next.length &&\n prevRef.current.every((item, i) => item === next[i])\n ) {\n return prevRef.current\n }\n prevRef.current = next\n return next\n }, [items, type])\n}\n\nexport function useOutsideTualPointerDown(\n map: L.Map | null,\n isReadOnly: boolean,\n activeTool: TualTool,\n setActiveTool: (tool: TualTool) => void,\n selectedId: string | null,\n setSelectedId: (id: string | null) => void,\n notifyChangeComplete: () => void,\n) {\n useEffect(() => {\n if (!map || isReadOnly) return\n\n const handleWindowPointerDown = (e: PointerEvent) => {\n if (e.button !== 0) return\n const target = e.target as HTMLElement | null\n const mapEl = map.getContainer()\n if (\n mapEl.contains(target) ||\n target?.closest?.(\n '[data-tual-overlay], [data-tual-toolbar], [data-tual-note], [data-tual-text], .leaflet-control',\n )\n ) {\n return\n }\n\n if (activeTool !== 'select') setActiveTool('select')\n if (selectedId) setSelectedId(null)\n notifyChangeComplete()\n }\n\n window.addEventListener('pointerdown', handleWindowPointerDown)\n return () => window.removeEventListener('pointerdown', handleWindowPointerDown)\n }, [map, isReadOnly, activeTool, setActiveTool, selectedId, setSelectedId, notifyChangeComplete])\n}\n\n"],"mappings":";+kBAAA,IAAAA,GAAA,GAAAC,GAAAD,GAAA,8BAAAE,GAAA,sBAAAC,GAAA,8BAAAC,GAAA,oBAAAC,GAAA,sBAAAC,GAAA,yBAAAC,GAAA,yBAAAC,GAAA,iCAAAC,GAAA,sBAAAC,GAAA,2BAAAC,GAAA,gBAAAC,GAAA,sBAAAC,GAAA,gBAAAC,GAAA,gBAAAC,GAAA,kBAAAC,GAAA,yBAAAC,GAAA,wBAAAC,GAAA,gBAAAC,GAAA,gBAAAC,GAAA,YAAAC,GAAA,yBAAAC,GAAA,oBAAAC,GAAA,mBAAAC,GAAA,mBAAAC,GAAA,8BAAAC,GAAA,0BAAAC,GAAA,0BAAAC,GAAA,sBAAAC,GAAA,sBAAAC,GAAA,kCAAAC,GAAA,8BAAAC,GAAA,2BAAAC,GAAA,oBAAAC,GAAA,oBAAAC,GAAA,aAAAC,GAAA,sBAAAC,GAAA,gCAAAC,GAAA,8BAAAC,GAAA,sBAAAC,GAAA,kBAAAC,GAAA,mBAAAC,GAAA,sBAAAC,GAAA,4BAAAC,GAAA,gBAAAC,GAAA,+BAAAC,GAAA,+BAAAC,GAAA,6BAAAC,GAAA,qBAAAC,GAAA,4BAAAC,GAAA,yBAAAC,GAAA,iBAAAC,GAAA,uBAAAC,GAAA,oBAAAC,GAAA,iBAAAC,GAAA,uBAAAC,GAAA,iBAAAC,GAAA,uBAAAC,GAAA,qBAAAC,GAAA,iBAAAC,GAAA,oBAAAC,GAAA,iBAAAC,GAAA,iBAAAC,GAAA,wBAAAC,GAAA,2BAAAC,GAAA,wBAAAC,GAAA,wBAAAC,GAAA,qBAAAC,GAAA,gBAAAC,EAAA,uBAAAC,GAAA,mBAAAC,GAAA,yBAAAC,GAAA,0BAAAC,GAAA,sBAAAC,GAAA,uBAAAC,GAAA,mBAAAC,GAAA,yBAAAC,GAAA,uBAAAC,GAAA,mBAAAC,GAAA,yBAAAC,GAAA,mBAAAC,GAAA,sBAAAC,GAAA,qBAAAC,GAAA,mBAAAC,GAAA,mBAAAC,KAAA,eAAAC,GAAAtF,ICAA,IAAAuF,GAAA,CACE,KAAQ,eACR,QAAW,QACX,YAAe,2MACf,KAAQ,SACR,YAAe,GACf,KAAQ,mBACR,OAAU,kBACV,MAAS,oBACT,QAAW,CACT,IAAK,CACH,MAAS,oBACT,OAAU,CACR,MAAS,oBACT,QAAW,iBACb,EACA,QAAW,CACT,MAAS,qBACT,QAAW,kBACb,EACA,QAAW,iBACb,EACA,SAAU,CACR,MAAS,oBACT,OAAU,CACR,MAAS,oBACT,QAAW,iBACb,EACA,QAAW,CACT,MAAS,qBACT,QAAW,kBACb,EACA,QAAW,iBACb,EACA,UAAW,CACT,MAAS,oBACT,OAAU,CACR,MAAS,oBACT,QAAW,iBACb,EACA,QAAW,CACT,MAAS,qBACT,QAAW,kBACb,EACA,QAAW,iBACb,EACA,iBAAkB,gBACpB,EACA,MAAS,CACP,OACA,WACF,EACA,OAAU,eACV,QAAW,MACX,WAAc,CACZ,KAAQ,MACR,IAAO,uDACP,UAAa,uBACf,EACA,KAAQ,CACN,IAAO,qDACT,EACA,cAAiB,CACf,OAAU,SACV,SAAY,6BACd,EACA,SAAY,CACV,UACA,eACA,OACA,QACA,SACA,aACA,YACA,SACA,QACA,MACA,UACA,qBACA,aACA,QACA,eACF,EACA,QAAW,CACT,MAAS,OACT,IAAO,eACP,KAAQ,0BACR,UAAa,eACb,OAAU,uCACV,eAAgB,uCAChB,KAAQ,aACR,aAAc,SACd,QAAW,oBACX,QAAW,oCACb,EACA,iBAAoB,CAClB,QAAW,SACX,MAAS,qBACT,YAAa,qBACb,gBAAiB,kBACnB,EACA,qBAAwB,CACtB,MAAS,CACP,SAAY,EACd,EACA,YAAa,CACX,SAAY,EACd,EACA,gBAAiB,CACf,SAAY,EACd,CACF,EACA,gBAAmB,CACjB,kBAAmB,UACnB,uBAAwB,UACxB,yBAA0B,UAC1B,iBAAkB,UAClB,cAAe,WACf,eAAgB,UAChB,mBAAoB,UACpB,OAAU,UACV,4BAA6B,SAC7B,MAAS,UACT,QAAW,SACX,SAAY,SACZ,MAAS,UACT,YAAa,UACb,gBAAiB,SACjB,KAAQ,SACR,WAAc,SACd,oBAAqB,UACrB,OAAU,QACZ,CACF,ECnIO,IAAMC,GAA8D,CACzE,eAAgB,SAChB,eAAgB,SAChB,WAAY,KACZ,cAAe,QACf,gBAAiB,SACnB,EAEaC,GAAgB,CAC3B,UACA,UACA,UACA,UA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","names":["react_exports","__export","DEFAULT_ANNOTATION_THEME","DEFAULT_FONT_SIZE","DEFAULT_FONT_SIZE_OPTIONS","DEFAULT_NOTE_BG","DEFAULT_NOTE_TEXT","DEFAULT_STROKE_COLOR","DEFAULT_STROKE_WIDTH","DEFAULT_STROKE_WIDTH_OPTIONS","FONT_SIZE_OPTIONS","InlineShapeLabelEditor","LeafletTual","NOTE_COLOR_THEMES","NoteOverlay","PixelSelect","STROKE_COLORS","STROKE_WIDTH_OPTIONS","TOOL_TO_ARROW_STYLE","TextOverlay","TualToolbar","VERSION","bindBlockMapDblClick","bindLeafletSync","buildArrowItem","buildRulerItem","calculateGeodesicDistance","calculateLineDistance","calculateZoomFontSize","clampNotePosition","clampTextPosition","computeDefaultControlGeoPoint","constrainAngleTo45Degrees","constrainToAspectRatio","createDraftNote","createDraftText","createId","createLeafletTual","createLeafletTualController","distanceToQuadraticBezier","distanceToSegment","drawArrowHead","drawTualHandle","drawTualLabelPill","formatRealWorldDistance","geoToScreen","getCollapseChevronRotation","getDropdownChevronRotation","getExpandChevronRotation","getMapDimensions","getQuadraticBezierPoint","getQuadraticEndAngle","hitTestArrow","hitTestArrowHandle","hitTestFreeDraw","hitTestRuler","hitTestRulerHandle","hitTestShape","hitTestShapeHandle","paintLeafletTual","projectArrow","projectFreeDraw","projectRuler","projectShape","renderArrowOnCanvas","renderFreeDrawOnCanvas","renderRulerOnCanvas","renderShapeOnCanvas","resolveNoteTheme","screenToGeo","startArrowBodyDrag","startArrowDrag","startArrowHandleDrag","startFreeDrawBodyDrag","startFreeDrawDrag","startRulerBodyDrag","startRulerDrag","startRulerHandleDrag","startShapeBodyDrag","startShapeDrag","startShapeHandleDrag","traceArrowPath","tracePolygonShape","truncateTualText","useLeafletSync","useLeafletTual","__toCommonJS","package_default","TOOL_TO_ARROW_STYLE","STROKE_COLORS","NOTE_COLOR_THEMES","DEFAULT_STROKE_COLOR","DEFAULT_STROKE_WIDTH","DEFAULT_STROKE_WIDTH_OPTIONS","STROKE_WIDTH_OPTIONS","DEFAULT_NOTE_BG","DEFAULT_NOTE_TEXT","DEFAULT_FONT_SIZE","DEFAULT_FONT_SIZE_OPTIONS","FONT_SIZE_OPTIONS","DEFAULT_ANNOTATION_THEME","idCounter","createId","prefix","randomPart","geoToScreen","map","point","containerPt","screenToGeo","latLng","constrainToAspectRatio","anchor","target","aspectRatio","safeRatio","dx","dy","absDx","absDy","signX","signY","constrainAngleTo45Degrees","dist","angle","snapStep","snappedAngle","computeDefaultControlGeoPoint","start","end","curvature","midLat","midLng","dLat","dLng","getQuadraticBezierPoint","p0","p1","p2","t","invT","getQuadraticEndAngle","distanceToSegment","p","v","w","l2","projX","projY","distanceToQuadraticBezier","steps","minDistance","prev","i","curr","getMapDimensions","size","rect","truncateTualText","ctx","text","maxWidth","ellipsis","low","high","best","mid","candidate","calculateZoomFontSize","initialFontSize","currentZoom","baseZoom","options","factor","min","max","scaled","calculateGeodesicDistance","lat1","lat2","sinDLat","sinDLng","a","formatRealWorldDistance","meters","unit","feet","miles","km","calculateLineDistance","points","total","drawTualHandle","ctx","pt","strokeColor","fillColor","radius","strokeWidth","drawTualLabelPill","label","midX","midY","maxAllowedBoxWidth","theme","padX","maxTextWidth","displayText","truncateTualText","metrics","boxW","boxH","boxX","boxY","borderRadius","drawArrowHead","ctx","tip","angle","size","color","filled","spread","x1","y1","x2","y2","traceArrowPath","projected","arrowStyle","start","end","control","dx","dy","projectArrow","map","arrow","start","geoToScreen","end","needsOffsetControl","controlGeo","computeDefaultControlGeoPoint","control","renderArrowOnCanvas","ctx","projected","options","dist","theme","headSize","endAngle","startAngle","getQuadraticEndAngle","dx","dy","sdx","traceArrowPath","isDashed","headStyle","drawArrowHead","minArrowSize","rawMid","getQuadraticBezierPoint","fitToShape","maxW","drawTualLabelPill","handleRadius","fill","endpointColor","controlColor","strokeWidth","drawTualHandle","hitTestArrowHandle","point","tolerance","hitTestArrow","hitThreshold","distanceToQuadraticBezier","c1","c2","distanceToSegment","projectFreeDraw","map","item","pt","geoToScreen","traceSmoothPolyline","ctx","points","i","midX","midY","last","renderFreeDrawOnCanvas","screenPoints","options","theme","hitTestFreeDraw","point","tolerance","threshold","minX","minY","maxX","maxY","p","distanceToSegment","tracePolygonShape","ctx","proj","kind","theme","minX","minY","maxX","maxY","width","height","cx","cy","radius","rx","ry","i","angle","px","py","outerRx","outerRy","innerRx","innerRy","headCy","headRadius","neckY","hipY","armY","armSpan","legSpan","projectShape","map","shape","start","geoToScreen","end","minX","minY","maxX","maxY","width","height","renderShapeOnCanvas","ctx","projected","options","theme","tracePolygonShape","defaultFillOpacity","fillHex","minShapeSize","rawLabelY","fitToShape","maxW","drawTualLabelPill","handleRadius","fill","endpointColor","strokeWidth","drawTualHandle","hitTestShapeHandle","point","tolerance","hitTestShape","projectRuler","map","ruler","start","geoToScreen","end","mid","lengthPx","angle","renderRulerOnCanvas","ctx","projected","options","theme","perp","tickLen","dx","dy","distMeters","calculateGeodesicDistance","displayLabel","formatRealWorldDistance","fitToShape","maxW","drawTualLabelPill","handleRadius","fill","endpointColor","strokeWidth","drawTualHandle","hitTestRulerHandle","point","tolerance","hitTestRuler","hitThreshold","distanceToSegment","resolveNoteTheme","backgroundColor","matchedTheme","NOTE_COLOR_THEMES","t","isDarkBg","clampNotePosition","map","screenPos","item","isCompact","isDragging","clampToViewport","mapDims","getMapDimensions","cardWidth","cardHeight","pad","minX","maxX","minY","maxY","clampTextPosition","map","screenPos","item","dynamicFontSize","isCompact","isDragging","clampToViewport","mapDims","getMapDimensions","approxHalfW","approxHalfH","pad","minX","maxX","minY","maxY","startFreeDrawDrag","map","mapContainer","pt","geo","activeColor","strokeWidth","dashed","draftFreeDrawRef","rafIdRef","paintCanvas","addItem","setActiveTool","handleWindowMove","moveEvent","rect","currScreen","pts","prevPt","screenToGeo","handleWindowUp","upEvent","draft","createId","createDraftNote","geo","noteColor","defaultTitle","theme","NOTE_COLOR_THEMES","t","createId","createDraftText","activeColor","fontSize","fontWeight","currentZoom","startShapeDrag","map","mapContainer","startScreen","startGeo","activeShape","shapeFilled","strokeWidth","dashed","setDraftShape","addItem","setActiveTool","handleWindowMove","moveEvent","rect","rawScreen","currScreen","constrainToAspectRatio","screenToGeo","handleWindowUp","upEvent","rawEndScreen","endScreen","dragDist","finalStartGeo","finalEndGeo","buildArrowItem","arrowStyle","endGeo","computeDefaultControlGeoPoint","startArrowDrag","setDraftArrow","constrainAngleTo45Degrees","buildRulerItem","startRulerDrag","setDraftRuler","bindWindowDrag","map","onMove","onUp","startArrowHandleDrag","arrow","projected","handle","getLocalPoint","updateItem","moveEvent","rawPt","shouldLock","snappedPt","constrainAngleTo45Degrees","screenToGeo","startShapeHandleDrag","shape","anchorScreen","initialRatio","nextPt","constrainToAspectRatio","nextGeo","startArrowBodyDrag","originPt","initialStartScreen","initialEndScreen","initialControlScreen","hadCustomControl","dx","dy","patch","startShapeBodyDrag","startFreeDrawBodyDrag","fd","initialScreenPts","sp","startRulerHandleDrag","ruler","startRulerBodyDrag","paintLeafletTual","map","canvas","width","height","arrowItems","shapeItems","freeDrawItems","rulerItems","selectedId","draftShape","draftArrow","draftRuler","draftFreeDraw","activeColor","strokeWidth","dashed","shapeFilled","annotationTheme","arrowTheme","isReadOnly","effectiveTheme","dpr","targetW","targetH","ctx","fd","screenPts","projectFreeDraw","renderFreeDrawOnCanvas","shp","projected","projectShape","renderShapeOnCanvas","arrow","projectArrow","renderArrowOnCanvas","ruler","projectRuler","renderRulerOnCanvas","tempShape","tempArrow","tempRuler","bindLeafletSync","map","onSync","sync","size","bindBlockMapDblClick","container","handleDblClickCapture","e","target","hadFlag","previous","wasZoomEnabled","handleMouseDownCapture","handleUp","createLeafletTualController","options","maxPast","past","present","future","committedItems","activeTool","readOnly","selectedId","isEditingLabel","activeShape","shapeFilled","activeColor","DEFAULT_STROKE_COLOR","strokeWidth","DEFAULT_STROKE_WIDTH","dashed","noteColor","DEFAULT_NOTE_BG","fontSize","DEFAULT_FONT_SIZE","fontWeight","listeners","notifyListeners","listener","store","triggerChange","next","triggerChangeComplete","finalItems","targetItem","commitItems","updater","notifyChangeComplete","anchor","setSelectedId","id","prev","it","setActiveTool","tool","setReadOnly","nextReadOnly","patchSelected","predicate","patcher","setActiveShape","shape","setShapeFilled","filled","setActiveColor","color","setStrokeWidth","width","setDashed","nextDashed","setNoteColor","bg","theme","NOTE_COLOR_THEMES","t","setFontSize","size","setFontWeight","weight","setEditingLabel","editing","addItem","item","updateItem","patch","patchKeys","updated","removeItem","deleteSelected","clearAll","restored","json","parsed","createLeafletTual","map","options","externalController","annotationTheme","arrowTheme","labels","zIndex","controllerOptions","controller","createLeafletTualController","mapContainer","container","canvas","drawingSurface","viewport","draftArrow","draftShape","draftRuler","draftFreeDrawRef","rafIdRef","setDraftArrow","next","repaint","setDraftShape","setDraftRuler","clearDraftFreeDraw","updateSurfaceInteractivity","isDrawing","items","paintLeafletTual","it","getLocalPoint","e","rect","handleSurfacePointerDown","pt","geo","screenToGeo","activeTool","activeShape","shapeFilled","activeColor","strokeWidth","dashed","noteColor","fontSize","fontWeight","startFreeDrawDrag","startShapeDrag","createDraftNote","createDraftText","startRulerDrag","arrowStyle","TOOL_TO_ARROW_STYLE","startArrowDrag","startScreen","geoToScreen","endScreen","constrainAngleTo45Degrees","buildArrowItem","handleSurfacePointerMove","rawPt","nextPt","handleContainerPointerDown","arrowItems","shapeItems","freeDrawItems","rulerItems","selectedId","selectedArrow","a","projected","projectArrow","handle","hitTestArrowHandle","startArrowHandleDrag","selectedShape","s","projectShape","hitTestShapeHandle","startShapeHandleDrag","selectedRuler","r","projectRuler","hitTestRulerHandle","startRulerHandleDrag","i","arrow","hitTestArrow","startArrowBodyDrag","shp","hitTestShape","startShapeBodyDrag","fd","initialScreenPts","projectFreeDraw","hitTestFreeDraw","startFreeDrawBodyDrag","ruler","hitTestRuler","startRulerBodyDrag","handleKeyDown","target","unbindSync","bindLeafletSync","dims","unbindDblClick","bindBlockMapDblClick","unsubscribeController","VERSION","package_default","import_react","import_jsx_runtime","InlineShapeLabelEditor","shape","map","labels","onUpdate","onClose","text","setText","inputRef","projected","projectShape","midX","midY","e","import_react","resolveNoteTheme","backgroundColor","matchedTheme","NOTE_COLOR_THEMES","t","isDarkBg","clampNotePosition","map","screenPos","item","isCompact","isDragging","clampToViewport","mapDims","getMapDimensions","cardWidth","cardHeight","pad","minX","maxX","minY","maxY","getDefaultNoteCardStyle","theme","isSelected","readOnly","unstyled","import_react","startNoteResize","options","e","item","map","cardRef","textareaRef","onSelect","onUpdate","onComplete","target","pointerId","startX","startY","startWidth","startHeight","rafId","latestWidth","latestHeight","hasMovedY","isTestEnv","flushUpdate","patch","handlePointerMove","moveEvent","dx","dy","handlePointerUp","useNoteDragResize","item","screenPos","map","readOnly","isCompact","cardRef","textareaRef","onSelect","onUpdate","onComplete","isDragging","setIsDragging","dragOffsetRef","didDragRef","dragStartPosRef","pendingCommitRef","commitResize","nextW","nextH","patch","textarea","ro","entries","entry","measuredW","measuredH","widthDiff","heightDiff","handleWindowPointerUp","e","rect","dragRafId","latestGeo","isTestEnv","flushDrag","handlePointerMove","moveEvent","nextX","nextY","screenToGeo","handlePointerUp","startNoteResize","startW","startH","handleUp","currentW","currentH","import_jsx_runtime","DEFAULT_ICONS","import_jsx_runtime","NoteCardHeader","item","theme","readOnly","unstyled","labels","icons","classNames","styles","onHeaderPointerDown","onCollapse","onSelect","onUpdate","onDelete","onComplete","headerBtnBaseStyle","e","DEFAULT_ICONS","import_jsx_runtime","NoteCardView","item","theme","isCompact","isDragging","readOnly","unstyled","labels","icons","classNames","styles","textareaRef","onHeaderPointerDown","onExpandFromCompact","onCollapse","onSelect","onUpdate","onDelete","onComplete","onTextareaPointerDown","DEFAULT_ICONS","NoteCardHeader","e","import_jsx_runtime","NoteCustomRenderView","item","screenPos","isSelected","isDragging","readOnly","isCompact","cardClassName","structuralRootStyle","styles","renderNote","onCardClick","onCardDoubleClick","handleHeaderPointerDown","handleResizePointerDown","onSelect","onUpdate","onDelete","e","patch","import_jsx_runtime","NoteOverlay","React","item","screenPos","isSelected","map","readOnly","labels","icons","unstyled","classNames","styles","clampToViewport","autoMinimizeZoomThreshold","renderNote","onSelect","onUpdate","onDelete","onComplete","cardRef","textareaRef","currentZoom","expandedLocally","setExpandedLocally","lastZoomRef","autoCompact","isCompact","isDragging","didDragRef","handleHeaderPointerDown","handleResizePointerDown","handleTextareaPointerDown","useNoteDragResize","el","stopPropagation","e","target","handleExpandFromCompact","theme","resolveNoteTheme","renderX","renderY","clampNotePosition","structuralRootStyle","cardClassName","handleCardClick","handleCardDoubleClick","NoteCustomRenderView","getDefaultNoteCardStyle","NoteCardView","import_react","clampTextPosition","map","screenPos","item","dynamicFontSize","isCompact","isDragging","clampToViewport","mapDims","getMapDimensions","approxHalfW","approxHalfH","pad","minX","maxX","minY","maxY","getTextCursor","readOnly","isEditing","import_react","useTextDrag","item","screenPos","map","readOnly","isEditing","onSelect","onUpdate","isDragging","setIsDragging","dragOffsetRef","didDragRef","dragStartPosRef","e","rect","handlePointerMove","moveEvent","nextX","nextY","screenToGeo","handlePointerUp","import_jsx_runtime","TextOverlayView","item","map","isCompact","isEditing","isSelected","readOnly","unstyled","dynamicFontSize","labels","classNames","styles","inputRef","setIsEditing","onUpdate","onComplete","finishEditing","e","handleUp","import_jsx_runtime","TextCustomRenderView","item","screenPos","isSelected","isEditing","isDragging","readOnly","isCompact","dynamicFontSize","dragHandleProps","wrapperClassName","structuralWrapperStyle","styles","renderText","onClick","onDoubleClick","setIsEditing","onSelect","onUpdate","onDelete","e","patch","import_jsx_runtime","TextOverlay","React","item","screenPos","isSelected","isEditingLabel","map","readOnly","labels","_icons","unstyled","classNames","styles","clampToViewport","autoMinimizeZoomThreshold","renderText","onSelect","onUpdate","onDelete","onComplete","isEditing","setIsEditing","expandedLocally","setExpandedLocally","inputRef","isDragging","didDragRef","handlePointerDown","useTextDrag","currentZoom","lastZoomRef","initialSize","baseZoom","dynamicFontSize","calculateZoomFontSize","isCompact","cursor","getTextCursor","dragHandleProps","wrapperClassName","renderX","renderY","clampTextPosition","structuralWrapperStyle","handleClick","e","handleDoubleClick","TextCustomRenderView","ed","TextOverlayView","import_react","useLeafletSync","map","viewport","setViewport","bindLeafletSync","width","height","prev","import_react","import_react","useTualHistory","options","initialItems","controlledItems","maxHistory","maxPast","callbacksRef","history","setHistory","historyRef","items","currentItemsRef","committedItemsRef","triggerChange","next","triggerChangeComplete","finalItems","targetItem","commitItems","updater","prev","notifyChangeComplete","current","anchor","undo","readOnly","restored","redo","import_react","useTualStyles","options","defaultColor","DEFAULT_STROKE_COLOR","defaultStrokeWidth","DEFAULT_STROKE_WIDTH","defaultNoteColor","DEFAULT_NOTE_BG","defaultFontSize","DEFAULT_FONT_SIZE","defaultShape","readOnly","selectedId","commitItems","activeShape","setActiveShapeState","shapeFilled","setShapeFilledState","activeColor","setActiveColorState","strokeWidth","setStrokeWidthState","dashed","setDashedState","noteColor","setNoteColorState","fontSize","setFontSizeState","fontWeight","setFontWeightState","patchSelected","predicate","patcher","prev","it","setActiveShape","shape","setShapeFilled","filled","setActiveColor","color","setStrokeWidth","width","setDashed","nextDashed","setNoteColor","bg","theme","NOTE_COLOR_THEMES","t","setFontSize","size","setFontWeight","weight","useLeafletTual","options","controlledItems","initialTool","defaultColor","defaultStrokeWidth","defaultNoteColor","defaultFontSize","defaultShape","items","history","historyRef","callbacksRef","commitItems","notifyChangeComplete","rawUndo","rawRedo","useTualHistory","activeToolState","setActiveToolState","readOnly","setReadOnly","prevOptionReadOnly","selectedId","setSelectedIdState","isEditingLabel","setIsEditingLabel","styles","useTualStyles","setSelectedId","idOrUpdater","prev","nextId","currentList","it","setActiveTool","tool","addItem","item","updateItem","id","patch","patchKeys","updated","removeItem","deleteSelected","clearAll","selectedItem","exportJSON","importJSON","json","parsed","import_react","DEFAULT_ENABLED_TOOLS","POSITION_STYLES","buildArrowOptions","labels","icons","DEFAULT_ICONS","buildShapeOptions","getToolbarButtonStyle","isActive","isVertical","showToolLabels","readOnly","unstyled","styles","getToolbarButtonClassName","classNames","getPopupPlacementStyle","position","orientation","centerHorizontally","isRight","isLeft","isBottom","getToolbarContainerStyle","getActiveToolInfo","activeTool","isArrowToolActive","currentArrowIcon","arrowGroupLabel","currentShapeIcon","shapesGroupLabel","ARROW_TOOL_IDS","isArrowTool","tool","ARROW_TOOL_IDS","getDropdownChevronRotation","isOpen","position","orientation","getCollapseChevronRotation","getExpandChevronRotation","import_jsx_runtime","CollapseTriggerButton","position","orientation","isVertical","showToolLabels","unstyled","labels","icons","classNames","styles","onCollapse","rotation","getCollapseChevronRotation","icon","DEFAULT_ICONS","ExpandTriggerButton","activeToolInfo","onExpand","getExpandChevronRotation","getHistoryBtnStyle","enabled","isVertical","showToolLabels","unstyled","styles","getActionRowStyle","color","extraStyle","import_jsx_runtime","ActionButtons","readOnly","showHistoryControls","showDeleteButton","showClearButton","showToolLabels","selectedItem","itemsCount","canUndo","canRedo","undo","redo","deleteSelected","clearAll","orientation","labels","icons","unstyled","classNames","styles","isVertical","renderActionContent","icon","label","getHistoryBtnClass","enabled","undoBtn","getHistoryBtnStyle","DEFAULT_ICONS","redoBtn","getActionRowStyle","import_react","import_react","import_jsx_runtime","ArrowDropdown","isOpen","readOnly","isArrowToolActive","activeTool","arrowOptions","arrowGroupLabel","currentArrowIcon","showToolLabels","icons","unstyled","classNames","styles","position","orientation","arrowGroupRef","getButtonClassName","getButtonStyle","onToggle","onSelectOption","hoveredOption","setHoveredOption","React","isVertical","popupPlacementStyle","getPopupPlacementStyle","chevronRotation","getDropdownChevronRotation","chevronIcon","DEFAULT_ICONS","option","isOptionActive","isHovered","import_react","import_react","import_jsx_runtime","ShapesModalGrid","shapeOptions","activeShape","isShapeToolActive","unstyled","classNames","styles","onSelectShape","hoveredKind","setHoveredKind","React","shapeOpt","isSelectedShape","isHovered","import_jsx_runtime","ShapesModal","isOpen","readOnly","isShapeToolActive","activeShape","shapeOptions","shapesGroupLabel","currentShapeIcon","showToolLabels","labels","icons","unstyled","classNames","styles","position","orientation","shapesGroupRef","getButtonClassName","getButtonStyle","onToggle","onSelectShape","isVertical","popupPlacementStyle","getPopupPlacementStyle","chevronRotation","getDropdownChevronRotation","chevronIcon","DEFAULT_ICONS","React","e","ShapesModalGrid","import_jsx_runtime","ToolbarToolButtons","props","controller","readOnly","position","orientation","isVertical","showToolLabels","enabledTools","customTools","labels","icons","unstyled","classNames","styles","arrowOptions","shapeOptions","arrowGroupLabel","currentArrowIcon","shapesGroupLabel","currentShapeIcon","isArrowToolActive","isShapeToolActive","arrowDropdownOpen","shapesModalOpen","arrowGroupRef","shapesGroupRef","setArrowDropdownOpen","setShapesModalOpen","getButtonClassName","getButtonStyle","activeTool","setActiveTool","activeShape","setActiveShape","renderToolButtonInner","icon","label","renderSimpleToolBtn","tool","shortcut","allowInReadOnly","isActive","groupId","DEFAULT_ICONS","ArrowDropdown","o","id","ShapesModal","kind","custom","React","import_jsx_runtime","PrimaryToolbarStrip","props","controller","readOnly","position","orientation","isVertical","showToolLabels","collapsible","showCollapseButton","enabledTools","customTools","showHistoryControls","showDeleteButton","showClearButton","labels","icons","unstyled","classNames","styles","arrowOptions","shapeOptions","arrowGroupLabel","currentArrowIcon","shapesGroupLabel","currentShapeIcon","isArrowToolActive","isShapeToolActive","arrowDropdownOpen","shapesModalOpen","arrowGroupRef","shapesGroupRef","setArrowDropdownOpen","setShapesModalOpen","getButtonClassName","getButtonStyle","onCollapse","ToolbarToolButtons","ActionButtons","CollapseTriggerButton","import_react","import_jsx_runtime","PixelSelect","label","value","options","onChange","control","unstyled","classNames","styles","icons","merged","a","chevronIcon","DEFAULT_ICONS","e","v","import_jsx_runtime","ContextualSettingsBar","props","isArrowContext","isFreeDrawContext","isShapeContext","isRulerContext","isTextContext","isNoteContext","selectedItem","selectedShape","selectedArrow","selectedText","activeColor","setActiveColor","strokeWidth","setStrokeWidth","strokeWidthOptions","dashed","setDashed","shapeFilled","setShapeFilled","noteColor","setNoteColor","fontSize","setFontSize","fontSizeOptions","fontWeight","setFontWeight","updateItem","notifyChangeComplete","isEditingLabel","setEditingLabel","strokeColors","orientation","labels","icons","unstyled","classNames","styles","isVertical","shapeInputRef","arrowInputRef","textInputRef","hasShapeLabelMode","hasArrowLabelMode","getToggleBtnStyle","active","bold","getToggleBtnClass","getInputStyle","w","dividerEl","isDashedActive","isFilledActive","isBold","c","selected","PixelSelect","DEFAULT_STROKE_WIDTH_OPTIONS","e","next","DEFAULT_FONT_SIZE_OPTIONS","val","DEFAULT_ICONS","NOTE_COLOR_THEMES","theme","import_react","useToolbarContext","controller","readOnly","activeTool","selectedItem","arrowDropdownOpen","setArrowDropdownOpen","shapesModalOpen","setShapesModalOpen","arrowGroupRef","shapesGroupRef","handleOutsideClick","e","isArrowToolActive","isArrowTool","isShapeToolActive","isArrowContext","isFreeDrawContext","isShapeContext","isRulerContext","isNoteContext","isTextContext","import_jsx_runtime","TualToolbar","controller","position","propOrientation","collapsible","defaultCollapsed","propCollapsed","onCollapsedChange","showCollapseButton","propReadOnly","enabledTools","DEFAULT_ENABLED_TOOLS","customTools","showHistoryControls","showDeleteButton","showClearButton","explicitShowToolLabels","labels","icons","unstyled","classNames","styles","strokeColors","STROKE_COLORS","strokeWidthOptions","fontSizeOptions","className","style","readOnly","orientation","isVertical","showToolLabels","internalCollapsed","setInternalCollapsed","isCollapsed","handleToggleCollapse","next","activeTool","activeShape","selectedItem","isArrowToolActive","isShapeToolActive","isArrowContext","isFreeDrawContext","isShapeContext","isRulerContext","isNoteContext","isTextContext","showSettingsBar","arrowDropdownOpen","setArrowDropdownOpen","shapesModalOpen","setShapesModalOpen","arrowGroupRef","shapesGroupRef","useToolbarContext","arrowOptions","buildArrowOptions","shapeOptions","buildShapeOptions","activeArrowDef","a","arrowGroupLabel","currentArrowIcon","DEFAULT_ICONS","activeShapeDef","s","shapesGroupLabel","currentShapeIcon","activeToolInfo","getActiveToolInfo","stopEvent","e","POSITION_STYLES","ExpandTriggerButton","getToolbarContainerStyle","PrimaryToolbarStrip","active","getToolbarButtonClassName","getToolbarButtonStyle","ContextualSettingsBar","import_react_dom","import_react_leaflet","import_jsx_runtime","LeafletTualDom","props","map","canvasRef","viewport","isReadOnly","isDrawingTool","activeTool","hoverCursor","zIndex","className","style","classNames","styles","handleInteractionPointerDown","handleInteractionPointerMove","noteItems","textItems","selectedId","labels","icons","unstyled","clampOverlaysToViewport","autoMinimizeNotesZoom","autoMinimizeTextZoom","renderNote","renderText","setSelectedId","updateItem","removeItem","notifyChangeComplete","renderToolbar","showToolbar","controller","toolbarPosition","toolbarOrientation","collapsible","defaultCollapsed","collapsed","onCollapsedChange","showCollapseButton","enabledTools","customTools","showHistoryControls","showDeleteButton","showClearButton","showToolLabels","strokeColors","strokeWidthOptions","fontSizeOptions","note","NoteOverlay","geoToScreen","txt","TextOverlay","selectedShape","s","InlineShapeLabelEditor","TualToolbar","import_react","import_react","useTualPainter","map","viewport","canvasRef","arrowItems","shapeItems","freeDrawItems","rulerItems","selectedId","draftShape","draftArrow","draftRuler","draftFreeDrawRef","activeColor","strokeWidth","dashed","shapeFilled","annotationTheme","arrowTheme","isReadOnly","paintCanvas","paintLeafletTual","import_react","useTualKeyboardShortcuts","isReadOnly","selectedId","selectedItem","items","_isEditingLabel","setEditingLabel","deleteSelected","setSelectedId","setActiveTool","setDraftArrow","setDraftShape","setDraftRuler","clearDraftFreeDraw","notifyChangeComplete","handleKeyDown","e","target","item","it","shape","focusInput","input","arrow","key","import_react","useSelectInteractions","map","activeTool","isReadOnly","arrowItems","shapeItems","freeDrawItems","rulerItems","selectedId","setSelectedId","setEditingLabel","updateItem","notifyChangeComplete","hoverCursor","setHoverCursor","container","getLocalPoint","e","rect","handlePointerMove","pt","selectedArrow","a","hitTestArrowHandle","projectArrow","selectedShape","s","hitTestShapeHandle","projectShape","selectedRuler","r","hitTestRulerHandle","projectRuler","i","arrow","hitTestArrow","hitTestShape","fd","hitTestFreeDraw","projectFreeDraw","ruler","hitTestRuler","handlePointerDown","projected","handle","startArrowHandleDrag","startShapeHandleDrag","startRulerHandleDrag","startArrowBodyDrag","shp","startShapeBodyDrag","initialScreenPts","startFreeDrawBodyDrag","startRulerBodyDrag","handleDblClick","focusInput","input","import_react","useDrawingInteractions","map","activeTool","setActiveTool","activeShape","shapeFilled","activeColor","strokeWidth","dashed","noteColor","fontSize","fontWeight","labels","addItem","paintCanvas","draftArrow","setDraftArrow","draftShape","setDraftShape","draftRuler","setDraftRuler","draftFreeDrawRef","rafIdRef","clearDraftFreeDraw","getRelativeScreenPoint","e","rect","mapContainer","pt","geo","screenToGeo","startFreeDrawDrag","startShapeDrag","startRulerDrag","createDraftNote","zoom","createDraftText","arrowStyle","TOOL_TO_ARROW_STYLE","startScreen","geoToScreen","finalScreen","constrainAngleTo45Degrees","buildArrowItem","startArrowDrag","rawPt","prev","import_react","useBlockMapDblClick","map","bindBlockMapDblClick","import_react","useStableItemArray","items","type","prevRef","next","it","item","i","useOutsideTualPointerDown","map","isReadOnly","activeTool","setActiveTool","selectedId","setSelectedId","notifyChangeComplete","handleWindowPointerDown","e","target","useLeafletTualOverlay","props","map","externalController","propReadOnly","propShowToolbar","annotationTheme","arrowTheme","labels","hookOptions","isReadOnly","internalController","useLeafletTual","controller","showToolbar","propCallbacksRef","notifyChangeComplete","targetItem","items","activeTool","setActiveTool","activeShape","shapeFilled","selectedId","setSelectedId","activeColor","strokeWidth","dashed","noteColor","fontSize","fontWeight","addItem","updateItem","removeItem","deleteSelected","useOutsideTualPointerDown","viewport","useLeafletSync","canvasRef","arrowItems","useStableItemArray","freeDrawItems","shapeItems","rulerItems","noteItems","textItems","draftArrow","setDraftArrow","draftShape","setDraftShape","draftRuler","setDraftRuler","draftFreeDrawRef","clearDraftFreeDraw","handleInteractionPointerDown","handleInteractionPointerMove","useDrawingInteractions","paintCanvas","useTualPainter","useTualKeyboardShortcuts","useBlockMapDblClick","hoverCursor","useSelectInteractions","import_jsx_runtime","LeafletTualWithContext","props","map","LeafletTualOverlay","LeafletTual","toolbarPosition","toolbarOrientation","propOrientation","collapsible","defaultCollapsed","collapsed","onCollapsedChange","showCollapseButton","enabledTools","customTools","showHistoryControls","showDeleteButton","showClearButton","showToolLabels","labels","icons","zIndex","unstyled","classNames","styles","strokeColors","strokeWidthOptions","fontSizeOptions","renderToolbar","renderNote","renderText","clampOverlaysToViewport","autoMinimizeNotesZoom","autoMinimizeTextZoom","className","style","overlayState","useLeafletTualOverlay","LeafletTualDom"]}