json-canvas-viewer 3.2.2 → 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +105 -41
- package/dist/bridges.cjs +2 -0
- package/dist/bridges.cjs.map +1 -0
- package/dist/bridges.js +2 -0
- package/dist/bridges.js.map +1 -0
- package/dist/chimp.cjs +1 -0
- package/dist/chimp.js +1 -0
- package/dist/controller--Q72jFEw.cjs +2 -0
- package/dist/controller--Q72jFEw.cjs.map +1 -0
- package/dist/controller-siZ5v-SD.js +2 -0
- package/dist/controller-siZ5v-SD.js.map +1 -0
- package/dist/dev.cjs +2 -0
- package/dist/dev.cjs.map +1 -0
- package/dist/dev.js +2 -0
- package/dist/dev.js.map +1 -0
- package/dist/index-BSkMdAcV.cjs +2 -0
- package/dist/index-BSkMdAcV.cjs.map +1 -0
- package/dist/index-u8PUIMyl.js +2 -0
- package/dist/index-u8PUIMyl.js.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/modules.cjs +2 -0
- package/dist/modules.cjs.map +1 -0
- package/dist/modules.js +2 -0
- package/dist/modules.js.map +1 -0
- package/dist/renderer-CZ85ZN6O.js +2 -0
- package/dist/renderer-CZ85ZN6O.js.map +1 -0
- package/dist/renderer-D9iInH9_.cjs +2 -0
- package/dist/renderer-D9iInH9_.cjs.map +1 -0
- package/dist/types/bridges/renderToString.d.ts +6 -0
- package/dist/types/bridges/vitePlugin.d.ts +8 -0
- package/dist/types/bridges/vueComponent.vue.d.ts +23 -0
- package/dist/types/bridges.d.ts +3 -0
- package/dist/types/chimp.d.ts +7 -0
- package/dist/types/core/baseModule.d.ts +15 -0
- package/dist/types/{controller.d.ts → core/controller.d.ts} +4 -8
- package/dist/types/{dataManager.d.ts → core/dataManager.d.ts} +17 -17
- package/dist/types/{declarations.d.ts → core/declarations.d.ts} +22 -22
- package/dist/types/core/index.d.ts +14 -0
- package/dist/types/{interactionHandler.d.ts → core/interactionHandler.d.ts} +3 -3
- package/dist/types/{overlayManager.d.ts → core/overlayManager.d.ts} +4 -4
- package/dist/types/{renderer.d.ts → core/renderer.d.ts} +1 -1
- package/dist/types/{utilities.d.ts → core/utilities.d.ts} +1 -3
- package/dist/types/dev.d.ts +8 -0
- package/dist/types/index.d.ts +2 -21
- package/dist/types/{controls → modules/controls}/index.d.ts +2 -2
- package/dist/types/{debugPanel → modules/debugPanel}/index.d.ts +2 -2
- package/dist/types/{minimap → modules/minimap}/index.d.ts +3 -3
- package/dist/types/{mistouchPreventer → modules/mistouchPreventer}/index.d.ts +2 -2
- package/dist/types/modules.d.ts +4 -0
- package/package.json +33 -8
- package/dist/types/baseModule.d.ts +0 -11
- package/dist/types/canvasViewer.d.ts +0 -25
- package/dist/types/renderToString.d.ts +0 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/baseModule.ts","../src/utilities.ts","../src/dataManager.ts","../src/controller.ts","../src/overlayManager.ts","../src/interactionHandler.ts","../src/renderer.ts","../src/canvasViewer.ts","../src/controls/index.ts","../src/debugPanel/index.ts","../src/minimap/index.ts","../src/mistouchPreventer/index.ts","../src/renderToString.ts","../src/index.ts"],"sourcesContent":["import type { Container } from '@needle-di/core';\nimport type { DefaultOptions, Empty, GeneralFunction, GeneralObject } from '@/declarations';\n\nexport type BaseArgs = [Container, GeneralObject];\n\nexport type GeneralModuleCtor = typeof BaseModule<GeneralObject>;\nexport type GeneralModule = InstanceType<GeneralModuleCtor>;\n\nexport class BaseModule<O extends GeneralObject = Empty> {\n\tconstructor(\n\t\tprotected container: Container,\n\t\toptions: GeneralObject,\n\t) {\n\t\tObject.assign(this.options, options);\n\t}\n\n\toptions = {} as DefaultOptions & O;\n\n\tdispose?: GeneralFunction;\n}\n","import type { GeneralArguments } from '@/declarations';\n\nexport default {\n\tround,\n\tresizeCanvasForDPR,\n\tapplyStyles,\n\tdrawRoundRect,\n\tgetAnchorCoord,\n\tgetColor,\n\tresolvePath,\n\tmakeHook,\n};\n\nexport const destroyError = new Error(\"[JSONCanvasViewer] Resource hasn't been set up or has been disposed.\");\n\nfunction applyStyles(container: HTMLElement | ShadowRoot, styleString: string) {\n\tconst style = document.createElement('style');\n\tstyle.innerHTML = styleString;\n\tcontainer.appendChild(style);\n}\n\nfunction drawRoundRect(\n\tctx: CanvasRenderingContext2D,\n\tx: number,\n\ty: number,\n\twidth: number,\n\theight: number,\n\tradius: number,\n) {\n\tctx.beginPath();\n\tctx.moveTo(x + radius, y);\n\tctx.lineTo(x + width - radius, y);\n\tctx.quadraticCurveTo(x + width, y, x + width, y + radius);\n\tctx.lineTo(x + width, y + height - radius);\n\tctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);\n\tctx.lineTo(x + radius, y + height);\n\tctx.quadraticCurveTo(x, y + height, x, y + height - radius);\n\tctx.lineTo(x, y + radius);\n\tctx.quadraticCurveTo(x, y, x + radius, y);\n\tctx.closePath();\n}\n\nfunction getAnchorCoord(node: JSONCanvasNode, side: 'top' | 'bottom' | 'left' | 'right') {\n\tconst midX = node.x + node.width / 2;\n\tconst midY = node.y + node.height / 2;\n\tswitch (side) {\n\t\tcase 'top':\n\t\t\treturn [midX, node.y];\n\t\tcase 'bottom':\n\t\t\treturn [midX, node.y + node.height];\n\t\tcase 'left':\n\t\t\treturn [node.x, midY];\n\t\tcase 'right':\n\t\t\treturn [node.x + node.width, midY];\n\t\tdefault:\n\t\t\treturn [midX, midY];\n\t}\n}\n\nfunction getColor(colorIndex: string = '0') {\n\tlet themeColor = null;\n\n\tfunction hexToRgb(hex: string) {\n\t\tconst cleanHex = hex.replace('#', '');\n\t\tconst r = parseInt(cleanHex.substring(0, 2), 16);\n\t\tconst g = parseInt(cleanHex.substring(2, 4), 16);\n\t\tconst b = parseInt(cleanHex.substring(4, 6), 16);\n\t\treturn { r, g, b };\n\t}\n\n\tif (colorIndex.length === 1) {\n\t\tswitch (colorIndex) {\n\t\t\tcase '1':\n\t\t\t\tthemeColor = 'rgba(255, 120, 129, ?)';\n\t\t\t\tbreak;\n\t\t\tcase '2':\n\t\t\t\tthemeColor = 'rgba(251, 187, 131, ?)';\n\t\t\t\tbreak;\n\t\t\tcase '3':\n\t\t\t\tthemeColor = 'rgba(255, 232, 139, ?)';\n\t\t\t\tbreak;\n\t\t\tcase '4':\n\t\t\t\tthemeColor = 'rgba(124, 211, 124, ?)';\n\t\t\t\tbreak;\n\t\t\tcase '5':\n\t\t\t\tthemeColor = 'rgba(134, 223, 226, ?)';\n\t\t\t\tbreak;\n\t\t\tcase '6':\n\t\t\t\tthemeColor = 'rgba(203, 158, 255, ?)';\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthemeColor = 'rgba(140, 140, 140, ?)';\n\t\t}\n\t} else {\n\t\tconst rgb = hexToRgb(colorIndex);\n\t\tthemeColor = `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ?)`;\n\t}\n\treturn {\n\t\tborder: themeColor.replace('?', '0.75'),\n\t\tbackground: themeColor.replace('?', '0.1'),\n\t\tactive: themeColor.replace('?', '1'),\n\t};\n}\n\nfunction resizeCanvasForDPR(canvas: HTMLCanvasElement, width: number, height: number) {\n\tconst dpr = window.devicePixelRatio || 1;\n\tconst ctx = canvas.getContext('2d');\n\tif (!ctx)\n\t\tthrow new Error(\n\t\t\t'[JSONCanvasViewer] This error is unexpected, probably caused uncontrollable runtime errors. Please contact the developer and show how to reproduce.',\n\t\t);\n\tcanvas.width = Math.round(width * dpr);\n\tcanvas.height = Math.round(height * dpr);\n\tctx.setTransform(1, 0, 0, 1, 0, 0);\n\tctx.scale(dpr, dpr);\n}\n\nfunction round(roundedNum: number, digits: number) {\n\tconst factor = 10 ** digits;\n\treturn Math.round(roundedNum * factor) / factor;\n}\n\nfunction resolvePath(path: string) {\n\tif (/^https?:\\/\\//.test(path)) return path.substring(0, path.lastIndexOf('/') + 1);\n\telse {\n\t\tconst lastSlash = path.lastIndexOf('/');\n\t\treturn lastSlash !== -1 ? path.substring(0, lastSlash + 1) : './';\n\t}\n}\n\nfunction makeHook<Args extends GeneralArguments = []>() {\n\ttype MatchingFunc = (...args: Args) => unknown;\n\ttype Hook = {\n\t\t(...args: Args): void;\n\t\tsubs: Set<MatchingFunc>;\n\t\tsubscribe(callback: MatchingFunc): void;\n\t\tunsubscribe(callback: MatchingFunc): void;\n\t};\n\tconst result: Hook = (...args: Args) => {\n\t\tresult.subs.forEach(callback => {\n\t\t\tcallback(...args);\n\t\t});\n\t};\n\tresult.subs = new Set();\n\tresult.subscribe = (callback: MatchingFunc) => {\n\t\tresult.subs.add(callback);\n\t};\n\tresult.unsubscribe = (callback: MatchingFunc) => {\n\t\tresult.subs.delete(callback);\n\t};\n\treturn result;\n}\n","import { BaseModule } from '@/baseModule';\nimport type { Coordinates, NodeBounds } from '@/declarations';\nimport utilities from '@/utilities';\n\nconst GRID_CELL_SIZE = 800;\nconst INITIAL_VIEWPORT_PADDING = 100;\n\nexport default class DataManager extends BaseModule {\n\tprivate spatialGrid: Record<string, Array<JSONCanvasNode>> | null = null;\n\thooks = {\n\t\tonToggleFullscreen: utilities.makeHook<[boolean]>(),\n\t\tonCanvasFetched: utilities.makeHook(),\n\t};\n\tdata = {\n\t\tcanvasData: undefined as unknown as Required<JSONCanvas>,\n\t\tnodeMap: {} as Record<string, JSONCanvasNode>,\n\t\tcanvasBaseDir: undefined as unknown as string,\n\t\tnodeBounds: undefined as unknown as NodeBounds,\n\t\toffsetX: 0,\n\t\toffsetY: 0,\n\t\tscale: 1,\n\t\tcontainer: document.createElement('div'),\n\t};\n\n\tloadCanvas = async () => {\n\t\tconst path = this.options.canvasPath;\n\t\ttry {\n\t\t\tthis.data.canvasBaseDir = utilities.resolvePath(path);\n\t\t\tthis.data.canvasData = Object.assign(\n\t\t\t\t{\n\t\t\t\t\tnodes: [],\n\t\t\t\t\tedges: [],\n\t\t\t\t},\n\t\t\t\tawait fetch(path).then(res => res.json()),\n\t\t\t);\n\t\t\tthis.data.canvasData.nodes.forEach(node => {\n\t\t\t\tif (node.type === 'file' && !node.file.includes('http')) {\n\t\t\t\t\tconst file = node.file.split('/');\n\t\t\t\t\tnode.file = file[file.length - 1];\n\t\t\t\t}\n\t\t\t\tthis.data.nodeMap[node.id] = node;\n\t\t\t});\n\t\t\tthis.data.nodeBounds = this.calculateNodeBounds();\n\t\t\tthis.buildSpatialGrid();\n\t\t\tthis.hooks.onCanvasFetched();\n\t\t} catch (err) {\n\t\t\tconsole.error('Failed to load canvas data:', err);\n\t\t}\n\t};\n\n\tfindNodeAt = (screenCoords: Coordinates) => {\n\t\tconst { x, y } = this.C2W(this.C2C({ x: screenCoords.x, y: screenCoords.y }));\n\t\tlet candidates: Array<JSONCanvasNode> = [];\n\t\tif (!this.spatialGrid) candidates = this.data.canvasData.nodes;\n\t\telse {\n\t\t\tconst col = Math.floor(x / GRID_CELL_SIZE);\n\t\t\tconst row = Math.floor(y / GRID_CELL_SIZE);\n\t\t\tconst key = `${col},${row}`;\n\t\t\tcandidates = this.spatialGrid[key] || [];\n\t\t}\n\t\tfor (const node of candidates) {\n\t\t\tif (\n\t\t\t\tx < node.x ||\n\t\t\t\tx > node.x + node.width ||\n\t\t\t\ty < node.y ||\n\t\t\t\ty > node.y + node.height ||\n\t\t\t\tthis.judgeInteract(node) === 'non-interactive'\n\t\t\t)\n\t\t\t\tcontinue;\n\t\t\treturn node;\n\t\t}\n\t\treturn null;\n\t};\n\n\t// how should the app handle node interactions\n\tprivate judgeInteract = (node: JSONCanvasNode | null) => {\n\t\tswitch (node?.type) {\n\t\t\tcase 'text':\n\t\t\tcase 'link':\n\t\t\t\treturn 'select';\n\t\t\tcase 'file': {\n\t\t\t\tif (node.file.match(/\\.(md|wav|mp3)$/i)) return 'select';\n\t\t\t\telse return 'non-interactive';\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\treturn 'non-interactive';\n\t\t}\n\t};\n\n\tprivate calculateNodeBounds() {\n\t\tlet minX = Infinity,\n\t\t\tminY = Infinity,\n\t\t\tmaxX = -Infinity,\n\t\t\tmaxY = -Infinity;\n\t\tthis.data.canvasData.nodes.forEach(node => {\n\t\t\tminX = Math.min(minX, node.x);\n\t\t\tminY = Math.min(minY, node.y);\n\t\t\tmaxX = Math.max(maxX, node.x + node.width);\n\t\t\tmaxY = Math.max(maxY, node.y + node.height);\n\t\t});\n\t\tconst width = maxX - minX;\n\t\tconst height = maxY - minY;\n\t\tconst centerX = minX + width / 2;\n\t\tconst centerY = minY + height / 2;\n\t\treturn { minX, minY, maxX, maxY, width, height, centerX, centerY };\n\t}\n\n\tprivate buildSpatialGrid() {\n\t\tconst canvasData = this.data.canvasData;\n\t\tif (canvasData.nodes.length < 50) return;\n\t\tthis.spatialGrid = {};\n\t\tfor (const node of canvasData.nodes) {\n\t\t\tconst minCol = Math.floor(node.x / GRID_CELL_SIZE);\n\t\t\tconst maxCol = Math.floor((node.x + node.width) / GRID_CELL_SIZE);\n\t\t\tconst minRow = Math.floor(node.y / GRID_CELL_SIZE);\n\t\t\tconst maxRow = Math.floor((node.y + node.height) / GRID_CELL_SIZE);\n\t\t\tfor (let col = minCol; col <= maxCol; col++) {\n\t\t\t\tfor (let row = minRow; row <= maxRow; row++) {\n\t\t\t\t\tconst key = `${col},${row}`;\n\t\t\t\t\tif (!this.spatialGrid[key]) this.spatialGrid[key] = [];\n\t\t\t\t\tthis.spatialGrid[key].push(node);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tzoom = (factor: number, origin: Coordinates) => {\n\t\tconst newScale = this.data.scale * factor;\n\t\tthis.zoomToScale(newScale, origin);\n\t};\n\tzoomToScale = (newScale: number, origin: Coordinates) => {\n\t\tconst validNewScale = Math.max(Math.min(newScale, 20), 0.05);\n\t\tconst scale = this.data.scale;\n\t\tif (validNewScale === scale) return;\n\t\tconst canvasCoords = this.C2C(origin);\n\t\tthis.data.offsetX = origin.x - (canvasCoords.x * validNewScale) / scale;\n\t\tthis.data.offsetY = origin.y - (canvasCoords.y * validNewScale) / scale;\n\t\tthis.data.scale = validNewScale;\n\t};\n\tpan = ({ x, y }: Coordinates) => {\n\t\tthis.data.offsetX = this.data.offsetX + x;\n\t\tthis.data.offsetY = this.data.offsetY + y;\n\t};\n\tpanToCoords = ({ x, y }: Coordinates) => {\n\t\tthis.data.offsetX = x;\n\t\tthis.data.offsetY = y;\n\t};\n\tshiftFullscreen = (option: string = 'toggle') => {\n\t\tif (!document.fullscreenElement && (option === 'toggle' || option === 'enter')) {\n\t\t\tthis.data.container.requestFullscreen();\n\t\t\tthis.hooks.onToggleFullscreen(true);\n\t\t} else if (document.fullscreenElement && (option === 'toggle' || option === 'exit')) {\n\t\t\tdocument.exitFullscreen();\n\t\t\tthis.hooks.onToggleFullscreen(false);\n\t\t}\n\t};\n\tresetView = () => {\n\t\tconst bounds = this.data.nodeBounds;\n\t\tconst container = this.data.container;\n\t\tif (!bounds || !container) return;\n\t\tconst contentWidth = bounds.width + INITIAL_VIEWPORT_PADDING * 2;\n\t\tconst contentHeight = bounds.height + INITIAL_VIEWPORT_PADDING * 2;\n\t\t// Use logical dimensions for scaling calculations\n\t\tconst viewWidth = container.clientWidth;\n\t\tconst viewHeight = container.clientHeight;\n\t\tconst scaleX = viewWidth / contentWidth;\n\t\tconst scaleY = viewHeight / contentHeight;\n\t\tconst newScale = Math.round(Math.min(scaleX, scaleY) * 1000) / 1000;\n\t\tconst contentCenterX = bounds.centerX;\n\t\tconst contentCenterY = bounds.centerY;\n\t\tconst initialView = {\n\t\t\tscale: newScale,\n\t\t\toffsetX: viewWidth / 2 - contentCenterX * newScale,\n\t\t\toffsetY: viewHeight / 2 - contentCenterY * newScale,\n\t\t};\n\t\tthis.data.offsetX = initialView.offsetX;\n\t\tthis.data.offsetY = initialView.offsetY;\n\t\tthis.data.scale = initialView.scale;\n\t};\n\n\t// Container to Canvas\n\tprivate C2C = ({ x: containerX, y: containerY }: Coordinates) => ({\n\t\tx: containerX - this.data.offsetX,\n\t\ty: containerY - this.data.offsetY,\n\t});\n\t// Canvas to World\n\tprivate C2W = ({ x: canvasX, y: canvasY }: Coordinates) => ({\n\t\tx: canvasX / this.data.scale,\n\t\ty: canvasY / this.data.scale,\n\t});\n\n\tmiddleViewer = () => {\n\t\tconst container = this.data.container;\n\t\treturn {\n\t\t\tx: container.clientWidth / 2,\n\t\t\ty: container.clientHeight / 2,\n\t\t\twidth: container.clientWidth,\n\t\t\theight: container.clientHeight,\n\t\t};\n\t};\n\n\tdispose = () => this.data.container.remove();\n}\n","import { type BaseArgs, BaseModule } from '@/baseModule';\nimport DataManager from '@/dataManager';\nimport style from '@/styles.scss?inline';\nimport utilities from '@/utilities';\n\ntype Options = {\n\tnoShadow?: boolean;\n};\n\nexport default class Controller extends BaseModule<Options> {\n\tprivate animationId: null | number = null;\n\tprivate resizeAnimationId: null | number = null;\n\tprivate DM: DataManager;\n\tprivate resizeObserver: ResizeObserver;\n\tprivate perFrame = {\n\t\tlastScale: 1,\n\t\tlastOffsets: { x: 0, y: 0 },\n\t};\n\tprivate lastResizeCenter: {\n\t\tx: null | number;\n\t\ty: null | number;\n\t} = {\n\t\tx: null,\n\t\ty: null,\n\t};\n\n\thooks = {\n\t\tonResize: utilities.makeHook<[number, number]>(),\n\t\tonRefresh: utilities.makeHook(),\n\t};\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tthis.DM = this.container.get(DataManager);\n\t\tthis.DM.hooks.onCanvasFetched.subscribe(this.onFetched);\n\n\t\tconst parentContainer = this.options.container;\n\t\twhile (parentContainer.firstElementChild) parentContainer.firstElementChild.remove();\n\t\tparentContainer.innerHTML = '';\n\n\t\tconst noShadow = this.options.noShadow || false;\n\t\tconst realContainer = noShadow ? parentContainer : parentContainer.attachShadow({ mode: 'open' });\n\n\t\tutilities.applyStyles(realContainer, style);\n\n\t\tconst HTMLContainer = this.DM.data.container;\n\t\tHTMLContainer.classList.add('container');\n\t\trealContainer.appendChild(HTMLContainer);\n\t\tthis.resizeObserver = new ResizeObserver(this.onResize);\n\t}\n\n\tprivate onFetched = () => {\n\t\tthis.DM.resetView();\n\t\tthis.resizeObserver.observe(this.DM.data.container);\n\t\tthis.animationId = requestAnimationFrame(this.draw);\n\t};\n\n\tprivate draw = () => {\n\t\tif (\n\t\t\tthis.perFrame.lastScale !== this.DM.data.scale ||\n\t\t\tthis.perFrame.lastOffsets.x !== this.DM.data.offsetX ||\n\t\t\tthis.perFrame.lastOffsets.y !== this.DM.data.offsetY\n\t\t)\n\t\t\tthis.refresh();\n\t\tthis.animationId = requestAnimationFrame(this.draw);\n\t};\n\n\tprivate refresh = () => {\n\t\tthis.perFrame.lastScale = this.DM.data.scale;\n\t\tthis.perFrame.lastOffsets = {\n\t\t\tx: this.DM.data.offsetX,\n\t\t\ty: this.DM.data.offsetY,\n\t\t};\n\t\tthis.hooks.onRefresh();\n\t};\n\n\tprivate onResize = () => {\n\t\tthis.resizeAnimationId = requestAnimationFrame(() => {\n\t\t\tconst center = this.DM.middleViewer();\n\t\t\tif (this.lastResizeCenter.x && this.lastResizeCenter.y) {\n\t\t\t\tthis.DM.data.offsetX = this.DM.data.offsetX + center.x - this.lastResizeCenter.x;\n\t\t\t\tthis.DM.data.offsetY = this.DM.data.offsetY + center.y - this.lastResizeCenter.y;\n\t\t\t}\n\t\t\tthis.lastResizeCenter.x = center.x;\n\t\t\tthis.lastResizeCenter.y = center.y;\n\t\t\tthis.hooks.onResize(center.width, center.height);\n\t\t\tthis.refresh();\n\t\t});\n\t};\n\n\tdispose = () => {\n\t\tif (this.animationId) cancelAnimationFrame(this.animationId);\n\t\tif (this.resizeAnimationId) cancelAnimationFrame(this.resizeAnimationId);\n\t\tthis.resizeObserver.disconnect();\n\t};\n}\n","import { micromark } from 'micromark';\nimport { type BaseArgs, BaseModule } from '@/baseModule';\nimport Controller from '@/controller';\nimport DataManager from '@/dataManager';\nimport InteractionHandler from '@/interactionHandler';\nimport utilities, { destroyError } from '@/utilities';\n\ntype Options = {\n\tmicromark?: Parameters<typeof micromark>[1];\n};\n\nexport default class OverlayManager extends BaseModule<Options> {\n\tprivate _overlaysLayer: HTMLDivElement | null = document.createElement('div');\n\tprivate overlays: Record<string, HTMLDivElement> = {}; // { id: node } the overlays in viewport\n\tprivate selectedId: string | null = null;\n\tprivate eventListeners: Record<string, Array<EventListener | null>> = {};\n\tprivate DM: DataManager;\n\tprivate IH: () => InteractionHandler;\n\tprivate parse: (markdown: string) => string;\n\n\tprivate get overlaysLayer() {\n\t\tif (!this._overlaysLayer) throw destroyError;\n\t\treturn this._overlaysLayer;\n\t}\n\n\thooks = {\n\t\tonInteractionStart: utilities.makeHook(),\n\t\tonInteractionEnd: utilities.makeHook(),\n\t};\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tthis.parse = (markdown: string) => micromark(markdown, this.options.micromark);\n\t\tthis.DM = this.container.get(DataManager);\n\t\tthis.IH = this.container.get(InteractionHandler, { lazy: true });\n\t\tconst controller = this.container.get(Controller);\n\t\tthis.DM.hooks.onCanvasFetched.subscribe(this.onFetched);\n\t\tcontroller.hooks.onRefresh.subscribe(this.updateOverlays);\n\n\t\tthis._overlaysLayer = document.createElement('div');\n\t\tthis._overlaysLayer.className = 'overlays';\n\t\tthis.DM.data.container.appendChild(this.overlaysLayer);\n\t}\n\n\tprivate onFetched = () => {\n\t\tthis.IH().onClick.subscribe(this.select);\n\t\tconst cbd = this.DM.data.canvasBaseDir;\n\t\tconst createOverlay = async (node: JSONCanvasNode) => {\n\t\t\tswitch (node.type) {\n\t\t\t\tcase 'text': {\n\t\t\t\t\tthis.updateOverlay(node, node.text, 'text');\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'file': {\n\t\t\t\t\tif (node.file.match(/\\.md$/i)) this.loadMarkdownForNode(node);\n\t\t\t\t\telse if (node.file.match(/\\.(png|jpg|jpeg|gif|svg|webp)$/i))\n\t\t\t\t\t\tthis.updateOverlay(node, cbd + node.file, 'image');\n\t\t\t\t\telse if (node.file.match(/\\.(mp3|wav)$/i))\n\t\t\t\t\t\tthis.updateOverlay(node, cbd + node.file, 'audio');\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'link': {\n\t\t\t\t\tthis.updateOverlay(node, node.url, 'link');\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tObject.values(this.DM.data.nodeMap).forEach(node => {\n\t\t\tcreateOverlay(node);\n\t\t});\n\t};\n\n\tprivate select = (id: string | null) => {\n\t\tconst previous = !this.selectedId ? null : this.overlays[this.selectedId];\n\t\tconst current = !id ? null : this.overlays[id];\n\t\tif (previous) previous.classList.remove('active');\n\t\tif (current) {\n\t\t\tcurrent.classList.add('active');\n\t\t\tthis.hooks.onInteractionStart();\n\t\t} else this.hooks.onInteractionEnd();\n\t\tthis.selectedId = id;\n\t};\n\n\tprivate loadMarkdownForNode = async (node: JSONCanvasFileNode) => {\n\t\tthis.updateOverlay(node, 'Loading...', 'text');\n\t\tlet parsedContent: string;\n\t\ttry {\n\t\t\tconst response = await fetch(this.DM.data.canvasBaseDir + node.file);\n\t\t\tconst result = await response.text();\n\t\t\tconst frontmatterMatch = result.match(/^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/);\n\t\t\tif (frontmatterMatch) parsedContent = this.parse(frontmatterMatch[2]);\n\t\t\telse parsedContent = this.parse(result);\n\t\t} catch (err) {\n\t\t\tconsole.error('[JSONCanvasViewer] Failed to load markdown:', err);\n\t\t\tparsedContent = 'Failed to load content.';\n\t\t}\n\t\tthis.updateOverlay(node, parsedContent, 'text');\n\t};\n\n\tprivate updateOverlays = () => {\n\t\tconst data = this.DM.data;\n\t\tthis.overlaysLayer.style.transform = `translate(${data.offsetX}px, ${data.offsetY}px) scale(${data.scale})`;\n\t};\n\n\tprivate updateOverlay(node: JSONCanvasNode, content: string, type: string) {\n\t\tlet element = this.overlays[node.id];\n\t\tif (!element) {\n\t\t\telement = this.constructOverlay(node, content, type);\n\t\t\tthis.overlaysLayer.appendChild(element);\n\t\t\tthis.overlays[node.id] = element;\n\t\t\telement.style.left = `${node.x}px`;\n\t\t\telement.style.top = `${node.y}px`;\n\t\t\telement.style.width = `${node.width}px`;\n\t\t\telement.style.height = `${node.height}px`;\n\t\t} else if (type === 'text') {\n\t\t\tconst parsedContentContainer = element.getElementsByClassName('parsed-content-wrapper')[0];\n\t\t\tparsedContentContainer.innerHTML = content;\n\t\t}\n\t}\n\n\tprivate constructOverlay(node: JSONCanvasNode, content: string, type: string) {\n\t\tconst color = utilities.getColor(node.color);\n\t\tconst overlay = document.createElement('div');\n\t\toverlay.classList.add('overlay-container');\n\t\toverlay.id = node.id;\n\t\toverlay.style.backgroundColor = color.background;\n\t\toverlay.style.setProperty('--active-color', color.active);\n\t\tswitch (type) {\n\t\t\tcase 'text': {\n\t\t\t\toverlay.classList.add('markdown-content');\n\t\t\t\tconst parsedContentWrapper = document.createElement('div');\n\t\t\t\tparsedContentWrapper.innerHTML = this.parse(content || '');\n\t\t\t\tparsedContentWrapper.classList.add('parsed-content-wrapper');\n\t\t\t\toverlay.appendChild(parsedContentWrapper);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'link': {\n\t\t\t\tconst iframe = document.createElement('iframe');\n\t\t\t\tiframe.src = content;\n\t\t\t\tiframe.sandbox = 'allow-scripts allow-same-origin';\n\t\t\t\tiframe.className = 'link-iframe';\n\t\t\t\tiframe.loading = 'lazy';\n\t\t\t\toverlay.appendChild(iframe);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'audio': {\n\t\t\t\tconst audio = document.createElement('audio');\n\t\t\t\taudio.className = 'audio';\n\t\t\t\taudio.src = content;\n\t\t\t\taudio.controls = true;\n\t\t\t\toverlay.appendChild(audio);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'image': {\n\t\t\t\tconst img = document.createElement('img');\n\t\t\t\timg.src = content;\n\t\t\t\timg.loading = 'lazy';\n\t\t\t\toverlay.appendChild(img);\n\t\t\t}\n\t\t}\n\t\tswitch (type) {\n\t\t\tcase 'link':\n\t\t\tcase 'audio': {\n\t\t\t\tconst clickLayer = document.createElement('div');\n\t\t\t\tclickLayer.className = 'click-layer';\n\t\t\t\toverlay.appendChild(clickLayer);\n\t\t\t}\n\t\t}\n\t\tconst overlayBorder = document.createElement('div');\n\t\toverlayBorder.className = 'overlay-border';\n\t\toverlayBorder.style.borderColor = color.border;\n\t\toverlay.appendChild(overlayBorder);\n\t\tconst onStart = () => {\n\t\t\tif (node.id === this.selectedId) this.hooks.onInteractionStart();\n\t\t};\n\t\tconst onEnd = () => {\n\t\t\tif (node.id === this.selectedId) this.hooks.onInteractionEnd();\n\t\t};\n\t\toverlay.addEventListener('pointerenter', onStart);\n\t\toverlay.addEventListener('pointerleave', onEnd);\n\t\toverlay.addEventListener('touchstart', onStart);\n\t\toverlay.addEventListener('touchend', onEnd);\n\t\tthis.eventListeners[node.id] = [onStart, onEnd];\n\t\treturn overlay;\n\t}\n\n\tdispose = () => {\n\t\twhile (this.overlaysLayer.firstElementChild) {\n\t\t\tconst child = this.overlaysLayer.firstElementChild;\n\t\t\tif (this.eventListeners[child.id]) {\n\t\t\t\tconst onStart = this.eventListeners[child.id][0];\n\t\t\t\tconst onEnd = this.eventListeners[child.id][1];\n\t\t\t\tif (!onStart || !onEnd) throw destroyError;\n\t\t\t\tchild.removeEventListener('pointerenter', onStart);\n\t\t\t\tchild.removeEventListener('pointerleave', onEnd);\n\t\t\t\tchild.removeEventListener('touchstart', onStart);\n\t\t\t\tchild.removeEventListener('touchend', onEnd);\n\t\t\t\tthis.eventListeners[child.id][0] = null;\n\t\t\t\tthis.eventListeners[child.id][1] = null;\n\t\t\t}\n\t\t\tchild.remove();\n\t\t}\n\t\tthis.overlaysLayer.remove();\n\t\tthis._overlaysLayer = null;\n\t};\n}\n","import {\n\tClick,\n\ttype Ctors,\n\tDrag,\n\tMultitouchPanZoom,\n\tPointeract,\n\ttype Options as PointeractOptions,\n\tPreventDefault,\n\ttype StdEvents,\n\tWheelPanZoom,\n} from 'pointeract';\nimport { type BaseArgs, BaseModule } from '@/baseModule';\nimport DataManager from '@/dataManager';\nimport OverlayManager from '@/overlayManager';\nimport utilities from '@/utilities';\n\ntype Options = {\n\tpointeract?: PointeractOptions<Ctors<[Click, Drag, WheelPanZoom, PreventDefault, MultitouchPanZoom]>>;\n};\n\nexport default class InteractionHandler extends BaseModule<Options> {\n\tprivate pointeract: Pointeract<Ctors<[Click, Drag, WheelPanZoom, PreventDefault, MultitouchPanZoom]>>;\n\tprivate DM: DataManager;\n\tonClick = utilities.makeHook<[string | null]>();\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tthis.DM = this.container.get(DataManager);\n\t\tconst options = Object.assign(this.options.pointeract || {}, {\n\t\t\tcoordinateOutput: 'relative',\n\t\t});\n\t\tthis.pointeract = new Pointeract(\n\t\t\tthis.DM.data.container,\n\t\t\t[Click, Drag, WheelPanZoom, PreventDefault, MultitouchPanZoom],\n\t\t\toptions,\n\t\t);\n\t\tthis.startInteraction = this.pointeract.start;\n\t\tthis.stopInteraction = this.pointeract.stop;\n\t\tconst OM = this.container.get(OverlayManager);\n\t\tOM.hooks.onInteractionStart.subscribe(this.stopInteraction);\n\t\tOM.hooks.onInteractionEnd.subscribe(this.startInteraction);\n\t\tthis.DM.hooks.onCanvasFetched.subscribe(this.onFetched);\n\t}\n\tstopInteraction: Pointeract['stop'];\n\tstartInteraction: Pointeract['start'];\n\n\tprivate onFetched = () => {\n\t\tthis.pointeract.on('pan', this.onPan);\n\t\tthis.pointeract.on('drag', this.onPan);\n\t\tthis.pointeract.on('zoom', this.onZoom);\n\t\tthis.pointeract.on('trueClick', this.onTrueClick);\n\t\tthis.pointeract.start();\n\t};\n\n\tprivate onPan = (event: StdEvents['pan']) => {\n\t\tthis.DM.pan(event.detail);\n\t};\n\tprivate onZoom = (event: StdEvents['zoom']) => {\n\t\tconst detail = event.detail;\n\t\tthis.DM.zoom(detail.factor, { x: detail.x, y: detail.y });\n\t};\n\n\tprivate onTrueClick = (e: StdEvents['trueClick']) => {\n\t\tconst detail = e.detail;\n\t\tfunction isUIControl(target: HTMLElement | null) {\n\t\t\tif (!target) return false;\n\t\t\treturn target.closest('.controls') || target.closest('button') || target.closest('input');\n\t\t}\n\t\tif (isUIControl(e.detail.target as HTMLElement | null)) return;\n\t\tconst node = this.DM.findNodeAt({ x: detail.x, y: detail.y });\n\t\tthis.onClick(node ? node.id : null);\n\t};\n\n\tdispose = () => {\n\t\tthis.pointeract.off('pan', this.onPan);\n\t\tthis.pointeract.off('zoom', this.onZoom);\n\t\tthis.pointeract.off('trueClick', this.onTrueClick);\n\t\tthis.pointeract.dispose();\n\t};\n}\n","import { type BaseArgs, BaseModule } from '@/baseModule';\nimport Controller from '@/controller';\nimport DataManager from '@/dataManager';\nimport utilities, { destroyError } from '@/utilities';\n\ninterface viewport {\n\tleft: number;\n\tright: number;\n\ttop: number;\n\tbottom: number;\n}\n\ninterface RuntimeJSONCanvasEdge extends JSONCanvasEdge {\n\tcontrolPoints?: Array<number>;\n}\n\nconst ARROW_LENGTH = 12;\nconst ARROW_WIDTH = 7;\nconst NODE_RADIUS = 12;\nconst FONT_COLOR = '#fff';\nconst CSS_ZOOM_REDRAW_INTERVAL = 500;\n\nexport default class Renderer extends BaseModule {\n\tprivate _canvas: HTMLCanvasElement | null;\n\tprivate ctx: CanvasRenderingContext2D;\n\tprivate DM: DataManager;\n\tprivate zoomInOptimize: {\n\t\tlastDrawnScale: number;\n\t\tlastDrawnViewport: viewport;\n\t\ttimeout: NodeJS.Timeout | null;\n\t\tlastCallTime: number;\n\t} = {\n\t\tlastDrawnScale: 0,\n\t\tlastDrawnViewport: {\n\t\t\tleft: 0,\n\t\t\tright: 0,\n\t\t\ttop: 0,\n\t\t\tbottom: 0,\n\t\t},\n\t\ttimeout: null,\n\t\tlastCallTime: 0,\n\t};\n\n\tprivate get canvas() {\n\t\tif (this._canvas === null) throw destroyError;\n\t\treturn this._canvas;\n\t}\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tconst controller = this.container.get(Controller);\n\t\tcontroller.hooks.onRefresh.subscribe(this.redraw);\n\t\tcontroller.hooks.onResize.subscribe(this.optimizeDPR);\n\t\tthis.DM = this.container.get(DataManager);\n\t\tthis._canvas = document.createElement('canvas');\n\t\tthis._canvas.className = 'main-canvas';\n\t\tthis.ctx = this._canvas.getContext('2d') as CanvasRenderingContext2D;\n\t\tthis.DM.data.container.appendChild(this._canvas);\n\t}\n\n\tprivate optimizeDPR = () => {\n\t\tconst container = this.DM.data.container;\n\t\tutilities.resizeCanvasForDPR(this.canvas, container.offsetWidth, container.offsetHeight);\n\t};\n\n\tprivate redraw = () => {\n\t\tif (this.zoomInOptimize.timeout) {\n\t\t\tclearTimeout(this.zoomInOptimize.timeout);\n\t\t\tthis.zoomInOptimize.timeout = null;\n\t\t}\n\t\tconst now = Date.now();\n\t\tconst offsetX = this.DM.data.offsetX;\n\t\tconst offsetY = this.DM.data.offsetY;\n\t\tconst scale = this.DM.data.scale;\n\t\tconst currentViewport = this.getCurrentViewport(offsetX, offsetY, scale);\n\t\tif (\n\t\t\tthis.isViewportInside(currentViewport, this.zoomInOptimize.lastDrawnViewport) &&\n\t\t\tscale !== this.zoomInOptimize.lastDrawnScale\n\t\t) {\n\t\t\tconst timeSinceLast = now - this.zoomInOptimize.lastCallTime;\n\t\t\tif (timeSinceLast < CSS_ZOOM_REDRAW_INTERVAL) {\n\t\t\t\tthis.zoomInOptimize.timeout = setTimeout(() => {\n\t\t\t\t\tthis.trueRedraw(offsetX, offsetY, scale, currentViewport);\n\t\t\t\t\tthis.zoomInOptimize.lastCallTime = now;\n\t\t\t\t\tthis.zoomInOptimize.timeout = null;\n\t\t\t\t}, 60);\n\t\t\t\tthis.fakeRedraw(currentViewport, scale);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tthis.zoomInOptimize.lastCallTime = now;\n\t\tthis.trueRedraw(offsetX, offsetY, scale, currentViewport);\n\t};\n\n\tprivate trueRedraw(offsetX: number, offsetY: number, scale: number, currentViewport: viewport) {\n\t\tthis.zoomInOptimize.lastDrawnViewport = currentViewport;\n\t\tthis.zoomInOptimize.lastDrawnScale = scale;\n\t\tthis.canvas.style.transform = '';\n\t\tthis.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n\t\tthis.ctx.save();\n\t\tthis.ctx.translate(offsetX, offsetY);\n\t\tthis.ctx.scale(scale, scale);\n\t\tconst canvasData = this.DM.data.canvasData;\n\t\tcanvasData.nodes.forEach(node => {\n\t\t\tswitch (node.type) {\n\t\t\t\tcase 'group':\n\t\t\t\t\tthis.drawGroup(node, scale);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'file':\n\t\t\t\t\tthis.drawFileNode(node);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\t\tcanvasData.edges.forEach(edge => {\n\t\t\tthis.drawEdge(edge);\n\t\t});\n\t\tthis.ctx.restore();\n\t}\n\n\tprivate fakeRedraw(currentViewport: viewport, scale: number) {\n\t\tconst cssScale = scale / this.zoomInOptimize.lastDrawnScale;\n\t\tconst currentOffsetX = (this.zoomInOptimize.lastDrawnViewport.left - currentViewport.left) * scale;\n\t\tconst currentOffsetY = (this.zoomInOptimize.lastDrawnViewport.top - currentViewport.top) * scale;\n\t\tthis.canvas.style.transform = `translate(${currentOffsetX}px, ${currentOffsetY}px) scale(${cssScale})`;\n\t}\n\n\tprivate isViewportInside = (inner: viewport, outer: viewport) =>\n\t\tinner.left > outer.left &&\n\t\tinner.top > outer.top &&\n\t\tinner.right < outer.right &&\n\t\tinner.bottom < outer.bottom;\n\n\tprivate getCurrentViewport = (offsetX: number, offsetY: number, scale: number) => {\n\t\tconst left = -offsetX / scale;\n\t\tconst top = -offsetY / scale;\n\t\tconst container = this.DM.data.container;\n\t\tconst right = left + container.clientWidth / scale;\n\t\tconst bottom = top + container.clientHeight / scale;\n\t\treturn { left, top, right, bottom };\n\t};\n\n\tprivate drawLabelBar = (x: number, y: number, label: string, color: string, scale: number) => {\n\t\tconst barHeight = 30 * scale;\n\t\tconst radius = 6 * scale;\n\t\tconst yOffset = 8 * scale;\n\t\tconst fontSize = 16 * scale;\n\t\tconst xPadding = 6 * scale;\n\t\tthis.ctx.save();\n\t\tthis.ctx.translate(x, y);\n\t\tthis.ctx.scale(1 / scale, 1 / scale);\n\t\tthis.ctx.font = `${fontSize}px 'Inter', sans-serif`;\n\t\tconst barWidth = this.ctx.measureText(label).width + 2 * xPadding;\n\t\tthis.ctx.translate(0, -barHeight - yOffset);\n\t\tthis.ctx.fillStyle = color;\n\t\tthis.ctx.beginPath();\n\t\tthis.ctx.moveTo(radius, 0);\n\t\tthis.ctx.lineTo(barWidth - radius, 0);\n\t\tthis.ctx.quadraticCurveTo(barWidth, 0, barWidth, radius);\n\t\tthis.ctx.lineTo(barWidth, barHeight - radius);\n\t\tthis.ctx.quadraticCurveTo(barWidth, barHeight, barWidth - radius, barHeight);\n\t\tthis.ctx.lineTo(radius, barHeight);\n\t\tthis.ctx.quadraticCurveTo(0, barHeight, 0, barHeight - radius);\n\t\tthis.ctx.lineTo(0, radius);\n\t\tthis.ctx.quadraticCurveTo(0, 0, radius, 0);\n\t\tthis.ctx.closePath();\n\t\tthis.ctx.fill();\n\t\tthis.ctx.fillStyle = FONT_COLOR;\n\t\tthis.ctx.fillText(label, xPadding, barHeight * 0.65);\n\t\tthis.ctx.restore();\n\t};\n\n\tprivate drawNodeBackground = (node: JSONCanvasNode) => {\n\t\tconst colors = utilities.getColor(node.color);\n\t\tconst radius = NODE_RADIUS;\n\t\tthis.ctx.globalAlpha = 1.0;\n\t\tthis.ctx.fillStyle = colors.background;\n\t\tutilities.drawRoundRect(this.ctx, node.x + 1, node.y + 1, node.width - 2, node.height - 2, radius);\n\t\tthis.ctx.fill();\n\t\tthis.ctx.strokeStyle = colors.border;\n\t\tthis.ctx.lineWidth = 2;\n\t\tutilities.drawRoundRect(this.ctx, node.x, node.y, node.width, node.height, radius);\n\t\tthis.ctx.stroke();\n\t};\n\n\tprivate drawGroup = (node: JSONCanvasGroupNode, scale: number) => {\n\t\tthis.drawNodeBackground(node);\n\t\tif (node.label)\n\t\t\tthis.drawLabelBar(node.x, node.y, node.label, utilities.getColor(node.color).active, scale);\n\t};\n\n\tprivate drawFileNode = (node: JSONCanvasFileNode) => {\n\t\tthis.ctx.fillStyle = FONT_COLOR;\n\t\tthis.ctx.font = '16px sans-serif';\n\t\tthis.ctx.fillText(node.file, node.x + 5, node.y - 10);\n\t};\n\n\tprivate drawEdge = (edge: RuntimeJSONCanvasEdge) => {\n\t\tconst { fromNode, toNode } = this.getEdgeNodes(edge);\n\t\tconst gac = utilities.getAnchorCoord;\n\t\tconst [startX, startY] = gac(fromNode, edge.fromSide);\n\t\tconst [endX, endY] = gac(toNode, edge.toSide);\n\t\tconst { active } = utilities.getColor(edge.color);\n\t\tlet [startControlX, startControlY, endControlX, endControlY] = [0, 0, 0, 0];\n\t\tif (!edge.controlPoints) {\n\t\t\t[startControlX, startControlY, endControlX, endControlY] = this.getControlPoints(\n\t\t\t\tstartX,\n\t\t\t\tstartY,\n\t\t\t\tendX,\n\t\t\t\tendY,\n\t\t\t\tedge.fromSide,\n\t\t\t\tedge.toSide,\n\t\t\t);\n\t\t\tedge.controlPoints = [startControlX, startControlY, endControlX, endControlY];\n\t\t} else [startControlX, startControlY, endControlX, endControlY] = edge.controlPoints;\n\t\tthis.drawCurvedPath(\n\t\t\tstartX,\n\t\t\tstartY,\n\t\t\tendX,\n\t\t\tendY,\n\t\t\tstartControlX,\n\t\t\tstartControlY,\n\t\t\tendControlX,\n\t\t\tendControlY,\n\t\t\tactive,\n\t\t);\n\t\tthis.drawArrowhead(endX, endY, endControlX, endControlY, active);\n\t\tif (edge.label) {\n\t\t\tconst t = 0.5;\n\t\t\tconst x =\n\t\t\t\t(1 - t) ** 3 * startX +\n\t\t\t\t3 * (1 - t) ** 2 * t * startControlX +\n\t\t\t\t3 * (1 - t) * t * t * endControlX +\n\t\t\t\tt ** 3 * endX;\n\t\t\tconst y =\n\t\t\t\t(1 - t) ** 3 * startY +\n\t\t\t\t3 * (1 - t) ** 2 * t * startControlY +\n\t\t\t\t3 * (1 - t) * t * t * endControlY +\n\t\t\t\tt ** 3 * endY;\n\t\t\tthis.ctx.font = '18px sans-serif';\n\t\t\tconst metrics = this.ctx.measureText(edge.label);\n\t\t\tconst padding = 8;\n\t\t\tconst labelWidth = metrics.width + padding * 2;\n\t\t\tconst labelHeight = 20;\n\t\t\tthis.ctx.fillStyle = '#222';\n\t\t\tthis.ctx.beginPath();\n\t\t\tutilities.drawRoundRect(\n\t\t\t\tthis.ctx,\n\t\t\t\tx - labelWidth / 2,\n\t\t\t\ty - labelHeight / 2 - 2,\n\t\t\t\tlabelWidth,\n\t\t\t\tlabelHeight,\n\t\t\t\t4,\n\t\t\t);\n\t\t\tthis.ctx.fill();\n\t\t\tthis.ctx.fillStyle = '#ccc';\n\t\t\tthis.ctx.textAlign = 'center';\n\t\t\tthis.ctx.textBaseline = 'middle';\n\t\t\tthis.ctx.fillText(edge.label, x, y - 2);\n\t\t\tthis.ctx.textAlign = 'left';\n\t\t\tthis.ctx.textBaseline = 'alphabetic';\n\t\t}\n\t};\n\n\tprivate getEdgeNodes = (edge: JSONCanvasEdge) => ({\n\t\tfromNode: this.DM.data.nodeMap[edge.fromNode],\n\t\ttoNode: this.DM.data.nodeMap[edge.toNode],\n\t});\n\n\tprivate getControlPoints = (\n\t\tstartX: number,\n\t\tstartY: number,\n\t\tendX: number,\n\t\tendY: number,\n\t\tfromSide: string,\n\t\ttoSide: string,\n\t) => {\n\t\tconst distanceX = endX - startX;\n\t\tconst distanceY = endY - startY;\n\t\tconst realDistance =\n\t\t\tMath.min(Math.abs(distanceX), Math.abs(distanceY)) +\n\t\t\t0.3 * Math.max(Math.abs(distanceX), Math.abs(distanceY));\n\t\tconst clamp = (val: number, min: number, max: number) => Math.max(min, Math.min(max, val));\n\t\tconst PADDING = clamp(realDistance * 0.5, 60, 300);\n\t\tlet startControlX = startX;\n\t\tlet startControlY = startY;\n\t\tlet endControlX = endX;\n\t\tlet endControlY = endY;\n\t\tswitch (fromSide) {\n\t\t\tcase 'top':\n\t\t\t\tstartControlY = startY - PADDING;\n\t\t\t\tbreak;\n\t\t\tcase 'bottom':\n\t\t\t\tstartControlY = startY + PADDING;\n\t\t\t\tbreak;\n\t\t\tcase 'left':\n\t\t\t\tstartControlX = startX - PADDING;\n\t\t\t\tbreak;\n\t\t\tcase 'right':\n\t\t\t\tstartControlX = startX + PADDING;\n\t\t\t\tbreak;\n\t\t}\n\t\tswitch (toSide) {\n\t\t\tcase 'top':\n\t\t\t\tendControlY = endY - PADDING;\n\t\t\t\tbreak;\n\t\t\tcase 'bottom':\n\t\t\t\tendControlY = endY + PADDING;\n\t\t\t\tbreak;\n\t\t\tcase 'left':\n\t\t\t\tendControlX = endX - PADDING;\n\t\t\t\tbreak;\n\t\t\tcase 'right':\n\t\t\t\tendControlX = endX + PADDING;\n\t\t\t\tbreak;\n\t\t}\n\t\treturn [startControlX, startControlY, endControlX, endControlY];\n\t};\n\n\tprivate drawCurvedPath = (\n\t\tstartX: number,\n\t\tstartY: number,\n\t\tendX: number,\n\t\tendY: number,\n\t\tc1x: number,\n\t\tc1y: number,\n\t\tc2x: number,\n\t\tc2y: number,\n\t\tcolor: string,\n\t) => {\n\t\tthis.ctx.beginPath();\n\t\tthis.ctx.moveTo(startX, startY);\n\t\tthis.ctx.bezierCurveTo(c1x, c1y, c2x, c2y, endX, endY);\n\t\tthis.ctx.strokeStyle = color;\n\t\tthis.ctx.lineWidth = 2;\n\t\tthis.ctx.stroke();\n\t};\n\n\tprivate drawArrowhead = (tipX: number, tipY: number, fromX: number, fromY: number, color: string) => {\n\t\tconst dx = tipX - fromX;\n\t\tconst dy = tipY - fromY;\n\t\tconst length = Math.sqrt(dx * dx + dy * dy);\n\t\tif (length === 0) return;\n\t\tconst unitX = dx / length;\n\t\tconst unitY = dy / length;\n\t\tconst leftX = tipX - unitX * ARROW_LENGTH - unitY * ARROW_WIDTH;\n\t\tconst leftY = tipY - unitY * ARROW_LENGTH + unitX * ARROW_WIDTH;\n\t\tconst rightX = tipX - unitX * ARROW_LENGTH + unitY * ARROW_WIDTH;\n\t\tconst rightY = tipY - unitY * ARROW_LENGTH - unitX * ARROW_WIDTH;\n\t\tthis.ctx.beginPath();\n\t\tthis.ctx.fillStyle = color;\n\t\tthis.ctx.moveTo(tipX, tipY);\n\t\tthis.ctx.lineTo(leftX, leftY);\n\t\tthis.ctx.lineTo(rightX, rightY);\n\t\tthis.ctx.closePath();\n\t\tthis.ctx.fill();\n\t};\n\n\tdispose = () => {\n\t\tif (this.zoomInOptimize.timeout) {\n\t\t\tclearTimeout(this.zoomInOptimize.timeout);\n\t\t\tthis.zoomInOptimize.timeout = null;\n\t\t}\n\t\tthis.canvas.remove();\n\t\tthis._canvas = null;\n\t};\n}\n","import { Container } from '@needle-di/core';\nimport type { GeneralModuleCtor } from '@/baseModule';\nimport Controller from '@/controller';\nimport DataManager from '@/dataManager';\nimport type { ModuleInput, Options } from '@/declarations';\nimport InteractionHandler from '@/interactionHandler';\nimport OverlayManager from '@/overlayManager';\nimport Renderer from '@/renderer';\n\ntype InternalModules = [\n\ttypeof DataManager,\n\ttypeof Controller,\n\ttypeof OverlayManager,\n\ttypeof InteractionHandler,\n\ttypeof Renderer,\n];\n\nexport default class JSONCanvasViewer<M extends ModuleInput = []> {\n\tprivate options: Options<[...InternalModules, ...M]>;\n\tprivate allModules: ModuleInput;\n\tprivate IO: IntersectionObserver | null = null;\n\tcontainer: Container;\n\n\tconstructor(options: Options<[...InternalModules, ...M]>, modules?: M) {\n\t\tthis.container = new Container();\n\t\tthis.options = options;\n\t\tconst bind = (Class: GeneralModuleCtor) => {\n\t\t\tthis.container.bind({\n\t\t\t\tprovide: Class,\n\t\t\t\tuseFactory: () => new Class(this.container, this.options),\n\t\t\t});\n\t\t};\n\t\tthis.allModules = [\n\t\t\tDataManager,\n\t\t\tController,\n\t\t\tOverlayManager,\n\t\t\tInteractionHandler,\n\t\t\tRenderer,\n\t\t\t...(modules || []),\n\t\t];\n\n\t\tthis.allModules.forEach(bind);\n\t\tif (this.options.lazyLoad) {\n\t\t\tthis.IO = new IntersectionObserver(this.onVisibilityCheck, {\n\t\t\t\troot: null,\n\t\t\t\trootMargin: '50px',\n\t\t\t\tthreshold: 0,\n\t\t\t});\n\t\t\tthis.IO.observe(this.options.container);\n\t\t} else this.load();\n\t}\n\n\tprivate load = () => {\n\t\tthis.allModules.forEach(Module => {\n\t\t\tthis.container.get(Module);\n\t\t});\n\t\tthis.container.get(DataManager).loadCanvas();\n\t};\n\n\tprivate onVisibilityCheck = (entries: Array<IntersectionObserverEntry>) => {\n\t\tentries.forEach(entry => {\n\t\t\tif (entry.isIntersecting) {\n\t\t\t\tthis.load();\n\t\t\t\tthis.IO?.disconnect();\n\t\t\t\tthis.IO = null;\n\t\t\t\treturn;\n\t\t\t}\n\t\t});\n\t};\n\n\tdispose = () => {\n\t\tthis.IO?.disconnect();\n\t\tthis.IO = null;\n\t\tconst container = this.options.container;\n\t\twhile (container.firstChild) container.firstChild.remove();\n\t\tthis.allModules.reverse();\n\t\tthis.allModules.forEach(Module => {\n\t\t\tconst module = this.container.get(Module);\n\t\t\tif (module.dispose) module.dispose();\n\t\t});\n\t\tthis.container.unbindAll();\n\t};\n}\n","import { type BaseArgs, BaseModule } from '@/baseModule';\nimport Controller from '@/controller';\nimport DataManager from '@/dataManager';\nimport utilities, { destroyError } from '@/utilities';\nimport style from './styles.scss?inline';\n\ntype Options = {\n\tcontrolsCollapsed?: boolean;\n};\n\nconst resetIcon =\n\t'<svg viewBox=\"-6 -6 30 30\" stroke-width=\".08\"><path d=\"m14.955 7.986.116.01a1 1 0 0 1 .85 1.13 8 8 0 0 1-13.374 4.728l-.84.84c-.63.63-1.707.184-1.707-.707V10h3.987c.89 0 1.337 1.077.707 1.707l-.731.731a6 6 0 0 0 8.347-.264 6 6 0 0 0 1.63-3.33 1 1 0 0 1 1.131-.848zM11.514.813a8 8 0 0 1 1.942 1.336l.837-.837c.63-.63 1.707-.184 1.707.707V6h-3.981c-.89 0-1.337-1.077-.707-1.707l.728-.729a6 6 0 0 0-9.98 3.591 1 1 0 1 1-1.98-.281A8 8 0 0 1 11.514.813Z\" /></svg>';\nconst enterFullscreenIcon =\n\t'<svg viewBox=\"-5.28 -5.28 34.56 34.56\" fill=\"none\"><path d=\"M4 9V5.6c0-.56 0-.84.109-1.054a1 1 0 0 1 .437-.437C4.76 4 5.04 4 5.6 4H9M4 15v3.4c0 .56 0 .84.109 1.054a1 1 0 0 0 .437.437C4.76 20 5.04 20 5.6 20H9m6-16h3.4c.56 0 .84 0 1.054.109a1 1 0 0 1 .437.437C20 4.76 20 5.04 20 5.6V9m0 6v3.4c0 .56 0 .84-.109 1.054a1 1 0 0 1-.437.437C19.24 20 18.96 20 18.4 20H15\" stroke-width=\"2.4\" stroke-linecap=\"round\"/></svg>';\nconst exitFullscreenIcon =\n\t'<svg viewBox=\"-40.32 -40.32 176.64 176.64\"><path d=\"M30 60H6a6 6 0 0 0 0 12h18v18a6 6 0 0 0 12 0V66a5.997 5.997 0 0 0-6-6Zm60 0H66a5.997 5.997 0 0 0-6 6v24a6 6 0 0 0 12 0V72h18a6 6 0 0 0 0-12ZM66 36h24a6 6 0 0 0 0-12H72V6a6 6 0 0 0-12 0v24a5.997 5.997 0 0 0 6 6ZM30 0a5.997 5.997 0 0 0-6 6v18H6a6 6 0 0 0 0 12h24a5.997 5.997 0 0 0 6-6V6a5.997 5.997 0 0 0-6-6Z\"/></svg>';\nconst zoomInIcon =\n\t'<svg viewBox=\"-1.2 -1.2 26.4 26.4\"><path d=\"M6 12h12m-6-6v12\" stroke-width=\"2\" stroke-linecap=\"round\" /></svg>';\nconst zoomOutIcon =\n\t'<svg viewBox=\"-1.2 -1.2 26.4 26.4\"><path d=\"M6 12h12\" stroke-width=\"2\" stroke-linecap=\"round\" /></svg>';\nconst toggleCollapseIcon =\n\t'<svg viewBox=\"-3.6 -3.6 31.2 31.2\" stroke-width=\".4\"><path d=\"M15.707 4.293a1 1 0 0 1 0 1.414L9.414 12l6.293 6.293a1 1 0 0 1-1.414 1.414l-7-7a1 1 0 0 1 0-1.414l7-7a1 1 0 0 1 1.414 0Z\" /></svg>';\n\nexport default class Controls extends BaseModule<Options> {\n\tprivate _controlsPanel: HTMLDivElement | null = null;\n\tprivate _toggleCollapseBtn: HTMLButtonElement | null = null;\n\tprivate _toggleFullscreenBtn: HTMLButtonElement | null = null;\n\tprivate _zoomOutBtn: HTMLButtonElement | null = null;\n\tprivate _zoomSlider: HTMLInputElement | null = null;\n\tprivate _zoomInBtn: HTMLButtonElement | null = null;\n\tprivate _resetViewBtn: HTMLButtonElement | null = null;\n\tprivate DM: DataManager;\n\tprivate collapsed: boolean;\n\n\tprivate get controlsPanel() {\n\t\tif (this._controlsPanel === null) throw destroyError;\n\t\treturn this._controlsPanel;\n\t}\n\tprivate get toggleCollapseBtn() {\n\t\tif (this._toggleCollapseBtn === null) throw destroyError;\n\t\treturn this._toggleCollapseBtn;\n\t}\n\tprivate get toggleFullscreenBtn() {\n\t\tif (this._toggleFullscreenBtn === null) throw destroyError;\n\t\treturn this._toggleFullscreenBtn;\n\t}\n\tprivate get zoomOutBtn() {\n\t\tif (this._zoomOutBtn === null) throw destroyError;\n\t\treturn this._zoomOutBtn;\n\t}\n\tprivate get zoomSlider() {\n\t\tif (this._zoomSlider === null) throw destroyError;\n\t\treturn this._zoomSlider;\n\t}\n\tprivate get zoomInBtn() {\n\t\tif (this._zoomInBtn === null) throw destroyError;\n\t\treturn this._zoomInBtn;\n\t}\n\tprivate get resetViewBtn() {\n\t\tif (this._resetViewBtn === null) throw destroyError;\n\t\treturn this._resetViewBtn;\n\t}\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tthis.collapsed = this.options.controlsCollapsed || false;\n\t\tthis.DM = this.container.get(DataManager);\n\t\tthis.DM.hooks.onToggleFullscreen.subscribe(this.updateFullscreenBtn);\n\t\tthis.container.get(Controller).hooks.onRefresh.subscribe(this.updateSlider);\n\n\t\tthis._controlsPanel = document.createElement('div');\n\t\tthis._controlsPanel.className = 'controls';\n\t\tthis._controlsPanel.classList.toggle('collapsed', this.collapsed);\n\n\t\tutilities.applyStyles(this._controlsPanel, style);\n\n\t\tthis._toggleCollapseBtn = document.createElement('button');\n\t\tthis._toggleCollapseBtn.className = 'collapse-button';\n\t\tthis._toggleCollapseBtn.innerHTML = toggleCollapseIcon;\n\t\tthis._controlsPanel.appendChild(this._toggleCollapseBtn);\n\n\t\tconst controlsContent = document.createElement('div');\n\t\tcontrolsContent.className = 'controls-content';\n\n\t\tthis._toggleFullscreenBtn = document.createElement('button');\n\t\tthis._toggleFullscreenBtn.innerHTML = enterFullscreenIcon;\n\t\tcontrolsContent.appendChild(this._toggleFullscreenBtn);\n\n\t\tthis._zoomOutBtn = document.createElement('button');\n\t\tthis._zoomOutBtn.innerHTML = zoomOutIcon;\n\t\tcontrolsContent.appendChild(this._zoomOutBtn);\n\n\t\tthis._zoomSlider = document.createElement('input');\n\t\tthis._zoomSlider.type = 'range';\n\t\tthis._zoomSlider.className = 'zoom-slider';\n\t\tthis._zoomSlider.min = '-30';\n\t\tthis._zoomSlider.max = '30';\n\t\tthis._zoomSlider.value = '0';\n\t\tcontrolsContent.appendChild(this._zoomSlider);\n\n\t\tthis._zoomInBtn = document.createElement('button');\n\t\tthis._zoomInBtn.innerHTML = zoomInIcon;\n\t\tcontrolsContent.appendChild(this._zoomInBtn);\n\n\t\tthis._resetViewBtn = document.createElement('button');\n\t\tthis._resetViewBtn.innerHTML = resetIcon;\n\t\tcontrolsContent.appendChild(this._resetViewBtn);\n\n\t\tthis._controlsPanel.appendChild(controlsContent);\n\n\t\tthis.DM.data.container.appendChild(this._controlsPanel);\n\n\t\tthis._toggleCollapseBtn.addEventListener('click', this.toggleCollapse);\n\t\tthis._zoomInBtn.addEventListener('click', this.zoomIn);\n\t\tthis._zoomOutBtn.addEventListener('click', this.zoomOut);\n\t\tthis._zoomSlider.addEventListener('input', this.slide);\n\t\tthis._resetViewBtn.addEventListener('click', this.DM.resetView);\n\t\tthis._toggleFullscreenBtn.addEventListener('click', this.toggleFullscreen);\n\t}\n\ttoggleCollapse = () => {\n\t\tthis.collapsed = !this.collapsed;\n\t\tthis.controlsPanel.classList.toggle('collapsed', this.collapsed);\n\t\tif (!this.collapsed) this.updateSlider();\n\t};\n\tprivate zoomIn = () => this.DM.zoom(1.1, this.DM.middleViewer());\n\tprivate zoomOut = () => this.DM.zoom(1 / 1.1, this.DM.middleViewer());\n\tprivate slide = () => this.DM.zoomToScale(1.1 ** Number(this.zoomSlider.value), this.DM.middleViewer());\n\n\tprivate updateFullscreenBtn = (enter: boolean) => {\n\t\tif (enter) this.toggleFullscreenBtn.innerHTML = exitFullscreenIcon;\n\t\telse this.toggleFullscreenBtn.innerHTML = enterFullscreenIcon;\n\t};\n\tprivate toggleFullscreen = () => this.DM.shiftFullscreen('toggle');\n\n\tprivate updateSlider = () => {\n\t\tif (this.collapsed) return;\n\t\tthis.zoomSlider.value = String(this.scaleToSlider(this.DM.data.scale));\n\t};\n\tprivate scaleToSlider = (scale: number) => Math.log(scale) / Math.log(1.1);\n\n\tdispose = () => {\n\t\tthis.toggleCollapseBtn.removeEventListener('click', this.toggleCollapse);\n\t\tthis.zoomInBtn.removeEventListener('click', this.zoomIn);\n\t\tthis.zoomOutBtn.removeEventListener('click', this.zoomOut);\n\t\tthis.zoomSlider.removeEventListener('input', this.slide);\n\t\tthis.resetViewBtn.removeEventListener('click', this.DM.resetView);\n\t\tthis.toggleFullscreenBtn.removeEventListener('click', this.toggleFullscreen);\n\t\tthis.controlsPanel.remove();\n\t\tthis._controlsPanel = null;\n\t\tthis._toggleCollapseBtn = null;\n\t\tthis._zoomInBtn = null;\n\t\tthis._zoomOutBtn = null;\n\t\tthis._zoomSlider = null;\n\t\tthis._resetViewBtn = null;\n\t\tthis._toggleFullscreenBtn = null;\n\t};\n}\n","import { type BaseArgs, BaseModule } from '@/baseModule';\nimport Controller from '@/controller';\nimport DataManager from '@/dataManager';\nimport utilities, { destroyError } from '@/utilities';\nimport style from './styles.scss?inline';\n\nexport default class DebugPanel extends BaseModule {\n\tprivate _debugPanel: HTMLDivElement | null = null;\n\tprivate DM: DataManager;\n\n\tprivate get debugPanel() {\n\t\tif (!this._debugPanel) throw destroyError;\n\t\treturn this._debugPanel;\n\t}\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tthis.DM = this.container.get(DataManager);\n\t\tthis.container.get(Controller).hooks.onRefresh.subscribe(this.update);\n\t\tthis._debugPanel = document.createElement('div');\n\t\tthis._debugPanel.className = 'debug-panel';\n\t\tconst HTMLContainer = this.DM.data.container;\n\t\tutilities.applyStyles(HTMLContainer, style);\n\t\tHTMLContainer.appendChild(this._debugPanel);\n\t}\n\n\tprivate update = () => {\n\t\tconst round = utilities.round;\n\t\tconst data = this.DM.data;\n\t\tthis.debugPanel.innerHTML = `<p>Scale: ${round(data.scale, 3)}</p><p>Offset: ${round(data.offsetX, 1)}, ${round(data.offsetY, 1)}</p>`;\n\t};\n\n\tdispose = () => {\n\t\tthis.debugPanel.remove();\n\t\tthis._debugPanel = null;\n\t};\n}\n","import { type BaseArgs, BaseModule } from '@/baseModule';\nimport Controller from '@/controller';\nimport DataManager from '@/dataManager';\nimport utilities, { destroyError } from '@/utilities';\nimport style from './styles.scss?inline';\n\ntype Options = {\n\tminimapCollapsed?: boolean;\n};\n\nconst toggleCollapseIcon =\n\t'<svg viewBox=\"-3.6 -3.6 31.2 31.2\" stroke-width=\".4\"><path d=\"M15.707 4.293a1 1 0 0 1 0 1.414L9.414 12l6.293 6.293a1 1 0 0 1-1.414 1.414l-7-7a1 1 0 0 1 0-1.414l7-7a1 1 0 0 1 1.414 0Z\" /></svg>';\n\nexport default class Minimap extends BaseModule<Options> {\n\tprivate _minimapCtx: CanvasRenderingContext2D | null = null;\n\tprivate _viewportRectangle: HTMLDivElement | null = null;\n\tprivate _minimap: HTMLDivElement | null = null;\n\tprivate _minimapContainer: HTMLDivElement | null = null;\n\tprivate _toggleMinimapBtn: HTMLButtonElement | null = null;\n\tprivate minimapCache: { scale: number; centerX: number; centerY: number } = {\n\t\tscale: 1,\n\t\tcenterX: 0,\n\t\tcenterY: 0,\n\t};\n\tprivate DM: DataManager;\n\tprivate collapsed: boolean;\n\n\tprivate get minimap() {\n\t\tif (this._minimap === null) throw destroyError;\n\t\treturn this._minimap;\n\t}\n\tprivate get minimapCtx() {\n\t\tif (this._minimapCtx === null) throw destroyError;\n\t\treturn this._minimapCtx;\n\t}\n\tprivate get viewportRectangle() {\n\t\tif (this._viewportRectangle === null) throw destroyError;\n\t\treturn this._viewportRectangle;\n\t}\n\tprivate get minimapContainer() {\n\t\tif (this._minimapContainer === null) throw destroyError;\n\t\treturn this._minimapContainer;\n\t}\n\tprivate get toggleMinimapBtn() {\n\t\tif (this._toggleMinimapBtn === null) throw destroyError;\n\t\treturn this._toggleMinimapBtn;\n\t}\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tthis.collapsed = this.options.minimapCollapsed || false;\n\t\tthis.container.get(Controller).hooks.onRefresh.subscribe(this.updateViewportRectangle);\n\t\tthis.DM = this.container.get(DataManager);\n\t\tthis.DM.hooks.onCanvasFetched.subscribe(this.drawMinimap);\n\n\t\tthis._minimapContainer = document.createElement('div');\n\t\tthis._minimapContainer.className = 'minimap-container';\n\n\t\tutilities.applyStyles(this._minimapContainer, style);\n\n\t\tthis._toggleMinimapBtn = document.createElement('button');\n\t\tthis._toggleMinimapBtn.className = 'toggle-minimap collapse-button';\n\t\tthis._toggleMinimapBtn.innerHTML = toggleCollapseIcon;\n\t\tthis._minimapContainer.appendChild(this._toggleMinimapBtn);\n\n\t\tthis._minimap = document.createElement('div');\n\t\tthis._minimap.className = 'minimap';\n\t\tconst minimapCanvas = document.createElement('canvas');\n\t\tminimapCanvas.className = 'minimap-canvas';\n\t\tminimapCanvas.width = 200;\n\t\tminimapCanvas.height = 150;\n\n\t\tthis._minimap.appendChild(minimapCanvas);\n\t\tthis._minimapCtx = minimapCanvas.getContext('2d') as CanvasRenderingContext2D;\n\t\tthis._viewportRectangle = document.createElement('div');\n\t\tthis._viewportRectangle.className = 'viewport-rectangle';\n\t\tthis._minimap.appendChild(this._viewportRectangle);\n\t\tthis._minimapContainer.appendChild(this._minimap);\n\n\t\tthis.DM.data.container.appendChild(this._minimapContainer);\n\n\t\tthis._minimapContainer.classList.toggle('collapsed', this.collapsed);\n\n\t\tthis._toggleMinimapBtn.addEventListener('click', this.toggleCollapse);\n\t\tutilities.resizeCanvasForDPR(minimapCanvas, minimapCanvas.width, minimapCanvas.height);\n\t}\n\n\ttoggleCollapse = () => {\n\t\tthis.collapsed = !this.collapsed;\n\t\tthis.minimapContainer.classList.toggle('collapsed', this.collapsed);\n\t\tif (!this.collapsed) this.updateViewportRectangle();\n\t};\n\n\tprivate drawMinimap = () => {\n\t\tconst bounds = this.DM.data.nodeBounds;\n\t\tif (!bounds) return;\n\t\tconst displayWidth = this.minimap.clientWidth;\n\t\tconst displayHeight = this.minimap.clientHeight;\n\t\tconst scaleX = displayWidth / bounds.width;\n\t\tconst scaleY = displayHeight / bounds.height;\n\t\tthis.minimapCache.scale = Math.min(scaleX, scaleY) * 0.9;\n\t\tthis.minimapCache.centerX = displayWidth / 2;\n\t\tthis.minimapCache.centerY = displayHeight / 2;\n\t\tthis.minimapCtx.clearRect(0, 0, displayWidth, displayHeight);\n\t\tthis.minimapCtx.save();\n\t\tthis.minimapCtx.translate(this.minimapCache.centerX, this.minimapCache.centerY);\n\t\tthis.minimapCtx.scale(this.minimapCache.scale, this.minimapCache.scale);\n\t\tthis.minimapCtx.translate(-bounds.centerX, -bounds.centerY);\n\t\tconst canvasData = this.DM.data.canvasData;\n\t\tfor (const edge of canvasData.edges) this.drawMinimapEdge(edge);\n\t\tfor (const node of canvasData.nodes) this.drawMinimapNode(node);\n\t\tthis.minimapCtx.restore();\n\t};\n\n\tprivate drawMinimapNode = (node: JSONCanvasNode) => {\n\t\tconst colors = utilities.getColor(node.color);\n\t\tconst radius = 25;\n\t\tthis.minimapCtx.fillStyle = colors.border;\n\t\tthis.minimapCtx.globalAlpha = 0.3;\n\t\tutilities.drawRoundRect(this.minimapCtx, node.x, node.y, node.width, node.height, radius);\n\t\tthis.minimapCtx.fill();\n\t\tthis.minimapCtx.globalAlpha = 1.0;\n\t};\n\n\tprivate drawMinimapEdge = (edge: JSONCanvasEdge) => {\n\t\tconst nodeMap = this.DM.data.nodeMap;\n\t\tconst fromNode = nodeMap[edge.fromNode];\n\t\tconst toNode = nodeMap[edge.toNode];\n\t\tif (!fromNode || !toNode) return;\n\t\tconst [startX, startY] = utilities.getAnchorCoord(fromNode, edge.fromSide);\n\t\tconst [endX, endY] = utilities.getAnchorCoord(toNode, edge.toSide);\n\t\tthis.minimapCtx.beginPath();\n\t\tthis.minimapCtx.moveTo(startX, startY);\n\t\tthis.minimapCtx.lineTo(endX, endY);\n\t\tthis.minimapCtx.strokeStyle = '#555';\n\t\tthis.minimapCtx.lineWidth = 10;\n\t\tthis.minimapCtx.stroke();\n\t};\n\n\tprivate updateViewportRectangle = () => {\n\t\tif (this.collapsed) return;\n\t\tconst bounds = this.DM.data.nodeBounds;\n\t\tconst container = this.DM.data.container;\n\t\tconst scale = this.DM.data.scale;\n\t\tif (!bounds) return;\n\t\tconst viewWidth = container.clientWidth / scale;\n\t\tconst viewHeight = container.clientHeight / scale;\n\t\tconst viewportCenterX = -this.DM.data.offsetX / scale + container.clientWidth / (2 * scale);\n\t\tconst viewportCenterY = -this.DM.data.offsetY / scale + container.clientHeight / (2 * scale);\n\t\tconst viewRectX =\n\t\t\tthis.minimapCache.centerX +\n\t\t\t(viewportCenterX - viewWidth / 2 - bounds.centerX) * this.minimapCache.scale;\n\t\tconst viewRectY =\n\t\t\tthis.minimapCache.centerY +\n\t\t\t(viewportCenterY - viewHeight / 2 - bounds.centerY) * this.minimapCache.scale;\n\t\tconst viewRectWidth = viewWidth * this.minimapCache.scale;\n\t\tconst viewRectHeight = viewHeight * this.minimapCache.scale;\n\t\tthis.viewportRectangle.style.left = `${viewRectX}px`;\n\t\tthis.viewportRectangle.style.top = `${viewRectY}px`;\n\t\tthis.viewportRectangle.style.width = `${viewRectWidth}px`;\n\t\tthis.viewportRectangle.style.height = `${viewRectHeight}px`;\n\t};\n\n\tdispose = () => {\n\t\tthis.toggleMinimapBtn.removeEventListener('click', this.toggleCollapse);\n\t\tthis.minimapCtx.clearRect(0, 0, this.minimap.clientWidth, this.minimap.clientHeight);\n\t\tthis.minimapContainer.remove();\n\t\tthis._minimapContainer = null;\n\t\tthis._toggleMinimapBtn = null;\n\t\tthis._viewportRectangle = null;\n\t\tthis._minimap = null;\n\t};\n}\n","import { type BaseArgs, BaseModule } from '@/baseModule';\nimport DataManager from '@/dataManager';\nimport utilities, { destroyError } from '@/utilities';\nimport style from './styles.scss?inline';\n\ntype Options = {\n\tmistouchPreventer?: {\n\t\tpreventAtStart?: boolean;\n\t\tlabelText?: string;\n\t};\n};\n\nexport default class MistouchPreventer extends BaseModule<Options> {\n\tprivate _preventionContainer: HTMLDivElement | null = null;\n\tprivate preventMt: boolean = false;\n\tprivate DM: DataManager;\n\tprivate preventMistouch: {\n\t\trecord: boolean;\n\t\tlastX: number;\n\t\tlastY: number;\n\t\tinitialX: number;\n\t\tinitialY: number;\n\t} = {\n\t\trecord: false,\n\t\tlastX: 0,\n\t\tlastY: 0,\n\t\tinitialX: 0,\n\t\tinitialY: 0,\n\t};\n\n\tprivate get preventionContainer() {\n\t\tif (this._preventionContainer === null) throw destroyError;\n\t\treturn this._preventionContainer;\n\t}\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tconst options = Object.assign(\n\t\t\t{\n\t\t\t\tpreventAtStart: true,\n\t\t\t\tlabelText: 'Click on to unlock.',\n\t\t\t},\n\t\t\tthis.options.mistouchPreventer || {},\n\t\t);\n\n\t\tconst preventionBanner = document.createElement('div');\n\t\tpreventionBanner.className = 'prevention-banner';\n\t\tpreventionBanner.textContent = options.labelText;\n\t\tthis.DM = this.container.get(DataManager);\n\t\tthis._preventionContainer = document.createElement('div');\n\t\tthis._preventionContainer.className = 'prevention-container hidden';\n\n\t\tutilities.applyStyles(this._preventionContainer, style);\n\t\tthis._preventionContainer.appendChild(preventionBanner);\n\t\tthis.DM.data.container.appendChild(this._preventionContainer);\n\n\t\tif (options.preventAtStart) this.startPrevention();\n\n\t\twindow.addEventListener('pointerdown', this.onPointerDown);\n\t\twindow.addEventListener('pointermove', this.onPointerMove);\n\t\twindow.addEventListener('pointerup', this.onPointerUp);\n\t}\n\n\tprivate onPointerDown = (e: PointerEvent) => {\n\t\tconst bounds = this.DM.data.container.getBoundingClientRect();\n\t\tif (\n\t\t\te.clientX < bounds.left ||\n\t\t\te.clientX > bounds.right ||\n\t\t\te.clientY < bounds.top ||\n\t\t\te.clientY > bounds.bottom\n\t\t) {\n\t\t\tif (!this.preventMt) this.startPrevention();\n\t\t} else if (this.preventMt) {\n\t\t\tthis.preventMistouch.initialX = e.clientX;\n\t\t\tthis.preventMistouch.initialY = e.clientY;\n\t\t\tthis.preventMistouch.lastX = e.clientX;\n\t\t\tthis.preventMistouch.lastY = e.clientY;\n\t\t\tthis.preventMistouch.record = true;\n\t\t}\n\t};\n\n\tprivate onPointerMove = (e: PointerEvent) => {\n\t\tif (this.preventMistouch.record) {\n\t\t\tthis.preventMistouch.lastX = e.clientX;\n\t\t\tthis.preventMistouch.lastY = e.clientY;\n\t\t}\n\t};\n\n\tprivate onPointerUp = () => {\n\t\tif (this.preventMistouch.record) {\n\t\t\tthis.preventMistouch.record = false;\n\t\t\tif (\n\t\t\t\tMath.abs(this.preventMistouch.lastX - this.preventMistouch.initialX) +\n\t\t\t\t\tMath.abs(this.preventMistouch.lastY - this.preventMistouch.initialY) <\n\t\t\t\t5\n\t\t\t)\n\t\t\t\tthis.endPrevention();\n\t\t}\n\t};\n\n\tstartPrevention = () => {\n\t\tthis.preventionContainer.classList.remove('hidden');\n\t\tthis.DM.data.container.classList.add('numb');\n\t\tthis.preventMt = true;\n\t};\n\n\tendPrevention = () => {\n\t\tthis.preventMt = false;\n\t\tthis.preventionContainer.classList.add('hidden');\n\t\tsetTimeout(() => this.DM.data.container.classList.remove('numb'), 50); // minimum delay to prevent triggering undesired button touch\n\t};\n\n\tdispose = () => {\n\t\twindow.removeEventListener('pointerdown', this.onPointerDown);\n\t\twindow.removeEventListener('pointermove', this.onPointerMove);\n\t\twindow.removeEventListener('pointerup', this.onPointerUp);\n\t\tthis.preventionContainer.remove();\n\t\tthis._preventionContainer = null;\n\t};\n}\n","import { micromark } from 'micromark';\nimport utilities from '@/utilities';\n\ntype Parse = (markdown: string) => string;\n\nexport default async function (path: string, micromarkOptions?: Parameters<typeof micromark>[1]) {\n\tconst parse = (markdown: string) => micromark(markdown, micromarkOptions);\n\tconst render = (node: JSONCanvasNode) => renderer(node, parse);\n\tconst nodes = Object.assign(\n\t\t{\n\t\t\tnodes: [],\n\t\t\tedges: [],\n\t\t},\n\t\tawait fetch(path).then(res => res.json()),\n\t).nodes as Array<JSONCanvasNode>;\n\tconst basePath = utilities.resolvePath(path);\n\tnodes.forEach(node => {\n\t\tif (node.type === 'file' && !node.file.includes('http')) {\n\t\t\tconst file = node.file.split('/');\n\t\t\tnode.file = basePath + file.pop();\n\t\t}\n\t});\n\tlet result = '';\n\tnodes.forEach(node => {\n\t\tresult += render(node);\n\t});\n\treturn result;\n}\n\nfunction renderer(node: JSONCanvasNode, parse: Parse) {\n\tswitch (node.type) {\n\t\tcase 'text':\n\t\t\treturn parse(node.text);\n\t\tcase 'file':\n\t\t\treturn fileProcessor(node, parse);\n\t\tcase 'link':\n\t\t\treturn `<a href=\"${node.url}\" target=\"_blank\" rel=\"nofollow noreferrer\">${node.url}</a>`;\n\t\tdefault:\n\t\t\treturn '';\n\t}\n}\n\nfunction fileProcessor(node: JSONCanvasFileNode, parse: Parse) {\n\tif (node.file.match(/\\.md$/i)) return loadMarkdown(node.file, parse);\n\telse if (node.file.match(/\\.(png|jpg|jpeg|gif|svg|webp)$/i))\n\t\treturn `<img src=\"${node.file}\" alt=\"${node.file.split('/').pop()}\">`;\n\telse if (node.file.match(/\\.(mp3|wav)$/i)) return `<audio src=\"${node.file}\" controls></audio>`;\n}\n\nasync function loadMarkdown(path: string, parse: Parse) {\n\tlet parsedContent: string;\n\ttry {\n\t\tconst response = await fetch(path);\n\t\tconst result = await response.text();\n\t\tconst frontmatterMatch = result.match(/^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/);\n\t\tif (frontmatterMatch) parsedContent = parse(frontmatterMatch[2]);\n\t\telse parsedContent = parse(result);\n\t} catch {\n\t\tparsedContent = 'Failed to load content.';\n\t}\n\treturn parsedContent;\n}\n","export { type BaseArgs, BaseModule } from '@/baseModule';\nexport { default as JSONCanvasViewer } from '@/canvasViewer';\nexport { default as Controls } from '@/controls';\nexport { default as DebugPanel } from '@/debugPanel';\nexport type { UserOptions as Options } from '@/declarations';\nexport { default as Minimap } from '@/minimap';\nexport { default as MistouchPreventer } from '@/mistouchPreventer';\nexport { default as renderToString } from '@/renderToString';\nexport { default as canvasUtils } from '@/utilities';\n\nimport Controller from '@/controller';\nimport DataManager from '@/dataManager';\nimport InteractionHandler from '@/interactionHandler';\nimport OverlayManager from '@/overlayManager';\nimport Renderer from '@/renderer';\nexport const developerSuite = {\n\tController,\n\tDataManager,\n\tInteractionHandler,\n\tRenderer,\n\tOverlayManager,\n};\n"],"names":["BaseModule","constructor","container","options","this","Object","assign","dispose","utilities","round","roundedNum","digits","factor","Math","resizeCanvasForDPR","canvas","width","height","dpr","window","devicePixelRatio","ctx","getContext","Error","setTransform","scale","applyStyles","styleString","style","document","createElement","innerHTML","appendChild","drawRoundRect","x","y","radius","beginPath","moveTo","lineTo","quadraticCurveTo","closePath","getAnchorCoord","node","side","midX","midY","getColor","colorIndex","themeColor","length","rgb","hex","cleanHex","replace","r","parseInt","substring","g","b","hexToRgb","border","background","active","resolvePath","path","test","lastIndexOf","lastSlash","makeHook","result","args","subs","forEach","callback","Set","subscribe","add","unsubscribe","delete","destroyError","GRID_CELL_SIZE","DataManager","spatialGrid","hooks","onToggleFullscreen","onCanvasFetched","data","canvasData","nodeMap","canvasBaseDir","nodeBounds","offsetX","offsetY","loadCanvas","async","canvasPath","nodes","edges","fetch","then","res","json","type","file","includes","split","id","calculateNodeBounds","buildSpatialGrid","err","console","error","findNodeAt","screenCoords","C2W","C2C","candidates","key","floor","judgeInteract","match","minX","Infinity","minY","maxX","maxY","min","max","centerX","centerY","minCol","maxCol","minRow","maxRow","col","row","push","zoom","origin","newScale","zoomToScale","validNewScale","canvasCoords","pan","panToCoords","shiftFullscreen","option","fullscreenElement","exitFullscreen","requestFullscreen","resetView","bounds","contentWidth","INITIAL_VIEWPORT_PADDING","contentHeight","viewWidth","clientWidth","viewHeight","clientHeight","scaleX","scaleY","initialView","containerX","containerY","canvasX","canvasY","middleViewer","remove","Controller","animationId","resizeAnimationId","DM","resizeObserver","perFrame","lastScale","lastOffsets","lastResizeCenter","onResize","onRefresh","super","get","onFetched","parentContainer","firstElementChild","realContainer","noShadow","attachShadow","mode","HTMLContainer","classList","ResizeObserver","observe","requestAnimationFrame","draw","refresh","center","cancelAnimationFrame","disconnect","OverlayManager","_overlaysLayer","overlays","selectedId","eventListeners","IH","parse","overlaysLayer","onInteractionStart","onInteractionEnd","markdown","micromark","InteractionHandler","lazy","controller","updateOverlays","className","onClick","select","cbd","createOverlay","updateOverlay","text","loadMarkdownForNode","url","values","previous","current","parsedContent","response","frontmatterMatch","transform","content","element","getElementsByClassName","constructOverlay","left","top","color","overlay","backgroundColor","setProperty","parsedContentWrapper","iframe","src","sandbox","loading","audio","controls","img","clickLayer","overlayBorder","borderColor","onStart","onEnd","addEventListener","child","removeEventListener","pointeract","coordinateOutput","Pointeract","Click","Drag","WheelPanZoom","PreventDefault","MultitouchPanZoom","startInteraction","start","stopInteraction","stop","OM","on","onPan","onZoom","onTrueClick","event","detail","e","target","closest","off","FONT_COLOR","Renderer","_canvas","zoomInOptimize","lastDrawnScale","lastDrawnViewport","right","bottom","timeout","lastCallTime","redraw","optimizeDPR","offsetWidth","offsetHeight","clearTimeout","now","Date","currentViewport","getCurrentViewport","isViewportInside","setTimeout","trueRedraw","fakeRedraw","clearRect","save","translate","drawGroup","drawFileNode","edge","drawEdge","restore","cssScale","currentOffsetX","currentOffsetY","inner","outer","drawLabelBar","label","barHeight","yOffset","fontSize","xPadding","font","barWidth","measureText","fillStyle","fill","fillText","drawNodeBackground","colors","globalAlpha","strokeStyle","lineWidth","stroke","fromNode","toNode","getEdgeNodes","gac","startX","startY","fromSide","endX","endY","toSide","startControlX","startControlY","endControlX","endControlY","controlPoints","getControlPoints","drawCurvedPath","drawArrowhead","t","padding","labelWidth","labelHeight","textAlign","textBaseline","distanceX","distanceY","realDistance","abs","PADDING","val","c1x","c1y","c2x","c2y","bezierCurveTo","tipX","tipY","fromX","fromY","dx","dy","sqrt","unitX","unitY","leftX","leftY","rightX","rightY","JSONCanvasViewer","allModules","IO","modules","Container","Class","bind","provide","useFactory","lazyLoad","IntersectionObserver","onVisibilityCheck","root","rootMargin","threshold","load","Module","entries","entry","isIntersecting","firstChild","reverse","module","unbindAll","enterFullscreenIcon","Controls","_controlsPanel","_toggleCollapseBtn","_toggleFullscreenBtn","_zoomOutBtn","_zoomSlider","_zoomInBtn","_resetViewBtn","collapsed","controlsPanel","toggleCollapseBtn","toggleFullscreenBtn","zoomOutBtn","zoomSlider","zoomInBtn","resetViewBtn","controlsCollapsed","updateFullscreenBtn","updateSlider","toggle","controlsContent","value","toggleCollapse","zoomIn","zoomOut","slide","toggleFullscreen","Number","enter","String","scaleToSlider","log","DebugPanel","_debugPanel","debugPanel","update","Minimap","_minimapCtx","_viewportRectangle","_minimap","_minimapContainer","_toggleMinimapBtn","minimapCache","minimap","minimapCtx","viewportRectangle","minimapContainer","toggleMinimapBtn","minimapCollapsed","updateViewportRectangle","drawMinimap","minimapCanvas","displayWidth","displayHeight","drawMinimapEdge","drawMinimapNode","viewportCenterX","viewportCenterY","viewRectX","viewRectY","viewRectWidth","viewRectHeight","MistouchPreventer","_preventionContainer","preventMt","preventMistouch","record","lastX","lastY","initialX","initialY","preventionContainer","preventAtStart","labelText","mistouchPreventer","preventionBanner","textContent","startPrevention","onPointerDown","onPointerMove","onPointerUp","getBoundingClientRect","clientX","clientY","endPrevention","renderToString","micromarkOptions","render","loadMarkdown","pop","fileProcessor","renderer","basePath","developerSuite"],"mappings":"4MAQO,MAAMA,EACZ,WAAAC,CACWC,EACVC,GADUC,KAAAF,UAAAA,EAGVG,OAAOC,OAAOF,KAAKD,QAASA,EAC7B,CAEAA,QAAU,CAAA,EAEVI,QChBD,MAAAC,EAAe,CACdC,MAkHD,SAAeC,EAAoBC,GAClC,MAAMC,EAAS,IAAMD,EACrB,OAAOE,KAAKJ,MAAMC,EAAaE,GAAUA,CAC1C,EApHCE,mBAoGD,SAA4BC,EAA2BC,EAAeC,GACrE,MAAMC,EAAMC,OAAOC,kBAAoB,EACjCC,EAAMN,EAAOO,WAAW,MAC9B,IAAKD,EACJ,MAAM,IAAIE,MACT,uJAEFR,EAAOC,MAAQH,KAAKJ,MAAMO,EAAQE,GAClCH,EAAOE,OAASJ,KAAKJ,MAAMQ,EAASC,GACpCG,EAAIG,aAAa,EAAG,EAAG,EAAG,EAAG,EAAG,GAChCH,EAAII,MAAMP,EAAKA,EAChB,EA9GCQ,YAUD,SAAqBxB,EAAqCyB,GACzD,MAAMC,EAAQC,SAASC,cAAc,SACrCF,EAAMG,UAAYJ,EAClBzB,EAAU8B,YAAYJ,EACvB,EAbCK,cAeD,SACCZ,EACAa,EACAC,EACAnB,EACAC,EACAmB,GAEAf,EAAIgB,YACJhB,EAAIiB,OAAOJ,EAAIE,EAAQD,GACvBd,EAAIkB,OAAOL,EAAIlB,EAAQoB,EAAQD,GAC/Bd,EAAImB,iBAAiBN,EAAIlB,EAAOmB,EAAGD,EAAIlB,EAAOmB,EAAIC,GAClDf,EAAIkB,OAAOL,EAAIlB,EAAOmB,EAAIlB,EAASmB,GACnCf,EAAImB,iBAAiBN,EAAIlB,EAAOmB,EAAIlB,EAAQiB,EAAIlB,EAAQoB,EAAQD,EAAIlB,GACpEI,EAAIkB,OAAOL,EAAIE,EAAQD,EAAIlB,GAC3BI,EAAImB,iBAAiBN,EAAGC,EAAIlB,EAAQiB,EAAGC,EAAIlB,EAASmB,GACpDf,EAAIkB,OAAOL,EAAGC,EAAIC,GAClBf,EAAImB,iBAAiBN,EAAGC,EAAGD,EAAIE,EAAQD,GACvCd,EAAIoB,WACL,EAjCCC,eAmCD,SAAwBC,EAAsBC,GAC7C,MAAMC,EAAOF,EAAKT,EAAIS,EAAK3B,MAAQ,EAC7B8B,EAAOH,EAAKR,EAAIQ,EAAK1B,OAAS,EACpC,OAAQ2B,GACP,IAAK,MACJ,MAAO,CAACC,EAAMF,EAAKR,GACpB,IAAK,SACJ,MAAO,CAACU,EAAMF,EAAKR,EAAIQ,EAAK1B,QAC7B,IAAK,OACJ,MAAO,CAAC0B,EAAKT,EAAGY,GACjB,IAAK,QACJ,MAAO,CAACH,EAAKT,EAAIS,EAAK3B,MAAO8B,GAC9B,QACC,MAAO,CAACD,EAAMC,GAEjB,EAjDCC,SAmDD,SAAkBC,EAAqB,KACtC,IAAIC,EAAa,KAUjB,GAA0B,IAAtBD,EAAWE,OACd,OAAQF,GACP,IAAK,IACJC,EAAa,yBACb,MACD,IAAK,IACJA,EAAa,yBACb,MACD,IAAK,IACJA,EAAa,yBACb,MACD,IAAK,IACJA,EAAa,yBACb,MACD,IAAK,IACJA,EAAa,yBACb,MACD,IAAK,IACJA,EAAa,yBACb,MACD,QACCA,EAAa,6BAET,CACN,MAAME,EAhCP,SAAkBC,GACjB,MAAMC,EAAWD,EAAIE,QAAQ,IAAK,IAIlC,MAAO,CAAEC,EAHCC,SAASH,EAASI,UAAU,EAAG,GAAI,IAGjCC,EAFFF,SAASH,EAASI,UAAU,EAAG,GAAI,IAE9BE,EADLH,SAASH,EAASI,UAAU,EAAG,GAAI,IAE9C,CA0BaG,CAASZ,GACrBC,EAAa,QAAQE,EAAII,MAAMJ,EAAIO,MAAMP,EAAIQ,OAC9C,CACA,MAAO,CACNE,OAAQZ,EAAWK,QAAQ,IAAK,QAChCQ,WAAYb,EAAWK,QAAQ,IAAK,OACpCS,OAAQd,EAAWK,QAAQ,IAAK,KAElC,EA7FCU,YAiHD,SAAqBC,GACpB,GAAI,eAAeC,KAAKD,GAAO,OAAOA,EAAKR,UAAU,EAAGQ,EAAKE,YAAY,KAAO,GAC3E,CACJ,MAAMC,EAAYH,EAAKE,YAAY,KACnC,OAAqB,IAAdC,EAAmBH,EAAKR,UAAU,EAAGW,EAAY,GAAK,IAC9D,CACD,EAtHCC,SAwHD,WAQC,MAAMC,EAAe,IAAIC,KACxBD,EAAOE,KAAKC,QAAQC,IACnBA,KAAYH,MAUd,OAPAD,EAAOE,wBAAWG,IAClBL,EAAOM,UAAaF,IACnBJ,EAAOE,KAAKK,IAAIH,IAEjBJ,EAAOQ,YAAeJ,IACrBJ,EAAOE,KAAKO,OAAOL,IAEbJ,CACR,GA1IaU,EAAe,IAAIzD,MAAM,wECTtC,MAAM0D,EAAiB,IAGvB,MAAqBC,UAAoBlF,EAChCmF,YAA4D,KACpEC,MAAQ,CACPC,mBAAoB7E,EAAU6D,WAC9BiB,gBAAiB9E,EAAU6D,YAE5BkB,KAAO,CACNC,gBAAY,EACZC,QAAS,CAAA,EACTC,mBAAe,EACfC,gBAAY,EACZC,QAAS,EACTC,QAAS,EACTpE,MAAO,EACPvB,UAAW2B,SAASC,cAAc,QAGnCgE,WAAaC,UACZ,MAAM9B,EAAO7D,KAAKD,QAAQ6F,WAC1B,IACC5F,KAAKmF,KAAKG,cAAgBlF,EAAUwD,YAAYC,GAChD7D,KAAKmF,KAAKC,WAAanF,OAAOC,OAC7B,CACC2F,MAAO,GACPC,MAAO,UAEFC,MAAMlC,GAAMmC,KAAKC,GAAOA,EAAIC,SAEnClG,KAAKmF,KAAKC,WAAWS,MAAMxB,QAAQ9B,IAClC,GAAkB,SAAdA,EAAK4D,OAAoB5D,EAAK6D,KAAKC,SAAS,QAAS,CACxD,MAAMD,EAAO7D,EAAK6D,KAAKE,MAAM,KAC7B/D,EAAK6D,KAAOA,EAAKA,EAAKtD,OAAS,EAChC,CACA9C,KAAKmF,KAAKE,QAAQ9C,EAAKgE,IAAMhE,IAE9BvC,KAAKmF,KAAKI,WAAavF,KAAKwG,sBAC5BxG,KAAKyG,mBACLzG,KAAKgF,MAAME,iBACZ,OAASwB,GACRC,QAAQC,MAAM,8BAA+BF,EAC9C,GAGDG,WAAcC,IACb,MAAMhF,EAAEA,EAAAC,EAAGA,GAAM/B,KAAK+G,IAAI/G,KAAKgH,IAAI,CAAElF,EAAGgF,EAAahF,EAAGC,EAAG+E,EAAa/E,KACxE,IAAIkF,EAAoC,GACxC,GAAKjH,KAAK+E,YACL,CACJ,MAEMmC,EAAM,GAFAzG,KAAK0G,MAAMrF,EAAI+C,MACfpE,KAAK0G,MAAMpF,EAAI8C,KAE3BoC,EAAajH,KAAK+E,YAAYmC,IAAQ,EACvC,MANuBD,EAAajH,KAAKmF,KAAKC,WAAWS,MAOzD,IAAA,MAAWtD,KAAQ0E,EAClB,KACCnF,EAAIS,EAAKT,GACTA,EAAIS,EAAKT,EAAIS,EAAK3B,OAClBmB,EAAIQ,EAAKR,GACTA,EAAIQ,EAAKR,EAAIQ,EAAK1B,QACW,oBAA7Bb,KAAKoH,cAAc7E,IAGpB,OAAOA,EAER,OAAO,MAIA6E,cAAiB7E,IACxB,OAAQA,GAAM4D,MACb,IAAK,OACL,IAAK,OACJ,MAAO,SACR,IAAK,OACJ,OAAI5D,EAAK6D,KAAKiB,MAAM,oBAA4B,SACpC,kBAEb,QACC,MAAO,oBAIF,mBAAAb,GACP,IAAIc,EAAOC,IACVC,EAAOD,IACPE,OACAC,GAAOH,IACRvH,KAAKmF,KAAKC,WAAWS,MAAMxB,QAAQ9B,IAClC+E,EAAO7G,KAAKkH,IAAIL,EAAM/E,EAAKT,GAC3B0F,EAAO/G,KAAKkH,IAAIH,EAAMjF,EAAKR,GAC3B0F,EAAOhH,KAAKmH,IAAIH,EAAMlF,EAAKT,EAAIS,EAAK3B,OACpC8G,EAAOjH,KAAKmH,IAAIF,EAAMnF,EAAKR,EAAIQ,EAAK1B,UAErC,MAAMD,EAAQ6G,EAAOH,EACfzG,EAAS6G,EAAOF,EAGtB,MAAO,CAAEF,OAAME,OAAMC,OAAMC,OAAM9G,QAAOC,SAAQgH,QAFhCP,EAAO1G,EAAQ,EAE0BkH,QADzCN,EAAO3G,EAAS,EAEjC,CAEQ,gBAAA4F,GACP,MAAMrB,EAAapF,KAAKmF,KAAKC,WAC7B,KAAIA,EAAWS,MAAM/C,OAAS,IAA9B,CACA9C,KAAK+E,YAAc,CAAA,EACnB,IAAA,MAAWxC,KAAQ6C,EAAWS,MAAO,CACpC,MAAMkC,EAAStH,KAAK0G,MAAM5E,EAAKT,EAAI+C,GAC7BmD,EAASvH,KAAK0G,OAAO5E,EAAKT,EAAIS,EAAK3B,OAASiE,GAC5CoD,EAASxH,KAAK0G,MAAM5E,EAAKR,EAAI8C,GAC7BqD,EAASzH,KAAK0G,OAAO5E,EAAKR,EAAIQ,EAAK1B,QAAUgE,GACnD,IAAA,IAASsD,EAAMJ,EAAQI,GAAOH,EAAQG,IACrC,IAAA,IAASC,EAAMH,EAAQG,GAAOF,EAAQE,IAAO,CAC5C,MAAMlB,EAAM,GAAGiB,KAAOC,IACjBpI,KAAK+E,YAAYmC,KAAMlH,KAAK+E,YAAYmC,GAAO,IACpDlH,KAAK+E,YAAYmC,GAAKmB,KAAK9F,EAC5B,CAEF,CAdkC,CAenC,CAEA+F,KAAO,CAAC9H,EAAgB+H,KACvB,MAAMC,EAAWxI,KAAKmF,KAAK9D,MAAQb,EACnCR,KAAKyI,YAAYD,EAAUD,IAE5BE,YAAc,CAACD,EAAkBD,KAChC,MAAMG,EAAgBjI,KAAKmH,IAAInH,KAAKkH,IAAIa,EAAU,IAAK,KACjDnH,EAAQrB,KAAKmF,KAAK9D,MACxB,GAAIqH,IAAkBrH,EAAO,OAC7B,MAAMsH,EAAe3I,KAAKgH,IAAIuB,GAC9BvI,KAAKmF,KAAKK,QAAU+C,EAAOzG,EAAK6G,EAAa7G,EAAI4G,EAAiBrH,EAClErB,KAAKmF,KAAKM,QAAU8C,EAAOxG,EAAK4G,EAAa5G,EAAI2G,EAAiBrH,EAClErB,KAAKmF,KAAK9D,MAAQqH,GAEnBE,IAAM,EAAG9G,IAAGC,QACX/B,KAAKmF,KAAKK,QAAUxF,KAAKmF,KAAKK,QAAU1D,EACxC9B,KAAKmF,KAAKM,QAAUzF,KAAKmF,KAAKM,QAAU1D,GAEzC8G,YAAc,EAAG/G,IAAGC,QACnB/B,KAAKmF,KAAKK,QAAU1D,EACpB9B,KAAKmF,KAAKM,QAAU1D,GAErB+G,gBAAkB,CAACC,EAAiB,YAC9BtH,SAASuH,mBAAiC,WAAXD,GAAkC,UAAXA,GAGhDtH,SAASuH,mBAAiC,WAAXD,GAAkC,SAAXA,IAChEtH,SAASwH,iBACTjJ,KAAKgF,MAAMC,oBAAmB,KAJ9BjF,KAAKmF,KAAKrF,UAAUoJ,oBACpBlJ,KAAKgF,MAAMC,oBAAmB,KAMhCkE,UAAY,KACX,MAAMC,EAASpJ,KAAKmF,KAAKI,WACnBzF,EAAYE,KAAKmF,KAAKrF,UAC5B,IAAKsJ,IAAWtJ,EAAW,OAC3B,MAAMuJ,EAAeD,EAAOxI,MAAQ0I,IAC9BC,EAAgBH,EAAOvI,OAASyI,IAEhCE,EAAY1J,EAAU2J,YACtBC,EAAa5J,EAAU6J,aACvBC,EAASJ,EAAYH,EACrBQ,EAASH,EAAaH,EACtBf,EAAW/H,KAAKJ,MAAiC,IAA3BI,KAAKkH,IAAIiC,EAAQC,IAAkB,IAGzDC,EAAc,CACnBzI,MAAOmH,EACPhD,QAASgE,EAAY,EAJCJ,EAAOvB,QAIaW,EAC1C/C,QAASiE,EAAa,EAJAN,EAAOtB,QAIcU,GAE5CxI,KAAKmF,KAAKK,QAAUsE,EAAYtE,QAChCxF,KAAKmF,KAAKM,QAAUqE,EAAYrE,QAChCzF,KAAKmF,KAAK9D,MAAQyI,EAAYzI,OAIvB2F,IAAM,EAAGlF,EAAGiI,EAAYhI,EAAGiI,OAClClI,EAAGiI,EAAa/J,KAAKmF,KAAKK,QAC1BzD,EAAGiI,EAAahK,KAAKmF,KAAKM,UAGnBsB,IAAM,EAAGjF,EAAGmI,EAASlI,EAAGmI,OAC/BpI,EAAGmI,EAAUjK,KAAKmF,KAAK9D,MACvBU,EAAGmI,EAAUlK,KAAKmF,KAAK9D,QAGxB8I,aAAe,KACd,MAAMrK,EAAYE,KAAKmF,KAAKrF,UAC5B,MAAO,CACNgC,EAAGhC,EAAU2J,YAAc,EAC3B1H,EAAGjC,EAAU6J,aAAe,EAC5B/I,MAAOd,EAAU2J,YACjB5I,OAAQf,EAAU6J,eAIpBxJ,QAAU,IAAMH,KAAKmF,KAAKrF,UAAUsK,SChMrC,MAAqBC,UAAmBzK,EAC/B0K,YAA6B,KAC7BC,kBAAmC,KACnCC,GACAC,eACAC,SAAW,CAClBC,UAAW,EACXC,YAAa,CAAE9I,EAAG,EAAGC,EAAG,IAEjB8I,iBAGJ,CACH/I,EAAG,KACHC,EAAG,MAGJiD,MAAQ,CACP8F,SAAU1K,EAAU6D,WACpB8G,UAAW3K,EAAU6D,YAGtB,WAAApE,IAAesE,GACd6G,SAAS7G,GACTnE,KAAKwK,GAAKxK,KAAKF,UAAUmL,IAAInG,GAC7B9E,KAAKwK,GAAGxF,MAAME,gBAAgBV,UAAUxE,KAAKkL,WAE7C,MAAMC,EAAkBnL,KAAKD,QAAQD,UACrC,KAAOqL,EAAgBC,mBAAmBD,EAAgBC,kBAAkBhB,SAC5Ee,EAAgBxJ,UAAY,GAE5B,MACM0J,EADWrL,KAAKD,QAAQuL,WAAY,EACTH,EAAkBA,EAAgBI,aAAa,CAAEC,KAAM,SAExFpL,EAAUkB,YAAY+J,yzGAEtB,MAAMI,EAAgBzL,KAAKwK,GAAGrF,KAAKrF,UACnC2L,EAAcC,UAAUjH,IAAI,aAC5B4G,EAAczJ,YAAY6J,GAC1BzL,KAAKyK,eAAiB,IAAIkB,eAAe3L,KAAK8K,SAC/C,CAEQI,UAAY,KACnBlL,KAAKwK,GAAGrB,YACRnJ,KAAKyK,eAAemB,QAAQ5L,KAAKwK,GAAGrF,KAAKrF,WACzCE,KAAKsK,YAAcuB,sBAAsB7L,KAAK8L,OAGvCA,KAAO,KAEb9L,KAAK0K,SAASC,YAAc3K,KAAKwK,GAAGrF,KAAK9D,OACzCrB,KAAK0K,SAASE,YAAY9I,IAAM9B,KAAKwK,GAAGrF,KAAKK,SAC7CxF,KAAK0K,SAASE,YAAY7I,IAAM/B,KAAKwK,GAAGrF,KAAKM,SAE7CzF,KAAK+L,UACN/L,KAAKsK,YAAcuB,sBAAsB7L,KAAK8L,OAGvCC,QAAU,KACjB/L,KAAK0K,SAASC,UAAY3K,KAAKwK,GAAGrF,KAAK9D,MACvCrB,KAAK0K,SAASE,YAAc,CAC3B9I,EAAG9B,KAAKwK,GAAGrF,KAAKK,QAChBzD,EAAG/B,KAAKwK,GAAGrF,KAAKM,SAEjBzF,KAAKgF,MAAM+F,aAGJD,SAAW,KAClB9K,KAAKuK,kBAAoBsB,sBAAsB,KAC9C,MAAMG,EAAShM,KAAKwK,GAAGL,eACnBnK,KAAK6K,iBAAiB/I,GAAK9B,KAAK6K,iBAAiB9I,IACpD/B,KAAKwK,GAAGrF,KAAKK,QAAUxF,KAAKwK,GAAGrF,KAAKK,QAAUwG,EAAOlK,EAAI9B,KAAK6K,iBAAiB/I,EAC/E9B,KAAKwK,GAAGrF,KAAKM,QAAUzF,KAAKwK,GAAGrF,KAAKM,QAAUuG,EAAOjK,EAAI/B,KAAK6K,iBAAiB9I,GAEhF/B,KAAK6K,iBAAiB/I,EAAIkK,EAAOlK,EACjC9B,KAAK6K,iBAAiB9I,EAAIiK,EAAOjK,EACjC/B,KAAKgF,MAAM8F,SAASkB,EAAOpL,MAAOoL,EAAOnL,QACzCb,KAAK+L,aAIP5L,QAAU,KACLH,KAAKsK,aAAa2B,qBAAqBjM,KAAKsK,aAC5CtK,KAAKuK,mBAAmB0B,qBAAqBjM,KAAKuK,mBACtDvK,KAAKyK,eAAeyB,cClFtB,MAAqBC,UAAuBvM,EACnCwM,eAAwC3K,SAASC,cAAc,OAC/D2K,SAA2C,CAAA,EAC3CC,WAA4B,KAC5BC,eAA8D,CAAA,EAC9D/B,GACAgC,GACAC,MAER,iBAAYC,GACX,IAAK1M,KAAKoM,eAAgB,MAAMxH,EAChC,OAAO5E,KAAKoM,cACb,CAEApH,MAAQ,CACP2H,mBAAoBvM,EAAU6D,WAC9B2I,iBAAkBxM,EAAU6D,YAG7B,WAAApE,IAAesE,GACd6G,SAAS7G,GACTnE,KAAKyM,MAASI,GAAqBC,EAAUD,EAAU7M,KAAKD,QAAQ+M,WACpE9M,KAAKwK,GAAKxK,KAAKF,UAAUmL,IAAInG,GAC7B9E,KAAKwM,GAAKxM,KAAKF,UAAUmL,IAAI8B,EAAoB,CAAEC,MAAM,IACzD,MAAMC,EAAajN,KAAKF,UAAUmL,IAAIZ,GACtCrK,KAAKwK,GAAGxF,MAAME,gBAAgBV,UAAUxE,KAAKkL,WAC7C+B,EAAWjI,MAAM+F,UAAUvG,UAAUxE,KAAKkN,gBAE1ClN,KAAKoM,eAAiB3K,SAASC,cAAc,OAC7C1B,KAAKoM,eAAee,UAAY,WAChCnN,KAAKwK,GAAGrF,KAAKrF,UAAU8B,YAAY5B,KAAK0M,cACzC,CAEQxB,UAAY,KACnBlL,KAAKwM,KAAKY,QAAQ5I,UAAUxE,KAAKqN,QACjC,MAAMC,EAAMtN,KAAKwK,GAAGrF,KAAKG,cACnBiI,EAAgB5H,MAAOpD,IAC5B,OAAQA,EAAK4D,MACZ,IAAK,OACJnG,KAAKwN,cAAcjL,EAAMA,EAAKkL,KAAM,QACpC,MAED,IAAK,OACAlL,EAAK6D,KAAKiB,MAAM,UAAWrH,KAAK0N,oBAAoBnL,GAC/CA,EAAK6D,KAAKiB,MAAM,mCACxBrH,KAAKwN,cAAcjL,EAAM+K,EAAM/K,EAAK6D,KAAM,SAClC7D,EAAK6D,KAAKiB,MAAM,kBACxBrH,KAAKwN,cAAcjL,EAAM+K,EAAM/K,EAAK6D,KAAM,SAC3C,MAED,IAAK,OACJpG,KAAKwN,cAAcjL,EAAMA,EAAKoL,IAAK,UAKtC1N,OAAO2N,OAAO5N,KAAKwK,GAAGrF,KAAKE,SAAShB,QAAQ9B,IAC3CgL,EAAchL,MAIR8K,OAAU9G,IACjB,MAAMsH,EAAY7N,KAAKsM,WAAoBtM,KAAKqM,SAASrM,KAAKsM,YAA1B,KAC9BwB,EAAWvH,EAAYvG,KAAKqM,SAAS9F,GAArB,KAClBsH,GAAUA,EAASnC,UAAUtB,OAAO,UACpC0D,GACHA,EAAQpC,UAAUjH,IAAI,UACtBzE,KAAKgF,MAAM2H,sBACL3M,KAAKgF,MAAM4H,mBAClB5M,KAAKsM,WAAa/F,GAGXmH,oBAAsB/H,MAAOpD,IAEpC,IAAIwL,EADJ/N,KAAKwN,cAAcjL,EAAM,aAAc,QAEvC,IACC,MAAMyL,QAAiBjI,MAAM/F,KAAKwK,GAAGrF,KAAKG,cAAgB/C,EAAK6D,MACzDlC,QAAe8J,EAASP,OACxBQ,EAAmB/J,EAAOmD,MAAM,qCAChB0G,EAAlBE,EAAkCjO,KAAKyM,MAAMwB,EAAiB,IAC7CjO,KAAKyM,MAAMvI,EACjC,OAASwC,GACRC,QAAQC,MAAM,8CAA+CF,GAC7DqH,EAAgB,yBACjB,CACA/N,KAAKwN,cAAcjL,EAAMwL,EAAe,SAGjCb,eAAiB,KACxB,MAAM/H,EAAOnF,KAAKwK,GAAGrF,KACrBnF,KAAK0M,cAAclL,MAAM0M,UAAY,aAAa/I,EAAKK,cAAcL,EAAKM,oBAAoBN,EAAK9D,UAG5F,aAAAmM,CAAcjL,EAAsB4L,EAAiBhI,GAC5D,IAAIiI,EAAUpO,KAAKqM,SAAS9J,EAAKgE,IACjC,GAAK6H,GAQL,GAAoB,SAATjI,EAAiB,CACIiI,EAAQC,uBAAuB,0BAA0B,GACjE1M,UAAYwM,CACpC,OAVCC,EAAUpO,KAAKsO,iBAAiB/L,EAAM4L,EAAShI,GAC/CnG,KAAK0M,cAAc9K,YAAYwM,GAC/BpO,KAAKqM,SAAS9J,EAAKgE,IAAM6H,EACzBA,EAAQ5M,MAAM+M,KAAO,GAAGhM,EAAKT,MAC7BsM,EAAQ5M,MAAMgN,IAAM,GAAGjM,EAAKR,MAC5BqM,EAAQ5M,MAAMZ,MAAQ,GAAG2B,EAAK3B,UAC9BwN,EAAQ5M,MAAMX,OAAS,GAAG0B,EAAK1B,UAKjC,CAEQ,gBAAAyN,CAAiB/L,EAAsB4L,EAAiBhI,GAC/D,MAAMsI,EAAQrO,EAAUuC,SAASJ,EAAKkM,OAChCC,EAAUjN,SAASC,cAAc,OAKvC,OAJAgN,EAAQhD,UAAUjH,IAAI,qBACtBiK,EAAQnI,GAAKhE,EAAKgE,GAClBmI,EAAQlN,MAAMmN,gBAAkBF,EAAM/K,WACtCgL,EAAQlN,MAAMoN,YAAY,iBAAkBH,EAAM9K,QAC1CwC,GACP,IAAK,OAAQ,CACZuI,EAAQhD,UAAUjH,IAAI,oBACtB,MAAMoK,EAAuBpN,SAASC,cAAc,OACpDmN,EAAqBlN,UAAY3B,KAAKyM,MAAM0B,GAAW,IACvDU,EAAqBnD,UAAUjH,IAAI,0BACnCiK,EAAQ9M,YAAYiN,GACpB,KACD,CACA,IAAK,OAAQ,CACZ,MAAMC,EAASrN,SAASC,cAAc,UACtCoN,EAAOC,IAAMZ,EACbW,EAAOE,QAAU,kCACjBF,EAAO3B,UAAY,cACnB2B,EAAOG,QAAU,OACjBP,EAAQ9M,YAAYkN,GACpB,KACD,CACA,IAAK,QAAS,CACb,MAAMI,EAAQzN,SAASC,cAAc,SACrCwN,EAAM/B,UAAY,QAClB+B,EAAMH,IAAMZ,EACZe,EAAMC,UAAW,EACjBT,EAAQ9M,YAAYsN,GACpB,KACD,CACA,IAAK,QAAS,CACb,MAAME,EAAM3N,SAASC,cAAc,OACnC0N,EAAIL,IAAMZ,EACViB,EAAIH,QAAU,OACdP,EAAQ9M,YAAYwN,EACrB,EAED,OAAQjJ,GACP,IAAK,OACL,IAAK,QAAS,CACb,MAAMkJ,EAAa5N,SAASC,cAAc,OAC1C2N,EAAWlC,UAAY,cACvBuB,EAAQ9M,YAAYyN,EACrB,EAED,MAAMC,EAAgB7N,SAASC,cAAc,OAC7C4N,EAAcnC,UAAY,iBAC1BmC,EAAc9N,MAAM+N,YAAcd,EAAMhL,OACxCiL,EAAQ9M,YAAY0N,GACpB,MAAME,EAAU,KACXjN,EAAKgE,KAAOvG,KAAKsM,YAAYtM,KAAKgF,MAAM2H,sBAEvC8C,EAAQ,KACTlN,EAAKgE,KAAOvG,KAAKsM,YAAYtM,KAAKgF,MAAM4H,oBAO7C,OALA8B,EAAQgB,iBAAiB,eAAgBF,GACzCd,EAAQgB,iBAAiB,eAAgBD,GACzCf,EAAQgB,iBAAiB,aAAcF,GACvCd,EAAQgB,iBAAiB,WAAYD,GACrCzP,KAAKuM,eAAehK,EAAKgE,IAAM,CAACiJ,EAASC,GAClCf,CACR,CAEAvO,QAAU,KACT,KAAOH,KAAK0M,cAActB,mBAAmB,CAC5C,MAAMuE,EAAQ3P,KAAK0M,cAActB,kBACjC,GAAIpL,KAAKuM,eAAeoD,EAAMpJ,IAAK,CAClC,MAAMiJ,EAAUxP,KAAKuM,eAAeoD,EAAMpJ,IAAI,GACxCkJ,EAAQzP,KAAKuM,eAAeoD,EAAMpJ,IAAI,GAC5C,IAAKiJ,IAAYC,EAAO,MAAM7K,EAC9B+K,EAAMC,oBAAoB,eAAgBJ,GAC1CG,EAAMC,oBAAoB,eAAgBH,GAC1CE,EAAMC,oBAAoB,aAAcJ,GACxCG,EAAMC,oBAAoB,WAAYH,GACtCzP,KAAKuM,eAAeoD,EAAMpJ,IAAI,GAAK,KACnCvG,KAAKuM,eAAeoD,EAAMpJ,IAAI,GAAK,IACpC,CACAoJ,EAAMvF,QACP,CACApK,KAAK0M,cAActC,SACnBpK,KAAKoM,eAAiB,MCvLxB,MAAqBW,UAA2BnN,EACvCiQ,WACArF,GACR4C,QAAUhN,EAAU6D,WAEpB,WAAApE,IAAesE,GACd6G,SAAS7G,GACTnE,KAAKwK,GAAKxK,KAAKF,UAAUmL,IAAInG,GAC7B,MAAM/E,EAAUE,OAAOC,OAAOF,KAAKD,QAAQ8P,YAAc,GAAI,CAC5DC,iBAAkB,aAEnB9P,KAAK6P,WAAa,IAAIE,EACrB/P,KAAKwK,GAAGrF,KAAKrF,UACb,CAACkQ,EAAOC,EAAMC,EAAcC,EAAgBC,GAC5CrQ,GAEDC,KAAKqQ,iBAAmBrQ,KAAK6P,WAAWS,MACxCtQ,KAAKuQ,gBAAkBvQ,KAAK6P,WAAWW,KACvC,MAAMC,EAAKzQ,KAAKF,UAAUmL,IAAIkB,GAC9BsE,EAAGzL,MAAM2H,mBAAmBnI,UAAUxE,KAAKuQ,iBAC3CE,EAAGzL,MAAM4H,iBAAiBpI,UAAUxE,KAAKqQ,kBACzCrQ,KAAKwK,GAAGxF,MAAME,gBAAgBV,UAAUxE,KAAKkL,UAC9C,CACAqF,gBACAF,iBAEQnF,UAAY,KACnBlL,KAAK6P,WAAWa,GAAG,MAAO1Q,KAAK2Q,OAC/B3Q,KAAK6P,WAAWa,GAAG,OAAQ1Q,KAAK2Q,OAChC3Q,KAAK6P,WAAWa,GAAG,OAAQ1Q,KAAK4Q,QAChC5Q,KAAK6P,WAAWa,GAAG,YAAa1Q,KAAK6Q,aACrC7Q,KAAK6P,WAAWS,SAGTK,MAASG,IAChB9Q,KAAKwK,GAAG5B,IAAIkI,EAAMC,SAEXH,OAAUE,IACjB,MAAMC,EAASD,EAAMC,OACrB/Q,KAAKwK,GAAGlC,KAAKyI,EAAOvQ,OAAQ,CAAEsB,EAAGiP,EAAOjP,EAAGC,EAAGgP,EAAOhP,KAG9C8O,YAAeG,IACtB,MAAMD,EAASC,EAAED,OAKjB,IAJqBE,EAILD,EAAED,OAAOE,UAFjBA,EAAOC,QAAQ,cAAgBD,EAAOC,QAAQ,WAAaD,EAAOC,QAAQ,UAE1B,OAJxD,IAAqBD,EAKrB,MAAM1O,EAAOvC,KAAKwK,GAAG3D,WAAW,CAAE/E,EAAGiP,EAAOjP,EAAGC,EAAGgP,EAAOhP,IACzD/B,KAAKoN,QAAQ7K,EAAOA,EAAKgE,GAAK,OAG/BpG,QAAU,KACTH,KAAK6P,WAAWsB,IAAI,MAAOnR,KAAK2Q,OAChC3Q,KAAK6P,WAAWsB,IAAI,OAAQnR,KAAK4Q,QACjC5Q,KAAK6P,WAAWsB,IAAI,YAAanR,KAAK6Q,aACtC7Q,KAAK6P,WAAW1P,WC7DlB,MAGMiR,EAAa,OAGnB,MAAqBC,UAAiBzR,EAC7B0R,QACArQ,IACAuJ,GACA+G,eAKJ,CACHC,eAAgB,EAChBC,kBAAmB,CAClBlD,KAAM,EACNmD,MAAO,EACPlD,IAAK,EACLmD,OAAQ,GAETC,QAAS,KACTC,aAAc,GAGf,UAAYlR,GACX,GAAqB,OAAjBX,KAAKsR,QAAkB,MAAM1M,EACjC,OAAO5E,KAAKsR,OACb,CAEA,WAAAzR,IAAesE,GACd6G,SAAS7G,GACT,MAAM8I,EAAajN,KAAKF,UAAUmL,IAAIZ,GACtC4C,EAAWjI,MAAM+F,UAAUvG,UAAUxE,KAAK8R,QAC1C7E,EAAWjI,MAAM8F,SAAStG,UAAUxE,KAAK+R,aACzC/R,KAAKwK,GAAKxK,KAAKF,UAAUmL,IAAInG,GAC7B9E,KAAKsR,QAAU7P,SAASC,cAAc,UACtC1B,KAAKsR,QAAQnE,UAAY,cACzBnN,KAAKiB,IAAMjB,KAAKsR,QAAQpQ,WAAW,MACnClB,KAAKwK,GAAGrF,KAAKrF,UAAU8B,YAAY5B,KAAKsR,QACzC,CAEQS,YAAc,KACrB,MAAMjS,EAAYE,KAAKwK,GAAGrF,KAAKrF,UAC/BM,EAAUM,mBAAmBV,KAAKW,OAAQb,EAAUkS,YAAalS,EAAUmS,eAGpEH,OAAS,KACZ9R,KAAKuR,eAAeK,UACvBM,aAAalS,KAAKuR,eAAeK,SACjC5R,KAAKuR,eAAeK,QAAU,MAE/B,MAAMO,EAAMC,KAAKD,MACX3M,EAAUxF,KAAKwK,GAAGrF,KAAKK,QACvBC,EAAUzF,KAAKwK,GAAGrF,KAAKM,QACvBpE,EAAQrB,KAAKwK,GAAGrF,KAAK9D,MACrBgR,EAAkBrS,KAAKsS,mBAAmB9M,EAASC,EAASpE,GAClE,GACCrB,KAAKuS,iBAAiBF,EAAiBrS,KAAKuR,eAAeE,oBAC3DpQ,IAAUrB,KAAKuR,eAAeC,eAC7B,CAED,GADsBW,EAAMnS,KAAKuR,eAAeM,aA3DlB,IAmE7B,OANA7R,KAAKuR,eAAeK,QAAUY,WAAW,KACxCxS,KAAKyS,WAAWjN,EAASC,EAASpE,EAAOgR,GACzCrS,KAAKuR,eAAeM,aAAeM,EACnCnS,KAAKuR,eAAeK,QAAU,MAC5B,SACH5R,KAAK0S,WAAWL,EAAiBhR,EAGnC,CACArB,KAAKuR,eAAeM,aAAeM,EACnCnS,KAAKyS,WAAWjN,EAASC,EAASpE,EAAOgR,IAGlC,UAAAI,CAAWjN,EAAiBC,EAAiBpE,EAAegR,GACnErS,KAAKuR,eAAeE,kBAAoBY,EACxCrS,KAAKuR,eAAeC,eAAiBnQ,EACrCrB,KAAKW,OAAOa,MAAM0M,UAAY,GAC9BlO,KAAKiB,IAAI0R,UAAU,EAAG,EAAG3S,KAAKW,OAAOC,MAAOZ,KAAKW,OAAOE,QACxDb,KAAKiB,IAAI2R,OACT5S,KAAKiB,IAAI4R,UAAUrN,EAASC,GAC5BzF,KAAKiB,IAAII,MAAMA,EAAOA,GACtB,MAAM+D,EAAapF,KAAKwK,GAAGrF,KAAKC,WAChCA,EAAWS,MAAMxB,QAAQ9B,IACxB,OAAQA,EAAK4D,MACZ,IAAK,QACJnG,KAAK8S,UAAUvQ,EAAMlB,GACrB,MACD,IAAK,OACJrB,KAAK+S,aAAaxQ,MAIrB6C,EAAWU,MAAMzB,QAAQ2O,IACxBhT,KAAKiT,SAASD,KAEfhT,KAAKiB,IAAIiS,SACV,CAEQ,UAAAR,CAAWL,EAA2BhR,GAC7C,MAAM8R,EAAW9R,EAAQrB,KAAKuR,eAAeC,eACvC4B,GAAkBpT,KAAKuR,eAAeE,kBAAkBlD,KAAO8D,EAAgB9D,MAAQlN,EACvFgS,GAAkBrT,KAAKuR,eAAeE,kBAAkBjD,IAAM6D,EAAgB7D,KAAOnN,EAC3FrB,KAAKW,OAAOa,MAAM0M,UAAY,aAAakF,QAAqBC,cAA2BF,IAC5F,CAEQZ,iBAAmB,CAACe,EAAiBC,IAC5CD,EAAM/E,KAAOgF,EAAMhF,MACnB+E,EAAM9E,IAAM+E,EAAM/E,KAClB8E,EAAM5B,MAAQ6B,EAAM7B,OACpB4B,EAAM3B,OAAS4B,EAAM5B,OAEdW,mBAAqB,CAAC9M,EAAiBC,EAAiBpE,KAC/D,MAAMkN,GAAQ/I,EAAUnE,EAClBmN,GAAO/I,EAAUpE,EACjBvB,EAAYE,KAAKwK,GAAGrF,KAAKrF,UAG/B,MAAO,CAAEyO,OAAMC,MAAKkD,MAFNnD,EAAOzO,EAAU2J,YAAcpI,EAElBsQ,OADZnD,EAAM1O,EAAU6J,aAAetI,IAIvCmS,aAAe,CAAC1R,EAAWC,EAAW0R,EAAehF,EAAepN,KAC3E,MAAMqS,EAAY,GAAKrS,EACjBW,EAAS,EAAIX,EACbsS,EAAU,EAAItS,EACduS,EAAW,GAAKvS,EAChBwS,EAAW,EAAIxS,EACrBrB,KAAKiB,IAAI2R,OACT5S,KAAKiB,IAAI4R,UAAU/Q,EAAGC,GACtB/B,KAAKiB,IAAII,MAAM,EAAIA,EAAO,EAAIA,GAC9BrB,KAAKiB,IAAI6S,KAAO,GAAGF,0BACnB,MAAMG,EAAW/T,KAAKiB,IAAI+S,YAAYP,GAAO7S,MAAQ,EAAIiT,EACzD7T,KAAKiB,IAAI4R,UAAU,GAAIa,EAAYC,GACnC3T,KAAKiB,IAAIgT,UAAYxF,EACrBzO,KAAKiB,IAAIgB,YACTjC,KAAKiB,IAAIiB,OAAOF,EAAQ,GACxBhC,KAAKiB,IAAIkB,OAAO4R,EAAW/R,EAAQ,GACnChC,KAAKiB,IAAImB,iBAAiB2R,EAAU,EAAGA,EAAU/R,GACjDhC,KAAKiB,IAAIkB,OAAO4R,EAAUL,EAAY1R,GACtChC,KAAKiB,IAAImB,iBAAiB2R,EAAUL,EAAWK,EAAW/R,EAAQ0R,GAClE1T,KAAKiB,IAAIkB,OAAOH,EAAQ0R,GACxB1T,KAAKiB,IAAImB,iBAAiB,EAAGsR,EAAW,EAAGA,EAAY1R,GACvDhC,KAAKiB,IAAIkB,OAAO,EAAGH,GACnBhC,KAAKiB,IAAImB,iBAAiB,EAAG,EAAGJ,EAAQ,GACxChC,KAAKiB,IAAIoB,YACTrC,KAAKiB,IAAIiT,OACTlU,KAAKiB,IAAIgT,UAAY7C,EACrBpR,KAAKiB,IAAIkT,SAASV,EAAOI,EAAsB,IAAZH,GACnC1T,KAAKiB,IAAIiS,WAGFkB,mBAAsB7R,IAC7B,MAAM8R,EAASjU,EAAUuC,SAASJ,EAAKkM,OAEvCzO,KAAKiB,IAAIqT,YAAc,EACvBtU,KAAKiB,IAAIgT,UAAYI,EAAO3Q,WAC5BtD,EAAUyB,cAAc7B,KAAKiB,IAAKsB,EAAKT,EAAI,EAAGS,EAAKR,EAAI,EAAGQ,EAAK3B,MAAQ,EAAG2B,EAAK1B,OAAS,EA9JtE,IA+JlBb,KAAKiB,IAAIiT,OACTlU,KAAKiB,IAAIsT,YAAcF,EAAO5Q,OAC9BzD,KAAKiB,IAAIuT,UAAY,EACrBpU,EAAUyB,cAAc7B,KAAKiB,IAAKsB,EAAKT,EAAGS,EAAKR,EAAGQ,EAAK3B,MAAO2B,EAAK1B,OAlKjD,IAmKlBb,KAAKiB,IAAIwT,UAGF3B,UAAY,CAACvQ,EAA2BlB,KAC/CrB,KAAKoU,mBAAmB7R,GACpBA,EAAKkR,OACRzT,KAAKwT,aAAajR,EAAKT,EAAGS,EAAKR,EAAGQ,EAAKkR,MAAOrT,EAAUuC,SAASJ,EAAKkM,OAAO9K,OAAQtC,IAG/E0R,aAAgBxQ,IACvBvC,KAAKiB,IAAIgT,UAAY7C,EACrBpR,KAAKiB,IAAI6S,KAAO,kBAChB9T,KAAKiB,IAAIkT,SAAS5R,EAAK6D,KAAM7D,EAAKT,EAAI,EAAGS,EAAKR,EAAI,KAG3CkR,SAAYD,IACnB,MAAM0B,SAAEA,EAAAC,OAAUA,GAAW3U,KAAK4U,aAAa5B,GACzC6B,EAAMzU,EAAUkC,gBACfwS,EAAQC,GAAUF,EAAIH,EAAU1B,EAAKgC,WACrCC,EAAMC,GAAQL,EAAIF,EAAQ3B,EAAKmC,SAChCxR,OAAEA,GAAWvD,EAAUuC,SAASqQ,EAAKvE,OAC3C,IAAK2G,EAAeC,EAAeC,EAAaC,GAAe,CAAC,EAAG,EAAG,EAAG,GAwBzE,GAvBKvC,EAAKwC,eAUFJ,EAAeC,EAAeC,EAAaC,GAAevC,EAAKwC,gBATrEJ,EAAeC,EAAeC,EAAaC,GAAevV,KAAKyV,iBAC/DX,EACAC,EACAE,EACAC,EACAlC,EAAKgC,SACLhC,EAAKmC,QAENnC,EAAKwC,cAAgB,CAACJ,EAAeC,EAAeC,EAAaC,IAElEvV,KAAK0V,eACJZ,EACAC,EACAE,EACAC,EACAE,EACAC,EACAC,EACAC,EACA5R,GAED3D,KAAK2V,cAAcV,EAAMC,EAAMI,EAAaC,EAAa5R,GACrDqP,EAAKS,MAAO,CACf,MAAMmC,EAAI,GACJ9T,GACJ,EAAI8T,IAAM,EAAId,EACf,GAAK,EAAIc,IAAM,EAAIA,EAAIR,EACvB,GAAK,EAAIQ,GAAKA,EAAIA,EAAIN,EACtBM,GAAK,EAAIX,EACJlT,GACJ,EAAI6T,IAAM,EAAIb,EACf,GAAK,EAAIa,IAAM,EAAIA,EAAIP,EACvB,GAAK,EAAIO,GAAKA,EAAIA,EAAIL,EACtBK,GAAK,EAAIV,EACVlV,KAAKiB,IAAI6S,KAAO,kBAChB,MACM+B,EAAU,EACVC,EAFU9V,KAAKiB,IAAI+S,YAAYhB,EAAKS,OAEf7S,MAAkB,EAAViV,EAC7BE,EAAc,GACpB/V,KAAKiB,IAAIgT,UAAY,OACrBjU,KAAKiB,IAAIgB,YACT7B,EAAUyB,cACT7B,KAAKiB,IACLa,EAAIgU,EAAa,EACjB/T,EAAIgU,EAAc,EAAI,EACtBD,EACAC,EACA,GAED/V,KAAKiB,IAAIiT,OACTlU,KAAKiB,IAAIgT,UAAY,OACrBjU,KAAKiB,IAAI+U,UAAY,SACrBhW,KAAKiB,IAAIgV,aAAe,SACxBjW,KAAKiB,IAAIkT,SAASnB,EAAKS,MAAO3R,EAAGC,EAAI,GACrC/B,KAAKiB,IAAI+U,UAAY,OACrBhW,KAAKiB,IAAIgV,aAAe,YACzB,GAGOrB,aAAgB5B,IAAA,CACvB0B,SAAU1U,KAAKwK,GAAGrF,KAAKE,QAAQ2N,EAAK0B,UACpCC,OAAQ3U,KAAKwK,GAAGrF,KAAKE,QAAQ2N,EAAK2B,UAG3Bc,iBAAmB,CAC1BX,EACAC,EACAE,EACAC,EACAF,EACAG,KAEA,MAAMe,EAAYjB,EAAOH,EACnBqB,EAAYjB,EAAOH,EACnBqB,EACL3V,KAAKkH,IAAIlH,KAAK4V,IAAIH,GAAYzV,KAAK4V,IAAIF,IACvC,GAAM1V,KAAKmH,IAAInH,KAAK4V,IAAIH,GAAYzV,KAAK4V,IAAIF,IAExCG,GADSC,EACsB,GAAfH,EADMzO,EACc,GADDC,EACK,IADWnH,KAAKmH,IAAID,EAAKlH,KAAKkH,IAAIC,EAAK2O,KAAvE,IAACA,EAAa5O,EAAaC,EAEzC,IAAIwN,EAAgBN,EAChBO,EAAgBN,EAChBO,EAAcL,EACdM,EAAcL,EAClB,OAAQF,GACP,IAAK,MACJK,EAAgBN,EAASuB,EACzB,MACD,IAAK,SACJjB,EAAgBN,EAASuB,EACzB,MACD,IAAK,OACJlB,EAAgBN,EAASwB,EACzB,MACD,IAAK,QACJlB,EAAgBN,EAASwB,EAG3B,OAAQnB,GACP,IAAK,MACJI,EAAcL,EAAOoB,EACrB,MACD,IAAK,SACJf,EAAcL,EAAOoB,EACrB,MACD,IAAK,OACJhB,EAAcL,EAAOqB,EACrB,MACD,IAAK,QACJhB,EAAcL,EAAOqB,EAGvB,MAAO,CAAClB,EAAeC,EAAeC,EAAaC,IAG5CG,eAAiB,CACxBZ,EACAC,EACAE,EACAC,EACAsB,EACAC,EACAC,EACAC,EACAlI,KAEAzO,KAAKiB,IAAIgB,YACTjC,KAAKiB,IAAIiB,OAAO4S,EAAQC,GACxB/U,KAAKiB,IAAI2V,cAAcJ,EAAKC,EAAKC,EAAKC,EAAK1B,EAAMC,GACjDlV,KAAKiB,IAAIsT,YAAc9F,EACvBzO,KAAKiB,IAAIuT,UAAY,EACrBxU,KAAKiB,IAAIwT,UAGFkB,cAAgB,CAACkB,EAAcC,EAAcC,EAAeC,EAAevI,KAClF,MAAMwI,EAAKJ,EAAOE,EACZG,EAAKJ,EAAOE,EACZlU,EAASrC,KAAK0W,KAAKF,EAAKA,EAAKC,EAAKA,GACxC,GAAe,IAAXpU,EAAc,OAClB,MAAMsU,EAAQH,EAAKnU,EACbuU,EAAQH,EAAKpU,EACbwU,EAAQT,EAxUK,GAwUEO,EAvUH,EAuU0BC,EACtCE,EAAQT,EAzUK,GAyUEO,EAxUH,EAwU0BD,EACtCI,EAASX,EA1UI,GA0UGO,EAzUJ,EAyU2BC,EACvCI,EAASX,EA3UI,GA2UGO,EA1UJ,EA0U2BD,EAC7CpX,KAAKiB,IAAIgB,YACTjC,KAAKiB,IAAIgT,UAAYxF,EACrBzO,KAAKiB,IAAIiB,OAAO2U,EAAMC,GACtB9W,KAAKiB,IAAIkB,OAAOmV,EAAOC,GACvBvX,KAAKiB,IAAIkB,OAAOqV,EAAQC,GACxBzX,KAAKiB,IAAIoB,YACTrC,KAAKiB,IAAIiT,QAGV/T,QAAU,KACLH,KAAKuR,eAAeK,UACvBM,aAAalS,KAAKuR,eAAeK,SACjC5R,KAAKuR,eAAeK,QAAU,MAE/B5R,KAAKW,OAAOyJ,SACZpK,KAAKsR,QAAU,MC1VjB,MAAqBoG,EACZ3X,QACA4X,WACAC,GAAkC,KAC1C9X,UAEA,WAAAD,CAAYE,EAA8C8X,GACzD7X,KAAKF,UAAY,IAAIgY,EACrB9X,KAAKD,QAAUA,EAOfC,KAAK2X,WAAa,CACjB7S,EACAuF,EACA8B,EACAY,EACAsE,KACIwG,GAAW,IAGhB7X,KAAK2X,WAAWtT,QAfF0T,IACb/X,KAAKF,UAAUkY,KAAK,CACnBC,QAASF,EACTG,WAAY,IAAM,IAAIH,EAAM/X,KAAKF,UAAWE,KAAKD,aAa/CC,KAAKD,QAAQoY,UAChBnY,KAAK4X,GAAK,IAAIQ,qBAAqBpY,KAAKqY,kBAAmB,CAC1DC,KAAM,KACNC,WAAY,OACZC,UAAW,IAEZxY,KAAK4X,GAAGhM,QAAQ5L,KAAKD,QAAQD,iBAClB2Y,MACb,CAEQA,KAAO,KACdzY,KAAK2X,WAAWtT,QAAQqU,IACvB1Y,KAAKF,UAAUmL,IAAIyN,KAEpB1Y,KAAKF,UAAUmL,IAAInG,GAAaY,cAGzB2S,kBAAqBM,IAC5BA,EAAQtU,QAAQuU,IACf,GAAIA,EAAMC,eAIT,OAHA7Y,KAAKyY,OACLzY,KAAK4X,IAAI1L,kBACTlM,KAAK4X,GAAK,SAMbzX,QAAU,KACTH,KAAK4X,IAAI1L,aACTlM,KAAK4X,GAAK,KACV,MAAM9X,EAAYE,KAAKD,QAAQD,UAC/B,KAAOA,EAAUgZ,YAAYhZ,EAAUgZ,WAAW1O,SAClDpK,KAAK2X,WAAWoB,UAChB/Y,KAAK2X,WAAWtT,QAAQqU,IACvB,MAAMM,EAAShZ,KAAKF,UAAUmL,IAAIyN,GAC9BM,EAAO7Y,SAAS6Y,EAAO7Y,YAE5BH,KAAKF,UAAUmZ,mBCpEXC,EACL,+ZAUD,MAAqBC,UAAiBvZ,EAC7BwZ,eAAwC,KACxCC,mBAA+C,KAC/CC,qBAAiD,KACjDC,YAAwC,KACxCC,YAAuC,KACvCC,WAAuC,KACvCC,cAA0C,KAC1ClP,GACAmP,UAER,iBAAYC,GACX,GAA4B,OAAxB5Z,KAAKoZ,eAAyB,MAAMxU,EACxC,OAAO5E,KAAKoZ,cACb,CACA,qBAAYS,GACX,GAAgC,OAA5B7Z,KAAKqZ,mBAA6B,MAAMzU,EAC5C,OAAO5E,KAAKqZ,kBACb,CACA,uBAAYS,GACX,GAAkC,OAA9B9Z,KAAKsZ,qBAA+B,MAAM1U,EAC9C,OAAO5E,KAAKsZ,oBACb,CACA,cAAYS,GACX,GAAyB,OAArB/Z,KAAKuZ,YAAsB,MAAM3U,EACrC,OAAO5E,KAAKuZ,WACb,CACA,cAAYS,GACX,GAAyB,OAArBha,KAAKwZ,YAAsB,MAAM5U,EACrC,OAAO5E,KAAKwZ,WACb,CACA,aAAYS,GACX,GAAwB,OAApBja,KAAKyZ,WAAqB,MAAM7U,EACpC,OAAO5E,KAAKyZ,UACb,CACA,gBAAYS,GACX,GAA2B,OAAvBla,KAAK0Z,cAAwB,MAAM9U,EACvC,OAAO5E,KAAK0Z,aACb,CAEA,WAAA7Z,IAAesE,GACd6G,SAAS7G,GACTnE,KAAK2Z,UAAY3Z,KAAKD,QAAQoa,oBAAqB,EACnDna,KAAKwK,GAAKxK,KAAKF,UAAUmL,IAAInG,GAC7B9E,KAAKwK,GAAGxF,MAAMC,mBAAmBT,UAAUxE,KAAKoa,qBAChDpa,KAAKF,UAAUmL,IAAIZ,GAAYrF,MAAM+F,UAAUvG,UAAUxE,KAAKqa,cAE9Dra,KAAKoZ,eAAiB3X,SAASC,cAAc,OAC7C1B,KAAKoZ,eAAejM,UAAY,WAChCnN,KAAKoZ,eAAe1N,UAAU4O,OAAO,YAAata,KAAK2Z,WAEvDvZ,EAAUkB,YAAYtB,KAAKoZ,+vBAE3BpZ,KAAKqZ,mBAAqB5X,SAASC,cAAc,UACjD1B,KAAKqZ,mBAAmBlM,UAAY,kBACpCnN,KAAKqZ,mBAAmB1X,UAzDzB,mMA0DC3B,KAAKoZ,eAAexX,YAAY5B,KAAKqZ,oBAErC,MAAMkB,EAAkB9Y,SAASC,cAAc,OAC/C6Y,EAAgBpN,UAAY,mBAE5BnN,KAAKsZ,qBAAuB7X,SAASC,cAAc,UACnD1B,KAAKsZ,qBAAqB3X,UAAYuX,EACtCqB,EAAgB3Y,YAAY5B,KAAKsZ,sBAEjCtZ,KAAKuZ,YAAc9X,SAASC,cAAc,UAC1C1B,KAAKuZ,YAAY5X,UAtElB,yGAuEC4Y,EAAgB3Y,YAAY5B,KAAKuZ,aAEjCvZ,KAAKwZ,YAAc/X,SAASC,cAAc,SAC1C1B,KAAKwZ,YAAYrT,KAAO,QACxBnG,KAAKwZ,YAAYrM,UAAY,cAC7BnN,KAAKwZ,YAAY7R,IAAM,MACvB3H,KAAKwZ,YAAY5R,IAAM,KACvB5H,KAAKwZ,YAAYgB,MAAQ,IACzBD,EAAgB3Y,YAAY5B,KAAKwZ,aAEjCxZ,KAAKyZ,WAAahY,SAASC,cAAc,UACzC1B,KAAKyZ,WAAW9X,UApFjB,iHAqFC4Y,EAAgB3Y,YAAY5B,KAAKyZ,YAEjCzZ,KAAK0Z,cAAgBjY,SAASC,cAAc,UAC5C1B,KAAK0Z,cAAc/X,UA9FpB,6cA+FC4Y,EAAgB3Y,YAAY5B,KAAK0Z,eAEjC1Z,KAAKoZ,eAAexX,YAAY2Y,GAEhCva,KAAKwK,GAAGrF,KAAKrF,UAAU8B,YAAY5B,KAAKoZ,gBAExCpZ,KAAKqZ,mBAAmB3J,iBAAiB,QAAS1P,KAAKya,gBACvDza,KAAKyZ,WAAW/J,iBAAiB,QAAS1P,KAAK0a,QAC/C1a,KAAKuZ,YAAY7J,iBAAiB,QAAS1P,KAAK2a,SAChD3a,KAAKwZ,YAAY9J,iBAAiB,QAAS1P,KAAK4a,OAChD5a,KAAK0Z,cAAchK,iBAAiB,QAAS1P,KAAKwK,GAAGrB,WACrDnJ,KAAKsZ,qBAAqB5J,iBAAiB,QAAS1P,KAAK6a,iBAC1D,CACAJ,eAAiB,KAChBza,KAAK2Z,WAAa3Z,KAAK2Z,UACvB3Z,KAAK4Z,cAAclO,UAAU4O,OAAO,YAAata,KAAK2Z,WACjD3Z,KAAK2Z,WAAW3Z,KAAKqa,gBAEnBK,OAAS,IAAM1a,KAAKwK,GAAGlC,KAAK,IAAKtI,KAAKwK,GAAGL,gBACzCwQ,QAAU,IAAM3a,KAAKwK,GAAGlC,KAAK,EAAI,IAAKtI,KAAKwK,GAAGL,gBAC9CyQ,MAAQ,IAAM5a,KAAKwK,GAAG/B,YAAY,KAAOqS,OAAO9a,KAAKga,WAAWQ,OAAQxa,KAAKwK,GAAGL,gBAEhFiQ,oBAAuBW,IACnB/a,KAAK8Z,oBAAoBnY,UAAhCoZ,EAlHL,mXAmH2C7B,GAEnC2B,iBAAmB,IAAM7a,KAAKwK,GAAG1B,gBAAgB,UAEjDuR,aAAe,KAClBra,KAAK2Z,YACT3Z,KAAKga,WAAWQ,MAAQQ,OAAOhb,KAAKib,cAAcjb,KAAKwK,GAAGrF,KAAK9D,UAExD4Z,cAAiB5Z,GAAkBZ,KAAKya,IAAI7Z,GAASZ,KAAKya,IAAI,KAEtE/a,QAAU,KACTH,KAAK6Z,kBAAkBjK,oBAAoB,QAAS5P,KAAKya,gBACzDza,KAAKia,UAAUrK,oBAAoB,QAAS5P,KAAK0a,QACjD1a,KAAK+Z,WAAWnK,oBAAoB,QAAS5P,KAAK2a,SAClD3a,KAAKga,WAAWpK,oBAAoB,QAAS5P,KAAK4a,OAClD5a,KAAKka,aAAatK,oBAAoB,QAAS5P,KAAKwK,GAAGrB,WACvDnJ,KAAK8Z,oBAAoBlK,oBAAoB,QAAS5P,KAAK6a,kBAC3D7a,KAAK4Z,cAAcxP,SACnBpK,KAAKoZ,eAAiB,KACtBpZ,KAAKqZ,mBAAqB,KAC1BrZ,KAAKyZ,WAAa,KAClBzZ,KAAKuZ,YAAc,KACnBvZ,KAAKwZ,YAAc,KACnBxZ,KAAK0Z,cAAgB,KACrB1Z,KAAKsZ,qBAAuB,MCpJ9B,MAAqB6B,UAAmBvb,EAC/Bwb,YAAqC,KACrC5Q,GAER,cAAY6Q,GACX,IAAKrb,KAAKob,YAAa,MAAMxW,EAC7B,OAAO5E,KAAKob,WACb,CAEA,WAAAvb,IAAesE,GACd6G,SAAS7G,GACTnE,KAAKwK,GAAKxK,KAAKF,UAAUmL,IAAInG,GAC7B9E,KAAKF,UAAUmL,IAAIZ,GAAYrF,MAAM+F,UAAUvG,UAAUxE,KAAKsb,QAC9Dtb,KAAKob,YAAc3Z,SAASC,cAAc,OAC1C1B,KAAKob,YAAYjO,UAAY,cAC7B,MAAM1B,EAAgBzL,KAAKwK,GAAGrF,KAAKrF,UACnCM,EAAUkB,YAAYmK,oUACtBA,EAAc7J,YAAY5B,KAAKob,YAChC,CAEQE,OAAS,KAChB,MAAMjb,EAAQD,EAAUC,MAClB8E,EAAOnF,KAAKwK,GAAGrF,KACrBnF,KAAKqb,WAAW1Z,UAAY,aAAatB,EAAM8E,EAAK9D,MAAO,oBAAoBhB,EAAM8E,EAAKK,QAAS,OAAOnF,EAAM8E,EAAKM,QAAS,UAG/HtF,QAAU,KACTH,KAAKqb,WAAWjR,SAChBpK,KAAKob,YAAc,MCrBrB,MAAqBG,UAAgB3b,EAC5B4b,YAA+C,KAC/CC,mBAA4C,KAC5CC,SAAkC,KAClCC,kBAA2C,KAC3CC,kBAA8C,KAC9CC,aAAoE,CAC3Exa,MAAO,EACPwG,QAAS,EACTC,QAAS,GAEF0C,GACAmP,UAER,WAAYmC,GACX,GAAsB,OAAlB9b,KAAK0b,SAAmB,MAAM9W,EAClC,OAAO5E,KAAK0b,QACb,CACA,cAAYK,GACX,GAAyB,OAArB/b,KAAKwb,YAAsB,MAAM5W,EACrC,OAAO5E,KAAKwb,WACb,CACA,qBAAYQ,GACX,GAAgC,OAA5Bhc,KAAKyb,mBAA6B,MAAM7W,EAC5C,OAAO5E,KAAKyb,kBACb,CACA,oBAAYQ,GACX,GAA+B,OAA3Bjc,KAAK2b,kBAA4B,MAAM/W,EAC3C,OAAO5E,KAAK2b,iBACb,CACA,oBAAYO,GACX,GAA+B,OAA3Blc,KAAK4b,kBAA4B,MAAMhX,EAC3C,OAAO5E,KAAK4b,iBACb,CAEA,WAAA/b,IAAesE,GACd6G,SAAS7G,GACTnE,KAAK2Z,UAAY3Z,KAAKD,QAAQoc,mBAAoB,EAClDnc,KAAKF,UAAUmL,IAAIZ,GAAYrF,MAAM+F,UAAUvG,UAAUxE,KAAKoc,yBAC9Dpc,KAAKwK,GAAKxK,KAAKF,UAAUmL,IAAInG,GAC7B9E,KAAKwK,GAAGxF,MAAME,gBAAgBV,UAAUxE,KAAKqc,aAE7Crc,KAAK2b,kBAAoBla,SAASC,cAAc,OAChD1B,KAAK2b,kBAAkBxO,UAAY,oBAEnC/M,EAAUkB,YAAYtB,KAAK2b,k7CAE3B3b,KAAK4b,kBAAoBna,SAASC,cAAc,UAChD1B,KAAK4b,kBAAkBzO,UAAY,iCACnCnN,KAAK4b,kBAAkBja,UAnDxB,mMAoDC3B,KAAK2b,kBAAkB/Z,YAAY5B,KAAK4b,mBAExC5b,KAAK0b,SAAWja,SAASC,cAAc,OACvC1B,KAAK0b,SAASvO,UAAY,UAC1B,MAAMmP,EAAgB7a,SAASC,cAAc,UAC7C4a,EAAcnP,UAAY,iBAC1BmP,EAAc1b,MAAQ,IACtB0b,EAAczb,OAAS,IAEvBb,KAAK0b,SAAS9Z,YAAY0a,GAC1Btc,KAAKwb,YAAcc,EAAcpb,WAAW,MAC5ClB,KAAKyb,mBAAqBha,SAASC,cAAc,OACjD1B,KAAKyb,mBAAmBtO,UAAY,qBACpCnN,KAAK0b,SAAS9Z,YAAY5B,KAAKyb,oBAC/Bzb,KAAK2b,kBAAkB/Z,YAAY5B,KAAK0b,UAExC1b,KAAKwK,GAAGrF,KAAKrF,UAAU8B,YAAY5B,KAAK2b,mBAExC3b,KAAK2b,kBAAkBjQ,UAAU4O,OAAO,YAAata,KAAK2Z,WAE1D3Z,KAAK4b,kBAAkBlM,iBAAiB,QAAS1P,KAAKya,gBACtDra,EAAUM,mBAAmB4b,EAAeA,EAAc1b,MAAO0b,EAAczb,OAChF,CAEA4Z,eAAiB,KAChBza,KAAK2Z,WAAa3Z,KAAK2Z,UACvB3Z,KAAKic,iBAAiBvQ,UAAU4O,OAAO,YAAata,KAAK2Z,WACpD3Z,KAAK2Z,WAAW3Z,KAAKoc,2BAGnBC,YAAc,KACrB,MAAMjT,EAASpJ,KAAKwK,GAAGrF,KAAKI,WAC5B,IAAK6D,EAAQ,OACb,MAAMmT,EAAevc,KAAK8b,QAAQrS,YAC5B+S,EAAgBxc,KAAK8b,QAAQnS,aAC7BC,EAAS2S,EAAenT,EAAOxI,MAC/BiJ,EAAS2S,EAAgBpT,EAAOvI,OACtCb,KAAK6b,aAAaxa,MAAmC,GAA3BZ,KAAKkH,IAAIiC,EAAQC,GAC3C7J,KAAK6b,aAAahU,QAAU0U,EAAe,EAC3Cvc,KAAK6b,aAAa/T,QAAU0U,EAAgB,EAC5Cxc,KAAK+b,WAAWpJ,UAAU,EAAG,EAAG4J,EAAcC,GAC9Cxc,KAAK+b,WAAWnJ,OAChB5S,KAAK+b,WAAWlJ,UAAU7S,KAAK6b,aAAahU,QAAS7H,KAAK6b,aAAa/T,SACvE9H,KAAK+b,WAAW1a,MAAMrB,KAAK6b,aAAaxa,MAAOrB,KAAK6b,aAAaxa,OACjErB,KAAK+b,WAAWlJ,WAAWzJ,EAAOvB,SAAUuB,EAAOtB,SACnD,MAAM1C,EAAapF,KAAKwK,GAAGrF,KAAKC,WAChC,IAAA,MAAW4N,KAAQ5N,EAAWU,MAAO9F,KAAKyc,gBAAgBzJ,GAC1D,IAAA,MAAWzQ,KAAQ6C,EAAWS,MAAO7F,KAAK0c,gBAAgBna,GAC1DvC,KAAK+b,WAAW7I,WAGTwJ,gBAAmBna,IAC1B,MAAM8R,EAASjU,EAAUuC,SAASJ,EAAKkM,OAEvCzO,KAAK+b,WAAW9H,UAAYI,EAAO5Q,OACnCzD,KAAK+b,WAAWzH,YAAc,GAC9BlU,EAAUyB,cAAc7B,KAAK+b,WAAYxZ,EAAKT,EAAGS,EAAKR,EAAGQ,EAAK3B,MAAO2B,EAAK1B,OAH3D,IAIfb,KAAK+b,WAAW7H,OAChBlU,KAAK+b,WAAWzH,YAAc,GAGvBmI,gBAAmBzJ,IAC1B,MAAM3N,EAAUrF,KAAKwK,GAAGrF,KAAKE,QACvBqP,EAAWrP,EAAQ2N,EAAK0B,UACxBC,EAAStP,EAAQ2N,EAAK2B,QAC5B,IAAKD,IAAaC,EAAQ,OAC1B,MAAOG,EAAQC,GAAU3U,EAAUkC,eAAeoS,EAAU1B,EAAKgC,WAC1DC,EAAMC,GAAQ9U,EAAUkC,eAAeqS,EAAQ3B,EAAKmC,QAC3DnV,KAAK+b,WAAW9Z,YAChBjC,KAAK+b,WAAW7Z,OAAO4S,EAAQC,GAC/B/U,KAAK+b,WAAW5Z,OAAO8S,EAAMC,GAC7BlV,KAAK+b,WAAWxH,YAAc,OAC9BvU,KAAK+b,WAAWvH,UAAY,GAC5BxU,KAAK+b,WAAWtH,UAGT2H,wBAA0B,KACjC,GAAIpc,KAAK2Z,UAAW,OACpB,MAAMvQ,EAASpJ,KAAKwK,GAAGrF,KAAKI,WACtBzF,EAAYE,KAAKwK,GAAGrF,KAAKrF,UACzBuB,EAAQrB,KAAKwK,GAAGrF,KAAK9D,MAC3B,IAAK+H,EAAQ,OACb,MAAMI,EAAY1J,EAAU2J,YAAcpI,EACpCqI,EAAa5J,EAAU6J,aAAetI,EACtCsb,GAAmB3c,KAAKwK,GAAGrF,KAAKK,QAAUnE,EAAQvB,EAAU2J,aAAe,EAAIpI,GAC/Eub,GAAmB5c,KAAKwK,GAAGrF,KAAKM,QAAUpE,EAAQvB,EAAU6J,cAAgB,EAAItI,GAChFwb,EACL7c,KAAK6b,aAAahU,SACjB8U,EAAkBnT,EAAY,EAAIJ,EAAOvB,SAAW7H,KAAK6b,aAAaxa,MAClEyb,EACL9c,KAAK6b,aAAa/T,SACjB8U,EAAkBlT,EAAa,EAAIN,EAAOtB,SAAW9H,KAAK6b,aAAaxa,MACnE0b,EAAgBvT,EAAYxJ,KAAK6b,aAAaxa,MAC9C2b,EAAiBtT,EAAa1J,KAAK6b,aAAaxa,MACtDrB,KAAKgc,kBAAkBxa,MAAM+M,KAAO,GAAGsO,MACvC7c,KAAKgc,kBAAkBxa,MAAMgN,IAAM,GAAGsO,MACtC9c,KAAKgc,kBAAkBxa,MAAMZ,MAAQ,GAAGmc,MACxC/c,KAAKgc,kBAAkBxa,MAAMX,OAAS,GAAGmc,OAG1C7c,QAAU,KACTH,KAAKkc,iBAAiBtM,oBAAoB,QAAS5P,KAAKya,gBACxDza,KAAK+b,WAAWpJ,UAAU,EAAG,EAAG3S,KAAK8b,QAAQrS,YAAazJ,KAAK8b,QAAQnS,cACvE3J,KAAKic,iBAAiB7R,SACtBpK,KAAK2b,kBAAoB,KACzB3b,KAAK4b,kBAAoB,KACzB5b,KAAKyb,mBAAqB,KAC1Bzb,KAAK0b,SAAW,MC9JlB,MAAqBuB,UAA0Brd,EACtCsd,qBAA8C,KAC9CC,WAAqB,EACrB3S,GACA4S,gBAMJ,CACHC,QAAQ,EACRC,MAAO,EACPC,MAAO,EACPC,SAAU,EACVC,SAAU,GAGX,uBAAYC,GACX,GAAkC,OAA9B1d,KAAKkd,qBAA+B,MAAMtY,EAC9C,OAAO5E,KAAKkd,oBACb,CAEA,WAAArd,IAAesE,GACd6G,SAAS7G,GACT,MAAMpE,EAAUE,OAAOC,OACtB,CACCyd,gBAAgB,EAChBC,UAAW,uBAEZ5d,KAAKD,QAAQ8d,mBAAqB,CAAA,GAG7BC,EAAmBrc,SAASC,cAAc,OAChDoc,EAAiB3Q,UAAY,oBAC7B2Q,EAAiBC,YAAche,EAAQ6d,UACvC5d,KAAKwK,GAAKxK,KAAKF,UAAUmL,IAAInG,GAC7B9E,KAAKkd,qBAAuBzb,SAASC,cAAc,OACnD1B,KAAKkd,qBAAqB/P,UAAY,8BAEtC/M,EAAUkB,YAAYtB,KAAKkd,ksBAC3Bld,KAAKkd,qBAAqBtb,YAAYkc,GACtC9d,KAAKwK,GAAGrF,KAAKrF,UAAU8B,YAAY5B,KAAKkd,sBAEpCnd,EAAQ4d,gBAAgB3d,KAAKge,kBAEjCjd,OAAO2O,iBAAiB,cAAe1P,KAAKie,eAC5Cld,OAAO2O,iBAAiB,cAAe1P,KAAKke,eAC5Cnd,OAAO2O,iBAAiB,YAAa1P,KAAKme,YAC3C,CAEQF,cAAiBjN,IACxB,MAAM5H,EAASpJ,KAAKwK,GAAGrF,KAAKrF,UAAUse,wBAErCpN,EAAEqN,QAAUjV,EAAOmF,MACnByC,EAAEqN,QAAUjV,EAAOsI,OACnBV,EAAEsN,QAAUlV,EAAOoF,KACnBwC,EAAEsN,QAAUlV,EAAOuI,OAEd3R,KAAKmd,WAAWnd,KAAKge,kBAChBhe,KAAKmd,YACfnd,KAAKod,gBAAgBI,SAAWxM,EAAEqN,QAClCre,KAAKod,gBAAgBK,SAAWzM,EAAEsN,QAClCte,KAAKod,gBAAgBE,MAAQtM,EAAEqN,QAC/Bre,KAAKod,gBAAgBG,MAAQvM,EAAEsN,QAC/Bte,KAAKod,gBAAgBC,QAAS,IAIxBa,cAAiBlN,IACpBhR,KAAKod,gBAAgBC,SACxBrd,KAAKod,gBAAgBE,MAAQtM,EAAEqN,QAC/Bre,KAAKod,gBAAgBG,MAAQvM,EAAEsN,UAIzBH,YAAc,KACjBne,KAAKod,gBAAgBC,SACxBrd,KAAKod,gBAAgBC,QAAS,EAE7B5c,KAAK4V,IAAIrW,KAAKod,gBAAgBE,MAAQtd,KAAKod,gBAAgBI,UAC1D/c,KAAK4V,IAAIrW,KAAKod,gBAAgBG,MAAQvd,KAAKod,gBAAgBK,UAC5D,GAEAzd,KAAKue,kBAIRP,gBAAkB,KACjBhe,KAAK0d,oBAAoBhS,UAAUtB,OAAO,UAC1CpK,KAAKwK,GAAGrF,KAAKrF,UAAU4L,UAAUjH,IAAI,QACrCzE,KAAKmd,WAAY,GAGlBoB,cAAgB,KACfve,KAAKmd,WAAY,EACjBnd,KAAK0d,oBAAoBhS,UAAUjH,IAAI,UACvC+N,WAAW,IAAMxS,KAAKwK,GAAGrF,KAAKrF,UAAU4L,UAAUtB,OAAO,QAAS,KAGnEjK,QAAU,KACTY,OAAO6O,oBAAoB,cAAe5P,KAAKie,eAC/Cld,OAAO6O,oBAAoB,cAAe5P,KAAKke,eAC/Cnd,OAAO6O,oBAAoB,YAAa5P,KAAKme,aAC7Cne,KAAK0d,oBAAoBtT,SACzBpK,KAAKkd,qBAAuB,MChH9BvX,eAAA6Y,EAA+B3a,EAAc4a,GAC5C,MAAMhS,EAASI,GAAqBC,EAAUD,EAAU4R,GAClDC,EAAUnc,GAsBjB,SAAkBA,EAAsBkK,GACvC,OAAQlK,EAAK4D,MACZ,IAAK,OACJ,OAAOsG,EAAMlK,EAAKkL,MACnB,IAAK,OACJ,OAQH,SAAuBlL,EAA0BkK,GAChD,GAAIlK,EAAK6D,KAAKiB,MAAM,UAAW,OAMhC1B,eAA4B9B,EAAc4I,GACzC,IAAIsB,EACJ,IACC,MAAMC,QAAiBjI,MAAMlC,GACvBK,QAAe8J,EAASP,OACxBQ,EAAmB/J,EAAOmD,MAAM,qCAChB0G,EAAgBtB,EAAlCwB,EAAwCA,EAAiB,GAClC/J,EAC5B,CAAA,MACC6J,EAAgB,yBACjB,CACA,OAAOA,CACR,CAlBuC4Q,CAAapc,EAAK6D,KAAMqG,GAAK,GAC1DlK,EAAK6D,KAAKiB,MAAM,mCACxB,MAAO,aAAa9E,EAAK6D,cAAc7D,EAAK6D,KAAKE,MAAM,KAAKsY,UAAK,GACzDrc,EAAK6D,KAAKiB,MAAM,iBAAkB,MAAO,eAAe9E,EAAK6D,yBACvE,CAbUyY,CAActc,EAAMkK,GAC5B,IAAK,OACJ,MAAO,YAAYlK,EAAKoL,kDAAkDpL,EAAKoL,UAChF,QACC,MAAO,GAEV,CAjC0CmR,CAASvc,EAAMkK,GAClD5G,EAAQ5F,OAAOC,OACpB,CACC2F,MAAO,GACPC,MAAO,UAEFC,MAAMlC,GAAMmC,KAAKC,GAAOA,EAAIC,SACjCL,MACIkZ,EAAW3e,EAAUwD,YAAYC,GACvCgC,EAAMxB,QAAQ9B,IACb,GAAkB,SAAdA,EAAK4D,OAAoB5D,EAAK6D,KAAKC,SAAS,QAAS,CACxD,MAAMD,EAAO7D,EAAK6D,KAAKE,MAAM,KAC7B/D,EAAK6D,KAAO2Y,EAAW3Y,EAAKwY,KAC7B,IAED,IAAI1a,EAAS,GAIb,OAHA2B,EAAMxB,QAAQ9B,IACb2B,GAAUwa,EAAOnc,KAEX2B,CACR,CCZO,MAAM8a,EAAiB,CAC7B3U,aACAvF,cACAiI,qBACAsE,WACAlF"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
package/dist/modules.cjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./controller--Q72jFEw.cjs"),e='<svg viewBox="-5.28 -5.28 34.56 34.56" fill="none"><path d="M4 9V5.6c0-.56 0-.84.109-1.054a1 1 0 0 1 .437-.437C4.76 4 5.04 4 5.6 4H9M4 15v3.4c0 .56 0 .84.109 1.054a1 1 0 0 0 .437.437C4.76 20 5.04 20 5.6 20H9m6-16h3.4c.56 0 .84 0 1.054.109a1 1 0 0 1 .437.437C20 4.76 20 5.04 20 5.6V9m0 6v3.4c0 .56 0 .84-.109 1.054a1 1 0 0 1-.437.437C19.24 20 18.96 20 18.4 20H15" stroke-width="2.4" stroke-linecap="round"/></svg>';class i extends t.BaseModule{_controlsPanel=null;_toggleCollapseBtn=null;_toggleFullscreenBtn=null;_zoomOutBtn=null;_zoomSlider=null;_zoomInBtn=null;_resetViewBtn=null;DM;collapsed;get controlsPanel(){if(null===this._controlsPanel)throw t.destroyError;return this._controlsPanel}get toggleCollapseBtn(){if(null===this._toggleCollapseBtn)throw t.destroyError;return this._toggleCollapseBtn}get toggleFullscreenBtn(){if(null===this._toggleFullscreenBtn)throw t.destroyError;return this._toggleFullscreenBtn}get zoomOutBtn(){if(null===this._zoomOutBtn)throw t.destroyError;return this._zoomOutBtn}get zoomSlider(){if(null===this._zoomSlider)throw t.destroyError;return this._zoomSlider}get zoomInBtn(){if(null===this._zoomInBtn)throw t.destroyError;return this._zoomInBtn}get resetViewBtn(){if(null===this._resetViewBtn)throw t.destroyError;return this._resetViewBtn}constructor(...i){super(...i),this.collapsed=this.options.controlsCollapsed||!1,this.DM=this.container.get(t.DataManager),this.DM.onToggleFullscreen.subscribe(this.updateFullscreenBtn),this.container.get(t.Controller).hooks.onRefresh.subscribe(this.updateSlider),this._controlsPanel=document.createElement("div"),this._controlsPanel.className="controls",this._controlsPanel.classList.toggle("collapsed",this.collapsed),t.utilities.applyStyles(this._controlsPanel,".collapse-button{border-radius:8px;transition:transform .2s}.collapse-button:hover{background:#444c}button{cursor:pointer;font-size:18px;height:32px;border:none;transition:var(--containerTransition);text-align:center;background-color:#444;width:32px;padding:5px 0}button svg{width:100%;height:100%}.controls{position:absolute;top:10px;right:10px;display:flex;align-items:center;transition:transform .2s;border-radius:8px;gap:10px}.controls.collapsed{transform:translate(calc(100% - 32px))}.controls.collapsed .collapse-button{transform:rotate(180deg)}.controls .controls-content{display:flex;gap:1px;align-items:center;border-radius:8px;overflow:hidden;background:#333c}.controls button:hover{background:#555}.zoom-slider{width:100px;margin:0 10px}"),this._toggleCollapseBtn=document.createElement("button"),this._toggleCollapseBtn.className="collapse-button",this._toggleCollapseBtn.innerHTML='<svg viewBox="-3.6 -3.6 31.2 31.2" stroke-width=".4"><path d="M15.707 4.293a1 1 0 0 1 0 1.414L9.414 12l6.293 6.293a1 1 0 0 1-1.414 1.414l-7-7a1 1 0 0 1 0-1.414l7-7a1 1 0 0 1 1.414 0Z" /></svg>',this._controlsPanel.appendChild(this._toggleCollapseBtn);const n=document.createElement("div");n.className="controls-content",this._toggleFullscreenBtn=document.createElement("button"),this._toggleFullscreenBtn.innerHTML=e,n.appendChild(this._toggleFullscreenBtn),this._zoomOutBtn=document.createElement("button"),this._zoomOutBtn.innerHTML='<svg viewBox="-1.2 -1.2 26.4 26.4"><path d="M6 12h12" stroke-width="2" stroke-linecap="round" /></svg>',n.appendChild(this._zoomOutBtn),this._zoomSlider=document.createElement("input"),this._zoomSlider.type="range",this._zoomSlider.className="zoom-slider",this._zoomSlider.min="-30",this._zoomSlider.max="30",this._zoomSlider.value="0",n.appendChild(this._zoomSlider),this._zoomInBtn=document.createElement("button"),this._zoomInBtn.innerHTML='<svg viewBox="-1.2 -1.2 26.4 26.4"><path d="M6 12h12m-6-6v12" stroke-width="2" stroke-linecap="round" /></svg>',n.appendChild(this._zoomInBtn),this._resetViewBtn=document.createElement("button"),this._resetViewBtn.innerHTML='<svg viewBox="-6 -6 30 30" stroke-width=".08"><path d="m14.955 7.986.116.01a1 1 0 0 1 .85 1.13 8 8 0 0 1-13.374 4.728l-.84.84c-.63.63-1.707.184-1.707-.707V10h3.987c.89 0 1.337 1.077.707 1.707l-.731.731a6 6 0 0 0 8.347-.264 6 6 0 0 0 1.63-3.33 1 1 0 0 1 1.131-.848zM11.514.813a8 8 0 0 1 1.942 1.336l.837-.837c.63-.63 1.707-.184 1.707.707V6h-3.981c-.89 0-1.337-1.077-.707-1.707l.728-.729a6 6 0 0 0-9.98 3.591 1 1 0 1 1-1.98-.281A8 8 0 0 1 11.514.813Z" /></svg>',n.appendChild(this._resetViewBtn),this._controlsPanel.appendChild(n),this.DM.data.container.appendChild(this._controlsPanel),this._toggleCollapseBtn.addEventListener("click",this.toggleCollapse),this._zoomInBtn.addEventListener("click",this.zoomIn),this._zoomOutBtn.addEventListener("click",this.zoomOut),this._zoomSlider.addEventListener("input",this.slide),this._resetViewBtn.addEventListener("click",this.DM.resetView),this._toggleFullscreenBtn.addEventListener("click",this.toggleFullscreen),this.onDispose(this.dispose)}toggleCollapse=()=>{this.collapsed=!this.collapsed,this.controlsPanel.classList.toggle("collapsed",this.collapsed),this.collapsed||this.updateSlider()};zoomIn=()=>this.DM.zoom(1.1,this.DM.middleViewer());zoomOut=()=>this.DM.zoom(1/1.1,this.DM.middleViewer());slide=()=>this.DM.zoomToScale(1.1**Number(this.zoomSlider.value),this.DM.middleViewer());updateFullscreenBtn=t=>{this.toggleFullscreenBtn.innerHTML=t?'<svg viewBox="-40.32 -40.32 176.64 176.64"><path d="M30 60H6a6 6 0 0 0 0 12h18v18a6 6 0 0 0 12 0V66a5.997 5.997 0 0 0-6-6Zm60 0H66a5.997 5.997 0 0 0-6 6v24a6 6 0 0 0 12 0V72h18a6 6 0 0 0 0-12ZM66 36h24a6 6 0 0 0 0-12H72V6a6 6 0 0 0-12 0v24a5.997 5.997 0 0 0 6 6ZM30 0a5.997 5.997 0 0 0-6 6v18H6a6 6 0 0 0 0 12h24a5.997 5.997 0 0 0 6-6V6a5.997 5.997 0 0 0-6-6Z"/></svg>':e};toggleFullscreen=()=>this.DM.shiftFullscreen("toggle");updateSlider=()=>{this.collapsed||(this.zoomSlider.value=String(this.scaleToSlider(this.DM.data.scale)))};scaleToSlider=t=>Math.log(t)/Math.log(1.1);dispose=()=>{this.toggleCollapseBtn.removeEventListener("click",this.toggleCollapse),this.zoomInBtn.removeEventListener("click",this.zoomIn),this.zoomOutBtn.removeEventListener("click",this.zoomOut),this.zoomSlider.removeEventListener("input",this.slide),this.resetViewBtn.removeEventListener("click",this.DM.resetView),this.toggleFullscreenBtn.removeEventListener("click",this.toggleFullscreen),this.controlsPanel.remove(),this._controlsPanel=null,this._toggleCollapseBtn=null,this._zoomInBtn=null,this._zoomOutBtn=null,this._zoomSlider=null,this._resetViewBtn=null,this._toggleFullscreenBtn=null}}class n extends t.BaseModule{_debugPanel=null;DM;get debugPanel(){if(!this._debugPanel)throw t.destroyError;return this._debugPanel}constructor(...e){super(...e),this.DM=this.container.get(t.DataManager),this.container.get(t.Controller).hooks.onRefresh.subscribe(this.update),this._debugPanel=document.createElement("div"),this._debugPanel.className="debug-panel";const i=this.DM.data.container;t.utilities.applyStyles(i,".debug-panel{position:absolute;bottom:12px;left:12px;background:#0006;border-radius:12px;padding:12px;-webkit-backdrop-filter:blur(8px) saturate(1.5);backdrop-filter:blur(8px) saturate(1.5);border:2px solid rgba(140,140,140,.75);color:#fff;font-size:calc(14px + .3vw);line-height:calc(17px + .3vw);pointer-events:none}"),i.appendChild(this._debugPanel),this.onDispose(this.dispose)}update=()=>{const e=t.utilities.round,i=this.DM.data;this.debugPanel.innerHTML=`<p>Scale: ${e(i.scale,3)}</p><p>Offset: ${e(i.offsetX,1)}, ${e(i.offsetY,1)}</p>`};dispose=()=>{this.debugPanel.remove(),this._debugPanel=null}}class o extends t.BaseModule{_minimapCtx=null;_viewportRectangle=null;_minimap=null;_minimapContainer=null;_toggleMinimapBtn=null;minimapCache={scale:1,centerX:0,centerY:0};DM;collapsed;get minimap(){if(null===this._minimap)throw t.destroyError;return this._minimap}get minimapCtx(){if(null===this._minimapCtx)throw t.destroyError;return this._minimapCtx}get viewportRectangle(){if(null===this._viewportRectangle)throw t.destroyError;return this._viewportRectangle}get minimapContainer(){if(null===this._minimapContainer)throw t.destroyError;return this._minimapContainer}get toggleMinimapBtn(){if(null===this._toggleMinimapBtn)throw t.destroyError;return this._toggleMinimapBtn}constructor(...e){super(...e),this.collapsed=this.options.minimapCollapsed||!1,this.container.get(t.Controller).hooks.onRefresh.subscribe(this.updateViewportRectangle),this.DM=this.container.get(t.DataManager),this._minimapContainer=document.createElement("div"),this._minimapContainer.className="minimap-container",t.utilities.applyStyles(this._minimapContainer,".collapse-button{border-radius:8px;transition:transform .2s}.collapse-button:hover{background:#444c}button{cursor:pointer;font-size:18px;height:32px;border:none;transition:var(--containerTransition);text-align:center;background-color:#444;width:32px;padding:5px 0}button svg{width:100%;height:100%}.minimap-container{position:absolute;bottom:10px;right:10px;display:flex;pointer-events:none;transition:transform .2s}.minimap-container.collapsed{transform:translate(calc(100% - 32px))}.toggle-minimap{margin:auto 10px 0 0;pointer-events:auto}.collapsed .toggle-minimap{transform:rotate(180deg)}.minimap{position:relative;width:200px;height:150px;overflow:hidden;border-radius:12px;background:#202020;-webkit-backdrop-filter:blur(8px) saturate(1.5);backdrop-filter:blur(8px) saturate(1.5);border:2px solid rgba(140,140,140,.75);transform-origin:0 0}.minimap .minimap-canvas{width:100%;height:100%}.minimap .viewport-rectangle{position:absolute;top:0;left:0;pointer-events:none;border:2px solid #fff;border-radius:6px;box-sizing:border-box;background:transparent}@container (max-width: 768px){.container .minimap{transform:scale(.6)}.container .toggle-minimap{transform:translateY(-60px)}.collapsed .container .toggle-minimap{transform:translateY(-60px) rotate(180deg)}.container .minimap-container{transform:translateY(60px) translate(80px)}.container .minimap-container.collapsed{transform:translateY(60px) translate(calc(100% - 32px))}}"),this._toggleMinimapBtn=document.createElement("button"),this._toggleMinimapBtn.className="toggle-minimap collapse-button",this._toggleMinimapBtn.innerHTML='<svg viewBox="-3.6 -3.6 31.2 31.2" stroke-width=".4"><path d="M15.707 4.293a1 1 0 0 1 0 1.414L9.414 12l6.293 6.293a1 1 0 0 1-1.414 1.414l-7-7a1 1 0 0 1 0-1.414l7-7a1 1 0 0 1 1.414 0Z" /></svg>',this._minimapContainer.appendChild(this._toggleMinimapBtn),this._minimap=document.createElement("div"),this._minimap.className="minimap";const i=document.createElement("canvas");i.className="minimap-canvas",i.width=200,i.height=150,this._minimap.appendChild(i),this._minimapCtx=i.getContext("2d"),this._viewportRectangle=document.createElement("div"),this._viewportRectangle.className="viewport-rectangle",this._minimap.appendChild(this._viewportRectangle),this._minimapContainer.appendChild(this._minimap),this.DM.data.container.appendChild(this._minimapContainer),this._minimapContainer.classList.toggle("collapsed",this.collapsed),this._toggleMinimapBtn.addEventListener("click",this.toggleCollapse),t.utilities.resizeCanvasForDPR(i,i.width,i.height),this.onStart(this.start),this.onDispose(this.dispose)}toggleCollapse=()=>{this.collapsed=!this.collapsed,this.minimapContainer.classList.toggle("collapsed",this.collapsed),this.collapsed||this.updateViewportRectangle()};start=()=>{const t=this.DM.data.nodeBounds;if(!t)return;const e=this.minimap.clientWidth,i=this.minimap.clientHeight,n=e/t.width,o=i/t.height;this.minimapCache.scale=.9*Math.min(n,o),this.minimapCache.centerX=e/2,this.minimapCache.centerY=i/2,this.minimapCtx.clearRect(0,0,e,i),this.minimapCtx.save(),this.minimapCtx.translate(this.minimapCache.centerX,this.minimapCache.centerY),this.minimapCtx.scale(this.minimapCache.scale,this.minimapCache.scale),this.minimapCtx.translate(-t.centerX,-t.centerY);const s=this.DM.data.canvasData;for(const r of s.edges)this.drawMinimapEdge(r);for(const r of s.nodes)this.drawMinimapNode(r);this.minimapCtx.restore()};drawMinimapNode=e=>{const i=t.utilities.getColor(e.color);this.minimapCtx.fillStyle=i.border,this.minimapCtx.globalAlpha=.3,t.utilities.drawRoundRect(this.minimapCtx,e.x,e.y,e.width,e.height,25),this.minimapCtx.fill(),this.minimapCtx.globalAlpha=1};drawMinimapEdge=e=>{const i=this.DM.data.nodeMap,n=i[e.fromNode],o=i[e.toNode];if(!n||!o)return;const[s,r]=t.utilities.getAnchorCoord(n,e.fromSide),[a,l]=t.utilities.getAnchorCoord(o,e.toSide);this.minimapCtx.beginPath(),this.minimapCtx.moveTo(s,r),this.minimapCtx.lineTo(a,l),this.minimapCtx.strokeStyle="#555",this.minimapCtx.lineWidth=10,this.minimapCtx.stroke()};updateViewportRectangle=()=>{if(this.collapsed)return;const t=this.DM.data.nodeBounds,e=this.DM.data.container,i=this.DM.data.scale;if(!t)return;const n=e.clientWidth/i,o=e.clientHeight/i,s=-this.DM.data.offsetX/i+e.clientWidth/(2*i),r=-this.DM.data.offsetY/i+e.clientHeight/(2*i),a=this.minimapCache.centerX+(s-n/2-t.centerX)*this.minimapCache.scale,l=this.minimapCache.centerY+(r-o/2-t.centerY)*this.minimapCache.scale,h=n*this.minimapCache.scale,p=o*this.minimapCache.scale;this.viewportRectangle.style.left=`${a}px`,this.viewportRectangle.style.top=`${l}px`,this.viewportRectangle.style.width=`${h}px`,this.viewportRectangle.style.height=`${p}px`};dispose=()=>{this.toggleMinimapBtn.removeEventListener("click",this.toggleCollapse),this.minimapCtx.clearRect(0,0,this.minimap.clientWidth,this.minimap.clientHeight),this.minimapContainer.remove(),this._minimapContainer=null,this._toggleMinimapBtn=null,this._viewportRectangle=null,this._minimap=null}}class s extends t.BaseModule{_preventionContainer=null;preventMt=!1;DM;preventMistouch={record:!1,lastX:0,lastY:0,initialX:0,initialY:0};get preventionContainer(){if(null===this._preventionContainer)throw t.destroyError;return this._preventionContainer}constructor(...e){super(...e);const i=Object.assign({preventAtStart:!0,labelText:"Click on to unlock."},this.options.mistouchPreventer||{}),n=document.createElement("div");n.className="prevention-banner",n.textContent=i.labelText,this.DM=this.container.get(t.DataManager),this._preventionContainer=document.createElement("div"),this._preventionContainer.className="prevention-container hidden",t.utilities.applyStyles(this._preventionContainer,".full,.prevention-container{top:0;left:0;width:100%;height:100%;position:absolute}.flex-center,.prevention-container{display:flex;justify-content:center;align-items:center}.prevention-container{overflow:visible;transition:background .2s,opacity .2s,box-shadow .2s,border .2s,filter .2s,backdrop-filter .2s}.prevention-container.hidden{pointer-events:none;opacity:0}.prevention-container .prevention-banner{background:#0006;border-radius:12px;padding:12px;margin:12px;-webkit-backdrop-filter:blur(8px) saturate(1.5);backdrop-filter:blur(8px) saturate(1.5);border:2px solid rgba(140,140,140,.75);color:#fff;font-size:calc(14px + .3vw);line-height:calc(17px + .3vw);text-align:center}"),this._preventionContainer.appendChild(n),this.DM.data.container.appendChild(this._preventionContainer),i.preventAtStart&&this.startPrevention(),window.addEventListener("pointerdown",this.onPointerDown),window.addEventListener("pointermove",this.onPointerMove),window.addEventListener("pointerup",this.onPointerUp),this.onDispose(this.dispose)}onPointerDown=t=>{const e=this.DM.data.container.getBoundingClientRect();t.clientX<e.left||t.clientX>e.right||t.clientY<e.top||t.clientY>e.bottom?this.preventMt||this.startPrevention():this.preventMt&&(this.preventMistouch.initialX=t.clientX,this.preventMistouch.initialY=t.clientY,this.preventMistouch.lastX=t.clientX,this.preventMistouch.lastY=t.clientY,this.preventMistouch.record=!0)};onPointerMove=t=>{this.preventMistouch.record&&(this.preventMistouch.lastX=t.clientX,this.preventMistouch.lastY=t.clientY)};onPointerUp=()=>{this.preventMistouch.record&&(this.preventMistouch.record=!1,Math.abs(this.preventMistouch.lastX-this.preventMistouch.initialX)+Math.abs(this.preventMistouch.lastY-this.preventMistouch.initialY)<5&&this.endPrevention())};startPrevention=()=>{this.preventionContainer.classList.remove("hidden"),this.DM.data.container.classList.add("numb"),this.preventMt=!0};endPrevention=()=>{this.preventMt=!1,this.preventionContainer.classList.add("hidden"),setTimeout(()=>this.DM.data.container.classList.remove("numb"),50)};dispose=()=>{window.removeEventListener("pointerdown",this.onPointerDown),window.removeEventListener("pointermove",this.onPointerMove),window.removeEventListener("pointerup",this.onPointerUp),this.preventionContainer.remove(),this._preventionContainer=null}}exports.Controls=i,exports.DebugPanel=n,exports.Minimap=o,exports.MistouchPreventer=s;
|
|
2
|
+
//# sourceMappingURL=modules.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modules.cjs","sources":["../src/modules/controls/index.ts","../src/modules/debugPanel/index.ts","../src/modules/minimap/index.ts","../src/modules/mistouchPreventer/index.ts"],"sourcesContent":["import { type BaseArgs, BaseModule } from '$/baseModule';\nimport Controller from '$/controller';\nimport DataManager from '$/dataManager';\nimport utilities, { destroyError } from '$/utilities';\nimport style from './styles.scss?inline';\n\ntype Options = {\n\tcontrolsCollapsed?: boolean;\n};\n\nconst resetIcon =\n\t'<svg viewBox=\"-6 -6 30 30\" stroke-width=\".08\"><path d=\"m14.955 7.986.116.01a1 1 0 0 1 .85 1.13 8 8 0 0 1-13.374 4.728l-.84.84c-.63.63-1.707.184-1.707-.707V10h3.987c.89 0 1.337 1.077.707 1.707l-.731.731a6 6 0 0 0 8.347-.264 6 6 0 0 0 1.63-3.33 1 1 0 0 1 1.131-.848zM11.514.813a8 8 0 0 1 1.942 1.336l.837-.837c.63-.63 1.707-.184 1.707.707V6h-3.981c-.89 0-1.337-1.077-.707-1.707l.728-.729a6 6 0 0 0-9.98 3.591 1 1 0 1 1-1.98-.281A8 8 0 0 1 11.514.813Z\" /></svg>';\nconst enterFullscreenIcon =\n\t'<svg viewBox=\"-5.28 -5.28 34.56 34.56\" fill=\"none\"><path d=\"M4 9V5.6c0-.56 0-.84.109-1.054a1 1 0 0 1 .437-.437C4.76 4 5.04 4 5.6 4H9M4 15v3.4c0 .56 0 .84.109 1.054a1 1 0 0 0 .437.437C4.76 20 5.04 20 5.6 20H9m6-16h3.4c.56 0 .84 0 1.054.109a1 1 0 0 1 .437.437C20 4.76 20 5.04 20 5.6V9m0 6v3.4c0 .56 0 .84-.109 1.054a1 1 0 0 1-.437.437C19.24 20 18.96 20 18.4 20H15\" stroke-width=\"2.4\" stroke-linecap=\"round\"/></svg>';\nconst exitFullscreenIcon =\n\t'<svg viewBox=\"-40.32 -40.32 176.64 176.64\"><path d=\"M30 60H6a6 6 0 0 0 0 12h18v18a6 6 0 0 0 12 0V66a5.997 5.997 0 0 0-6-6Zm60 0H66a5.997 5.997 0 0 0-6 6v24a6 6 0 0 0 12 0V72h18a6 6 0 0 0 0-12ZM66 36h24a6 6 0 0 0 0-12H72V6a6 6 0 0 0-12 0v24a5.997 5.997 0 0 0 6 6ZM30 0a5.997 5.997 0 0 0-6 6v18H6a6 6 0 0 0 0 12h24a5.997 5.997 0 0 0 6-6V6a5.997 5.997 0 0 0-6-6Z\"/></svg>';\nconst zoomInIcon =\n\t'<svg viewBox=\"-1.2 -1.2 26.4 26.4\"><path d=\"M6 12h12m-6-6v12\" stroke-width=\"2\" stroke-linecap=\"round\" /></svg>';\nconst zoomOutIcon =\n\t'<svg viewBox=\"-1.2 -1.2 26.4 26.4\"><path d=\"M6 12h12\" stroke-width=\"2\" stroke-linecap=\"round\" /></svg>';\nconst toggleCollapseIcon =\n\t'<svg viewBox=\"-3.6 -3.6 31.2 31.2\" stroke-width=\".4\"><path d=\"M15.707 4.293a1 1 0 0 1 0 1.414L9.414 12l6.293 6.293a1 1 0 0 1-1.414 1.414l-7-7a1 1 0 0 1 0-1.414l7-7a1 1 0 0 1 1.414 0Z\" /></svg>';\n\nexport default class Controls extends BaseModule<Options> {\n\tprivate _controlsPanel: HTMLDivElement | null = null;\n\tprivate _toggleCollapseBtn: HTMLButtonElement | null = null;\n\tprivate _toggleFullscreenBtn: HTMLButtonElement | null = null;\n\tprivate _zoomOutBtn: HTMLButtonElement | null = null;\n\tprivate _zoomSlider: HTMLInputElement | null = null;\n\tprivate _zoomInBtn: HTMLButtonElement | null = null;\n\tprivate _resetViewBtn: HTMLButtonElement | null = null;\n\tprivate DM: DataManager;\n\tprivate collapsed: boolean;\n\n\tprivate get controlsPanel() {\n\t\tif (this._controlsPanel === null) throw destroyError;\n\t\treturn this._controlsPanel;\n\t}\n\tprivate get toggleCollapseBtn() {\n\t\tif (this._toggleCollapseBtn === null) throw destroyError;\n\t\treturn this._toggleCollapseBtn;\n\t}\n\tprivate get toggleFullscreenBtn() {\n\t\tif (this._toggleFullscreenBtn === null) throw destroyError;\n\t\treturn this._toggleFullscreenBtn;\n\t}\n\tprivate get zoomOutBtn() {\n\t\tif (this._zoomOutBtn === null) throw destroyError;\n\t\treturn this._zoomOutBtn;\n\t}\n\tprivate get zoomSlider() {\n\t\tif (this._zoomSlider === null) throw destroyError;\n\t\treturn this._zoomSlider;\n\t}\n\tprivate get zoomInBtn() {\n\t\tif (this._zoomInBtn === null) throw destroyError;\n\t\treturn this._zoomInBtn;\n\t}\n\tprivate get resetViewBtn() {\n\t\tif (this._resetViewBtn === null) throw destroyError;\n\t\treturn this._resetViewBtn;\n\t}\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tthis.collapsed = this.options.controlsCollapsed || false;\n\t\tthis.DM = this.container.get(DataManager);\n\t\tthis.DM.onToggleFullscreen.subscribe(this.updateFullscreenBtn);\n\t\tthis.container.get(Controller).hooks.onRefresh.subscribe(this.updateSlider);\n\n\t\tthis._controlsPanel = document.createElement('div');\n\t\tthis._controlsPanel.className = 'controls';\n\t\tthis._controlsPanel.classList.toggle('collapsed', this.collapsed);\n\n\t\tutilities.applyStyles(this._controlsPanel, style);\n\n\t\tthis._toggleCollapseBtn = document.createElement('button');\n\t\tthis._toggleCollapseBtn.className = 'collapse-button';\n\t\tthis._toggleCollapseBtn.innerHTML = toggleCollapseIcon;\n\t\tthis._controlsPanel.appendChild(this._toggleCollapseBtn);\n\n\t\tconst controlsContent = document.createElement('div');\n\t\tcontrolsContent.className = 'controls-content';\n\n\t\tthis._toggleFullscreenBtn = document.createElement('button');\n\t\tthis._toggleFullscreenBtn.innerHTML = enterFullscreenIcon;\n\t\tcontrolsContent.appendChild(this._toggleFullscreenBtn);\n\n\t\tthis._zoomOutBtn = document.createElement('button');\n\t\tthis._zoomOutBtn.innerHTML = zoomOutIcon;\n\t\tcontrolsContent.appendChild(this._zoomOutBtn);\n\n\t\tthis._zoomSlider = document.createElement('input');\n\t\tthis._zoomSlider.type = 'range';\n\t\tthis._zoomSlider.className = 'zoom-slider';\n\t\tthis._zoomSlider.min = '-30';\n\t\tthis._zoomSlider.max = '30';\n\t\tthis._zoomSlider.value = '0';\n\t\tcontrolsContent.appendChild(this._zoomSlider);\n\n\t\tthis._zoomInBtn = document.createElement('button');\n\t\tthis._zoomInBtn.innerHTML = zoomInIcon;\n\t\tcontrolsContent.appendChild(this._zoomInBtn);\n\n\t\tthis._resetViewBtn = document.createElement('button');\n\t\tthis._resetViewBtn.innerHTML = resetIcon;\n\t\tcontrolsContent.appendChild(this._resetViewBtn);\n\n\t\tthis._controlsPanel.appendChild(controlsContent);\n\n\t\tthis.DM.data.container.appendChild(this._controlsPanel);\n\n\t\tthis._toggleCollapseBtn.addEventListener('click', this.toggleCollapse);\n\t\tthis._zoomInBtn.addEventListener('click', this.zoomIn);\n\t\tthis._zoomOutBtn.addEventListener('click', this.zoomOut);\n\t\tthis._zoomSlider.addEventListener('input', this.slide);\n\t\tthis._resetViewBtn.addEventListener('click', this.DM.resetView);\n\t\tthis._toggleFullscreenBtn.addEventListener('click', this.toggleFullscreen);\n\n\t\tthis.onDispose(this.dispose);\n\t}\n\ttoggleCollapse = () => {\n\t\tthis.collapsed = !this.collapsed;\n\t\tthis.controlsPanel.classList.toggle('collapsed', this.collapsed);\n\t\tif (!this.collapsed) this.updateSlider();\n\t};\n\tprivate zoomIn = () => this.DM.zoom(1.1, this.DM.middleViewer());\n\tprivate zoomOut = () => this.DM.zoom(1 / 1.1, this.DM.middleViewer());\n\tprivate slide = () => this.DM.zoomToScale(1.1 ** Number(this.zoomSlider.value), this.DM.middleViewer());\n\n\tprivate updateFullscreenBtn = (enter: boolean) => {\n\t\tif (enter) this.toggleFullscreenBtn.innerHTML = exitFullscreenIcon;\n\t\telse this.toggleFullscreenBtn.innerHTML = enterFullscreenIcon;\n\t};\n\tprivate toggleFullscreen = () => this.DM.shiftFullscreen('toggle');\n\n\tprivate updateSlider = () => {\n\t\tif (this.collapsed) return;\n\t\tthis.zoomSlider.value = String(this.scaleToSlider(this.DM.data.scale));\n\t};\n\tprivate scaleToSlider = (scale: number) => Math.log(scale) / Math.log(1.1);\n\n\tprivate dispose = () => {\n\t\tthis.toggleCollapseBtn.removeEventListener('click', this.toggleCollapse);\n\t\tthis.zoomInBtn.removeEventListener('click', this.zoomIn);\n\t\tthis.zoomOutBtn.removeEventListener('click', this.zoomOut);\n\t\tthis.zoomSlider.removeEventListener('input', this.slide);\n\t\tthis.resetViewBtn.removeEventListener('click', this.DM.resetView);\n\t\tthis.toggleFullscreenBtn.removeEventListener('click', this.toggleFullscreen);\n\t\tthis.controlsPanel.remove();\n\t\tthis._controlsPanel = null;\n\t\tthis._toggleCollapseBtn = null;\n\t\tthis._zoomInBtn = null;\n\t\tthis._zoomOutBtn = null;\n\t\tthis._zoomSlider = null;\n\t\tthis._resetViewBtn = null;\n\t\tthis._toggleFullscreenBtn = null;\n\t};\n}\n","import { type BaseArgs, BaseModule } from '$/baseModule';\nimport Controller from '$/controller';\nimport DataManager from '$/dataManager';\nimport utilities, { destroyError } from '$/utilities';\nimport style from './styles.scss?inline';\n\nexport default class DebugPanel extends BaseModule {\n\tprivate _debugPanel: HTMLDivElement | null = null;\n\tprivate DM: DataManager;\n\n\tprivate get debugPanel() {\n\t\tif (!this._debugPanel) throw destroyError;\n\t\treturn this._debugPanel;\n\t}\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tthis.DM = this.container.get(DataManager);\n\t\tthis.container.get(Controller).hooks.onRefresh.subscribe(this.update);\n\t\tthis._debugPanel = document.createElement('div');\n\t\tthis._debugPanel.className = 'debug-panel';\n\t\tconst HTMLContainer = this.DM.data.container;\n\t\tutilities.applyStyles(HTMLContainer, style);\n\t\tHTMLContainer.appendChild(this._debugPanel);\n\t\tthis.onDispose(this.dispose);\n\t}\n\n\tprivate update = () => {\n\t\tconst round = utilities.round;\n\t\tconst data = this.DM.data;\n\t\tthis.debugPanel.innerHTML = `<p>Scale: ${round(data.scale, 3)}</p><p>Offset: ${round(data.offsetX, 1)}, ${round(data.offsetY, 1)}</p>`;\n\t};\n\n\tprivate dispose = () => {\n\t\tthis.debugPanel.remove();\n\t\tthis._debugPanel = null;\n\t};\n}\n","import { type BaseArgs, BaseModule } from '$/baseModule';\nimport Controller from '$/controller';\nimport DataManager from '$/dataManager';\nimport utilities, { destroyError } from '$/utilities';\nimport style from './styles.scss?inline';\n\ntype Options = {\n\tminimapCollapsed?: boolean;\n};\n\nconst toggleCollapseIcon =\n\t'<svg viewBox=\"-3.6 -3.6 31.2 31.2\" stroke-width=\".4\"><path d=\"M15.707 4.293a1 1 0 0 1 0 1.414L9.414 12l6.293 6.293a1 1 0 0 1-1.414 1.414l-7-7a1 1 0 0 1 0-1.414l7-7a1 1 0 0 1 1.414 0Z\" /></svg>';\n\nexport default class Minimap extends BaseModule<Options> {\n\tprivate _minimapCtx: CanvasRenderingContext2D | null = null;\n\tprivate _viewportRectangle: HTMLDivElement | null = null;\n\tprivate _minimap: HTMLDivElement | null = null;\n\tprivate _minimapContainer: HTMLDivElement | null = null;\n\tprivate _toggleMinimapBtn: HTMLButtonElement | null = null;\n\tprivate minimapCache: { scale: number; centerX: number; centerY: number } = {\n\t\tscale: 1,\n\t\tcenterX: 0,\n\t\tcenterY: 0,\n\t};\n\tprivate DM: DataManager;\n\tprivate collapsed: boolean;\n\n\tprivate get minimap() {\n\t\tif (this._minimap === null) throw destroyError;\n\t\treturn this._minimap;\n\t}\n\tprivate get minimapCtx() {\n\t\tif (this._minimapCtx === null) throw destroyError;\n\t\treturn this._minimapCtx;\n\t}\n\tprivate get viewportRectangle() {\n\t\tif (this._viewportRectangle === null) throw destroyError;\n\t\treturn this._viewportRectangle;\n\t}\n\tprivate get minimapContainer() {\n\t\tif (this._minimapContainer === null) throw destroyError;\n\t\treturn this._minimapContainer;\n\t}\n\tprivate get toggleMinimapBtn() {\n\t\tif (this._toggleMinimapBtn === null) throw destroyError;\n\t\treturn this._toggleMinimapBtn;\n\t}\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tthis.collapsed = this.options.minimapCollapsed || false;\n\t\tthis.container.get(Controller).hooks.onRefresh.subscribe(this.updateViewportRectangle);\n\t\tthis.DM = this.container.get(DataManager);\n\n\t\tthis._minimapContainer = document.createElement('div');\n\t\tthis._minimapContainer.className = 'minimap-container';\n\n\t\tutilities.applyStyles(this._minimapContainer, style);\n\n\t\tthis._toggleMinimapBtn = document.createElement('button');\n\t\tthis._toggleMinimapBtn.className = 'toggle-minimap collapse-button';\n\t\tthis._toggleMinimapBtn.innerHTML = toggleCollapseIcon;\n\t\tthis._minimapContainer.appendChild(this._toggleMinimapBtn);\n\n\t\tthis._minimap = document.createElement('div');\n\t\tthis._minimap.className = 'minimap';\n\t\tconst minimapCanvas = document.createElement('canvas');\n\t\tminimapCanvas.className = 'minimap-canvas';\n\t\tminimapCanvas.width = 200;\n\t\tminimapCanvas.height = 150;\n\n\t\tthis._minimap.appendChild(minimapCanvas);\n\t\tthis._minimapCtx = minimapCanvas.getContext('2d') as CanvasRenderingContext2D;\n\t\tthis._viewportRectangle = document.createElement('div');\n\t\tthis._viewportRectangle.className = 'viewport-rectangle';\n\t\tthis._minimap.appendChild(this._viewportRectangle);\n\t\tthis._minimapContainer.appendChild(this._minimap);\n\n\t\tthis.DM.data.container.appendChild(this._minimapContainer);\n\n\t\tthis._minimapContainer.classList.toggle('collapsed', this.collapsed);\n\n\t\tthis._toggleMinimapBtn.addEventListener('click', this.toggleCollapse);\n\t\tutilities.resizeCanvasForDPR(minimapCanvas, minimapCanvas.width, minimapCanvas.height);\n\n\t\tthis.onStart(this.start);\n\t\tthis.onDispose(this.dispose);\n\t}\n\n\ttoggleCollapse = () => {\n\t\tthis.collapsed = !this.collapsed;\n\t\tthis.minimapContainer.classList.toggle('collapsed', this.collapsed);\n\t\tif (!this.collapsed) this.updateViewportRectangle();\n\t};\n\n\tprivate start = () => {\n\t\tconst bounds = this.DM.data.nodeBounds;\n\t\tif (!bounds) return;\n\t\tconst displayWidth = this.minimap.clientWidth;\n\t\tconst displayHeight = this.minimap.clientHeight;\n\t\tconst scaleX = displayWidth / bounds.width;\n\t\tconst scaleY = displayHeight / bounds.height;\n\t\tthis.minimapCache.scale = Math.min(scaleX, scaleY) * 0.9;\n\t\tthis.minimapCache.centerX = displayWidth / 2;\n\t\tthis.minimapCache.centerY = displayHeight / 2;\n\t\tthis.minimapCtx.clearRect(0, 0, displayWidth, displayHeight);\n\t\tthis.minimapCtx.save();\n\t\tthis.minimapCtx.translate(this.minimapCache.centerX, this.minimapCache.centerY);\n\t\tthis.minimapCtx.scale(this.minimapCache.scale, this.minimapCache.scale);\n\t\tthis.minimapCtx.translate(-bounds.centerX, -bounds.centerY);\n\t\tconst canvasData = this.DM.data.canvasData;\n\t\tfor (const edge of canvasData.edges) this.drawMinimapEdge(edge);\n\t\tfor (const node of canvasData.nodes) this.drawMinimapNode(node);\n\t\tthis.minimapCtx.restore();\n\t};\n\n\tprivate drawMinimapNode = (node: JSONCanvasNode) => {\n\t\tconst colors = utilities.getColor(node.color);\n\t\tconst radius = 25;\n\t\tthis.minimapCtx.fillStyle = colors.border;\n\t\tthis.minimapCtx.globalAlpha = 0.3;\n\t\tutilities.drawRoundRect(this.minimapCtx, node.x, node.y, node.width, node.height, radius);\n\t\tthis.minimapCtx.fill();\n\t\tthis.minimapCtx.globalAlpha = 1.0;\n\t};\n\n\tprivate drawMinimapEdge = (edge: JSONCanvasEdge) => {\n\t\tconst nodeMap = this.DM.data.nodeMap;\n\t\tconst fromNode = nodeMap[edge.fromNode];\n\t\tconst toNode = nodeMap[edge.toNode];\n\t\tif (!fromNode || !toNode) return;\n\t\tconst [startX, startY] = utilities.getAnchorCoord(fromNode, edge.fromSide);\n\t\tconst [endX, endY] = utilities.getAnchorCoord(toNode, edge.toSide);\n\t\tthis.minimapCtx.beginPath();\n\t\tthis.minimapCtx.moveTo(startX, startY);\n\t\tthis.minimapCtx.lineTo(endX, endY);\n\t\tthis.minimapCtx.strokeStyle = '#555';\n\t\tthis.minimapCtx.lineWidth = 10;\n\t\tthis.minimapCtx.stroke();\n\t};\n\n\tprivate updateViewportRectangle = () => {\n\t\tif (this.collapsed) return;\n\t\tconst bounds = this.DM.data.nodeBounds;\n\t\tconst container = this.DM.data.container;\n\t\tconst scale = this.DM.data.scale;\n\t\tif (!bounds) return;\n\t\tconst viewWidth = container.clientWidth / scale;\n\t\tconst viewHeight = container.clientHeight / scale;\n\t\tconst viewportCenterX = -this.DM.data.offsetX / scale + container.clientWidth / (2 * scale);\n\t\tconst viewportCenterY = -this.DM.data.offsetY / scale + container.clientHeight / (2 * scale);\n\t\tconst viewRectX =\n\t\t\tthis.minimapCache.centerX +\n\t\t\t(viewportCenterX - viewWidth / 2 - bounds.centerX) * this.minimapCache.scale;\n\t\tconst viewRectY =\n\t\t\tthis.minimapCache.centerY +\n\t\t\t(viewportCenterY - viewHeight / 2 - bounds.centerY) * this.minimapCache.scale;\n\t\tconst viewRectWidth = viewWidth * this.minimapCache.scale;\n\t\tconst viewRectHeight = viewHeight * this.minimapCache.scale;\n\t\tthis.viewportRectangle.style.left = `${viewRectX}px`;\n\t\tthis.viewportRectangle.style.top = `${viewRectY}px`;\n\t\tthis.viewportRectangle.style.width = `${viewRectWidth}px`;\n\t\tthis.viewportRectangle.style.height = `${viewRectHeight}px`;\n\t};\n\n\tprivate dispose = () => {\n\t\tthis.toggleMinimapBtn.removeEventListener('click', this.toggleCollapse);\n\t\tthis.minimapCtx.clearRect(0, 0, this.minimap.clientWidth, this.minimap.clientHeight);\n\t\tthis.minimapContainer.remove();\n\t\tthis._minimapContainer = null;\n\t\tthis._toggleMinimapBtn = null;\n\t\tthis._viewportRectangle = null;\n\t\tthis._minimap = null;\n\t};\n}\n","import { type BaseArgs, BaseModule } from '$/baseModule';\nimport DataManager from '$/dataManager';\nimport utilities, { destroyError } from '$/utilities';\nimport style from './styles.scss?inline';\n\ntype Options = {\n\tmistouchPreventer?: {\n\t\tpreventAtStart?: boolean;\n\t\tlabelText?: string;\n\t};\n};\n\nexport default class MistouchPreventer extends BaseModule<Options> {\n\tprivate _preventionContainer: HTMLDivElement | null = null;\n\tprivate preventMt: boolean = false;\n\tprivate DM: DataManager;\n\tprivate preventMistouch: {\n\t\trecord: boolean;\n\t\tlastX: number;\n\t\tlastY: number;\n\t\tinitialX: number;\n\t\tinitialY: number;\n\t} = {\n\t\trecord: false,\n\t\tlastX: 0,\n\t\tlastY: 0,\n\t\tinitialX: 0,\n\t\tinitialY: 0,\n\t};\n\n\tprivate get preventionContainer() {\n\t\tif (this._preventionContainer === null) throw destroyError;\n\t\treturn this._preventionContainer;\n\t}\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tconst options = Object.assign(\n\t\t\t{\n\t\t\t\tpreventAtStart: true,\n\t\t\t\tlabelText: 'Click on to unlock.',\n\t\t\t},\n\t\t\tthis.options.mistouchPreventer || {},\n\t\t);\n\n\t\tconst preventionBanner = document.createElement('div');\n\t\tpreventionBanner.className = 'prevention-banner';\n\t\tpreventionBanner.textContent = options.labelText;\n\t\tthis.DM = this.container.get(DataManager);\n\t\tthis._preventionContainer = document.createElement('div');\n\t\tthis._preventionContainer.className = 'prevention-container hidden';\n\n\t\tutilities.applyStyles(this._preventionContainer, style);\n\t\tthis._preventionContainer.appendChild(preventionBanner);\n\t\tthis.DM.data.container.appendChild(this._preventionContainer);\n\n\t\tif (options.preventAtStart) this.startPrevention();\n\n\t\twindow.addEventListener('pointerdown', this.onPointerDown);\n\t\twindow.addEventListener('pointermove', this.onPointerMove);\n\t\twindow.addEventListener('pointerup', this.onPointerUp);\n\n\t\tthis.onDispose(this.dispose);\n\t}\n\n\tprivate onPointerDown = (e: PointerEvent) => {\n\t\tconst bounds = this.DM.data.container.getBoundingClientRect();\n\t\tif (\n\t\t\te.clientX < bounds.left ||\n\t\t\te.clientX > bounds.right ||\n\t\t\te.clientY < bounds.top ||\n\t\t\te.clientY > bounds.bottom\n\t\t) {\n\t\t\tif (!this.preventMt) this.startPrevention();\n\t\t} else if (this.preventMt) {\n\t\t\tthis.preventMistouch.initialX = e.clientX;\n\t\t\tthis.preventMistouch.initialY = e.clientY;\n\t\t\tthis.preventMistouch.lastX = e.clientX;\n\t\t\tthis.preventMistouch.lastY = e.clientY;\n\t\t\tthis.preventMistouch.record = true;\n\t\t}\n\t};\n\n\tprivate onPointerMove = (e: PointerEvent) => {\n\t\tif (this.preventMistouch.record) {\n\t\t\tthis.preventMistouch.lastX = e.clientX;\n\t\t\tthis.preventMistouch.lastY = e.clientY;\n\t\t}\n\t};\n\n\tprivate onPointerUp = () => {\n\t\tif (this.preventMistouch.record) {\n\t\t\tthis.preventMistouch.record = false;\n\t\t\tif (\n\t\t\t\tMath.abs(this.preventMistouch.lastX - this.preventMistouch.initialX) +\n\t\t\t\t\tMath.abs(this.preventMistouch.lastY - this.preventMistouch.initialY) <\n\t\t\t\t5\n\t\t\t)\n\t\t\t\tthis.endPrevention();\n\t\t}\n\t};\n\n\tstartPrevention = () => {\n\t\tthis.preventionContainer.classList.remove('hidden');\n\t\tthis.DM.data.container.classList.add('numb');\n\t\tthis.preventMt = true;\n\t};\n\n\tendPrevention = () => {\n\t\tthis.preventMt = false;\n\t\tthis.preventionContainer.classList.add('hidden');\n\t\tsetTimeout(() => this.DM.data.container.classList.remove('numb'), 50); // minimum delay to prevent triggering undesired button touch\n\t};\n\n\tprivate dispose = () => {\n\t\twindow.removeEventListener('pointerdown', this.onPointerDown);\n\t\twindow.removeEventListener('pointermove', this.onPointerMove);\n\t\twindow.removeEventListener('pointerup', this.onPointerUp);\n\t\tthis.preventionContainer.remove();\n\t\tthis._preventionContainer = null;\n\t};\n}\n"],"names":["enterFullscreenIcon","Controls","BaseModule","_controlsPanel","_toggleCollapseBtn","_toggleFullscreenBtn","_zoomOutBtn","_zoomSlider","_zoomInBtn","_resetViewBtn","DM","collapsed","controlsPanel","this","destroyError","toggleCollapseBtn","toggleFullscreenBtn","zoomOutBtn","zoomSlider","zoomInBtn","resetViewBtn","constructor","args","super","options","controlsCollapsed","container","get","DataManager","onToggleFullscreen","subscribe","updateFullscreenBtn","Controller","hooks","onRefresh","updateSlider","document","createElement","className","classList","toggle","utilities","applyStyles","innerHTML","appendChild","controlsContent","type","min","max","value","data","addEventListener","toggleCollapse","zoomIn","zoomOut","slide","resetView","toggleFullscreen","onDispose","dispose","zoom","middleViewer","zoomToScale","Number","enter","shiftFullscreen","String","scaleToSlider","scale","Math","log","removeEventListener","remove","DebugPanel","_debugPanel","debugPanel","update","HTMLContainer","round","offsetX","offsetY","Minimap","_minimapCtx","_viewportRectangle","_minimap","_minimapContainer","_toggleMinimapBtn","minimapCache","centerX","centerY","minimap","minimapCtx","viewportRectangle","minimapContainer","toggleMinimapBtn","minimapCollapsed","updateViewportRectangle","minimapCanvas","width","height","getContext","resizeCanvasForDPR","onStart","start","bounds","nodeBounds","displayWidth","clientWidth","displayHeight","clientHeight","scaleX","scaleY","clearRect","save","translate","canvasData","edge","edges","drawMinimapEdge","node","nodes","drawMinimapNode","restore","colors","getColor","color","fillStyle","border","globalAlpha","drawRoundRect","x","y","fill","nodeMap","fromNode","toNode","startX","startY","getAnchorCoord","fromSide","endX","endY","toSide","beginPath","moveTo","lineTo","strokeStyle","lineWidth","stroke","viewWidth","viewHeight","viewportCenterX","viewportCenterY","viewRectX","viewRectY","viewRectWidth","viewRectHeight","style","left","top","MistouchPreventer","_preventionContainer","preventMt","preventMistouch","record","lastX","lastY","initialX","initialY","preventionContainer","Object","assign","preventAtStart","labelText","mistouchPreventer","preventionBanner","textContent","startPrevention","window","onPointerDown","onPointerMove","onPointerUp","e","getBoundingClientRect","clientX","right","clientY","bottom","abs","endPrevention","add","setTimeout"],"mappings":"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"}
|
package/dist/modules.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{B as t,d as e,D as i,C as n,u as o}from"./controller-siZ5v-SD.js";const s='<svg viewBox="-5.28 -5.28 34.56 34.56" fill="none"><path d="M4 9V5.6c0-.56 0-.84.109-1.054a1 1 0 0 1 .437-.437C4.76 4 5.04 4 5.6 4H9M4 15v3.4c0 .56 0 .84.109 1.054a1 1 0 0 0 .437.437C4.76 20 5.04 20 5.6 20H9m6-16h3.4c.56 0 .84 0 1.054.109a1 1 0 0 1 .437.437C20 4.76 20 5.04 20 5.6V9m0 6v3.4c0 .56 0 .84-.109 1.054a1 1 0 0 1-.437.437C19.24 20 18.96 20 18.4 20H15" stroke-width="2.4" stroke-linecap="round"/></svg>';class a extends t{_controlsPanel=null;_toggleCollapseBtn=null;_toggleFullscreenBtn=null;_zoomOutBtn=null;_zoomSlider=null;_zoomInBtn=null;_resetViewBtn=null;DM;collapsed;get controlsPanel(){if(null===this._controlsPanel)throw e;return this._controlsPanel}get toggleCollapseBtn(){if(null===this._toggleCollapseBtn)throw e;return this._toggleCollapseBtn}get toggleFullscreenBtn(){if(null===this._toggleFullscreenBtn)throw e;return this._toggleFullscreenBtn}get zoomOutBtn(){if(null===this._zoomOutBtn)throw e;return this._zoomOutBtn}get zoomSlider(){if(null===this._zoomSlider)throw e;return this._zoomSlider}get zoomInBtn(){if(null===this._zoomInBtn)throw e;return this._zoomInBtn}get resetViewBtn(){if(null===this._resetViewBtn)throw e;return this._resetViewBtn}constructor(...t){super(...t),this.collapsed=this.options.controlsCollapsed||!1,this.DM=this.container.get(i),this.DM.onToggleFullscreen.subscribe(this.updateFullscreenBtn),this.container.get(n).hooks.onRefresh.subscribe(this.updateSlider),this._controlsPanel=document.createElement("div"),this._controlsPanel.className="controls",this._controlsPanel.classList.toggle("collapsed",this.collapsed),o.applyStyles(this._controlsPanel,".collapse-button{border-radius:8px;transition:transform .2s}.collapse-button:hover{background:#444c}button{cursor:pointer;font-size:18px;height:32px;border:none;transition:var(--containerTransition);text-align:center;background-color:#444;width:32px;padding:5px 0}button svg{width:100%;height:100%}.controls{position:absolute;top:10px;right:10px;display:flex;align-items:center;transition:transform .2s;border-radius:8px;gap:10px}.controls.collapsed{transform:translate(calc(100% - 32px))}.controls.collapsed .collapse-button{transform:rotate(180deg)}.controls .controls-content{display:flex;gap:1px;align-items:center;border-radius:8px;overflow:hidden;background:#333c}.controls button:hover{background:#555}.zoom-slider{width:100px;margin:0 10px}"),this._toggleCollapseBtn=document.createElement("button"),this._toggleCollapseBtn.className="collapse-button",this._toggleCollapseBtn.innerHTML='<svg viewBox="-3.6 -3.6 31.2 31.2" stroke-width=".4"><path d="M15.707 4.293a1 1 0 0 1 0 1.414L9.414 12l6.293 6.293a1 1 0 0 1-1.414 1.414l-7-7a1 1 0 0 1 0-1.414l7-7a1 1 0 0 1 1.414 0Z" /></svg>',this._controlsPanel.appendChild(this._toggleCollapseBtn);const e=document.createElement("div");e.className="controls-content",this._toggleFullscreenBtn=document.createElement("button"),this._toggleFullscreenBtn.innerHTML=s,e.appendChild(this._toggleFullscreenBtn),this._zoomOutBtn=document.createElement("button"),this._zoomOutBtn.innerHTML='<svg viewBox="-1.2 -1.2 26.4 26.4"><path d="M6 12h12" stroke-width="2" stroke-linecap="round" /></svg>',e.appendChild(this._zoomOutBtn),this._zoomSlider=document.createElement("input"),this._zoomSlider.type="range",this._zoomSlider.className="zoom-slider",this._zoomSlider.min="-30",this._zoomSlider.max="30",this._zoomSlider.value="0",e.appendChild(this._zoomSlider),this._zoomInBtn=document.createElement("button"),this._zoomInBtn.innerHTML='<svg viewBox="-1.2 -1.2 26.4 26.4"><path d="M6 12h12m-6-6v12" stroke-width="2" stroke-linecap="round" /></svg>',e.appendChild(this._zoomInBtn),this._resetViewBtn=document.createElement("button"),this._resetViewBtn.innerHTML='<svg viewBox="-6 -6 30 30" stroke-width=".08"><path d="m14.955 7.986.116.01a1 1 0 0 1 .85 1.13 8 8 0 0 1-13.374 4.728l-.84.84c-.63.63-1.707.184-1.707-.707V10h3.987c.89 0 1.337 1.077.707 1.707l-.731.731a6 6 0 0 0 8.347-.264 6 6 0 0 0 1.63-3.33 1 1 0 0 1 1.131-.848zM11.514.813a8 8 0 0 1 1.942 1.336l.837-.837c.63-.63 1.707-.184 1.707.707V6h-3.981c-.89 0-1.337-1.077-.707-1.707l.728-.729a6 6 0 0 0-9.98 3.591 1 1 0 1 1-1.98-.281A8 8 0 0 1 11.514.813Z" /></svg>',e.appendChild(this._resetViewBtn),this._controlsPanel.appendChild(e),this.DM.data.container.appendChild(this._controlsPanel),this._toggleCollapseBtn.addEventListener("click",this.toggleCollapse),this._zoomInBtn.addEventListener("click",this.zoomIn),this._zoomOutBtn.addEventListener("click",this.zoomOut),this._zoomSlider.addEventListener("input",this.slide),this._resetViewBtn.addEventListener("click",this.DM.resetView),this._toggleFullscreenBtn.addEventListener("click",this.toggleFullscreen),this.onDispose(this.dispose)}toggleCollapse=()=>{this.collapsed=!this.collapsed,this.controlsPanel.classList.toggle("collapsed",this.collapsed),this.collapsed||this.updateSlider()};zoomIn=()=>this.DM.zoom(1.1,this.DM.middleViewer());zoomOut=()=>this.DM.zoom(1/1.1,this.DM.middleViewer());slide=()=>this.DM.zoomToScale(1.1**Number(this.zoomSlider.value),this.DM.middleViewer());updateFullscreenBtn=t=>{this.toggleFullscreenBtn.innerHTML=t?'<svg viewBox="-40.32 -40.32 176.64 176.64"><path d="M30 60H6a6 6 0 0 0 0 12h18v18a6 6 0 0 0 12 0V66a5.997 5.997 0 0 0-6-6Zm60 0H66a5.997 5.997 0 0 0-6 6v24a6 6 0 0 0 12 0V72h18a6 6 0 0 0 0-12ZM66 36h24a6 6 0 0 0 0-12H72V6a6 6 0 0 0-12 0v24a5.997 5.997 0 0 0 6 6ZM30 0a5.997 5.997 0 0 0-6 6v18H6a6 6 0 0 0 0 12h24a5.997 5.997 0 0 0 6-6V6a5.997 5.997 0 0 0-6-6Z"/></svg>':s};toggleFullscreen=()=>this.DM.shiftFullscreen("toggle");updateSlider=()=>{this.collapsed||(this.zoomSlider.value=String(this.scaleToSlider(this.DM.data.scale)))};scaleToSlider=t=>Math.log(t)/Math.log(1.1);dispose=()=>{this.toggleCollapseBtn.removeEventListener("click",this.toggleCollapse),this.zoomInBtn.removeEventListener("click",this.zoomIn),this.zoomOutBtn.removeEventListener("click",this.zoomOut),this.zoomSlider.removeEventListener("input",this.slide),this.resetViewBtn.removeEventListener("click",this.DM.resetView),this.toggleFullscreenBtn.removeEventListener("click",this.toggleFullscreen),this.controlsPanel.remove(),this._controlsPanel=null,this._toggleCollapseBtn=null,this._zoomInBtn=null,this._zoomOutBtn=null,this._zoomSlider=null,this._resetViewBtn=null,this._toggleFullscreenBtn=null}}class l extends t{_debugPanel=null;DM;get debugPanel(){if(!this._debugPanel)throw e;return this._debugPanel}constructor(...t){super(...t),this.DM=this.container.get(i),this.container.get(n).hooks.onRefresh.subscribe(this.update),this._debugPanel=document.createElement("div"),this._debugPanel.className="debug-panel";const e=this.DM.data.container;o.applyStyles(e,".debug-panel{position:absolute;bottom:12px;left:12px;background:#0006;border-radius:12px;padding:12px;-webkit-backdrop-filter:blur(8px) saturate(1.5);backdrop-filter:blur(8px) saturate(1.5);border:2px solid rgba(140,140,140,.75);color:#fff;font-size:calc(14px + .3vw);line-height:calc(17px + .3vw);pointer-events:none}"),e.appendChild(this._debugPanel),this.onDispose(this.dispose)}update=()=>{const t=o.round,e=this.DM.data;this.debugPanel.innerHTML=`<p>Scale: ${t(e.scale,3)}</p><p>Offset: ${t(e.offsetX,1)}, ${t(e.offsetY,1)}</p>`};dispose=()=>{this.debugPanel.remove(),this._debugPanel=null}}class r extends t{_minimapCtx=null;_viewportRectangle=null;_minimap=null;_minimapContainer=null;_toggleMinimapBtn=null;minimapCache={scale:1,centerX:0,centerY:0};DM;collapsed;get minimap(){if(null===this._minimap)throw e;return this._minimap}get minimapCtx(){if(null===this._minimapCtx)throw e;return this._minimapCtx}get viewportRectangle(){if(null===this._viewportRectangle)throw e;return this._viewportRectangle}get minimapContainer(){if(null===this._minimapContainer)throw e;return this._minimapContainer}get toggleMinimapBtn(){if(null===this._toggleMinimapBtn)throw e;return this._toggleMinimapBtn}constructor(...t){super(...t),this.collapsed=this.options.minimapCollapsed||!1,this.container.get(n).hooks.onRefresh.subscribe(this.updateViewportRectangle),this.DM=this.container.get(i),this._minimapContainer=document.createElement("div"),this._minimapContainer.className="minimap-container",o.applyStyles(this._minimapContainer,".collapse-button{border-radius:8px;transition:transform .2s}.collapse-button:hover{background:#444c}button{cursor:pointer;font-size:18px;height:32px;border:none;transition:var(--containerTransition);text-align:center;background-color:#444;width:32px;padding:5px 0}button svg{width:100%;height:100%}.minimap-container{position:absolute;bottom:10px;right:10px;display:flex;pointer-events:none;transition:transform .2s}.minimap-container.collapsed{transform:translate(calc(100% - 32px))}.toggle-minimap{margin:auto 10px 0 0;pointer-events:auto}.collapsed .toggle-minimap{transform:rotate(180deg)}.minimap{position:relative;width:200px;height:150px;overflow:hidden;border-radius:12px;background:#202020;-webkit-backdrop-filter:blur(8px) saturate(1.5);backdrop-filter:blur(8px) saturate(1.5);border:2px solid rgba(140,140,140,.75);transform-origin:0 0}.minimap .minimap-canvas{width:100%;height:100%}.minimap .viewport-rectangle{position:absolute;top:0;left:0;pointer-events:none;border:2px solid #fff;border-radius:6px;box-sizing:border-box;background:transparent}@container (max-width: 768px){.container .minimap{transform:scale(.6)}.container .toggle-minimap{transform:translateY(-60px)}.collapsed .container .toggle-minimap{transform:translateY(-60px) rotate(180deg)}.container .minimap-container{transform:translateY(60px) translate(80px)}.container .minimap-container.collapsed{transform:translateY(60px) translate(calc(100% - 32px))}}"),this._toggleMinimapBtn=document.createElement("button"),this._toggleMinimapBtn.className="toggle-minimap collapse-button",this._toggleMinimapBtn.innerHTML='<svg viewBox="-3.6 -3.6 31.2 31.2" stroke-width=".4"><path d="M15.707 4.293a1 1 0 0 1 0 1.414L9.414 12l6.293 6.293a1 1 0 0 1-1.414 1.414l-7-7a1 1 0 0 1 0-1.414l7-7a1 1 0 0 1 1.414 0Z" /></svg>',this._minimapContainer.appendChild(this._toggleMinimapBtn),this._minimap=document.createElement("div"),this._minimap.className="minimap";const e=document.createElement("canvas");e.className="minimap-canvas",e.width=200,e.height=150,this._minimap.appendChild(e),this._minimapCtx=e.getContext("2d"),this._viewportRectangle=document.createElement("div"),this._viewportRectangle.className="viewport-rectangle",this._minimap.appendChild(this._viewportRectangle),this._minimapContainer.appendChild(this._minimap),this.DM.data.container.appendChild(this._minimapContainer),this._minimapContainer.classList.toggle("collapsed",this.collapsed),this._toggleMinimapBtn.addEventListener("click",this.toggleCollapse),o.resizeCanvasForDPR(e,e.width,e.height),this.onStart(this.start),this.onDispose(this.dispose)}toggleCollapse=()=>{this.collapsed=!this.collapsed,this.minimapContainer.classList.toggle("collapsed",this.collapsed),this.collapsed||this.updateViewportRectangle()};start=()=>{const t=this.DM.data.nodeBounds;if(!t)return;const e=this.minimap.clientWidth,i=this.minimap.clientHeight,n=e/t.width,o=i/t.height;this.minimapCache.scale=.9*Math.min(n,o),this.minimapCache.centerX=e/2,this.minimapCache.centerY=i/2,this.minimapCtx.clearRect(0,0,e,i),this.minimapCtx.save(),this.minimapCtx.translate(this.minimapCache.centerX,this.minimapCache.centerY),this.minimapCtx.scale(this.minimapCache.scale,this.minimapCache.scale),this.minimapCtx.translate(-t.centerX,-t.centerY);const s=this.DM.data.canvasData;for(const a of s.edges)this.drawMinimapEdge(a);for(const a of s.nodes)this.drawMinimapNode(a);this.minimapCtx.restore()};drawMinimapNode=t=>{const e=o.getColor(t.color);this.minimapCtx.fillStyle=e.border,this.minimapCtx.globalAlpha=.3,o.drawRoundRect(this.minimapCtx,t.x,t.y,t.width,t.height,25),this.minimapCtx.fill(),this.minimapCtx.globalAlpha=1};drawMinimapEdge=t=>{const e=this.DM.data.nodeMap,i=e[t.fromNode],n=e[t.toNode];if(!i||!n)return;const[s,a]=o.getAnchorCoord(i,t.fromSide),[l,r]=o.getAnchorCoord(n,t.toSide);this.minimapCtx.beginPath(),this.minimapCtx.moveTo(s,a),this.minimapCtx.lineTo(l,r),this.minimapCtx.strokeStyle="#555",this.minimapCtx.lineWidth=10,this.minimapCtx.stroke()};updateViewportRectangle=()=>{if(this.collapsed)return;const t=this.DM.data.nodeBounds,e=this.DM.data.container,i=this.DM.data.scale;if(!t)return;const n=e.clientWidth/i,o=e.clientHeight/i,s=-this.DM.data.offsetX/i+e.clientWidth/(2*i),a=-this.DM.data.offsetY/i+e.clientHeight/(2*i),l=this.minimapCache.centerX+(s-n/2-t.centerX)*this.minimapCache.scale,r=this.minimapCache.centerY+(a-o/2-t.centerY)*this.minimapCache.scale,h=n*this.minimapCache.scale,p=o*this.minimapCache.scale;this.viewportRectangle.style.left=`${l}px`,this.viewportRectangle.style.top=`${r}px`,this.viewportRectangle.style.width=`${h}px`,this.viewportRectangle.style.height=`${p}px`};dispose=()=>{this.toggleMinimapBtn.removeEventListener("click",this.toggleCollapse),this.minimapCtx.clearRect(0,0,this.minimap.clientWidth,this.minimap.clientHeight),this.minimapContainer.remove(),this._minimapContainer=null,this._toggleMinimapBtn=null,this._viewportRectangle=null,this._minimap=null}}class h extends t{_preventionContainer=null;preventMt=!1;DM;preventMistouch={record:!1,lastX:0,lastY:0,initialX:0,initialY:0};get preventionContainer(){if(null===this._preventionContainer)throw e;return this._preventionContainer}constructor(...t){super(...t);const e=Object.assign({preventAtStart:!0,labelText:"Click on to unlock."},this.options.mistouchPreventer||{}),n=document.createElement("div");n.className="prevention-banner",n.textContent=e.labelText,this.DM=this.container.get(i),this._preventionContainer=document.createElement("div"),this._preventionContainer.className="prevention-container hidden",o.applyStyles(this._preventionContainer,".full,.prevention-container{top:0;left:0;width:100%;height:100%;position:absolute}.flex-center,.prevention-container{display:flex;justify-content:center;align-items:center}.prevention-container{overflow:visible;transition:background .2s,opacity .2s,box-shadow .2s,border .2s,filter .2s,backdrop-filter .2s}.prevention-container.hidden{pointer-events:none;opacity:0}.prevention-container .prevention-banner{background:#0006;border-radius:12px;padding:12px;margin:12px;-webkit-backdrop-filter:blur(8px) saturate(1.5);backdrop-filter:blur(8px) saturate(1.5);border:2px solid rgba(140,140,140,.75);color:#fff;font-size:calc(14px + .3vw);line-height:calc(17px + .3vw);text-align:center}"),this._preventionContainer.appendChild(n),this.DM.data.container.appendChild(this._preventionContainer),e.preventAtStart&&this.startPrevention(),window.addEventListener("pointerdown",this.onPointerDown),window.addEventListener("pointermove",this.onPointerMove),window.addEventListener("pointerup",this.onPointerUp),this.onDispose(this.dispose)}onPointerDown=t=>{const e=this.DM.data.container.getBoundingClientRect();t.clientX<e.left||t.clientX>e.right||t.clientY<e.top||t.clientY>e.bottom?this.preventMt||this.startPrevention():this.preventMt&&(this.preventMistouch.initialX=t.clientX,this.preventMistouch.initialY=t.clientY,this.preventMistouch.lastX=t.clientX,this.preventMistouch.lastY=t.clientY,this.preventMistouch.record=!0)};onPointerMove=t=>{this.preventMistouch.record&&(this.preventMistouch.lastX=t.clientX,this.preventMistouch.lastY=t.clientY)};onPointerUp=()=>{this.preventMistouch.record&&(this.preventMistouch.record=!1,Math.abs(this.preventMistouch.lastX-this.preventMistouch.initialX)+Math.abs(this.preventMistouch.lastY-this.preventMistouch.initialY)<5&&this.endPrevention())};startPrevention=()=>{this.preventionContainer.classList.remove("hidden"),this.DM.data.container.classList.add("numb"),this.preventMt=!0};endPrevention=()=>{this.preventMt=!1,this.preventionContainer.classList.add("hidden"),setTimeout(()=>this.DM.data.container.classList.remove("numb"),50)};dispose=()=>{window.removeEventListener("pointerdown",this.onPointerDown),window.removeEventListener("pointermove",this.onPointerMove),window.removeEventListener("pointerup",this.onPointerUp),this.preventionContainer.remove(),this._preventionContainer=null}}export{a as Controls,l as DebugPanel,r as Minimap,h as MistouchPreventer};
|
|
2
|
+
//# sourceMappingURL=modules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modules.js","sources":["../src/modules/controls/index.ts","../src/modules/debugPanel/index.ts","../src/modules/minimap/index.ts","../src/modules/mistouchPreventer/index.ts"],"sourcesContent":["import { type BaseArgs, BaseModule } from '$/baseModule';\nimport Controller from '$/controller';\nimport DataManager from '$/dataManager';\nimport utilities, { destroyError } from '$/utilities';\nimport style from './styles.scss?inline';\n\ntype Options = {\n\tcontrolsCollapsed?: boolean;\n};\n\nconst resetIcon =\n\t'<svg viewBox=\"-6 -6 30 30\" stroke-width=\".08\"><path d=\"m14.955 7.986.116.01a1 1 0 0 1 .85 1.13 8 8 0 0 1-13.374 4.728l-.84.84c-.63.63-1.707.184-1.707-.707V10h3.987c.89 0 1.337 1.077.707 1.707l-.731.731a6 6 0 0 0 8.347-.264 6 6 0 0 0 1.63-3.33 1 1 0 0 1 1.131-.848zM11.514.813a8 8 0 0 1 1.942 1.336l.837-.837c.63-.63 1.707-.184 1.707.707V6h-3.981c-.89 0-1.337-1.077-.707-1.707l.728-.729a6 6 0 0 0-9.98 3.591 1 1 0 1 1-1.98-.281A8 8 0 0 1 11.514.813Z\" /></svg>';\nconst enterFullscreenIcon =\n\t'<svg viewBox=\"-5.28 -5.28 34.56 34.56\" fill=\"none\"><path d=\"M4 9V5.6c0-.56 0-.84.109-1.054a1 1 0 0 1 .437-.437C4.76 4 5.04 4 5.6 4H9M4 15v3.4c0 .56 0 .84.109 1.054a1 1 0 0 0 .437.437C4.76 20 5.04 20 5.6 20H9m6-16h3.4c.56 0 .84 0 1.054.109a1 1 0 0 1 .437.437C20 4.76 20 5.04 20 5.6V9m0 6v3.4c0 .56 0 .84-.109 1.054a1 1 0 0 1-.437.437C19.24 20 18.96 20 18.4 20H15\" stroke-width=\"2.4\" stroke-linecap=\"round\"/></svg>';\nconst exitFullscreenIcon =\n\t'<svg viewBox=\"-40.32 -40.32 176.64 176.64\"><path d=\"M30 60H6a6 6 0 0 0 0 12h18v18a6 6 0 0 0 12 0V66a5.997 5.997 0 0 0-6-6Zm60 0H66a5.997 5.997 0 0 0-6 6v24a6 6 0 0 0 12 0V72h18a6 6 0 0 0 0-12ZM66 36h24a6 6 0 0 0 0-12H72V6a6 6 0 0 0-12 0v24a5.997 5.997 0 0 0 6 6ZM30 0a5.997 5.997 0 0 0-6 6v18H6a6 6 0 0 0 0 12h24a5.997 5.997 0 0 0 6-6V6a5.997 5.997 0 0 0-6-6Z\"/></svg>';\nconst zoomInIcon =\n\t'<svg viewBox=\"-1.2 -1.2 26.4 26.4\"><path d=\"M6 12h12m-6-6v12\" stroke-width=\"2\" stroke-linecap=\"round\" /></svg>';\nconst zoomOutIcon =\n\t'<svg viewBox=\"-1.2 -1.2 26.4 26.4\"><path d=\"M6 12h12\" stroke-width=\"2\" stroke-linecap=\"round\" /></svg>';\nconst toggleCollapseIcon =\n\t'<svg viewBox=\"-3.6 -3.6 31.2 31.2\" stroke-width=\".4\"><path d=\"M15.707 4.293a1 1 0 0 1 0 1.414L9.414 12l6.293 6.293a1 1 0 0 1-1.414 1.414l-7-7a1 1 0 0 1 0-1.414l7-7a1 1 0 0 1 1.414 0Z\" /></svg>';\n\nexport default class Controls extends BaseModule<Options> {\n\tprivate _controlsPanel: HTMLDivElement | null = null;\n\tprivate _toggleCollapseBtn: HTMLButtonElement | null = null;\n\tprivate _toggleFullscreenBtn: HTMLButtonElement | null = null;\n\tprivate _zoomOutBtn: HTMLButtonElement | null = null;\n\tprivate _zoomSlider: HTMLInputElement | null = null;\n\tprivate _zoomInBtn: HTMLButtonElement | null = null;\n\tprivate _resetViewBtn: HTMLButtonElement | null = null;\n\tprivate DM: DataManager;\n\tprivate collapsed: boolean;\n\n\tprivate get controlsPanel() {\n\t\tif (this._controlsPanel === null) throw destroyError;\n\t\treturn this._controlsPanel;\n\t}\n\tprivate get toggleCollapseBtn() {\n\t\tif (this._toggleCollapseBtn === null) throw destroyError;\n\t\treturn this._toggleCollapseBtn;\n\t}\n\tprivate get toggleFullscreenBtn() {\n\t\tif (this._toggleFullscreenBtn === null) throw destroyError;\n\t\treturn this._toggleFullscreenBtn;\n\t}\n\tprivate get zoomOutBtn() {\n\t\tif (this._zoomOutBtn === null) throw destroyError;\n\t\treturn this._zoomOutBtn;\n\t}\n\tprivate get zoomSlider() {\n\t\tif (this._zoomSlider === null) throw destroyError;\n\t\treturn this._zoomSlider;\n\t}\n\tprivate get zoomInBtn() {\n\t\tif (this._zoomInBtn === null) throw destroyError;\n\t\treturn this._zoomInBtn;\n\t}\n\tprivate get resetViewBtn() {\n\t\tif (this._resetViewBtn === null) throw destroyError;\n\t\treturn this._resetViewBtn;\n\t}\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tthis.collapsed = this.options.controlsCollapsed || false;\n\t\tthis.DM = this.container.get(DataManager);\n\t\tthis.DM.onToggleFullscreen.subscribe(this.updateFullscreenBtn);\n\t\tthis.container.get(Controller).hooks.onRefresh.subscribe(this.updateSlider);\n\n\t\tthis._controlsPanel = document.createElement('div');\n\t\tthis._controlsPanel.className = 'controls';\n\t\tthis._controlsPanel.classList.toggle('collapsed', this.collapsed);\n\n\t\tutilities.applyStyles(this._controlsPanel, style);\n\n\t\tthis._toggleCollapseBtn = document.createElement('button');\n\t\tthis._toggleCollapseBtn.className = 'collapse-button';\n\t\tthis._toggleCollapseBtn.innerHTML = toggleCollapseIcon;\n\t\tthis._controlsPanel.appendChild(this._toggleCollapseBtn);\n\n\t\tconst controlsContent = document.createElement('div');\n\t\tcontrolsContent.className = 'controls-content';\n\n\t\tthis._toggleFullscreenBtn = document.createElement('button');\n\t\tthis._toggleFullscreenBtn.innerHTML = enterFullscreenIcon;\n\t\tcontrolsContent.appendChild(this._toggleFullscreenBtn);\n\n\t\tthis._zoomOutBtn = document.createElement('button');\n\t\tthis._zoomOutBtn.innerHTML = zoomOutIcon;\n\t\tcontrolsContent.appendChild(this._zoomOutBtn);\n\n\t\tthis._zoomSlider = document.createElement('input');\n\t\tthis._zoomSlider.type = 'range';\n\t\tthis._zoomSlider.className = 'zoom-slider';\n\t\tthis._zoomSlider.min = '-30';\n\t\tthis._zoomSlider.max = '30';\n\t\tthis._zoomSlider.value = '0';\n\t\tcontrolsContent.appendChild(this._zoomSlider);\n\n\t\tthis._zoomInBtn = document.createElement('button');\n\t\tthis._zoomInBtn.innerHTML = zoomInIcon;\n\t\tcontrolsContent.appendChild(this._zoomInBtn);\n\n\t\tthis._resetViewBtn = document.createElement('button');\n\t\tthis._resetViewBtn.innerHTML = resetIcon;\n\t\tcontrolsContent.appendChild(this._resetViewBtn);\n\n\t\tthis._controlsPanel.appendChild(controlsContent);\n\n\t\tthis.DM.data.container.appendChild(this._controlsPanel);\n\n\t\tthis._toggleCollapseBtn.addEventListener('click', this.toggleCollapse);\n\t\tthis._zoomInBtn.addEventListener('click', this.zoomIn);\n\t\tthis._zoomOutBtn.addEventListener('click', this.zoomOut);\n\t\tthis._zoomSlider.addEventListener('input', this.slide);\n\t\tthis._resetViewBtn.addEventListener('click', this.DM.resetView);\n\t\tthis._toggleFullscreenBtn.addEventListener('click', this.toggleFullscreen);\n\n\t\tthis.onDispose(this.dispose);\n\t}\n\ttoggleCollapse = () => {\n\t\tthis.collapsed = !this.collapsed;\n\t\tthis.controlsPanel.classList.toggle('collapsed', this.collapsed);\n\t\tif (!this.collapsed) this.updateSlider();\n\t};\n\tprivate zoomIn = () => this.DM.zoom(1.1, this.DM.middleViewer());\n\tprivate zoomOut = () => this.DM.zoom(1 / 1.1, this.DM.middleViewer());\n\tprivate slide = () => this.DM.zoomToScale(1.1 ** Number(this.zoomSlider.value), this.DM.middleViewer());\n\n\tprivate updateFullscreenBtn = (enter: boolean) => {\n\t\tif (enter) this.toggleFullscreenBtn.innerHTML = exitFullscreenIcon;\n\t\telse this.toggleFullscreenBtn.innerHTML = enterFullscreenIcon;\n\t};\n\tprivate toggleFullscreen = () => this.DM.shiftFullscreen('toggle');\n\n\tprivate updateSlider = () => {\n\t\tif (this.collapsed) return;\n\t\tthis.zoomSlider.value = String(this.scaleToSlider(this.DM.data.scale));\n\t};\n\tprivate scaleToSlider = (scale: number) => Math.log(scale) / Math.log(1.1);\n\n\tprivate dispose = () => {\n\t\tthis.toggleCollapseBtn.removeEventListener('click', this.toggleCollapse);\n\t\tthis.zoomInBtn.removeEventListener('click', this.zoomIn);\n\t\tthis.zoomOutBtn.removeEventListener('click', this.zoomOut);\n\t\tthis.zoomSlider.removeEventListener('input', this.slide);\n\t\tthis.resetViewBtn.removeEventListener('click', this.DM.resetView);\n\t\tthis.toggleFullscreenBtn.removeEventListener('click', this.toggleFullscreen);\n\t\tthis.controlsPanel.remove();\n\t\tthis._controlsPanel = null;\n\t\tthis._toggleCollapseBtn = null;\n\t\tthis._zoomInBtn = null;\n\t\tthis._zoomOutBtn = null;\n\t\tthis._zoomSlider = null;\n\t\tthis._resetViewBtn = null;\n\t\tthis._toggleFullscreenBtn = null;\n\t};\n}\n","import { type BaseArgs, BaseModule } from '$/baseModule';\nimport Controller from '$/controller';\nimport DataManager from '$/dataManager';\nimport utilities, { destroyError } from '$/utilities';\nimport style from './styles.scss?inline';\n\nexport default class DebugPanel extends BaseModule {\n\tprivate _debugPanel: HTMLDivElement | null = null;\n\tprivate DM: DataManager;\n\n\tprivate get debugPanel() {\n\t\tif (!this._debugPanel) throw destroyError;\n\t\treturn this._debugPanel;\n\t}\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tthis.DM = this.container.get(DataManager);\n\t\tthis.container.get(Controller).hooks.onRefresh.subscribe(this.update);\n\t\tthis._debugPanel = document.createElement('div');\n\t\tthis._debugPanel.className = 'debug-panel';\n\t\tconst HTMLContainer = this.DM.data.container;\n\t\tutilities.applyStyles(HTMLContainer, style);\n\t\tHTMLContainer.appendChild(this._debugPanel);\n\t\tthis.onDispose(this.dispose);\n\t}\n\n\tprivate update = () => {\n\t\tconst round = utilities.round;\n\t\tconst data = this.DM.data;\n\t\tthis.debugPanel.innerHTML = `<p>Scale: ${round(data.scale, 3)}</p><p>Offset: ${round(data.offsetX, 1)}, ${round(data.offsetY, 1)}</p>`;\n\t};\n\n\tprivate dispose = () => {\n\t\tthis.debugPanel.remove();\n\t\tthis._debugPanel = null;\n\t};\n}\n","import { type BaseArgs, BaseModule } from '$/baseModule';\nimport Controller from '$/controller';\nimport DataManager from '$/dataManager';\nimport utilities, { destroyError } from '$/utilities';\nimport style from './styles.scss?inline';\n\ntype Options = {\n\tminimapCollapsed?: boolean;\n};\n\nconst toggleCollapseIcon =\n\t'<svg viewBox=\"-3.6 -3.6 31.2 31.2\" stroke-width=\".4\"><path d=\"M15.707 4.293a1 1 0 0 1 0 1.414L9.414 12l6.293 6.293a1 1 0 0 1-1.414 1.414l-7-7a1 1 0 0 1 0-1.414l7-7a1 1 0 0 1 1.414 0Z\" /></svg>';\n\nexport default class Minimap extends BaseModule<Options> {\n\tprivate _minimapCtx: CanvasRenderingContext2D | null = null;\n\tprivate _viewportRectangle: HTMLDivElement | null = null;\n\tprivate _minimap: HTMLDivElement | null = null;\n\tprivate _minimapContainer: HTMLDivElement | null = null;\n\tprivate _toggleMinimapBtn: HTMLButtonElement | null = null;\n\tprivate minimapCache: { scale: number; centerX: number; centerY: number } = {\n\t\tscale: 1,\n\t\tcenterX: 0,\n\t\tcenterY: 0,\n\t};\n\tprivate DM: DataManager;\n\tprivate collapsed: boolean;\n\n\tprivate get minimap() {\n\t\tif (this._minimap === null) throw destroyError;\n\t\treturn this._minimap;\n\t}\n\tprivate get minimapCtx() {\n\t\tif (this._minimapCtx === null) throw destroyError;\n\t\treturn this._minimapCtx;\n\t}\n\tprivate get viewportRectangle() {\n\t\tif (this._viewportRectangle === null) throw destroyError;\n\t\treturn this._viewportRectangle;\n\t}\n\tprivate get minimapContainer() {\n\t\tif (this._minimapContainer === null) throw destroyError;\n\t\treturn this._minimapContainer;\n\t}\n\tprivate get toggleMinimapBtn() {\n\t\tif (this._toggleMinimapBtn === null) throw destroyError;\n\t\treturn this._toggleMinimapBtn;\n\t}\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tthis.collapsed = this.options.minimapCollapsed || false;\n\t\tthis.container.get(Controller).hooks.onRefresh.subscribe(this.updateViewportRectangle);\n\t\tthis.DM = this.container.get(DataManager);\n\n\t\tthis._minimapContainer = document.createElement('div');\n\t\tthis._minimapContainer.className = 'minimap-container';\n\n\t\tutilities.applyStyles(this._minimapContainer, style);\n\n\t\tthis._toggleMinimapBtn = document.createElement('button');\n\t\tthis._toggleMinimapBtn.className = 'toggle-minimap collapse-button';\n\t\tthis._toggleMinimapBtn.innerHTML = toggleCollapseIcon;\n\t\tthis._minimapContainer.appendChild(this._toggleMinimapBtn);\n\n\t\tthis._minimap = document.createElement('div');\n\t\tthis._minimap.className = 'minimap';\n\t\tconst minimapCanvas = document.createElement('canvas');\n\t\tminimapCanvas.className = 'minimap-canvas';\n\t\tminimapCanvas.width = 200;\n\t\tminimapCanvas.height = 150;\n\n\t\tthis._minimap.appendChild(minimapCanvas);\n\t\tthis._minimapCtx = minimapCanvas.getContext('2d') as CanvasRenderingContext2D;\n\t\tthis._viewportRectangle = document.createElement('div');\n\t\tthis._viewportRectangle.className = 'viewport-rectangle';\n\t\tthis._minimap.appendChild(this._viewportRectangle);\n\t\tthis._minimapContainer.appendChild(this._minimap);\n\n\t\tthis.DM.data.container.appendChild(this._minimapContainer);\n\n\t\tthis._minimapContainer.classList.toggle('collapsed', this.collapsed);\n\n\t\tthis._toggleMinimapBtn.addEventListener('click', this.toggleCollapse);\n\t\tutilities.resizeCanvasForDPR(minimapCanvas, minimapCanvas.width, minimapCanvas.height);\n\n\t\tthis.onStart(this.start);\n\t\tthis.onDispose(this.dispose);\n\t}\n\n\ttoggleCollapse = () => {\n\t\tthis.collapsed = !this.collapsed;\n\t\tthis.minimapContainer.classList.toggle('collapsed', this.collapsed);\n\t\tif (!this.collapsed) this.updateViewportRectangle();\n\t};\n\n\tprivate start = () => {\n\t\tconst bounds = this.DM.data.nodeBounds;\n\t\tif (!bounds) return;\n\t\tconst displayWidth = this.minimap.clientWidth;\n\t\tconst displayHeight = this.minimap.clientHeight;\n\t\tconst scaleX = displayWidth / bounds.width;\n\t\tconst scaleY = displayHeight / bounds.height;\n\t\tthis.minimapCache.scale = Math.min(scaleX, scaleY) * 0.9;\n\t\tthis.minimapCache.centerX = displayWidth / 2;\n\t\tthis.minimapCache.centerY = displayHeight / 2;\n\t\tthis.minimapCtx.clearRect(0, 0, displayWidth, displayHeight);\n\t\tthis.minimapCtx.save();\n\t\tthis.minimapCtx.translate(this.minimapCache.centerX, this.minimapCache.centerY);\n\t\tthis.minimapCtx.scale(this.minimapCache.scale, this.minimapCache.scale);\n\t\tthis.minimapCtx.translate(-bounds.centerX, -bounds.centerY);\n\t\tconst canvasData = this.DM.data.canvasData;\n\t\tfor (const edge of canvasData.edges) this.drawMinimapEdge(edge);\n\t\tfor (const node of canvasData.nodes) this.drawMinimapNode(node);\n\t\tthis.minimapCtx.restore();\n\t};\n\n\tprivate drawMinimapNode = (node: JSONCanvasNode) => {\n\t\tconst colors = utilities.getColor(node.color);\n\t\tconst radius = 25;\n\t\tthis.minimapCtx.fillStyle = colors.border;\n\t\tthis.minimapCtx.globalAlpha = 0.3;\n\t\tutilities.drawRoundRect(this.minimapCtx, node.x, node.y, node.width, node.height, radius);\n\t\tthis.minimapCtx.fill();\n\t\tthis.minimapCtx.globalAlpha = 1.0;\n\t};\n\n\tprivate drawMinimapEdge = (edge: JSONCanvasEdge) => {\n\t\tconst nodeMap = this.DM.data.nodeMap;\n\t\tconst fromNode = nodeMap[edge.fromNode];\n\t\tconst toNode = nodeMap[edge.toNode];\n\t\tif (!fromNode || !toNode) return;\n\t\tconst [startX, startY] = utilities.getAnchorCoord(fromNode, edge.fromSide);\n\t\tconst [endX, endY] = utilities.getAnchorCoord(toNode, edge.toSide);\n\t\tthis.minimapCtx.beginPath();\n\t\tthis.minimapCtx.moveTo(startX, startY);\n\t\tthis.minimapCtx.lineTo(endX, endY);\n\t\tthis.minimapCtx.strokeStyle = '#555';\n\t\tthis.minimapCtx.lineWidth = 10;\n\t\tthis.minimapCtx.stroke();\n\t};\n\n\tprivate updateViewportRectangle = () => {\n\t\tif (this.collapsed) return;\n\t\tconst bounds = this.DM.data.nodeBounds;\n\t\tconst container = this.DM.data.container;\n\t\tconst scale = this.DM.data.scale;\n\t\tif (!bounds) return;\n\t\tconst viewWidth = container.clientWidth / scale;\n\t\tconst viewHeight = container.clientHeight / scale;\n\t\tconst viewportCenterX = -this.DM.data.offsetX / scale + container.clientWidth / (2 * scale);\n\t\tconst viewportCenterY = -this.DM.data.offsetY / scale + container.clientHeight / (2 * scale);\n\t\tconst viewRectX =\n\t\t\tthis.minimapCache.centerX +\n\t\t\t(viewportCenterX - viewWidth / 2 - bounds.centerX) * this.minimapCache.scale;\n\t\tconst viewRectY =\n\t\t\tthis.minimapCache.centerY +\n\t\t\t(viewportCenterY - viewHeight / 2 - bounds.centerY) * this.minimapCache.scale;\n\t\tconst viewRectWidth = viewWidth * this.minimapCache.scale;\n\t\tconst viewRectHeight = viewHeight * this.minimapCache.scale;\n\t\tthis.viewportRectangle.style.left = `${viewRectX}px`;\n\t\tthis.viewportRectangle.style.top = `${viewRectY}px`;\n\t\tthis.viewportRectangle.style.width = `${viewRectWidth}px`;\n\t\tthis.viewportRectangle.style.height = `${viewRectHeight}px`;\n\t};\n\n\tprivate dispose = () => {\n\t\tthis.toggleMinimapBtn.removeEventListener('click', this.toggleCollapse);\n\t\tthis.minimapCtx.clearRect(0, 0, this.minimap.clientWidth, this.minimap.clientHeight);\n\t\tthis.minimapContainer.remove();\n\t\tthis._minimapContainer = null;\n\t\tthis._toggleMinimapBtn = null;\n\t\tthis._viewportRectangle = null;\n\t\tthis._minimap = null;\n\t};\n}\n","import { type BaseArgs, BaseModule } from '$/baseModule';\nimport DataManager from '$/dataManager';\nimport utilities, { destroyError } from '$/utilities';\nimport style from './styles.scss?inline';\n\ntype Options = {\n\tmistouchPreventer?: {\n\t\tpreventAtStart?: boolean;\n\t\tlabelText?: string;\n\t};\n};\n\nexport default class MistouchPreventer extends BaseModule<Options> {\n\tprivate _preventionContainer: HTMLDivElement | null = null;\n\tprivate preventMt: boolean = false;\n\tprivate DM: DataManager;\n\tprivate preventMistouch: {\n\t\trecord: boolean;\n\t\tlastX: number;\n\t\tlastY: number;\n\t\tinitialX: number;\n\t\tinitialY: number;\n\t} = {\n\t\trecord: false,\n\t\tlastX: 0,\n\t\tlastY: 0,\n\t\tinitialX: 0,\n\t\tinitialY: 0,\n\t};\n\n\tprivate get preventionContainer() {\n\t\tif (this._preventionContainer === null) throw destroyError;\n\t\treturn this._preventionContainer;\n\t}\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tconst options = Object.assign(\n\t\t\t{\n\t\t\t\tpreventAtStart: true,\n\t\t\t\tlabelText: 'Click on to unlock.',\n\t\t\t},\n\t\t\tthis.options.mistouchPreventer || {},\n\t\t);\n\n\t\tconst preventionBanner = document.createElement('div');\n\t\tpreventionBanner.className = 'prevention-banner';\n\t\tpreventionBanner.textContent = options.labelText;\n\t\tthis.DM = this.container.get(DataManager);\n\t\tthis._preventionContainer = document.createElement('div');\n\t\tthis._preventionContainer.className = 'prevention-container hidden';\n\n\t\tutilities.applyStyles(this._preventionContainer, style);\n\t\tthis._preventionContainer.appendChild(preventionBanner);\n\t\tthis.DM.data.container.appendChild(this._preventionContainer);\n\n\t\tif (options.preventAtStart) this.startPrevention();\n\n\t\twindow.addEventListener('pointerdown', this.onPointerDown);\n\t\twindow.addEventListener('pointermove', this.onPointerMove);\n\t\twindow.addEventListener('pointerup', this.onPointerUp);\n\n\t\tthis.onDispose(this.dispose);\n\t}\n\n\tprivate onPointerDown = (e: PointerEvent) => {\n\t\tconst bounds = this.DM.data.container.getBoundingClientRect();\n\t\tif (\n\t\t\te.clientX < bounds.left ||\n\t\t\te.clientX > bounds.right ||\n\t\t\te.clientY < bounds.top ||\n\t\t\te.clientY > bounds.bottom\n\t\t) {\n\t\t\tif (!this.preventMt) this.startPrevention();\n\t\t} else if (this.preventMt) {\n\t\t\tthis.preventMistouch.initialX = e.clientX;\n\t\t\tthis.preventMistouch.initialY = e.clientY;\n\t\t\tthis.preventMistouch.lastX = e.clientX;\n\t\t\tthis.preventMistouch.lastY = e.clientY;\n\t\t\tthis.preventMistouch.record = true;\n\t\t}\n\t};\n\n\tprivate onPointerMove = (e: PointerEvent) => {\n\t\tif (this.preventMistouch.record) {\n\t\t\tthis.preventMistouch.lastX = e.clientX;\n\t\t\tthis.preventMistouch.lastY = e.clientY;\n\t\t}\n\t};\n\n\tprivate onPointerUp = () => {\n\t\tif (this.preventMistouch.record) {\n\t\t\tthis.preventMistouch.record = false;\n\t\t\tif (\n\t\t\t\tMath.abs(this.preventMistouch.lastX - this.preventMistouch.initialX) +\n\t\t\t\t\tMath.abs(this.preventMistouch.lastY - this.preventMistouch.initialY) <\n\t\t\t\t5\n\t\t\t)\n\t\t\t\tthis.endPrevention();\n\t\t}\n\t};\n\n\tstartPrevention = () => {\n\t\tthis.preventionContainer.classList.remove('hidden');\n\t\tthis.DM.data.container.classList.add('numb');\n\t\tthis.preventMt = true;\n\t};\n\n\tendPrevention = () => {\n\t\tthis.preventMt = false;\n\t\tthis.preventionContainer.classList.add('hidden');\n\t\tsetTimeout(() => this.DM.data.container.classList.remove('numb'), 50); // minimum delay to prevent triggering undesired button touch\n\t};\n\n\tprivate dispose = () => {\n\t\twindow.removeEventListener('pointerdown', this.onPointerDown);\n\t\twindow.removeEventListener('pointermove', this.onPointerMove);\n\t\twindow.removeEventListener('pointerup', this.onPointerUp);\n\t\tthis.preventionContainer.remove();\n\t\tthis._preventionContainer = null;\n\t};\n}\n"],"names":["enterFullscreenIcon","Controls","BaseModule","_controlsPanel","_toggleCollapseBtn","_toggleFullscreenBtn","_zoomOutBtn","_zoomSlider","_zoomInBtn","_resetViewBtn","DM","collapsed","controlsPanel","this","destroyError","toggleCollapseBtn","toggleFullscreenBtn","zoomOutBtn","zoomSlider","zoomInBtn","resetViewBtn","constructor","args","super","options","controlsCollapsed","container","get","DataManager","onToggleFullscreen","subscribe","updateFullscreenBtn","Controller","hooks","onRefresh","updateSlider","document","createElement","className","classList","toggle","utilities","applyStyles","innerHTML","appendChild","controlsContent","type","min","max","value","data","addEventListener","toggleCollapse","zoomIn","zoomOut","slide","resetView","toggleFullscreen","onDispose","dispose","zoom","middleViewer","zoomToScale","Number","enter","shiftFullscreen","String","scaleToSlider","scale","Math","log","removeEventListener","remove","DebugPanel","_debugPanel","debugPanel","update","HTMLContainer","round","offsetX","offsetY","Minimap","_minimapCtx","_viewportRectangle","_minimap","_minimapContainer","_toggleMinimapBtn","minimapCache","centerX","centerY","minimap","minimapCtx","viewportRectangle","minimapContainer","toggleMinimapBtn","minimapCollapsed","updateViewportRectangle","minimapCanvas","width","height","getContext","resizeCanvasForDPR","onStart","start","bounds","nodeBounds","displayWidth","clientWidth","displayHeight","clientHeight","scaleX","scaleY","clearRect","save","translate","canvasData","edge","edges","drawMinimapEdge","node","nodes","drawMinimapNode","restore","colors","getColor","color","fillStyle","border","globalAlpha","drawRoundRect","x","y","fill","nodeMap","fromNode","toNode","startX","startY","getAnchorCoord","fromSide","endX","endY","toSide","beginPath","moveTo","lineTo","strokeStyle","lineWidth","stroke","viewWidth","viewHeight","viewportCenterX","viewportCenterY","viewRectX","viewRectY","viewRectWidth","viewRectHeight","style","left","top","MistouchPreventer","_preventionContainer","preventMt","preventMistouch","record","lastX","lastY","initialX","initialY","preventionContainer","Object","assign","preventAtStart","labelText","mistouchPreventer","preventionBanner","textContent","startPrevention","window","onPointerDown","onPointerMove","onPointerUp","e","getBoundingClientRect","clientX","right","clientY","bottom","abs","endPrevention","add","setTimeout"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{Pointeract as t,Click as e,Drag as s,WheelPanZoom as i,PreventDefault as a,MultitouchPanZoom as o}from"pointeract";import{B as n,d as r,u as c,D as h,C as l}from"./controller-siZ5v-SD.js";class d extends n{_overlaysLayer=document.createElement("div");overlays={};selectedId=null;eventListeners={};DM;IH;parse;get overlaysLayer(){if(!this._overlaysLayer)throw r;return this._overlaysLayer}hooks={onInteractionStart:c.makeHook(),onInteractionEnd:c.makeHook()};constructor(...t){super(...t),this.parse=this.options.markdownParser||(t=>t),this.DM=this.container.get(h),this.IH=this.container.get(p,{lazy:!0});this.container.get(l).hooks.onRefresh.subscribe(this.updateOverlays),this._overlaysLayer=document.createElement("div"),this._overlaysLayer.className="overlays",this.DM.data.container.appendChild(this.overlaysLayer),this.onStart(this.start),this.onDispose(this.dispose)}start=()=>{this.IH().onClick.subscribe(this.select);const t=this.DM.data.canvasBaseDir,e=async e=>{switch(e.type){case"text":this.updateOverlay(e,e.text,"text");break;case"file":e.file.match(/\.md$/i)?this.loadMarkdownForNode(e):e.file.match(/\.(png|jpg|jpeg|gif|svg|webp)$/i)?this.updateOverlay(e,t+e.file,"image"):e.file.match(/\.(mp3|wav)$/i)&&this.updateOverlay(e,t+e.file,"audio");break;case"link":this.updateOverlay(e,e.url,"link")}};Object.values(this.DM.data.nodeMap).forEach(t=>{e(t)})};select=t=>{const e=this.selectedId?this.overlays[this.selectedId]:null,s=t?this.overlays[t]:null;e&&e.classList.remove("active"),s?(s.classList.add("active"),this.hooks.onInteractionStart()):this.hooks.onInteractionEnd(),this.selectedId=t};loadMarkdownForNode=async t=>{let e;this.updateOverlay(t,"Loading...","text");try{const s=await fetch(this.DM.data.canvasBaseDir+t.file),i=await s.text(),a=i.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);e=a?await this.parse(a[2]):await this.parse(i)}catch(s){console.error("[JSONCanvasViewer] Failed to load markdown:",s),e="Failed to load content."}this.updateOverlay(t,e,"text")};updateOverlays=()=>{const t=this.DM.data;this.overlaysLayer.style.transform=`translate(${t.offsetX}px, ${t.offsetY}px) scale(${t.scale})`};async updateOverlay(t,e,s){let i=this.overlays[t.id];if(i){if("text"===s){i.getElementsByClassName("parsed-content-wrapper")[0].innerHTML=e}}else i=await this.constructOverlay(t,e,s),this.overlaysLayer.appendChild(i),this.overlays[t.id]=i,i.style.left=`${t.x}px`,i.style.top=`${t.y}px`,i.style.width=`${t.width}px`,i.style.height=`${t.height}px`}async constructOverlay(t,e,s){const i=c.getColor(t.color),a=document.createElement("div");switch(a.classList.add("overlay-container"),a.id=t.id,a.style.backgroundColor=i.background,a.style.setProperty("--active-color",i.active),s){case"text":{a.classList.add("markdown-content");const t=document.createElement("div");t.innerHTML=await this.parse(e||""),t.classList.add("parsed-content-wrapper"),a.appendChild(t);break}case"link":{const t=document.createElement("iframe");t.src=e,t.sandbox="allow-scripts allow-same-origin",t.className="link-iframe",t.loading="lazy",a.appendChild(t);break}case"audio":{const t=document.createElement("audio");t.className="audio",t.src=e,t.controls=!0,a.appendChild(t);break}case"image":{const t=document.createElement("img");t.src=e,t.loading="lazy",a.appendChild(t)}}switch(s){case"link":case"audio":{const t=document.createElement("div");t.className="click-layer",a.appendChild(t)}}const o=document.createElement("div");o.className="overlay-border",o.style.borderColor=i.border,a.appendChild(o);const n=()=>{t.id===this.selectedId&&this.hooks.onInteractionStart()},r=()=>{t.id===this.selectedId&&this.hooks.onInteractionEnd()};return a.addEventListener("pointerenter",n),a.addEventListener("pointerleave",r),a.addEventListener("touchstart",n),a.addEventListener("touchend",r),this.eventListeners[t.id]=[n,r],a}dispose=()=>{for(;this.overlaysLayer.firstElementChild;){const t=this.overlaysLayer.firstElementChild;if(this.eventListeners[t.id]){const e=this.eventListeners[t.id][0],s=this.eventListeners[t.id][1];if(!e||!s)throw r;t.removeEventListener("pointerenter",e),t.removeEventListener("pointerleave",s),t.removeEventListener("touchstart",e),t.removeEventListener("touchend",s),this.eventListeners[t.id][0]=null,this.eventListeners[t.id][1]=null}t.remove()}this.overlaysLayer.remove(),this._overlaysLayer=null}}class p extends n{pointeract;DM;onClick=c.makeHook();stopInteraction;startInteraction;constructor(...n){super(...n),this.DM=this.container.get(h);const r=Object.assign(this.options.pointeract||{},{coordinateOutput:"relative"});this.pointeract=new t(this.DM.data.container,[e,s,i,a,o],r),this.startInteraction=this.pointeract.start,this.stopInteraction=this.pointeract.stop;const c=this.container.get(d);c.hooks.onInteractionStart.subscribe(this.stopInteraction),c.hooks.onInteractionEnd.subscribe(this.startInteraction),this.onStart(this.start),this.onDispose(this.dispose)}start=()=>{this.pointeract.on("pan",this.onPan),this.pointeract.on("drag",this.onPan),this.pointeract.on("zoom",this.onZoom),this.pointeract.on("trueClick",this.onTrueClick),this.pointeract.start()};onPan=t=>{this.DM.pan(t.detail)};onZoom=t=>{const e=t.detail;this.DM.zoom(e.factor,{x:e.x,y:e.y})};onTrueClick=t=>{const e=t.detail;if((s=t.detail.target)&&(s.closest(".controls")||s.closest("button")||s.closest("input")))return;var s;const i=this.DM.findNodeAt({x:e.x,y:e.y});this.onClick(i?i.id:null)};dispose=()=>{this.pointeract.off("pan",this.onPan),this.pointeract.off("zoom",this.onZoom),this.pointeract.off("trueClick",this.onTrueClick),this.pointeract.dispose()}}const m="#fff";class u extends n{_canvas;ctx;DM;zoomInOptimize={lastDrawnScale:0,lastDrawnViewport:{left:0,right:0,top:0,bottom:0},timeout:null,lastCallTime:0};get canvas(){if(null===this._canvas)throw r;return this._canvas}constructor(...t){super(...t);const e=this.container.get(l);e.hooks.onRefresh.subscribe(this.redraw),e.hooks.onResize.subscribe(this.optimizeDPR),this.DM=this.container.get(h),this._canvas=document.createElement("canvas"),this._canvas.className="main-canvas",this.ctx=this._canvas.getContext("2d"),this.DM.data.container.appendChild(this._canvas),this.onDispose(this.dispose)}optimizeDPR=()=>{const t=this.DM.data.container;c.resizeCanvasForDPR(this.canvas,t.offsetWidth,t.offsetHeight)};redraw=()=>{this.zoomInOptimize.timeout&&(clearTimeout(this.zoomInOptimize.timeout),this.zoomInOptimize.timeout=null);const t=Date.now(),e=this.DM.data.offsetX,s=this.DM.data.offsetY,i=this.DM.data.scale,a=this.getCurrentViewport(e,s,i);if(this.isViewportInside(a,this.zoomInOptimize.lastDrawnViewport)&&i!==this.zoomInOptimize.lastDrawnScale){if(t-this.zoomInOptimize.lastCallTime<500)return this.zoomInOptimize.timeout=setTimeout(()=>{this.trueRedraw(e,s,i,a),this.zoomInOptimize.lastCallTime=t,this.zoomInOptimize.timeout=null},60),void this.fakeRedraw(a,i)}this.zoomInOptimize.lastCallTime=t,this.trueRedraw(e,s,i,a)};trueRedraw(t,e,s,i){this.zoomInOptimize.lastDrawnViewport=i,this.zoomInOptimize.lastDrawnScale=s,this.canvas.style.transform="",this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.ctx.save(),this.ctx.translate(t,e),this.ctx.scale(s,s);const a=this.DM.data.canvasData;a.nodes.forEach(t=>{switch(t.type){case"group":this.drawGroup(t,s);break;case"file":this.drawFileNode(t)}}),a.edges.forEach(t=>{this.drawEdge(t)}),this.ctx.restore()}fakeRedraw(t,e){const s=e/this.zoomInOptimize.lastDrawnScale,i=(this.zoomInOptimize.lastDrawnViewport.left-t.left)*e,a=(this.zoomInOptimize.lastDrawnViewport.top-t.top)*e;this.canvas.style.transform=`translate(${i}px, ${a}px) scale(${s})`}isViewportInside=(t,e)=>t.left>e.left&&t.top>e.top&&t.right<e.right&&t.bottom<e.bottom;getCurrentViewport=(t,e,s)=>{const i=-t/s,a=-e/s,o=this.DM.data.container;return{left:i,top:a,right:i+o.clientWidth/s,bottom:a+o.clientHeight/s}};drawLabelBar=(t,e,s,i,a)=>{const o=30*a,n=6*a,r=8*a,c=16*a,h=6*a;this.ctx.save(),this.ctx.translate(t,e),this.ctx.scale(1/a,1/a),this.ctx.font=`${c}px 'Inter', sans-serif`;const l=this.ctx.measureText(s).width+2*h;this.ctx.translate(0,-o-r),this.ctx.fillStyle=i,this.ctx.beginPath(),this.ctx.moveTo(n,0),this.ctx.lineTo(l-n,0),this.ctx.quadraticCurveTo(l,0,l,n),this.ctx.lineTo(l,o-n),this.ctx.quadraticCurveTo(l,o,l-n,o),this.ctx.lineTo(n,o),this.ctx.quadraticCurveTo(0,o,0,o-n),this.ctx.lineTo(0,n),this.ctx.quadraticCurveTo(0,0,n,0),this.ctx.closePath(),this.ctx.fill(),this.ctx.fillStyle=m,this.ctx.fillText(s,h,.65*o),this.ctx.restore()};drawNodeBackground=t=>{const e=c.getColor(t.color);this.ctx.globalAlpha=1,this.ctx.fillStyle=e.background,c.drawRoundRect(this.ctx,t.x+1,t.y+1,t.width-2,t.height-2,12),this.ctx.fill(),this.ctx.strokeStyle=e.border,this.ctx.lineWidth=2,c.drawRoundRect(this.ctx,t.x,t.y,t.width,t.height,12),this.ctx.stroke()};drawGroup=(t,e)=>{this.drawNodeBackground(t),t.label&&this.drawLabelBar(t.x,t.y,t.label,c.getColor(t.color).active,e)};drawFileNode=t=>{this.ctx.fillStyle=m,this.ctx.font="16px sans-serif",this.ctx.fillText(t.file,t.x+5,t.y-10)};drawEdge=t=>{const{fromNode:e,toNode:s}=this.getEdgeNodes(t),i=c.getAnchorCoord,[a,o]=i(e,t.fromSide),[n,r]=i(s,t.toSide),{active:h}=c.getColor(t.color);let[l,d,p,m]=[0,0,0,0];if(t.controlPoints?[l,d,p,m]=t.controlPoints:([l,d,p,m]=this.getControlPoints(a,o,n,r,t.fromSide,t.toSide),t.controlPoints=[l,d,p,m]),this.drawCurvedPath(a,o,n,r,l,d,p,m,h),this.drawArrowhead(n,r,p,m,h),t.label){const e=.5,s=(1-e)**3*a+3*(1-e)**2*e*l+3*(1-e)*e*e*p+e**3*n,i=(1-e)**3*o+3*(1-e)**2*e*d+3*(1-e)*e*e*m+e**3*r;this.ctx.font="18px sans-serif";const h=8,u=this.ctx.measureText(t.label).width+2*h,v=20;this.ctx.fillStyle="#222",this.ctx.beginPath(),c.drawRoundRect(this.ctx,s-u/2,i-v/2-2,u,v,4),this.ctx.fill(),this.ctx.fillStyle="#ccc",this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.fillText(t.label,s,i-2),this.ctx.textAlign="left",this.ctx.textBaseline="alphabetic"}};getEdgeNodes=t=>({fromNode:this.DM.data.nodeMap[t.fromNode],toNode:this.DM.data.nodeMap[t.toNode]});getControlPoints=(t,e,s,i,a,o)=>{const n=s-t,r=i-e,c=Math.min(Math.abs(n),Math.abs(r))+.3*Math.max(Math.abs(n),Math.abs(r)),h=(l=.5*c,d=60,p=300,Math.max(d,Math.min(p,l)));var l,d,p;let m=t,u=e,v=s,x=i;switch(a){case"top":u=e-h;break;case"bottom":u=e+h;break;case"left":m=t-h;break;case"right":m=t+h}switch(o){case"top":x=i-h;break;case"bottom":x=i+h;break;case"left":v=s-h;break;case"right":v=s+h}return[m,u,v,x]};drawCurvedPath=(t,e,s,i,a,o,n,r,c)=>{this.ctx.beginPath(),this.ctx.moveTo(t,e),this.ctx.bezierCurveTo(a,o,n,r,s,i),this.ctx.strokeStyle=c,this.ctx.lineWidth=2,this.ctx.stroke()};drawArrowhead=(t,e,s,i,a)=>{const o=t-s,n=e-i,r=Math.sqrt(o*o+n*n);if(0===r)return;const c=o/r,h=n/r,l=t-12*c-7*h,d=e-12*h+7*c,p=t-12*c+7*h,m=e-12*h-7*c;this.ctx.beginPath(),this.ctx.fillStyle=a,this.ctx.moveTo(t,e),this.ctx.lineTo(l,d),this.ctx.lineTo(p,m),this.ctx.closePath(),this.ctx.fill()};dispose=()=>{this.zoomInOptimize.timeout&&(clearTimeout(this.zoomInOptimize.timeout),this.zoomInOptimize.timeout=null),this.canvas.remove(),this._canvas=null}}export{p as I,d as O,u as R};
|
|
2
|
+
//# sourceMappingURL=renderer-CZ85ZN6O.js.map
|