@eyeon/map 2.0.1 → 2.0.2
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.
- package/README.md +18 -1
- package/dist/assets/MapViewer.css +1 -1
- package/dist/assets/index.css +1 -1
- package/dist/chunks/MapViewer.js +1745 -356
- package/dist/chunks/MapViewer.js.map +1 -1
- package/dist/chunks/stacking.js +1321 -0
- package/dist/chunks/stacking.js.map +1 -0
- package/dist/core/geometry/index.d.ts +41 -4
- package/dist/core/geometry/index.d.ts.map +1 -1
- package/dist/core/hostChrome.d.ts +20 -0
- package/dist/core/hostChrome.d.ts.map +1 -0
- package/dist/core/import/index.d.ts +48 -3
- package/dist/core/import/index.d.ts.map +1 -1
- package/dist/core/import/svgStyle.d.ts +21 -0
- package/dist/core/import/svgStyle.d.ts.map +1 -0
- package/dist/core/import/svgTransform.d.ts +49 -0
- package/dist/core/import/svgTransform.d.ts.map +1 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +207 -266
- package/dist/core/index.js.map +1 -1
- package/dist/core/layerStyles.d.ts +28 -0
- package/dist/core/layerStyles.d.ts.map +1 -0
- package/dist/core/publish/index.d.ts +8 -2
- package/dist/core/publish/index.d.ts.map +1 -1
- package/dist/core/routing/graph-tools.d.ts +5 -1
- package/dist/core/routing/graph-tools.d.ts.map +1 -1
- package/dist/core/stacking.d.ts +61 -0
- package/dist/core/stacking.d.ts.map +1 -0
- package/dist/core/types.d.ts +27 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/editor/MapEditor.d.ts +28 -16
- package/dist/editor/MapEditor.d.ts.map +1 -1
- package/dist/editor/canvas/EditorCanvas.d.ts +15 -3
- package/dist/editor/canvas/EditorCanvas.d.ts.map +1 -1
- package/dist/editor/canvas/coords.d.ts +21 -0
- package/dist/editor/canvas/coords.d.ts.map +1 -0
- package/dist/editor/draftOps.d.ts +19 -0
- package/dist/editor/draftOps.d.ts.map +1 -0
- package/dist/editor/geometryEdit.d.ts +34 -0
- package/dist/editor/geometryEdit.d.ts.map +1 -0
- package/dist/editor/index.css +1281 -145
- package/dist/editor/index.d.ts +8 -2
- package/dist/editor/index.d.ts.map +1 -1
- package/dist/editor/index.js +2293 -585
- package/dist/editor/index.js.map +1 -1
- package/dist/editor/labels.d.ts +5 -0
- package/dist/editor/labels.d.ts.map +1 -0
- package/dist/editor/panels/FloorsPanel.d.ts +60 -0
- package/dist/editor/panels/FloorsPanel.d.ts.map +1 -0
- package/dist/editor/panels/ImportReviewPanel.d.ts +22 -0
- package/dist/editor/panels/ImportReviewPanel.d.ts.map +1 -0
- package/dist/editor/panels/Inspector.d.ts +4 -2
- package/dist/editor/panels/Inspector.d.ts.map +1 -1
- package/dist/editor/panels/LeftRail.d.ts +19 -6
- package/dist/editor/panels/LeftRail.d.ts.map +1 -1
- package/dist/editor/panels/PreviewOverlay.d.ts +11 -2
- package/dist/editor/panels/PreviewOverlay.d.ts.map +1 -1
- package/dist/editor/portalSurface.d.ts +11 -0
- package/dist/editor/portalSurface.d.ts.map +1 -0
- package/dist/editor/previewDocument.d.ts +9 -0
- package/dist/editor/previewDocument.d.ts.map +1 -0
- package/dist/editor/tools.d.ts +20 -0
- package/dist/editor/tools.d.ts.map +1 -0
- package/dist/test-maps/shops-at-south-town/BASE - Shops At South Town.ai +26780 -26
- package/dist/test-maps/shops-at-south-town/LF - Shops At South Town.ai +4487 -2
- package/dist/test-maps/shops-at-south-town/SVG/BASE - Shops At South Town.svg +567 -0
- package/dist/test-maps/shops-at-south-town/SVG/LF - Shops At South Town.svg +238 -0
- package/dist/test-maps/shops-at-south-town/SVG/UF - Shops At South Town.svg +276 -0
- package/dist/test-maps/shops-at-south-town/UF - Shops At South Town.ai +4228 -1
- package/dist/viewer/MapViewer.d.ts +14 -3
- package/dist/viewer/MapViewer.d.ts.map +1 -1
- package/dist/viewer/camera.d.ts +34 -0
- package/dist/viewer/camera.d.ts.map +1 -0
- package/dist/viewer/components/CameraRig.d.ts +18 -0
- package/dist/viewer/components/CameraRig.d.ts.map +1 -0
- package/dist/viewer/components/LevelMeshes.d.ts +6 -1
- package/dist/viewer/components/LevelMeshes.d.ts.map +1 -1
- package/dist/viewer/components/MapScene.d.ts +6 -1
- package/dist/viewer/components/MapScene.d.ts.map +1 -1
- package/dist/viewer/components/SvgVectorLayer.d.ts +18 -0
- package/dist/viewer/components/SvgVectorLayer.d.ts.map +1 -0
- package/dist/viewer/index.css +124 -35
- package/dist/viewer/index.d.ts +4 -0
- package/dist/viewer/index.d.ts.map +1 -1
- package/dist/viewer/index.js +9 -4
- package/dist/viewer/index.js.map +1 -1
- package/dist/viewer/ui/MapControls.d.ts +14 -0
- package/dist/viewer/ui/MapControls.d.ts.map +1 -0
- package/dist/viewer/ui/RuntimeChrome.d.ts +3 -3
- package/dist/viewer/ui/RuntimeChrome.d.ts.map +1 -1
- package/package.json +7 -3
- package/dist/chunks/graph-tools.js +0 -153
- package/dist/chunks/graph-tools.js.map +0 -1
- package/dist/chunks/pathfinding.js +0 -343
- package/dist/chunks/pathfinding.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MapViewer.js","sources":["../../src/viewer/components/LevelMeshes.tsx","../../src/viewer/components/RouteLine.tsx","../../src/viewer/components/MapScene.tsx","../../src/viewer/ui/RuntimeChrome.tsx","../../src/viewer/MapViewer.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\nimport * as THREE from 'three';\nimport type { PublishedLevel, ThemeDefaults, ShapeKind } from '../../core';\n\nfunction kindColor(kind: ShapeKind, theme: ThemeDefaults, fill?: string): string {\n if (fill) return fill;\n switch (kind) {\n case 'unit':\n return theme.STORE_DEFAULT_COLOR;\n case 'walkable':\n return theme.WALKABLE_COLOR;\n case 'wall':\n case 'boundary':\n return theme.WALL_COLOR;\n case 'parking_zone':\n return theme.PARKING_ZONE_COLOR;\n case 'green_area':\n return theme.GREEN_AREA_COLOR;\n case 'water':\n return theme.WATER_COLOR;\n case 'floorplate':\n return theme.BASE_COLOR;\n case 'void':\n return '#00000000';\n default:\n return '#e2e8f0';\n }\n}\n\nfunction polygonShape(points: { x: number; y: number }[]): THREE.Shape | null {\n if (points.length < 3) return null;\n const shape = new THREE.Shape();\n shape.moveTo(points[0].x, points[0].y);\n for (let i = 1; i < points.length; i++) {\n shape.lineTo(points[i].x, points[i].y);\n }\n shape.closePath();\n return shape;\n}\n\nexport interface LevelMeshesProps {\n level: PublishedLevel;\n theme: ThemeDefaults;\n is3d: boolean;\n selectedRetailerId?: number | null;\n onSelectShape?: (shapeId: number) => void;\n}\n\nexport function LevelMeshes({\n level,\n theme,\n is3d,\n selectedRetailerId,\n onSelectShape,\n}: LevelMeshesProps) {\n const meshes = useMemo(() => {\n return level.shapes\n .filter((s) => s.kind !== 'void')\n .map((shape) => {\n const polys = shape.geometry.polygons;\n const threeShapes = polys\n .map(polygonShape)\n .filter((s): s is THREE.Shape => s != null);\n if (threeShapes.length === 0) return null;\n\n const selected =\n selectedRetailerId != null &&\n shape.assignment?.retailerId === selectedRetailerId;\n const color = selected\n ? theme.ACCENT_COLOR\n : kindColor(shape.kind, theme, shape.style.fill);\n const extrude =\n is3d && (shape.kind === 'unit' || shape.kind === 'wall')\n ? shape.style.extrudeHeight ??\n (shape.kind === 'unit' ? theme.STORE_HEIGHT : 2)\n : 0;\n\n return { shape, threeShapes, color, extrude, selected };\n })\n .filter(Boolean) as Array<{\n shape: (typeof level.shapes)[number];\n threeShapes: THREE.Shape[];\n color: string;\n extrude: number;\n selected: boolean;\n }>;\n }, [level, theme, is3d, selectedRetailerId]);\n\n return (\n <group>\n {meshes.map(({ shape, threeShapes, color, extrude, selected }) => (\n <group key={shape.id}>\n {threeShapes.map((geoShape, idx) => (\n <mesh\n key={`${shape.id}-${idx}`}\n position={[0, 0, shape.zIndex * 0.01]}\n onClick={(e) => {\n e.stopPropagation();\n if (\n shape.kind === 'unit' ||\n shape.kind === 'amenity' ||\n shape.kind === 'kiosk_screen' ||\n shape.kind === 'entrance'\n ) {\n onSelectShape?.(shape.id);\n }\n }}\n >\n {extrude > 0 ? (\n <extrudeGeometry\n args={[\n geoShape,\n { depth: extrude, bevelEnabled: false },\n ]}\n />\n ) : (\n <shapeGeometry args={[geoShape]} />\n )}\n <meshBasicMaterial\n color={color}\n transparent={shape.style.transparent || shape.kind === 'amenity'}\n opacity={shape.style.opacity ?? (shape.kind === 'amenity' ? 0.01 : 1)}\n side={THREE.DoubleSide}\n />\n {selected && (\n <lineSegments>\n <edgesGeometry\n args={[\n extrude > 0\n ? new THREE.ExtrudeGeometry(geoShape, {\n depth: extrude,\n bevelEnabled: false,\n })\n : new THREE.ShapeGeometry(geoShape),\n ]}\n />\n <lineBasicMaterial color={theme.ACCENT_COLOR} />\n </lineSegments>\n )}\n </mesh>\n ))}\n </group>\n ))}\n </group>\n );\n}\n","import React, { useMemo } from 'react';\nimport * as THREE from 'three';\nimport type { PathResult } from '../../core';\n\nexport function RouteLine({\n route,\n activeLevelId,\n color,\n}: {\n route: PathResult;\n activeLevelId: number | null;\n color: string;\n}) {\n const points = useMemo(() => {\n return route.points\n .filter((p) => activeLevelId == null || p.levelId === activeLevelId)\n .map((p) => new THREE.Vector3(p.x, p.y, 2));\n }, [route, activeLevelId]);\n\n if (points.length < 2) return null;\n\n const curve = new THREE.CatmullRomCurve3(points);\n return (\n <mesh>\n <tubeGeometry args={[curve, Math.max(points.length * 4, 8), 1.5, 8, false]} />\n <meshBasicMaterial color={color} />\n </mesh>\n );\n}\n","import React, { useMemo } from 'react';\nimport { Canvas } from '@react-three/fiber';\nimport { OrthographicCamera, OrbitControls } from '@react-three/drei';\nimport type { PathResult, PublishedDocument, ThemeDefaults } from '../../core';\nimport { LevelMeshes } from './LevelMeshes';\nimport { RouteLine } from './RouteLine';\n\nexport interface MapSceneProps {\n doc: PublishedDocument;\n theme: ThemeDefaults;\n activeLevelId: number | null;\n route: PathResult | null;\n selectedRetailerId?: number | null;\n onSelectShape?: (shapeId: number, levelId: number) => void;\n}\n\nexport function MapScene({\n doc,\n theme,\n activeLevelId,\n route,\n selectedRetailerId,\n onSelectShape,\n}: MapSceneProps) {\n const is3d = theme.MAP_STYLE === '3D';\n\n const bounds = useMemo(() => {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (const level of doc.levels) {\n if (activeLevelId != null && level.id !== activeLevelId && level.kind !== 'outdoor') {\n continue;\n }\n for (const shape of level.shapes) {\n minX = Math.min(minX, shape.bbox.minX);\n minY = Math.min(minY, shape.bbox.minY);\n maxX = Math.max(maxX, shape.bbox.maxX);\n maxY = Math.max(maxY, shape.bbox.maxY);\n }\n }\n if (!Number.isFinite(minX)) {\n return { cx: 0, cy: 0, size: 500 };\n }\n return {\n cx: (minX + maxX) / 2,\n cy: (minY + maxY) / 2,\n size: Math.max(maxX - minX, maxY - minY, 100),\n };\n }, [doc, activeLevelId]);\n\n const zoom = 800 / bounds.size;\n\n return (\n <Canvas\n style={{ width: '100%', height: '100%', background: theme.MAP_BACKGROUND_COLOR }}\n orthographic={!is3d}\n camera={\n is3d\n ? { position: [bounds.cx, bounds.cy - bounds.size, bounds.size], fov: 50, near: 1, far: 10000 }\n : undefined\n }\n >\n {!is3d && (\n <OrthographicCamera\n makeDefault\n position={[bounds.cx, bounds.cy, 500]}\n zoom={zoom}\n near={0.1}\n far={5000}\n />\n )}\n <ambientLight intensity={0.85} />\n <directionalLight position={[200, 400, 200]} intensity={0.4} />\n\n {doc.levels.map((level) => {\n const visible =\n level.kind === 'outdoor' ||\n activeLevelId == null ||\n level.id === activeLevelId;\n if (!visible) return null;\n return (\n <LevelMeshes\n key={level.id}\n level={level}\n theme={theme}\n is3d={is3d}\n selectedRetailerId={selectedRetailerId}\n onSelectShape={(shapeId) => onSelectShape?.(shapeId, level.id)}\n />\n );\n })}\n\n {route && <RouteLine route={route} activeLevelId={activeLevelId} color={theme.ACCENT_COLOR} />}\n\n <OrbitControls\n enableRotate={is3d}\n enablePan\n target={[bounds.cx, bounds.cy, 0]}\n maxDistance={theme.CAMERA_MAX_DISTANCE}\n minDistance={theme.CAMERA_MIN_DISTANCE}\n />\n </Canvas>\n );\n}\n","import React, { useMemo, useState } from 'react';\nimport type {\n CmAmenityCatalogItem,\n PathResult,\n PublishedDocument,\n} from '../../core';\n\nexport interface RuntimeChromeProps {\n doc: PublishedDocument;\n amenities: CmAmenityCatalogItem[];\n searchOpen: boolean;\n onSearchOpenChange: (open: boolean) => void;\n activeLevelId: number | null;\n onActiveLevelChange: (id: number) => void;\n fromAnchorId: number | null;\n toAnchorId: number | null;\n onFromChange: (id: number | null) => void;\n onToChange: (id: number | null) => void;\n accessibleOnly: boolean;\n onAccessibleOnlyChange: (v: boolean) => void;\n route: PathResult | null;\n}\n\ninterface ListItem {\n id: string;\n label: string;\n group: string;\n anchorId: number | null;\n levelId: number;\n kind: 'store' | 'amenity';\n}\n\nexport function RuntimeChrome({\n doc,\n amenities,\n searchOpen,\n onSearchOpenChange,\n activeLevelId,\n onActiveLevelChange,\n fromAnchorId,\n toAnchorId,\n onFromChange,\n onToChange,\n accessibleOnly,\n onAccessibleOnlyChange,\n route,\n}: RuntimeChromeProps) {\n const [query, setQuery] = useState('');\n const [selectedItem, setSelectedItem] = useState<ListItem | null>(null);\n\n const items = useMemo(() => {\n const list: ListItem[] = [];\n for (const level of doc.levels) {\n for (const shape of level.shapes) {\n const anchor = level.anchors.find((a) => a.shapeId === shape.id) ?? null;\n if (shape.kind === 'unit' && shape.assignment?.retailerId) {\n list.push({\n id: `store-${shape.id}`,\n label:\n shape.assignment.customLabel ||\n shape.label.text ||\n shape.key,\n group: level.name,\n anchorId: anchor?.id ?? null,\n levelId: level.id,\n kind: 'store',\n });\n }\n if (shape.kind === 'amenity' && shape.assignment?.amenityId) {\n const amenity = amenities.find((a) => a.id === shape.assignment!.amenityId);\n list.push({\n id: `amenity-${shape.id}`,\n label: amenity?.name ?? shape.key,\n group: 'Amenities',\n anchorId: anchor?.id ?? null,\n levelId: level.id,\n kind: 'amenity',\n });\n }\n }\n }\n return list;\n }, [doc, amenities]);\n\n const filtered = useMemo(() => {\n const q = query.trim().toLowerCase();\n if (!q) return items;\n return items.filter((i) => i.label.toLowerCase().includes(q));\n }, [items, query]);\n\n const grouped = useMemo(() => {\n const map = new Map<string, ListItem[]>();\n for (const item of filtered) {\n const arr = map.get(item.group) ?? [];\n arr.push(item);\n map.set(item.group, arr);\n }\n return Array.from(map.entries());\n }, [filtered]);\n\n const anchorOptions = items.filter((i) => i.anchorId != null);\n\n return (\n <div className=\"eyeon-map-chrome\">\n <div className=\"eyeon-map-chrome__top\">\n <button\n type=\"button\"\n className=\"eyeon-map-chrome__search-toggle\"\n onClick={() => onSearchOpenChange(!searchOpen)}\n aria-expanded={searchOpen}\n >\n {searchOpen ? 'Close' : 'Search'}\n </button>\n\n <div className=\"eyeon-map-chrome__amenities\">\n {amenities.map((a) => (\n <button\n key={a.id}\n type=\"button\"\n className=\"eyeon-map-chrome__amenity\"\n title={a.name}\n onClick={() => {\n const match = items.find(\n (i) => i.kind === 'amenity' && i.label === a.name && i.anchorId != null,\n );\n if (match?.anchorId != null) {\n onToChange(match.anchorId);\n onActiveLevelChange(match.levelId);\n }\n }}\n >\n {a.builtinIcon ? (\n <span className=\"eyeon-map-chrome__amenity-icon\">{a.builtinIcon}</span>\n ) : (\n <span className=\"eyeon-map-chrome__amenity-label\">{a.name.slice(0, 2)}</span>\n )}\n </button>\n ))}\n </div>\n </div>\n\n {searchOpen && (\n <div className=\"eyeon-map-chrome__panel\">\n <input\n className=\"eyeon-map-chrome__search-input\"\n placeholder=\"Search stores & amenities\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n autoFocus\n />\n\n <div className=\"eyeon-map-chrome__groups\">\n {grouped.map(([group, groupItems]) => (\n <div key={group} className=\"eyeon-map-chrome__group\">\n <div className=\"eyeon-map-chrome__group-title\">{group}</div>\n {groupItems.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n className=\"eyeon-map-chrome__item\"\n onClick={() => {\n setSelectedItem(item);\n if (item.anchorId != null) {\n onToChange(item.anchorId);\n onActiveLevelChange(item.levelId);\n }\n }}\n >\n {item.label}\n </button>\n ))}\n </div>\n ))}\n </div>\n\n {selectedItem && (\n <div className=\"eyeon-map-chrome__detail\">\n <div className=\"eyeon-map-chrome__detail-title\">{selectedItem.label}</div>\n <div className=\"eyeon-map-chrome__detail-meta\">{selectedItem.group}</div>\n </div>\n )}\n\n <div className=\"eyeon-map-chrome__route\">\n <label>\n From\n <select\n value={fromAnchorId ?? ''}\n onChange={(e) =>\n onFromChange(e.target.value ? Number(e.target.value) : null)\n }\n >\n <option value=\"\">Select start</option>\n {anchorOptions.map((i) => (\n <option key={i.id} value={i.anchorId!}>\n {i.label}\n </option>\n ))}\n </select>\n </label>\n <label>\n To\n <select\n value={toAnchorId ?? ''}\n onChange={(e) =>\n onToChange(e.target.value ? Number(e.target.value) : null)\n }\n >\n <option value=\"\">Select destination</option>\n {anchorOptions.map((i) => (\n <option key={i.id} value={i.anchorId!}>\n {i.label}\n </option>\n ))}\n </select>\n </label>\n <label className=\"eyeon-map-chrome__accessible\">\n <input\n type=\"checkbox\"\n checked={accessibleOnly}\n onChange={(e) => onAccessibleOnlyChange(e.target.checked)}\n />\n Accessible route\n </label>\n {route && (\n <div className=\"eyeon-map-chrome__route-meta\">\n {route.levelChanges.length > 0\n ? `${route.levelChanges.length} level change(s)`\n : 'Same level'}\n </div>\n )}\n </div>\n </div>\n )}\n\n <div className=\"eyeon-map-chrome__floors\">\n {doc.levels\n .filter((l) => l.kind === 'floor')\n .map((l) => (\n <button\n key={l.id}\n type=\"button\"\n className={\n l.id === activeLevelId\n ? 'eyeon-map-chrome__floor is-active'\n : 'eyeon-map-chrome__floor'\n }\n onClick={() => onActiveLevelChange(l.id)}\n >\n {l.name}\n </button>\n ))}\n </div>\n </div>\n );\n}\n","import React, { Suspense, useEffect, useMemo, useState } from 'react';\nimport type {\n CmAmenityCatalogItem,\n PathResult,\n PublishedDocument,\n ThemeDefaults,\n} from '../core';\nimport { compileGraph, findPath, DEFAULT_THEME } from '../core';\nimport { MapScene } from './components/MapScene';\nimport { RuntimeChrome } from './ui/RuntimeChrome';\nimport './viewer.css';\n\nexport interface MapViewerProps {\n /** Published (or draft) document. If omitted, fetched from webApiURI. */\n document?: PublishedDocument | null;\n webApiURI?: string;\n /** Prefer fetching /v1/map/document */\n centerId?: number;\n role?: 'WP_SITE' | 'DISPLAY_APP' | 'PORTAL_PREVIEW' | 'DEMO';\n kioskId?: number | null;\n selectedRetailerId?: number | null;\n imageProxyUrl?: string;\n themeOverrides?: Partial<ThemeDefaults>;\n onExtractedAmenities?: (codes: string[]) => void;\n onSelectShape?: (shapeId: number) => void;\n createRouteRef?: React.MutableRefObject<{\n createRouteToStore: (retailerId: number) => void;\n createRouteToAmenity: (amenityCode: string) => void;\n clearRoute: () => void;\n } | null>;\n className?: string;\n style?: React.CSSProperties;\n}\n\nasync function fetchDocument(webApiURI: string): Promise<PublishedDocument> {\n const base = webApiURI.replace(/\\/$/, '');\n const res = await fetch(`${base}/v1/map/document`, { credentials: 'include' });\n if (!res.ok) {\n throw new Error(`Failed to load map document (${res.status})`);\n }\n return res.json();\n}\n\nexport function MapViewer(props: MapViewerProps) {\n const {\n document: documentProp,\n webApiURI,\n role = 'WP_SITE',\n kioskId = null,\n selectedRetailerId = null,\n themeOverrides,\n onExtractedAmenities,\n createRouteRef,\n className,\n style,\n } = props;\n\n const [doc, setDoc] = useState<PublishedDocument | null>(documentProp ?? null);\n const [error, setError] = useState<string | null>(null);\n const [route, setRoute] = useState<PathResult | null>(null);\n const [fromAnchorId, setFromAnchorId] = useState<number | null>(null);\n const [toAnchorId, setToAnchorId] = useState<number | null>(null);\n const [accessibleOnly, setAccessibleOnly] = useState(false);\n const [activeLevelId, setActiveLevelId] = useState<number | null>(null);\n const [searchOpen, setSearchOpen] = useState(false);\n\n useEffect(() => {\n if (documentProp) {\n setDoc(documentProp);\n return;\n }\n if (!webApiURI) return;\n let cancelled = false;\n fetchDocument(webApiURI)\n .then((d) => {\n if (!cancelled) setDoc(d);\n })\n .catch((e) => {\n if (!cancelled) setError(e instanceof Error ? e.message : String(e));\n });\n return () => {\n cancelled = true;\n };\n }, [documentProp, webApiURI]);\n\n useEffect(() => {\n if (!doc) return;\n if (activeLevelId == null && doc.levels.length > 0) {\n setActiveLevelId(doc.levels[0].id);\n }\n const codes = new Set<string>();\n for (const level of doc.levels) {\n for (const shape of level.shapes) {\n if (shape.kind === 'amenity' && shape.assignment?.amenityId != null) {\n const amenity = doc.amenities.find((a) => a.id === shape.assignment!.amenityId);\n if (amenity) codes.add(amenity.code);\n }\n }\n }\n onExtractedAmenities?.(Array.from(codes));\n }, [doc, activeLevelId, onExtractedAmenities]);\n\n // Prefill \"from\" for kiosk role\n useEffect(() => {\n if (!doc || role !== 'DISPLAY_APP' || kioskId == null) return;\n for (const level of doc.levels) {\n for (const shape of level.shapes) {\n if (\n shape.kind === 'kiosk_screen' &&\n shape.assignment?.kioskId === kioskId\n ) {\n const anchor = level.anchors.find((a) => a.shapeId === shape.id);\n if (anchor) setFromAnchorId(anchor.id);\n }\n }\n }\n }, [doc, role, kioskId]);\n\n const compiled = useMemo(() => {\n if (!doc) return null;\n return compileGraph(\n doc.graph.nodes.map((n) => ({\n id: n.id,\n levelId: n.levelId,\n shapeId: n.shapeId,\n kind: n.kind,\n x: n.x,\n y: n.y,\n connectorId: n.connectorId,\n })),\n doc.graph.edges.map((e) => ({\n id: e.id,\n mapId: doc.mapId,\n fromAnchorId: e.from,\n toAnchorId: e.to,\n weight: e.weight,\n directed: e.directed,\n accessible: e.accessible,\n kind: e.kind,\n })),\n doc.connectors,\n );\n }, [doc]);\n\n const runRoute = (fromId: number | null, toId: number | null) => {\n if (!compiled || fromId == null || toId == null) {\n setRoute(null);\n return;\n }\n const result = findPath(compiled, fromId, toId, { accessibleOnly });\n setRoute(result);\n };\n\n useEffect(() => {\n runRoute(fromAnchorId, toAnchorId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fromAnchorId, toAnchorId, accessibleOnly, compiled]);\n\n useEffect(() => {\n if (!createRouteRef || !doc) return;\n createRouteRef.current = {\n createRouteToStore(retailerId: number) {\n for (const level of doc.levels) {\n for (const shape of level.shapes) {\n if (shape.assignment?.retailerId === retailerId) {\n const anchor = level.anchors.find((a) => a.shapeId === shape.id);\n if (anchor) {\n setToAnchorId(anchor.id);\n setActiveLevelId(level.id);\n }\n }\n }\n }\n },\n createRouteToAmenity(amenityCode: string) {\n const amenity = doc.amenities.find((a) => a.code === amenityCode);\n if (!amenity) return;\n for (const level of doc.levels) {\n for (const shape of level.shapes) {\n if (shape.assignment?.amenityId === amenity.id) {\n const anchor = level.anchors.find((a) => a.shapeId === shape.id);\n if (anchor) {\n setToAnchorId(anchor.id);\n setActiveLevelId(level.id);\n return;\n }\n }\n }\n }\n },\n clearRoute() {\n setToAnchorId(null);\n setRoute(null);\n },\n };\n }, [createRouteRef, doc]);\n\n const theme: ThemeDefaults = {\n ...DEFAULT_THEME,\n ...(doc?.theme ?? {}),\n ...(themeOverrides ?? {}),\n };\n\n if (error) {\n return (\n <div className={`eyeon-map-viewer eyeon-map-viewer--error ${className ?? ''}`} style={style}>\n <div className=\"eyeon-map-viewer__error\">{error}</div>\n </div>\n );\n }\n\n if (!doc) {\n return (\n <div className={`eyeon-map-viewer eyeon-map-viewer--loading ${className ?? ''}`} style={style}>\n <div className=\"eyeon-map-viewer__loading\">Loading map…</div>\n </div>\n );\n }\n\n const amenitiesOnMap: CmAmenityCatalogItem[] = doc.amenities.filter((a) =>\n doc.levels.some((l) =>\n l.shapes.some((s) => s.assignment?.amenityId === a.id),\n ),\n );\n\n return (\n <div\n className={`eyeon-map-viewer eyeon-map-viewer--${role} ${className ?? ''}`}\n style={\n {\n ...style,\n ['--map-accent' as string]: theme.ACCENT_COLOR,\n ['--map-bg' as string]: theme.MAP_BACKGROUND_COLOR,\n } as React.CSSProperties\n }\n >\n {role !== 'DISPLAY_APP' && (\n <RuntimeChrome\n doc={doc}\n amenities={amenitiesOnMap}\n searchOpen={searchOpen}\n onSearchOpenChange={setSearchOpen}\n activeLevelId={activeLevelId}\n onActiveLevelChange={setActiveLevelId}\n fromAnchorId={fromAnchorId}\n toAnchorId={toAnchorId}\n onFromChange={setFromAnchorId}\n onToChange={setToAnchorId}\n accessibleOnly={accessibleOnly}\n onAccessibleOnlyChange={setAccessibleOnly}\n route={route}\n />\n )}\n\n <div className=\"eyeon-map-viewer__canvas\">\n <Suspense fallback={null}>\n <MapScene\n doc={doc}\n theme={theme}\n activeLevelId={activeLevelId}\n route={route}\n selectedRetailerId={selectedRetailerId}\n onSelectShape={(shapeId, levelId) => {\n setActiveLevelId(levelId);\n const level = doc.levels.find((l) => l.id === levelId);\n const anchor = level?.anchors.find((a) => a.shapeId === shapeId);\n if (anchor) setToAnchorId(anchor.id);\n props.onSelectShape?.(shapeId);\n }}\n />\n </Suspense>\n </div>\n </div>\n );\n}\n\nexport default MapViewer;\n"],"names":["kindColor","kind","theme","fill","polygonShape","points","shape","THREE","i","LevelMeshes","level","is3d","selectedRetailerId","onSelectShape","meshes","useMemo","s","threeShapes","selected","_a","color","extrude","jsx","geoShape","idx","jsxs","e","RouteLine","route","activeLevelId","p","curve","MapScene","doc","bounds","minX","minY","maxX","maxY","zoom","Canvas","OrthographicCamera","shapeId","OrbitControls","RuntimeChrome","amenities","searchOpen","onSearchOpenChange","onActiveLevelChange","fromAnchorId","toAnchorId","onFromChange","onToChange","accessibleOnly","onAccessibleOnlyChange","query","setQuery","useState","selectedItem","setSelectedItem","items","list","anchor","a","_b","amenity","filtered","q","grouped","map","item","arr","anchorOptions","match","group","groupItems","l","fetchDocument","webApiURI","base","res","MapViewer","props","documentProp","role","kioskId","themeOverrides","onExtractedAmenities","createRouteRef","className","style","setDoc","error","setError","setRoute","setFromAnchorId","setToAnchorId","setAccessibleOnly","setActiveLevelId","setSearchOpen","useEffect","cancelled","d","codes","compiled","compileGraph","n","runRoute","fromId","toId","result","findPath","retailerId","amenityCode","DEFAULT_THEME","amenitiesOnMap","Suspense","levelId"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MapViewer.js","sources":["../../src/viewer/components/LevelMeshes.tsx","../../src/viewer/components/RouteLine.tsx","../../../../node_modules/three/examples/jsm/loaders/SVGLoader.js","../../src/viewer/components/SvgVectorLayer.tsx","../../src/viewer/camera.ts","../../src/viewer/components/CameraRig.tsx","../../src/viewer/components/MapScene.tsx","../../src/viewer/ui/RuntimeChrome.tsx","../../src/viewer/ui/MapControls.tsx","../../src/viewer/MapViewer.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\nimport * as THREE from 'three';\nimport type { PublishedLevel, ThemeDefaults, ShapeKind } from '../../core';\nimport { INTERACTIVE_SHAPE_KINDS } from '../../core';\n\nfunction kindColor(kind: ShapeKind, theme: ThemeDefaults, fill?: string): string {\n if (fill) return fill;\n switch (kind) {\n case 'unit':\n return theme.STORE_DEFAULT_COLOR;\n case 'walkable':\n return theme.WALKABLE_COLOR;\n case 'wall':\n case 'boundary':\n return theme.WALL_COLOR;\n case 'parking_zone':\n return theme.PARKING_ZONE_COLOR;\n case 'green_area':\n return theme.GREEN_AREA_COLOR;\n case 'water':\n return theme.WATER_COLOR;\n case 'floorplate':\n return theme.BASE_COLOR;\n case 'void':\n return '#00000000';\n default:\n return '#e2e8f0';\n }\n}\n\nfunction polygonShape(points: { x: number; y: number }[]): THREE.Shape | null {\n if (points.length < 3) return null;\n const shape = new THREE.Shape();\n shape.moveTo(points[0].x, points[0].y);\n for (let i = 1; i < points.length; i++) {\n shape.lineTo(points[i].x, points[i].y);\n }\n shape.closePath();\n return shape;\n}\n\nexport interface LevelMeshesProps {\n level: PublishedLevel;\n theme: ThemeDefaults;\n is3d: boolean;\n selectedRetailerId?: number | null;\n onSelectShape?: (shapeId: number) => void;\n /**\n * When true (outdoor with live SVG), only interactive shapes are drawn —\n * decoration comes from SvgVectorLayer.\n */\n interactiveOnly?: boolean;\n}\n\nexport function LevelMeshes({\n level,\n theme,\n is3d,\n selectedRetailerId,\n onSelectShape,\n interactiveOnly = false,\n}: LevelMeshesProps) {\n const meshes = useMemo(() => {\n return level.shapes\n .filter((s) => s.kind !== 'void')\n .filter((s) => !interactiveOnly || INTERACTIVE_SHAPE_KINDS.includes(s.kind))\n .filter((s) => !s.orphanedAt)\n .map((shape) => {\n const polys = shape.geometry.polygons;\n const threeShapes = polys\n .map(polygonShape)\n .filter((s): s is THREE.Shape => s != null);\n if (threeShapes.length === 0) return null;\n\n const selected =\n selectedRetailerId != null &&\n shape.assignment?.retailerId === selectedRetailerId;\n const color = selected\n ? theme.ACCENT_COLOR\n : kindColor(shape.kind, theme, shape.style.fill);\n const extrude =\n is3d && (shape.kind === 'unit' || shape.kind === 'wall')\n ? shape.style.extrudeHeight ??\n (shape.kind === 'unit' ? theme.STORE_HEIGHT : 2)\n : 0;\n\n return { shape, threeShapes, color, extrude, selected };\n })\n .filter(Boolean) as Array<{\n shape: (typeof level.shapes)[number];\n threeShapes: THREE.Shape[];\n color: string;\n extrude: number;\n selected: boolean;\n }>;\n }, [level, theme, is3d, selectedRetailerId, interactiveOnly]);\n\n return (\n <group>\n {meshes.map(({ shape, threeShapes, color, extrude, selected }) => (\n <group key={shape.id}>\n {threeShapes.map((geoShape, idx) => (\n <mesh\n key={`${shape.id}-${idx}`}\n position={[0, 0, shape.zIndex * 0.01]}\n onClick={(e) => {\n e.stopPropagation();\n if (\n shape.kind === 'unit' ||\n shape.kind === 'amenity' ||\n shape.kind === 'kiosk_screen' ||\n shape.kind === 'entrance' ||\n shape.kind === 'parking_zone'\n ) {\n onSelectShape?.(shape.id);\n }\n }}\n >\n {extrude > 0 ? (\n <extrudeGeometry\n args={[\n geoShape,\n { depth: extrude, bevelEnabled: false },\n ]}\n />\n ) : (\n <shapeGeometry args={[geoShape]} />\n )}\n <meshBasicMaterial\n color={color}\n transparent={shape.style.transparent || shape.kind === 'amenity'}\n opacity={shape.style.opacity ?? (shape.kind === 'amenity' ? 0.01 : 1)}\n side={THREE.DoubleSide}\n />\n {selected && (\n <lineSegments>\n <edgesGeometry\n args={[\n extrude > 0\n ? new THREE.ExtrudeGeometry(geoShape, {\n depth: extrude,\n bevelEnabled: false,\n })\n : new THREE.ShapeGeometry(geoShape),\n ]}\n />\n <lineBasicMaterial color={theme.ACCENT_COLOR} />\n </lineSegments>\n )}\n </mesh>\n ))}\n </group>\n ))}\n </group>\n );\n}\n","import React, { useMemo } from 'react';\nimport * as THREE from 'three';\nimport type { PathResult } from '../../core';\n\nexport function RouteLine({\n route,\n activeLevelId,\n color,\n}: {\n route: PathResult;\n activeLevelId: number | null;\n color: string;\n}) {\n const points = useMemo(() => {\n return route.points\n .filter((p) => activeLevelId == null || p.levelId === activeLevelId)\n .map((p) => new THREE.Vector3(p.x, p.y, 2));\n }, [route, activeLevelId]);\n\n if (points.length < 2) return null;\n\n const curve = new THREE.CatmullRomCurve3(points);\n return (\n <mesh>\n <tubeGeometry args={[curve, Math.max(points.length * 4, 8), 1.5, 8, false]} />\n <meshBasicMaterial color={color} />\n </mesh>\n );\n}\n","import {\n\tBox2,\n\tBufferGeometry,\n\tFileLoader,\n\tFloat32BufferAttribute,\n\tLoader,\n\tMatrix3,\n\tPath,\n\tShape,\n\tShapePath,\n\tShapeUtils,\n\tSRGBColorSpace,\n\tVector2,\n\tVector3\n} from 'three';\n\nconst COLOR_SPACE_SVG = SRGBColorSpace;\n\n/**\n * A loader for the SVG format.\n *\n * Scalable Vector Graphics is an XML-based vector image format for two-dimensional graphics\n * with support for interactivity and animation.\n *\n * ```js\n * const loader = new SVGLoader();\n * const data = await loader.loadAsync( 'data/svgSample.svg' );\n *\n * const paths = data.paths;\n * const group = new THREE.Group();\n *\n * for ( let i = 0; i < paths.length; i ++ ) {\n *\n * \tconst path = paths[ i ];\n * \tconst material = new THREE.MeshBasicMaterial( {\n * \t\tcolor: path.color,\n * \t\tside: THREE.DoubleSide,\n * \t\tdepthWrite: false\n * \t} );\n *\n * \tconst shapes = SVGLoader.createShapes( path );\n *\n * \tfor ( let j = 0; j < shapes.length; j ++ ) {\n *\n * \t\tconst shape = shapes[ j ];\n * \t\tconst geometry = new THREE.ShapeGeometry( shape );\n * \t\tconst mesh = new THREE.Mesh( geometry, material );\n * \t\tgroup.add( mesh );\n *\n * \t}\n *\n * }\n *\n * scene.add( group );\n * ```\n *\n * @augments Loader\n * @three_import import { SVGLoader } from 'three/addons/loaders/SVGLoader.js';\n */\nclass SVGLoader extends Loader {\n\n\t/**\n\t * Constructs a new SVG loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * Default dots per inch.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 90\n\t\t */\n\t\tthis.defaultDPI = 90;\n\n\t\t/**\n\t\t * Default unit.\n\t\t *\n\t\t * @type {('mm'|'cm'|'in'|'pt'|'pc'|'px')}\n\t\t * @default 'px'\n\t\t */\n\t\tthis.defaultUnit = 'px';\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded SVG asset\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function({paths:Array<ShapePath>,xml:string})} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( text ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given SVG data and returns the resulting data.\n\t *\n\t * @param {string} text - The raw SVG data as a string.\n\t * @return {{paths:Array<ShapePath>,xml:string}} An object holding an array of shape paths and the\n\t * SVG XML document.\n\t */\n\tparse( text ) {\n\n\t\tconst scope = this;\n\n\t\tfunction parseNode( node, style ) {\n\n\t\t\tif ( node.nodeType !== 1 ) return;\n\n\t\t\tconst transform = getNodeTransform( node );\n\n\t\t\tlet isDefsNode = false;\n\n\t\t\tlet path = null;\n\n\t\t\tswitch ( node.nodeName ) {\n\n\t\t\t\tcase 'svg':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'style':\n\t\t\t\t\tparseCSSStylesheet( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'g':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'path':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tif ( node.hasAttribute( 'd' ) ) path = parsePathNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'rect':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tpath = parseRectNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'polygon':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tpath = parsePolygonNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'polyline':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tpath = parsePolylineNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'circle':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tpath = parseCircleNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'ellipse':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tpath = parseEllipseNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'line':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tpath = parseLineNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'defs':\n\t\t\t\t\tisDefsNode = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'use':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\n\t\t\t\t\tconst href = node.getAttributeNS( 'http://www.w3.org/1999/xlink', 'href' ) || '';\n\t\t\t\t\tconst usedNodeId = href.substring( 1 );\n\t\t\t\t\tconst usedNode = node.viewportElement.getElementById( usedNodeId );\n\t\t\t\t\tif ( usedNode ) {\n\n\t\t\t\t\t\tparseNode( usedNode, style );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'SVGLoader: \\'use node\\' references non-existent node id: ' + usedNodeId );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\t// console.log( node );\n\n\t\t\t}\n\n\t\t\tif ( path ) {\n\n\t\t\t\tif ( style.fill !== undefined && style.fill !== 'none' ) {\n\n\t\t\t\t\tpath.color.setStyle( style.fill, COLOR_SPACE_SVG );\n\n\t\t\t\t}\n\n\t\t\t\ttransformPath( path, currentTransform );\n\n\t\t\t\tpaths.push( path );\n\n\t\t\t\tpath.userData = { node: node, style: style };\n\n\t\t\t}\n\n\t\t\tconst childNodes = node.childNodes;\n\n\t\t\tfor ( let i = 0; i < childNodes.length; i ++ ) {\n\n\t\t\t\tconst node = childNodes[ i ];\n\n\t\t\t\tif ( isDefsNode && node.nodeName !== 'style' && node.nodeName !== 'defs' ) {\n\n\t\t\t\t\t// Ignore everything in defs except CSS style definitions\n\t\t\t\t\t// and nested defs, because it is OK by the standard to have\n\t\t\t\t\t// <style/> there.\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tparseNode( node, style );\n\n\t\t\t}\n\n\n\t\t\tif ( transform ) {\n\n\t\t\t\ttransformStack.pop();\n\n\t\t\t\tif ( transformStack.length > 0 ) {\n\n\t\t\t\t\tcurrentTransform.copy( transformStack[ transformStack.length - 1 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcurrentTransform.identity();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parsePathNode( node ) {\n\n\t\t\tconst path = new ShapePath();\n\n\t\t\tconst point = new Vector2();\n\t\t\tconst control = new Vector2();\n\n\t\t\tconst firstPoint = new Vector2();\n\t\t\tlet isFirstPoint = true;\n\t\t\tlet doSetFirstPoint = false;\n\n\t\t\tconst d = node.getAttribute( 'd' );\n\n\t\t\tif ( d === '' || d === 'none' ) return null;\n\n\t\t\t// console.log( d );\n\n\t\t\tconst commands = d.match( /[a-df-z][^a-df-z]*/ig );\n\n\t\t\tfor ( let i = 0, l = commands.length; i < l; i ++ ) {\n\n\t\t\t\tconst command = commands[ i ];\n\n\t\t\t\tconst type = command.charAt( 0 );\n\t\t\t\tconst data = command.slice( 1 ).trim();\n\n\t\t\t\tif ( isFirstPoint === true ) {\n\n\t\t\t\t\tdoSetFirstPoint = true;\n\t\t\t\t\tisFirstPoint = false;\n\n\t\t\t\t}\n\n\t\t\t\tlet numbers;\n\n\t\t\t\tswitch ( type ) {\n\n\t\t\t\t\tcase 'M':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {\n\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 0 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 1 ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\n\t\t\t\t\t\t\tif ( j === 0 ) {\n\n\t\t\t\t\t\t\t\tpath.moveTo( point.x, point.y );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( j === 0 ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'H':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tpoint.x = numbers[ j ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'V':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tpoint.y = numbers[ j ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'L':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {\n\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 0 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 1 ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'C':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 6 ) {\n\n\t\t\t\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\t\t\t\tnumbers[ j + 0 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 1 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 2 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 3 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 4 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 5 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = numbers[ j + 2 ];\n\t\t\t\t\t\t\tcontrol.y = numbers[ j + 3 ];\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 4 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 5 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'S':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 4 ) {\n\n\t\t\t\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\t\t\t\tgetReflection( point.x, control.x ),\n\t\t\t\t\t\t\t\tgetReflection( point.y, control.y ),\n\t\t\t\t\t\t\t\tnumbers[ j + 0 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 1 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 2 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 3 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = numbers[ j + 0 ];\n\t\t\t\t\t\t\tcontrol.y = numbers[ j + 1 ];\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 2 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 3 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Q':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 4 ) {\n\n\t\t\t\t\t\t\tpath.quadraticCurveTo(\n\t\t\t\t\t\t\t\tnumbers[ j + 0 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 1 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 2 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 3 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = numbers[ j + 0 ];\n\t\t\t\t\t\t\tcontrol.y = numbers[ j + 1 ];\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 2 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 3 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'T':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {\n\n\t\t\t\t\t\t\tconst rx = getReflection( point.x, control.x );\n\t\t\t\t\t\t\tconst ry = getReflection( point.y, control.y );\n\t\t\t\t\t\t\tpath.quadraticCurveTo(\n\t\t\t\t\t\t\t\trx,\n\t\t\t\t\t\t\t\try,\n\t\t\t\t\t\t\t\tnumbers[ j + 0 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 1 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = rx;\n\t\t\t\t\t\t\tcontrol.y = ry;\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 0 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 1 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'A':\n\t\t\t\t\t\tnumbers = parseFloats( data, [ 3, 4 ], 7 );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 7 ) {\n\n\t\t\t\t\t\t\t// skip command if start point == end point\n\t\t\t\t\t\t\tif ( numbers[ j + 5 ] == point.x && numbers[ j + 6 ] == point.y ) continue;\n\n\t\t\t\t\t\t\tconst start = point.clone();\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 5 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 6 ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tparseArcCommand(\n\t\t\t\t\t\t\t\tpath, numbers[ j ], numbers[ j + 1 ], numbers[ j + 2 ], numbers[ j + 3 ], numbers[ j + 4 ], start, point\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'm':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {\n\n\t\t\t\t\t\t\tpoint.x += numbers[ j + 0 ];\n\t\t\t\t\t\t\tpoint.y += numbers[ j + 1 ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\n\t\t\t\t\t\t\tif ( j === 0 ) {\n\n\t\t\t\t\t\t\t\tpath.moveTo( point.x, point.y );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( j === 0 ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'h':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tpoint.x += numbers[ j ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tpoint.y += numbers[ j ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'l':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {\n\n\t\t\t\t\t\t\tpoint.x += numbers[ j + 0 ];\n\t\t\t\t\t\t\tpoint.y += numbers[ j + 1 ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'c':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 6 ) {\n\n\t\t\t\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 0 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 1 ],\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 2 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 3 ],\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 4 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 5 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = point.x + numbers[ j + 2 ];\n\t\t\t\t\t\t\tcontrol.y = point.y + numbers[ j + 3 ];\n\t\t\t\t\t\t\tpoint.x += numbers[ j + 4 ];\n\t\t\t\t\t\t\tpoint.y += numbers[ j + 5 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 's':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 4 ) {\n\n\t\t\t\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\t\t\t\tgetReflection( point.x, control.x ),\n\t\t\t\t\t\t\t\tgetReflection( point.y, control.y ),\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 0 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 1 ],\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 2 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 3 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = point.x + numbers[ j + 0 ];\n\t\t\t\t\t\t\tcontrol.y = point.y + numbers[ j + 1 ];\n\t\t\t\t\t\t\tpoint.x += numbers[ j + 2 ];\n\t\t\t\t\t\t\tpoint.y += numbers[ j + 3 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'q':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 4 ) {\n\n\t\t\t\t\t\t\tpath.quadraticCurveTo(\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 0 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 1 ],\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 2 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 3 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = point.x + numbers[ j + 0 ];\n\t\t\t\t\t\t\tcontrol.y = point.y + numbers[ j + 1 ];\n\t\t\t\t\t\t\tpoint.x += numbers[ j + 2 ];\n\t\t\t\t\t\t\tpoint.y += numbers[ j + 3 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 't':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {\n\n\t\t\t\t\t\t\tconst rx = getReflection( point.x, control.x );\n\t\t\t\t\t\t\tconst ry = getReflection( point.y, control.y );\n\t\t\t\t\t\t\tpath.quadraticCurveTo(\n\t\t\t\t\t\t\t\trx,\n\t\t\t\t\t\t\t\try,\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 0 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 1 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = rx;\n\t\t\t\t\t\t\tcontrol.y = ry;\n\t\t\t\t\t\t\tpoint.x = point.x + numbers[ j + 0 ];\n\t\t\t\t\t\t\tpoint.y = point.y + numbers[ j + 1 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'a':\n\t\t\t\t\t\tnumbers = parseFloats( data, [ 3, 4 ], 7 );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 7 ) {\n\n\t\t\t\t\t\t\t// skip command if no displacement\n\t\t\t\t\t\t\tif ( numbers[ j + 5 ] == 0 && numbers[ j + 6 ] == 0 ) continue;\n\n\t\t\t\t\t\t\tconst start = point.clone();\n\t\t\t\t\t\t\tpoint.x += numbers[ j + 5 ];\n\t\t\t\t\t\t\tpoint.y += numbers[ j + 6 ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tparseArcCommand(\n\t\t\t\t\t\t\t\tpath, numbers[ j ], numbers[ j + 1 ], numbers[ j + 2 ], numbers[ j + 3 ], numbers[ j + 4 ], start, point\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Z':\n\t\t\t\t\tcase 'z':\n\t\t\t\t\t\tpath.currentPath.autoClose = true;\n\n\t\t\t\t\t\tif ( path.currentPath.curves.length > 0 ) {\n\n\t\t\t\t\t\t\t// Reset point to beginning of Path\n\t\t\t\t\t\t\tpoint.copy( firstPoint );\n\t\t\t\t\t\t\tpath.currentPath.currentPoint.copy( point );\n\t\t\t\t\t\t\tisFirstPoint = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.warn( command );\n\n\t\t\t\t}\n\n\t\t\t\t// console.log( type, parseFloats( data ), parseFloats( data ).length )\n\n\t\t\t\tdoSetFirstPoint = false;\n\n\t\t\t}\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\tfunction parseCSSStylesheet( node ) {\n\n\t\t\tif ( ! node.sheet || ! node.sheet.cssRules || ! node.sheet.cssRules.length ) return;\n\n\t\t\tfor ( let i = 0; i < node.sheet.cssRules.length; i ++ ) {\n\n\t\t\t\tconst stylesheet = node.sheet.cssRules[ i ];\n\n\t\t\t\tif ( stylesheet.type !== 1 ) continue;\n\n\t\t\t\tconst selectorList = stylesheet.selectorText\n\t\t\t\t\t.split( /,/gm )\n\t\t\t\t\t.filter( Boolean )\n\t\t\t\t\t.map( i => i.trim() );\n\n\t\t\t\tfor ( let j = 0; j < selectorList.length; j ++ ) {\n\n\t\t\t\t\t// Remove empty rules\n\t\t\t\t\tconst definitions = Object.fromEntries(\n\t\t\t\t\t\tObject.entries( stylesheet.style ).filter( ( [ , v ] ) => v !== '' )\n\t\t\t\t\t);\n\n\t\t\t\t\tstylesheets[ selectorList[ j ] ] = Object.assign(\n\t\t\t\t\t\tstylesheets[ selectorList[ j ] ] || {},\n\t\t\t\t\t\tdefinitions\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t/**\n\t\t * https://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes\n\t\t * https://mortoray.com/2017/02/16/rendering-an-svg-elliptical-arc-as-bezier-curves/ Appendix: Endpoint to center arc conversion\n\t\t * From\n\t\t * rx ry x-axis-rotation large-arc-flag sweep-flag x y\n\t\t * To\n\t\t * aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation\n\t\t */\n\n\t\tfunction parseArcCommand( path, rx, ry, x_axis_rotation, large_arc_flag, sweep_flag, start, end ) {\n\n\t\t\tif ( rx == 0 || ry == 0 ) {\n\n\t\t\t\t// draw a line if either of the radii == 0\n\t\t\t\tpath.lineTo( end.x, end.y );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tx_axis_rotation = x_axis_rotation * Math.PI / 180;\n\n\t\t\t// Ensure radii are positive\n\t\t\trx = Math.abs( rx );\n\t\t\try = Math.abs( ry );\n\n\t\t\t// Compute (x1', y1')\n\t\t\tconst dx2 = ( start.x - end.x ) / 2.0;\n\t\t\tconst dy2 = ( start.y - end.y ) / 2.0;\n\t\t\tconst x1p = Math.cos( x_axis_rotation ) * dx2 + Math.sin( x_axis_rotation ) * dy2;\n\t\t\tconst y1p = - Math.sin( x_axis_rotation ) * dx2 + Math.cos( x_axis_rotation ) * dy2;\n\n\t\t\t// Compute (cx', cy')\n\t\t\tlet rxs = rx * rx;\n\t\t\tlet rys = ry * ry;\n\t\t\tconst x1ps = x1p * x1p;\n\t\t\tconst y1ps = y1p * y1p;\n\n\t\t\t// Ensure radii are large enough\n\t\t\tconst cr = x1ps / rxs + y1ps / rys;\n\n\t\t\tif ( cr > 1 ) {\n\n\t\t\t\t// scale up rx,ry equally so cr == 1\n\t\t\t\tconst s = Math.sqrt( cr );\n\t\t\t\trx = s * rx;\n\t\t\t\try = s * ry;\n\t\t\t\trxs = rx * rx;\n\t\t\t\trys = ry * ry;\n\n\t\t\t}\n\n\t\t\tconst dq = ( rxs * y1ps + rys * x1ps );\n\t\t\tconst pq = ( rxs * rys - dq ) / dq;\n\t\t\tlet q = Math.sqrt( Math.max( 0, pq ) );\n\t\t\tif ( large_arc_flag === sweep_flag ) q = - q;\n\t\t\tconst cxp = q * rx * y1p / ry;\n\t\t\tconst cyp = - q * ry * x1p / rx;\n\n\t\t\t// Step 3: Compute (cx, cy) from (cx', cy')\n\t\t\tconst cx = Math.cos( x_axis_rotation ) * cxp - Math.sin( x_axis_rotation ) * cyp + ( start.x + end.x ) / 2;\n\t\t\tconst cy = Math.sin( x_axis_rotation ) * cxp + Math.cos( x_axis_rotation ) * cyp + ( start.y + end.y ) / 2;\n\n\t\t\t// Step 4: Compute θ1 and Δθ\n\t\t\tconst theta = svgAngle( 1, 0, ( x1p - cxp ) / rx, ( y1p - cyp ) / ry );\n\t\t\tconst delta = svgAngle( ( x1p - cxp ) / rx, ( y1p - cyp ) / ry, ( - x1p - cxp ) / rx, ( - y1p - cyp ) / ry ) % ( Math.PI * 2 );\n\n\t\t\tpath.currentPath.absellipse( cx, cy, rx, ry, theta, theta + delta, sweep_flag === 0, x_axis_rotation );\n\n\t\t}\n\n\t\tfunction svgAngle( ux, uy, vx, vy ) {\n\n\t\t\tconst dot = ux * vx + uy * vy;\n\t\t\tconst len = Math.sqrt( ux * ux + uy * uy ) * Math.sqrt( vx * vx + vy * vy );\n\t\t\tlet ang = Math.acos( Math.max( - 1, Math.min( 1, dot / len ) ) ); // floating point precision, slightly over values appear\n\t\t\tif ( ( ux * vy - uy * vx ) < 0 ) ang = - ang;\n\t\t\treturn ang;\n\n\t\t}\n\n\t\t/*\n\t\t* According to https://www.w3.org/TR/SVG/shapes.html#RectElementRXAttribute\n\t\t* rounded corner should be rendered to elliptical arc, but bezier curve does the job well enough\n\t\t*/\n\n\t\tfunction parseRectNode( node ) {\n\n\t\t\tconst x = parseFloatWithUnits( node.getAttribute( 'x' ) || 0 );\n\t\t\tconst y = parseFloatWithUnits( node.getAttribute( 'y' ) || 0 );\n\t\t\tconst rx = parseFloatWithUnits( node.getAttribute( 'rx' ) || node.getAttribute( 'ry' ) || 0 );\n\t\t\tconst ry = parseFloatWithUnits( node.getAttribute( 'ry' ) || node.getAttribute( 'rx' ) || 0 );\n\t\t\tconst w = parseFloatWithUnits( node.getAttribute( 'width' ) );\n\t\t\tconst h = parseFloatWithUnits( node.getAttribute( 'height' ) );\n\n\t\t\t// Ellipse arc to Bezier approximation Coefficient (Inversed). See:\n\t\t\t// https://spencermortensen.com/articles/bezier-circle/\n\t\t\tconst bci = 1 - 0.551915024494;\n\n\t\t\tconst path = new ShapePath();\n\n\t\t\t// top left\n\t\t\tpath.moveTo( x + rx, y );\n\n\t\t\t// top right\n\t\t\tpath.lineTo( x + w - rx, y );\n\t\t\tif ( rx !== 0 || ry !== 0 ) {\n\n\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\tx + w - rx * bci,\n\t\t\t\t\ty,\n\t\t\t\t\tx + w,\n\t\t\t\t\ty + ry * bci,\n\t\t\t\t\tx + w,\n\t\t\t\t\ty + ry\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\t// bottom right\n\t\t\tpath.lineTo( x + w, y + h - ry );\n\t\t\tif ( rx !== 0 || ry !== 0 ) {\n\n\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\tx + w,\n\t\t\t\t\ty + h - ry * bci,\n\t\t\t\t\tx + w - rx * bci,\n\t\t\t\t\ty + h,\n\t\t\t\t\tx + w - rx,\n\t\t\t\t\ty + h\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\t// bottom left\n\t\t\tpath.lineTo( x + rx, y + h );\n\t\t\tif ( rx !== 0 || ry !== 0 ) {\n\n\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\tx + rx * bci,\n\t\t\t\t\ty + h,\n\t\t\t\t\tx,\n\t\t\t\t\ty + h - ry * bci,\n\t\t\t\t\tx,\n\t\t\t\t\ty + h - ry\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\t// back to top left\n\t\t\tpath.lineTo( x, y + ry );\n\t\t\tif ( rx !== 0 || ry !== 0 ) {\n\n\t\t\t\tpath.bezierCurveTo( x, y + ry * bci, x + rx * bci, y, x + rx, y );\n\n\t\t\t}\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\tfunction parsePolygonNode( node ) {\n\n\t\t\tfunction iterator( match, a, b ) {\n\n\t\t\t\tconst x = parseFloatWithUnits( a );\n\t\t\t\tconst y = parseFloatWithUnits( b );\n\n\t\t\t\tif ( index === 0 ) {\n\n\t\t\t\t\tpath.moveTo( x, y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tpath.lineTo( x, y );\n\n\t\t\t\t}\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\tconst regex = /([+-]?\\d*\\.?\\d+(?:e[+-]?\\d+)?)(?:,|\\s)([+-]?\\d*\\.?\\d+(?:e[+-]?\\d+)?)/g;\n\n\t\t\tconst path = new ShapePath();\n\n\t\t\tlet index = 0;\n\n\t\t\tnode.getAttribute( 'points' ).replace( regex, iterator );\n\n\t\t\tpath.currentPath.autoClose = true;\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\tfunction parsePolylineNode( node ) {\n\n\t\t\tfunction iterator( match, a, b ) {\n\n\t\t\t\tconst x = parseFloatWithUnits( a );\n\t\t\t\tconst y = parseFloatWithUnits( b );\n\n\t\t\t\tif ( index === 0 ) {\n\n\t\t\t\t\tpath.moveTo( x, y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tpath.lineTo( x, y );\n\n\t\t\t\t}\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\tconst regex = /([+-]?\\d*\\.?\\d+(?:e[+-]?\\d+)?)(?:,|\\s)([+-]?\\d*\\.?\\d+(?:e[+-]?\\d+)?)/g;\n\n\t\t\tconst path = new ShapePath();\n\n\t\t\tlet index = 0;\n\n\t\t\tnode.getAttribute( 'points' ).replace( regex, iterator );\n\n\t\t\tpath.currentPath.autoClose = false;\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\tfunction parseCircleNode( node ) {\n\n\t\t\tconst x = parseFloatWithUnits( node.getAttribute( 'cx' ) || 0 );\n\t\t\tconst y = parseFloatWithUnits( node.getAttribute( 'cy' ) || 0 );\n\t\t\tconst r = parseFloatWithUnits( node.getAttribute( 'r' ) || 0 );\n\n\t\t\tconst subpath = new Path();\n\t\t\tsubpath.absarc( x, y, r, 0, Math.PI * 2 );\n\n\t\t\tconst path = new ShapePath();\n\t\t\tpath.subPaths.push( subpath );\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\tfunction parseEllipseNode( node ) {\n\n\t\t\tconst x = parseFloatWithUnits( node.getAttribute( 'cx' ) || 0 );\n\t\t\tconst y = parseFloatWithUnits( node.getAttribute( 'cy' ) || 0 );\n\t\t\tconst rx = parseFloatWithUnits( node.getAttribute( 'rx' ) || 0 );\n\t\t\tconst ry = parseFloatWithUnits( node.getAttribute( 'ry' ) || 0 );\n\n\t\t\tconst subpath = new Path();\n\t\t\tsubpath.absellipse( x, y, rx, ry, 0, Math.PI * 2 );\n\n\t\t\tconst path = new ShapePath();\n\t\t\tpath.subPaths.push( subpath );\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\tfunction parseLineNode( node ) {\n\n\t\t\tconst x1 = parseFloatWithUnits( node.getAttribute( 'x1' ) || 0 );\n\t\t\tconst y1 = parseFloatWithUnits( node.getAttribute( 'y1' ) || 0 );\n\t\t\tconst x2 = parseFloatWithUnits( node.getAttribute( 'x2' ) || 0 );\n\t\t\tconst y2 = parseFloatWithUnits( node.getAttribute( 'y2' ) || 0 );\n\n\t\t\tconst path = new ShapePath();\n\t\t\tpath.moveTo( x1, y1 );\n\t\t\tpath.lineTo( x2, y2 );\n\t\t\tpath.currentPath.autoClose = false;\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\t//\n\n\t\tfunction parseStyle( node, style ) {\n\n\t\t\tstyle = Object.assign( {}, style ); // clone style\n\n\t\t\tlet stylesheetStyles = {};\n\n\t\t\tif ( node.hasAttribute( 'class' ) ) {\n\n\t\t\t\tconst classSelectors = node.getAttribute( 'class' )\n\t\t\t\t\t.split( /\\s/ )\n\t\t\t\t\t.filter( Boolean )\n\t\t\t\t\t.map( i => i.trim() );\n\n\t\t\t\tfor ( let i = 0; i < classSelectors.length; i ++ ) {\n\n\t\t\t\t\tstylesheetStyles = Object.assign( stylesheetStyles, stylesheets[ '.' + classSelectors[ i ] ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( node.hasAttribute( 'id' ) ) {\n\n\t\t\t\tstylesheetStyles = Object.assign( stylesheetStyles, stylesheets[ '#' + node.getAttribute( 'id' ) ] );\n\n\t\t\t}\n\n\t\t\tfunction addStyle( svgName, jsName, adjustFunction ) {\n\n\t\t\t\tif ( adjustFunction === undefined ) adjustFunction = function copy( v ) {\n\n\t\t\t\t\tif ( v.startsWith( 'url' ) ) console.warn( 'SVGLoader: url access in attributes is not implemented.' );\n\n\t\t\t\t\treturn v;\n\n\t\t\t\t};\n\n\t\t\t\tif ( node.hasAttribute( svgName ) ) style[ jsName ] = adjustFunction( node.getAttribute( svgName ) );\n\t\t\t\tif ( stylesheetStyles[ svgName ] ) style[ jsName ] = adjustFunction( stylesheetStyles[ svgName ] );\n\t\t\t\tif ( node.style && node.style[ svgName ] !== '' ) style[ jsName ] = adjustFunction( node.style[ svgName ] );\n\n\t\t\t}\n\n\t\t\tfunction clamp( v ) {\n\n\t\t\t\treturn Math.max( 0, Math.min( 1, parseFloatWithUnits( v ) ) );\n\n\t\t\t}\n\n\t\t\tfunction positive( v ) {\n\n\t\t\t\treturn Math.max( 0, parseFloatWithUnits( v ) );\n\n\t\t\t}\n\n\t\t\taddStyle( 'fill', 'fill' );\n\t\t\taddStyle( 'fill-opacity', 'fillOpacity', clamp );\n\t\t\taddStyle( 'fill-rule', 'fillRule' );\n\t\t\taddStyle( 'opacity', 'opacity', clamp );\n\t\t\taddStyle( 'stroke', 'stroke' );\n\t\t\taddStyle( 'stroke-opacity', 'strokeOpacity', clamp );\n\t\t\taddStyle( 'stroke-width', 'strokeWidth', positive );\n\t\t\taddStyle( 'stroke-linejoin', 'strokeLineJoin' );\n\t\t\taddStyle( 'stroke-linecap', 'strokeLineCap' );\n\t\t\taddStyle( 'stroke-miterlimit', 'strokeMiterLimit', positive );\n\t\t\taddStyle( 'visibility', 'visibility' );\n\n\t\t\treturn style;\n\n\t\t}\n\n\t\t// http://www.w3.org/TR/SVG11/implnote.html#PathElementImplementationNotes\n\n\t\tfunction getReflection( a, b ) {\n\n\t\t\treturn a - ( b - a );\n\n\t\t}\n\n\t\t// from https://github.com/ppvg/svg-numbers (MIT License)\n\n\t\tfunction parseFloats( input, flags, stride ) {\n\n\t\t\tif ( typeof input !== 'string' ) {\n\n\t\t\t\tthrow new TypeError( 'Invalid input: ' + typeof input );\n\n\t\t\t}\n\n\t\t\t// Character groups\n\t\t\tconst RE = {\n\t\t\t\tSEPARATOR: /[ \\t\\r\\n\\,.\\-+]/,\n\t\t\t\tWHITESPACE: /[ \\t\\r\\n]/,\n\t\t\t\tDIGIT: /[\\d]/,\n\t\t\t\tSIGN: /[-+]/,\n\t\t\t\tPOINT: /\\./,\n\t\t\t\tCOMMA: /,/,\n\t\t\t\tEXP: /e/i,\n\t\t\t\tFLAGS: /[01]/\n\t\t\t};\n\n\t\t\t// States\n\t\t\tconst SEP = 0;\n\t\t\tconst INT = 1;\n\t\t\tconst FLOAT = 2;\n\t\t\tconst EXP = 3;\n\n\t\t\tlet state = SEP;\n\t\t\tlet seenComma = true;\n\t\t\tlet number = '', exponent = '';\n\t\t\tconst result = [];\n\n\t\t\tfunction throwSyntaxError( current, i, partial ) {\n\n\t\t\t\tconst error = new SyntaxError( 'Unexpected character \"' + current + '\" at index ' + i + '.' );\n\t\t\t\terror.partial = partial;\n\t\t\t\tthrow error;\n\n\t\t\t}\n\n\t\t\tfunction newNumber() {\n\n\t\t\t\tif ( number !== '' ) {\n\n\t\t\t\t\tif ( exponent === '' ) result.push( Number( number ) );\n\t\t\t\t\telse result.push( Number( number ) * Math.pow( 10, Number( exponent ) ) );\n\n\t\t\t\t}\n\n\t\t\t\tnumber = '';\n\t\t\t\texponent = '';\n\n\t\t\t}\n\n\t\t\tlet current;\n\t\t\tconst length = input.length;\n\n\t\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\t\tcurrent = input[ i ];\n\n\t\t\t\t// check for flags\n\t\t\t\tif ( Array.isArray( flags ) && flags.includes( result.length % stride ) && RE.FLAGS.test( current ) ) {\n\n\t\t\t\t\tstate = INT;\n\t\t\t\t\tnumber = current;\n\t\t\t\t\tnewNumber();\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\t// parse until next number\n\t\t\t\tif ( state === SEP ) {\n\n\t\t\t\t\t// eat whitespace\n\t\t\t\t\tif ( RE.WHITESPACE.test( current ) ) {\n\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// start new number\n\t\t\t\t\tif ( RE.DIGIT.test( current ) || RE.SIGN.test( current ) ) {\n\n\t\t\t\t\t\tstate = INT;\n\t\t\t\t\t\tnumber = current;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( RE.POINT.test( current ) ) {\n\n\t\t\t\t\t\tstate = FLOAT;\n\t\t\t\t\t\tnumber = current;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// throw on double commas (e.g. \"1, , 2\")\n\t\t\t\t\tif ( RE.COMMA.test( current ) ) {\n\n\t\t\t\t\t\tif ( seenComma ) {\n\n\t\t\t\t\t\t\tthrowSyntaxError( current, i, result );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tseenComma = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// parse integer part\n\t\t\t\tif ( state === INT ) {\n\n\t\t\t\t\tif ( RE.DIGIT.test( current ) ) {\n\n\t\t\t\t\t\tnumber += current;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( RE.POINT.test( current ) ) {\n\n\t\t\t\t\t\tnumber += current;\n\t\t\t\t\t\tstate = FLOAT;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( RE.EXP.test( current ) ) {\n\n\t\t\t\t\t\tstate = EXP;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// throw on double signs (\"-+1\"), but not on sign as separator (\"-1-2\")\n\t\t\t\t\tif ( RE.SIGN.test( current )\n\t\t\t\t\t\t\t&& number.length === 1\n\t\t\t\t\t\t\t&& RE.SIGN.test( number[ 0 ] ) ) {\n\n\t\t\t\t\t\tthrowSyntaxError( current, i, result );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// parse decimal part\n\t\t\t\tif ( state === FLOAT ) {\n\n\t\t\t\t\tif ( RE.DIGIT.test( current ) ) {\n\n\t\t\t\t\t\tnumber += current;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( RE.EXP.test( current ) ) {\n\n\t\t\t\t\t\tstate = EXP;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// throw on double decimal points (e.g. \"1..2\")\n\t\t\t\t\tif ( RE.POINT.test( current ) && number[ number.length - 1 ] === '.' ) {\n\n\t\t\t\t\t\tthrowSyntaxError( current, i, result );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// parse exponent part\n\t\t\t\tif ( state === EXP ) {\n\n\t\t\t\t\tif ( RE.DIGIT.test( current ) ) {\n\n\t\t\t\t\t\texponent += current;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( RE.SIGN.test( current ) ) {\n\n\t\t\t\t\t\tif ( exponent === '' ) {\n\n\t\t\t\t\t\t\texponent += current;\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( exponent.length === 1 && RE.SIGN.test( exponent ) ) {\n\n\t\t\t\t\t\t\tthrowSyntaxError( current, i, result );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\n\t\t\t\t// end of number\n\t\t\t\tif ( RE.WHITESPACE.test( current ) ) {\n\n\t\t\t\t\tnewNumber();\n\t\t\t\t\tstate = SEP;\n\t\t\t\t\tseenComma = false;\n\n\t\t\t\t} else if ( RE.COMMA.test( current ) ) {\n\n\t\t\t\t\tnewNumber();\n\t\t\t\t\tstate = SEP;\n\t\t\t\t\tseenComma = true;\n\n\t\t\t\t} else if ( RE.SIGN.test( current ) ) {\n\n\t\t\t\t\tnewNumber();\n\t\t\t\t\tstate = INT;\n\t\t\t\t\tnumber = current;\n\n\t\t\t\t} else if ( RE.POINT.test( current ) ) {\n\n\t\t\t\t\tnewNumber();\n\t\t\t\t\tstate = FLOAT;\n\t\t\t\t\tnumber = current;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrowSyntaxError( current, i, result );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add the last number found (if any)\n\t\t\tnewNumber();\n\n\t\t\treturn result;\n\n\t\t}\n\n\t\t// Units\n\n\t\tconst units = [ 'mm', 'cm', 'in', 'pt', 'pc', 'px' ];\n\n\t\t// Conversion: [ fromUnit ][ toUnit ] (-1 means dpi dependent)\n\t\tconst unitConversion = {\n\n\t\t\t'mm': {\n\t\t\t\t'mm': 1,\n\t\t\t\t'cm': 0.1,\n\t\t\t\t'in': 1 / 25.4,\n\t\t\t\t'pt': 72 / 25.4,\n\t\t\t\t'pc': 6 / 25.4,\n\t\t\t\t'px': - 1\n\t\t\t},\n\t\t\t'cm': {\n\t\t\t\t'mm': 10,\n\t\t\t\t'cm': 1,\n\t\t\t\t'in': 1 / 2.54,\n\t\t\t\t'pt': 72 / 2.54,\n\t\t\t\t'pc': 6 / 2.54,\n\t\t\t\t'px': - 1\n\t\t\t},\n\t\t\t'in': {\n\t\t\t\t'mm': 25.4,\n\t\t\t\t'cm': 2.54,\n\t\t\t\t'in': 1,\n\t\t\t\t'pt': 72,\n\t\t\t\t'pc': 6,\n\t\t\t\t'px': - 1\n\t\t\t},\n\t\t\t'pt': {\n\t\t\t\t'mm': 25.4 / 72,\n\t\t\t\t'cm': 2.54 / 72,\n\t\t\t\t'in': 1 / 72,\n\t\t\t\t'pt': 1,\n\t\t\t\t'pc': 6 / 72,\n\t\t\t\t'px': - 1\n\t\t\t},\n\t\t\t'pc': {\n\t\t\t\t'mm': 25.4 / 6,\n\t\t\t\t'cm': 2.54 / 6,\n\t\t\t\t'in': 1 / 6,\n\t\t\t\t'pt': 72 / 6,\n\t\t\t\t'pc': 1,\n\t\t\t\t'px': - 1\n\t\t\t},\n\t\t\t'px': {\n\t\t\t\t'px': 1\n\t\t\t}\n\n\t\t};\n\n\t\tfunction parseFloatWithUnits( string ) {\n\n\t\t\tlet theUnit = 'px';\n\n\t\t\tif ( typeof string === 'string' || string instanceof String ) {\n\n\t\t\t\tfor ( let i = 0, n = units.length; i < n; i ++ ) {\n\n\t\t\t\t\tconst u = units[ i ];\n\n\t\t\t\t\tif ( string.endsWith( u ) ) {\n\n\t\t\t\t\t\ttheUnit = u;\n\t\t\t\t\t\tstring = string.substring( 0, string.length - u.length );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlet scale = undefined;\n\n\t\t\tif ( theUnit === 'px' && scope.defaultUnit !== 'px' ) {\n\n\t\t\t\t// Conversion scale from pixels to inches, then to default units\n\n\t\t\t\tscale = unitConversion[ 'in' ][ scope.defaultUnit ] / scope.defaultDPI;\n\n\t\t\t} else {\n\n\t\t\t\tscale = unitConversion[ theUnit ][ scope.defaultUnit ];\n\n\t\t\t\tif ( scale < 0 ) {\n\n\t\t\t\t\t// Conversion scale to pixels\n\n\t\t\t\t\tscale = unitConversion[ theUnit ][ 'in' ] * scope.defaultDPI;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn scale * parseFloat( string );\n\n\t\t}\n\n\t\t// Transforms\n\n\t\tfunction getNodeTransform( node ) {\n\n\t\t\tif ( ! ( node.hasAttribute( 'transform' ) || ( node.nodeName === 'use' && ( node.hasAttribute( 'x' ) || node.hasAttribute( 'y' ) ) ) ) ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tconst transform = parseNodeTransform( node );\n\n\t\t\tif ( transformStack.length > 0 ) {\n\n\t\t\t\ttransform.premultiply( transformStack[ transformStack.length - 1 ] );\n\n\t\t\t}\n\n\t\t\tcurrentTransform.copy( transform );\n\t\t\ttransformStack.push( transform );\n\n\t\t\treturn transform;\n\n\t\t}\n\n\t\tfunction parseNodeTransform( node ) {\n\n\t\t\tconst transform = new Matrix3();\n\t\t\tconst currentTransform = tempTransform0;\n\n\t\t\tif ( node.nodeName === 'use' && ( node.hasAttribute( 'x' ) || node.hasAttribute( 'y' ) ) ) {\n\n\t\t\t\tconst tx = parseFloatWithUnits( node.getAttribute( 'x' ) );\n\t\t\t\tconst ty = parseFloatWithUnits( node.getAttribute( 'y' ) );\n\n\t\t\t\ttransform.translate( tx, ty );\n\n\t\t\t}\n\n\t\t\tif ( node.hasAttribute( 'transform' ) ) {\n\n\t\t\t\tconst transformsTexts = node.getAttribute( 'transform' ).split( ')' );\n\n\t\t\t\tfor ( let tIndex = transformsTexts.length - 1; tIndex >= 0; tIndex -- ) {\n\n\t\t\t\t\tconst transformText = transformsTexts[ tIndex ].trim();\n\n\t\t\t\t\tif ( transformText === '' ) continue;\n\n\t\t\t\t\tconst openParPos = transformText.indexOf( '(' );\n\t\t\t\t\tconst closeParPos = transformText.length;\n\n\t\t\t\t\tif ( openParPos > 0 && openParPos < closeParPos ) {\n\n\t\t\t\t\t\tconst transformType = transformText.slice( 0, openParPos );\n\n\t\t\t\t\t\tconst array = parseFloats( transformText.slice( openParPos + 1 ) );\n\n\t\t\t\t\t\tcurrentTransform.identity();\n\n\t\t\t\t\t\tswitch ( transformType ) {\n\n\t\t\t\t\t\t\tcase 'translate':\n\n\t\t\t\t\t\t\t\tif ( array.length >= 1 ) {\n\n\t\t\t\t\t\t\t\t\tconst tx = array[ 0 ];\n\t\t\t\t\t\t\t\t\tlet ty = 0;\n\n\t\t\t\t\t\t\t\t\tif ( array.length >= 2 ) {\n\n\t\t\t\t\t\t\t\t\t\tty = array[ 1 ];\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tcurrentTransform.translate( tx, ty );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'rotate':\n\n\t\t\t\t\t\t\t\tif ( array.length >= 1 ) {\n\n\t\t\t\t\t\t\t\t\tlet angle = 0;\n\t\t\t\t\t\t\t\t\tlet cx = 0;\n\t\t\t\t\t\t\t\t\tlet cy = 0;\n\n\t\t\t\t\t\t\t\t\t// Angle\n\t\t\t\t\t\t\t\t\tangle = array[ 0 ] * Math.PI / 180;\n\n\t\t\t\t\t\t\t\t\tif ( array.length >= 3 ) {\n\n\t\t\t\t\t\t\t\t\t\t// Center x, y\n\t\t\t\t\t\t\t\t\t\tcx = array[ 1 ];\n\t\t\t\t\t\t\t\t\t\tcy = array[ 2 ];\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Rotate around center (cx, cy)\n\t\t\t\t\t\t\t\t\ttempTransform1.makeTranslation( - cx, - cy );\n\t\t\t\t\t\t\t\t\ttempTransform2.makeRotation( angle );\n\t\t\t\t\t\t\t\t\ttempTransform3.multiplyMatrices( tempTransform2, tempTransform1 );\n\t\t\t\t\t\t\t\t\ttempTransform1.makeTranslation( cx, cy );\n\t\t\t\t\t\t\t\t\tcurrentTransform.multiplyMatrices( tempTransform1, tempTransform3 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'scale':\n\n\t\t\t\t\t\t\t\tif ( array.length >= 1 ) {\n\n\t\t\t\t\t\t\t\t\tconst scaleX = array[ 0 ];\n\t\t\t\t\t\t\t\t\tlet scaleY = scaleX;\n\n\t\t\t\t\t\t\t\t\tif ( array.length >= 2 ) {\n\n\t\t\t\t\t\t\t\t\t\tscaleY = array[ 1 ];\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tcurrentTransform.scale( scaleX, scaleY );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'skewX':\n\n\t\t\t\t\t\t\t\tif ( array.length === 1 ) {\n\n\t\t\t\t\t\t\t\t\tcurrentTransform.set(\n\t\t\t\t\t\t\t\t\t\t1, Math.tan( array[ 0 ] * Math.PI / 180 ), 0,\n\t\t\t\t\t\t\t\t\t\t0, 1, 0,\n\t\t\t\t\t\t\t\t\t\t0, 0, 1\n\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'skewY':\n\n\t\t\t\t\t\t\t\tif ( array.length === 1 ) {\n\n\t\t\t\t\t\t\t\t\tcurrentTransform.set(\n\t\t\t\t\t\t\t\t\t\t1, 0, 0,\n\t\t\t\t\t\t\t\t\t\tMath.tan( array[ 0 ] * Math.PI / 180 ), 1, 0,\n\t\t\t\t\t\t\t\t\t\t0, 0, 1\n\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'matrix':\n\n\t\t\t\t\t\t\t\tif ( array.length === 6 ) {\n\n\t\t\t\t\t\t\t\t\tcurrentTransform.set(\n\t\t\t\t\t\t\t\t\t\tarray[ 0 ], array[ 2 ], array[ 4 ],\n\t\t\t\t\t\t\t\t\t\tarray[ 1 ], array[ 3 ], array[ 5 ],\n\t\t\t\t\t\t\t\t\t\t0, 0, 1\n\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttransform.premultiply( currentTransform );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn transform;\n\n\t\t}\n\n\t\tfunction transformPath( path, m ) {\n\n\t\t\tfunction transfVec2( v2 ) {\n\n\t\t\t\ttempV3.set( v2.x, v2.y, 1 ).applyMatrix3( m );\n\n\t\t\t\tv2.set( tempV3.x, tempV3.y );\n\n\t\t\t}\n\n\t\t\tfunction transfEllipseGeneric( curve ) {\n\n\t\t\t\t// For math description see:\n\t\t\t\t// https://math.stackexchange.com/questions/4544164\n\n\t\t\t\tconst a = curve.xRadius;\n\t\t\t\tconst b = curve.yRadius;\n\n\t\t\t\tconst cosTheta = Math.cos( curve.aRotation );\n\t\t\t\tconst sinTheta = Math.sin( curve.aRotation );\n\n\t\t\t\tconst v1 = new Vector3( a * cosTheta, a * sinTheta, 0 );\n\t\t\t\tconst v2 = new Vector3( - b * sinTheta, b * cosTheta, 0 );\n\n\t\t\t\tconst f1 = v1.applyMatrix3( m );\n\t\t\t\tconst f2 = v2.applyMatrix3( m );\n\n\t\t\t\tconst mF = tempTransform0.set(\n\t\t\t\t\tf1.x, f2.x, 0,\n\t\t\t\t\tf1.y, f2.y, 0,\n\t\t\t\t\t0, 0, 1,\n\t\t\t\t);\n\n\t\t\t\tconst mFInv = tempTransform1.copy( mF ).invert();\n\t\t\t\tconst mFInvT = tempTransform2.copy( mFInv ).transpose();\n\t\t\t\tconst mQ = mFInvT.multiply( mFInv );\n\t\t\t\tconst mQe = mQ.elements;\n\n\t\t\t\tconst ed = eigenDecomposition( mQe[ 0 ], mQe[ 1 ], mQe[ 4 ] );\n\t\t\t\tconst rt1sqrt = Math.sqrt( ed.rt1 );\n\t\t\t\tconst rt2sqrt = Math.sqrt( ed.rt2 );\n\n\t\t\t\tcurve.xRadius = 1 / rt1sqrt;\n\t\t\t\tcurve.yRadius = 1 / rt2sqrt;\n\t\t\t\tcurve.aRotation = Math.atan2( ed.sn, ed.cs );\n\n\t\t\t\tconst isFullEllipse =\n\t\t\t\t\t( curve.aEndAngle - curve.aStartAngle ) % ( 2 * Math.PI ) < Number.EPSILON;\n\n\t\t\t\t// Do not touch angles of a full ellipse because after transformation they\n\t\t\t\t// would converge to a single value effectively removing the whole curve\n\n\t\t\t\tif ( ! isFullEllipse ) {\n\n\t\t\t\t\tconst mDsqrt = tempTransform1.set(\n\t\t\t\t\t\trt1sqrt, 0, 0,\n\t\t\t\t\t\t0, rt2sqrt, 0,\n\t\t\t\t\t\t0, 0, 1,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst mRT = tempTransform2.set(\n\t\t\t\t\t\ted.cs, ed.sn, 0,\n\t\t\t\t\t\t- ed.sn, ed.cs, 0,\n\t\t\t\t\t\t0, 0, 1,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst mDRF = mDsqrt.multiply( mRT ).multiply( mF );\n\n\t\t\t\t\tconst transformAngle = phi => {\n\n\t\t\t\t\t\tconst { x: cosR, y: sinR } =\n\t\t\t\t\t\t\tnew Vector3( Math.cos( phi ), Math.sin( phi ), 0 ).applyMatrix3( mDRF );\n\n\t\t\t\t\t\treturn Math.atan2( sinR, cosR );\n\n\t\t\t\t\t};\n\n\t\t\t\t\tcurve.aStartAngle = transformAngle( curve.aStartAngle );\n\t\t\t\t\tcurve.aEndAngle = transformAngle( curve.aEndAngle );\n\n\t\t\t\t\tif ( isTransformFlipped( m ) ) {\n\n\t\t\t\t\t\tcurve.aClockwise = ! curve.aClockwise;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction transfEllipseNoSkew( curve ) {\n\n\t\t\t\t// Faster shortcut if no skew is applied\n\t\t\t\t// (e.g, a euclidean transform of a group containing the ellipse)\n\n\t\t\t\tconst sx = getTransformScaleX( m );\n\t\t\t\tconst sy = getTransformScaleY( m );\n\n\t\t\t\tcurve.xRadius *= sx;\n\t\t\t\tcurve.yRadius *= sy;\n\n\t\t\t\t// Extract rotation angle from the matrix of form:\n\t\t\t\t//\n\t\t\t\t// | cosθ sx -sinθ sy |\n\t\t\t\t// | sinθ sx cosθ sy |\n\t\t\t\t//\n\t\t\t\t// Remembering that tanθ = sinθ / cosθ; and that\n\t\t\t\t// `sx`, `sy`, or both might be zero.\n\t\t\t\tconst theta =\n\t\t\t\t\tsx > Number.EPSILON\n\t\t\t\t\t\t? Math.atan2( m.elements[ 1 ], m.elements[ 0 ] )\n\t\t\t\t\t\t: Math.atan2( - m.elements[ 3 ], m.elements[ 4 ] );\n\n\t\t\t\tcurve.aRotation += theta;\n\n\t\t\t\tif ( isTransformFlipped( m ) ) {\n\n\t\t\t\t\tcurve.aStartAngle *= - 1;\n\t\t\t\t\tcurve.aEndAngle *= - 1;\n\t\t\t\t\tcurve.aClockwise = ! curve.aClockwise;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst subPaths = path.subPaths;\n\n\t\t\tfor ( let i = 0, n = subPaths.length; i < n; i ++ ) {\n\n\t\t\t\tconst subPath = subPaths[ i ];\n\t\t\t\tconst curves = subPath.curves;\n\n\t\t\t\tfor ( let j = 0; j < curves.length; j ++ ) {\n\n\t\t\t\t\tconst curve = curves[ j ];\n\n\t\t\t\t\tif ( curve.isLineCurve ) {\n\n\t\t\t\t\t\ttransfVec2( curve.v1 );\n\t\t\t\t\t\ttransfVec2( curve.v2 );\n\n\t\t\t\t\t} else if ( curve.isCubicBezierCurve ) {\n\n\t\t\t\t\t\ttransfVec2( curve.v0 );\n\t\t\t\t\t\ttransfVec2( curve.v1 );\n\t\t\t\t\t\ttransfVec2( curve.v2 );\n\t\t\t\t\t\ttransfVec2( curve.v3 );\n\n\t\t\t\t\t} else if ( curve.isQuadraticBezierCurve ) {\n\n\t\t\t\t\t\ttransfVec2( curve.v0 );\n\t\t\t\t\t\ttransfVec2( curve.v1 );\n\t\t\t\t\t\ttransfVec2( curve.v2 );\n\n\t\t\t\t\t} else if ( curve.isEllipseCurve ) {\n\n\t\t\t\t\t\t// Transform ellipse center point\n\n\t\t\t\t\t\ttempV2.set( curve.aX, curve.aY );\n\t\t\t\t\t\ttransfVec2( tempV2 );\n\t\t\t\t\t\tcurve.aX = tempV2.x;\n\t\t\t\t\t\tcurve.aY = tempV2.y;\n\n\t\t\t\t\t\t// Transform ellipse shape parameters\n\n\t\t\t\t\t\tif ( isTransformSkewed( m ) ) {\n\n\t\t\t\t\t\t\ttransfEllipseGeneric( curve );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\ttransfEllipseNoSkew( curve );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction isTransformFlipped( m ) {\n\n\t\t\tconst te = m.elements;\n\t\t\treturn te[ 0 ] * te[ 4 ] - te[ 1 ] * te[ 3 ] < 0;\n\n\t\t}\n\n\t\tfunction isTransformSkewed( m ) {\n\n\t\t\tconst te = m.elements;\n\t\t\tconst basisDot = te[ 0 ] * te[ 3 ] + te[ 1 ] * te[ 4 ];\n\n\t\t\t// Shortcut for trivial rotations and transformations\n\t\t\tif ( basisDot === 0 ) return false;\n\n\t\t\tconst sx = getTransformScaleX( m );\n\t\t\tconst sy = getTransformScaleY( m );\n\n\t\t\treturn Math.abs( basisDot / ( sx * sy ) ) > Number.EPSILON;\n\n\t\t}\n\n\t\tfunction getTransformScaleX( m ) {\n\n\t\t\tconst te = m.elements;\n\t\t\treturn Math.sqrt( te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] );\n\n\t\t}\n\n\t\tfunction getTransformScaleY( m ) {\n\n\t\t\tconst te = m.elements;\n\t\t\treturn Math.sqrt( te[ 3 ] * te[ 3 ] + te[ 4 ] * te[ 4 ] );\n\n\t\t}\n\n\t\t// Calculates the eigensystem of a real symmetric 2x2 matrix\n\t\t// [ A B ]\n\t\t// [ B C ]\n\t\t// in the form\n\t\t// [ A B ] = [ cs -sn ] [ rt1 0 ] [ cs sn ]\n\t\t// [ B C ] [ sn cs ] [ 0 rt2 ] [ -sn cs ]\n\t\t// where rt1 >= rt2.\n\t\t//\n\t\t// Adapted from: https://www.mpi-hd.mpg.de/personalhomes/globes/3x3/index.html\n\t\t// -> Algorithms for real symmetric matrices -> Analytical (2x2 symmetric)\n\t\tfunction eigenDecomposition( A, B, C ) {\n\n\t\t\tlet rt1, rt2, cs, sn, t;\n\t\t\tconst sm = A + C;\n\t\t\tconst df = A - C;\n\t\t\tconst rt = Math.sqrt( df * df + 4 * B * B );\n\n\t\t\tif ( sm > 0 ) {\n\n\t\t\t\trt1 = 0.5 * ( sm + rt );\n\t\t\t\tt = 1 / rt1;\n\t\t\t\trt2 = A * t * C - B * t * B;\n\n\t\t\t} else if ( sm < 0 ) {\n\n\t\t\t\trt2 = 0.5 * ( sm - rt );\n\n\t\t\t} else {\n\n\t\t\t\t// This case needs to be treated separately to avoid div by 0\n\n\t\t\t\trt1 = 0.5 * rt;\n\t\t\t\trt2 = - 0.5 * rt;\n\n\t\t\t}\n\n\t\t\t// Calculate eigenvectors\n\n\t\t\tif ( df > 0 ) {\n\n\t\t\t\tcs = df + rt;\n\n\t\t\t} else {\n\n\t\t\t\tcs = df - rt;\n\n\t\t\t}\n\n\t\t\tif ( Math.abs( cs ) > 2 * Math.abs( B ) ) {\n\n\t\t\t\tt = - 2 * B / cs;\n\t\t\t\tsn = 1 / Math.sqrt( 1 + t * t );\n\t\t\t\tcs = t * sn;\n\n\t\t\t} else if ( Math.abs( B ) === 0 ) {\n\n\t\t\t\tcs = 1;\n\t\t\t\tsn = 0;\n\n\t\t\t} else {\n\n\t\t\t\tt = - 0.5 * cs / B;\n\t\t\t\tcs = 1 / Math.sqrt( 1 + t * t );\n\t\t\t\tsn = t * cs;\n\n\t\t\t}\n\n\t\t\tif ( df > 0 ) {\n\n\t\t\t\tt = cs;\n\t\t\t\tcs = - sn;\n\t\t\t\tsn = t;\n\n\t\t\t}\n\n\t\t\treturn { rt1, rt2, cs, sn };\n\n\t\t}\n\n\t\t//\n\n\t\tconst paths = [];\n\t\tconst stylesheets = {};\n\n\t\tconst transformStack = [];\n\n\t\tconst tempTransform0 = new Matrix3();\n\t\tconst tempTransform1 = new Matrix3();\n\t\tconst tempTransform2 = new Matrix3();\n\t\tconst tempTransform3 = new Matrix3();\n\t\tconst tempV2 = new Vector2();\n\t\tconst tempV3 = new Vector3();\n\n\t\tconst currentTransform = new Matrix3();\n\n\t\tconst xml = new DOMParser().parseFromString( text, 'image/svg+xml' ); // application/xml\n\n\t\tparseNode( xml.documentElement, {\n\t\t\tfill: '#000',\n\t\t\tfillOpacity: 1,\n\t\t\tstrokeOpacity: 1,\n\t\t\tstrokeWidth: 1,\n\t\t\tstrokeLineJoin: 'miter',\n\t\t\tstrokeLineCap: 'butt',\n\t\t\tstrokeMiterLimit: 4\n\t\t} );\n\n\t\tconst data = { paths: paths, xml: xml.documentElement };\n\n\t\t// console.log( paths );\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Creates from the given shape path and array of shapes.\n\t *\n\t * @param {ShapePath} shapePath - The shape path.\n\t * @return {Array<Shape>} An array of shapes.\n\t */\n\tstatic createShapes( shapePath ) {\n\n\t\tconst BIGNUMBER = 999999999;\n\n\t\tconst IntersectionLocationType = {\n\t\t\tORIGIN: 0,\n\t\t\tDESTINATION: 1,\n\t\t\tBETWEEN: 2,\n\t\t\tLEFT: 3,\n\t\t\tRIGHT: 4,\n\t\t\tBEHIND: 5,\n\t\t\tBEYOND: 6\n\t\t};\n\n\t\tconst classifyResult = {\n\t\t\tloc: IntersectionLocationType.ORIGIN,\n\t\t\tt: 0\n\t\t};\n\n\t\tfunction findEdgeIntersection( a0, a1, b0, b1 ) {\n\n\t\t\tconst x1 = a0.x;\n\t\t\tconst x2 = a1.x;\n\t\t\tconst x3 = b0.x;\n\t\t\tconst x4 = b1.x;\n\t\t\tconst y1 = a0.y;\n\t\t\tconst y2 = a1.y;\n\t\t\tconst y3 = b0.y;\n\t\t\tconst y4 = b1.y;\n\t\t\tconst nom1 = ( x4 - x3 ) * ( y1 - y3 ) - ( y4 - y3 ) * ( x1 - x3 );\n\t\t\tconst nom2 = ( x2 - x1 ) * ( y1 - y3 ) - ( y2 - y1 ) * ( x1 - x3 );\n\t\t\tconst denom = ( y4 - y3 ) * ( x2 - x1 ) - ( x4 - x3 ) * ( y2 - y1 );\n\t\t\tconst t1 = nom1 / denom;\n\t\t\tconst t2 = nom2 / denom;\n\n\t\t\tif ( ( ( denom === 0 ) && ( nom1 !== 0 ) ) || ( t1 <= 0 ) || ( t1 >= 1 ) || ( t2 < 0 ) || ( t2 > 1 ) ) {\n\n\t\t\t\t//1. lines are parallel or edges don't intersect\n\n\t\t\t\treturn null;\n\n\t\t\t} else if ( ( nom1 === 0 ) && ( denom === 0 ) ) {\n\n\t\t\t\t//2. lines are colinear\n\n\t\t\t\t//check if endpoints of edge2 (b0-b1) lies on edge1 (a0-a1)\n\t\t\t\tfor ( let i = 0; i < 2; i ++ ) {\n\n\t\t\t\t\tclassifyPoint( i === 0 ? b0 : b1, a0, a1 );\n\t\t\t\t\t//find position of this endpoints relatively to edge1\n\t\t\t\t\tif ( classifyResult.loc == IntersectionLocationType.ORIGIN ) {\n\n\t\t\t\t\t\tconst point = ( i === 0 ? b0 : b1 );\n\t\t\t\t\t\treturn { x: point.x, y: point.y, t: classifyResult.t };\n\n\t\t\t\t\t} else if ( classifyResult.loc == IntersectionLocationType.BETWEEN ) {\n\n\t\t\t\t\t\tconst x = + ( ( x1 + classifyResult.t * ( x2 - x1 ) ).toPrecision( 10 ) );\n\t\t\t\t\t\tconst y = + ( ( y1 + classifyResult.t * ( y2 - y1 ) ).toPrecision( 10 ) );\n\t\t\t\t\t\treturn { x: x, y: y, t: classifyResult.t, };\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t} else {\n\n\t\t\t\t//3. edges intersect\n\n\t\t\t\tfor ( let i = 0; i < 2; i ++ ) {\n\n\t\t\t\t\tclassifyPoint( i === 0 ? b0 : b1, a0, a1 );\n\n\t\t\t\t\tif ( classifyResult.loc == IntersectionLocationType.ORIGIN ) {\n\n\t\t\t\t\t\tconst point = ( i === 0 ? b0 : b1 );\n\t\t\t\t\t\treturn { x: point.x, y: point.y, t: classifyResult.t };\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst x = + ( ( x1 + t1 * ( x2 - x1 ) ).toPrecision( 10 ) );\n\t\t\t\tconst y = + ( ( y1 + t1 * ( y2 - y1 ) ).toPrecision( 10 ) );\n\t\t\t\treturn { x: x, y: y, t: t1 };\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction classifyPoint( p, edgeStart, edgeEnd ) {\n\n\t\t\tconst ax = edgeEnd.x - edgeStart.x;\n\t\t\tconst ay = edgeEnd.y - edgeStart.y;\n\t\t\tconst bx = p.x - edgeStart.x;\n\t\t\tconst by = p.y - edgeStart.y;\n\t\t\tconst sa = ax * by - bx * ay;\n\n\t\t\tif ( ( p.x === edgeStart.x ) && ( p.y === edgeStart.y ) ) {\n\n\t\t\t\tclassifyResult.loc = IntersectionLocationType.ORIGIN;\n\t\t\t\tclassifyResult.t = 0;\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( ( p.x === edgeEnd.x ) && ( p.y === edgeEnd.y ) ) {\n\n\t\t\t\tclassifyResult.loc = IntersectionLocationType.DESTINATION;\n\t\t\t\tclassifyResult.t = 1;\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( sa < - Number.EPSILON ) {\n\n\t\t\t\tclassifyResult.loc = IntersectionLocationType.LEFT;\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( sa > Number.EPSILON ) {\n\n\t\t\t\tclassifyResult.loc = IntersectionLocationType.RIGHT;\n\t\t\t\treturn;\n\n\n\t\t\t}\n\n\t\t\tif ( ( ( ax * bx ) < 0 ) || ( ( ay * by ) < 0 ) ) {\n\n\t\t\t\tclassifyResult.loc = IntersectionLocationType.BEHIND;\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( ( Math.sqrt( ax * ax + ay * ay ) ) < ( Math.sqrt( bx * bx + by * by ) ) ) {\n\n\t\t\t\tclassifyResult.loc = IntersectionLocationType.BEYOND;\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tlet t;\n\n\t\t\tif ( ax !== 0 ) {\n\n\t\t\t\tt = bx / ax;\n\n\t\t\t} else {\n\n\t\t\t\tt = by / ay;\n\n\t\t\t}\n\n\t\t\tclassifyResult.loc = IntersectionLocationType.BETWEEN;\n\t\t\tclassifyResult.t = t;\n\n\t\t}\n\n\t\tfunction getIntersections( path1, path2 ) {\n\n\t\t\tconst intersectionsRaw = [];\n\t\t\tconst intersections = [];\n\n\t\t\tfor ( let index = 1; index < path1.length; index ++ ) {\n\n\t\t\t\tconst path1EdgeStart = path1[ index - 1 ];\n\t\t\t\tconst path1EdgeEnd = path1[ index ];\n\n\t\t\t\tfor ( let index2 = 1; index2 < path2.length; index2 ++ ) {\n\n\t\t\t\t\tconst path2EdgeStart = path2[ index2 - 1 ];\n\t\t\t\t\tconst path2EdgeEnd = path2[ index2 ];\n\n\t\t\t\t\tconst intersection = findEdgeIntersection( path1EdgeStart, path1EdgeEnd, path2EdgeStart, path2EdgeEnd );\n\n\t\t\t\t\tif ( intersection !== null && intersectionsRaw.find( i => i.t <= intersection.t + Number.EPSILON && i.t >= intersection.t - Number.EPSILON ) === undefined ) {\n\n\t\t\t\t\t\tintersectionsRaw.push( intersection );\n\t\t\t\t\t\tintersections.push( new Vector2( intersection.x, intersection.y ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn intersections;\n\n\t\t}\n\n\t\tfunction getScanlineIntersections( scanline, boundingBox, paths ) {\n\n\t\t\tconst center = new Vector2();\n\t\t\tboundingBox.getCenter( center );\n\n\t\t\tconst allIntersections = [];\n\n\t\t\tpaths.forEach( path => {\n\n\t\t\t\t// check if the center of the bounding box is in the bounding box of the paths.\n\t\t\t\t// this is a pruning method to limit the search of intersections in paths that can't envelop of the current path.\n\t\t\t\t// if a path envelops another path. The center of that other path, has to be inside the bounding box of the enveloping path.\n\t\t\t\tif ( path.boundingBox.containsPoint( center ) ) {\n\n\t\t\t\t\tconst intersections = getIntersections( scanline, path.points );\n\n\t\t\t\t\tintersections.forEach( p => {\n\n\t\t\t\t\t\tallIntersections.push( { identifier: path.identifier, isCW: path.isCW, point: p } );\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tallIntersections.sort( ( i1, i2 ) => {\n\n\t\t\t\treturn i1.point.x - i2.point.x;\n\n\t\t\t} );\n\n\t\t\treturn allIntersections;\n\n\t\t}\n\n\t\tfunction isHoleTo( simplePath, allPaths, scanlineMinX, scanlineMaxX, _fillRule ) {\n\n\t\t\tif ( _fillRule === null || _fillRule === undefined || _fillRule === '' ) {\n\n\t\t\t\t_fillRule = 'nonzero';\n\n\t\t\t}\n\n\t\t\tconst centerBoundingBox = new Vector2();\n\t\t\tsimplePath.boundingBox.getCenter( centerBoundingBox );\n\n\t\t\tconst scanline = [ new Vector2( scanlineMinX, centerBoundingBox.y ), new Vector2( scanlineMaxX, centerBoundingBox.y ) ];\n\n\t\t\tconst scanlineIntersections = getScanlineIntersections( scanline, simplePath.boundingBox, allPaths );\n\n\t\t\tscanlineIntersections.sort( ( i1, i2 ) => {\n\n\t\t\t\treturn i1.point.x - i2.point.x;\n\n\t\t\t} );\n\n\t\t\tconst baseIntersections = [];\n\t\t\tconst otherIntersections = [];\n\n\t\t\tscanlineIntersections.forEach( i => {\n\n\t\t\t\tif ( i.identifier === simplePath.identifier ) {\n\n\t\t\t\t\tbaseIntersections.push( i );\n\n\t\t\t\t} else {\n\n\t\t\t\t\totherIntersections.push( i );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tconst firstXOfPath = baseIntersections[ 0 ].point.x;\n\n\t\t\t// build up the path hierarchy\n\t\t\tconst stack = [];\n\t\t\tlet i = 0;\n\n\t\t\twhile ( i < otherIntersections.length && otherIntersections[ i ].point.x < firstXOfPath ) {\n\n\t\t\t\tif ( stack.length > 0 && stack[ stack.length - 1 ] === otherIntersections[ i ].identifier ) {\n\n\t\t\t\t\tstack.pop();\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstack.push( otherIntersections[ i ].identifier );\n\n\t\t\t\t}\n\n\t\t\t\ti ++;\n\n\t\t\t}\n\n\t\t\tstack.push( simplePath.identifier );\n\n\t\t\tif ( _fillRule === 'evenodd' ) {\n\n\t\t\t\tconst isHole = stack.length % 2 === 0 ? true : false;\n\t\t\t\tconst isHoleFor = stack[ stack.length - 2 ];\n\n\t\t\t\treturn { identifier: simplePath.identifier, isHole: isHole, for: isHoleFor };\n\n\t\t\t} else if ( _fillRule === 'nonzero' ) {\n\n\t\t\t\t// check if path is a hole by counting the amount of paths with alternating rotations it has to cross.\n\t\t\t\tlet isHole = true;\n\t\t\t\tlet isHoleFor = null;\n\t\t\t\tlet lastCWValue = null;\n\n\t\t\t\tfor ( let i = 0; i < stack.length; i ++ ) {\n\n\t\t\t\t\tconst identifier = stack[ i ];\n\t\t\t\t\tif ( isHole ) {\n\n\t\t\t\t\t\tlastCWValue = allPaths[ identifier ].isCW;\n\t\t\t\t\t\tisHole = false;\n\t\t\t\t\t\tisHoleFor = identifier;\n\n\t\t\t\t\t} else if ( lastCWValue !== allPaths[ identifier ].isCW ) {\n\n\t\t\t\t\t\tlastCWValue = allPaths[ identifier ].isCW;\n\t\t\t\t\t\tisHole = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn { identifier: simplePath.identifier, isHole: isHole, for: isHoleFor };\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'fill-rule: \"' + _fillRule + '\" is currently not implemented.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// check for self intersecting paths\n\t\t// TODO\n\n\t\t// check intersecting paths\n\t\t// TODO\n\n\t\t// prepare paths for hole detection\n\t\tlet scanlineMinX = BIGNUMBER;\n\t\tlet scanlineMaxX = - BIGNUMBER;\n\n\t\tlet simplePaths = shapePath.subPaths.map( p => {\n\n\t\t\tconst points = p.getPoints();\n\t\t\tlet maxY = - BIGNUMBER;\n\t\t\tlet minY = BIGNUMBER;\n\t\t\tlet maxX = - BIGNUMBER;\n\t\t\tlet minX = BIGNUMBER;\n\n\t \t//points.forEach(p => p.y *= -1);\n\n\t\t\tfor ( let i = 0; i < points.length; i ++ ) {\n\n\t\t\t\tconst p = points[ i ];\n\n\t\t\t\tif ( p.y > maxY ) {\n\n\t\t\t\t\tmaxY = p.y;\n\n\t\t\t\t}\n\n\t\t\t\tif ( p.y < minY ) {\n\n\t\t\t\t\tminY = p.y;\n\n\t\t\t\t}\n\n\t\t\t\tif ( p.x > maxX ) {\n\n\t\t\t\t\tmaxX = p.x;\n\n\t\t\t\t}\n\n\t\t\t\tif ( p.x < minX ) {\n\n\t\t\t\t\tminX = p.x;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\t\t\tif ( scanlineMaxX <= maxX ) {\n\n\t\t\t\tscanlineMaxX = maxX + 1;\n\n\t\t\t}\n\n\t\t\tif ( scanlineMinX >= minX ) {\n\n\t\t\t\tscanlineMinX = minX - 1;\n\n\t\t\t}\n\n\t\t\treturn { curves: p.curves, points: points, isCW: ShapeUtils.isClockWise( points ), identifier: - 1, boundingBox: new Box2( new Vector2( minX, minY ), new Vector2( maxX, maxY ) ) };\n\n\t\t} );\n\n\t\tsimplePaths = simplePaths.filter( sp => sp.points.length > 1 );\n\n\t\tfor ( let identifier = 0; identifier < simplePaths.length; identifier ++ ) {\n\n\t\t\tsimplePaths[ identifier ].identifier = identifier;\n\n\t\t}\n\n\t\t// check if path is solid or a hole\n\t\tconst isAHole = simplePaths.map( p => isHoleTo( p, simplePaths, scanlineMinX, scanlineMaxX, ( shapePath.userData ? shapePath.userData.style.fillRule : undefined ) ) );\n\n\n\t\tconst shapesToReturn = [];\n\t\tsimplePaths.forEach( p => {\n\n\t\t\tconst amIAHole = isAHole[ p.identifier ];\n\n\t\t\tif ( ! amIAHole.isHole ) {\n\n\t\t\t\tconst shape = new Shape();\n\t\t\t\tshape.curves = p.curves;\n\t\t\t\tconst holes = isAHole.filter( h => h.isHole && h.for === p.identifier );\n\t\t\t\tholes.forEach( h => {\n\n\t\t\t\t\tconst hole = simplePaths[ h.identifier ];\n\t\t\t\t\tconst path = new Path();\n\t\t\t\t\tpath.curves = hole.curves;\n\t\t\t\t\tshape.holes.push( path );\n\n\t\t\t\t} );\n\t\t\t\tshapesToReturn.push( shape );\n\n\t\t\t}\n\n\t\t} );\n\n\t\treturn shapesToReturn;\n\n\t}\n\n\t/**\n\t * Returns a stroke style object from the given parameters.\n\t *\n\t * @param {number} [width=1] - The stroke width.\n\t * @param {string} [color='#000'] - The stroke color, as returned by {@link Color#getStyle}.\n\t * @param {'round'|'bevel'|'miter'|'miter-limit'} [lineJoin='miter'] - The line join style.\n\t * @param {'round'|'square'|'butt'} [lineCap='butt'] - The line cap style.\n\t * @param {number} [miterLimit=4] - Maximum join length, in multiples of the `width` parameter (join is truncated if it exceeds that distance).\n\t * @return {Object} The style object.\n\t */\n\tstatic getStrokeStyle( width, color, lineJoin, lineCap, miterLimit ) {\n\n\t\twidth = width !== undefined ? width : 1;\n\t\tcolor = color !== undefined ? color : '#000';\n\t\tlineJoin = lineJoin !== undefined ? lineJoin : 'miter';\n\t\tlineCap = lineCap !== undefined ? lineCap : 'butt';\n\t\tmiterLimit = miterLimit !== undefined ? miterLimit : 4;\n\n\t\treturn {\n\t\t\tstrokeColor: color,\n\t\t\tstrokeWidth: width,\n\t\t\tstrokeLineJoin: lineJoin,\n\t\t\tstrokeLineCap: lineCap,\n\t\t\tstrokeMiterLimit: miterLimit\n\t\t};\n\n\t}\n\n\t/**\n\t * Creates a stroke from an array of points.\n\t *\n\t * @param {Array<Vector2>} points - The points in 2D space. Minimum 2 points. The path can be open or closed (last point equals to first point).\n\t * @param {Object} style - Object with SVG properties as returned by `SVGLoader.getStrokeStyle()`, or `SVGLoader.parse()` in the `path.userData.style` object.\n\t * @param {number} [arcDivisions=12] - Arc divisions for round joins and endcaps.\n\t * @param {number} [minDistance=0.001] - Points closer to this distance will be merged.\n\t * @return {?BufferGeometry} The stroke geometry. UV coordinates are generated ('u' along path. 'v' across it, from left to right).\n\t * Returns `null` if not geometry was generated.\n\t */\n\tstatic pointsToStroke( points, style, arcDivisions, minDistance ) {\n\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\tif ( SVGLoader.pointsToStrokeWithBuffers( points, style, arcDivisions, minDistance, vertices, normals, uvs ) === 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tgeometry.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\treturn geometry;\n\n\t}\n\n\t/**\n\t * Creates a stroke from an array of points.\n\t *\n\t * @param {Array<Vector2>} points - The points in 2D space. Minimum 2 points.\n\t * @param {Object} style - Object with SVG properties as returned by `SVGLoader.getStrokeStyle()`, or `SVGLoader.parse()` in the `path.userData.style` object.\n\t * @param {number} [arcDivisions=12] - Arc divisions for round joins and endcaps.\n\t * @param {number} [minDistance=0.001] - Points closer to this distance will be merged.\n\t * @param {Array<number>} vertices - An array holding vertices.\n\t * @param {Array<number>} normals - An array holding normals.\n\t * @param {Array<number>} uvs - An array holding uvs.\n\t * @param {number} [vertexOffset=0] - The vertex offset.\n\t * @return {number} The number of vertices.\n\t */\n\tstatic pointsToStrokeWithBuffers( points, style, arcDivisions, minDistance, vertices, normals, uvs, vertexOffset ) {\n\n\t\t// This function can be called to update existing arrays or buffers.\n\t\t// Accepts same parameters as pointsToStroke, plus the buffers and optional offset.\n\t\t// Param vertexOffset: Offset vertices to start writing in the buffers (3 elements/vertex for vertices and normals, and 2 elements/vertex for uvs)\n\t\t// Returns number of written vertices / normals / uvs pairs\n\t\t// if 'vertices' parameter is undefined no triangles will be generated, but the returned vertices count will still be valid (useful to preallocate the buffers)\n\t\t// 'normals' and 'uvs' buffers are optional\n\n\t\tconst tempV2_1 = new Vector2();\n\t\tconst tempV2_2 = new Vector2();\n\t\tconst tempV2_3 = new Vector2();\n\t\tconst tempV2_4 = new Vector2();\n\t\tconst tempV2_5 = new Vector2();\n\t\tconst tempV2_6 = new Vector2();\n\t\tconst tempV2_7 = new Vector2();\n\t\tconst lastPointL = new Vector2();\n\t\tconst lastPointR = new Vector2();\n\t\tconst point0L = new Vector2();\n\t\tconst point0R = new Vector2();\n\t\tconst currentPointL = new Vector2();\n\t\tconst currentPointR = new Vector2();\n\t\tconst nextPointL = new Vector2();\n\t\tconst nextPointR = new Vector2();\n\t\tconst innerPoint = new Vector2();\n\t\tconst outerPoint = new Vector2();\n\n\t\tarcDivisions = arcDivisions !== undefined ? arcDivisions : 12;\n\t\tminDistance = minDistance !== undefined ? minDistance : 0.001;\n\t\tvertexOffset = vertexOffset !== undefined ? vertexOffset : 0;\n\n\t\t// First ensure there are no duplicated points\n\t\tpoints = removeDuplicatedPoints( points );\n\n\t\tconst numPoints = points.length;\n\n\t\tif ( numPoints < 2 ) return 0;\n\n\t\tconst isClosed = points[ 0 ].equals( points[ numPoints - 1 ] );\n\n\t\tlet currentPoint;\n\t\tlet previousPoint = points[ 0 ];\n\t\tlet nextPoint;\n\n\t\tconst strokeWidth2 = style.strokeWidth / 2;\n\n\t\tconst deltaU = 1 / ( numPoints - 1 );\n\t\tlet u0 = 0, u1;\n\n\t\tlet innerSideModified;\n\t\tlet joinIsOnLeftSide;\n\t\tlet isMiter;\n\t\tlet initialJoinIsOnLeftSide = false;\n\n\t\tlet numVertices = 0;\n\t\tlet currentCoordinate = vertexOffset * 3;\n\t\tlet currentCoordinateUV = vertexOffset * 2;\n\n\t\t// Get initial left and right stroke points\n\t\tgetNormal( points[ 0 ], points[ 1 ], tempV2_1 ).multiplyScalar( strokeWidth2 );\n\t\tlastPointL.copy( points[ 0 ] ).sub( tempV2_1 );\n\t\tlastPointR.copy( points[ 0 ] ).add( tempV2_1 );\n\t\tpoint0L.copy( lastPointL );\n\t\tpoint0R.copy( lastPointR );\n\n\t\tfor ( let iPoint = 1; iPoint < numPoints; iPoint ++ ) {\n\n\t\t\tcurrentPoint = points[ iPoint ];\n\n\t\t\t// Get next point\n\t\t\tif ( iPoint === numPoints - 1 ) {\n\n\t\t\t\tif ( isClosed ) {\n\n\t\t\t\t\t// Skip duplicated initial point\n\t\t\t\t\tnextPoint = points[ 1 ];\n\n\t\t\t\t} else nextPoint = undefined;\n\n\t\t\t} else {\n\n\t\t\t\tnextPoint = points[ iPoint + 1 ];\n\n\t\t\t}\n\n\t\t\t// Normal of previous segment in tempV2_1\n\t\t\tconst normal1 = tempV2_1;\n\t\t\tgetNormal( previousPoint, currentPoint, normal1 );\n\n\t\t\ttempV2_3.copy( normal1 ).multiplyScalar( strokeWidth2 );\n\t\t\tcurrentPointL.copy( currentPoint ).sub( tempV2_3 );\n\t\t\tcurrentPointR.copy( currentPoint ).add( tempV2_3 );\n\n\t\t\tu1 = u0 + deltaU;\n\n\t\t\tinnerSideModified = false;\n\n\t\t\tif ( nextPoint !== undefined ) {\n\n\t\t\t\t// Normal of next segment in tempV2_2\n\t\t\t\tgetNormal( currentPoint, nextPoint, tempV2_2 );\n\n\t\t\t\ttempV2_3.copy( tempV2_2 ).multiplyScalar( strokeWidth2 );\n\t\t\t\tnextPointL.copy( currentPoint ).sub( tempV2_3 );\n\t\t\t\tnextPointR.copy( currentPoint ).add( tempV2_3 );\n\n\t\t\t\tjoinIsOnLeftSide = true;\n\t\t\t\ttempV2_3.subVectors( nextPoint, previousPoint );\n\t\t\t\tif ( normal1.dot( tempV2_3 ) < 0 ) {\n\n\t\t\t\t\tjoinIsOnLeftSide = false;\n\n\t\t\t\t}\n\n\t\t\t\tif ( iPoint === 1 ) initialJoinIsOnLeftSide = joinIsOnLeftSide;\n\n\t\t\t\ttempV2_3.subVectors( nextPoint, currentPoint );\n\t\t\t\ttempV2_3.normalize();\n\t\t\t\tconst dot = Math.abs( normal1.dot( tempV2_3 ) );\n\n\t\t\t\t// If path is straight, don't create join\n\t\t\t\tif ( dot > Number.EPSILON ) {\n\n\t\t\t\t\t// Compute inner and outer segment intersections\n\t\t\t\t\tconst miterSide = strokeWidth2 / dot;\n\t\t\t\t\ttempV2_3.multiplyScalar( - miterSide );\n\t\t\t\t\ttempV2_4.subVectors( currentPoint, previousPoint );\n\t\t\t\t\ttempV2_5.copy( tempV2_4 ).setLength( miterSide ).add( tempV2_3 );\n\t\t\t\t\tinnerPoint.copy( tempV2_5 ).negate();\n\t\t\t\t\tconst miterLength2 = tempV2_5.length();\n\t\t\t\t\tconst segmentLengthPrev = tempV2_4.length();\n\t\t\t\t\ttempV2_4.divideScalar( segmentLengthPrev );\n\t\t\t\t\ttempV2_6.subVectors( nextPoint, currentPoint );\n\t\t\t\t\tconst segmentLengthNext = tempV2_6.length();\n\t\t\t\t\ttempV2_6.divideScalar( segmentLengthNext );\n\t\t\t\t\t// Check that previous and next segments doesn't overlap with the innerPoint of intersection\n\t\t\t\t\tif ( tempV2_4.dot( innerPoint ) < segmentLengthPrev && tempV2_6.dot( innerPoint ) < segmentLengthNext ) {\n\n\t\t\t\t\t\tinnerSideModified = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\touterPoint.copy( tempV2_5 ).add( currentPoint );\n\t\t\t\t\tinnerPoint.add( currentPoint );\n\n\t\t\t\t\tisMiter = false;\n\n\t\t\t\t\tif ( innerSideModified ) {\n\n\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\tnextPointR.copy( innerPoint );\n\t\t\t\t\t\t\tcurrentPointR.copy( innerPoint );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tnextPointL.copy( innerPoint );\n\t\t\t\t\t\t\tcurrentPointL.copy( innerPoint );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// The segment triangles are generated here if there was overlapping\n\n\t\t\t\t\t\tmakeSegmentTriangles();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tswitch ( style.strokeLineJoin ) {\n\n\t\t\t\t\t\tcase 'bevel':\n\n\t\t\t\t\t\t\tmakeSegmentWithBevelJoin( joinIsOnLeftSide, innerSideModified, u1 );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'round':\n\n\t\t\t\t\t\t\t// Segment triangles\n\n\t\t\t\t\t\t\tcreateSegmentTrianglesWithMiddleSection( joinIsOnLeftSide, innerSideModified );\n\n\t\t\t\t\t\t\t// Join triangles\n\n\t\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\t\tmakeCircularSector( currentPoint, currentPointL, nextPointL, u1, 0 );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tmakeCircularSector( currentPoint, nextPointR, currentPointR, u1, 1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'miter':\n\t\t\t\t\t\tcase 'miter-clip':\n\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\tconst miterFraction = ( strokeWidth2 * style.strokeMiterLimit ) / miterLength2;\n\n\t\t\t\t\t\t\tif ( miterFraction < 1 ) {\n\n\t\t\t\t\t\t\t\t// The join miter length exceeds the miter limit\n\n\t\t\t\t\t\t\t\tif ( style.strokeLineJoin !== 'miter-clip' ) {\n\n\t\t\t\t\t\t\t\t\tmakeSegmentWithBevelJoin( joinIsOnLeftSide, innerSideModified, u1 );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t// Segment triangles\n\n\t\t\t\t\t\t\t\t\tcreateSegmentTrianglesWithMiddleSection( joinIsOnLeftSide, innerSideModified );\n\n\t\t\t\t\t\t\t\t\t// Miter-clip join triangles\n\n\t\t\t\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\t\t\t\ttempV2_6.subVectors( outerPoint, currentPointL ).multiplyScalar( miterFraction ).add( currentPointL );\n\t\t\t\t\t\t\t\t\t\ttempV2_7.subVectors( outerPoint, nextPointL ).multiplyScalar( miterFraction ).add( nextPointL );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPointL, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_6, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_6, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_7, u1, 0 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_7, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( nextPointL, u1, 0 );\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\ttempV2_6.subVectors( outerPoint, currentPointR ).multiplyScalar( miterFraction ).add( currentPointR );\n\t\t\t\t\t\t\t\t\t\ttempV2_7.subVectors( outerPoint, nextPointR ).multiplyScalar( miterFraction ).add( nextPointR );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPointR, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_6, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_6, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_7, u1, 1 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_7, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( nextPointR, u1, 1 );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Miter join segment triangles\n\n\t\t\t\t\t\t\t\tif ( innerSideModified ) {\n\n\t\t\t\t\t\t\t\t\t// Optimized segment + join triangles\n\n\t\t\t\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 0 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( innerPoint, u1, 1 );\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 1 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( innerPoint, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 1 );\n\n\t\t\t\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\t\t\t\tnextPointL.copy( outerPoint );\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\tnextPointR.copy( outerPoint );\n\n\t\t\t\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t// Add extra miter join triangles\n\n\t\t\t\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPointL, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( nextPointL, u1, 0 );\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPointR, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( nextPointR, u1, 1 );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tisMiter = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// The segment triangles are generated here when two consecutive points are collinear\n\n\t\t\t\t\tmakeSegmentTriangles();\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// The segment triangles are generated here if it is the ending segment\n\n\t\t\t\tmakeSegmentTriangles();\n\n\t\t\t}\n\n\t\t\tif ( ! isClosed && iPoint === numPoints - 1 ) {\n\n\t\t\t\t// Start line endcap\n\t\t\t\taddCapGeometry( points[ 0 ], point0L, point0R, joinIsOnLeftSide, true, u0 );\n\n\t\t\t}\n\n\t\t\t// Increment loop variables\n\n\t\t\tu0 = u1;\n\n\t\t\tpreviousPoint = currentPoint;\n\n\t\t\tlastPointL.copy( nextPointL );\n\t\t\tlastPointR.copy( nextPointR );\n\n\t\t}\n\n\t\tif ( ! isClosed ) {\n\n\t\t\t// Ending line endcap\n\t\t\taddCapGeometry( currentPoint, currentPointL, currentPointR, joinIsOnLeftSide, false, u1 );\n\n\t\t} else if ( innerSideModified && vertices ) {\n\n\t\t\t// Modify path first segment vertices to adjust to the segments inner and outer intersections\n\n\t\t\tlet lastOuter = outerPoint;\n\t\t\tlet lastInner = innerPoint;\n\n\t\t\tif ( initialJoinIsOnLeftSide !== joinIsOnLeftSide ) {\n\n\t\t\t\tlastOuter = innerPoint;\n\t\t\t\tlastInner = outerPoint;\n\n\t\t\t}\n\n\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\tif ( isMiter || initialJoinIsOnLeftSide ) {\n\n\t\t\t\t\tlastInner.toArray( vertices, 0 * 3 );\n\t\t\t\t\tlastInner.toArray( vertices, 3 * 3 );\n\n\t\t\t\t\tif ( isMiter ) {\n\n\t\t\t\t\t\tlastOuter.toArray( vertices, 1 * 3 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( isMiter || ! initialJoinIsOnLeftSide ) {\n\n\t\t\t\t\tlastInner.toArray( vertices, 1 * 3 );\n\t\t\t\t\tlastInner.toArray( vertices, 3 * 3 );\n\n\t\t\t\t\tif ( isMiter ) {\n\n\t\t\t\t\t\tlastOuter.toArray( vertices, 0 * 3 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn numVertices;\n\n\t\t// -- End of algorithm\n\n\t\t// -- Functions\n\n\t\tfunction getNormal( p1, p2, result ) {\n\n\t\t\tresult.subVectors( p2, p1 );\n\t\t\treturn result.set( - result.y, result.x ).normalize();\n\n\t\t}\n\n\t\tfunction addVertex( position, u, v ) {\n\n\t\t\tif ( vertices ) {\n\n\t\t\t\tvertices[ currentCoordinate ] = position.x;\n\t\t\t\tvertices[ currentCoordinate + 1 ] = position.y;\n\t\t\t\tvertices[ currentCoordinate + 2 ] = 0;\n\n\t\t\t\tif ( normals ) {\n\n\t\t\t\t\tnormals[ currentCoordinate ] = 0;\n\t\t\t\t\tnormals[ currentCoordinate + 1 ] = 0;\n\t\t\t\t\tnormals[ currentCoordinate + 2 ] = 1;\n\n\t\t\t\t}\n\n\t\t\t\tcurrentCoordinate += 3;\n\n\t\t\t\tif ( uvs ) {\n\n\t\t\t\t\tuvs[ currentCoordinateUV ] = u;\n\t\t\t\t\tuvs[ currentCoordinateUV + 1 ] = v;\n\n\t\t\t\t\tcurrentCoordinateUV += 2;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tnumVertices += 3;\n\n\t\t}\n\n\t\tfunction makeCircularSector( center, p1, p2, u, v ) {\n\n\t\t\t// param p1, p2: Points in the circle arc.\n\t\t\t// p1 and p2 are in clockwise direction.\n\n\t\t\ttempV2_1.copy( p1 ).sub( center ).normalize();\n\t\t\ttempV2_2.copy( p2 ).sub( center ).normalize();\n\n\t\t\tlet angle = Math.PI;\n\t\t\tconst dot = tempV2_1.dot( tempV2_2 );\n\t\t\tif ( Math.abs( dot ) < 1 ) angle = Math.abs( Math.acos( dot ) );\n\n\t\t\tangle /= arcDivisions;\n\n\t\t\ttempV2_3.copy( p1 );\n\n\t\t\tfor ( let i = 0, il = arcDivisions - 1; i < il; i ++ ) {\n\n\t\t\t\ttempV2_4.copy( tempV2_3 ).rotateAround( center, angle );\n\n\t\t\t\taddVertex( tempV2_3, u, v );\n\t\t\t\taddVertex( tempV2_4, u, v );\n\t\t\t\taddVertex( center, u, 0.5 );\n\n\t\t\t\ttempV2_3.copy( tempV2_4 );\n\n\t\t\t}\n\n\t\t\taddVertex( tempV2_4, u, v );\n\t\t\taddVertex( p2, u, v );\n\t\t\taddVertex( center, u, 0.5 );\n\n\t\t}\n\n\t\tfunction makeSegmentTriangles() {\n\n\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\taddVertex( currentPointL, u1, 0 );\n\n\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\taddVertex( currentPointL, u1, 0 );\n\t\t\taddVertex( currentPointR, u1, 1 );\n\n\t\t}\n\n\t\tfunction makeSegmentWithBevelJoin( joinIsOnLeftSide, innerSideModified, u ) {\n\n\t\t\tif ( innerSideModified ) {\n\n\t\t\t\t// Optimized segment + bevel triangles\n\n\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t// Path segments triangles\n\n\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\taddVertex( currentPointL, u1, 0 );\n\n\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\taddVertex( currentPointL, u1, 0 );\n\t\t\t\t\taddVertex( innerPoint, u1, 1 );\n\n\t\t\t\t\t// Bevel join triangle\n\n\t\t\t\t\taddVertex( currentPointL, u, 0 );\n\t\t\t\t\taddVertex( nextPointL, u, 0 );\n\t\t\t\t\taddVertex( innerPoint, u, 0.5 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Path segments triangles\n\n\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\taddVertex( currentPointR, u1, 1 );\n\n\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\taddVertex( innerPoint, u1, 0 );\n\t\t\t\t\taddVertex( currentPointR, u1, 1 );\n\n\t\t\t\t\t// Bevel join triangle\n\n\t\t\t\t\taddVertex( currentPointR, u, 1 );\n\t\t\t\t\taddVertex( innerPoint, u, 0 );\n\t\t\t\t\taddVertex( nextPointR, u, 1 );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// Bevel join triangle. The segment triangles are done in the main loop\n\n\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\taddVertex( currentPointL, u, 0 );\n\t\t\t\t\taddVertex( nextPointL, u, 0 );\n\t\t\t\t\taddVertex( currentPoint, u, 0.5 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\taddVertex( currentPointR, u, 1 );\n\t\t\t\t\taddVertex( nextPointR, u, 0 );\n\t\t\t\t\taddVertex( currentPoint, u, 0.5 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction createSegmentTrianglesWithMiddleSection( joinIsOnLeftSide, innerSideModified ) {\n\n\t\t\tif ( innerSideModified ) {\n\n\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\taddVertex( currentPointL, u1, 0 );\n\n\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\taddVertex( currentPointL, u1, 0 );\n\t\t\t\t\taddVertex( innerPoint, u1, 1 );\n\n\t\t\t\t\taddVertex( currentPointL, u0, 0 );\n\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\taddVertex( innerPoint, u1, 1 );\n\n\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\taddVertex( nextPointL, u0, 0 );\n\t\t\t\t\taddVertex( innerPoint, u1, 1 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\taddVertex( currentPointR, u1, 1 );\n\n\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\taddVertex( innerPoint, u1, 0 );\n\t\t\t\t\taddVertex( currentPointR, u1, 1 );\n\n\t\t\t\t\taddVertex( currentPointR, u0, 1 );\n\t\t\t\t\taddVertex( innerPoint, u1, 0 );\n\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\n\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\taddVertex( innerPoint, u1, 0 );\n\t\t\t\t\taddVertex( nextPointR, u0, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction addCapGeometry( center, p1, p2, joinIsOnLeftSide, start, u ) {\n\n\t\t\t// param center: End point of the path\n\t\t\t// param p1, p2: Left and right cap points\n\n\t\t\tswitch ( style.strokeLineCap ) {\n\n\t\t\t\tcase 'round':\n\n\t\t\t\t\tif ( start ) {\n\n\t\t\t\t\t\tmakeCircularSector( center, p2, p1, u, 0.5 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tmakeCircularSector( center, p1, p2, u, 0.5 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'square':\n\n\t\t\t\t\tif ( start ) {\n\n\t\t\t\t\t\ttempV2_1.subVectors( p1, center );\n\t\t\t\t\t\ttempV2_2.set( tempV2_1.y, - tempV2_1.x );\n\n\t\t\t\t\t\ttempV2_3.addVectors( tempV2_1, tempV2_2 ).add( center );\n\t\t\t\t\t\ttempV2_4.subVectors( tempV2_2, tempV2_1 ).add( center );\n\n\t\t\t\t\t\t// Modify already existing vertices\n\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\ttempV2_3.toArray( vertices, 1 * 3 );\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, 0 * 3 );\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, 3 * 3 );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\ttempV2_3.toArray( vertices, 1 * 3 );\n\t\t\t\t\t\t\t// using tempV2_4 to update 3rd vertex if the uv.y of 3rd vertex is 1\n\t\t\t\t\t\t\tuvs[ 3 * 2 + 1 ] === 1 ? tempV2_4.toArray( vertices, 3 * 3 ) : tempV2_3.toArray( vertices, 3 * 3 );\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, 0 * 3 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttempV2_1.subVectors( p2, center );\n\t\t\t\t\t\ttempV2_2.set( tempV2_1.y, - tempV2_1.x );\n\n\t\t\t\t\t\ttempV2_3.addVectors( tempV2_1, tempV2_2 ).add( center );\n\t\t\t\t\t\ttempV2_4.subVectors( tempV2_2, tempV2_1 ).add( center );\n\n\t\t\t\t\t\tconst vl = vertices.length;\n\n\t\t\t\t\t\t// Modify already existing vertices\n\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\ttempV2_3.toArray( vertices, vl - 1 * 3 );\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, vl - 2 * 3 );\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, vl - 4 * 3 );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, vl - 2 * 3 );\n\t\t\t\t\t\t\ttempV2_3.toArray( vertices, vl - 1 * 3 );\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, vl - 4 * 3 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'butt':\n\t\t\t\tdefault:\n\n\t\t\t\t\t// Nothing to do here\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction removeDuplicatedPoints( points ) {\n\n\t\t\t// Creates a new array if necessary with duplicated points removed.\n\t\t\t// This does not remove duplicated initial and ending points of a closed path.\n\n\t\t\tlet dupPoints = false;\n\t\t\tfor ( let i = 1, n = points.length - 1; i < n; i ++ ) {\n\n\t\t\t\tif ( points[ i ].distanceTo( points[ i + 1 ] ) < minDistance ) {\n\n\t\t\t\t\tdupPoints = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ! dupPoints ) return points;\n\n\t\t\tconst newPoints = [];\n\t\t\tnewPoints.push( points[ 0 ] );\n\n\t\t\tfor ( let i = 1, n = points.length - 1; i < n; i ++ ) {\n\n\t\t\t\tif ( points[ i ].distanceTo( points[ i + 1 ] ) >= minDistance ) {\n\n\t\t\t\t\tnewPoints.push( points[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tnewPoints.push( points[ points.length - 1 ] );\n\n\t\t\treturn newPoints;\n\n\t\t}\n\n\t}\n\n\n}\n\nexport { SVGLoader };\n","import React, { useEffect, useMemo, useState } from 'react';\nimport * as THREE from 'three';\nimport { SVGLoader, type SVGResult } from 'three/examples/jsm/loaders/SVGLoader.js';\nimport {\n inlineSvgStyles,\n isInteractiveGroupLabel,\n isStoreFolderLabel,\n resolveLayerStyle,\n} from '../../core';\n\nconst BASE_Z = -2;\n\nfunction getLayerNameFromNode(node: Element | undefined): string | undefined {\n if (!node || node.nodeType !== 1) return undefined;\n let current: Element | null = node;\n while (current) {\n const id = current.getAttribute('id');\n if (id) return id;\n current = current.parentElement;\n }\n return undefined;\n}\n\nfunction isInteractiveAncestor(node: Element | undefined): boolean {\n if (!node) return false;\n let current: Element | null = node;\n while (current) {\n const id = current.getAttribute('id') ?? '';\n const dataName = current.getAttribute('data-name') ?? '';\n if (isInteractiveGroupLabel(id) || isInteractiveGroupLabel(dataName)) return true;\n if (isStoreFolderLabel(id) || isStoreFolderLabel(dataName)) return true;\n current = current.parentElement;\n }\n return false;\n}\n\n/** Same contract as v1 `getMediaProxyUrl`: proxy base + encoded URL, no query key. */\nexport function resolveFetchUrl(url: string, imageProxyUrl?: string | null): string {\n if (!imageProxyUrl) return url;\n return imageProxyUrl + encodeURIComponent(url);\n}\n\nexport interface SvgVectorLayerProps {\n url: string;\n /** sourceSvgId values held in cm_shapes — skip drawing these (DB owns them). */\n suppressIds?: ReadonlySet<string>;\n imageProxyUrl?: string | null;\n is3d?: boolean;\n}\n\ninterface PreparedMesh {\n key: string;\n shapes: THREE.Shape[];\n color: THREE.Color;\n opacity: number;\n extrude: number;\n renderOrder: number;\n}\n\n/**\n * Live outdoor SVG as real vector geometry (not a raster texture).\n * Applies house-style colors for reserved layer names; otherwise keeps\n * Illustrator fills. Skips route-path* and interactive ids owned by the DB.\n * Coordinates stay in SVG user space — `MapScene` flips the whole scene.\n */\nexport function SvgVectorLayer({\n url,\n suppressIds,\n imageProxyUrl,\n is3d = false,\n}: SvgVectorLayerProps) {\n const [result, setResult] = useState<SVGResult | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n const fetchUrl = resolveFetchUrl(url, imageProxyUrl);\n fetch(fetchUrl)\n .then((res) => {\n if (!res.ok) throw new Error(`SVG fetch ${res.status}`);\n return res.text();\n })\n .then((text) => {\n if (cancelled) return;\n const inlined = inlineSvgStyles(text);\n const loader = new SVGLoader();\n setResult(loader.parse(inlined));\n })\n .catch((err) => {\n if (cancelled) return;\n setResult(null);\n // Silence here used to hide CORS failures as \"outdoor has no decoration\".\n console.warn(\n `[eyeon-map] Outdoor SVG failed to load from ${fetchUrl}. ` +\n 'If this is a cross-origin error, pass `imageProxyUrl` to MapViewer.',\n err,\n );\n });\n return () => {\n cancelled = true;\n };\n }, [url, imageProxyUrl]);\n\n const meshes = useMemo(() => {\n if (!result) return [] as PreparedMesh[];\n const out: PreparedMesh[] = [];\n let idx = 0;\n for (const path of result.paths) {\n const node = path.userData?.node as Element | undefined;\n const layerName = getLayerNameFromNode(node);\n if (layerName?.toLowerCase().startsWith('route-path')) continue;\n if (layerName && suppressIds?.has(layerName)) continue;\n if (isInteractiveAncestor(node) && !layerName) continue;\n // Whole INTERACTIVE / STORES folders are owned by DB shapes.\n if (layerName && (isInteractiveGroupLabel(layerName) || isStoreFolderLabel(layerName))) {\n continue;\n }\n if (node && isInteractiveAncestor(node) && layerName && suppressIds?.has(layerName)) {\n continue;\n }\n // Skip paths inside INTERACTIVE/STORES even when not yet in DB (assignable units).\n if (node && isInteractiveAncestor(node)) continue;\n\n const shapes = SVGLoader.createShapes(path);\n if (shapes.length === 0) continue;\n\n const layerStyle = resolveLayerStyle(layerName);\n const color = new THREE.Color();\n if (layerStyle?.fill) {\n color.set(layerStyle.fill);\n } else if (path.color) {\n color.copy(path.color);\n } else {\n color.set('#cccccc');\n }\n if (layerStyle?.stroke && !layerStyle.fill) {\n color.set(layerStyle.stroke);\n }\n\n const opacity =\n typeof path.userData?.style?.opacity === 'number'\n ? path.userData.style.opacity\n : 1;\n const extrude =\n is3d && layerStyle?.extrudeHeight != null ? layerStyle.extrudeHeight : 0;\n\n out.push({\n key: `${layerName ?? 'path'}-${idx++}`,\n shapes,\n color,\n opacity,\n extrude,\n renderOrder: layerStyle?.renderOrder ?? 2,\n });\n }\n return out;\n }, [result, suppressIds, is3d]);\n\n if (!result || meshes.length === 0) return null;\n\n return (\n <group position={[0, 0, BASE_Z]} renderOrder={-20}>\n {meshes.map((m) =>\n m.shapes.map((shape, si) => (\n <mesh key={`${m.key}-${si}`} renderOrder={m.renderOrder}>\n {m.extrude > 0 ? (\n <extrudeGeometry\n args={[shape, { depth: m.extrude, bevelEnabled: false }]}\n />\n ) : (\n <shapeGeometry args={[shape]} />\n )}\n <meshBasicMaterial\n color={m.color}\n transparent={m.opacity < 1}\n opacity={m.opacity}\n depthWrite={false}\n toneMapped={false}\n side={THREE.DoubleSide}\n />\n </mesh>\n )),\n )}\n </group>\n );\n}\n","import type { SceneBounds, Vec2 } from '../core';\n\n/**\n * Stored geometry is raw SVG user space, where Y grows downward. The scene\n * mirrors Y once so the camera can keep a conventional `up = [0, 1, 0]`.\n *\n * Do not \"fix\" orientation by setting `up = [0, -1, 0]` instead: three.js\n * derives the camera's right axis from `up × forward`, so a negative up also\n * mirrors X and the map renders rotated 180° rather than flipped.\n */\nexport const SCENE_FLIP_SCALE: [number, number, number] = [1, -1, 1];\n\n/** Stored SVG-space point → view space, matching `SCENE_FLIP_SCALE`. */\nexport function dataToViewPoint(point: Vec2): Vec2 {\n return { x: point.x, y: -point.y };\n}\n\n/** Stored SVG-space bounds → view space, for camera and controls placement. */\nexport function viewBoundsFromData(bounds: SceneBounds): SceneBounds {\n return {\n ...bounds,\n minY: -bounds.maxY,\n maxY: -bounds.minY,\n cy: -bounds.cy,\n };\n}\n\n/**\n * Fit an orthographic camera so the map fills the canvas on the limiting\n * axis (width or height) with no extra inset.\n */\nexport function fitOrthoZoom(\n viewWidth: number,\n viewHeight: number,\n worldWidth: number,\n worldHeight: number,\n): number {\n const zoomX = Math.max(viewWidth, 1) / Math.max(worldWidth, 1);\n const zoomY = Math.max(viewHeight, 1) / Math.max(worldHeight, 1);\n return Math.min(zoomX, zoomY);\n}\n\nexport function boundsExtent(bounds: SceneBounds): { width: number; height: number } {\n return {\n width: Math.max(bounds.maxX - bounds.minX, 1),\n height: Math.max(bounds.maxY - bounds.minY, 1),\n };\n}\n\nexport function nextOrthoZoom(\n current: number,\n direction: 1 | -1,\n step: number,\n min: number,\n max: number,\n): number {\n const factor = 1 + Math.min(Math.max(step, 0.15), 1) * 0.5;\n const next = direction > 0 ? current * factor : current / factor;\n return Math.min(max, Math.max(min, next));\n}\n\n/** three.js `MOUSE` / `TOUCH` enums — left-drag pans the 2D admin/public map. */\nconst MOUSE_ROTATE = 0;\nconst MOUSE_DOLLY = 1;\nconst MOUSE_PAN = 2;\nconst TOUCH_ROTATE = 0;\nconst TOUCH_PAN = 1;\nconst TOUCH_DOLLY_PAN = 2;\n\nexport function orbitMouseButtons(is3d: boolean): {\n LEFT: number;\n MIDDLE: number;\n RIGHT: number;\n} {\n if (is3d) {\n return { LEFT: MOUSE_ROTATE, MIDDLE: MOUSE_DOLLY, RIGHT: MOUSE_PAN };\n }\n return { LEFT: MOUSE_PAN, MIDDLE: MOUSE_DOLLY, RIGHT: MOUSE_PAN };\n}\n\nexport function orbitTouches(is3d: boolean): { ONE: number; TWO: number } {\n if (is3d) {\n return { ONE: TOUCH_ROTATE, TWO: TOUCH_DOLLY_PAN };\n }\n return { ONE: TOUCH_PAN, TWO: TOUCH_DOLLY_PAN };\n}\n","import React, { useCallback, useEffect, useImperativeHandle, useRef } from 'react';\nimport { useThree } from '@react-three/fiber';\nimport type { OrbitControls } from 'three-stdlib';\nimport * as THREE from 'three';\nimport type { SceneBounds, ThemeDefaults } from '../../core';\nimport { boundsExtent, fitOrthoZoom, nextOrthoZoom } from '../camera';\n\nexport interface MapCameraHandle {\n zoomIn: () => void;\n zoomOut: () => void;\n reset: () => void;\n}\n\nexport interface CameraRigProps {\n /** View-space bounds — already Y-flipped by the scene, so up is +Y. */\n bounds: SceneBounds;\n theme: ThemeDefaults;\n is3d: boolean;\n controlsRef: React.RefObject<OrbitControls | null>;\n cameraRef?: React.Ref<MapCameraHandle | null>;\n}\n\nexport function CameraRig({\n bounds,\n theme,\n is3d,\n controlsRef,\n cameraRef,\n}: CameraRigProps) {\n const { camera, size, invalidate } = useThree();\n const userAdjusted = useRef(false);\n\n const applyFit = useCallback(() => {\n const controls = controlsRef.current;\n const { width, height } = boundsExtent(bounds);\n camera.up.set(0, 1, 0);\n if (camera instanceof THREE.OrthographicCamera && !is3d) {\n const zoom = fitOrthoZoom(size.width, size.height, width, height);\n camera.position.set(bounds.cx, bounds.cy, 500);\n camera.zoom = zoom;\n camera.updateProjectionMatrix();\n } else {\n camera.position.set(bounds.cx, bounds.cy - bounds.size * 0.35, bounds.size * 0.85);\n camera.lookAt(bounds.cx, bounds.cy, 0);\n }\n if (controls) {\n controls.target.set(bounds.cx, bounds.cy, 0);\n controls.update();\n }\n invalidate();\n }, [\n bounds,\n camera,\n controlsRef,\n invalidate,\n is3d,\n size.height,\n size.width,\n ]);\n\n const zoomBy = useCallback(\n (direction: 1 | -1) => {\n userAdjusted.current = true;\n const controls = controlsRef.current;\n if (camera instanceof THREE.OrthographicCamera && !is3d) {\n const { width, height } = boundsExtent(bounds);\n const fit = fitOrthoZoom(size.width, size.height, width, height);\n camera.zoom = nextOrthoZoom(\n camera.zoom,\n direction,\n theme.ZOOM_STEP,\n fit * 0.2,\n fit * 10,\n );\n camera.updateProjectionMatrix();\n } else if (controls) {\n const offset = camera.position.clone().sub(controls.target);\n const factor = 1 + Math.min(Math.max(theme.ZOOM_STEP, 0.15), 1) * 0.5;\n const next = direction > 0 ? offset.length() / factor : offset.length() * factor;\n offset.setLength(\n Math.min(theme.CAMERA_MAX_DISTANCE, Math.max(theme.CAMERA_MIN_DISTANCE, next)),\n );\n camera.position.copy(controls.target).add(offset);\n }\n controls?.update();\n invalidate();\n },\n [bounds, camera, controlsRef, invalidate, is3d, size.height, size.width, theme],\n );\n\n useImperativeHandle(\n cameraRef,\n () => ({\n zoomIn: () => zoomBy(1),\n zoomOut: () => zoomBy(-1),\n reset: () => {\n userAdjusted.current = false;\n applyFit();\n },\n }),\n [applyFit, zoomBy],\n );\n\n useEffect(() => {\n if (size.width < 2 || size.height < 2) return;\n userAdjusted.current = false;\n applyFit();\n }, [applyFit, bounds.cx, bounds.cy, bounds.maxX, bounds.maxY, bounds.minX, bounds.minY]);\n\n useEffect(() => {\n if (size.width < 2 || size.height < 2 || userAdjusted.current) return;\n applyFit();\n }, [applyFit, size.height, size.width]);\n\n return null;\n}\n","import React, { useMemo, useRef } from 'react';\nimport { Canvas } from '@react-three/fiber';\nimport { OrthographicCamera, OrbitControls } from '@react-three/drei';\nimport type { OrbitControls as OrbitControlsImpl } from 'three-stdlib';\nimport type { PathResult, PublishedDocument, ThemeDefaults } from '../../core';\nimport { boundsFromStackedLevels, isOutdoorLevel, viewerLevelStack } from '../../core';\nimport { LevelMeshes } from './LevelMeshes';\nimport { RouteLine } from './RouteLine';\nimport { SvgVectorLayer } from './SvgVectorLayer';\nimport { CameraRig, type MapCameraHandle } from './CameraRig';\nimport {\n SCENE_FLIP_SCALE,\n orbitMouseButtons,\n orbitTouches,\n viewBoundsFromData,\n} from '../camera';\n\nconst OUTDOOR_Z = -1;\n\nexport interface MapSceneProps {\n doc: PublishedDocument;\n theme: ThemeDefaults;\n activeLevelId: number | null;\n route: PathResult | null;\n selectedRetailerId?: number | null;\n cameraRef?: React.Ref<MapCameraHandle | null>;\n onSelectShape?: (shapeId: number, levelId: number) => void;\n imageProxyUrl?: string | null;\n /** Keep pointer events inside the map canvas host so header/footer stay clickable. */\n eventSource?: React.RefObject<HTMLElement | null>;\n}\n\nexport function MapScene({\n doc,\n theme,\n activeLevelId,\n route,\n selectedRetailerId,\n cameraRef,\n onSelectShape,\n imageProxyUrl,\n eventSource,\n}: MapSceneProps) {\n const is3d = theme.MAP_STYLE === '3D';\n const controlsRef = useRef<OrbitControlsImpl | null>(null);\n\n const stacked = useMemo(\n () => viewerLevelStack(doc.levels, activeLevelId),\n [doc.levels, activeLevelId],\n );\n\n const bounds = useMemo(\n () => boundsFromStackedLevels(doc.levels, activeLevelId, doc.baseViewbox),\n [doc.levels, doc.baseViewbox, activeLevelId],\n );\n\n const view = useMemo(() => viewBoundsFromData(bounds), [bounds]);\n\n const outdoorLevel = useMemo(\n () => doc.levels.find((level) => isOutdoorLevel(level)) ?? null,\n [doc.levels],\n );\n\n const outdoorSvgUrl =\n outdoorLevel?.sourceSvgUrl ?? doc.baseSvgUrl ?? null;\n\n const suppressIds = useMemo(() => {\n const ids = new Set<string>();\n if (!outdoorLevel) return ids;\n for (const shape of outdoorLevel.shapes) {\n if (shape.sourceSvgId) ids.add(shape.sourceSvgId);\n }\n return ids;\n }, [outdoorLevel]);\n\n const showOutdoorSvg = stacked.some((level) => isOutdoorLevel(level));\n\n return (\n <Canvas\n style={{ width: '100%', height: '100%', background: theme.MAP_BACKGROUND_COLOR }}\n eventSource={eventSource ?? undefined}\n eventPrefix=\"offset\"\n orthographic={!is3d}\n dpr={[1, 2]}\n flat\n gl={{ antialias: true }}\n camera={\n is3d\n ? {\n position: [view.cx, view.cy - view.size * 0.35, view.size * 0.85],\n fov: 50,\n near: 1,\n far: 10000,\n up: [0, 1, 0],\n }\n : undefined\n }\n >\n {!is3d && (\n <OrthographicCamera\n makeDefault\n position={[view.cx, view.cy, 500]}\n up={[0, 1, 0]}\n near={0.1}\n far={5000}\n />\n )}\n <color attach=\"background\" args={[theme.MAP_BACKGROUND_COLOR]} />\n <ambientLight intensity={4} color=\"#c4c4c4\" />\n <directionalLight position={[0, 400, 0]} color=\"#ffffff\" intensity={0.3} />\n <directionalLight position={[0, 0, 400]} color=\"#c4c4c4\" intensity={0.2} />\n <directionalLight position={[0, 0, -400]} color=\"#c4c4c4\" intensity={0.2} />\n\n <group scale={SCENE_FLIP_SCALE}>\n {showOutdoorSvg && outdoorSvgUrl ? (\n <SvgVectorLayer\n url={outdoorSvgUrl}\n suppressIds={suppressIds}\n imageProxyUrl={imageProxyUrl}\n is3d={is3d}\n />\n ) : null}\n\n {stacked.map((level) => {\n const outdoor = isOutdoorLevel(level);\n const transform = level.transform;\n return (\n <group\n key={level.id}\n position={[\n transform.translateX,\n transform.translateY,\n outdoor ? OUTDOOR_Z : 0,\n ]}\n rotation={[0, 0, (transform.rotate * Math.PI) / 180]}\n scale={transform.scale || 1}\n >\n <LevelMeshes\n level={level}\n theme={theme}\n is3d={is3d}\n selectedRetailerId={selectedRetailerId}\n interactiveOnly={outdoor && Boolean(outdoorSvgUrl)}\n onSelectShape={(shapeId) => onSelectShape?.(shapeId, level.id)}\n />\n </group>\n );\n })}\n\n {route && (\n <RouteLine\n route={route}\n activeLevelId={activeLevelId}\n color={theme.ACCENT_COLOR}\n />\n )}\n </group>\n\n <OrbitControls\n ref={controlsRef}\n makeDefault\n enableDamping={false}\n enableRotate={is3d}\n enablePan\n screenSpacePanning\n mouseButtons={orbitMouseButtons(is3d)}\n touches={orbitTouches(is3d)}\n target={[view.cx, view.cy, 0]}\n maxDistance={theme.CAMERA_MAX_DISTANCE}\n minDistance={theme.CAMERA_MIN_DISTANCE}\n />\n <CameraRig\n bounds={view}\n theme={theme}\n is3d={is3d}\n controlsRef={controlsRef}\n cameraRef={cameraRef}\n />\n </Canvas>\n );\n}\n","import React, { useMemo, useState } from 'react';\nimport type {\n CmAmenityCatalogItem,\n PathResult,\n PublishedDocument,\n} from '../../core';\n\nexport interface RuntimeChromeProps {\n doc: PublishedDocument;\n amenities: CmAmenityCatalogItem[];\n activeLevelId: number | null;\n onActiveLevelChange: (id: number) => void;\n fromAnchorId: number | null;\n toAnchorId: number | null;\n onFromChange: (id: number | null) => void;\n onToChange: (id: number | null) => void;\n accessibleOnly: boolean;\n onAccessibleOnlyChange: (v: boolean) => void;\n route: PathResult | null;\n showSearch?: boolean;\n showAmenities?: boolean;\n}\n\ninterface ListItem {\n id: string;\n label: string;\n group: string;\n anchorId: number | null;\n levelId: number;\n kind: 'store' | 'amenity';\n amenityId: number | null;\n}\n\nfunction itemLabel(\n shape: PublishedDocument['levels'][number]['shapes'][number],\n amenityName?: string,\n): string {\n return (\n shape.assignment?.customLabel ||\n amenityName ||\n shape.label.text ||\n shape.assignment?.unitNumber ||\n shape.key\n );\n}\n\nexport function RuntimeChrome({\n doc,\n amenities,\n onActiveLevelChange,\n fromAnchorId,\n toAnchorId,\n onFromChange,\n onToChange,\n accessibleOnly,\n onAccessibleOnlyChange,\n route,\n showSearch = true,\n showAmenities = true,\n}: RuntimeChromeProps) {\n const [query, setQuery] = useState('');\n const [selectedItem, setSelectedItem] = useState<ListItem | null>(null);\n\n const items = useMemo(() => {\n const list: ListItem[] = [];\n for (const level of doc.levels) {\n for (const shape of level.shapes) {\n const anchor = level.anchors.find((a) => a.shapeId === shape.id) ?? null;\n if (shape.kind === 'unit') {\n list.push({\n id: `store-${shape.id}`,\n label: itemLabel(shape),\n group: level.name,\n anchorId: anchor?.id ?? null,\n levelId: level.id,\n kind: 'store',\n amenityId: null,\n });\n }\n if (shape.kind === 'amenity' && shape.assignment?.amenityId) {\n const amenity = amenities.find((a) => a.id === shape.assignment!.amenityId);\n list.push({\n id: `amenity-${shape.id}`,\n label: itemLabel(shape, amenity?.name),\n group: 'Amenities',\n anchorId: anchor?.id ?? null,\n levelId: level.id,\n kind: 'amenity',\n amenityId: amenity?.id ?? shape.assignment.amenityId,\n });\n }\n }\n }\n return list;\n }, [doc, amenities]);\n\n const filtered = useMemo(() => {\n const q = query.trim().toLowerCase();\n if (!q) return items;\n return items.filter((i) => i.label.toLowerCase().includes(q));\n }, [items, query]);\n\n const grouped = useMemo(() => {\n const map = new Map<string, ListItem[]>();\n for (const item of filtered) {\n const arr = map.get(item.group) ?? [];\n arr.push(item);\n map.set(item.group, arr);\n }\n return Array.from(map.entries());\n }, [filtered]);\n\n const anchorOptions = items.filter((i) => i.anchorId != null);\n const hasQuery = query.trim().length > 0;\n\n const selectItem = (item: ListItem) => {\n setSelectedItem(item);\n if (item.anchorId != null) {\n onToChange(item.anchorId);\n onActiveLevelChange(item.levelId);\n }\n };\n\n if (!showSearch && !(showAmenities && amenities.length > 0)) {\n return null;\n }\n\n return (\n <div className=\"eyeon-map-chrome\">\n <div className=\"eyeon-map-chrome__top\">\n {showSearch && (\n <input\n type=\"search\"\n className=\"eyeon-map-chrome__search-input\"\n placeholder=\"Search...\"\n aria-label=\"Search...\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n />\n )}\n\n {showAmenities && amenities.length > 0 && (\n <div className=\"eyeon-map-chrome__amenities\">\n {amenities.map((a) => (\n <button\n key={a.id}\n type=\"button\"\n className=\"eyeon-map-chrome__amenity\"\n aria-label={a.name}\n onClick={() => {\n const match = items.find(\n (i) =>\n i.kind === 'amenity' &&\n i.amenityId === a.id &&\n i.anchorId != null,\n );\n if (match) selectItem(match);\n }}\n >\n {a.builtinIcon ? (\n <span className=\"eyeon-map-chrome__amenity-icon\">{a.builtinIcon}</span>\n ) : (\n <span className=\"eyeon-map-chrome__amenity-label\">{a.name.slice(0, 2)}</span>\n )}\n </button>\n ))}\n </div>\n )}\n </div>\n\n {showSearch && hasQuery && (\n <div className=\"eyeon-map-chrome__panel\">\n <div className=\"eyeon-map-chrome__groups\">\n {grouped.length === 0 ? (\n <div className=\"eyeon-map-chrome__empty\">No matching stores</div>\n ) : (\n grouped.map(([group, groupItems]) => (\n <div key={group} className=\"eyeon-map-chrome__group\">\n <div className=\"eyeon-map-chrome__group-title\">{group}</div>\n {groupItems.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n className={\n selectedItem?.id === item.id\n ? 'eyeon-map-chrome__item is-selected'\n : 'eyeon-map-chrome__item'\n }\n onClick={() => selectItem(item)}\n >\n {item.label}\n </button>\n ))}\n </div>\n ))\n )}\n </div>\n\n {selectedItem && (\n <div className=\"eyeon-map-chrome__detail\">\n <div className=\"eyeon-map-chrome__detail-title\">{selectedItem.label}</div>\n <div className=\"eyeon-map-chrome__detail-meta\">{selectedItem.group}</div>\n </div>\n )}\n\n <div className=\"eyeon-map-chrome__route\">\n <label>\n From\n <select\n value={fromAnchorId ?? ''}\n onChange={(e) =>\n onFromChange(e.target.value ? Number(e.target.value) : null)\n }\n >\n <option value=\"\">Select start</option>\n {anchorOptions.map((i) => (\n <option key={i.id} value={i.anchorId!}>\n {i.label}\n </option>\n ))}\n </select>\n </label>\n <label>\n To\n <select\n value={toAnchorId ?? ''}\n onChange={(e) =>\n onToChange(e.target.value ? Number(e.target.value) : null)\n }\n >\n <option value=\"\">Select destination</option>\n {anchorOptions.map((i) => (\n <option key={i.id} value={i.anchorId!}>\n {i.label}\n </option>\n ))}\n </select>\n </label>\n <label className=\"eyeon-map-chrome__accessible\">\n <input\n type=\"checkbox\"\n checked={accessibleOnly}\n onChange={(e) => onAccessibleOnlyChange(e.target.checked)}\n />\n Accessible route\n </label>\n {route && (\n <div className=\"eyeon-map-chrome__route-meta\">\n {route.levelChanges.length > 0\n ? `${route.levelChanges.length} level change(s)`\n : 'Same level'}\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport type { PublishedLevel } from '../../core';\nimport { floorSwitcherDisplayLevels, shouldShowFloorSwitcher } from '../../core';\n\nexport interface MapControlsProps {\n levels: PublishedLevel[];\n activeLevelId: number | null;\n onActiveLevelChange: (id: number) => void;\n onZoomIn: () => void;\n onZoomOut: () => void;\n onReset: () => void;\n showFloors?: boolean;\n showZoomReset?: boolean;\n}\n\nexport function MapControls({\n levels,\n activeLevelId,\n onActiveLevelChange,\n onZoomIn,\n onZoomOut,\n onReset,\n showFloors = true,\n showZoomReset = true,\n}: MapControlsProps) {\n const switcher = floorSwitcherDisplayLevels(levels);\n if (!showFloors && !showZoomReset) return null;\n\n return (\n <div className=\"eyeon-map-controls\">\n <div className=\"eyeon-map-controls__stack\">\n {showFloors && shouldShowFloorSwitcher(levels) && (\n <div className=\"eyeon-map-controls__floors\" role=\"tablist\" aria-label=\"Floors\">\n {switcher.map((level) => {\n const active = level.id === activeLevelId;\n return (\n <button\n key={level.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n className={\n active\n ? 'eyeon-map-controls__floor is-active'\n : 'eyeon-map-controls__floor'\n }\n onClick={() => onActiveLevelChange(level.id)}\n >\n {level.name}\n </button>\n );\n })}\n </div>\n )}\n\n {showZoomReset && (\n <>\n <button\n type=\"button\"\n className=\"eyeon-map-controls__reset\"\n onClick={onReset}\n aria-label=\"Reset map\"\n >\n Reset\n </button>\n\n <div className=\"eyeon-map-controls__zoom\">\n <button\n type=\"button\"\n className=\"eyeon-map-controls__zoom-btn\"\n onClick={onZoomOut}\n aria-label=\"Zoom out\"\n >\n −\n </button>\n <button\n type=\"button\"\n className=\"eyeon-map-controls__zoom-btn\"\n onClick={onZoomIn}\n aria-label=\"Zoom in\"\n >\n +\n </button>\n </div>\n </>\n )}\n </div>\n </div>\n );\n}\n","import React, { Suspense, useEffect, useMemo, useRef, useState } from 'react';\nimport type {\n CmAmenityCatalogItem,\n MapViewerHost,\n PathResult,\n PublishedDocument,\n ThemeDefaults,\n} from '../core';\nimport {\n compileGraph,\n defaultViewerLevelId,\n mergeTheme,\n findPath,\n normalizePublishedDocument,\n viewerChrome,\n} from '../core';\nimport { MapScene } from './components/MapScene';\nimport type { MapCameraHandle } from './components/CameraRig';\nimport { RuntimeChrome } from './ui/RuntimeChrome';\nimport { MapControls } from './ui/MapControls';\nimport './viewer.css';\n\nexport interface MapViewerProps {\n /** Published (or draft) document. If omitted, fetched from webApiURI. */\n document?: PublishedDocument | null;\n webApiURI?: string;\n /** Prefer fetching /v1/map/document */\n centerId?: number;\n /** Public / preview / kiosk surface. Never includes Map options (editor rail). */\n host?: MapViewerHost;\n kioskId?: number | null;\n selectedRetailerId?: number | null;\n /**\n * Media proxy base, appended with the encoded SVG URL (v1 `IMAGE_PROXY_URL`\n * contract, e.g. `/eyeon-portal/media?url=`). Needed wherever the outdoor\n * SVG origin sends no CORS headers.\n */\n imageProxyUrl?: string | null;\n themeOverrides?: Partial<ThemeDefaults>;\n onExtractedAmenities?: (codes: string[]) => void;\n onSelectShape?: (shapeId: number) => void;\n /** Controlled floor when embedded (e.g. PORTAL default). */\n activeLevelId?: number | null;\n onActiveLevelChange?: (levelId: number) => void;\n /** Click a store/amenity to route. Off when PORTAL is assigning. Default true. */\n routeOnSelect?: boolean;\n createRouteRef?: React.MutableRefObject<{\n createRouteToStore: (retailerId: number) => void;\n createRouteToAmenity: (amenityCode: string) => void;\n clearRoute: () => void;\n } | null>;\n className?: string;\n style?: React.CSSProperties;\n}\n\nasync function fetchDocument(\n webApiURI: string,\n centerId?: number,\n draft?: boolean,\n): Promise<PublishedDocument> {\n const base = webApiURI.replace(/\\/$/, '');\n const params = new URLSearchParams();\n if (centerId != null && centerId > 0) params.set('center_id', String(centerId));\n if (draft) params.set('draft', '1');\n const qs = params.toString();\n const res = await fetch(`${base}/v1/map/document${qs ? `?${qs}` : ''}`, {\n credentials: 'include',\n });\n if (!res.ok) {\n throw new Error(`Failed to load map document (${res.status})`);\n }\n return res.json();\n}\n\nexport function MapViewer(props: MapViewerProps) {\n const {\n document: documentProp,\n webApiURI,\n centerId,\n host = 'WEBSITE',\n kioskId = null,\n selectedRetailerId = null,\n themeOverrides,\n onExtractedAmenities,\n createRouteRef,\n className,\n style,\n activeLevelId: activeLevelIdProp,\n onActiveLevelChange,\n routeOnSelect = true,\n imageProxyUrl,\n } = props;\n\n const [rawDoc, setDoc] = useState<PublishedDocument | null>(documentProp ?? null);\n const doc = useMemo(\n () => (rawDoc ? normalizePublishedDocument(rawDoc) : null),\n [rawDoc],\n );\n const [error, setError] = useState<string | null>(null);\n const [route, setRoute] = useState<PathResult | null>(null);\n const [fromAnchorId, setFromAnchorId] = useState<number | null>(null);\n const [toAnchorId, setToAnchorId] = useState<number | null>(null);\n const [accessibleOnly, setAccessibleOnly] = useState(false);\n const [internalLevelId, setInternalLevelId] = useState<number | null>(() => {\n if (!documentProp) return null;\n return defaultViewerLevelId(normalizePublishedDocument(documentProp).levels);\n });\n const cameraApi = useRef<MapCameraHandle | null>(null);\n const canvasHostRef = useRef<HTMLDivElement>(null);\n const activeLevelId = activeLevelIdProp ?? internalLevelId;\n const setActiveLevelId = (id: number | null) => {\n setInternalLevelId(id);\n if (id != null) onActiveLevelChange?.(id);\n };\n\n useEffect(() => {\n if (documentProp) {\n setDoc(documentProp);\n return;\n }\n if (!webApiURI) return;\n let cancelled = false;\n const draft = viewerChrome(host).fetchDraft;\n fetchDocument(webApiURI, centerId, draft)\n .then((d) => {\n if (!cancelled) setDoc(d);\n })\n .catch((e) => {\n if (!cancelled) setError(e instanceof Error ? e.message : String(e));\n });\n return () => {\n cancelled = true;\n };\n }, [documentProp, webApiURI, centerId, host]);\n\n useEffect(() => {\n if (!doc) return;\n const ids = new Set(doc.levels.map((level) => level.id));\n if (activeLevelId == null || !ids.has(activeLevelId)) {\n setActiveLevelId(defaultViewerLevelId(doc.levels));\n }\n const codes = new Set<string>();\n for (const level of doc.levels) {\n for (const shape of level.shapes) {\n if (shape.kind === 'amenity' && shape.assignment?.amenityId != null) {\n const amenity = doc.amenities.find((a) => a.id === shape.assignment!.amenityId);\n if (amenity) codes.add(amenity.code);\n }\n }\n }\n onExtractedAmenities?.(Array.from(codes));\n }, [doc, activeLevelId, onExtractedAmenities]);\n\n // Map IT / ?r= — switch to the store's floor so the highlight is visible\n useEffect(() => {\n if (!doc || selectedRetailerId == null) return;\n for (const level of doc.levels) {\n for (const shape of level.shapes) {\n if (shape.assignment?.retailerId === selectedRetailerId) {\n setActiveLevelId(level.id);\n return;\n }\n }\n }\n }, [doc, selectedRetailerId]);\n\n // Prefill \"from\" for kiosk host\n useEffect(() => {\n if (!doc || !viewerChrome(host).kioskOrigin || kioskId == null) return;\n for (const level of doc.levels) {\n for (const shape of level.shapes) {\n if (\n shape.kind === 'kiosk_screen' &&\n shape.assignment?.kioskId === kioskId\n ) {\n const anchor = level.anchors.find((a) => a.shapeId === shape.id);\n if (anchor) setFromAnchorId(anchor.id);\n }\n }\n }\n }, [doc, host, kioskId]);\n\n const compiled = useMemo(() => {\n if (!doc) return null;\n return compileGraph(\n doc.graph.nodes.map((n) => ({\n id: n.id,\n levelId: n.levelId,\n shapeId: n.shapeId,\n kind: n.kind,\n x: n.x,\n y: n.y,\n connectorId: n.connectorId,\n })),\n doc.graph.edges.map((e) => ({\n id: e.id,\n mapId: doc.mapId,\n fromAnchorId: e.from,\n toAnchorId: e.to,\n weight: e.weight,\n directed: e.directed,\n accessible: e.accessible,\n kind: e.kind,\n })),\n doc.connectors,\n );\n }, [doc]);\n\n const runRoute = (fromId: number | null, toId: number | null) => {\n if (!compiled || fromId == null || toId == null) {\n setRoute(null);\n return;\n }\n const result = findPath(compiled, fromId, toId, { accessibleOnly });\n setRoute(result);\n };\n\n useEffect(() => {\n runRoute(fromAnchorId, toAnchorId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fromAnchorId, toAnchorId, accessibleOnly, compiled]);\n\n useEffect(() => {\n if (!createRouteRef || !doc) return;\n createRouteRef.current = {\n createRouteToStore(retailerId: number) {\n for (const level of doc.levels) {\n for (const shape of level.shapes) {\n if (shape.assignment?.retailerId === retailerId) {\n const anchor = level.anchors.find((a) => a.shapeId === shape.id);\n if (anchor) {\n setToAnchorId(anchor.id);\n setActiveLevelId(level.id);\n }\n }\n }\n }\n },\n createRouteToAmenity(amenityCode: string) {\n const amenity = doc.amenities.find((a) => a.code === amenityCode);\n if (!amenity) return;\n for (const level of doc.levels) {\n for (const shape of level.shapes) {\n if (shape.assignment?.amenityId === amenity.id) {\n const anchor = level.anchors.find((a) => a.shapeId === shape.id);\n if (anchor) {\n setToAnchorId(anchor.id);\n setActiveLevelId(level.id);\n return;\n }\n }\n }\n }\n },\n clearRoute() {\n setToAnchorId(null);\n setRoute(null);\n },\n };\n }, [createRouteRef, doc]);\n\n const theme: ThemeDefaults = mergeTheme(doc?.theme, themeOverrides);\n\n if (error) {\n return (\n <div className={`eyeon-map-viewer eyeon-map-viewer--error ${className ?? ''}`} style={style}>\n <div className=\"eyeon-map-viewer__error\">{error}</div>\n </div>\n );\n }\n\n if (!doc) {\n return (\n <div className={`eyeon-map-viewer eyeon-map-viewer--loading ${className ?? ''}`} style={style}>\n <div className=\"eyeon-map-viewer__loading\">Loading map…</div>\n </div>\n );\n }\n\n const amenitiesOnMap: CmAmenityCatalogItem[] = doc.amenities.filter((a) =>\n doc.levels.some((l) =>\n l.shapes.some((s) => s.assignment?.amenityId === a.id),\n ),\n );\n const chrome = viewerChrome(host);\n\n return (\n <div\n className={`eyeon-map-viewer eyeon-map-viewer--${host} ${className ?? ''}`}\n style={\n {\n ...style,\n ['--map-accent' as string]: theme.ACCENT_COLOR,\n ['--map-bg' as string]: theme.MAP_BACKGROUND_COLOR,\n } as React.CSSProperties\n }\n >\n {(chrome.search || chrome.amenities) && (\n <RuntimeChrome\n doc={doc}\n amenities={amenitiesOnMap}\n activeLevelId={activeLevelId}\n onActiveLevelChange={setActiveLevelId}\n fromAnchorId={fromAnchorId}\n toAnchorId={toAnchorId}\n onFromChange={setFromAnchorId}\n onToChange={setToAnchorId}\n accessibleOnly={accessibleOnly}\n onAccessibleOnlyChange={setAccessibleOnly}\n route={route}\n showSearch={chrome.search}\n showAmenities={chrome.amenities}\n />\n )}\n\n <MapControls\n levels={doc.levels}\n activeLevelId={activeLevelId}\n onActiveLevelChange={setActiveLevelId}\n onZoomIn={() => cameraApi.current?.zoomIn()}\n onZoomOut={() => cameraApi.current?.zoomOut()}\n onReset={() => cameraApi.current?.reset()}\n showFloors={chrome.floors}\n showZoomReset={chrome.zoomReset}\n />\n\n <div ref={canvasHostRef} className=\"eyeon-map-viewer__canvas\">\n <Suspense fallback={null}>\n <MapScene\n doc={doc}\n theme={theme}\n activeLevelId={activeLevelId}\n route={route}\n selectedRetailerId={selectedRetailerId}\n cameraRef={cameraApi}\n eventSource={canvasHostRef}\n imageProxyUrl={imageProxyUrl}\n onSelectShape={(shapeId, levelId) => {\n setActiveLevelId(levelId);\n if (routeOnSelect) {\n const level = doc.levels.find((l) => l.id === levelId);\n const anchor = level?.anchors.find((a) => a.shapeId === shapeId);\n if (anchor) setToAnchorId(anchor.id);\n }\n props.onSelectShape?.(shapeId);\n }}\n />\n </Suspense>\n </div>\n </div>\n );\n}\n\nexport default MapViewer;\n"],"names":["kindColor","kind","theme","fill","polygonShape","points","shape","THREE","i","LevelMeshes","level","is3d","selectedRetailerId","onSelectShape","interactiveOnly","meshes","useMemo","s","INTERACTIVE_SHAPE_KINDS","threeShapes","selected","_a","color","extrude","jsx","geoShape","idx","jsxs","e","RouteLine","route","activeLevelId","p","curve","COLOR_SPACE_SVG","SRGBColorSpace","SVGLoader","Loader","manager","url","onLoad","onProgress","onError","scope","loader","FileLoader","text","parseNode","node","style","transform","getNodeTransform","isDefsNode","path","parseStyle","parseCSSStylesheet","parsePathNode","parseRectNode","parsePolygonNode","parsePolylineNode","parseCircleNode","parseEllipseNode","parseLineNode","usedNodeId","usedNode","transformPath","currentTransform","paths","childNodes","transformStack","ShapePath","point","Vector2","control","firstPoint","isFirstPoint","doSetFirstPoint","d","commands","command","type","data","numbers","parseFloats","j","jl","getReflection","rx","ry","start","parseArcCommand","stylesheet","selectorList","definitions","v","stylesheets","x_axis_rotation","large_arc_flag","sweep_flag","end","dx2","dy2","x1p","y1p","rxs","rys","x1ps","y1ps","cr","dq","pq","q","cxp","cyp","cx","cy","theta","svgAngle","delta","ux","uy","vx","vy","dot","len","ang","x","parseFloatWithUnits","y","w","h","bci","iterator","match","a","b","index","regex","r","subpath","Path","x1","y1","x2","y2","stylesheetStyles","classSelectors","addStyle","svgName","jsName","adjustFunction","clamp","positive","input","flags","stride","RE","SEP","INT","FLOAT","EXP","state","seenComma","number","exponent","result","throwSyntaxError","current","partial","error","newNumber","length","units","unitConversion","string","theUnit","n","u","scale","parseNodeTransform","Matrix3","tempTransform0","tx","ty","transformsTexts","tIndex","transformText","openParPos","closeParPos","transformType","array","angle","tempTransform1","tempTransform2","tempTransform3","scaleX","scaleY","m","transfVec2","v2","tempV3","transfEllipseGeneric","cosTheta","sinTheta","v1","Vector3","f1","f2","mF","mFInv","mQe","ed","eigenDecomposition","rt1sqrt","rt2sqrt","mDsqrt","mRT","mDRF","transformAngle","phi","cosR","sinR","isTransformFlipped","transfEllipseNoSkew","sx","getTransformScaleX","sy","getTransformScaleY","subPaths","curves","tempV2","isTransformSkewed","te","basisDot","A","B","C","rt1","rt2","cs","sn","t","sm","df","rt","xml","shapePath","IntersectionLocationType","classifyResult","findEdgeIntersection","a0","a1","b0","b1","x3","x4","y3","y4","nom1","nom2","denom","t1","t2","classifyPoint","edgeStart","edgeEnd","ax","ay","bx","by","sa","getIntersections","path1","path2","intersectionsRaw","intersections","path1EdgeStart","path1EdgeEnd","index2","path2EdgeStart","path2EdgeEnd","intersection","getScanlineIntersections","scanline","boundingBox","center","allIntersections","i1","i2","isHoleTo","simplePath","allPaths","scanlineMinX","scanlineMaxX","_fillRule","centerBoundingBox","scanlineIntersections","baseIntersections","otherIntersections","firstXOfPath","stack","isHole","isHoleFor","lastCWValue","identifier","simplePaths","maxY","minY","maxX","minX","ShapeUtils","Box2","sp","isAHole","shapesToReturn","Shape","hole","width","lineJoin","lineCap","miterLimit","arcDivisions","minDistance","vertices","normals","uvs","geometry","BufferGeometry","Float32BufferAttribute","vertexOffset","tempV2_1","tempV2_2","tempV2_3","tempV2_4","tempV2_5","tempV2_6","tempV2_7","lastPointL","lastPointR","point0L","point0R","currentPointL","currentPointR","nextPointL","nextPointR","innerPoint","outerPoint","removeDuplicatedPoints","numPoints","isClosed","currentPoint","previousPoint","nextPoint","strokeWidth2","deltaU","u0","u1","innerSideModified","joinIsOnLeftSide","isMiter","initialJoinIsOnLeftSide","numVertices","currentCoordinate","currentCoordinateUV","getNormal","iPoint","normal1","miterSide","miterLength2","segmentLengthPrev","segmentLengthNext","makeSegmentTriangles","makeSegmentWithBevelJoin","createSegmentTrianglesWithMiddleSection","makeCircularSector","miterFraction","addVertex","addCapGeometry","lastOuter","lastInner","p1","p2","position","il","vl","dupPoints","newPoints","BASE_Z","getLayerNameFromNode","id","isInteractiveAncestor","dataName","isInteractiveGroupLabel","isStoreFolderLabel","resolveFetchUrl","imageProxyUrl","SvgVectorLayer","suppressIds","setResult","useState","useEffect","cancelled","fetchUrl","res","inlined","inlineSvgStyles","err","out","layerName","shapes","layerStyle","resolveLayerStyle","opacity","_c","_b","si","SCENE_FLIP_SCALE","viewBoundsFromData","bounds","fitOrthoZoom","viewWidth","viewHeight","worldWidth","worldHeight","zoomX","zoomY","boundsExtent","nextOrthoZoom","direction","step","min","max","factor","next","MOUSE_ROTATE","MOUSE_DOLLY","MOUSE_PAN","TOUCH_ROTATE","TOUCH_PAN","TOUCH_DOLLY_PAN","orbitMouseButtons","orbitTouches","CameraRig","controlsRef","cameraRef","camera","size","invalidate","useThree","userAdjusted","useRef","applyFit","useCallback","controls","height","zoom","zoomBy","fit","offset","useImperativeHandle","OUTDOOR_Z","MapScene","doc","eventSource","stacked","viewerLevelStack","boundsFromStackedLevels","view","outdoorLevel","isOutdoorLevel","outdoorSvgUrl","ids","showOutdoorSvg","Canvas","OrthographicCamera","outdoor","shapeId","OrbitControls","itemLabel","amenityName","RuntimeChrome","amenities","onActiveLevelChange","fromAnchorId","toAnchorId","onFromChange","onToChange","accessibleOnly","onAccessibleOnlyChange","showSearch","showAmenities","query","setQuery","selectedItem","setSelectedItem","items","list","anchor","amenity","filtered","grouped","map","item","arr","anchorOptions","hasQuery","selectItem","group","groupItems","MapControls","levels","onZoomIn","onZoomOut","onReset","showFloors","showZoomReset","switcher","floorSwitcherDisplayLevels","shouldShowFloorSwitcher","active","Fragment","fetchDocument","webApiURI","centerId","draft","base","params","qs","MapViewer","props","documentProp","host","kioskId","themeOverrides","onExtractedAmenities","createRouteRef","className","activeLevelIdProp","routeOnSelect","rawDoc","setDoc","normalizePublishedDocument","setError","setRoute","setFromAnchorId","setToAnchorId","setAccessibleOnly","internalLevelId","setInternalLevelId","defaultViewerLevelId","cameraApi","canvasHostRef","setActiveLevelId","viewerChrome","codes","compiled","compileGraph","runRoute","fromId","toId","findPath","retailerId","amenityCode","mergeTheme","amenitiesOnMap","l","chrome","Suspense","levelId"],"mappings":"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","x_google_ignoreList":[2]}
|