json-canvas-viewer 3.3.1 → 3.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/README.md +145 -156
  2. package/dist/bridges.cjs +1 -1
  3. package/dist/bridges.cjs.map +1 -1
  4. package/dist/bridges.js +1 -1
  5. package/dist/bridges.js.map +1 -1
  6. package/dist/chimp.cjs +1 -1
  7. package/dist/chimp.js +1 -1
  8. package/dist/controller-BRBUPg_j.js +2 -0
  9. package/dist/controller-BRBUPg_j.js.map +1 -0
  10. package/dist/controller-Bc-S4ZVK.cjs +2 -0
  11. package/dist/controller-Bc-S4ZVK.cjs.map +1 -0
  12. package/dist/dev.cjs +1 -1
  13. package/dist/dev.js +1 -1
  14. package/dist/index-DJQyGIFX.js +2 -0
  15. package/dist/index-DJQyGIFX.js.map +1 -0
  16. package/dist/index-DwvIUSbr.cjs +2 -0
  17. package/dist/index-DwvIUSbr.cjs.map +1 -0
  18. package/dist/index.cjs +1 -1
  19. package/dist/index.js +1 -1
  20. package/dist/modules.cjs +1 -1
  21. package/dist/modules.cjs.map +1 -1
  22. package/dist/modules.js +1 -1
  23. package/dist/modules.js.map +1 -1
  24. package/dist/react.cjs +2 -0
  25. package/dist/react.cjs.map +1 -0
  26. package/dist/react.js +2 -0
  27. package/dist/react.js.map +1 -0
  28. package/dist/renderToString-ChykAKof.js +2 -0
  29. package/dist/renderToString-ChykAKof.js.map +1 -0
  30. package/dist/renderToString-Cxh5DtRo.cjs +2 -0
  31. package/dist/renderToString-Cxh5DtRo.cjs.map +1 -0
  32. package/dist/renderer-0RqgAOLH.js +2 -0
  33. package/dist/renderer-0RqgAOLH.js.map +1 -0
  34. package/dist/renderer-BEKV7hr3.cjs +2 -0
  35. package/dist/renderer-BEKV7hr3.cjs.map +1 -0
  36. package/dist/types/bridges/reactComponent.d.ts +6 -3
  37. package/dist/types/bridges/vueComponent.vue.d.ts +7 -2
  38. package/dist/types/bridges/webpackPlugin.d.ts +7 -0
  39. package/dist/types/bridges.d.ts +1 -2
  40. package/dist/types/core/baseModule.d.ts +13 -9
  41. package/dist/types/core/controller.d.ts +6 -1
  42. package/dist/types/core/dataManager.d.ts +23 -16
  43. package/dist/types/core/declarations.d.ts +20 -4
  44. package/dist/types/core/index.d.ts +16 -5
  45. package/dist/types/core/interactionHandler.d.ts +3 -1
  46. package/dist/types/core/overlayManager.d.ts +7 -1
  47. package/dist/types/core/renderer.d.ts +9 -2
  48. package/dist/types/core/styleManager.d.ts +48 -0
  49. package/dist/types/core/utilities.d.ts +3 -6
  50. package/dist/types/dev.d.ts +1 -0
  51. package/dist/types/index.d.ts +1 -1
  52. package/dist/types/modules/controls/index.d.ts +4 -1
  53. package/dist/types/modules/minimap/index.d.ts +5 -1
  54. package/dist/types/modules/mistouchPreventer/index.d.ts +7 -5
  55. package/dist/vue.cjs +2 -0
  56. package/dist/vue.cjs.map +1 -0
  57. package/dist/vue.js +2 -0
  58. package/dist/vue.js.map +1 -0
  59. package/dist/webpackLoader.js +33 -0
  60. package/package.json +56 -41
  61. package/dist/controller-CnUlrkdp.cjs +0 -2
  62. package/dist/controller-CnUlrkdp.cjs.map +0 -1
  63. package/dist/controller-UN-hOZ_r.js +0 -2
  64. package/dist/controller-UN-hOZ_r.js.map +0 -1
  65. package/dist/index-RXeXyAu0.cjs +0 -2
  66. package/dist/index-RXeXyAu0.cjs.map +0 -1
  67. package/dist/index-ujiv9m9Y.js +0 -2
  68. package/dist/index-ujiv9m9Y.js.map +0 -1
  69. package/dist/renderer-Bzv3aLXp.cjs +0 -2
  70. package/dist/renderer-Bzv3aLXp.cjs.map +0 -1
  71. package/dist/renderer-NPxavnke.js +0 -2
  72. package/dist/renderer-NPxavnke.js.map +0 -1
@@ -1 +0,0 @@
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":"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"}