json-canvas-viewer 3.3.0 → 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 +12 -0
  37. package/dist/types/bridges/vueComponent.vue.d.ts +8 -3
  38. package/dist/types/bridges/webpackPlugin.d.ts +7 -0
  39. package/dist/types/bridges.d.ts +1 -1
  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 +29 -10
  43. package/dist/types/core/declarations.d.ts +20 -14
  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 +10 -4
  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 +57 -40
  61. package/dist/controller--Q72jFEw.cjs +0 -2
  62. package/dist/controller--Q72jFEw.cjs.map +0 -1
  63. package/dist/controller-siZ5v-SD.js +0 -2
  64. package/dist/controller-siZ5v-SD.js.map +0 -1
  65. package/dist/index-BSkMdAcV.cjs +0 -2
  66. package/dist/index-BSkMdAcV.cjs.map +0 -1
  67. package/dist/index-u8PUIMyl.js +0 -2
  68. package/dist/index-u8PUIMyl.js.map +0 -1
  69. package/dist/renderer-CZ85ZN6O.js +0 -2
  70. package/dist/renderer-CZ85ZN6O.js.map +0 -1
  71. package/dist/renderer-D9iInH9_.cjs +0 -2
  72. package/dist/renderer-D9iInH9_.cjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer-BEKV7hr3.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 type { MarkdownParser } from '$/declarations';\nimport InteractionHandler from '$/interactionHandler';\nimport StyleManager, { type Color } from '$/styleManager';\nimport utilities, { destroyError } from '$/utilities';\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 SM: StyleManager;\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.SM = this.container.get(StyleManager);\n\t\tconst controller = this.container.get(Controller);\n\t\tcontroller.hooks.onRefresh.subscribe(this.updateOverlays);\n\t\tthis.SM.onChangeTheme.subscribe(this.themeChanged);\n\n\t\tthis._overlaysLayer = document.createElement('div');\n\t\tthis._overlaysLayer.className = 'overlays';\n\t\tthis._overlaysLayer.id = 'overlays';\n\t\tthis.DM.data.container.appendChild(this.overlaysLayer);\n\n\t\tthis.onStart(this.start);\n\t\tthis.onRestart(this.restart);\n\t\tthis.onDispose(this.dispose);\n\t}\n\n\tprivate start = () => {\n\t\tthis.container.get(InteractionHandler).onClick.subscribe(this.select);\n\t\tthis.renderOverlays();\n\t};\n\n\tprivate restart = () => {\n\t\tthis.clearOverlays();\n\t\tthis.renderOverlays();\n\t};\n\n\tprivate renderOverlays = () => {\n\t\tconst createOverlay = async (node: JSONCanvasNode) => {\n\t\t\tswitch (node.type) {\n\t\t\t\tcase 'text': {\n\t\t\t\t\tawait this.createOverlay(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)) await 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\tawait this.createOverlay(node, node.file, 'image');\n\t\t\t\t\telse if (node.file.match(/\\.(mp3|wav)$/i))\n\t\t\t\t\t\tawait this.createOverlay(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\tawait this.createOverlay(node, node.url, 'link');\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tObject.values(this.DM.data.nodeMap).forEach(async (node) => {\n\t\t\tawait createOverlay(node.ref);\n\t\t});\n\t};\n\n\tprivate themeChanged = () => {\n\t\tObject.values(this.overlays).forEach((overlay) => {\n\t\t\tconst node = this.DM.data.nodeMap[overlay.id].ref;\n\t\t\tconst color = this.SM.getColor(node.color);\n\t\t\tthis.setOverlayColor(overlay, color);\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\tawait this.createOverlay(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, { content: parsedContent });\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 createOverlay(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}\n\t}\n\n\tprivate updateOverlay(\n\t\tnode: JSONCanvasNode,\n\t\ttoUpdate: {\n\t\t\tcontent?: string;\n\t\t\tcolor?: Color;\n\t\t},\n\t) {\n\t\tconst element = this.overlays[node.id];\n\t\tif (toUpdate.content) {\n\t\t\tconst content = element.getElementsByClassName('parsed-content-wrapper')[0];\n\t\t\tif (content) content.innerHTML = toUpdate.content;\n\t\t}\n\t\tif (toUpdate.color) {\n\t\t\tthis.setOverlayColor(element, toUpdate.color);\n\t\t}\n\t}\n\n\tprivate async constructOverlay(node: JSONCanvasNode, content: string, type: string) {\n\t\tconst overlay = document.createElement('div');\n\t\toverlay.classList.add('overlay-container');\n\t\toverlay.id = node.id;\n\t\tthis.setOverlayColor(overlay, this.SM.getColor(node.color));\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\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 setOverlayColor = (overlay: HTMLDivElement, color: Color) => {\n\t\tObject.entries(color).forEach(([key, value]) => {\n\t\t\toverlay.style.setProperty(`--overlay-${key}`, value);\n\t\t});\n\t};\n\n\tprivate clearOverlays = () => {\n\t\tObject.entries(this.overlays).forEach(([id, overlay]) => {\n\t\t\tif (this.eventListeners[id]) {\n\t\t\t\tconst onStart = this.eventListeners[id][0];\n\t\t\t\tconst onEnd = this.eventListeners[id][1];\n\t\t\t\tif (!onStart || !onEnd) throw destroyError;\n\t\t\t\toverlay.removeEventListener('pointerenter', onStart);\n\t\t\t\toverlay.removeEventListener('pointerleave', onEnd);\n\t\t\t\toverlay.removeEventListener('touchstart', onStart);\n\t\t\t\toverlay.removeEventListener('touchend', onEnd);\n\t\t\t\tthis.eventListeners[id][0] = null;\n\t\t\t\tthis.eventListeners[id][1] = null;\n\t\t\t}\n\t\t\toverlay.remove();\n\t\t\tdelete this.overlays[id];\n\t\t});\n\t};\n\n\tprivate dispose = () => {\n\t\tthis.clearOverlays();\n\t\tthis.overlaysLayer.remove();\n\t\tthis._overlaysLayer = null;\n\t};\n}\n","import { type BaseArgs, BaseModule } from '$/baseModule';\nimport DataManager from '$/dataManager';\nimport OverlayManager from '$/overlayManager';\nimport utilities from '$/utilities';\nimport {\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';\n\ntype Options = {\n\tpointeract?: PointeractOptions<\n\t\tCtors<[Click, Drag, WheelPanZoom, PreventDefault, MultitouchPanZoom]>\n\t>;\n};\n\nexport default class InteractionHandler extends BaseModule<Options> {\n\tprivate pointeract: Pointeract<\n\t\tCtors<[Click, Drag, WheelPanZoom, PreventDefault, MultitouchPanZoom]>\n\t>;\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 element = e.detail.target as HTMLElement | null;\n\t\tif (this.isUIControl(element)) return;\n\t\tconst node = this.findNodeId(element);\n\t\tthis.onClick(node);\n\t};\n\n\tprivate isUIControl = (target: HTMLElement | null) => {\n\t\tif (!target) return false;\n\t\treturn target.closest('.controls') || target.closest('button') || target.closest('input');\n\t};\n\n\tprivate findNodeId = (element: HTMLElement | null) => {\n\t\tif (!element) return null;\n\t\tlet ele = element;\n\t\twhile (!ele.id || ele.id === '') {\n\t\t\tif (!ele.parentElement) break;\n\t\t\tele = ele.parentElement;\n\t\t}\n\t\tif (ele.id === 'overlays' || !ele.id || ele.id === '') return null;\n\t\treturn ele.id;\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 EdgeItem, type NodeItem } from '$/dataManager';\nimport type { Box } from '$/declarations';\nimport StyleManager from '$/styleManager';\nimport utilities, { destroyError } from '$/utilities';\n\nconst ARROW_LENGTH = 12;\nconst ARROW_WIDTH = 4;\nconst NODE_RADIUS = 12;\nconst CSS_ZOOM_REDRAW_INTERVAL = 500;\nconst NODE_BORDER_WIDTH = 1;\nconst DOT_RADIUS = 1; // Dot radius in CSS pixels\nconst DOT_BASE_GAP = 10; // Base gap between dots in CSS pixels\n\nconst NODE_BORDER_HALF_WIDTH = NODE_BORDER_WIDTH / 2;\n\ntype Options = {\n\tzoomInOptimization?: boolean;\n};\n\nexport default class Renderer extends BaseModule<Options> {\n\tprivate _canvas: HTMLCanvasElement | null;\n\tprivate ctx: CanvasRenderingContext2D;\n\tprivate DM: DataManager;\n\tprivate SM: StyleManager;\n\tprivate zoomInOptimize: {\n\t\tlastDrawnScale: number;\n\t\tlastDrawnViewport: Box;\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\tthis.SM = this.container.get(StyleManager);\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\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 (!this.options.zoomInOptimization) {\n\t\t\tthis.trueRedraw(offsetX, offsetY, scale, currentViewport);\n\t\t\treturn;\n\t\t}\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\tif (\n\t\t\tthis.isInside(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: Box) {\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.drawGridDots(scale, offsetX, offsetY);\n\t\tthis.ctx.translate(offsetX, offsetY);\n\t\tthis.ctx.scale(scale, scale);\n\t\tObject.values(this.DM.data.nodeMap).forEach((item) => {\n\t\t\tif (this.isOutside(item.box, currentViewport)) return;\n\t\t\tconst node = item.ref;\n\t\t\tif (node.type === 'file') this.drawFile(item);\n\t\t\telse if (node.type === 'group') this.drawGroup(node, scale);\n\t\t});\n\t\tObject.values(this.DM.data.edgeMap).forEach((item) => {\n\t\t\tif (this.isOutside(item.box, currentViewport)) return;\n\t\t\tthis.drawEdge(item);\n\t\t});\n\t\tthis.ctx.restore();\n\t}\n\n\tprivate fakeRedraw(currentViewport: Box, scale: number) {\n\t\tconst cssScale = scale / this.zoomInOptimize.lastDrawnScale;\n\t\tconst currentOffsetX =\n\t\t\t(this.zoomInOptimize.lastDrawnViewport.left - currentViewport.left) * scale;\n\t\tconst currentOffsetY =\n\t\t\t(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 isInside = (inner: Box, outer: Box) =>\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 isOutside = (inner: Box, outer: Box) =>\n\t\tinner.right < outer.left ||\n\t\tinner.bottom < outer.top ||\n\t\tinner.left > outer.right ||\n\t\tinner.top > 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 = (\n\t\tx: number,\n\t\ty: number,\n\t\tlabel: string,\n\t\tcolor: string,\n\t\ttextColor: string,\n\t\tscale: number,\n\t) => {\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 = textColor;\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 = this.SM.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(\n\t\t\tthis.ctx,\n\t\t\tnode.x + NODE_BORDER_HALF_WIDTH,\n\t\t\tnode.y + NODE_BORDER_HALF_WIDTH,\n\t\t\tnode.width - NODE_BORDER_WIDTH,\n\t\t\tnode.height - NODE_BORDER_WIDTH,\n\t\t\tradius,\n\t\t);\n\t\tthis.ctx.fill();\n\t\tthis.ctx.strokeStyle = colors.border;\n\t\tthis.ctx.lineWidth = NODE_BORDER_WIDTH;\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\tconst color = this.SM.getColor(node.color);\n\t\t\tthis.drawLabelBar(node.x, node.y, node.label, color.active, color.text, scale);\n\t\t}\n\t};\n\n\tprivate drawFile = (item: NodeItem) => {\n\t\tthis.ctx.fillStyle = this.SM.getColor().text;\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: EdgeItem) => {\n\t\tconst edge = item.ref;\n\t\tconst fromNode = this.DM.data.nodeMap[edge.fromNode].ref;\n\t\tconst toNode = this.DM.data.nodeMap[edge.toNode].ref;\n\t\tconst gac = utilities.getAnchorCoord;\n\t\tconst { x: startX, y: startY } = gac(fromNode, edge.fromSide);\n\t\tconst { x: endX, y: endY } = gac(toNode, edge.toSide);\n\t\tconst color = this.SM.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\tcolor.active,\n\t\t);\n\t\tthis.drawArrowhead(endX, endY, endControlX, endControlY, color.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 = color.active;\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 = color.text;\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 drawGridDots = (scale: number, offsetX: number, offsetY: number) => {\n\t\tconst scaleLevel = -Math.floor(Math.log2(scale));\n\t\tconst actualGap = DOT_BASE_GAP * 2 ** scaleLevel * scale;\n\t\tconst width = this.canvas.width;\n\t\tconst height = this.canvas.height;\n\t\tconst startX = offsetX % actualGap;\n\t\tconst startY = offsetY % actualGap;\n\t\tthis.ctx.fillStyle = this.SM.getNamedColor('dots');\n\t\tfor (let x = startX; x <= width; x += actualGap) {\n\t\t\tfor (let y = startY; y <= height; y += actualGap) {\n\t\t\t\tthis.ctx.beginPath();\n\t\t\t\tthis.ctx.arc(x, y, DOT_RADIUS, 0, 2 * Math.PI);\n\t\t\t\tthis.ctx.fill();\n\t\t\t}\n\t\t}\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 = (\n\t\ttipX: number,\n\t\ttipY: number,\n\t\tfromX: number,\n\t\tfromY: number,\n\t\tcolor: string,\n\t) => {\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","SM","parse","overlaysLayer","this","destroyError","hooks","onInteractionStart","utilities","makeHook","onInteractionEnd","constructor","args","super","options","markdownParser","markdown","container","get","DataManager","StyleManager","Controller","onRefresh","subscribe","updateOverlays","onChangeTheme","themeChanged","className","id","data","appendChild","onStart","start","onRestart","restart","onDispose","dispose","InteractionHandler","onClick","select","renderOverlays","clearOverlays","createOverlay","async","node","type","text","file","match","loadMarkdownForNode","url","Object","values","nodeMap","forEach","ref","overlay","color","getColor","setOverlayColor","previous","current","classList","remove","add","parsedContent","response","fetch","result","frontmatterMatch","err","console","error","updateOverlay","content","style","transform","offsetX","offsetY","scale","element","constructOverlay","left","x","top","y","width","height","toUpdate","getElementsByClassName","innerHTML","parsedContentWrapper","iframe","src","sandbox","loading","audio","controls","img","clickLayer","overlayBorder","onEnd","addEventListener","entries","key","value","setProperty","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","isUIControl","findNodeId","closest","ele","parentElement","off","Renderer","_canvas","ctx","zoomInOptimize","lastDrawnScale","lastDrawnViewport","right","bottom","timeout","lastCallTime","canvas","controller","redraw","onResize","optimizeDPR","getContext","resizeCanvasForDPR","offsetWidth","offsetHeight","currentViewport","getCurrentViewport","zoomInOptimization","trueRedraw","clearTimeout","now","Date","isInside","setTimeout","fakeRedraw","clearRect","save","drawGridDots","translate","item","isOutside","box","drawFile","drawGroup","edgeMap","drawEdge","restore","cssScale","currentOffsetX","currentOffsetY","inner","outer","clientWidth","clientHeight","drawLabelBar","label","textColor","barHeight","radius","yOffset","fontSize","xPadding","font","barWidth","measureText","fillStyle","beginPath","moveTo","lineTo","quadraticCurveTo","closePath","fill","fillText","drawNodeBackground","colors","globalAlpha","background","drawRoundRect","NODE_BORDER_WIDTH","strokeStyle","border","lineWidth","stroke","active","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","actualGap","floor","log2","getNamedColor","arc","PI","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,12 @@
1
+ import type { ModuleInputCtor, UserOptions } from '../core/declarations';
2
+ export default function JSONCanvasViewerReact<T extends ModuleInputCtor>({ modules, options, prerenderedContent, className, style, id, theme, canvas, attachmentDir, }: {
3
+ modules?: T;
4
+ options?: Omit<UserOptions<T>, 'container' | 'theme' | 'canvas' | 'attachmentDir'>;
5
+ prerenderedContent?: string;
6
+ className?: string;
7
+ style?: React.CSSProperties;
8
+ id?: string;
9
+ theme?: 'dark' | 'light';
10
+ canvas?: JSONCanvas;
11
+ attachmentDir?: string;
12
+ }): import("react").JSX.Element;
@@ -2,12 +2,17 @@ import type { ModuleInputCtor, UserOptions } from '../core/declarations';
2
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
3
  props: import("vue").PublicProps & __VLS_PrettifyLocal<{
4
4
  modules?: T | undefined;
5
- options: Omit<UserOptions<T>, "container">;
6
- isSSR?: boolean;
5
+ canvas?: JSONCanvas;
6
+ attachmentDir?: string;
7
+ options?: Omit<UserOptions<T>, "canvas" | "container" | "attachmentDir" | "theme"> | undefined;
8
+ isPrerendering?: boolean;
9
+ theme?: "dark" | "light";
7
10
  }> & (typeof globalThis extends {
8
11
  __VLS_PROPS_FALLBACK: infer P;
9
12
  } ? P : {});
10
- expose: (exposed: {}) => void;
13
+ expose: (exposed: import("vue").ShallowUnwrapRef<{
14
+ viewer: null;
15
+ }>) => void;
11
16
  attrs: any;
12
17
  slots: {};
13
18
  emit: {};
@@ -0,0 +1,7 @@
1
+ import type { MarkdownParser } from '../core/declarations';
2
+ import type { Compiler } from 'webpack';
3
+ export default class JsonCanvasWebpackPlugin {
4
+ parser: MarkdownParser;
5
+ constructor(parser: MarkdownParser);
6
+ apply(compiler: Compiler): void;
7
+ }
@@ -1,3 +1,3 @@
1
1
  export { default as renderToString } from './bridges/renderToString';
2
2
  export { default as jsonCanvasVitePlugin } from './bridges/vitePlugin';
3
- export { default as JSONCanvasViewerVue } from './bridges/vueComponent.vue';
3
+ export { default as JSONCanvasWebpackPlugin } from './bridges/webpackPlugin';
@@ -1,15 +1,19 @@
1
- import type { Container } from '@needle-di/core';
2
- import type { DefaultOptions, Empty, GeneralFunction, GeneralObject } from './declarations';
1
+ import type { DefaultOptions, Empty, GeneralObject, Indexable } from './declarations';
3
2
  import type utilities from './utilities';
3
+ import type { Container } from '@needle-di/core';
4
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> {
5
+ export type Augmentation = Record<Indexable, any>;
6
+ export type BaseArgs = [Container, GeneralObject, Hook, Hook, Hook, (aug: Augmentation) => void];
7
+ export type GeneralModuleCtor = typeof BaseModule<GeneralObject, any>;
8
+ export type GeneralModule = BaseModule<GeneralObject, any>;
9
+ export declare class BaseModule<O extends GeneralObject = Empty, A extends Augmentation = Empty> {
9
10
  protected container: Container;
10
- onStart: (callback: GeneralFunction) => void;
11
- onDispose: (callback: GeneralFunction) => void;
12
- constructor(container: Container, options: GeneralObject, onStart: Hook, onDispose: Hook);
11
+ onStart: Hook['subscribe'];
12
+ onRestart: Hook['subscribe'];
13
+ onDispose: Hook['subscribe'];
14
+ augment: (aug: A) => void;
15
+ constructor(container: Container, options: GeneralObject, onStart: Hook, onDispose: Hook, onRestart: Hook, augment: (aug: A) => void);
13
16
  options: DefaultOptions & O;
17
+ _providedMethods: A;
14
18
  }
15
19
  export {};
@@ -1,8 +1,12 @@
1
1
  import { type BaseArgs, BaseModule } from './baseModule';
2
- export default class Controller extends BaseModule {
2
+ type Augmentation = {
3
+ refresh: Controller['refresh'];
4
+ };
5
+ export default class Controller extends BaseModule<{}, Augmentation> {
3
6
  private animationId;
4
7
  private resizeAnimationId;
5
8
  private DM;
9
+ private SM;
6
10
  private resizeObserver;
7
11
  private perFrame;
8
12
  private lastResizeCenter;
@@ -27,3 +31,4 @@ export default class Controller extends BaseModule {
27
31
  private onResize;
28
32
  private dispose;
29
33
  }
34
+ export {};
@@ -1,13 +1,32 @@
1
1
  import { type BaseArgs, BaseModule } from './baseModule';
2
- import type { Coordinates, NodeBounds } from './declarations';
2
+ import type { Box, Coordinates, NodeBounds } from './declarations';
3
3
  type Options = {
4
4
  noShadow?: boolean;
5
- canvas: JSONCanvas;
5
+ canvas?: JSONCanvas;
6
6
  attachmentDir?: string;
7
7
  extraCSS?: string;
8
8
  };
9
- export default class DataManager extends BaseModule<Options> {
10
- private spatialGrid;
9
+ type Augmentation = {
10
+ zoom: DataManager['zoom'];
11
+ zoomToScale: DataManager['zoomToScale'];
12
+ pan: DataManager['pan'];
13
+ panToCoords: DataManager['panToCoords'];
14
+ resetView: DataManager['resetView'];
15
+ shiftFullscreen: DataManager['shiftFullscreen'];
16
+ };
17
+ export interface NodeItem {
18
+ ref: JSONCanvasNode;
19
+ box: Box;
20
+ fileName?: string;
21
+ }
22
+ export interface EdgeItem {
23
+ ref: JSONCanvasEdge;
24
+ box: Box;
25
+ controlPoints?: Array<number>;
26
+ }
27
+ type NodeMap = Record<string, NodeItem>;
28
+ type EdgeMap = Record<string, EdgeItem>;
29
+ export default class DataManager extends BaseModule<Options, Augmentation> {
11
30
  onToggleFullscreen: {
12
31
  (args_0: boolean): void;
13
32
  subs: Set<(args_0: boolean) => unknown>;
@@ -16,7 +35,8 @@ export default class DataManager extends BaseModule<Options> {
16
35
  };
17
36
  data: {
18
37
  canvasData: Required<JSONCanvas>;
19
- nodeMap: Record<string, JSONCanvasNode>;
38
+ nodeMap: NodeMap;
39
+ edgeMap: EdgeMap;
20
40
  canvasBaseDir: string;
21
41
  nodeBounds: NodeBounds;
22
42
  offsetX: number;
@@ -25,19 +45,18 @@ export default class DataManager extends BaseModule<Options> {
25
45
  container: HTMLDivElement;
26
46
  };
27
47
  constructor(...args: BaseArgs);
48
+ private start;
28
49
  private processBaseDir;
29
- findNodeAt: (screenCoords: Coordinates) => JSONCanvasNode | null;
30
- private judgeInteract;
50
+ private getNodeBox;
51
+ private getEdgeBox;
31
52
  private calculateNodeBounds;
32
- private buildSpatialGrid;
33
53
  zoom: (factor: number, origin: Coordinates) => void;
34
54
  zoomToScale: (newScale: number, origin: Coordinates) => void;
35
55
  pan: ({ x, y }: Coordinates) => void;
36
56
  panToCoords: ({ x, y }: Coordinates) => void;
37
- shiftFullscreen: (option?: string) => void;
57
+ shiftFullscreen: (option?: "enter" | "exit") => Promise<void>;
38
58
  resetView: () => void;
39
59
  private C2C;
40
- private C2W;
41
60
  middleViewer: () => {
42
61
  x: number;
43
62
  y: number;
@@ -4,6 +4,7 @@ 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
+ import type StyleManager from './styleManager';
7
8
  declare global {
8
9
  interface JSONCanvasGroupNode extends JSONCanvasGenericNode {
9
10
  type: 'group';
@@ -59,16 +60,6 @@ export type Coordinates = {
59
60
  x: number;
60
61
  y: number;
61
62
  };
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
63
  export type NodeBounds = {
73
64
  minX: number;
74
65
  minY: number;
@@ -79,22 +70,37 @@ export type NodeBounds = {
79
70
  centerX: number;
80
71
  centerY: number;
81
72
  };
73
+ export type Box = {
74
+ top: number;
75
+ right: number;
76
+ bottom: number;
77
+ left: number;
78
+ };
82
79
  export type GeneralArguments = Array<any>;
83
80
  export type GeneralObject = Record<Indexable, any>;
84
81
  export type GeneralFunction = (...args: GeneralArguments) => any;
85
82
  export type Empty = {};
86
- type Indexable = string | number | symbol;
83
+ export type Indexable = string | number | symbol;
87
84
  type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
88
85
  export type ModuleInputCtor = Array<GeneralModuleCtor>;
89
86
  type ModuleInputInstance = Array<GeneralModule>;
90
- type ModuleInput = ModuleInputCtor | ModuleInputInstance;
87
+ export type ModuleInput = ModuleInputCtor | ModuleInputInstance;
91
88
  export type Instances<T extends ModuleInput> = T extends ModuleInputCtor ? InstanceType<T[number]> : T[number];
92
89
  export type DefaultOptions = {
93
90
  container: HTMLElement;
94
- lazyLoading?: boolean;
91
+ loading?: 'normal' | 'lazy' | 'none';
95
92
  };
96
93
  export type MarkdownParser = (markdown: string) => string | Promise<string>;
97
94
  export type Options<T extends ModuleInput> = UnionToIntersection<Instances<T>['options']>;
98
- type InternalModules = [DataManager, Controller, OverlayManager, InteractionHandler, Renderer];
95
+ export type Augmentation<T extends ModuleInput> = UnionToIntersection<Instances<T>['_providedMethods']>;
96
+ type InternalModules = [
97
+ DataManager,
98
+ StyleManager,
99
+ Controller,
100
+ OverlayManager,
101
+ InteractionHandler,
102
+ Renderer
103
+ ];
99
104
  export type UserOptions<M extends ModuleInput> = Options<M> & Options<InternalModules>;
105
+ export type UserAugmentation<M extends ModuleInput> = Augmentation<M> & Augmentation<InternalModules>;
100
106
  export {};
@@ -1,14 +1,25 @@
1
+ import type { ModuleInputCtor, UserOptions, UserAugmentation, ModuleInput } from './declarations';
1
2
  import { Container } from '@needle-di/core';
2
- import type { ModuleInputCtor, UserOptions } from './declarations';
3
- export default class JSONCanvasViewer<M extends ModuleInputCtor = []> {
4
- private options;
3
+ declare class JSONCanvasViewer<M extends ModuleInputCtor> {
5
4
  private allModules;
6
5
  private IO;
7
- private onStart;
8
6
  private onDispose;
7
+ private onStart;
8
+ private onRestart;
9
+ private started;
10
+ options: UserOptions<M>;
9
11
  container: Container;
10
12
  constructor(options: UserOptions<M>, modules?: M);
11
- private load;
12
13
  private onVisibilityCheck;
14
+ private _augmentSlot;
15
+ private augment;
16
+ load: (options?: {
17
+ canvas?: JSONCanvas;
18
+ attachmentDir?: string;
19
+ }) => void;
13
20
  dispose: () => void;
14
21
  }
22
+ type JSONCanvasViewerType = new <M extends ModuleInputCtor = []>(...args: ConstructorParameters<typeof JSONCanvasViewer<M>>) => JSONCanvasViewer<M> & UserAugmentation<M>;
23
+ export type JSONCanvasViewerInterface<M extends ModuleInput = []> = JSONCanvasViewer<[]> & UserAugmentation<M>;
24
+ declare const _default: JSONCanvasViewerType;
25
+ export default _default;
@@ -1,5 +1,5 @@
1
- import { Click, type Ctors, Drag, MultitouchPanZoom, Pointeract, type Options as PointeractOptions, PreventDefault, WheelPanZoom } from 'pointeract';
2
1
  import { type BaseArgs, BaseModule } from './baseModule';
2
+ import { Click, type Ctors, Drag, MultitouchPanZoom, Pointeract, type Options as PointeractOptions, PreventDefault, WheelPanZoom } from 'pointeract';
3
3
  type Options = {
4
4
  pointeract?: PointeractOptions<Ctors<[Click, Drag, WheelPanZoom, PreventDefault, MultitouchPanZoom]>>;
5
5
  };
@@ -19,6 +19,8 @@ export default class InteractionHandler extends BaseModule<Options> {
19
19
  private onPan;
20
20
  private onZoom;
21
21
  private onTrueClick;
22
+ private isUIControl;
23
+ private findNodeId;
22
24
  private dispose;
23
25
  }
24
26
  export {};
@@ -9,7 +9,7 @@ export default class OverlayManager extends BaseModule<Options> {
9
9
  private selectedId;
10
10
  private eventListeners;
11
11
  private DM;
12
- private IH;
12
+ private SM;
13
13
  private parse;
14
14
  private get overlaysLayer();
15
15
  hooks: {
@@ -28,11 +28,17 @@ export default class OverlayManager extends BaseModule<Options> {
28
28
  };
29
29
  constructor(...args: BaseArgs);
30
30
  private start;
31
+ private restart;
32
+ private renderOverlays;
33
+ private themeChanged;
31
34
  private select;
32
35
  private loadMarkdownForNode;
33
36
  private updateOverlays;
37
+ private createOverlay;
34
38
  private updateOverlay;
35
39
  private constructOverlay;
40
+ private setOverlayColor;
41
+ private clearOverlays;
36
42
  private dispose;
37
43
  }
38
44
  export {};
@@ -1,8 +1,12 @@
1
1
  import { type BaseArgs, BaseModule } from './baseModule';
2
- export default class Renderer extends BaseModule {
2
+ type Options = {
3
+ zoomInOptimization?: boolean;
4
+ };
5
+ export default class Renderer extends BaseModule<Options> {
3
6
  private _canvas;
4
7
  private ctx;
5
8
  private DM;
9
+ private SM;
6
10
  private zoomInOptimize;
7
11
  private get canvas();
8
12
  constructor(...args: BaseArgs);
@@ -10,16 +14,18 @@ export default class Renderer extends BaseModule {
10
14
  private redraw;
11
15
  private trueRedraw;
12
16
  private fakeRedraw;
13
- private isViewportInside;
17
+ private isInside;
18
+ private isOutside;
14
19
  private getCurrentViewport;
15
20
  private drawLabelBar;
16
21
  private drawNodeBackground;
17
22
  private drawGroup;
18
- private drawFileNode;
23
+ private drawFile;
19
24
  private drawEdge;
20
- private getEdgeNodes;
21
25
  private getControlPoints;
26
+ private drawGridDots;
22
27
  private drawCurvedPath;
23
28
  private drawArrowhead;
24
29
  private dispose;
25
30
  }
31
+ export {};
@@ -0,0 +1,48 @@
1
+ import { BaseModule, type BaseArgs } from './baseModule';
2
+ export type Color = {
3
+ border: string;
4
+ background: string;
5
+ active: string;
6
+ text: string;
7
+ card: string;
8
+ };
9
+ type Options = {
10
+ theme?: 'dark' | 'light';
11
+ };
12
+ type Augmentation = {
13
+ changeTheme: StyleManager['changeTheme'];
14
+ };
15
+ declare const namedColors: {
16
+ light: {
17
+ dots: string;
18
+ text: string;
19
+ background: string;
20
+ 'background-secondary': string;
21
+ shadow: string;
22
+ border: string;
23
+ };
24
+ dark: {
25
+ dots: string;
26
+ text: string;
27
+ background: string;
28
+ 'background-secondary': string;
29
+ shadow: string;
30
+ border: string;
31
+ };
32
+ };
33
+ export default class StyleManager extends BaseModule<Options, Augmentation> {
34
+ theme: 'dark' | 'light';
35
+ onChangeTheme: {
36
+ (args_0: "dark" | "light"): void;
37
+ subs: Set<(args_0: "dark" | "light") => unknown>;
38
+ subscribe(callback: (args_0: "dark" | "light") => unknown): void;
39
+ unsubscribe(callback: (args_0: "dark" | "light") => unknown): void;
40
+ };
41
+ private colorCache;
42
+ constructor(...args: BaseArgs);
43
+ private hslProcessor;
44
+ getColor: (colorIndex?: string) => Color;
45
+ getNamedColor: (name: keyof typeof namedColors.dark) => string;
46
+ changeTheme: (theme?: "dark" | "light") => void;
47
+ }
48
+ export {};
@@ -5,18 +5,15 @@ declare const _default: {
5
5
  applyStyles: typeof applyStyles;
6
6
  drawRoundRect: typeof drawRoundRect;
7
7
  getAnchorCoord: typeof getAnchorCoord;
8
- getColor: typeof getColor;
9
8
  makeHook: typeof makeHook;
10
9
  };
11
10
  export default _default;
12
11
  export declare const destroyError: Error;
13
12
  declare function applyStyles(container: HTMLElement | ShadowRoot, styleString: string): void;
14
13
  declare function drawRoundRect(ctx: CanvasRenderingContext2D, x: number, y: number, width: number, height: number, radius: number): void;
15
- declare function getAnchorCoord(node: JSONCanvasNode, side: 'top' | 'bottom' | 'left' | 'right'): number[];
16
- declare function getColor(colorIndex?: string): {
17
- border: string;
18
- background: string;
19
- active: string;
14
+ declare function getAnchorCoord(node: JSONCanvasNode, side: 'top' | 'bottom' | 'left' | 'right'): {
15
+ x: number;
16
+ y: number;
20
17
  };
21
18
  declare function resizeCanvasForDPR(canvas: HTMLCanvasElement, width: number, height: number): void;
22
19
  declare function round(roundedNum: number, digits: number): number;
@@ -5,4 +5,5 @@ export { default as DataManager } from './core/dataManager';
5
5
  export { default as InteractionHandler } from './core/interactionHandler';
6
6
  export { default as OverlayManager } from './core/overlayManager';
7
7
  export { default as Renderer } from './core/renderer';
8
+ export { default as StyleManager } from './core/styleManager';
8
9
  export { default as canvasUtils } from './core/utilities';
@@ -1,2 +1,2 @@
1
- export { default as JSONCanvasViewer } from './core';
1
+ export { default as JSONCanvasViewer, type JSONCanvasViewerInterface } from './core';
2
2
  export type { UserOptions as Options } from './core/declarations';
@@ -2,7 +2,10 @@ import { type BaseArgs, BaseModule } from '../../core/baseModule';
2
2
  type Options = {
3
3
  controlsCollapsed?: boolean;
4
4
  };
5
- export default class Controls extends BaseModule<Options> {
5
+ type Augmentation = {
6
+ toggleControlsCollapse: Controls['toggleCollapse'];
7
+ };
8
+ export default class Controls extends BaseModule<Options, Augmentation> {
6
9
  private _controlsPanel;
7
10
  private _toggleCollapseBtn;
8
11
  private _toggleFullscreenBtn;
@@ -2,7 +2,10 @@ import { type BaseArgs, BaseModule } from '../../core/baseModule';
2
2
  type Options = {
3
3
  minimapCollapsed?: boolean;
4
4
  };
5
- export default class Minimap extends BaseModule<Options> {
5
+ type Augmentation = {
6
+ toggleMinimapCollapse: Minimap['toggleCollapse'];
7
+ };
8
+ export default class Minimap extends BaseModule<Options, Augmentation> {
6
9
  private _minimapCtx;
7
10
  private _viewportRectangle;
8
11
  private _minimap;
@@ -10,6 +13,7 @@ export default class Minimap extends BaseModule<Options> {
10
13
  private _toggleMinimapBtn;
11
14
  private minimapCache;
12
15
  private DM;
16
+ private SM;
13
17
  private collapsed;
14
18
  private get minimap();
15
19
  private get minimapCtx();
@@ -1,11 +1,13 @@
1
1
  import { type BaseArgs, BaseModule } from '../../core/baseModule';
2
2
  type Options = {
3
- mistouchPreventer?: {
4
- preventAtStart?: boolean;
5
- labelText?: string;
6
- };
3
+ preventMistouchAtStart?: boolean;
4
+ mistouchPreventerBannerText?: string;
7
5
  };
8
- export default class MistouchPreventer extends BaseModule<Options> {
6
+ type Augmentation = {
7
+ startMistouchPrevention: MistouchPreventer['startPrevention'];
8
+ endMistouchPrevention: MistouchPreventer['endPrevention'];
9
+ };
10
+ export default class MistouchPreventer extends BaseModule<Options, Augmentation> {
9
11
  private _preventionContainer;
10
12
  private preventMt;
11
13
  private DM;
package/dist/vue.cjs ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";const e=require("vue"),n=require("./index-DwvIUSbr.cjs"),t=require("./renderToString-Cxh5DtRo.cjs"),a=["innerHTML"],r=e.defineComponent({__name:"vueComponent",props:{modules:{},canvas:{},attachmentDir:{},options:{},isPrerendering:{type:Boolean},theme:{}},async setup(r,{expose:i}){let o,s;const c=r,m=c.isPrerendering||"undefined"==typeof window,h=e.useTemplateRef("viewerRef");let u=null;const l=m?([o,s]=e.withAsyncContext(()=>t.renderToString({canvas:c.canvas||{},attachmentDir:c.attachmentDir,...c.options})),o=await o,s(),o):"";return e.watch(()=>c.theme,e=>u?.changeTheme(e)),e.watch(()=>({canvas:c.canvas,attachmentDir:c.attachmentDir}),({canvas:e,attachmentDir:n})=>u?.load({canvas:e,attachmentDir:n})),e.onMounted(()=>{h.value&&(u=new n.JSONCanvasViewer(Object.assign(c.options||{},{container:h.value,theme:c.theme,canvas:c.canvas,attachmentDir:c.attachmentDir}),c.modules))}),e.onUnmounted(()=>{u?.dispose(),u=null}),i({viewer:u}),(n,t)=>(e.openBlock(),e.createElementBlock("section",{ref_key:"viewerRef",ref:h,innerHTML:e.unref(l),style:{"max-height":"100vh","max-width":"100vw"}},null,8,a))}});module.exports=r;
2
+ //# sourceMappingURL=vue.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vue.cjs","sources":["../src/bridges/vueComponent.vue"],"sourcesContent":["<script lang=\"ts\" generic=\"T extends ModuleInputCtor\" setup>\nimport { onMounted, onUnmounted, useTemplateRef, watch } from 'vue';\nimport JSONCanvasViewer, { type JSONCanvasViewerInterface } from '$';\nimport type { ModuleInputCtor, UserOptions } from '$/declarations';\nimport renderToString from './renderToString';\n\ntype ComponentOptions<T extends ModuleInputCtor> = {\n\tmodules?: T;\n\tcanvas?: JSONCanvas;\n\tattachmentDir?: string;\n\toptions?: Omit<UserOptions<T>, 'container' | 'theme' | 'canvas' | 'attachmentDir'>;\n\tisPrerendering?: boolean;\n\ttheme?: 'dark' | 'light';\n};\n\nconst props = defineProps<ComponentOptions<T>>();\n\nconst isPrerendering = props.isPrerendering || typeof window === 'undefined';\nconst viewerRef = useTemplateRef('viewerRef');\nlet viewer: JSONCanvasViewerInterface<T> | null = null;\nconst prerender = isPrerendering\n\t? await renderToString({\n\t\t\tcanvas: props.canvas || {},\n\t\t\tattachmentDir: props.attachmentDir,\n\t\t\t...props.options,\n\t\t})\n\t: '';\nwatch(\n\t() => props.theme,\n\t(theme) => viewer?.changeTheme(theme),\n);\nwatch(\n\t() => {\n\t\treturn {\n\t\t\tcanvas: props.canvas,\n\t\t\tattachmentDir: props.attachmentDir,\n\t\t};\n\t},\n\t({ canvas, attachmentDir }) => viewer?.load({ canvas, attachmentDir }),\n);\n\nonMounted(() => {\n\tif (!viewerRef.value) return;\n\tviewer = new JSONCanvasViewer(\n\t\tObject.assign(props.options || {}, {\n\t\t\tcontainer: viewerRef.value,\n\t\t\ttheme: props.theme,\n\t\t\tcanvas: props.canvas,\n\t\t\tattachmentDir: props.attachmentDir,\n\t\t}) as UserOptions<T>,\n\t\tprops.modules,\n\t);\n});\n\nonUnmounted(() => {\n\tviewer?.dispose();\n\tviewer = null;\n});\n\ndefineExpose({ viewer });\n</script>\n\n<template>\n\t<section ref=\"viewerRef\" v-html=\"prerender\" style=\"max-height: 100vh; max-width: 100vw\" />\n</template>\n"],"names":["props","__props","isPrerendering","window","viewerRef","useTemplateRef","viewer","prerender","__temp","__restore","_withAsyncContext","renderToString","canvas","attachmentDir","options","watch","theme","changeTheme","load","onMounted","value","JSONCanvasViewer","Object","assign","container","modules","onUnmounted","dispose","__expose","_createElementBlock","ref","innerHTML","_unref","style"],"mappings":"8SAeA,MAAMA,EAAQC,EAERC,EAAiBF,EAAME,gBAAoC,oBAAXC,OAChDC,EAAYC,EAAAA,eAAe,aACjC,IAAIC,EAA8C,KAClD,MAAMC,EAAYL,IACfM,EAAAC,GAAAC,EAAAA,iBAAA,IAAMC,iBAAe,CACrBC,OAAQZ,EAAMY,QAAU,CAAA,EACxBC,cAAeb,EAAMa,iBAClBb,EAAMc,4BAET,UACHC,EAAAA,MACC,IAAMf,EAAMgB,MACXA,GAAUV,GAAQW,YAAYD,IAEhCD,EAAAA,MACC,KACQ,CACNH,OAAQZ,EAAMY,OACdC,cAAeb,EAAMa,gBAGvB,EAAGD,SAAQC,mBAAoBP,GAAQY,KAAK,CAAEN,SAAQC,mBAGvDM,EAAAA,UAAU,KACJf,EAAUgB,QACfd,EAAS,IAAIe,EAAAA,iBACZC,OAAOC,OAAOvB,EAAMc,SAAW,CAAA,EAAI,CAClCU,UAAWpB,EAAUgB,MACrBJ,MAAOhB,EAAMgB,MACbJ,OAAQZ,EAAMY,OACdC,cAAeb,EAAMa,gBAEtBb,EAAMyB,YAIRC,EAAAA,YAAY,KACXpB,GAAQqB,UACRrB,EAAS,OAGVsB,EAAa,CAAEtB,iCAIduB,EAAAA,mBAA0F,UAAA,SAA7E,YAAJC,IAAI1B,EAAY2B,UAAQC,EAAAA,MAAAzB,GAAW0B,MAAA,CAAA,aAAA,QAAA,YAAA"}
package/dist/vue.js ADDED
@@ -0,0 +1,2 @@
1
+ import{defineComponent as e,useTemplateRef as t,withAsyncContext as a,watch as n,onMounted as r,onUnmounted as i,openBlock as s,createElementBlock as o,unref as c}from"vue";import{J as m}from"./index-DJQyGIFX.js";import{r as h}from"./renderToString-ChykAKof.js";const v=["innerHTML"],l=/* @__PURE__ */e({__name:"vueComponent",props:{modules:{},canvas:{},attachmentDir:{},options:{},isPrerendering:{type:Boolean},theme:{}},async setup(e,{expose:l}){let p,d;const u=e,f=u.isPrerendering||"undefined"==typeof window,w=t("viewerRef");let D=null;const g=f?([p,d]=a(()=>h({canvas:u.canvas||{},attachmentDir:u.attachmentDir,...u.options})),p=await p,d(),p):"";return n(()=>u.theme,e=>D?.changeTheme(e)),n(()=>({canvas:u.canvas,attachmentDir:u.attachmentDir}),({canvas:e,attachmentDir:t})=>D?.load({canvas:e,attachmentDir:t})),r(()=>{w.value&&(D=new m(Object.assign(u.options||{},{container:w.value,theme:u.theme,canvas:u.canvas,attachmentDir:u.attachmentDir}),u.modules))}),i(()=>{D?.dispose(),D=null}),l({viewer:D}),(e,t)=>(s(),o("section",{ref_key:"viewerRef",ref:w,innerHTML:c(g),style:{"max-height":"100vh","max-width":"100vw"}},null,8,v))}});export{l as default};
2
+ //# sourceMappingURL=vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vue.js","sources":["../src/bridges/vueComponent.vue"],"sourcesContent":["<script lang=\"ts\" generic=\"T extends ModuleInputCtor\" setup>\nimport { onMounted, onUnmounted, useTemplateRef, watch } from 'vue';\nimport JSONCanvasViewer, { type JSONCanvasViewerInterface } from '$';\nimport type { ModuleInputCtor, UserOptions } from '$/declarations';\nimport renderToString from './renderToString';\n\ntype ComponentOptions<T extends ModuleInputCtor> = {\n\tmodules?: T;\n\tcanvas?: JSONCanvas;\n\tattachmentDir?: string;\n\toptions?: Omit<UserOptions<T>, 'container' | 'theme' | 'canvas' | 'attachmentDir'>;\n\tisPrerendering?: boolean;\n\ttheme?: 'dark' | 'light';\n};\n\nconst props = defineProps<ComponentOptions<T>>();\n\nconst isPrerendering = props.isPrerendering || typeof window === 'undefined';\nconst viewerRef = useTemplateRef('viewerRef');\nlet viewer: JSONCanvasViewerInterface<T> | null = null;\nconst prerender = isPrerendering\n\t? await renderToString({\n\t\t\tcanvas: props.canvas || {},\n\t\t\tattachmentDir: props.attachmentDir,\n\t\t\t...props.options,\n\t\t})\n\t: '';\nwatch(\n\t() => props.theme,\n\t(theme) => viewer?.changeTheme(theme),\n);\nwatch(\n\t() => {\n\t\treturn {\n\t\t\tcanvas: props.canvas,\n\t\t\tattachmentDir: props.attachmentDir,\n\t\t};\n\t},\n\t({ canvas, attachmentDir }) => viewer?.load({ canvas, attachmentDir }),\n);\n\nonMounted(() => {\n\tif (!viewerRef.value) return;\n\tviewer = new JSONCanvasViewer(\n\t\tObject.assign(props.options || {}, {\n\t\t\tcontainer: viewerRef.value,\n\t\t\ttheme: props.theme,\n\t\t\tcanvas: props.canvas,\n\t\t\tattachmentDir: props.attachmentDir,\n\t\t}) as UserOptions<T>,\n\t\tprops.modules,\n\t);\n});\n\nonUnmounted(() => {\n\tviewer?.dispose();\n\tviewer = null;\n});\n\ndefineExpose({ viewer });\n</script>\n\n<template>\n\t<section ref=\"viewerRef\" v-html=\"prerender\" style=\"max-height: 100vh; max-width: 100vw\" />\n</template>\n"],"names":["props","__props","isPrerendering","window","viewerRef","useTemplateRef","viewer","prerender","__temp","__restore","_withAsyncContext","renderToString","canvas","attachmentDir","options","watch","theme","changeTheme","load","onMounted","value","JSONCanvasViewer","Object","assign","container","modules","onUnmounted","dispose","__expose","_createElementBlock","ref","innerHTML","_unref","style"],"mappings":"wcAeA,MAAMA,EAAQC,EAERC,EAAiBF,EAAME,gBAAoC,oBAAXC,OAChDC,EAAYC,EAAe,aACjC,IAAIC,EAA8C,KAClD,MAAMC,EAAYL,IACfM,EAAAC,GAAAC,EAAA,IAAMC,EAAe,CACrBC,OAAQZ,EAAMY,QAAU,CAAA,EACxBC,cAAeb,EAAMa,iBAClBb,EAAMc,4BAET,UACHC,EACC,IAAMf,EAAMgB,MACXA,GAAUV,GAAQW,YAAYD,IAEhCD,EACC,KACQ,CACNH,OAAQZ,EAAMY,OACdC,cAAeb,EAAMa,gBAGvB,EAAGD,SAAQC,mBAAoBP,GAAQY,KAAK,CAAEN,SAAQC,mBAGvDM,EAAU,KACJf,EAAUgB,QACfd,EAAS,IAAIe,EACZC,OAAOC,OAAOvB,EAAMc,SAAW,CAAA,EAAI,CAClCU,UAAWpB,EAAUgB,MACrBJ,MAAOhB,EAAMgB,MACbJ,OAAQZ,EAAMY,OACdC,cAAeb,EAAMa,gBAEtBb,EAAMyB,YAIRC,EAAY,KACXpB,GAAQqB,UACRrB,EAAS,OAGVsB,EAAa,CAAEtB,uBAIduB,EAA0F,UAAA,SAA7E,YAAJC,IAAI1B,EAAY2B,UAAQC,EAAAzB,GAAW0B,MAAA,CAAA,aAAA,QAAA,YAAA"}