json-canvas-viewer 3.2.2 → 3.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/README.md +105 -41
  2. package/dist/bridges.cjs +2 -0
  3. package/dist/bridges.cjs.map +1 -0
  4. package/dist/bridges.js +2 -0
  5. package/dist/bridges.js.map +1 -0
  6. package/dist/chimp.cjs +1 -0
  7. package/dist/chimp.js +1 -0
  8. package/dist/controller-CnUlrkdp.cjs +2 -0
  9. package/dist/controller-CnUlrkdp.cjs.map +1 -0
  10. package/dist/controller-UN-hOZ_r.js +2 -0
  11. package/dist/controller-UN-hOZ_r.js.map +1 -0
  12. package/dist/dev.cjs +2 -0
  13. package/dist/dev.cjs.map +1 -0
  14. package/dist/dev.js +2 -0
  15. package/dist/dev.js.map +1 -0
  16. package/dist/index-RXeXyAu0.cjs +2 -0
  17. package/dist/index-RXeXyAu0.cjs.map +1 -0
  18. package/dist/index-ujiv9m9Y.js +2 -0
  19. package/dist/index-ujiv9m9Y.js.map +1 -0
  20. package/dist/index.cjs +1 -1
  21. package/dist/index.cjs.map +1 -1
  22. package/dist/index.js +1 -1
  23. package/dist/index.js.map +1 -1
  24. package/dist/modules.cjs +2 -0
  25. package/dist/modules.cjs.map +1 -0
  26. package/dist/modules.js +2 -0
  27. package/dist/modules.js.map +1 -0
  28. package/dist/renderer-Bzv3aLXp.cjs +2 -0
  29. package/dist/renderer-Bzv3aLXp.cjs.map +1 -0
  30. package/dist/renderer-NPxavnke.js +2 -0
  31. package/dist/renderer-NPxavnke.js.map +1 -0
  32. package/dist/types/bridges/reactComponent.d.ts +9 -0
  33. package/dist/types/bridges/renderToString.d.ts +6 -0
  34. package/dist/types/bridges/vitePlugin.d.ts +8 -0
  35. package/dist/types/bridges/vueComponent.vue.d.ts +23 -0
  36. package/dist/types/bridges.d.ts +4 -0
  37. package/dist/types/chimp.d.ts +7 -0
  38. package/dist/types/core/baseModule.d.ts +15 -0
  39. package/dist/types/{controller.d.ts → core/controller.d.ts} +4 -8
  40. package/dist/types/{dataManager.d.ts → core/dataManager.d.ts} +30 -18
  41. package/dist/types/{declarations.d.ts → core/declarations.d.ts} +22 -32
  42. package/dist/types/core/index.d.ts +14 -0
  43. package/dist/types/{interactionHandler.d.ts → core/interactionHandler.d.ts} +3 -3
  44. package/dist/types/{overlayManager.d.ts → core/overlayManager.d.ts} +4 -4
  45. package/dist/types/{renderer.d.ts → core/renderer.d.ts} +2 -3
  46. package/dist/types/{utilities.d.ts → core/utilities.d.ts} +1 -3
  47. package/dist/types/dev.d.ts +8 -0
  48. package/dist/types/index.d.ts +2 -21
  49. package/dist/types/{controls → modules/controls}/index.d.ts +2 -2
  50. package/dist/types/{debugPanel → modules/debugPanel}/index.d.ts +2 -2
  51. package/dist/types/{minimap → modules/minimap}/index.d.ts +3 -3
  52. package/dist/types/{mistouchPreventer → modules/mistouchPreventer}/index.d.ts +2 -2
  53. package/dist/types/modules.d.ts +4 -0
  54. package/package.json +36 -9
  55. package/dist/types/baseModule.d.ts +0 -11
  56. package/dist/types/canvasViewer.d.ts +0 -25
  57. package/dist/types/renderToString.d.ts +0 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer-Bzv3aLXp.cjs","sources":["../src/core/overlayManager.ts","../src/core/interactionHandler.ts","../src/core/renderer.ts"],"sourcesContent":["import { type BaseArgs, BaseModule } from '$/baseModule';\nimport Controller from '$/controller';\nimport DataManager from '$/dataManager';\nimport InteractionHandler from '$/interactionHandler';\nimport utilities, { destroyError } from '$/utilities';\nimport type { MarkdownParser } from './declarations';\n\ntype Options = {\n\tmarkdownParser?: MarkdownParser;\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: MarkdownParser;\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 = this.options.markdownParser || ((markdown: string) => markdown);\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\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\n\t\tthis.onStart(this.start);\n\t\tthis.onDispose(this.dispose);\n\t}\n\n\tprivate start = () => {\n\t\tthis.IH().onClick.subscribe(this.select);\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, node.file, 'image');\n\t\t\t\t\telse if (node.file.match(/\\.(mp3|wav)$/i)) this.updateOverlay(node, 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.canvasMap).forEach(node => {\n\t\t\tif (node.type === 'node') createOverlay(node.ref);\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(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 = await this.parse(frontmatterMatch[2]);\n\t\t\telse parsedContent = await 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 async updateOverlay(node: JSONCanvasNode, content: string, type: string) {\n\t\tlet element = this.overlays[node.id];\n\t\tif (!element) {\n\t\t\telement = await 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 async 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 = await 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\tprivate dispose = () => {\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\tstopInteraction: Pointeract['stop'];\n\tstartInteraction: Pointeract['start'];\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\n\t\tthis.onStart(this.start);\n\t\tthis.onDispose(this.dispose);\n\t}\n\n\tprivate start = () => {\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\tprivate dispose = () => {\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, { type MapEdgeItem, type MapNodeItem } from '$/dataManager';\nimport utilities, { destroyError } from '$/utilities';\n\ninterface viewport {\n\tleft: number;\n\tright: number;\n\ttop: number;\n\tbottom: 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\tthis.onDispose(this.dispose);\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\tObject.values(this.DM.data.canvasMap).forEach(item => {\n\t\t\tif (item.type === 'edge') this.drawEdge(item);\n\t\t\telse {\n\t\t\t\tconst node = item.ref;\n\t\t\t\tif (node.type === 'file') this.drawFile(item);\n\t\t\t\telse if (node.type === 'group') this.drawGroup(node, scale);\n\t\t\t}\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 drawFile = (item: MapNodeItem) => {\n\t\tthis.ctx.fillStyle = FONT_COLOR;\n\t\tconst node = item.ref;\n\t\tthis.ctx.font = '16px sans-serif';\n\t\tthis.ctx.fillText(item.fileName || '', node.x + 5, node.y - 10);\n\t};\n\n\tprivate drawEdge = (item: MapEdgeItem) => {\n\t\tconst edge = item.ref;\n\t\tconst fromNode = this.DM.data.canvasMap[edge.fromNode].ref as JSONCanvasNode;\n\t\tconst toNode = this.DM.data.canvasMap[edge.toNode].ref as JSONCanvasNode;\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 (!item.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\titem.controlPoints = [startControlX, startControlY, endControlX, endControlY];\n\t\t} else [startControlX, startControlY, endControlX, endControlY] = item.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 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\tprivate dispose = () => {\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"],"names":["OverlayManager","BaseModule","_overlaysLayer","document","createElement","overlays","selectedId","eventListeners","DM","IH","parse","overlaysLayer","this","destroyError","hooks","onInteractionStart","utilities","makeHook","onInteractionEnd","constructor","args","super","options","markdownParser","markdown","container","get","DataManager","InteractionHandler","lazy","Controller","onRefresh","subscribe","updateOverlays","className","data","appendChild","onStart","start","onDispose","dispose","onClick","select","createOverlay","async","node","type","updateOverlay","text","file","match","loadMarkdownForNode","url","Object","values","canvasMap","forEach","ref","id","previous","current","classList","remove","add","parsedContent","response","fetch","result","frontmatterMatch","err","console","error","style","transform","offsetX","offsetY","scale","content","element","getElementsByClassName","innerHTML","constructOverlay","left","x","top","y","width","height","color","getColor","overlay","backgroundColor","background","setProperty","active","parsedContentWrapper","iframe","src","sandbox","loading","audio","controls","img","clickLayer","overlayBorder","borderColor","border","onEnd","addEventListener","firstElementChild","child","removeEventListener","pointeract","stopInteraction","startInteraction","assign","coordinateOutput","Pointeract","Click","Drag","WheelPanZoom","PreventDefault","MultitouchPanZoom","stop","OM","on","onPan","onZoom","onTrueClick","event","pan","detail","zoom","factor","e","target","closest","findNodeAt","off","FONT_COLOR","Renderer","_canvas","ctx","zoomInOptimize","lastDrawnScale","lastDrawnViewport","right","bottom","timeout","lastCallTime","canvas","controller","redraw","onResize","optimizeDPR","getContext","resizeCanvasForDPR","offsetWidth","offsetHeight","clearTimeout","now","Date","currentViewport","getCurrentViewport","isViewportInside","setTimeout","trueRedraw","fakeRedraw","clearRect","save","translate","item","drawEdge","drawFile","drawGroup","restore","cssScale","currentOffsetX","currentOffsetY","inner","outer","clientWidth","clientHeight","drawLabelBar","label","barHeight","radius","yOffset","fontSize","xPadding","font","barWidth","measureText","fillStyle","beginPath","moveTo","lineTo","quadraticCurveTo","closePath","fill","fillText","drawNodeBackground","colors","globalAlpha","drawRoundRect","strokeStyle","lineWidth","stroke","fileName","edge","fromNode","toNode","gac","getAnchorCoord","startX","startY","fromSide","endX","endY","toSide","startControlX","startControlY","endControlX","endControlY","controlPoints","getControlPoints","drawCurvedPath","drawArrowhead","t","padding","labelWidth","labelHeight","textAlign","textBaseline","distanceX","distanceY","realDistance","Math","min","abs","max","PADDING","val","c1x","c1y","c2x","c2y","bezierCurveTo","tipX","tipY","fromX","fromY","dx","dy","length","sqrt","unitX","unitY","leftX","leftY","rightX","rightY"],"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 l,C as h}from"./controller-UN-hOZ_r.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(l),this.IH=this.container.get(p,{lazy:!0});this.container.get(h).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=async t=>{switch(t.type){case"text":this.updateOverlay(t,t.text,"text");break;case"file":t.file.match(/\.md$/i)?this.loadMarkdownForNode(t):t.file.match(/\.(png|jpg|jpeg|gif|svg|webp)$/i)?this.updateOverlay(t,t.file,"image"):t.file.match(/\.(mp3|wav)$/i)&&this.updateOverlay(t,t.file,"audio");break;case"link":this.updateOverlay(t,t.url,"link")}};Object.values(this.DM.data.canvasMap).forEach(e=>{"node"===e.type&&t(e.ref)})};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(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(l);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(h);e.hooks.onRefresh.subscribe(this.redraw),e.hooks.onResize.subscribe(this.optimizeDPR),this.DM=this.container.get(l),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),Object.values(this.DM.data.canvasMap).forEach(t=>{if("edge"===t.type)this.drawEdge(t);else{const e=t.ref;"file"===e.type?this.drawFile(t):"group"===e.type&&this.drawGroup(e,s)}}),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,l=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 h=this.ctx.measureText(s).width+2*l;this.ctx.translate(0,-o-r),this.ctx.fillStyle=i,this.ctx.beginPath(),this.ctx.moveTo(n,0),this.ctx.lineTo(h-n,0),this.ctx.quadraticCurveTo(h,0,h,n),this.ctx.lineTo(h,o-n),this.ctx.quadraticCurveTo(h,o,h-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,l,.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)};drawFile=t=>{this.ctx.fillStyle=m;const e=t.ref;this.ctx.font="16px sans-serif",this.ctx.fillText(t.fileName||"",e.x+5,e.y-10)};drawEdge=t=>{const e=t.ref,s=this.DM.data.canvasMap[e.fromNode].ref,i=this.DM.data.canvasMap[e.toNode].ref,a=c.getAnchorCoord,[o,n]=a(s,e.fromSide),[r,l]=a(i,e.toSide),{active:h}=c.getColor(e.color);let[d,p,m,u]=[0,0,0,0];if(t.controlPoints?[d,p,m,u]=t.controlPoints:([d,p,m,u]=this.getControlPoints(o,n,r,l,e.fromSide,e.toSide),t.controlPoints=[d,p,m,u]),this.drawCurvedPath(o,n,r,l,d,p,m,u,h),this.drawArrowhead(r,l,m,u,h),e.label){const t=.5,s=(1-t)**3*o+3*(1-t)**2*t*d+3*(1-t)*t*t*m+t**3*r,i=(1-t)**3*n+3*(1-t)**2*t*p+3*(1-t)*t*t*u+t**3*l;this.ctx.font="18px sans-serif";const a=8,h=this.ctx.measureText(e.label).width+2*a,v=20;this.ctx.fillStyle="#222",this.ctx.beginPath(),c.drawRoundRect(this.ctx,s-h/2,i-v/2-2,h,v,4),this.ctx.fill(),this.ctx.fillStyle="#ccc",this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.fillText(e.label,s,i-2),this.ctx.textAlign="left",this.ctx.textBaseline="alphabetic"}};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)),l=(h=.5*c,d=60,p=300,Math.max(d,Math.min(p,h)));var h,d,p;let m=t,u=e,v=s,x=i;switch(a){case"top":u=e-l;break;case"bottom":u=e+l;break;case"left":m=t-l;break;case"right":m=t+l}switch(o){case"top":x=i-l;break;case"bottom":x=i+l;break;case"left":v=s-l;break;case"right":v=s+l}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,l=n/r,h=t-12*c-7*l,d=e-12*l+7*c,p=t-12*c+7*l,m=e-12*l-7*c;this.ctx.beginPath(),this.ctx.fillStyle=a,this.ctx.moveTo(t,e),this.ctx.lineTo(h,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-NPxavnke.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer-NPxavnke.js","sources":["../src/core/overlayManager.ts","../src/core/interactionHandler.ts","../src/core/renderer.ts"],"sourcesContent":["import { type BaseArgs, BaseModule } from '$/baseModule';\nimport Controller from '$/controller';\nimport DataManager from '$/dataManager';\nimport InteractionHandler from '$/interactionHandler';\nimport utilities, { destroyError } from '$/utilities';\nimport type { MarkdownParser } from './declarations';\n\ntype Options = {\n\tmarkdownParser?: MarkdownParser;\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: MarkdownParser;\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 = this.options.markdownParser || ((markdown: string) => markdown);\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\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\n\t\tthis.onStart(this.start);\n\t\tthis.onDispose(this.dispose);\n\t}\n\n\tprivate start = () => {\n\t\tthis.IH().onClick.subscribe(this.select);\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, node.file, 'image');\n\t\t\t\t\telse if (node.file.match(/\\.(mp3|wav)$/i)) this.updateOverlay(node, 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.canvasMap).forEach(node => {\n\t\t\tif (node.type === 'node') createOverlay(node.ref);\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(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 = await this.parse(frontmatterMatch[2]);\n\t\t\telse parsedContent = await 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 async updateOverlay(node: JSONCanvasNode, content: string, type: string) {\n\t\tlet element = this.overlays[node.id];\n\t\tif (!element) {\n\t\t\telement = await 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 async 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 = await 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\tprivate dispose = () => {\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\tstopInteraction: Pointeract['stop'];\n\tstartInteraction: Pointeract['start'];\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\n\t\tthis.onStart(this.start);\n\t\tthis.onDispose(this.dispose);\n\t}\n\n\tprivate start = () => {\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\tprivate dispose = () => {\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, { type MapEdgeItem, type MapNodeItem } from '$/dataManager';\nimport utilities, { destroyError } from '$/utilities';\n\ninterface viewport {\n\tleft: number;\n\tright: number;\n\ttop: number;\n\tbottom: 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\tthis.onDispose(this.dispose);\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\tObject.values(this.DM.data.canvasMap).forEach(item => {\n\t\t\tif (item.type === 'edge') this.drawEdge(item);\n\t\t\telse {\n\t\t\t\tconst node = item.ref;\n\t\t\t\tif (node.type === 'file') this.drawFile(item);\n\t\t\t\telse if (node.type === 'group') this.drawGroup(node, scale);\n\t\t\t}\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 drawFile = (item: MapNodeItem) => {\n\t\tthis.ctx.fillStyle = FONT_COLOR;\n\t\tconst node = item.ref;\n\t\tthis.ctx.font = '16px sans-serif';\n\t\tthis.ctx.fillText(item.fileName || '', node.x + 5, node.y - 10);\n\t};\n\n\tprivate drawEdge = (item: MapEdgeItem) => {\n\t\tconst edge = item.ref;\n\t\tconst fromNode = this.DM.data.canvasMap[edge.fromNode].ref as JSONCanvasNode;\n\t\tconst toNode = this.DM.data.canvasMap[edge.toNode].ref as JSONCanvasNode;\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 (!item.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\titem.controlPoints = [startControlX, startControlY, endControlX, endControlY];\n\t\t} else [startControlX, startControlY, endControlX, endControlY] = item.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 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\tprivate dispose = () => {\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"],"names":["OverlayManager","BaseModule","_overlaysLayer","document","createElement","overlays","selectedId","eventListeners","DM","IH","parse","overlaysLayer","this","destroyError","hooks","onInteractionStart","utilities","makeHook","onInteractionEnd","constructor","args","super","options","markdownParser","markdown","container","get","DataManager","InteractionHandler","lazy","Controller","onRefresh","subscribe","updateOverlays","className","data","appendChild","onStart","start","onDispose","dispose","onClick","select","createOverlay","async","node","type","updateOverlay","text","file","match","loadMarkdownForNode","url","Object","values","canvasMap","forEach","ref","id","previous","current","classList","remove","add","parsedContent","response","fetch","result","frontmatterMatch","err","console","error","style","transform","offsetX","offsetY","scale","content","element","getElementsByClassName","innerHTML","constructOverlay","left","x","top","y","width","height","color","getColor","overlay","backgroundColor","background","setProperty","active","parsedContentWrapper","iframe","src","sandbox","loading","audio","controls","img","clickLayer","overlayBorder","borderColor","border","onEnd","addEventListener","firstElementChild","child","removeEventListener","pointeract","stopInteraction","startInteraction","assign","coordinateOutput","Pointeract","Click","Drag","WheelPanZoom","PreventDefault","MultitouchPanZoom","stop","OM","on","onPan","onZoom","onTrueClick","event","pan","detail","zoom","factor","e","target","closest","findNodeAt","off","FONT_COLOR","Renderer","_canvas","ctx","zoomInOptimize","lastDrawnScale","lastDrawnViewport","right","bottom","timeout","lastCallTime","canvas","controller","redraw","onResize","optimizeDPR","getContext","resizeCanvasForDPR","offsetWidth","offsetHeight","clearTimeout","now","Date","currentViewport","getCurrentViewport","isViewportInside","setTimeout","trueRedraw","fakeRedraw","clearRect","save","translate","item","drawEdge","drawFile","drawGroup","restore","cssScale","currentOffsetX","currentOffsetY","inner","outer","clientWidth","clientHeight","drawLabelBar","label","barHeight","radius","yOffset","fontSize","xPadding","font","barWidth","measureText","fillStyle","beginPath","moveTo","lineTo","quadraticCurveTo","closePath","fill","fillText","drawNodeBackground","colors","globalAlpha","drawRoundRect","strokeStyle","lineWidth","stroke","fileName","edge","fromNode","toNode","gac","getAnchorCoord","startX","startY","fromSide","endX","endY","toSide","startControlX","startControlY","endControlX","endControlY","controlPoints","getControlPoints","drawCurvedPath","drawArrowhead","t","padding","labelWidth","labelHeight","textAlign","textBaseline","distanceX","distanceY","realDistance","Math","min","abs","max","PADDING","val","c1x","c1y","c2x","c2y","bezierCurveTo","tipX","tipY","fromX","fromY","dx","dy","length","sqrt","unitX","unitY","leftX","leftY","rightX","rightY"],"mappings":"mMAWA,MAAqBA,UAAuBC,EACnCC,eAAwCC,SAASC,cAAc,OAC/DC,SAA2C,CAAA,EAC3CC,WAA4B,KAC5BC,eAA8D,CAAA,EAC9DC,GACAC,GACAC,MAER,iBAAYC,GACX,IAAKC,KAAKV,eAAgB,MAAMW,EAChC,OAAOD,KAAKV,cACb,CAEAY,MAAQ,CACPC,mBAAoBC,EAAUC,WAC9BC,iBAAkBF,EAAUC,YAG7B,WAAAE,IAAeC,GACdC,SAASD,GACTR,KAAKF,MAAQE,KAAKU,QAAQC,gBAAA,CAAoBC,GAAqBA,GACnEZ,KAAKJ,GAAKI,KAAKa,UAAUC,IAAIC,GAC7Bf,KAAKH,GAAKG,KAAKa,UAAUC,IAAIE,EAAoB,CAAEC,MAAM,IACtCjB,KAAKa,UAAUC,IAAII,GAC3BhB,MAAMiB,UAAUC,UAAUpB,KAAKqB,gBAE1CrB,KAAKV,eAAiBC,SAASC,cAAc,OAC7CQ,KAAKV,eAAegC,UAAY,WAChCtB,KAAKJ,GAAG2B,KAAKV,UAAUW,YAAYxB,KAAKD,eAExCC,KAAKyB,QAAQzB,KAAK0B,OAClB1B,KAAK2B,UAAU3B,KAAK4B,QACrB,CAEQF,MAAQ,KACf1B,KAAKH,KAAKgC,QAAQT,UAAUpB,KAAK8B,QACjC,MAAMC,EAAgBC,MAAOC,IAC5B,OAAQA,EAAKC,MACZ,IAAK,OACJlC,KAAKmC,cAAcF,EAAMA,EAAKG,KAAM,QACpC,MAED,IAAK,OACAH,EAAKI,KAAKC,MAAM,UAAWtC,KAAKuC,oBAAoBN,GAC/CA,EAAKI,KAAKC,MAAM,mCACxBtC,KAAKmC,cAAcF,EAAMA,EAAKI,KAAM,SAC5BJ,EAAKI,KAAKC,MAAM,uBAAuBH,cAAcF,EAAMA,EAAKI,KAAM,SAC/E,MAED,IAAK,OACJrC,KAAKmC,cAAcF,EAAMA,EAAKO,IAAK,UAKtCC,OAAOC,OAAO1C,KAAKJ,GAAG2B,KAAKoB,WAAWC,QAAQX,IAC3B,SAAdA,EAAKC,MAAiBH,EAAcE,EAAKY,QAIvCf,OAAUgB,IACjB,MAAMC,EAAY/C,KAAKN,WAAoBM,KAAKP,SAASO,KAAKN,YAA1B,KAC9BsD,EAAWF,EAAY9C,KAAKP,SAASqD,GAArB,KAClBC,GAAUA,EAASE,UAAUC,OAAO,UACpCF,GACHA,EAAQC,UAAUE,IAAI,UACtBnD,KAAKE,MAAMC,sBACLH,KAAKE,MAAMI,mBAClBN,KAAKN,WAAaoD,GAGXP,oBAAsBP,MAAOC,IAEpC,IAAImB,EADJpD,KAAKmC,cAAcF,EAAM,aAAc,QAEvC,IACC,MAAMoB,QAAiBC,MAAMrB,EAAKI,MAC5BkB,QAAeF,EAASjB,OACxBoB,EAAmBD,EAAOjB,MAAM,qCAChBc,EAAlBI,QAAwCxD,KAAKF,MAAM0D,EAAiB,UAC7CxD,KAAKF,MAAMyD,EACvC,OAASE,GACRC,QAAQC,MAAM,8CAA+CF,GAC7DL,EAAgB,yBACjB,CACApD,KAAKmC,cAAcF,EAAMmB,EAAe,SAGjC/B,eAAiB,KACxB,MAAME,EAAOvB,KAAKJ,GAAG2B,KACrBvB,KAAKD,cAAc6D,MAAMC,UAAY,aAAatC,EAAKuC,cAAcvC,EAAKwC,oBAAoBxC,EAAKyC,UAGpG,mBAAc7B,CAAcF,EAAsBgC,EAAiB/B,GAClE,IAAIgC,EAAUlE,KAAKP,SAASwC,EAAKa,IACjC,GAAKoB,GAQL,GAAoB,SAAThC,EAAiB,CACIgC,EAAQC,uBAAuB,0BAA0B,GACjEC,UAAYH,CACpC,OAVCC,QAAgBlE,KAAKqE,iBAAiBpC,EAAMgC,EAAS/B,GACrDlC,KAAKD,cAAcyB,YAAY0C,GAC/BlE,KAAKP,SAASwC,EAAKa,IAAMoB,EACzBA,EAAQN,MAAMU,KAAO,GAAGrC,EAAKsC,MAC7BL,EAAQN,MAAMY,IAAM,GAAGvC,EAAKwC,MAC5BP,EAAQN,MAAMc,MAAQ,GAAGzC,EAAKyC,UAC9BR,EAAQN,MAAMe,OAAS,GAAG1C,EAAK0C,UAKjC,CAEA,sBAAcN,CAAiBpC,EAAsBgC,EAAiB/B,GACrE,MAAM0C,EAAQxE,EAAUyE,SAAS5C,EAAK2C,OAChCE,EAAUvF,SAASC,cAAc,OAKvC,OAJAsF,EAAQ7B,UAAUE,IAAI,qBACtB2B,EAAQhC,GAAKb,EAAKa,GAClBgC,EAAQlB,MAAMmB,gBAAkBH,EAAMI,WACtCF,EAAQlB,MAAMqB,YAAY,iBAAkBL,EAAMM,QAC1ChD,GACP,IAAK,OAAQ,CACZ4C,EAAQ7B,UAAUE,IAAI,oBACtB,MAAMgC,EAAuB5F,SAASC,cAAc,OACpD2F,EAAqBf,gBAAkBpE,KAAKF,MAAMmE,GAAW,IAC7DkB,EAAqBlC,UAAUE,IAAI,0BACnC2B,EAAQtD,YAAY2D,GACpB,KACD,CACA,IAAK,OAAQ,CACZ,MAAMC,EAAS7F,SAASC,cAAc,UACtC4F,EAAOC,IAAMpB,EACbmB,EAAOE,QAAU,kCACjBF,EAAO9D,UAAY,cACnB8D,EAAOG,QAAU,OACjBT,EAAQtD,YAAY4D,GACpB,KACD,CACA,IAAK,QAAS,CACb,MAAMI,EAAQjG,SAASC,cAAc,SACrCgG,EAAMlE,UAAY,QAClBkE,EAAMH,IAAMpB,EACZuB,EAAMC,UAAW,EACjBX,EAAQtD,YAAYgE,GACpB,KACD,CACA,IAAK,QAAS,CACb,MAAME,EAAMnG,SAASC,cAAc,OACnCkG,EAAIL,IAAMpB,EACVyB,EAAIH,QAAU,OACdT,EAAQtD,YAAYkE,EACrB,EAED,OAAQxD,GACP,IAAK,OACL,IAAK,QAAS,CACb,MAAMyD,EAAapG,SAASC,cAAc,OAC1CmG,EAAWrE,UAAY,cACvBwD,EAAQtD,YAAYmE,EACrB,EAED,MAAMC,EAAgBrG,SAASC,cAAc,OAC7CoG,EAActE,UAAY,iBAC1BsE,EAAchC,MAAMiC,YAAcjB,EAAMkB,OACxChB,EAAQtD,YAAYoE,GACpB,MAAMnE,EAAU,KACXQ,EAAKa,KAAO9C,KAAKN,YAAYM,KAAKE,MAAMC,sBAEvC4F,EAAQ,KACT9D,EAAKa,KAAO9C,KAAKN,YAAYM,KAAKE,MAAMI,oBAO7C,OALAwE,EAAQkB,iBAAiB,eAAgBvE,GACzCqD,EAAQkB,iBAAiB,eAAgBD,GACzCjB,EAAQkB,iBAAiB,aAAcvE,GACvCqD,EAAQkB,iBAAiB,WAAYD,GACrC/F,KAAKL,eAAesC,EAAKa,IAAM,CAACrB,EAASsE,GAClCjB,CACR,CAEQlD,QAAU,KACjB,KAAO5B,KAAKD,cAAckG,mBAAmB,CAC5C,MAAMC,EAAQlG,KAAKD,cAAckG,kBACjC,GAAIjG,KAAKL,eAAeuG,EAAMpD,IAAK,CAClC,MAAMrB,EAAUzB,KAAKL,eAAeuG,EAAMpD,IAAI,GACxCiD,EAAQ/F,KAAKL,eAAeuG,EAAMpD,IAAI,GAC5C,IAAKrB,IAAYsE,EAAO,MAAM9F,EAC9BiG,EAAMC,oBAAoB,eAAgB1E,GAC1CyE,EAAMC,oBAAoB,eAAgBJ,GAC1CG,EAAMC,oBAAoB,aAAc1E,GACxCyE,EAAMC,oBAAoB,WAAYJ,GACtC/F,KAAKL,eAAeuG,EAAMpD,IAAI,GAAK,KACnC9C,KAAKL,eAAeuG,EAAMpD,IAAI,GAAK,IACpC,CACAoD,EAAMhD,QACP,CACAlD,KAAKD,cAAcmD,SACnBlD,KAAKV,eAAiB,MCvLxB,MAAqB0B,UAA2B3B,EACvC+G,WACAxG,GACRiC,QAAUzB,EAAUC,WACpBgG,gBACAC,iBAEA,WAAA/F,IAAeC,GACdC,SAASD,GACTR,KAAKJ,GAAKI,KAAKa,UAAUC,IAAIC,GAC7B,MAAML,EAAU+B,OAAO8D,OAAOvG,KAAKU,QAAQ0F,YAAc,GAAI,CAC5DI,iBAAkB,aAEnBxG,KAAKoG,WAAa,IAAIK,EACrBzG,KAAKJ,GAAG2B,KAAKV,UACb,CAAC6F,EAAOC,EAAMC,EAAcC,EAAgBC,GAC5CpG,GAEDV,KAAKsG,iBAAmBtG,KAAKoG,WAAW1E,MACxC1B,KAAKqG,gBAAkBrG,KAAKoG,WAAWW,KACvC,MAAMC,EAAKhH,KAAKa,UAAUC,IAAI1B,GAC9B4H,EAAG9G,MAAMC,mBAAmBiB,UAAUpB,KAAKqG,iBAC3CW,EAAG9G,MAAMI,iBAAiBc,UAAUpB,KAAKsG,kBAEzCtG,KAAKyB,QAAQzB,KAAK0B,OAClB1B,KAAK2B,UAAU3B,KAAK4B,QACrB,CAEQF,MAAQ,KACf1B,KAAKoG,WAAWa,GAAG,MAAOjH,KAAKkH,OAC/BlH,KAAKoG,WAAWa,GAAG,OAAQjH,KAAKkH,OAChClH,KAAKoG,WAAWa,GAAG,OAAQjH,KAAKmH,QAChCnH,KAAKoG,WAAWa,GAAG,YAAajH,KAAKoH,aACrCpH,KAAKoG,WAAW1E,SAGTwF,MAASG,IAChBrH,KAAKJ,GAAG0H,IAAID,EAAME,SAEXJ,OAAUE,IACjB,MAAME,EAASF,EAAME,OACrBvH,KAAKJ,GAAG4H,KAAKD,EAAOE,OAAQ,CAAElD,EAAGgD,EAAOhD,EAAGE,EAAG8C,EAAO9C,KAG9C2C,YAAeM,IACtB,MAAMH,EAASG,EAAEH,OAKjB,IAJqBI,EAILD,EAAEH,OAAOI,UAFjBA,EAAOC,QAAQ,cAAgBD,EAAOC,QAAQ,WAAaD,EAAOC,QAAQ,UAE1B,OAJxD,IAAqBD,EAKrB,MAAM1F,EAAOjC,KAAKJ,GAAGiI,WAAW,CAAEtD,EAAGgD,EAAOhD,EAAGE,EAAG8C,EAAO9C,IACzDzE,KAAK6B,QAAQI,EAAOA,EAAKa,GAAK,OAGvBlB,QAAU,KACjB5B,KAAKoG,WAAW0B,IAAI,MAAO9H,KAAKkH,OAChClH,KAAKoG,WAAW0B,IAAI,OAAQ9H,KAAKmH,QACjCnH,KAAKoG,WAAW0B,IAAI,YAAa9H,KAAKoH,aACtCpH,KAAKoG,WAAWxE,WCnElB,MAGMmG,EAAa,OAGnB,MAAqBC,UAAiB3I,EAC7B4I,QACAC,IACAtI,GACAuI,eAKJ,CACHC,eAAgB,EAChBC,kBAAmB,CAClB/D,KAAM,EACNgE,MAAO,EACP9D,IAAK,EACL+D,OAAQ,GAETC,QAAS,KACTC,aAAc,GAGf,UAAYC,GACX,GAAqB,OAAjB1I,KAAKiI,QAAkB,MAAMhI,EACjC,OAAOD,KAAKiI,OACb,CAEA,WAAA1H,IAAeC,GACdC,SAASD,GACT,MAAMmI,EAAa3I,KAAKa,UAAUC,IAAII,GACtCyH,EAAWzI,MAAMiB,UAAUC,UAAUpB,KAAK4I,QAC1CD,EAAWzI,MAAM2I,SAASzH,UAAUpB,KAAK8I,aACzC9I,KAAKJ,GAAKI,KAAKa,UAAUC,IAAIC,GAC7Bf,KAAKiI,QAAU1I,SAASC,cAAc,UACtCQ,KAAKiI,QAAQ3G,UAAY,cACzBtB,KAAKkI,IAAMlI,KAAKiI,QAAQc,WAAW,MACnC/I,KAAKJ,GAAG2B,KAAKV,UAAUW,YAAYxB,KAAKiI,SACxCjI,KAAK2B,UAAU3B,KAAK4B,QACrB,CAEQkH,YAAc,KACrB,MAAMjI,EAAYb,KAAKJ,GAAG2B,KAAKV,UAC/BT,EAAU4I,mBAAmBhJ,KAAK0I,OAAQ7H,EAAUoI,YAAapI,EAAUqI,eAGpEN,OAAS,KACZ5I,KAAKmI,eAAeK,UACvBW,aAAanJ,KAAKmI,eAAeK,SACjCxI,KAAKmI,eAAeK,QAAU,MAE/B,MAAMY,EAAMC,KAAKD,MACXtF,EAAU9D,KAAKJ,GAAG2B,KAAKuC,QACvBC,EAAU/D,KAAKJ,GAAG2B,KAAKwC,QACvBC,EAAQhE,KAAKJ,GAAG2B,KAAKyC,MACrBsF,EAAkBtJ,KAAKuJ,mBAAmBzF,EAASC,EAASC,GAClE,GACChE,KAAKwJ,iBAAiBF,EAAiBtJ,KAAKmI,eAAeE,oBAC3DrE,IAAUhE,KAAKmI,eAAeC,eAC7B,CAED,GADsBgB,EAAMpJ,KAAKmI,eAAeM,aA5DlB,IAoE7B,OANAzI,KAAKmI,eAAeK,QAAUiB,WAAW,KACxCzJ,KAAK0J,WAAW5F,EAASC,EAASC,EAAOsF,GACzCtJ,KAAKmI,eAAeM,aAAeW,EACnCpJ,KAAKmI,eAAeK,QAAU,MAC5B,SACHxI,KAAK2J,WAAWL,EAAiBtF,EAGnC,CACAhE,KAAKmI,eAAeM,aAAeW,EACnCpJ,KAAK0J,WAAW5F,EAASC,EAASC,EAAOsF,IAGlC,UAAAI,CAAW5F,EAAiBC,EAAiBC,EAAesF,GACnEtJ,KAAKmI,eAAeE,kBAAoBiB,EACxCtJ,KAAKmI,eAAeC,eAAiBpE,EACrChE,KAAK0I,OAAO9E,MAAMC,UAAY,GAC9B7D,KAAKkI,IAAI0B,UAAU,EAAG,EAAG5J,KAAK0I,OAAOhE,MAAO1E,KAAK0I,OAAO/D,QACxD3E,KAAKkI,IAAI2B,OACT7J,KAAKkI,IAAI4B,UAAUhG,EAASC,GAC5B/D,KAAKkI,IAAIlE,MAAMA,EAAOA,GACtBvB,OAAOC,OAAO1C,KAAKJ,GAAG2B,KAAKoB,WAAWC,QAAQmH,IAC7C,GAAkB,SAAdA,EAAK7H,KAAiBlC,KAAKgK,SAASD,OACnC,CACJ,MAAM9H,EAAO8H,EAAKlH,IACA,SAAdZ,EAAKC,KAAiBlC,KAAKiK,SAASF,GACjB,UAAd9H,EAAKC,MAAkBlC,KAAKkK,UAAUjI,EAAM+B,EACtD,IAEDhE,KAAKkI,IAAIiC,SACV,CAEQ,UAAAR,CAAWL,EAA2BtF,GAC7C,MAAMoG,EAAWpG,EAAQhE,KAAKmI,eAAeC,eACvCiC,GAAkBrK,KAAKmI,eAAeE,kBAAkB/D,KAAOgF,EAAgBhF,MAAQN,EACvFsG,GAAkBtK,KAAKmI,eAAeE,kBAAkB7D,IAAM8E,EAAgB9E,KAAOR,EAC3FhE,KAAK0I,OAAO9E,MAAMC,UAAY,aAAawG,QAAqBC,cAA2BF,IAC5F,CAEQZ,iBAAmB,CAACe,EAAiBC,IAC5CD,EAAMjG,KAAOkG,EAAMlG,MACnBiG,EAAM/F,IAAMgG,EAAMhG,KAClB+F,EAAMjC,MAAQkC,EAAMlC,OACpBiC,EAAMhC,OAASiC,EAAMjC,OAEdgB,mBAAqB,CAACzF,EAAiBC,EAAiBC,KAC/D,MAAMM,GAAQR,EAAUE,EAClBQ,GAAOT,EAAUC,EACjBnD,EAAYb,KAAKJ,GAAG2B,KAAKV,UAG/B,MAAO,CAAEyD,OAAME,MAAK8D,MAFNhE,EAAOzD,EAAU4J,YAAczG,EAElBuE,OADZ/D,EAAM3D,EAAU6J,aAAe1G,IAIvC2G,aAAe,CAACpG,EAAWE,EAAWmG,EAAehG,EAAeZ,KAC3E,MAAM6G,EAAY,GAAK7G,EACjB8G,EAAS,EAAI9G,EACb+G,EAAU,EAAI/G,EACdgH,EAAW,GAAKhH,EAChBiH,EAAW,EAAIjH,EACrBhE,KAAKkI,IAAI2B,OACT7J,KAAKkI,IAAI4B,UAAUvF,EAAGE,GACtBzE,KAAKkI,IAAIlE,MAAM,EAAIA,EAAO,EAAIA,GAC9BhE,KAAKkI,IAAIgD,KAAO,GAAGF,0BACnB,MAAMG,EAAWnL,KAAKkI,IAAIkD,YAAYR,GAAOlG,MAAQ,EAAIuG,EACzDjL,KAAKkI,IAAI4B,UAAU,GAAIe,EAAYE,GACnC/K,KAAKkI,IAAImD,UAAYzG,EACrB5E,KAAKkI,IAAIoD,YACTtL,KAAKkI,IAAIqD,OAAOT,EAAQ,GACxB9K,KAAKkI,IAAIsD,OAAOL,EAAWL,EAAQ,GACnC9K,KAAKkI,IAAIuD,iBAAiBN,EAAU,EAAGA,EAAUL,GACjD9K,KAAKkI,IAAIsD,OAAOL,EAAUN,EAAYC,GACtC9K,KAAKkI,IAAIuD,iBAAiBN,EAAUN,EAAWM,EAAWL,EAAQD,GAClE7K,KAAKkI,IAAIsD,OAAOV,EAAQD,GACxB7K,KAAKkI,IAAIuD,iBAAiB,EAAGZ,EAAW,EAAGA,EAAYC,GACvD9K,KAAKkI,IAAIsD,OAAO,EAAGV,GACnB9K,KAAKkI,IAAIuD,iBAAiB,EAAG,EAAGX,EAAQ,GACxC9K,KAAKkI,IAAIwD,YACT1L,KAAKkI,IAAIyD,OACT3L,KAAKkI,IAAImD,UAAYtD,EACrB/H,KAAKkI,IAAI0D,SAAShB,EAAOK,EAAsB,IAAZJ,GACnC7K,KAAKkI,IAAIiC,WAGF0B,mBAAsB5J,IAC7B,MAAM6J,EAAS1L,EAAUyE,SAAS5C,EAAK2C,OAEvC5E,KAAKkI,IAAI6D,YAAc,EACvB/L,KAAKkI,IAAImD,UAAYS,EAAO9G,WAC5B5E,EAAU4L,cAAchM,KAAKkI,IAAKjG,EAAKsC,EAAI,EAAGtC,EAAKwC,EAAI,EAAGxC,EAAKyC,MAAQ,EAAGzC,EAAK0C,OAAS,EAzJtE,IA0JlB3E,KAAKkI,IAAIyD,OACT3L,KAAKkI,IAAI+D,YAAcH,EAAOhG,OAC9B9F,KAAKkI,IAAIgE,UAAY,EACrB9L,EAAU4L,cAAchM,KAAKkI,IAAKjG,EAAKsC,EAAGtC,EAAKwC,EAAGxC,EAAKyC,MAAOzC,EAAK0C,OA7JjD,IA8JlB3E,KAAKkI,IAAIiE,UAGFjC,UAAY,CAACjI,EAA2B+B,KAC/ChE,KAAK6L,mBAAmB5J,GACpBA,EAAK2I,OACR5K,KAAK2K,aAAa1I,EAAKsC,EAAGtC,EAAKwC,EAAGxC,EAAK2I,MAAOxK,EAAUyE,SAAS5C,EAAK2C,OAAOM,OAAQlB,IAG/EiG,SAAYF,IACnB/J,KAAKkI,IAAImD,UAAYtD,EACrB,MAAM9F,EAAO8H,EAAKlH,IAClB7C,KAAKkI,IAAIgD,KAAO,kBAChBlL,KAAKkI,IAAI0D,SAAS7B,EAAKqC,UAAY,GAAInK,EAAKsC,EAAI,EAAGtC,EAAKwC,EAAI,KAGrDuF,SAAYD,IACnB,MAAMsC,EAAOtC,EAAKlH,IACZyJ,EAAWtM,KAAKJ,GAAG2B,KAAKoB,UAAU0J,EAAKC,UAAUzJ,IACjD0J,EAASvM,KAAKJ,GAAG2B,KAAKoB,UAAU0J,EAAKE,QAAQ1J,IAC7C2J,EAAMpM,EAAUqM,gBACfC,EAAQC,GAAUH,EAAIF,EAAUD,EAAKO,WACrCC,EAAMC,GAAQN,EAAID,EAAQF,EAAKU,SAChC7H,OAAEA,GAAW9E,EAAUyE,SAASwH,EAAKzH,OAC3C,IAAKoI,EAAeC,EAAeC,EAAaC,GAAe,CAAC,EAAG,EAAG,EAAG,GAwBzE,GAvBKpD,EAAKqD,eAUFJ,EAAeC,EAAeC,EAAaC,GAAepD,EAAKqD,gBATrEJ,EAAeC,EAAeC,EAAaC,GAAenN,KAAKqN,iBAC/DX,EACAC,EACAE,EACAC,EACAT,EAAKO,SACLP,EAAKU,QAENhD,EAAKqD,cAAgB,CAACJ,EAAeC,EAAeC,EAAaC,IAElEnN,KAAKsN,eACJZ,EACAC,EACAE,EACAC,EACAE,EACAC,EACAC,EACAC,EACAjI,GAEDlF,KAAKuN,cAAcV,EAAMC,EAAMI,EAAaC,EAAajI,GACrDmH,EAAKzB,MAAO,CACf,MAAM4C,EAAI,GACJjJ,GACJ,EAAIiJ,IAAM,EAAId,EACf,GAAK,EAAIc,IAAM,EAAIA,EAAIR,EACvB,GAAK,EAAIQ,GAAKA,EAAIA,EAAIN,EACtBM,GAAK,EAAIX,EACJpI,GACJ,EAAI+I,IAAM,EAAIb,EACf,GAAK,EAAIa,IAAM,EAAIA,EAAIP,EACvB,GAAK,EAAIO,GAAKA,EAAIA,EAAIL,EACtBK,GAAK,EAAIV,EACV9M,KAAKkI,IAAIgD,KAAO,kBAChB,MACMuC,EAAU,EACVC,EAFU1N,KAAKkI,IAAIkD,YAAYiB,EAAKzB,OAEflG,MAAkB,EAAV+I,EAC7BE,EAAc,GACpB3N,KAAKkI,IAAImD,UAAY,OACrBrL,KAAKkI,IAAIoD,YACTlL,EAAU4L,cACThM,KAAKkI,IACL3D,EAAImJ,EAAa,EACjBjJ,EAAIkJ,EAAc,EAAI,EACtBD,EACAC,EACA,GAED3N,KAAKkI,IAAIyD,OACT3L,KAAKkI,IAAImD,UAAY,OACrBrL,KAAKkI,IAAI0F,UAAY,SACrB5N,KAAKkI,IAAI2F,aAAe,SACxB7N,KAAKkI,IAAI0D,SAASS,EAAKzB,MAAOrG,EAAGE,EAAI,GACrCzE,KAAKkI,IAAI0F,UAAY,OACrB5N,KAAKkI,IAAI2F,aAAe,YACzB,GAGOR,iBAAmB,CAC1BX,EACAC,EACAE,EACAC,EACAF,EACAG,KAEA,MAAMe,EAAYjB,EAAOH,EACnBqB,EAAYjB,EAAOH,EACnBqB,EACLC,KAAKC,IAAID,KAAKE,IAAIL,GAAYG,KAAKE,IAAIJ,IACvC,GAAME,KAAKG,IAAIH,KAAKE,IAAIL,GAAYG,KAAKE,IAAIJ,IAExCM,GADSC,EACsB,GAAfN,EADME,EACc,GADDE,EACK,IADWH,KAAKG,IAAIF,EAAKD,KAAKC,IAAIE,EAAKE,KAAvE,IAACA,EAAaJ,EAAaE,EAEzC,IAAIpB,EAAgBN,EAChBO,EAAgBN,EAChBO,EAAcL,EACdM,EAAcL,EAClB,OAAQF,GACP,IAAK,MACJK,EAAgBN,EAAS0B,EACzB,MACD,IAAK,SACJpB,EAAgBN,EAAS0B,EACzB,MACD,IAAK,OACJrB,EAAgBN,EAAS2B,EACzB,MACD,IAAK,QACJrB,EAAgBN,EAAS2B,EAG3B,OAAQtB,GACP,IAAK,MACJI,EAAcL,EAAOuB,EACrB,MACD,IAAK,SACJlB,EAAcL,EAAOuB,EACrB,MACD,IAAK,OACJnB,EAAcL,EAAOwB,EACrB,MACD,IAAK,QACJnB,EAAcL,EAAOwB,EAGvB,MAAO,CAACrB,EAAeC,EAAeC,EAAaC,IAG5CG,eAAiB,CACxBZ,EACAC,EACAE,EACAC,EACAyB,EACAC,EACAC,EACAC,EACA9J,KAEA5E,KAAKkI,IAAIoD,YACTtL,KAAKkI,IAAIqD,OAAOmB,EAAQC,GACxB3M,KAAKkI,IAAIyG,cAAcJ,EAAKC,EAAKC,EAAKC,EAAK7B,EAAMC,GACjD9M,KAAKkI,IAAI+D,YAAcrH,EACvB5E,KAAKkI,IAAIgE,UAAY,EACrBlM,KAAKkI,IAAIiE,UAGFoB,cAAgB,CAACqB,EAAcC,EAAcC,EAAeC,EAAenK,KAClF,MAAMoK,EAAKJ,EAAOE,EACZG,EAAKJ,EAAOE,EACZG,EAASjB,KAAKkB,KAAKH,EAAKA,EAAKC,EAAKA,GACxC,GAAe,IAAXC,EAAc,OAClB,MAAME,EAAQJ,EAAKE,EACbG,EAAQJ,EAAKC,EACbI,EAAQV,EAjUK,GAiUEQ,EAhUH,EAgU0BC,EACtCE,EAAQV,EAlUK,GAkUEQ,EAjUH,EAiU0BD,EACtCI,EAASZ,EAnUI,GAmUGQ,EAlUJ,EAkU2BC,EACvCI,EAASZ,EApUI,GAoUGQ,EAnUJ,EAmU2BD,EAC7CpP,KAAKkI,IAAIoD,YACTtL,KAAKkI,IAAImD,UAAYzG,EACrB5E,KAAKkI,IAAIqD,OAAOqD,EAAMC,GACtB7O,KAAKkI,IAAIsD,OAAO8D,EAAOC,GACvBvP,KAAKkI,IAAIsD,OAAOgE,EAAQC,GACxBzP,KAAKkI,IAAIwD,YACT1L,KAAKkI,IAAIyD,QAGF/J,QAAU,KACb5B,KAAKmI,eAAeK,UACvBW,aAAanJ,KAAKmI,eAAeK,SACjCxI,KAAKmI,eAAeK,QAAU,MAE/BxI,KAAK0I,OAAOxF,SACZlD,KAAKiI,QAAU"}
@@ -0,0 +1,9 @@
1
+ import type { ModuleInputCtor, UserOptions } from '../core/declarations';
2
+ export default function JSONCanvasViewerReact<T extends ModuleInputCtor>({ modules, options, prerenderedContent, className, style, id, }: {
3
+ modules: T;
4
+ options: Omit<UserOptions<T>, 'container'>;
5
+ prerenderedContent?: string;
6
+ className?: string;
7
+ style?: React.CSSProperties;
8
+ id?: string;
9
+ }): import("react").JSX.Element;
@@ -0,0 +1,6 @@
1
+ import type { MarkdownParser } from '../core/declarations';
2
+ export default function (options: {
3
+ canvas: JSONCanvas;
4
+ attachmentDir?: string;
5
+ markdownParser?: MarkdownParser;
6
+ }): Promise<string>;
@@ -0,0 +1,8 @@
1
+ import type { MarkdownParser } from '../core/declarations';
2
+ export default function (parser?: MarkdownParser): {
3
+ name: string;
4
+ transform(code: string, id: string): Promise<{
5
+ code: string;
6
+ map: null;
7
+ } | null>;
8
+ };
@@ -0,0 +1,23 @@
1
+ import type { ModuleInputCtor, UserOptions } from '../core/declarations';
2
+ declare const __VLS_export: <T extends ModuleInputCtor>(__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>["props"], __VLS_ctx?: __VLS_PrettifyLocal<Pick<NonNullable<Awaited<typeof __VLS_setup>>, "attrs" | "emit" | "slots">>, __VLS_exposed?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
3
+ props: import("vue").PublicProps & __VLS_PrettifyLocal<{
4
+ modules?: T | undefined;
5
+ options: Omit<UserOptions<T>, "container">;
6
+ isPrerendering?: boolean;
7
+ }> & (typeof globalThis extends {
8
+ __VLS_PROPS_FALLBACK: infer P;
9
+ } ? P : {});
10
+ expose: (exposed: {}) => void;
11
+ attrs: any;
12
+ slots: {};
13
+ emit: {};
14
+ }>) => import("vue").VNode & {
15
+ __ctx?: Awaited<typeof __VLS_setup>;
16
+ };
17
+ declare const _default: typeof __VLS_export;
18
+ export default _default;
19
+ type __VLS_PrettifyLocal<T> = (T extends any ? {
20
+ [K in keyof T]: T[K];
21
+ } : {
22
+ [K in keyof T as K]: T[K];
23
+ }) & {};
@@ -0,0 +1,4 @@
1
+ export { default as JSONCanvasViewerReact } from './bridges/reactComponent';
2
+ export { default as renderToString } from './bridges/renderToString';
3
+ export { default as jsonCanvasVitePlugin } from './bridges/vitePlugin';
4
+ export { default as JSONCanvasViewerVue } from './bridges/vueComponent.vue';
@@ -0,0 +1,7 @@
1
+ export { default as Controls } from './modules/controls';
2
+ export { default as DebugPanel } from './modules/debugPanel';
3
+ export { default as Minimap } from './modules/minimap';
4
+ export { default as MistouchPreventer } from './modules/mistouchPreventer';
5
+ export { default as JSONCanvasViewer } from './core';
6
+ export declare const parser: (markdown: string) => Promise<string>;
7
+ export declare function fetchCanvas(path: `${string}.canvas` | `${string}.json`): Promise<any>;
@@ -0,0 +1,15 @@
1
+ import type { Container } from '@needle-di/core';
2
+ import type { DefaultOptions, Empty, GeneralFunction, GeneralObject } from './declarations';
3
+ import type utilities from './utilities';
4
+ type Hook = ReturnType<typeof utilities.makeHook>;
5
+ export type BaseArgs = [Container, GeneralObject, Hook, Hook];
6
+ export type GeneralModuleCtor = typeof BaseModule<GeneralObject>;
7
+ export type GeneralModule = BaseModule<GeneralObject>;
8
+ export declare class BaseModule<O extends GeneralObject = Empty> {
9
+ protected container: Container;
10
+ onStart: (callback: GeneralFunction) => void;
11
+ onDispose: (callback: GeneralFunction) => void;
12
+ constructor(container: Container, options: GeneralObject, onStart: Hook, onDispose: Hook);
13
+ options: DefaultOptions & O;
14
+ }
15
+ export {};
@@ -1,8 +1,5 @@
1
1
  import { type BaseArgs, BaseModule } from './baseModule';
2
- type Options = {
3
- noShadow?: boolean;
4
- };
5
- export default class Controller extends BaseModule<Options> {
2
+ export default class Controller extends BaseModule {
6
3
  private animationId;
7
4
  private resizeAnimationId;
8
5
  private DM;
@@ -24,10 +21,9 @@ export default class Controller extends BaseModule<Options> {
24
21
  };
25
22
  };
26
23
  constructor(...args: BaseArgs);
27
- private onFetched;
24
+ private start;
28
25
  private draw;
29
- private refresh;
26
+ refresh: () => void;
30
27
  private onResize;
31
- dispose: () => void;
28
+ private dispose;
32
29
  }
33
- export {};
@@ -1,24 +1,34 @@
1
- import { BaseModule } from './baseModule';
1
+ import { type BaseArgs, BaseModule } from './baseModule';
2
2
  import type { Coordinates, NodeBounds } from './declarations';
3
- export default class DataManager extends BaseModule {
3
+ type Options = {
4
+ noShadow?: boolean;
5
+ canvas: JSONCanvas;
6
+ attachmentDir?: string;
7
+ extraCSS?: string;
8
+ };
9
+ export interface MapNodeItem {
10
+ type: 'node';
11
+ ref: JSONCanvasNode;
12
+ fileName?: string;
13
+ }
14
+ export interface MapEdgeItem {
15
+ type: 'edge';
16
+ ref: JSONCanvasEdge;
17
+ controlPoints?: Array<number>;
18
+ }
19
+ type MapItem = MapEdgeItem | MapNodeItem;
20
+ type CanvasMap = Record<string, MapItem>;
21
+ export default class DataManager extends BaseModule<Options> {
4
22
  private spatialGrid;
5
- hooks: {
6
- onToggleFullscreen: {
7
- (args_0: boolean): void;
8
- subs: Set<(args_0: boolean) => unknown>;
9
- subscribe(callback: (args_0: boolean) => unknown): void;
10
- unsubscribe(callback: (args_0: boolean) => unknown): void;
11
- };
12
- onCanvasFetched: {
13
- (): void;
14
- subs: Set<() => unknown>;
15
- subscribe(callback: () => unknown): void;
16
- unsubscribe(callback: () => unknown): void;
17
- };
23
+ onToggleFullscreen: {
24
+ (args_0: boolean): void;
25
+ subs: Set<(args_0: boolean) => unknown>;
26
+ subscribe(callback: (args_0: boolean) => unknown): void;
27
+ unsubscribe(callback: (args_0: boolean) => unknown): void;
18
28
  };
19
29
  data: {
20
30
  canvasData: Required<JSONCanvas>;
21
- nodeMap: Record<string, JSONCanvasNode>;
31
+ canvasMap: CanvasMap;
22
32
  canvasBaseDir: string;
23
33
  nodeBounds: NodeBounds;
24
34
  offsetX: number;
@@ -26,7 +36,8 @@ export default class DataManager extends BaseModule {
26
36
  scale: number;
27
37
  container: HTMLDivElement;
28
38
  };
29
- loadCanvas: () => Promise<void>;
39
+ constructor(...args: BaseArgs);
40
+ private processBaseDir;
30
41
  findNodeAt: (screenCoords: Coordinates) => JSONCanvasNode | null;
31
42
  private judgeInteract;
32
43
  private calculateNodeBounds;
@@ -45,5 +56,6 @@ export default class DataManager extends BaseModule {
45
56
  width: number;
46
57
  height: number;
47
58
  };
48
- dispose: () => void;
59
+ private dispose;
49
60
  }
61
+ export {};
@@ -1,20 +1,10 @@
1
- import type { BaseModule, GeneralModule, GeneralModuleCtor } from './baseModule';
1
+ import type { GeneralModule, GeneralModuleCtor } from './baseModule';
2
2
  import type Controller from './controller';
3
3
  import type DataManager from './dataManager';
4
4
  import type InteractionHandler from './interactionHandler';
5
5
  import type OverlayManager from './overlayManager';
6
6
  import type Renderer from './renderer';
7
7
  declare global {
8
- interface JSONCanvasGenericNode {
9
- id: string;
10
- type: 'group' | 'file' | 'text' | 'link';
11
- x: number;
12
- y: number;
13
- width: number;
14
- height: number;
15
- styleAttributes?: Record<string, string>;
16
- color?: string;
17
- }
18
8
  interface JSONCanvasGroupNode extends JSONCanvasGenericNode {
19
9
  type: 'group';
20
10
  label?: string;
@@ -50,25 +40,25 @@ declare global {
50
40
  nodes?: Array<JSONCanvasNode>;
51
41
  edges?: Array<JSONCanvasEdge>;
52
42
  }
53
- module '*.scss?inline' {
54
- const content: string;
43
+ module '*.canvas' {
44
+ const content: JSONCanvas;
55
45
  export default content;
56
46
  }
57
47
  }
48
+ interface JSONCanvasGenericNode {
49
+ id: string;
50
+ type: 'group' | 'file' | 'text' | 'link';
51
+ x: number;
52
+ y: number;
53
+ width: number;
54
+ height: number;
55
+ styleAttributes?: Record<string, string>;
56
+ color?: string;
57
+ }
58
58
  export type Coordinates = {
59
59
  x: number;
60
60
  y: number;
61
61
  };
62
- export type RuntimeData = {
63
- offsetX: number;
64
- offsetY: number;
65
- scale: number;
66
- canvasData: JSONCanvas;
67
- nodeMap: Record<string, JSONCanvasNode>;
68
- canvasBaseDir: string;
69
- nodeBounds: NodeBounds;
70
- container: HTMLDivElement;
71
- };
72
62
  export type NodeBounds = {
73
63
  minX: number;
74
64
  minY: number;
@@ -85,16 +75,16 @@ export type GeneralFunction = (...args: GeneralArguments) => any;
85
75
  export type Empty = {};
86
76
  type Indexable = string | number | symbol;
87
77
  type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
88
- type AllModuleInstances<T extends ModuleInput> = InstanceType<T[number]>;
78
+ export type ModuleInputCtor = Array<GeneralModuleCtor>;
79
+ type ModuleInputInstance = Array<GeneralModule>;
80
+ type ModuleInput = ModuleInputCtor | ModuleInputInstance;
81
+ export type Instances<T extends ModuleInput> = T extends ModuleInputCtor ? InstanceType<T[number]> : T[number];
89
82
  export type DefaultOptions = {
90
83
  container: HTMLElement;
91
- canvasPath: string;
92
- lazyLoad?: boolean;
84
+ lazyLoading?: boolean;
93
85
  };
94
- export type ModuleInput = Array<GeneralModuleCtor>;
95
- export type Options<T extends ModuleInput = []> = Omit<UnionToIntersection<AllModuleInstances<T>['options']>, keyof DefaultOptions> & DefaultOptions;
96
- type Ctors<T extends Array<BaseModule> | BaseModule> = T extends Array<BaseModule> ? {
97
- [K in keyof T]: new (...args: GeneralArguments) => T[K];
98
- } : [new (...args: GeneralArguments) => T];
99
- export type UserOptions<T extends Array<GeneralModule> = []> = Options<Ctors<[Controller, InteractionHandler, DataManager, OverlayManager, Renderer, ...T]>>;
86
+ export type MarkdownParser = (markdown: string) => string | Promise<string>;
87
+ export type Options<T extends ModuleInput> = UnionToIntersection<Instances<T>['options']>;
88
+ type InternalModules = [DataManager, Controller, OverlayManager, InteractionHandler, Renderer];
89
+ export type UserOptions<M extends ModuleInput> = Options<M> & Options<InternalModules>;
100
90
  export {};
@@ -0,0 +1,14 @@
1
+ import { Container } from '@needle-di/core';
2
+ import type { ModuleInputCtor, UserOptions } from './declarations';
3
+ export default class JSONCanvasViewer<M extends ModuleInputCtor = []> {
4
+ private options;
5
+ private allModules;
6
+ private IO;
7
+ private onStart;
8
+ private onDispose;
9
+ container: Container;
10
+ constructor(options: UserOptions<M>, modules?: M);
11
+ private load;
12
+ private onVisibilityCheck;
13
+ dispose: () => void;
14
+ }
@@ -12,13 +12,13 @@ export default class InteractionHandler extends BaseModule<Options> {
12
12
  subscribe(callback: (args_0: string | null) => unknown): void;
13
13
  unsubscribe(callback: (args_0: string | null) => unknown): void;
14
14
  };
15
- constructor(...args: BaseArgs);
16
15
  stopInteraction: Pointeract['stop'];
17
16
  startInteraction: Pointeract['start'];
18
- private onFetched;
17
+ constructor(...args: BaseArgs);
18
+ private start;
19
19
  private onPan;
20
20
  private onZoom;
21
21
  private onTrueClick;
22
- dispose: () => void;
22
+ private dispose;
23
23
  }
24
24
  export {};
@@ -1,7 +1,7 @@
1
- import { micromark } from 'micromark';
2
1
  import { type BaseArgs, BaseModule } from './baseModule';
2
+ import type { MarkdownParser } from './declarations';
3
3
  type Options = {
4
- micromark?: Parameters<typeof micromark>[1];
4
+ markdownParser?: MarkdownParser;
5
5
  };
6
6
  export default class OverlayManager extends BaseModule<Options> {
7
7
  private _overlaysLayer;
@@ -27,12 +27,12 @@ export default class OverlayManager extends BaseModule<Options> {
27
27
  };
28
28
  };
29
29
  constructor(...args: BaseArgs);
30
- private onFetched;
30
+ private start;
31
31
  private select;
32
32
  private loadMarkdownForNode;
33
33
  private updateOverlays;
34
34
  private updateOverlay;
35
35
  private constructOverlay;
36
- dispose: () => void;
36
+ private dispose;
37
37
  }
38
38
  export {};
@@ -15,11 +15,10 @@ export default class Renderer extends BaseModule {
15
15
  private drawLabelBar;
16
16
  private drawNodeBackground;
17
17
  private drawGroup;
18
- private drawFileNode;
18
+ private drawFile;
19
19
  private drawEdge;
20
- private getEdgeNodes;
21
20
  private getControlPoints;
22
21
  private drawCurvedPath;
23
22
  private drawArrowhead;
24
- dispose: () => void;
23
+ private dispose;
25
24
  }
@@ -6,7 +6,6 @@ declare const _default: {
6
6
  drawRoundRect: typeof drawRoundRect;
7
7
  getAnchorCoord: typeof getAnchorCoord;
8
8
  getColor: typeof getColor;
9
- resolvePath: typeof resolvePath;
10
9
  makeHook: typeof makeHook;
11
10
  };
12
11
  export default _default;
@@ -21,8 +20,7 @@ declare function getColor(colorIndex?: string): {
21
20
  };
22
21
  declare function resizeCanvasForDPR(canvas: HTMLCanvasElement, width: number, height: number): void;
23
22
  declare function round(roundedNum: number, digits: number): number;
24
- declare function resolvePath(path: string): string;
25
- declare function makeHook<Args extends GeneralArguments = []>(): {
23
+ declare function makeHook<Args extends GeneralArguments = []>(reverse?: boolean): {
26
24
  (...args: Args): void;
27
25
  subs: Set<(...args: Args) => unknown>;
28
26
  subscribe(callback: (...args: Args) => unknown): void;
@@ -0,0 +1,8 @@
1
+ export type { GeneralModule, GeneralModuleCtor } from './core/baseModule';
2
+ export { type BaseArgs, BaseModule } from './core/baseModule';
3
+ export { default as Controller } from './core/controller';
4
+ export { default as DataManager } from './core/dataManager';
5
+ export { default as InteractionHandler } from './core/interactionHandler';
6
+ export { default as OverlayManager } from './core/overlayManager';
7
+ export { default as Renderer } from './core/renderer';
8
+ export { default as canvasUtils } from './core/utilities';
@@ -1,21 +1,2 @@
1
- export { type BaseArgs, BaseModule } from './baseModule';
2
- export { default as JSONCanvasViewer } from './canvasViewer';
3
- export { default as Controls } from './controls';
4
- export { default as DebugPanel } from './debugPanel';
5
- export type { UserOptions as Options } from './declarations';
6
- export { default as Minimap } from './minimap';
7
- export { default as MistouchPreventer } from './mistouchPreventer';
8
- export { default as renderToString } from './renderToString';
9
- export { default as canvasUtils } from './utilities';
10
- import Controller from './controller';
11
- import DataManager from './dataManager';
12
- import InteractionHandler from './interactionHandler';
13
- import OverlayManager from './overlayManager';
14
- import Renderer from './renderer';
15
- export declare const developerSuite: {
16
- Controller: typeof Controller;
17
- DataManager: typeof DataManager;
18
- InteractionHandler: typeof InteractionHandler;
19
- Renderer: typeof Renderer;
20
- OverlayManager: typeof OverlayManager;
21
- };
1
+ export { default as JSONCanvasViewer } from './core';
2
+ export type { UserOptions as Options } from './core/declarations';