json-canvas-viewer 3.4.3 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +2 -2
- package/README.md +51 -107
- package/dist/chimp.js +1 -1
- package/dist/index.d.ts +619 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/kernel/BaseModule.js +2 -0
- package/dist/kernel/BaseModule.js.map +1 -0
- package/dist/kernel/Controller.js +2 -0
- package/dist/kernel/Controller.js.map +1 -0
- package/dist/kernel/DataManager.js +2 -0
- package/dist/kernel/DataManager.js.map +1 -0
- package/dist/kernel/InteractionHandler.js +2 -0
- package/dist/kernel/InteractionHandler.js.map +1 -0
- package/dist/kernel/OverlayManager.js +2 -0
- package/dist/kernel/OverlayManager.js.map +1 -0
- package/dist/kernel/Renderer.js +2 -0
- package/dist/kernel/Renderer.js.map +1 -0
- package/dist/kernel/StyleManager.js +2 -0
- package/dist/kernel/StyleManager.js.map +1 -0
- package/dist/kernel/index.js +2 -0
- package/dist/kernel/index.js.map +1 -0
- package/dist/kernel/styles.scss.js +2 -0
- package/dist/kernel/styles.scss.js.map +1 -0
- package/dist/kernel/utilities.js +2 -0
- package/dist/kernel/utilities.js.map +1 -0
- package/dist/modules/Controls/index.js +2 -0
- package/dist/modules/Controls/index.js.map +1 -0
- package/dist/modules/Controls/styles.scss.js +2 -0
- package/dist/modules/Controls/styles.scss.js.map +1 -0
- package/dist/modules/DebugPanel/index.js +2 -0
- package/dist/modules/DebugPanel/index.js.map +1 -0
- package/dist/modules/DebugPanel/styles.scss.js +2 -0
- package/dist/modules/DebugPanel/styles.scss.js.map +1 -0
- package/dist/modules/Minimap/index.js +2 -0
- package/dist/modules/Minimap/index.js.map +1 -0
- package/dist/modules/Minimap/styles.scss.js +2 -0
- package/dist/modules/Minimap/styles.scss.js.map +1 -0
- package/dist/modules/MistouchPreventer/index.js +2 -0
- package/dist/modules/MistouchPreventer/index.js.map +1 -0
- package/dist/modules/MistouchPreventer/styles.scss.js +2 -0
- package/dist/modules/MistouchPreventer/styles.scss.js.map +1 -0
- package/dist/utilities/fetchCanvas.js +2 -0
- package/dist/utilities/fetchCanvas.js.map +1 -0
- package/dist/utilities/parser.js +2 -0
- package/dist/utilities/parser.js.map +1 -0
- package/dist/{renderToString-Dp8A-Rka.js → utilities/renderToString.js} +2 -2
- package/dist/utilities/renderToString.js.map +1 -0
- package/package.json +14 -46
- package/dist/bridges.js +0 -2
- package/dist/bridges.js.map +0 -1
- package/dist/dev.js +0 -2
- package/dist/dev.js.map +0 -1
- package/dist/index-BPBGNZi4.js +0 -2
- package/dist/index-BPBGNZi4.js.map +0 -1
- package/dist/interactionHandler-CrVH9u7P.js +0 -2
- package/dist/interactionHandler-CrVH9u7P.js.map +0 -1
- package/dist/modules.js +0 -2
- package/dist/modules.js.map +0 -1
- package/dist/react.js +0 -2
- package/dist/react.js.map +0 -1
- package/dist/renderToString-Dp8A-Rka.js.map +0 -1
- package/dist/renderer-BGA72dN1.js +0 -2
- package/dist/renderer-BGA72dN1.js.map +0 -1
- package/dist/types/bridges/reactComponent.d.ts +0 -12
- package/dist/types/bridges/renderToString.d.ts +0 -6
- package/dist/types/bridges/vitePlugin.d.ts +0 -8
- package/dist/types/bridges/vueComponent.vue.d.ts +0 -28
- package/dist/types/bridges/webpackPlugin.d.ts +0 -7
- package/dist/types/bridges.d.ts +0 -3
- package/dist/types/chimp.d.ts +0 -7
- package/dist/types/core/baseModule.d.ts +0 -19
- package/dist/types/core/controller.d.ts +0 -35
- package/dist/types/core/dataManager.d.ts +0 -59
- package/dist/types/core/declarations.d.ts +0 -105
- package/dist/types/core/index.d.ts +0 -25
- package/dist/types/core/interactionHandler.d.ts +0 -39
- package/dist/types/core/overlayManager.d.ts +0 -44
- package/dist/types/core/renderer.d.ts +0 -32
- package/dist/types/core/styleManager.d.ts +0 -49
- package/dist/types/core/utilities.d.ts +0 -25
- package/dist/types/dev.d.ts +0 -9
- package/dist/types/index.d.ts +0 -2
- package/dist/types/modules/controls/index.d.ts +0 -38
- package/dist/types/modules/debugPanel/index.d.ts +0 -9
- package/dist/types/modules/minimap/index.d.ts +0 -32
- package/dist/types/modules/mistouchPreventer/index.d.ts +0 -25
- package/dist/types/modules.d.ts +0 -4
- package/dist/vue.js +0 -2
- package/dist/vue.js.map +0 -1
- package/dist/webpackLoader.js +0 -33
package/package.json
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "json-canvas-viewer",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.1.0",
|
|
4
4
|
"description": "An extensible web-based viewer for JSON Canvas, easy to embed into websites.",
|
|
5
5
|
"keywords": [
|
|
6
|
-
"
|
|
6
|
+
"frontend",
|
|
7
7
|
"html-canvas",
|
|
8
8
|
"json-canvas",
|
|
9
|
-
"obsidian",
|
|
9
|
+
"obsidian-md",
|
|
10
10
|
"typescript"
|
|
11
11
|
],
|
|
12
|
-
"homepage": "https://
|
|
12
|
+
"homepage": "https://github.com/hesprs/json-canvas-viewer",
|
|
13
13
|
"bugs": {
|
|
14
14
|
"url": "https://github.com/hesprs/json-canvas-viewer/issues"
|
|
15
15
|
},
|
|
@@ -23,39 +23,19 @@
|
|
|
23
23
|
"url": "git+https://github.com/hesprs/json-canvas-viewer.git"
|
|
24
24
|
},
|
|
25
25
|
"files": [
|
|
26
|
-
"dist"
|
|
26
|
+
"./dist"
|
|
27
27
|
],
|
|
28
28
|
"type": "module",
|
|
29
29
|
"sideEffects": false,
|
|
30
30
|
"main": "./dist/index.js",
|
|
31
31
|
"module": "./dist/index.js",
|
|
32
|
-
"types": "./dist/
|
|
32
|
+
"types": "./dist/index.d.ts",
|
|
33
33
|
"unpkg": "./dist/chimp.js",
|
|
34
34
|
"jsdelivr": "./dist/chimp.js",
|
|
35
35
|
"exports": {
|
|
36
36
|
".": {
|
|
37
|
-
"types": "./dist/
|
|
37
|
+
"types": "./dist/index.d.ts",
|
|
38
38
|
"import": "./dist/index.js"
|
|
39
|
-
},
|
|
40
|
-
"./dev": {
|
|
41
|
-
"types": "./dist/types/dev.d.ts",
|
|
42
|
-
"import": "./dist/dev.js"
|
|
43
|
-
},
|
|
44
|
-
"./modules": {
|
|
45
|
-
"types": "./dist/types/modules.d.ts",
|
|
46
|
-
"import": "./dist/modules.js"
|
|
47
|
-
},
|
|
48
|
-
"./bridges": {
|
|
49
|
-
"types": "./dist/types/bridges.d.ts",
|
|
50
|
-
"import": "./dist/bridges.js"
|
|
51
|
-
},
|
|
52
|
-
"./vue": {
|
|
53
|
-
"types": "./dist/types/bridges/vueComponent.vue.d.ts",
|
|
54
|
-
"import": "./dist/vue.js"
|
|
55
|
-
},
|
|
56
|
-
"./react": {
|
|
57
|
-
"types": "./dist/types/bridges/reactComponent.d.ts",
|
|
58
|
-
"import": "./dist/react.js"
|
|
59
39
|
}
|
|
60
40
|
},
|
|
61
41
|
"publishConfig": {
|
|
@@ -64,32 +44,20 @@
|
|
|
64
44
|
},
|
|
65
45
|
"dependencies": {
|
|
66
46
|
"@ahmedsemih/color-fns": "^1.3.0",
|
|
67
|
-
"@needle-di/core": "^1.1.
|
|
47
|
+
"@needle-di/core": "^1.1.1",
|
|
48
|
+
"dompurify": "^3.3.1",
|
|
49
|
+
"marked": "^17.0.3",
|
|
68
50
|
"pointeract": "^1.1.1"
|
|
69
51
|
},
|
|
70
52
|
"devDependencies": {
|
|
71
|
-
"@types/node": "^25.2.0",
|
|
72
|
-
"@types/react": "^19.2.11",
|
|
73
|
-
"@vitejs/plugin-vue": "^6.0.4",
|
|
74
|
-
"dompurify": "^3.3.1",
|
|
75
|
-
"marked": "^17.0.1",
|
|
76
|
-
"oxfmt": "^0.28.0",
|
|
77
|
-
"oxlint": "^1.43.0",
|
|
78
|
-
"oxlint-tsgolint": "^0.11.4",
|
|
79
|
-
"react": "^19.2.4",
|
|
80
53
|
"sass": "^1.97.3",
|
|
81
|
-
"
|
|
82
|
-
"
|
|
83
|
-
"typescript": "^5.9.3",
|
|
84
|
-
"vite": "^7.3.1",
|
|
85
|
-
"vue": "^3.5.27",
|
|
86
|
-
"vue-tsc": "^3.2.4",
|
|
87
|
-
"webpack": "^5.105.0"
|
|
54
|
+
"@repo/shared": "0.0.1",
|
|
55
|
+
"vite-plugin-json-canvas": "1.0.1"
|
|
88
56
|
},
|
|
89
57
|
"scripts": {
|
|
90
58
|
"dev": "vite",
|
|
91
59
|
"lint": "oxlint --type-aware --fix && oxfmt",
|
|
92
|
-
"build": "vite build && BUILD=
|
|
93
|
-
"check": "
|
|
60
|
+
"build": "vite build && BUILD=chimp vite build",
|
|
61
|
+
"check": "tsc && oxfmt --check && oxlint --type-aware"
|
|
94
62
|
}
|
|
95
63
|
}
|
package/dist/bridges.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./renderToString-Dp8A-Rka.js";function a(e){return{name:"json-canvas-vite-plugin",async transform(a,r){if(!r.endsWith(".canvas"))return null;try{const r=JSON.parse(a);return e&&r.nodes&&await Promise.all(r.nodes.map(async a=>{"text"===a.type&&(a.text=await e(a.text))})),{code:`export default ${JSON.stringify(r)}`,map:null}}catch(s){throw console.error(`[json-canvas-vite-plugin] Failed to parse: ${r}`),s}}}}class r{parser;constructor(e){this.parser=e}apply(e){const a=require.resolve("./webpackLoader");e.options.module.rules.unshift({test:/\.canvas$/,use:[{loader:a,options:{parser:this.parser}}],type:"javascript/auto"})}}export{r as JSONCanvasWebpackPlugin,a as jsonCanvasVitePlugin,e as renderToString};
|
|
2
|
-
//# sourceMappingURL=bridges.js.map
|
package/dist/bridges.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bridges.js","sources":["../src/bridges/vitePlugin.ts","../src/bridges/webpackPlugin.ts"],"sourcesContent":["import type { MarkdownParser } from '$/declarations';\n\nexport default function (parser?: MarkdownParser) {\n\treturn {\n\t\tname: 'json-canvas-vite-plugin',\n\t\tasync transform(code: string, id: string) {\n\t\t\tif (!id.endsWith('.canvas')) return null;\n\t\t\ttry {\n\t\t\t\tconst json = JSON.parse(code) as JSONCanvas;\n\t\t\t\tif (parser && json.nodes)\n\t\t\t\t\tawait Promise.all(\n\t\t\t\t\t\tjson.nodes.map(async (node) => {\n\t\t\t\t\t\t\tif (node.type === 'text') node.text = await parser(node.text);\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\treturn {\n\t\t\t\t\tcode: `export default ${JSON.stringify(json)}`,\n\t\t\t\t\tmap: null,\n\t\t\t\t};\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(`[json-canvas-vite-plugin] Failed to parse: ${id}`);\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t},\n\t};\n}\n","import type { MarkdownParser } from '$/declarations';\nimport type { Compiler } from 'webpack';\n\nexport default class JsonCanvasWebpackPlugin {\n\tparser: MarkdownParser;\n\n\tconstructor(parser: MarkdownParser) {\n\t\tthis.parser = parser;\n\t}\n\n\tapply(compiler: Compiler) {\n\t\tconst loaderPath = require.resolve('./webpackLoader');\n\n\t\tcompiler.options.module.rules.unshift({\n\t\t\ttest: /\\.canvas$/,\n\t\t\tuse: [\n\t\t\t\t{\n\t\t\t\t\tloader: loaderPath,\n\t\t\t\t\toptions: { parser: this.parser },\n\t\t\t\t},\n\t\t\t],\n\t\t\t// Prevent Webpack's default JSON handling\n\t\t\ttype: 'javascript/auto',\n\t\t});\n\t}\n}\n"],"names":["vitePlugin","parser","name","transform","code","id","endsWith","json","JSON","parse","nodes","Promise","all","map","async","node","type","text","stringify","e","console","error","JsonCanvasWebpackPlugin","constructor","this","apply","compiler","loaderPath","require","options","module","rules","unshift","test","use","loader"],"mappings":"iDAEA,SAAAA,EAAyBC,GACxB,MAAO,CACNC,KAAM,0BACN,eAAMC,CAAUC,EAAcC,GAC7B,IAAKA,EAAGC,SAAS,WAAY,OAAO,KACpC,IACC,MAAMC,EAAOC,KAAKC,MAAML,GAOxB,OANIH,GAAUM,EAAKG,aACZC,QAAQC,IACbL,EAAKG,MAAMG,IAAIC,MAAOC,IACH,SAAdA,EAAKC,OAAiBD,EAAKE,WAAahB,EAAOc,EAAKE,UAGpD,CACNb,KAAM,kBAAkBI,KAAKU,UAAUX,KACvCM,IAAK,KAEP,OAASM,GAER,MADAC,QAAQC,MAAM,8CAA8ChB,KACtDc,CACP,CACD,EAEF,CCtBA,MAAqBG,EACpBrB,OAEA,WAAAsB,CAAYtB,GACXuB,KAAKvB,OAASA,CACf,CAEA,KAAAwB,CAAMC,GACL,MAAMC,EAAaC,gBAAgB,mBAEnCF,EAASG,QAAQC,OAAOC,MAAMC,QAAQ,CACrCC,KAAM,YACNC,IAAK,CACJ,CACCC,OAAQR,EACRE,QAAS,CAAE5B,OAAQuB,KAAKvB,UAI1Be,KAAM,mBAER"}
|
package/dist/dev.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{B as a,C as r,D as e,I as n,O as s,S as t,u as o}from"./interactionHandler-CrVH9u7P.js";import{R as l}from"./renderer-BGA72dN1.js";export{a as BaseModule,r as Controller,e as DataManager,n as InteractionHandler,s as OverlayManager,l as Renderer,t as StyleManager,o as canvasUtils};
|
|
2
|
-
//# sourceMappingURL=dev.js.map
|
package/dist/dev.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dev.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
package/dist/index-BPBGNZi4.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{u as t,D as s,S as i,C as o,O as n,I as e}from"./interactionHandler-CrVH9u7P.js";import{R as r}from"./renderer-BGA72dN1.js";import{Container as a}from"@needle-di/core";class h{allModules;IO=null;onDispose=t.makeHook(!0);onStart=t.makeHook();onRestart=t.makeHook();started=!1;options;container;constructor(t,h){this.container=new a,this.options=t;this.allModules=[s,i,o,n,e,r,...h??[]],this.allModules.forEach(t=>{this.container.bind({provide:t,useFactory:()=>new t(this.container,this.options,this.onStart,this.onDispose,this.onRestart,this.augment)})}),this.allModules.forEach(t=>{this.container.get(t)});const l=this.options.loading??"normal";"normal"===l?this.load():"lazy"===l&&(this.IO=new IntersectionObserver(this.onVisibilityCheck,{root:null,rootMargin:"50px",threshold:0}),this.IO.observe(this.options.container))}onVisibilityCheck=t=>{t.forEach(t=>{if(t.isIntersecting)return this.load(),this.IO?.disconnect(),void(this.IO=null)})};augment=t=>{Object.entries(t).forEach(([t,s])=>{this[t]=s})};load=t=>{t&&Object.assign(this.options,t),this.started?this.onRestart():(this.onStart(),this.started=!0)};dispose=()=>{this.IO?.disconnect(),this.IO=null;const t=this.options.container;for(;t.firstChild;)t.firstChild.remove();this.onDispose(),this.container.unbindAll()}}export{h as J};
|
|
2
|
-
//# sourceMappingURL=index-BPBGNZi4.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-BPBGNZi4.js","sources":["../src/core/index.ts"],"sourcesContent":["import type { BaseModule } from '$/baseModule';\nimport Controller from '$/controller';\nimport DataManager from '$/dataManager';\nimport type {\n\tModuleInputCtor,\n\tUserOptions,\n\tUserAugmentation,\n\tModuleInput,\n\tGeneralObject,\n} from '$/declarations';\nimport InteractionHandler from '$/interactionHandler';\nimport OverlayManager from '$/overlayManager';\nimport Renderer from '$/renderer';\nimport StyleManager from '$/styleManager';\nimport utilities from '$/utilities';\nimport { Container } from '@needle-di/core';\n\nclass JSONCanvasViewer<M extends ModuleInputCtor> {\n\tprivate allModules: ModuleInputCtor;\n\tprivate IO: IntersectionObserver | null = null;\n\tprivate onDispose = utilities.makeHook(true);\n\tprivate onStart = utilities.makeHook();\n\tprivate onRestart = utilities.makeHook();\n\tprivate started = false;\n\toptions: UserOptions<M>;\n\tcontainer: Container;\n\n\tconstructor(options: UserOptions<M>, modules?: M) {\n\t\tthis.container = new Container();\n\t\tthis.options = options;\n\t\tconst bind = (Class: typeof BaseModule) => {\n\t\t\tthis.container.bind({\n\t\t\t\tprovide: Class,\n\t\t\t\tuseFactory: () =>\n\t\t\t\t\tnew Class(\n\t\t\t\t\t\tthis.container,\n\t\t\t\t\t\tthis.options,\n\t\t\t\t\t\tthis.onStart,\n\t\t\t\t\t\tthis.onDispose,\n\t\t\t\t\t\tthis.onRestart,\n\t\t\t\t\t\tthis.augment,\n\t\t\t\t\t),\n\t\t\t});\n\t\t};\n\t\tthis.allModules = [\n\t\t\tDataManager,\n\t\t\tStyleManager,\n\t\t\tController,\n\t\t\tOverlayManager,\n\t\t\tInteractionHandler,\n\t\t\tRenderer,\n\t\t\t...(modules ?? []),\n\t\t];\n\t\tthis.allModules.forEach(bind);\n\t\tthis.allModules.forEach((Module) => {\n\t\t\tthis.container.get(Module);\n\t\t});\n\n\t\tconst loading = this.options.loading ?? 'normal';\n\t\tif (loading === 'normal') this.load();\n\t\telse if (loading === 'lazy') {\n\t\t\tthis.IO = new IntersectionObserver(this.onVisibilityCheck, {\n\t\t\t\troot: null,\n\t\t\t\trootMargin: '50px',\n\t\t\t\tthreshold: 0,\n\t\t\t});\n\t\t\tthis.IO.observe(this.options.container);\n\t\t}\n\t}\n\n\tprivate onVisibilityCheck = (entries: Array<IntersectionObserverEntry>) => {\n\t\tentries.forEach((entry) => {\n\t\t\tif (entry.isIntersecting) {\n\t\t\t\tthis.load();\n\t\t\t\tthis.IO?.disconnect();\n\t\t\t\tthis.IO = null;\n\t\t\t\treturn;\n\t\t\t}\n\t\t});\n\t};\n\n\tdeclare private _augmentSlot: unknown;\n\tprivate augment = (aug: GeneralObject) => {\n\t\tObject.entries(aug).forEach(([key, value]) => {\n\t\t\tthis[key as '_augmentSlot'] = value;\n\t\t});\n\t};\n\n\tload = (options?: { canvas?: JSONCanvas; attachmentDir?: string }) => {\n\t\tif (options) Object.assign(this.options, options);\n\t\tif (this.started) this.onRestart();\n\t\telse {\n\t\t\tthis.onStart();\n\t\t\tthis.started = true;\n\t\t}\n\t};\n\n\tdispose = () => {\n\t\tthis.IO?.disconnect();\n\t\tthis.IO = null;\n\t\tconst container = this.options.container;\n\t\twhile (container.firstChild) container.firstChild.remove();\n\t\tthis.onDispose();\n\t\tthis.container.unbindAll();\n\t};\n}\n\ntype JSONCanvasViewerType = new <M extends ModuleInputCtor = []>(\n\t...args: ConstructorParameters<typeof JSONCanvasViewer<M>>\n) => JSONCanvasViewer<M> & UserAugmentation<M>;\n\nexport type JSONCanvasViewerInterface<M extends ModuleInput = []> = JSONCanvasViewer<never> &\n\tUserAugmentation<M>;\n\nexport default JSONCanvasViewer as JSONCanvasViewerType;\n"],"names":["JSONCanvasViewer","allModules","IO","onDispose","utilities","makeHook","onStart","onRestart","started","options","container","constructor","modules","this","Container","DataManager","StyleManager","Controller","OverlayManager","InteractionHandler","Renderer","forEach","Class","bind","provide","useFactory","augment","Module","get","loading","load","IntersectionObserver","onVisibilityCheck","root","rootMargin","threshold","observe","entries","entry","isIntersecting","disconnect","aug","Object","key","value","assign","dispose","firstChild","remove","unbindAll"],"mappings":"+KAiBA,MAAMA,EACGC,WACAC,GAAkC,KAClCC,UAAYC,EAAUC,UAAS,GAC/BC,QAAUF,EAAUC,WACpBE,UAAYH,EAAUC,WACtBG,SAAU,EAClBC,QACAC,UAEA,WAAAC,CAAYF,EAAyBG,GACpCC,KAAKH,UAAY,IAAII,EACrBD,KAAKJ,QAAUA,EAefI,KAAKZ,WAAa,CACjBc,EACAC,EACAC,EACAC,EACAC,EACAC,KACIR,GAAW,IAEhBC,KAAKZ,WAAWoB,QAvBFC,IACbT,KAAKH,UAAUa,KAAK,CACnBC,QAASF,EACTG,WAAY,IACX,IAAIH,EACHT,KAAKH,UACLG,KAAKJ,QACLI,KAAKP,QACLO,KAAKV,UACLU,KAAKN,UACLM,KAAKa,aAcTb,KAAKZ,WAAWoB,QAASM,IACxBd,KAAKH,UAAUkB,IAAID,KAGpB,MAAME,EAAUhB,KAAKJ,QAAQoB,SAAW,SACxB,WAAZA,EAAsBhB,KAAKiB,OACV,SAAZD,IACRhB,KAAKX,GAAK,IAAI6B,qBAAqBlB,KAAKmB,kBAAmB,CAC1DC,KAAM,KACNC,WAAY,OACZC,UAAW,IAEZtB,KAAKX,GAAGkC,QAAQvB,KAAKJ,QAAQC,WAE/B,CAEQsB,kBAAqBK,IAC5BA,EAAQhB,QAASiB,IAChB,GAAIA,EAAMC,eAIT,OAHA1B,KAAKiB,OACLjB,KAAKX,IAAIsC,kBACT3B,KAAKX,GAAK,SAOLwB,QAAWe,IAClBC,OAAOL,QAAQI,GAAKpB,QAAQ,EAAEsB,EAAKC,MAClC/B,KAAK8B,GAAyBC,KAIhCd,KAAQrB,IACHA,GAASiC,OAAOG,OAAOhC,KAAKJ,QAASA,GACrCI,KAAKL,QAASK,KAAKN,aAEtBM,KAAKP,UACLO,KAAKL,SAAU,IAIjBsC,QAAU,KACTjC,KAAKX,IAAIsC,aACT3B,KAAKX,GAAK,KACV,MAAMQ,EAAYG,KAAKJ,QAAQC,UAC/B,KAAOA,EAAUqC,YAAYrC,EAAUqC,WAAWC,SAClDnC,KAAKV,YACLU,KAAKH,UAAUuC"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{toHslString as t,rgbToHsl as e,parseHex as s}from"@ahmedsemih/color-fns";import{dragPreset as a,zoomPreset as o,panPreset as i,Pointeract as r,Click as n,Drag as h,WheelPanZoom as c,PreventDefault as l,MultitouchPanZoom as d,Lubricator as p}from"pointeract";class u{constructor(t,e,s,a,o,i){this.container=t,this.augment=i,this.options=e,this.onStart=s.subscribe,this.onDispose=a.subscribe,this.onRestart=o.subscribe}onStart;onRestart;onDispose;options}const f={round:function(t,e){const s=10**e;return Math.round(t*s)/s},resizeCanvasForDPR:function(t,e,s){const a=window.devicePixelRatio??1,o=t.getContext("2d");if(!o)throw new Error("[JSONCanvasViewer] This error is unexpected, probably caused uncontrollable runtime errors. Please contact the developer and show how to reproduce.");t.width=Math.round(e*a),t.height=Math.round(s*a),o.setTransform(1,0,0,1,0,0),o.scale(a,a)},applyStyles:function(t,e){const s=document.createElement("style");s.innerHTML=e,t.appendChild(s)},drawRoundRect:function(t,e,s,a,o,i){t.beginPath(),t.moveTo(e+i,s),t.lineTo(e+a-i,s),t.quadraticCurveTo(e+a,s,e+a,s+i),t.lineTo(e+a,s+o-i),t.quadraticCurveTo(e+a,s+o,e+a-i,s+o),t.lineTo(e+i,s+o),t.quadraticCurveTo(e,s+o,e,s+o-i),t.lineTo(e,s+i),t.quadraticCurveTo(e,s,e+i,s),t.closePath()},getAnchorCoord:function(t,e){const s=t.x+t.width/2,a=t.y+t.height/2;switch(e){case"top":return{x:s,y:t.y};case"bottom":return{x:s,y:t.y+t.height};case"left":return{x:t.x,y:a};case"right":return{x:t.x+t.width,y:a};default:return{x:s,y:a}}},makeHook:function(t=!1){const e=(...s)=>{if(t){Array.from(e.subs).reverse().forEach(t=>{t(...s)})}else e.subs.forEach(t=>{t(...s)})};return e.subs=/* @__PURE__ */new Set,e.subscribe=t=>{e.subs.add(t)},e.unsubscribe=t=>{e.subs.delete(t)},e}},g=new Error("[JSONCanvasViewer] Resource hasn't been set up or has been disposed.");class m extends u{onToggleFullscreen=f.makeHook();data={canvasData:{nodes:[],edges:[]},nodeMap:{},edgeMap:{},canvasBaseDir:"./",nodeBounds:{maxX:0,maxY:0,minX:0,minY:0,width:0,height:0,centerX:0,centerY:0},offsetX:0,offsetY:0,scale:1,container:document.createElement("div")};constructor(...t){super(...t);const e=this.options.container;for(;e.firstElementChild;)e.firstElementChild.remove();e.innerHTML="";const s=this.options.noShadow??!1?e:e.attachShadow({mode:"open"});f.applyStyles(s,".full,.overlay-container .click-layer,.overlay-container .link-iframe,.overlay-container .audio{top:0;left:0;width:100%;height:100%;position:absolute}.flex-center,.overlay-container.markdown-content{display:flex;justify-content:center;align-items:center}.border-shadow-bg{background:var(--background-secondary);border:1px solid var(--border);box-shadow:var(--shadow)}.collapse-button{border-radius:8px;transition:transform .2s,background-color .2s}.collapse-button:hover{background-color:var(--border)}button{cursor:pointer;font-size:18px;height:32px;border:none;transition:var(--containerTransition);text-align:center;width:32px;padding:5px 0}button svg{width:100%;height:100%}.container{--contentTransition: color .2s, opacity .2s, text-shadow .2s, fill .2s;--containerTransition: background .2s, opacity .2s, box-shadow .2s, border .2s, filter .2s, backdrop-filter .2s;color:var(--text);fill:var(--text);stroke:var(--text);background-color:var(--background);position:relative;width:100%;height:100%;overflow:hidden}.container.numb,.container.numb *{pointer-events:none!important}.main-canvas{width:100%;height:100%;transform-origin:top left}.overlays{position:absolute;transform-origin:top left;will-change:transform}.overlay-container{position:absolute;box-sizing:border-box;border-radius:12px;overflow:hidden;-webkit-user-select:none;user-select:none;contain:strict;content-visibility:auto;box-shadow:var(--shadow);background-color:var(--overlay-card);transition:var(--containerTransition)}.overlay-container .overlay-border{box-sizing:border-box;pointer-events:none;position:absolute;color:var(--overlay-border);top:0;left:0;width:100%;height:100%;border-width:1px;border-style:solid;border-radius:12px;transition:var(--containerTransition)}.overlay-container.active{-webkit-user-select:auto;user-select:auto;pointer-events:auto}.overlay-container.active .overlay-border{border:4px solid var(--overlay-active)}.overlay-container .link-iframe,.overlay-container .audio{border:none;background:transparent}.overlay-container .click-layer{background:transparent;pointer-events:auto}.overlay-container.active .click-layer{pointer-events:none}.overlay-container img{width:100%;height:100%;object-fit:cover;pointer-events:none}.overlay-container.active img{pointer-events:auto}.overlay-container.markdown-content{position:absolute;padding:0 7px}.overlay-container.markdown-content.rtl{direction:rtl;text-align:right}.overlay-container .parsed-content-wrapper{font-family:sans-serif;box-sizing:border-box;max-width:100%;max-height:100%;padding:10px 6px;pointer-events:none;overflow:hidden;scrollbar-gutter:stable both-edges;display:flex;flex-direction:column;gap:12px}@supports not (scrollbar-gutter: stable both-edges){.overlay-container .parsed-content-wrapper{padding:10px}}.overlay-container.active .parsed-content-wrapper{overflow:auto}::-webkit-scrollbar{width:4px}::-webkit-scrollbar-track{background-color:transparent}::-webkit-scrollbar-thumb{border-radius:2px;background:#ffffff40}::-webkit-scrollbar-thumb:hover{background:#1e1e1ebf}p{font-size:16px;line-height:21px}.parsed-content-wrapper img{width:100%;border-radius:8px}h1{font-size:25px}h2{font-size:23px}h3{font-size:22px}h4{font-size:20px}h5{font-size:19px}h6{font-size:17px}p,h1,h2,h3,h4,h5,h6,ol,ul{margin:0}h1,h2{font-weight:800}h3,h4{font-weight:700}h5,h6{font-weight:600}code{background:#ffffff1a;padding:2px 4px;border-radius:8px}pre code{display:block;box-sizing:border-box;width:100%}pre:has(code),table{margin:6px 0}strong{color:#fe8e7c}em{color:#5affb2}a{text-decoration:none;color:#6dadd0;font-weight:800;font-style:italic;cursor:pointer;transition:var(--contentTransition)}a:hover{color:#86d3fd}hr{height:1px;width:100%;background-color:#fff3;border:none}li{margin:5px 0}ul{padding-left:16px}ol{padding-left:15px;padding-right:7.5px}table{border-collapse:collapse;border-radius:8px;overflow:hidden;width:100%}table th,table td{border:1px solid rgba(255,255,255,.2);padding:6px 10px;background:#ffffff0f;text-align:left}table th{background:#ffffff1f;font-weight:700}"+this.options.extraCSS),this.data.container.classList.add("container"),s.appendChild(this.data.container),this.augment({resetView:this.resetView,shiftFullscreen:this.shiftFullscreen}),this.onStart(this.start),this.onRestart(this.start),this.onDispose(this.dispose)}start=()=>{const t=Object.assign({nodes:[],edges:[]},this.options.canvas);Object.assign(this.data,{canvasData:t,nodeMap:{},edgeMap:{},canvasBaseDir:this.processBaseDir(this.options.attachmentDir),nodeBounds:this.calculateNodeBounds(t),offsetX:0,offsetY:0,scale:1}),this.data.canvasData.nodes.forEach(t=>{const e={ref:t,box:this.getNodeBox(t)};if(this.data.nodeMap[t.id]=e,"file"===t.type){const s=t.file.split("/").pop()??"";e.fileName=s,t.file.startsWith("http://")||t.file.startsWith("https://")||(t.file=this.data.canvasBaseDir+s)}}),this.data.canvasData.edges.forEach(t=>{this.data.edgeMap[t.id]={ref:t,box:this.getEdgeBox(t)}}),this.resetView()};processBaseDir=t=>{if(!t)return"./";const e=t?.slice(-1);return"/"===e?t:`${t}/`};getNodeBox=t=>({left:t.x,top:"file"===t.type||"group"===t.type?t.y-40:t.y,right:t.width+t.x,bottom:t.y+t.height});getEdgeBox=t=>{const e=this.data.nodeMap,s=e[t.fromNode].ref,a=e[t.toNode].ref,o=f.getAnchorCoord(s,t.fromSide),i=f.getAnchorCoord(a,t.toSide),r=Math.min(o.x,i.x),n=Math.min(o.y,i.y),h=Math.max(o.x,i.x),c=Math.max(o.y,i.y),l=h-r,d=c-n,p=Math.min(l,d),u=0===p?1:p,g=Math.max(l,d),m=10*Math.log2(g/u);return{left:r-m,top:n-m,right:h+m,bottom:c+m}};calculateNodeBounds(t){let e=1/0,s=1/0,a=-1/0,o=-1/0;t.nodes.forEach(t=>{e=Math.min(e,t.x),s=Math.min(s,t.y),a=Math.max(a,t.x+t.width),o=Math.max(o,t.y+t.height)});const i=a-e,r=o-s;return{minX:e,minY:s,maxX:a,maxY:o,width:i,height:r,centerX:e+i/2,centerY:s+r/2}}shiftFullscreen=async t=>{document.fullscreenElement||t&&"enter"!==t?!document.fullscreenElement||t&&"exit"!==t||(await document.exitFullscreen(),this.onToggleFullscreen(!1)):(await this.data.container.requestFullscreen(),this.onToggleFullscreen(!0))};resetView=()=>{const t=this.data.nodeBounds,e=this.data.container;if(!t||!e)return;const s=t.width+200,a=t.height+200,o=e.clientWidth,i=e.clientHeight,r=o/s,n=i/a,h=Math.round(1e3*Math.min(r,n))/1e3,c={scale:h,offsetX:o/2-t.centerX*h,offsetY:i/2-t.centerY*h};this.data.offsetX=c.offsetX,this.data.offsetY=c.offsetY,this.data.scale=c.scale};middleViewer=()=>{const t=this.data.container;return{x:t.clientWidth/2,y:t.clientHeight/2,width:t.clientWidth,height:t.clientHeight}};dispose=()=>this.data.container.remove()}const v={light:{0:{hue:0,saturation:0,lightness:72},1:{hue:358,saturation:81,lightness:55},2:{hue:19,saturation:87,lightness:58},3:{hue:41,saturation:79,lightness:52},4:{hue:150,saturation:100,lightness:37},5:{hue:221,saturation:100,lightness:59},6:{hue:257,saturation:81,lightness:62}},dark:{0:{hue:0,saturation:0,lightness:40},1:{hue:358,saturation:100,lightness:65},2:{hue:23,saturation:86,lightness:63},3:{hue:39,saturation:91,lightness:70},4:{hue:153,saturation:80,lightness:45},5:{hue:217,saturation:100,lightness:62},6:{hue:259,saturation:100,lightness:75}}},b={light:{dots:"hsla(0, 0%, 72%, 0.4)",text:"rgb(30, 30, 30)",background:"rgb(250, 250, 250)","background-secondary":"rgb(255, 255, 255)",shadow:"0px 0px 8px rgb(0, 0, 0, 0.1)",border:"hsla(0, 0%, 82%, 0.7)"},dark:{dots:"hsla(0, 0%, 40%, 0.3)",text:"rgb(242, 242, 242)",background:"rgb(30, 30, 30)","background-secondary":"rgb(37, 37, 40)",shadow:"0px 0px 8px rgb(0, 0, 0, 0.2)",border:"hsla(0, 0%, 30%, 0.7)"}};class y extends u{theme="light";onChangeTheme=f.makeHook();colorCache={dark:{},light:{}};constructor(...t){super(...t),this.changeTheme(this.options.theme??"light"),this.augment({changeTheme:this.changeTheme})}hslProcessor=e=>{const{hue:s,saturation:a,lightness:o}=e;let i;return i="dark"===this.theme?{active:e,card:{hue:s,saturation:a/3,lightness:o/3},border:{...e,alpha:.7},background:{...e,alpha:.1},text:e.lightness>=70?"rgb(30, 30, 30)":"rgb(242, 242, 242)"}:{active:e,card:0===s?{hue:s,saturation:a,lightness:100}:{hue:s,saturation:.4*a,lightness:90},border:{...e,alpha:.7},background:{...e,alpha:.1},text:e.lightness>=70?"rgb(30, 30, 30)":"rgb(242, 242, 242)"},{active:t(i.active),card:t(i.card),border:t(i.border),background:t(i.background),text:i.text}};getColor=(t="0")=>{const a=this.theme;let o;return this.colorCache[a][t]?this.colorCache[a][t]:(o=t in v[a]?this.hslProcessor(v[a][t]):this.hslProcessor(e(s(t))),this.colorCache[a][t]=o,o)};getNamedColor=t=>b[this.theme][t];changeTheme=t=>{this.theme=t||("dark"===this.theme?"light":"dark");const e=this.container.get(m).data.container;Object.entries(b[this.theme]).forEach(([t,s])=>{e.style.setProperty(`--${t}`,s)}),this.onChangeTheme(this.theme)}}class x extends u{animationId=null;resizeAnimationId=null;DM;SM;resizeObserver;perFrame={lastScale:1,lastOffsets:{x:0,y:0}};lastResizeCenter={x:null,y:null};hooks={onResize:f.makeHook(),onRefresh:f.makeHook()};constructor(...t){super(...t),this.DM=this.container.get(m),this.SM=this.container.get(y),this.resizeObserver=new ResizeObserver(this.onResize),this.SM.onChangeTheme.subscribe(this.refresh),this.augment({refresh:this.refresh}),this.onStart(this.start),this.onRestart(this.refresh),this.onDispose(this.dispose)}start=()=>{this.resizeObserver.observe(this.DM.data.container),this.animationId=requestAnimationFrame(this.draw)};draw=()=>{this.perFrame.lastScale===this.DM.data.scale&&this.perFrame.lastOffsets.x===this.DM.data.offsetX&&this.perFrame.lastOffsets.y===this.DM.data.offsetY||this.refresh(),this.animationId=requestAnimationFrame(this.draw)};refresh=()=>{this.perFrame={lastScale:this.DM.data.scale,lastOffsets:{x:this.DM.data.offsetX,y:this.DM.data.offsetY}},this.hooks.onRefresh()};onResize=()=>{this.resizeAnimationId=requestAnimationFrame(()=>{const t=this.DM.middleViewer();this.lastResizeCenter.x&&this.lastResizeCenter.y&&(this.DM.data.offsetX=this.DM.data.offsetX+t.x-this.lastResizeCenter.x,this.DM.data.offsetY=this.DM.data.offsetY+t.y-this.lastResizeCenter.y),this.lastResizeCenter.x=t.x,this.lastResizeCenter.y=t.y,this.hooks.onResize(t.width,t.height),this.refresh()})};dispose=()=>{this.animationId&&cancelAnimationFrame(this.animationId),this.resizeAnimationId&&cancelAnimationFrame(this.resizeAnimationId),this.resizeObserver.disconnect()}}class w extends u{_overlaysLayer=document.createElement("div");overlays={};selectedId=null;eventListeners={};DM;SM;parse;get overlaysLayer(){if(!this._overlaysLayer)throw g;return this._overlaysLayer}hooks={onInteractionStart:f.makeHook(),onInteractionEnd:f.makeHook()};constructor(...t){super(...t),this.parse=this.options.markdownParser||(t=>t),this.DM=this.container.get(m),this.SM=this.container.get(y);this.container.get(x).hooks.onRefresh.subscribe(this.updateOverlays),this.SM.onChangeTheme.subscribe(this.themeChanged),this._overlaysLayer=document.createElement("div"),this._overlaysLayer.className="overlays",this._overlaysLayer.id="overlays",this.DM.data.container.appendChild(this.overlaysLayer),this.onStart(this.start),this.onRestart(this.restart),this.onDispose(this.dispose)}start=()=>{this.container.get(k).onClick.subscribe(this.select),this.renderOverlays()};restart=()=>{this.clearOverlays(),this.renderOverlays()};renderOverlays=()=>{const t=async t=>{switch(t.type){case"text":await this.createOverlay(t,t.text,"text");break;case"file":t.file.match(/\.md$/i)?await this.loadMarkdownForNode(t):t.file.match(/\.(png|jpg|jpeg|gif|svg|webp)$/i)?await this.createOverlay(t,t.file,"image"):t.file.match(/\.(mp3|wav)$/i)&&await this.createOverlay(t,t.file,"audio");break;case"link":await this.createOverlay(t,t.url,"link")}};Object.values(this.DM.data.nodeMap).forEach(async e=>{await t(e.ref)})};themeChanged=()=>{Object.values(this.overlays).forEach(t=>{const e=this.DM.data.nodeMap[t.id].ref,s=this.SM.getColor(e.color);this.setOverlayColor(t,s)})};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;await this.createOverlay(t,"Loading...","text");try{const s=await fetch(t.file),a=await s.text(),o=a.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);e=o?await this.parse(o[2]):await this.parse(a)}catch(s){console.error("[JSONCanvasViewer] Failed to load markdown:",s),e="Failed to load content."}this.updateOverlay(t,{content:e})};updateOverlays=()=>{const t=this.DM.data;this.overlaysLayer.style.transform=`translate(${t.offsetX}px, ${t.offsetY}px) scale(${t.scale})`};async createOverlay(t,e,s){let a=this.overlays[t.id];a||(a=await this.constructOverlay(t,e,s),this.overlaysLayer.appendChild(a),this.overlays[t.id]=a,a.style.left=`${t.x}px`,a.style.top=`${t.y}px`,a.style.width=`${t.width}px`,a.style.height=`${t.height}px`)}updateOverlay(t,e){const s=this.overlays[t.id];if(e.content){const t=s.getElementsByClassName("parsed-content-wrapper")[0];t&&(t.innerHTML=e.content)}e.color&&this.setOverlayColor(s,e.color)}async constructOverlay(t,e,s){const a=document.createElement("div");switch(a.classList.add("overlay-container"),a.id=t.id,this.setOverlayColor(a,this.SM.getColor(t.color)),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",a.appendChild(o);const i=()=>{t.id===this.selectedId&&this.hooks.onInteractionStart()},r=()=>{t.id===this.selectedId&&this.hooks.onInteractionEnd()};return a.addEventListener("pointerenter",i),a.addEventListener("pointerleave",r),a.addEventListener("touchstart",i),a.addEventListener("touchend",r),this.eventListeners[t.id]=[i,r],a}setOverlayColor=(t,e)=>{Object.entries(e).forEach(([e,s])=>{t.style.setProperty(`--overlay-${e}`,s)})};clearOverlays=()=>{Object.entries(this.overlays).forEach(([t,e])=>{if(this.eventListeners[t]){const s=this.eventListeners[t][0],a=this.eventListeners[t][1];if(!s||!a)throw g;e.removeEventListener("pointerenter",s),e.removeEventListener("pointerleave",a),e.removeEventListener("touchstart",s),e.removeEventListener("touchend",a),this.eventListeners[t][0]=null,this.eventListeners[t][1]=null}e.remove(),delete this.overlays[t]})};dispose=()=>{this.clearOverlays(),this.overlaysLayer.remove(),this._overlaysLayer=null}}class k extends u{pointeract;DM;onClick=f.makeHook();constructor(...t){super(...t),this.DM=this.container.get(m);const e=Object.assign(this.options.pointeract??{},{coordinateOutput:"relative",element:this.DM.data.container,lubricator:{pan:i,zoom:o,drag:a}});this.pointeract=new r(e,[n,h,c,l,d,p]);const s=this.container.get(w);s.hooks.onInteractionStart.subscribe(this.pointeract.stop),s.hooks.onInteractionEnd.subscribe(this.pointeract.start),this.augment({pan:this.pan,panToCoords:this.panToCoords,zoom:this.zoom,zoomToScale:this.zoomToScale}),this.onStart(this.start),this.onDispose(this.dispose)}start=()=>{this.pointeract.on("pan",this.onPan).on("drag",this.onPan).on("zoom",this.onZoom).on("trueClick",this.onTrueClick).start()};onPan=t=>{this.truePan({x:t.deltaX,y:t.deltaY})};onZoom=t=>{this.trueZoom(t.factor,t)};trueZoom=(t,e)=>{const s=Math.max(Math.min(this.DM.data.scale*t,20),.05);if(s===this.DM.data.scale)return;const a=s/this.DM.data.scale,o=this.C2C(e);this.DM.data.offsetX=e.x-o.x*a,this.DM.data.offsetY=e.y-o.y*a,this.DM.data.scale=s};truePan=({x:t,y:e})=>{this.DM.data.offsetX=this.DM.data.offsetX+t,this.DM.data.offsetY=this.DM.data.offsetY+e};zoom=(t,e)=>{this.pointeract.dispatch("zoom",{factor:t,...e})};pan=({x:t,y:e})=>{this.pointeract.dispatch("pan",{deltaX:t,deltaY:e})};zoomToScale=(t,e)=>{const s=t/this.DM.data.scale;this.pointeract.dispatch("zoom",{factor:s,...e})};panToCoords=({x:t,y:e})=>{this.pointeract.dispatch("pan",{deltaX:t-this.DM.data.offsetX,deltaY:e-this.DM.data.offsetY})};C2C=({x:t,y:e})=>({x:t-this.DM.data.offsetX,y:e-this.DM.data.offsetY});onTrueClick=t=>{const e=t.target;if(this.isUIControl(e))return;const s=this.findNodeId(e);this.onClick(s)};isUIControl=t=>!!t&&(t.closest(".controls")||t.closest("button")||t.closest("input"));findNodeId=t=>{if(!t)return null;let e=t;for(;(!e.id||""===e.id)&&e.parentElement;)e=e.parentElement;return"overlays"!==e.id&&e.id&&""!==e.id?e.id:null};dispose=()=>this.pointeract.dispose()}export{u as B,x as C,m as D,k as I,w as O,y as S,g as d,f as u};
|
|
2
|
-
//# sourceMappingURL=interactionHandler-CrVH9u7P.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"interactionHandler-CrVH9u7P.js","sources":["../src/core/baseModule.ts","../src/core/utilities.ts","../src/core/dataManager.ts","../src/core/styleManager.ts","../src/core/controller.ts","../src/core/overlayManager.ts","../src/core/interactionHandler.ts"],"sourcesContent":["// oxlint-disable typescript/no-explicit-any\nimport type { BaseOptions, GeneralObject } from '$/declarations';\nimport type utilities from '$/utilities';\nimport type { Container } from '@needle-di/core';\n\ntype Hook = ReturnType<typeof utilities.makeHook>;\n\nexport type BaseArgs = [Container, GeneralObject, Hook, Hook, Hook, (aug: GeneralObject) => void];\n\nexport type GeneralModule = BaseModule<any, any>;\nexport type GeneralModuleCtor = typeof BaseModule<any, any>;\n\nexport class BaseModule<O extends BaseOptions = BaseOptions, A extends {} = {}> {\n\tdeclare private static readonly _BaseModuleBrand: unique symbol; // Nominal marker\n\tdeclare _Augmentation: A;\n\tonStart: Hook['subscribe'];\n\tonRestart: Hook['subscribe'];\n\tonDispose: Hook['subscribe'];\n\tconstructor(\n\t\tprotected container: Container,\n\t\toptions: GeneralObject,\n\t\tonStart: Hook,\n\t\tonDispose: Hook,\n\t\tonRestart: Hook,\n\t\tprotected augment: (aug: A) => void,\n\t) {\n\t\tthis.options = options as O;\n\t\tthis.onStart = onStart.subscribe;\n\t\tthis.onDispose = onDispose.subscribe;\n\t\tthis.onRestart = onRestart.subscribe;\n\t}\n\toptions: O;\n}\n","import type { GeneralArguments } from '$/declarations';\n\nexport default {\n\tround,\n\tresizeCanvasForDPR,\n\tapplyStyles,\n\tdrawRoundRect,\n\tgetAnchorCoord,\n\tmakeHook,\n};\n\nexport const destroyError = new Error(\n\t\"[JSONCanvasViewer] Resource hasn't been set up or has been disposed.\",\n);\n\nfunction applyStyles(container: HTMLElement | ShadowRoot, styleString: string) {\n\tconst style = document.createElement('style');\n\tstyle.innerHTML = styleString;\n\tcontainer.appendChild(style);\n}\n\nfunction drawRoundRect(\n\tctx: CanvasRenderingContext2D,\n\tx: number,\n\ty: number,\n\twidth: number,\n\theight: number,\n\tradius: number,\n) {\n\tctx.beginPath();\n\tctx.moveTo(x + radius, y);\n\tctx.lineTo(x + width - radius, y);\n\tctx.quadraticCurveTo(x + width, y, x + width, y + radius);\n\tctx.lineTo(x + width, y + height - radius);\n\tctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);\n\tctx.lineTo(x + radius, y + height);\n\tctx.quadraticCurveTo(x, y + height, x, y + height - radius);\n\tctx.lineTo(x, y + radius);\n\tctx.quadraticCurveTo(x, y, x + radius, y);\n\tctx.closePath();\n}\n\nfunction getAnchorCoord(node: JSONCanvasNode, side: 'top' | 'bottom' | 'left' | 'right') {\n\tconst midX = node.x + node.width / 2;\n\tconst midY = node.y + node.height / 2;\n\tswitch (side) {\n\t\tcase 'top':\n\t\t\treturn { x: midX, y: node.y };\n\t\tcase 'bottom':\n\t\t\treturn { x: midX, y: node.y + node.height };\n\t\tcase 'left':\n\t\t\treturn { x: node.x, y: midY };\n\t\tcase 'right':\n\t\t\treturn { x: node.x + node.width, y: midY };\n\t\tdefault:\n\t\t\treturn { x: midX, y: midY };\n\t}\n}\n\nfunction resizeCanvasForDPR(canvas: HTMLCanvasElement, width: number, height: number) {\n\tconst dpr = window.devicePixelRatio ?? 1;\n\tconst ctx = canvas.getContext('2d');\n\tif (!ctx)\n\t\tthrow new Error(\n\t\t\t'[JSONCanvasViewer] This error is unexpected, probably caused uncontrollable runtime errors. Please contact the developer and show how to reproduce.',\n\t\t);\n\tcanvas.width = Math.round(width * dpr);\n\tcanvas.height = Math.round(height * dpr);\n\tctx.setTransform(1, 0, 0, 1, 0, 0);\n\tctx.scale(dpr, dpr);\n}\n\nfunction round(roundedNum: number, digits: number) {\n\tconst factor = 10 ** digits;\n\treturn Math.round(roundedNum * factor) / factor;\n}\n\nfunction makeHook<Args extends GeneralArguments = []>(reverse: boolean = false) {\n\ttype MatchingFunc = (...args: Args) => unknown;\n\ttype Hook = {\n\t\t(...args: Args): void;\n\t\tsubs: Set<MatchingFunc>;\n\t\tsubscribe(callback: MatchingFunc): void;\n\t\tunsubscribe(callback: MatchingFunc): void;\n\t};\n\tconst result: Hook = (...args: Args) => {\n\t\tif (reverse) {\n\t\t\tconst items = Array.from(result.subs).reverse();\n\t\t\titems.forEach((callback) => {\n\t\t\t\tcallback(...args);\n\t\t\t});\n\t\t} else\n\t\t\tresult.subs.forEach((callback) => {\n\t\t\t\tcallback(...args);\n\t\t\t});\n\t};\n\tresult.subs = new Set();\n\tresult.subscribe = (callback: MatchingFunc) => {\n\t\tresult.subs.add(callback);\n\t};\n\tresult.unsubscribe = (callback: MatchingFunc) => {\n\t\tresult.subs.delete(callback);\n\t};\n\treturn result;\n}\n","import { type BaseArgs, BaseModule } from '$/baseModule';\nimport type { BaseOptions, Box, NodeBounds } from '$/declarations';\nimport style from '$/styles.scss?inline';\nimport utilities from '$/utilities';\n\nconst INITIAL_VIEWPORT_PADDING = 100;\nconst NODE_LABEL_MARGIN = 40;\nconst EDGE_BOX_HEURISTICS_BASE_MARGIN = 10;\n\ninterface Options extends BaseOptions {\n\tnoShadow?: boolean;\n\tcanvas?: JSONCanvas;\n\tattachmentDir?: string;\n\textraCSS?: string;\n}\n\ninterface Augmentation {\n\tresetView: DataManager['resetView'];\n\tshiftFullscreen: DataManager['shiftFullscreen'];\n}\n\nexport interface NodeItem {\n\tref: JSONCanvasNode;\n\tbox: Box;\n\tfileName?: string;\n}\n\nexport interface EdgeItem {\n\tref: JSONCanvasEdge;\n\tbox: Box;\n\tcontrolPoints?: Array<number>;\n}\n\ntype NodeMap = Record<string, NodeItem>;\ntype EdgeMap = Record<string, EdgeItem>;\n\nexport default class DataManager extends BaseModule<Options, Augmentation> {\n\tonToggleFullscreen = utilities.makeHook<[boolean]>();\n\n\tdata: {\n\t\tcanvasData: Required<JSONCanvas>;\n\t\tnodeMap: NodeMap;\n\t\tedgeMap: EdgeMap;\n\t\tcanvasBaseDir: string;\n\t\tnodeBounds: NodeBounds;\n\t\toffsetX: number;\n\t\toffsetY: number;\n\t\tscale: number;\n\t\tcontainer: HTMLDivElement;\n\t} = {\n\t\tcanvasData: {\n\t\t\tnodes: [],\n\t\t\tedges: [],\n\t\t},\n\t\tnodeMap: {},\n\t\tedgeMap: {},\n\t\tcanvasBaseDir: './',\n\t\tnodeBounds: {\n\t\t\tmaxX: 0,\n\t\t\tmaxY: 0,\n\t\t\tminX: 0,\n\t\t\tminY: 0,\n\t\t\twidth: 0,\n\t\t\theight: 0,\n\t\t\tcenterX: 0,\n\t\t\tcenterY: 0,\n\t\t},\n\t\toffsetX: 0,\n\t\toffsetY: 0,\n\t\tscale: 1,\n\t\tcontainer: document.createElement('div'),\n\t};\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tconst viewerContainer = this.options.container;\n\t\twhile (viewerContainer.firstElementChild) viewerContainer.firstElementChild.remove();\n\t\tviewerContainer.innerHTML = '';\n\n\t\tconst noShadow = this.options.noShadow ?? false;\n\t\tconst realContainer = noShadow\n\t\t\t? viewerContainer\n\t\t\t: viewerContainer.attachShadow({ mode: 'open' });\n\n\t\tutilities.applyStyles(realContainer, style + this.options.extraCSS);\n\n\t\tthis.data.container.classList.add('container');\n\t\trealContainer.appendChild(this.data.container);\n\n\t\tthis.augment({\n\t\t\tresetView: this.resetView,\n\t\t\tshiftFullscreen: this.shiftFullscreen,\n\t\t});\n\t\tthis.onStart(this.start);\n\t\tthis.onRestart(this.start);\n\t\tthis.onDispose(this.dispose);\n\t}\n\n\tprivate start = () => {\n\t\tconst canvasData = Object.assign(\n\t\t\t{\n\t\t\t\tnodes: [],\n\t\t\t\tedges: [],\n\t\t\t},\n\t\t\tthis.options.canvas,\n\t\t);\n\n\t\tObject.assign(this.data, {\n\t\t\tcanvasData: canvasData,\n\t\t\tnodeMap: {},\n\t\t\tedgeMap: {},\n\t\t\tcanvasBaseDir: this.processBaseDir(this.options.attachmentDir),\n\t\t\tnodeBounds: this.calculateNodeBounds(canvasData),\n\t\t\toffsetX: 0,\n\t\t\toffsetY: 0,\n\t\t\tscale: 1,\n\t\t});\n\n\t\tthis.data.canvasData.nodes.forEach((node) => {\n\t\t\tconst item: NodeItem = {\n\t\t\t\tref: node,\n\t\t\t\tbox: this.getNodeBox(node),\n\t\t\t};\n\t\t\tthis.data.nodeMap[node.id] = item;\n\t\t\tif (node.type === 'file') {\n\t\t\t\tconst path = node.file.split('/');\n\t\t\t\tconst fileName = path.pop() ?? '';\n\t\t\t\titem.fileName = fileName;\n\t\t\t\tif (!node.file.startsWith('http://') && !node.file.startsWith('https://'))\n\t\t\t\t\tnode.file = this.data.canvasBaseDir + fileName;\n\t\t\t}\n\t\t});\n\t\tthis.data.canvasData.edges.forEach((edge) => {\n\t\t\tthis.data.edgeMap[edge.id] = {\n\t\t\t\tref: edge,\n\t\t\t\tbox: this.getEdgeBox(edge),\n\t\t\t};\n\t\t});\n\t\tthis.resetView();\n\t};\n\n\tprivate processBaseDir = (baseDir: string | undefined) => {\n\t\tif (!baseDir) return './';\n\t\tconst lastChar = baseDir?.slice(-1);\n\t\tif (lastChar === '/') return baseDir;\n\t\treturn `${baseDir}/`;\n\t};\n\n\tprivate getNodeBox = (node: JSONCanvasNode) => {\n\t\treturn {\n\t\t\tleft: node.x,\n\t\t\ttop:\n\t\t\t\tnode.type === 'file' || node.type === 'group' ? node.y - NODE_LABEL_MARGIN : node.y,\n\t\t\tright: node.width + node.x,\n\t\t\tbottom: node.y + node.height,\n\t\t};\n\t};\n\n\tprivate getEdgeBox = (edge: JSONCanvasEdge) => {\n\t\tconst nodes = this.data.nodeMap;\n\t\tconst from = nodes[edge.fromNode].ref;\n\t\tconst to = nodes[edge.toNode].ref;\n\t\tconst fromAnchor = utilities.getAnchorCoord(from, edge.fromSide);\n\t\tconst toAnchor = utilities.getAnchorCoord(to, edge.toSide);\n\t\tconst strictBox = {\n\t\t\tleft: Math.min(fromAnchor.x, toAnchor.x),\n\t\t\ttop: Math.min(fromAnchor.y, toAnchor.y),\n\t\t\tright: Math.max(fromAnchor.x, toAnchor.x),\n\t\t\tbottom: Math.max(fromAnchor.y, toAnchor.y),\n\t\t};\n\t\t// edge size heuristics\n\t\tconst width = strictBox.right - strictBox.left;\n\t\tconst height = strictBox.bottom - strictBox.top;\n\t\tconst _min = Math.min(width, height);\n\t\tconst min = _min === 0 ? 1 : _min;\n\t\tconst max = Math.max(width, height);\n\t\tconst edgeFactor = Math.log2(max / min);\n\t\tconst margin = edgeFactor * EDGE_BOX_HEURISTICS_BASE_MARGIN;\n\t\treturn {\n\t\t\tleft: strictBox.left - margin,\n\t\t\ttop: strictBox.top - margin,\n\t\t\tright: strictBox.right + margin,\n\t\t\tbottom: strictBox.bottom + margin,\n\t\t};\n\t};\n\n\tprivate calculateNodeBounds(canvasData: Required<JSONCanvas>) {\n\t\tlet minX = Infinity,\n\t\t\tminY = Infinity,\n\t\t\tmaxX = -Infinity,\n\t\t\tmaxY = -Infinity;\n\t\tcanvasData.nodes.forEach((node) => {\n\t\t\tminX = Math.min(minX, node.x);\n\t\t\tminY = Math.min(minY, node.y);\n\t\t\tmaxX = Math.max(maxX, node.x + node.width);\n\t\t\tmaxY = Math.max(maxY, node.y + node.height);\n\t\t});\n\t\tconst width = maxX - minX;\n\t\tconst height = maxY - minY;\n\t\tconst centerX = minX + width / 2;\n\t\tconst centerY = minY + height / 2;\n\t\treturn { minX, minY, maxX, maxY, width, height, centerX, centerY };\n\t}\n\tshiftFullscreen = async (option?: 'enter' | 'exit') => {\n\t\tif (!document.fullscreenElement && (!option || option === 'enter')) {\n\t\t\tawait this.data.container.requestFullscreen();\n\t\t\tthis.onToggleFullscreen(true);\n\t\t} else if (document.fullscreenElement && (!option || option === 'exit')) {\n\t\t\tawait document.exitFullscreen();\n\t\t\tthis.onToggleFullscreen(false);\n\t\t}\n\t};\n\tresetView = () => {\n\t\tconst bounds = this.data.nodeBounds;\n\t\tconst container = this.data.container;\n\t\tif (!bounds || !container) return;\n\t\tconst contentWidth = bounds.width + INITIAL_VIEWPORT_PADDING * 2;\n\t\tconst contentHeight = bounds.height + INITIAL_VIEWPORT_PADDING * 2;\n\t\t// Use logical dimensions for scaling calculations\n\t\tconst viewWidth = container.clientWidth;\n\t\tconst viewHeight = container.clientHeight;\n\t\tconst scaleX = viewWidth / contentWidth;\n\t\tconst scaleY = viewHeight / contentHeight;\n\t\tconst newScale = Math.round(Math.min(scaleX, scaleY) * 1000) / 1000;\n\t\tconst contentCenterX = bounds.centerX;\n\t\tconst contentCenterY = bounds.centerY;\n\t\tconst initialView = {\n\t\t\tscale: newScale,\n\t\t\toffsetX: viewWidth / 2 - contentCenterX * newScale,\n\t\t\toffsetY: viewHeight / 2 - contentCenterY * newScale,\n\t\t};\n\t\tthis.data.offsetX = initialView.offsetX;\n\t\tthis.data.offsetY = initialView.offsetY;\n\t\tthis.data.scale = initialView.scale;\n\t};\n\n\tmiddleViewer = () => {\n\t\tconst container = this.data.container;\n\t\treturn {\n\t\t\tx: container.clientWidth / 2,\n\t\t\ty: container.clientHeight / 2,\n\t\t\twidth: container.clientWidth,\n\t\t\theight: container.clientHeight,\n\t\t};\n\t};\n\n\tprivate dispose = () => this.data.container.remove();\n}\n","import { BaseModule, type BaseArgs } from '$/baseModule';\nimport DataManager from '$/dataManager';\nimport type { BaseOptions } from '$/declarations';\nimport utilities from '$/utilities';\nimport { parseHex, toHslString, type HslColor, rgbToHsl } from '@ahmedsemih/color-fns';\n\nexport type Color = {\n\tborder: string;\n\tbackground: string;\n\tactive: string;\n\ttext: string;\n\tcard: string;\n};\n\ninterface Options extends BaseOptions {\n\ttheme?: 'dark' | 'light';\n}\n\ninterface Augmentation {\n\tchangeTheme: StyleManager['changeTheme'];\n}\n\nconst definedColors = {\n\tlight: {\n\t\t'0': { hue: 0, saturation: 0, lightness: 72 },\n\t\t'1': { hue: 358, saturation: 81, lightness: 55 },\n\t\t'2': { hue: 19, saturation: 87, lightness: 58 },\n\t\t'3': { hue: 41, saturation: 79, lightness: 52 },\n\t\t'4': { hue: 150, saturation: 100, lightness: 37 },\n\t\t'5': { hue: 221, saturation: 100, lightness: 59 },\n\t\t'6': { hue: 257, saturation: 81, lightness: 62 },\n\t},\n\tdark: {\n\t\t'0': { hue: 0, saturation: 0, lightness: 40 },\n\t\t'1': { hue: 358, saturation: 100, lightness: 65 },\n\t\t'2': { hue: 23, saturation: 86, lightness: 63 },\n\t\t'3': { hue: 39, saturation: 91, lightness: 70 },\n\t\t'4': { hue: 153, saturation: 80, lightness: 45 },\n\t\t'5': { hue: 217, saturation: 100, lightness: 62 },\n\t\t'6': { hue: 259, saturation: 100, lightness: 75 },\n\t},\n};\n\nconst namedColors = {\n\tlight: {\n\t\tdots: 'hsla(0, 0%, 72%, 0.4)',\n\t\ttext: 'rgb(30, 30, 30)',\n\t\tbackground: 'rgb(250, 250, 250)',\n\t\t'background-secondary': 'rgb(255, 255, 255)',\n\t\tshadow: '0px 0px 8px rgb(0, 0, 0, 0.1)',\n\t\tborder: 'hsla(0, 0%, 82%, 0.7)',\n\t},\n\tdark: {\n\t\tdots: 'hsla(0, 0%, 40%, 0.3)',\n\t\ttext: 'rgb(242, 242, 242)',\n\t\tbackground: 'rgb(30, 30, 30)',\n\t\t'background-secondary': 'rgb(37, 37, 40)',\n\t\tshadow: '0px 0px 8px rgb(0, 0, 0, 0.2)',\n\t\tborder: 'hsla(0, 0%, 30%, 0.7)',\n\t},\n};\n\nexport default class StyleManager extends BaseModule<Options, Augmentation> {\n\ttheme: 'dark' | 'light' = 'light';\n\tonChangeTheme = utilities.makeHook<['light' | 'dark']>();\n\n\tprivate colorCache: {\n\t\tdark: {\n\t\t\t[key: string]: Color;\n\t\t};\n\t\tlight: {\n\t\t\t[key: string]: Color;\n\t\t};\n\t} = {\n\t\tdark: {},\n\t\tlight: {},\n\t};\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tthis.changeTheme(this.options.theme ?? 'light');\n\t\tthis.augment({ changeTheme: this.changeTheme });\n\t}\n\n\tprivate hslProcessor = (color: HslColor) => {\n\t\tconst { hue, saturation, lightness } = color;\n\t\tlet result;\n\t\tif (this.theme === 'dark') {\n\t\t\tresult = {\n\t\t\t\tactive: color,\n\t\t\t\tcard: { hue, saturation: saturation / 3, lightness: lightness / 3 },\n\t\t\t\tborder: { ...color, alpha: 0.7 },\n\t\t\t\tbackground: { ...color, alpha: 0.1 },\n\t\t\t\ttext: color.lightness >= 70 ? 'rgb(30, 30, 30)' : 'rgb(242, 242, 242)',\n\t\t\t};\n\t\t} else {\n\t\t\tresult = {\n\t\t\t\tactive: color,\n\t\t\t\tcard:\n\t\t\t\t\thue === 0\n\t\t\t\t\t\t? { hue, saturation, lightness: 100 }\n\t\t\t\t\t\t: { hue, saturation: saturation * 0.4, lightness: 90 },\n\t\t\t\tborder: { ...color, alpha: 0.7 },\n\t\t\t\tbackground: { ...color, alpha: 0.1 },\n\t\t\t\ttext: color.lightness >= 70 ? 'rgb(30, 30, 30)' : 'rgb(242, 242, 242)',\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tactive: toHslString(result.active),\n\t\t\tcard: toHslString(result.card),\n\t\t\tborder: toHslString(result.border),\n\t\t\tbackground: toHslString(result.background),\n\t\t\ttext: result.text,\n\t\t};\n\t};\n\n\tgetColor = (colorIndex: string = '0') => {\n\t\tconst theme = this.theme;\n\t\tlet color: Color;\n\t\tif (this.colorCache[theme][colorIndex]) return this.colorCache[theme][colorIndex];\n\t\telse if (colorIndex in definedColors[theme])\n\t\t\tcolor = this.hslProcessor(\n\t\t\t\tdefinedColors[theme][colorIndex as keyof typeof definedColors.dark],\n\t\t\t);\n\t\telse color = this.hslProcessor(rgbToHsl(parseHex(colorIndex)));\n\t\tthis.colorCache[theme][colorIndex] = color;\n\t\treturn color;\n\t};\n\n\tgetNamedColor = (name: keyof typeof namedColors.dark) => namedColors[this.theme][name];\n\n\tchangeTheme = (theme?: 'dark' | 'light') => {\n\t\tthis.theme = theme ? theme : this.theme === 'dark' ? 'light' : 'dark';\n\t\tconst container = this.container.get(DataManager).data.container;\n\t\tObject.entries(namedColors[this.theme]).forEach(([key, value]) => {\n\t\t\tcontainer.style.setProperty(`--${key}`, value);\n\t\t});\n\t\tthis.onChangeTheme(this.theme);\n\t};\n}\n","import { type BaseArgs, BaseModule } from '$/baseModule';\nimport DataManager from '$/dataManager';\nimport type { BaseOptions } from '$/declarations';\nimport StyleManager from '$/styleManager';\nimport utilities from '$/utilities';\n\ninterface Augmentation {\n\trefresh: Controller['refresh'];\n}\n\nexport default class Controller extends BaseModule<BaseOptions, Augmentation> {\n\tprivate animationId: null | number = null;\n\tprivate resizeAnimationId: null | number = null;\n\tprivate DM: DataManager;\n\tprivate SM: StyleManager;\n\tprivate resizeObserver: ResizeObserver;\n\tprivate perFrame: {\n\t\tlastScale: number;\n\t\tlastOffsets: { x: number; y: number };\n\t} = {\n\t\tlastScale: 1,\n\t\tlastOffsets: { x: 0, y: 0 },\n\t};\n\tprivate lastResizeCenter: {\n\t\tx: null | number;\n\t\ty: null | number;\n\t} = {\n\t\tx: null,\n\t\ty: null,\n\t};\n\n\thooks = {\n\t\tonResize: utilities.makeHook<[number, number]>(),\n\t\tonRefresh: utilities.makeHook(),\n\t};\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tthis.DM = this.container.get(DataManager);\n\t\tthis.SM = this.container.get(StyleManager);\n\t\tthis.resizeObserver = new ResizeObserver(this.onResize);\n\t\tthis.SM.onChangeTheme.subscribe(this.refresh);\n\t\tthis.augment({ refresh: this.refresh });\n\t\tthis.onStart(this.start);\n\t\tthis.onRestart(this.refresh);\n\t\tthis.onDispose(this.dispose);\n\t}\n\n\tprivate start = () => {\n\t\tthis.resizeObserver.observe(this.DM.data.container);\n\t\tthis.animationId = requestAnimationFrame(this.draw);\n\t};\n\n\tprivate draw = () => {\n\t\tif (\n\t\t\tthis.perFrame.lastScale !== this.DM.data.scale ||\n\t\t\tthis.perFrame.lastOffsets.x !== this.DM.data.offsetX ||\n\t\t\tthis.perFrame.lastOffsets.y !== this.DM.data.offsetY\n\t\t)\n\t\t\tthis.refresh();\n\t\tthis.animationId = requestAnimationFrame(this.draw);\n\t};\n\n\trefresh = () => {\n\t\tthis.perFrame = {\n\t\t\tlastScale: this.DM.data.scale,\n\t\t\tlastOffsets: { x: this.DM.data.offsetX, y: this.DM.data.offsetY },\n\t\t};\n\t\tthis.hooks.onRefresh();\n\t};\n\n\tprivate onResize = () => {\n\t\tthis.resizeAnimationId = requestAnimationFrame(() => {\n\t\t\tconst center = this.DM.middleViewer();\n\t\t\tif (this.lastResizeCenter.x && this.lastResizeCenter.y) {\n\t\t\t\tthis.DM.data.offsetX = this.DM.data.offsetX + center.x - this.lastResizeCenter.x;\n\t\t\t\tthis.DM.data.offsetY = this.DM.data.offsetY + center.y - this.lastResizeCenter.y;\n\t\t\t}\n\t\t\tthis.lastResizeCenter.x = center.x;\n\t\t\tthis.lastResizeCenter.y = center.y;\n\t\t\tthis.hooks.onResize(center.width, center.height);\n\t\t\tthis.refresh();\n\t\t});\n\t};\n\n\tprivate dispose = () => {\n\t\tif (this.animationId) cancelAnimationFrame(this.animationId);\n\t\tif (this.resizeAnimationId) cancelAnimationFrame(this.resizeAnimationId);\n\t\tthis.resizeObserver.disconnect();\n\t};\n}\n","import { type BaseArgs, BaseModule } from '$/baseModule';\nimport Controller from '$/controller';\nimport DataManager from '$/dataManager';\nimport type { BaseOptions, MarkdownParser } from '$/declarations';\nimport InteractionHandler from '$/interactionHandler';\nimport StyleManager, { type Color } from '$/styleManager';\nimport utilities, { destroyError } from '$/utilities';\n\ninterface Options extends BaseOptions {\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 type { BaseOptions, Coordinates } from '$/declarations';\nimport OverlayManager from '$/overlayManager';\nimport utilities from '$/utilities';\nimport {\n\tClick,\n\tDrag,\n\tMultitouchPanZoom,\n\tPointeract,\n\ttype Options as PointeractOptions,\n\tPreventDefault,\n\ttype Events,\n\tWheelPanZoom,\n\tLubricator,\n\tpanPreset as pan,\n\tzoomPreset as zoom,\n\tdragPreset as drag,\n\ttype PointeractInterface,\n} from 'pointeract';\n\ntype LoadedModules = [Click, Drag, WheelPanZoom, PreventDefault, MultitouchPanZoom, Lubricator];\n\ntype LoadedEvents = Events<LoadedModules>;\n\ninterface Options extends BaseOptions {\n\tpointeract?: PointeractOptions<LoadedModules>;\n}\n\ninterface Augmentation {\n\tpan: InteractionHandler['pan'];\n\tpanToCoords: InteractionHandler['panToCoords'];\n\tzoom: InteractionHandler['zoom'];\n\tzoomToScale: InteractionHandler['zoomToScale'];\n}\n\nexport default class InteractionHandler extends BaseModule<Options, Augmentation> {\n\tpointeract: PointeractInterface<LoadedModules>;\n\tprivate DM: DataManager;\n\tonClick = utilities.makeHook<[string | null]>();\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tthis.DM = this.container.get(DataManager);\n\t\tconst options = Object.assign(this.options.pointeract ?? {}, {\n\t\t\tcoordinateOutput: 'relative',\n\t\t\telement: this.DM.data.container,\n\t\t\tlubricator: { pan, zoom, drag },\n\t\t} satisfies PointeractOptions<LoadedModules>);\n\t\tthis.pointeract = new Pointeract(options, [\n\t\t\tClick,\n\t\t\tDrag,\n\t\t\tWheelPanZoom,\n\t\t\tPreventDefault,\n\t\t\tMultitouchPanZoom,\n\t\t\tLubricator,\n\t\t]);\n\t\tconst OM = this.container.get(OverlayManager);\n\t\tOM.hooks.onInteractionStart.subscribe(this.pointeract.stop);\n\t\tOM.hooks.onInteractionEnd.subscribe(this.pointeract.start);\n\n\t\tthis.augment({\n\t\t\tpan: this.pan,\n\t\t\tpanToCoords: this.panToCoords,\n\t\t\tzoom: this.zoom,\n\t\t\tzoomToScale: this.zoomToScale,\n\t\t});\n\t\tthis.onStart(this.start);\n\t\tthis.onDispose(this.dispose);\n\t}\n\n\tprivate start = () => {\n\t\tthis.pointeract\n\t\t\t.on('pan', this.onPan)\n\t\t\t.on('drag', this.onPan)\n\t\t\t.on('zoom', this.onZoom)\n\t\t\t.on('trueClick', this.onTrueClick)\n\t\t\t.start();\n\t};\n\n\tprivate onPan = (event: LoadedEvents['pan']) => {\n\t\tthis.truePan({\n\t\t\tx: event.deltaX,\n\t\t\ty: event.deltaY,\n\t\t});\n\t};\n\tprivate onZoom = (event: LoadedEvents['zoom']) => {\n\t\tthis.trueZoom(event.factor, event);\n\t};\n\n\ttrueZoom = (_factor: number, origin: Coordinates) => {\n\t\tconst newScale = Math.max(Math.min(this.DM.data.scale * _factor, 20), 0.05);\n\t\tconst scale = this.DM.data.scale;\n\t\tif (newScale === scale) return;\n\t\tconst factor = newScale / this.DM.data.scale;\n\t\tconst canvasCoords = this.C2C(origin);\n\t\tthis.DM.data.offsetX = origin.x - canvasCoords.x * factor;\n\t\tthis.DM.data.offsetY = origin.y - canvasCoords.y * factor;\n\t\tthis.DM.data.scale = newScale;\n\t};\n\ttruePan = ({ x, y }: Coordinates) => {\n\t\tthis.DM.data.offsetX = this.DM.data.offsetX + x;\n\t\tthis.DM.data.offsetY = this.DM.data.offsetY + y;\n\t};\n\n\tzoom = (_factor: number, origin: Coordinates) => {\n\t\tthis.pointeract.dispatch('zoom', { factor: _factor, ...origin });\n\t};\n\tpan = ({ x, y }: Coordinates) => {\n\t\tthis.pointeract.dispatch('pan', { deltaX: x, deltaY: y });\n\t};\n\tzoomToScale = (newScale: number, origin: Coordinates) => {\n\t\tconst factor = newScale / this.DM.data.scale;\n\t\tthis.pointeract.dispatch('zoom', { factor, ...origin });\n\t};\n\tpanToCoords = ({ x, y }: Coordinates) => {\n\t\tthis.pointeract.dispatch('pan', {\n\t\t\tdeltaX: x - this.DM.data.offsetX,\n\t\t\tdeltaY: y - this.DM.data.offsetY,\n\t\t});\n\t};\n\n\t// Container Coords to Canvas Coords relative to the top-left corner of the scaled canvas\n\tprivate C2C = ({ x: containerX, y: containerY }: Coordinates) => ({\n\t\tx: containerX - this.DM.data.offsetX,\n\t\ty: containerY - this.DM.data.offsetY,\n\t});\n\n\tprivate onTrueClick = (e: LoadedEvents['trueClick']) => {\n\t\tconst element = e.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 = () => this.pointeract.dispose();\n}\n"],"names":["BaseModule","constructor","container","options","onStart","onDispose","onRestart","augment","this","subscribe","utilities","round","roundedNum","digits","factor","Math","resizeCanvasForDPR","canvas","width","height","dpr","window","devicePixelRatio","ctx","getContext","Error","setTransform","scale","applyStyles","styleString","style","document","createElement","innerHTML","appendChild","drawRoundRect","x","y","radius","beginPath","moveTo","lineTo","quadraticCurveTo","closePath","getAnchorCoord","node","side","midX","midY","makeHook","reverse","result","args","Array","from","subs","forEach","callback","Set","add","unsubscribe","delete","destroyError","DataManager","onToggleFullscreen","data","canvasData","nodes","edges","nodeMap","edgeMap","canvasBaseDir","nodeBounds","maxX","maxY","minX","minY","centerX","centerY","offsetX","offsetY","super","viewerContainer","firstElementChild","remove","realContainer","noShadow","attachShadow","mode","extraCSS","classList","resetView","shiftFullscreen","start","dispose","Object","assign","processBaseDir","attachmentDir","calculateNodeBounds","item","ref","box","getNodeBox","id","type","fileName","file","split","pop","startsWith","edge","getEdgeBox","baseDir","lastChar","slice","left","top","right","bottom","fromNode","to","toNode","fromAnchor","fromSide","toAnchor","toSide","strictBox","min","max","_min","margin","log2","Infinity","async","option","fullscreenElement","exitFullscreen","requestFullscreen","bounds","contentWidth","INITIAL_VIEWPORT_PADDING","contentHeight","viewWidth","clientWidth","viewHeight","clientHeight","scaleX","scaleY","newScale","initialView","middleViewer","definedColors","light","hue","saturation","lightness","dark","namedColors","dots","text","background","shadow","border","StyleManager","theme","onChangeTheme","colorCache","changeTheme","hslProcessor","color","active","card","alpha","toHslString","getColor","colorIndex","rgbToHsl","parseHex","getNamedColor","name","get","entries","key","value","setProperty","Controller","animationId","resizeAnimationId","DM","SM","resizeObserver","perFrame","lastScale","lastOffsets","lastResizeCenter","hooks","onResize","onRefresh","ResizeObserver","refresh","observe","requestAnimationFrame","draw","center","cancelAnimationFrame","disconnect","OverlayManager","_overlaysLayer","overlays","selectedId","eventListeners","parse","overlaysLayer","onInteractionStart","onInteractionEnd","markdownParser","markdown","updateOverlays","themeChanged","className","restart","InteractionHandler","onClick","select","renderOverlays","clearOverlays","createOverlay","match","loadMarkdownForNode","url","values","overlay","setOverlayColor","previous","current","parsedContent","response","fetch","frontmatterMatch","err","console","error","updateOverlay","content","transform","element","constructOverlay","toUpdate","getElementsByClassName","parsedContentWrapper","iframe","src","sandbox","loading","audio","controls","img","clickLayer","overlayBorder","onEnd","addEventListener","removeEventListener","pointeract","coordinateOutput","lubricator","pan","zoom","drag","Pointeract","Click","Drag","WheelPanZoom","PreventDefault","MultitouchPanZoom","Lubricator","OM","stop","panToCoords","zoomToScale","on","onPan","onZoom","onTrueClick","event","truePan","deltaX","deltaY","trueZoom","_factor","origin","canvasCoords","C2C","dispatch","containerX","containerY","e","target","isUIControl","findNodeId","closest","ele","parentElement"],"mappings":"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"}
|
package/dist/modules.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{B as t,d as e,D as i,I as n,C as s,u as o,S as a}from"./interactionHandler-CrVH9u7P.js";const l='<svg viewBox="-5.28 -5.28 34.56 34.56" fill="none"><path d="M4 9V5.6c0-.56 0-.84.109-1.054a1 1 0 0 1 .437-.437C4.76 4 5.04 4 5.6 4H9M4 15v3.4c0 .56 0 .84.109 1.054a1 1 0 0 0 .437.437C4.76 20 5.04 20 5.6 20H9m6-16h3.4c.56 0 .84 0 1.054.109a1 1 0 0 1 .437.437C20 4.76 20 5.04 20 5.6V9m0 6v3.4c0 .56 0 .84-.109 1.054a1 1 0 0 1-.437.437C19.24 20 18.96 20 18.4 20H15" stroke-width="2.4" stroke-linecap="round"/></svg>';class r extends t{_controlsPanel=null;_toggleCollapseBtn=null;_toggleFullscreenBtn=null;_zoomOutBtn=null;_zoomSlider=null;_zoomInBtn=null;_resetViewBtn=null;DM;IH;collapsed;get controlsPanel(){if(null===this._controlsPanel)throw e;return this._controlsPanel}get toggleCollapseBtn(){if(null===this._toggleCollapseBtn)throw e;return this._toggleCollapseBtn}get toggleFullscreenBtn(){if(null===this._toggleFullscreenBtn)throw e;return this._toggleFullscreenBtn}get zoomOutBtn(){if(null===this._zoomOutBtn)throw e;return this._zoomOutBtn}get zoomSlider(){if(null===this._zoomSlider)throw e;return this._zoomSlider}get zoomInBtn(){if(null===this._zoomInBtn)throw e;return this._zoomInBtn}get resetViewBtn(){if(null===this._resetViewBtn)throw e;return this._resetViewBtn}constructor(...t){super(...t),this.collapsed=this.options.controlsCollapsed??!1,this.DM=this.container.get(i),this.IH=this.container.get(n),this.DM.onToggleFullscreen.subscribe(this.updateFullscreenBtn),this.container.get(s).hooks.onRefresh.subscribe(this.updateSlider),this._controlsPanel=document.createElement("div"),this._controlsPanel.className="controls",this._controlsPanel.classList.toggle("collapsed",this.collapsed),o.applyStyles(this._controlsPanel,".controls{position:absolute;top:10px;right:10px;display:flex;align-items:center;transition:transform .2s;border-radius:8px;gap:10px}.controls.collapsed{transform:translate(calc(100% - 32px))}.controls.collapsed .collapse-button{transform:rotate(180deg)}.controls .controls-content{display:flex;gap:1px;align-items:center;border-radius:8px;overflow:hidden;background:var(--border);box-shadow:var(--shadow);outline:1px solid var(--border)}.controls button{background-color:var(--background-secondary)}.controls button:hover{background:var(--border)}.zoom-slider{width:100px;margin:0 10px}"),this._toggleCollapseBtn=document.createElement("button"),this._toggleCollapseBtn.className="collapse-button border-shadow-bg",this._toggleCollapseBtn.innerHTML='<svg viewBox="-3.6 -3.6 31.2 31.2" stroke-width=".4"><path d="M15.707 4.293a1 1 0 0 1 0 1.414L9.414 12l6.293 6.293a1 1 0 0 1-1.414 1.414l-7-7a1 1 0 0 1 0-1.414l7-7a1 1 0 0 1 1.414 0Z" /></svg>',this._controlsPanel.appendChild(this._toggleCollapseBtn);const e=document.createElement("div");e.className="controls-content",this._toggleFullscreenBtn=document.createElement("button"),this._toggleFullscreenBtn.innerHTML=l,e.appendChild(this._toggleFullscreenBtn),this._zoomOutBtn=document.createElement("button"),this._zoomOutBtn.innerHTML='<svg viewBox="-1.2 -1.2 26.4 26.4"><path d="M6 12h12" stroke-width="2" stroke-linecap="round" /></svg>',e.appendChild(this._zoomOutBtn),this._zoomSlider=document.createElement("input"),this._zoomSlider.type="range",this._zoomSlider.className="zoom-slider",this._zoomSlider.min="-30",this._zoomSlider.max="30",this._zoomSlider.value="0",e.appendChild(this._zoomSlider),this._zoomInBtn=document.createElement("button"),this._zoomInBtn.innerHTML='<svg viewBox="-1.2 -1.2 26.4 26.4"><path d="M6 12h12m-6-6v12" stroke-width="2" stroke-linecap="round" /></svg>',e.appendChild(this._zoomInBtn),this._resetViewBtn=document.createElement("button"),this._resetViewBtn.innerHTML='<svg viewBox="-6 -6 30 30" stroke-width=".08"><path d="m14.955 7.986.116.01a1 1 0 0 1 .85 1.13 8 8 0 0 1-13.374 4.728l-.84.84c-.63.63-1.707.184-1.707-.707V10h3.987c.89 0 1.337 1.077.707 1.707l-.731.731a6 6 0 0 0 8.347-.264 6 6 0 0 0 1.63-3.33 1 1 0 0 1 1.131-.848zM11.514.813a8 8 0 0 1 1.942 1.336l.837-.837c.63-.63 1.707-.184 1.707.707V6h-3.981c-.89 0-1.337-1.077-.707-1.707l.728-.729a6 6 0 0 0-9.98 3.591 1 1 0 1 1-1.98-.281A8 8 0 0 1 11.514.813Z" /></svg>',e.appendChild(this._resetViewBtn),this._controlsPanel.appendChild(e),this.DM.data.container.appendChild(this._controlsPanel),this._toggleCollapseBtn.addEventListener("click",this.toggleCollapse),this._zoomInBtn.addEventListener("click",this.zoomIn),this._zoomOutBtn.addEventListener("click",this.zoomOut),this._zoomSlider.addEventListener("input",this.slide),this._resetViewBtn.addEventListener("click",this.DM.resetView),this._toggleFullscreenBtn.addEventListener("click",this.toggleFullscreen),this.augment({toggleControlsCollapse:this.toggleCollapse}),this.onDispose(this.dispose)}toggleCollapse=()=>{this.collapsed=!this.collapsed,this.controlsPanel.classList.toggle("collapsed",this.collapsed),this.collapsed||this.updateSlider()};zoomIn=()=>this.IH.zoom(1.3,this.DM.middleViewer());zoomOut=()=>this.IH.zoom(1/1.3,this.DM.middleViewer());slide=()=>this.IH.trueZoom(1.1**Number(this.zoomSlider.value)/this.DM.data.scale,this.DM.middleViewer());updateFullscreenBtn=t=>{this.toggleFullscreenBtn.innerHTML=t?'<svg viewBox="-40.32 -40.32 176.64 176.64"><path d="M30 60H6a6 6 0 0 0 0 12h18v18a6 6 0 0 0 12 0V66a5.997 5.997 0 0 0-6-6Zm60 0H66a5.997 5.997 0 0 0-6 6v24a6 6 0 0 0 12 0V72h18a6 6 0 0 0 0-12ZM66 36h24a6 6 0 0 0 0-12H72V6a6 6 0 0 0-12 0v24a5.997 5.997 0 0 0 6 6ZM30 0a5.997 5.997 0 0 0-6 6v18H6a6 6 0 0 0 0 12h24a5.997 5.997 0 0 0 6-6V6a5.997 5.997 0 0 0-6-6Z"/></svg>':l};toggleFullscreen=()=>this.DM.shiftFullscreen();updateSlider=()=>{this.collapsed||(this.zoomSlider.value=String(this.scaleToSlider(this.DM.data.scale)))};scaleToSlider=t=>Math.log(t)/Math.log(1.1);dispose=()=>{this.toggleCollapseBtn.removeEventListener("click",this.toggleCollapse),this.zoomInBtn.removeEventListener("click",this.zoomIn),this.zoomOutBtn.removeEventListener("click",this.zoomOut),this.zoomSlider.removeEventListener("input",this.slide),this.resetViewBtn.removeEventListener("click",this.DM.resetView),this.toggleFullscreenBtn.removeEventListener("click",this.toggleFullscreen),this.controlsPanel.remove(),this._controlsPanel=null,this._toggleCollapseBtn=null,this._zoomInBtn=null,this._zoomOutBtn=null,this._zoomSlider=null,this._resetViewBtn=null,this._toggleFullscreenBtn=null}}class h extends t{_debugPanel=null;DM;get debugPanel(){if(!this._debugPanel)throw e;return this._debugPanel}constructor(...t){super(...t),this.DM=this.container.get(i),this.container.get(s).hooks.onRefresh.subscribe(this.update),this._debugPanel=document.createElement("div"),this._debugPanel.className="debug-panel border-shadow-bg";const e=this.DM.data.container;o.applyStyles(e,".debug-panel{position:absolute;bottom:12px;left:12px;border-radius:12px;padding:12px;color:var(--text);font-size:calc(14px + .3vw);line-height:calc(17px + .3vw);pointer-events:none}"),e.appendChild(this._debugPanel),this.onDispose(this.dispose)}update=()=>{const t=o.round,e=this.DM.data;this.debugPanel.innerHTML=`<p>Scale: ${t(e.scale,3)}</p><p>Offset: ${t(e.offsetX,1)}, ${t(e.offsetY,1)}</p>`};dispose=()=>{this.debugPanel.remove(),this._debugPanel=null}}class p extends t{_minimapCtx=null;_viewportRectangle=null;_minimap=null;_minimapContainer=null;_toggleMinimapBtn=null;minimapCache={scale:1,centerX:0,centerY:0};DM;SM;collapsed;get minimap(){if(null===this._minimap)throw e;return this._minimap}get minimapCtx(){if(null===this._minimapCtx)throw e;return this._minimapCtx}get viewportRectangle(){if(null===this._viewportRectangle)throw e;return this._viewportRectangle}get minimapContainer(){if(null===this._minimapContainer)throw e;return this._minimapContainer}get toggleMinimapBtn(){if(null===this._toggleMinimapBtn)throw e;return this._toggleMinimapBtn}constructor(...t){super(...t),this.collapsed=this.options.minimapCollapsed??!1,this.container.get(s).hooks.onRefresh.subscribe(this.updateViewportRectangle),this.DM=this.container.get(i),this.SM=this.container.get(a),this._minimapContainer=document.createElement("div"),this._minimapContainer.className="minimap-container",o.applyStyles(this._minimapContainer,".minimap-container{position:absolute;bottom:10px;right:10px;display:flex;pointer-events:none;transition:transform .2s}.minimap-container.collapsed{transform:translate(calc(100% - 32px))}.toggle-minimap{margin:auto 10px 0 0;pointer-events:auto}.collapsed .toggle-minimap{transform:rotate(180deg)}.minimap{position:relative;pointer-events:none;width:200px;height:150px;overflow:hidden;border-radius:12px;transform-origin:0 0}.minimap .minimap-canvas{width:100%;height:100%}.minimap .viewport-rectangle{position:absolute;top:0;left:0;pointer-events:none;border-radius:6px;box-sizing:border-box;border:2px dashed var(--text)}@container (max-width: 768px){.container .minimap{transform:scale(.6)}.container .toggle-minimap{transform:translateY(-60px)}.collapsed .container .toggle-minimap{transform:translateY(-60px) rotate(180deg)}.container .minimap-container{transform:translateY(60px) translate(80px)}.container .minimap-container.collapsed{transform:translateY(60px) translate(calc(100% - 32px))}}"),this._toggleMinimapBtn=document.createElement("button"),this._toggleMinimapBtn.className="toggle-minimap collapse-button border-shadow-bg",this._toggleMinimapBtn.innerHTML='<svg viewBox="-3.6 -3.6 31.2 31.2" stroke-width=".4"><path d="M15.707 4.293a1 1 0 0 1 0 1.414L9.414 12l6.293 6.293a1 1 0 0 1-1.414 1.414l-7-7a1 1 0 0 1 0-1.414l7-7a1 1 0 0 1 1.414 0Z" /></svg>',this._minimapContainer.appendChild(this._toggleMinimapBtn),this._minimap=document.createElement("div"),this._minimap.className="minimap border-shadow-bg";const e=document.createElement("canvas");e.className="minimap-canvas",e.width=200,e.height=150,this._minimap.appendChild(e),this._minimapCtx=e.getContext("2d"),this._viewportRectangle=document.createElement("div"),this._viewportRectangle.className="viewport-rectangle",this._minimap.appendChild(this._viewportRectangle),this._minimapContainer.appendChild(this._minimap),this.DM.data.container.appendChild(this._minimapContainer),this._minimapContainer.classList.toggle("collapsed",this.collapsed),this._toggleMinimapBtn.addEventListener("click",this.toggleCollapse),o.resizeCanvasForDPR(e,e.width,e.height),this.augment({toggleMinimapCollapse:this.toggleCollapse}),this.onStart(this.start),this.onRestart(this.start),this.onDispose(this.dispose)}toggleCollapse=()=>{this.collapsed=!this.collapsed,this.minimapContainer.classList.toggle("collapsed",this.collapsed),this.collapsed||this.updateViewportRectangle()};start=()=>{const t=this.DM.data.nodeBounds;if(!t)return;const e=this.minimap.clientWidth,i=this.minimap.clientHeight,n=e/t.width,s=i/t.height;this.minimapCache.scale=.9*Math.min(n,s),this.minimapCache.centerX=e/2,this.minimapCache.centerY=i/2,this.minimapCtx.clearRect(0,0,e,i),this.minimapCtx.save(),this.minimapCtx.translate(this.minimapCache.centerX,this.minimapCache.centerY),this.minimapCtx.scale(this.minimapCache.scale,this.minimapCache.scale),this.minimapCtx.translate(-t.centerX,-t.centerY);const o=this.DM.data.canvasData;for(const a of o.edges)this.drawMinimapEdge(a);for(const a of o.nodes)this.drawMinimapNode(a);this.minimapCtx.restore()};drawMinimapNode=t=>{const e=this.SM.getColor(t.color);this.minimapCtx.fillStyle=e.border,o.drawRoundRect(this.minimapCtx,t.x,t.y,t.width,t.height,25),this.minimapCtx.fill()};drawMinimapEdge=t=>{const e=this.DM.data.nodeMap,i=e[t.fromNode].ref,n=e[t.toNode].ref;if(!i||!n)return;const{x:s,y:a}=o.getAnchorCoord(i,t.fromSide),{x:l,y:r}=o.getAnchorCoord(n,t.toSide);this.minimapCtx.beginPath(),this.minimapCtx.moveTo(s,a),this.minimapCtx.lineTo(l,r),this.minimapCtx.strokeStyle=this.SM.getColor(t.color).active,this.minimapCtx.lineWidth=10,this.minimapCtx.stroke()};updateViewportRectangle=()=>{if(this.collapsed)return;const t=this.DM.data.nodeBounds,e=this.DM.data.container,i=this.DM.data.scale;if(!t)return;const n=e.clientWidth/i,s=e.clientHeight/i,o=-this.DM.data.offsetX/i+e.clientWidth/(2*i),a=-this.DM.data.offsetY/i+e.clientHeight/(2*i),l=this.minimapCache.centerX+(o-n/2-t.centerX)*this.minimapCache.scale,r=this.minimapCache.centerY+(a-s/2-t.centerY)*this.minimapCache.scale,h=n*this.minimapCache.scale,p=s*this.minimapCache.scale;this.viewportRectangle.style.left=`${l}px`,this.viewportRectangle.style.top=`${r}px`,this.viewportRectangle.style.width=`${h}px`,this.viewportRectangle.style.height=`${p}px`};dispose=()=>{this.toggleMinimapBtn.removeEventListener("click",this.toggleCollapse),this.minimapCtx.clearRect(0,0,this.minimap.clientWidth,this.minimap.clientHeight),this.minimapContainer.remove(),this._minimapContainer=null,this._toggleMinimapBtn=null,this._viewportRectangle=null,this._minimap=null}}class c extends t{_preventionContainer=null;preventMt=!1;DM;preventMistouch={record:!1,lastX:0,lastY:0,initialX:0,initialY:0};get preventionContainer(){if(null===this._preventionContainer)throw e;return this._preventionContainer}constructor(...t){super(...t);const e=document.createElement("div");e.className="prevention-banner border-shadow-bg",e.textContent=this.options.mistouchPreventerBannerText??"Click on to unlock.",this.DM=this.container.get(i),this._preventionContainer=document.createElement("div"),this._preventionContainer.className="prevention-container hidden",o.applyStyles(this._preventionContainer,".full,.prevention-container{top:0;left:0;width:100%;height:100%;position:absolute}.flex-center,.prevention-container{display:flex;justify-content:center;align-items:center}.prevention-container{overflow:visible;transition:background .2s,opacity .2s,box-shadow .2s,border .2s,filter .2s,backdrop-filter .2s}.prevention-container.hidden{pointer-events:none;opacity:0}.prevention-container .prevention-banner{border-radius:12px;padding:12px;margin:12px;font-size:calc(14px + .3vw);line-height:calc(17px + .3vw);text-align:center}"),this._preventionContainer.appendChild(e),this.DM.data.container.appendChild(this._preventionContainer),this.options.preventMistouchAtStart&&this.startPrevention(),window.addEventListener("pointerdown",this.onPointerDown),window.addEventListener("pointermove",this.onPointerMove),window.addEventListener("pointerup",this.onPointerUp),this.augment({startMistouchPrevention:this.startPrevention,endMistouchPrevention:this.endPrevention}),this.onDispose(this.dispose)}onPointerDown=t=>{const e=this.DM.data.container.getBoundingClientRect();t.clientX<e.left||t.clientX>e.right||t.clientY<e.top||t.clientY>e.bottom?this.preventMt||this.startPrevention():this.preventMt&&(this.preventMistouch.initialX=t.clientX,this.preventMistouch.initialY=t.clientY,this.preventMistouch.lastX=t.clientX,this.preventMistouch.lastY=t.clientY,this.preventMistouch.record=!0)};onPointerMove=t=>{this.preventMistouch.record&&(this.preventMistouch.lastX=t.clientX,this.preventMistouch.lastY=t.clientY)};onPointerUp=()=>{this.preventMistouch.record&&(this.preventMistouch.record=!1,Math.abs(this.preventMistouch.lastX-this.preventMistouch.initialX)+Math.abs(this.preventMistouch.lastY-this.preventMistouch.initialY)<5&&this.endPrevention())};startPrevention=()=>{this.preventionContainer.classList.remove("hidden"),this.DM.data.container.classList.add("numb"),this.preventMt=!0};endPrevention=()=>{this.preventMt=!1,this.preventionContainer.classList.add("hidden"),setTimeout(()=>this.DM.data.container.classList.remove("numb"),50)};dispose=()=>{window.removeEventListener("pointerdown",this.onPointerDown),window.removeEventListener("pointermove",this.onPointerMove),window.removeEventListener("pointerup",this.onPointerUp),this.preventionContainer.remove(),this._preventionContainer=null}}export{r as Controls,h as DebugPanel,p as Minimap,c as MistouchPreventer};
|
|
2
|
-
//# sourceMappingURL=modules.js.map
|
package/dist/modules.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"modules.js","sources":["../src/modules/controls/index.ts","../src/modules/debugPanel/index.ts","../src/modules/minimap/index.ts","../src/modules/mistouchPreventer/index.ts"],"sourcesContent":["import { type BaseArgs, BaseModule } from '$/baseModule';\nimport Controller from '$/controller';\nimport DataManager from '$/dataManager';\nimport type { BaseOptions } from '$/declarations';\nimport InteractionHandler from '$/interactionHandler';\nimport utilities, { destroyError } from '$/utilities';\n\nimport style from './styles.scss?inline';\n\ninterface Options extends BaseOptions {\n\tcontrolsCollapsed?: boolean;\n}\n\ninterface Augmentation {\n\ttoggleControlsCollapse: Controls['toggleCollapse'];\n}\n\nconst resetIcon =\n\t'<svg viewBox=\"-6 -6 30 30\" stroke-width=\".08\"><path d=\"m14.955 7.986.116.01a1 1 0 0 1 .85 1.13 8 8 0 0 1-13.374 4.728l-.84.84c-.63.63-1.707.184-1.707-.707V10h3.987c.89 0 1.337 1.077.707 1.707l-.731.731a6 6 0 0 0 8.347-.264 6 6 0 0 0 1.63-3.33 1 1 0 0 1 1.131-.848zM11.514.813a8 8 0 0 1 1.942 1.336l.837-.837c.63-.63 1.707-.184 1.707.707V6h-3.981c-.89 0-1.337-1.077-.707-1.707l.728-.729a6 6 0 0 0-9.98 3.591 1 1 0 1 1-1.98-.281A8 8 0 0 1 11.514.813Z\" /></svg>';\nconst enterFullscreenIcon =\n\t'<svg viewBox=\"-5.28 -5.28 34.56 34.56\" fill=\"none\"><path d=\"M4 9V5.6c0-.56 0-.84.109-1.054a1 1 0 0 1 .437-.437C4.76 4 5.04 4 5.6 4H9M4 15v3.4c0 .56 0 .84.109 1.054a1 1 0 0 0 .437.437C4.76 20 5.04 20 5.6 20H9m6-16h3.4c.56 0 .84 0 1.054.109a1 1 0 0 1 .437.437C20 4.76 20 5.04 20 5.6V9m0 6v3.4c0 .56 0 .84-.109 1.054a1 1 0 0 1-.437.437C19.24 20 18.96 20 18.4 20H15\" stroke-width=\"2.4\" stroke-linecap=\"round\"/></svg>';\nconst exitFullscreenIcon =\n\t'<svg viewBox=\"-40.32 -40.32 176.64 176.64\"><path d=\"M30 60H6a6 6 0 0 0 0 12h18v18a6 6 0 0 0 12 0V66a5.997 5.997 0 0 0-6-6Zm60 0H66a5.997 5.997 0 0 0-6 6v24a6 6 0 0 0 12 0V72h18a6 6 0 0 0 0-12ZM66 36h24a6 6 0 0 0 0-12H72V6a6 6 0 0 0-12 0v24a5.997 5.997 0 0 0 6 6ZM30 0a5.997 5.997 0 0 0-6 6v18H6a6 6 0 0 0 0 12h24a5.997 5.997 0 0 0 6-6V6a5.997 5.997 0 0 0-6-6Z\"/></svg>';\nconst zoomInIcon =\n\t'<svg viewBox=\"-1.2 -1.2 26.4 26.4\"><path d=\"M6 12h12m-6-6v12\" stroke-width=\"2\" stroke-linecap=\"round\" /></svg>';\nconst zoomOutIcon =\n\t'<svg viewBox=\"-1.2 -1.2 26.4 26.4\"><path d=\"M6 12h12\" stroke-width=\"2\" stroke-linecap=\"round\" /></svg>';\nconst toggleCollapseIcon =\n\t'<svg viewBox=\"-3.6 -3.6 31.2 31.2\" stroke-width=\".4\"><path d=\"M15.707 4.293a1 1 0 0 1 0 1.414L9.414 12l6.293 6.293a1 1 0 0 1-1.414 1.414l-7-7a1 1 0 0 1 0-1.414l7-7a1 1 0 0 1 1.414 0Z\" /></svg>';\n\nexport default class Controls extends BaseModule<Options, Augmentation> {\n\tprivate _controlsPanel: HTMLDivElement | null = null;\n\tprivate _toggleCollapseBtn: HTMLButtonElement | null = null;\n\tprivate _toggleFullscreenBtn: HTMLButtonElement | null = null;\n\tprivate _zoomOutBtn: HTMLButtonElement | null = null;\n\tprivate _zoomSlider: HTMLInputElement | null = null;\n\tprivate _zoomInBtn: HTMLButtonElement | null = null;\n\tprivate _resetViewBtn: HTMLButtonElement | null = null;\n\tprivate DM: DataManager;\n\tprivate IH: InteractionHandler;\n\tprivate collapsed: boolean;\n\n\tprivate get controlsPanel() {\n\t\tif (this._controlsPanel === null) throw destroyError;\n\t\treturn this._controlsPanel;\n\t}\n\tprivate get toggleCollapseBtn() {\n\t\tif (this._toggleCollapseBtn === null) throw destroyError;\n\t\treturn this._toggleCollapseBtn;\n\t}\n\tprivate get toggleFullscreenBtn() {\n\t\tif (this._toggleFullscreenBtn === null) throw destroyError;\n\t\treturn this._toggleFullscreenBtn;\n\t}\n\tprivate get zoomOutBtn() {\n\t\tif (this._zoomOutBtn === null) throw destroyError;\n\t\treturn this._zoomOutBtn;\n\t}\n\tprivate get zoomSlider() {\n\t\tif (this._zoomSlider === null) throw destroyError;\n\t\treturn this._zoomSlider;\n\t}\n\tprivate get zoomInBtn() {\n\t\tif (this._zoomInBtn === null) throw destroyError;\n\t\treturn this._zoomInBtn;\n\t}\n\tprivate get resetViewBtn() {\n\t\tif (this._resetViewBtn === null) throw destroyError;\n\t\treturn this._resetViewBtn;\n\t}\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tthis.collapsed = this.options.controlsCollapsed ?? false;\n\t\tthis.DM = this.container.get(DataManager);\n\t\tthis.IH = this.container.get(InteractionHandler);\n\t\tthis.DM.onToggleFullscreen.subscribe(this.updateFullscreenBtn);\n\t\tthis.container.get(Controller).hooks.onRefresh.subscribe(this.updateSlider);\n\n\t\tthis._controlsPanel = document.createElement('div');\n\t\tthis._controlsPanel.className = 'controls';\n\t\tthis._controlsPanel.classList.toggle('collapsed', this.collapsed);\n\n\t\tutilities.applyStyles(this._controlsPanel, style);\n\n\t\tthis._toggleCollapseBtn = document.createElement('button');\n\t\tthis._toggleCollapseBtn.className = 'collapse-button border-shadow-bg';\n\t\tthis._toggleCollapseBtn.innerHTML = toggleCollapseIcon;\n\t\tthis._controlsPanel.appendChild(this._toggleCollapseBtn);\n\n\t\tconst controlsContent = document.createElement('div');\n\t\tcontrolsContent.className = 'controls-content';\n\n\t\tthis._toggleFullscreenBtn = document.createElement('button');\n\t\tthis._toggleFullscreenBtn.innerHTML = enterFullscreenIcon;\n\t\tcontrolsContent.appendChild(this._toggleFullscreenBtn);\n\n\t\tthis._zoomOutBtn = document.createElement('button');\n\t\tthis._zoomOutBtn.innerHTML = zoomOutIcon;\n\t\tcontrolsContent.appendChild(this._zoomOutBtn);\n\n\t\tthis._zoomSlider = document.createElement('input');\n\t\tthis._zoomSlider.type = 'range';\n\t\tthis._zoomSlider.className = 'zoom-slider';\n\t\tthis._zoomSlider.min = '-30';\n\t\tthis._zoomSlider.max = '30';\n\t\tthis._zoomSlider.value = '0';\n\t\tcontrolsContent.appendChild(this._zoomSlider);\n\n\t\tthis._zoomInBtn = document.createElement('button');\n\t\tthis._zoomInBtn.innerHTML = zoomInIcon;\n\t\tcontrolsContent.appendChild(this._zoomInBtn);\n\n\t\tthis._resetViewBtn = document.createElement('button');\n\t\tthis._resetViewBtn.innerHTML = resetIcon;\n\t\tcontrolsContent.appendChild(this._resetViewBtn);\n\n\t\tthis._controlsPanel.appendChild(controlsContent);\n\n\t\tthis.DM.data.container.appendChild(this._controlsPanel);\n\n\t\tthis._toggleCollapseBtn.addEventListener('click', this.toggleCollapse);\n\t\tthis._zoomInBtn.addEventListener('click', this.zoomIn);\n\t\tthis._zoomOutBtn.addEventListener('click', this.zoomOut);\n\t\tthis._zoomSlider.addEventListener('input', this.slide);\n\t\tthis._resetViewBtn.addEventListener('click', this.DM.resetView);\n\t\tthis._toggleFullscreenBtn.addEventListener('click', this.toggleFullscreen);\n\n\t\tthis.augment({ toggleControlsCollapse: this.toggleCollapse });\n\t\tthis.onDispose(this.dispose);\n\t}\n\ttoggleCollapse = () => {\n\t\tthis.collapsed = !this.collapsed;\n\t\tthis.controlsPanel.classList.toggle('collapsed', this.collapsed);\n\t\tif (!this.collapsed) this.updateSlider();\n\t};\n\tprivate zoomIn = () => this.IH.zoom(1.3, this.DM.middleViewer());\n\tprivate zoomOut = () => this.IH.zoom(1 / 1.3, this.DM.middleViewer());\n\tprivate slide = () =>\n\t\tthis.IH.trueZoom(\n\t\t\t1.1 ** Number(this.zoomSlider.value) / this.DM.data.scale,\n\t\t\tthis.DM.middleViewer(),\n\t\t);\n\n\tprivate updateFullscreenBtn = (enter: boolean) => {\n\t\tif (enter) this.toggleFullscreenBtn.innerHTML = exitFullscreenIcon;\n\t\telse this.toggleFullscreenBtn.innerHTML = enterFullscreenIcon;\n\t};\n\tprivate toggleFullscreen = () => this.DM.shiftFullscreen();\n\n\tprivate updateSlider = () => {\n\t\tif (this.collapsed) return;\n\t\tthis.zoomSlider.value = String(this.scaleToSlider(this.DM.data.scale));\n\t};\n\tprivate scaleToSlider = (scale: number) => Math.log(scale) / Math.log(1.1);\n\n\tprivate dispose = () => {\n\t\tthis.toggleCollapseBtn.removeEventListener('click', this.toggleCollapse);\n\t\tthis.zoomInBtn.removeEventListener('click', this.zoomIn);\n\t\tthis.zoomOutBtn.removeEventListener('click', this.zoomOut);\n\t\tthis.zoomSlider.removeEventListener('input', this.slide);\n\t\tthis.resetViewBtn.removeEventListener('click', this.DM.resetView);\n\t\tthis.toggleFullscreenBtn.removeEventListener('click', this.toggleFullscreen);\n\t\tthis.controlsPanel.remove();\n\t\tthis._controlsPanel = null;\n\t\tthis._toggleCollapseBtn = null;\n\t\tthis._zoomInBtn = null;\n\t\tthis._zoomOutBtn = null;\n\t\tthis._zoomSlider = null;\n\t\tthis._resetViewBtn = null;\n\t\tthis._toggleFullscreenBtn = null;\n\t};\n}\n","import { type BaseArgs, BaseModule } from '$/baseModule';\nimport Controller from '$/controller';\nimport DataManager from '$/dataManager';\nimport utilities, { destroyError } from '$/utilities';\n\nimport style from './styles.scss?inline';\n\nexport default class DebugPanel extends BaseModule {\n\tprivate _debugPanel: HTMLDivElement | null = null;\n\tprivate DM: DataManager;\n\n\tprivate get debugPanel() {\n\t\tif (!this._debugPanel) throw destroyError;\n\t\treturn this._debugPanel;\n\t}\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tthis.DM = this.container.get(DataManager);\n\t\tthis.container.get(Controller).hooks.onRefresh.subscribe(this.update);\n\t\tthis._debugPanel = document.createElement('div');\n\t\tthis._debugPanel.className = 'debug-panel border-shadow-bg';\n\t\tconst HTMLContainer = this.DM.data.container;\n\t\tutilities.applyStyles(HTMLContainer, style);\n\t\tHTMLContainer.appendChild(this._debugPanel);\n\t\tthis.onDispose(this.dispose);\n\t}\n\n\tprivate update = () => {\n\t\tconst round = utilities.round;\n\t\tconst data = this.DM.data;\n\t\tthis.debugPanel.innerHTML = `<p>Scale: ${round(data.scale, 3)}</p><p>Offset: ${round(data.offsetX, 1)}, ${round(data.offsetY, 1)}</p>`;\n\t};\n\n\tprivate dispose = () => {\n\t\tthis.debugPanel.remove();\n\t\tthis._debugPanel = null;\n\t};\n}\n","import { type BaseArgs, BaseModule } from '$/baseModule';\nimport Controller from '$/controller';\nimport DataManager from '$/dataManager';\nimport type { BaseOptions } from '$/declarations';\nimport StyleManager from '$/styleManager';\nimport utilities, { destroyError } from '$/utilities';\n\nimport style from './styles.scss?inline';\n\ninterface Options extends BaseOptions {\n\tminimapCollapsed?: boolean;\n}\n\ninterface Augmentation {\n\ttoggleMinimapCollapse: Minimap['toggleCollapse'];\n}\n\nconst toggleCollapseIcon =\n\t'<svg viewBox=\"-3.6 -3.6 31.2 31.2\" stroke-width=\".4\"><path d=\"M15.707 4.293a1 1 0 0 1 0 1.414L9.414 12l6.293 6.293a1 1 0 0 1-1.414 1.414l-7-7a1 1 0 0 1 0-1.414l7-7a1 1 0 0 1 1.414 0Z\" /></svg>';\n\nexport default class Minimap extends BaseModule<Options, Augmentation> {\n\tprivate _minimapCtx: CanvasRenderingContext2D | null = null;\n\tprivate _viewportRectangle: HTMLDivElement | null = null;\n\tprivate _minimap: HTMLDivElement | null = null;\n\tprivate _minimapContainer: HTMLDivElement | null = null;\n\tprivate _toggleMinimapBtn: HTMLButtonElement | null = null;\n\tprivate minimapCache: { scale: number; centerX: number; centerY: number } = {\n\t\tscale: 1,\n\t\tcenterX: 0,\n\t\tcenterY: 0,\n\t};\n\tprivate DM: DataManager;\n\tprivate SM: StyleManager;\n\tprivate collapsed: boolean;\n\n\tprivate get minimap() {\n\t\tif (this._minimap === null) throw destroyError;\n\t\treturn this._minimap;\n\t}\n\tprivate get minimapCtx() {\n\t\tif (this._minimapCtx === null) throw destroyError;\n\t\treturn this._minimapCtx;\n\t}\n\tprivate get viewportRectangle() {\n\t\tif (this._viewportRectangle === null) throw destroyError;\n\t\treturn this._viewportRectangle;\n\t}\n\tprivate get minimapContainer() {\n\t\tif (this._minimapContainer === null) throw destroyError;\n\t\treturn this._minimapContainer;\n\t}\n\tprivate get toggleMinimapBtn() {\n\t\tif (this._toggleMinimapBtn === null) throw destroyError;\n\t\treturn this._toggleMinimapBtn;\n\t}\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tthis.collapsed = this.options.minimapCollapsed ?? false;\n\t\tthis.container.get(Controller).hooks.onRefresh.subscribe(this.updateViewportRectangle);\n\t\tthis.DM = this.container.get(DataManager);\n\t\tthis.SM = this.container.get(StyleManager);\n\n\t\tthis._minimapContainer = document.createElement('div');\n\t\tthis._minimapContainer.className = 'minimap-container';\n\n\t\tutilities.applyStyles(this._minimapContainer, style);\n\n\t\tthis._toggleMinimapBtn = document.createElement('button');\n\t\tthis._toggleMinimapBtn.className = 'toggle-minimap collapse-button border-shadow-bg';\n\t\tthis._toggleMinimapBtn.innerHTML = toggleCollapseIcon;\n\t\tthis._minimapContainer.appendChild(this._toggleMinimapBtn);\n\n\t\tthis._minimap = document.createElement('div');\n\t\tthis._minimap.className = 'minimap border-shadow-bg';\n\t\tconst minimapCanvas = document.createElement('canvas');\n\t\tminimapCanvas.className = 'minimap-canvas';\n\t\tminimapCanvas.width = 200;\n\t\tminimapCanvas.height = 150;\n\n\t\tthis._minimap.appendChild(minimapCanvas);\n\t\tthis._minimapCtx = minimapCanvas.getContext('2d') as CanvasRenderingContext2D;\n\t\tthis._viewportRectangle = document.createElement('div');\n\t\tthis._viewportRectangle.className = 'viewport-rectangle';\n\t\tthis._minimap.appendChild(this._viewportRectangle);\n\t\tthis._minimapContainer.appendChild(this._minimap);\n\n\t\tthis.DM.data.container.appendChild(this._minimapContainer);\n\n\t\tthis._minimapContainer.classList.toggle('collapsed', this.collapsed);\n\n\t\tthis._toggleMinimapBtn.addEventListener('click', this.toggleCollapse);\n\t\tutilities.resizeCanvasForDPR(minimapCanvas, minimapCanvas.width, minimapCanvas.height);\n\n\t\tthis.augment({ toggleMinimapCollapse: this.toggleCollapse });\n\t\tthis.onStart(this.start);\n\t\tthis.onRestart(this.start);\n\t\tthis.onDispose(this.dispose);\n\t}\n\n\ttoggleCollapse = () => {\n\t\tthis.collapsed = !this.collapsed;\n\t\tthis.minimapContainer.classList.toggle('collapsed', this.collapsed);\n\t\tif (!this.collapsed) this.updateViewportRectangle();\n\t};\n\n\tprivate start = () => {\n\t\tconst bounds = this.DM.data.nodeBounds;\n\t\tif (!bounds) return;\n\t\tconst displayWidth = this.minimap.clientWidth;\n\t\tconst displayHeight = this.minimap.clientHeight;\n\t\tconst scaleX = displayWidth / bounds.width;\n\t\tconst scaleY = displayHeight / bounds.height;\n\t\tthis.minimapCache.scale = Math.min(scaleX, scaleY) * 0.9;\n\t\tthis.minimapCache.centerX = displayWidth / 2;\n\t\tthis.minimapCache.centerY = displayHeight / 2;\n\t\tthis.minimapCtx.clearRect(0, 0, displayWidth, displayHeight);\n\t\tthis.minimapCtx.save();\n\t\tthis.minimapCtx.translate(this.minimapCache.centerX, this.minimapCache.centerY);\n\t\tthis.minimapCtx.scale(this.minimapCache.scale, this.minimapCache.scale);\n\t\tthis.minimapCtx.translate(-bounds.centerX, -bounds.centerY);\n\t\tconst canvasData = this.DM.data.canvasData;\n\t\tfor (const edge of canvasData.edges) this.drawMinimapEdge(edge);\n\t\tfor (const node of canvasData.nodes) this.drawMinimapNode(node);\n\t\tthis.minimapCtx.restore();\n\t};\n\n\tprivate drawMinimapNode = (node: JSONCanvasNode) => {\n\t\tconst colors = this.SM.getColor(node.color);\n\t\tconst radius = 25;\n\t\tthis.minimapCtx.fillStyle = colors.border;\n\t\tutilities.drawRoundRect(this.minimapCtx, node.x, node.y, node.width, node.height, radius);\n\t\tthis.minimapCtx.fill();\n\t};\n\n\tprivate drawMinimapEdge = (edge: JSONCanvasEdge) => {\n\t\tconst canvasMap = this.DM.data.nodeMap;\n\t\tconst fromNode = canvasMap[edge.fromNode].ref;\n\t\tconst toNode = canvasMap[edge.toNode].ref;\n\t\tif (!fromNode || !toNode) return;\n\t\tconst { x: startX, y: startY } = utilities.getAnchorCoord(fromNode, edge.fromSide);\n\t\tconst { x: endX, y: endY } = utilities.getAnchorCoord(toNode, edge.toSide);\n\t\tthis.minimapCtx.beginPath();\n\t\tthis.minimapCtx.moveTo(startX, startY);\n\t\tthis.minimapCtx.lineTo(endX, endY);\n\t\tthis.minimapCtx.strokeStyle = this.SM.getColor(edge.color).active;\n\t\tthis.minimapCtx.lineWidth = 10;\n\t\tthis.minimapCtx.stroke();\n\t};\n\n\tprivate updateViewportRectangle = () => {\n\t\tif (this.collapsed) return;\n\t\tconst bounds = this.DM.data.nodeBounds;\n\t\tconst container = this.DM.data.container;\n\t\tconst scale = this.DM.data.scale;\n\t\tif (!bounds) return;\n\t\tconst viewWidth = container.clientWidth / scale;\n\t\tconst viewHeight = container.clientHeight / scale;\n\t\tconst viewportCenterX = -this.DM.data.offsetX / scale + container.clientWidth / (2 * scale);\n\t\tconst viewportCenterY =\n\t\t\t-this.DM.data.offsetY / scale + container.clientHeight / (2 * scale);\n\t\tconst viewRectX =\n\t\t\tthis.minimapCache.centerX +\n\t\t\t(viewportCenterX - viewWidth / 2 - bounds.centerX) * this.minimapCache.scale;\n\t\tconst viewRectY =\n\t\t\tthis.minimapCache.centerY +\n\t\t\t(viewportCenterY - viewHeight / 2 - bounds.centerY) * this.minimapCache.scale;\n\t\tconst viewRectWidth = viewWidth * this.minimapCache.scale;\n\t\tconst viewRectHeight = viewHeight * this.minimapCache.scale;\n\t\tthis.viewportRectangle.style.left = `${viewRectX}px`;\n\t\tthis.viewportRectangle.style.top = `${viewRectY}px`;\n\t\tthis.viewportRectangle.style.width = `${viewRectWidth}px`;\n\t\tthis.viewportRectangle.style.height = `${viewRectHeight}px`;\n\t};\n\n\tprivate dispose = () => {\n\t\tthis.toggleMinimapBtn.removeEventListener('click', this.toggleCollapse);\n\t\tthis.minimapCtx.clearRect(0, 0, this.minimap.clientWidth, this.minimap.clientHeight);\n\t\tthis.minimapContainer.remove();\n\t\tthis._minimapContainer = null;\n\t\tthis._toggleMinimapBtn = null;\n\t\tthis._viewportRectangle = null;\n\t\tthis._minimap = null;\n\t};\n}\n","import { type BaseArgs, BaseModule } from '$/baseModule';\nimport DataManager from '$/dataManager';\nimport type { BaseOptions } from '$/declarations';\nimport utilities, { destroyError } from '$/utilities';\n\nimport style from './styles.scss?inline';\n\ninterface Options extends BaseOptions {\n\tpreventMistouchAtStart?: boolean;\n\tmistouchPreventerBannerText?: string;\n}\n\ninterface Augmentation {\n\tstartMistouchPrevention: MistouchPreventer['startPrevention'];\n\tendMistouchPrevention: MistouchPreventer['endPrevention'];\n}\n\nexport default class MistouchPreventer extends BaseModule<Options, Augmentation> {\n\tprivate _preventionContainer: HTMLDivElement | null = null;\n\tprivate preventMt: boolean = false;\n\tprivate DM: DataManager;\n\tprivate preventMistouch: {\n\t\trecord: boolean;\n\t\tlastX: number;\n\t\tlastY: number;\n\t\tinitialX: number;\n\t\tinitialY: number;\n\t} = {\n\t\trecord: false,\n\t\tlastX: 0,\n\t\tlastY: 0,\n\t\tinitialX: 0,\n\t\tinitialY: 0,\n\t};\n\n\tprivate get preventionContainer() {\n\t\tif (this._preventionContainer === null) throw destroyError;\n\t\treturn this._preventionContainer;\n\t}\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\n\t\tconst preventionBanner = document.createElement('div');\n\t\tpreventionBanner.className = 'prevention-banner border-shadow-bg';\n\t\tpreventionBanner.textContent =\n\t\t\tthis.options.mistouchPreventerBannerText ?? 'Click on to unlock.';\n\t\tthis.DM = this.container.get(DataManager);\n\t\tthis._preventionContainer = document.createElement('div');\n\t\tthis._preventionContainer.className = 'prevention-container hidden';\n\n\t\tutilities.applyStyles(this._preventionContainer, style);\n\t\tthis._preventionContainer.appendChild(preventionBanner);\n\t\tthis.DM.data.container.appendChild(this._preventionContainer);\n\n\t\tif (this.options.preventMistouchAtStart) this.startPrevention();\n\n\t\twindow.addEventListener('pointerdown', this.onPointerDown);\n\t\twindow.addEventListener('pointermove', this.onPointerMove);\n\t\twindow.addEventListener('pointerup', this.onPointerUp);\n\n\t\tthis.augment({\n\t\t\tstartMistouchPrevention: this.startPrevention,\n\t\t\tendMistouchPrevention: this.endPrevention,\n\t\t});\n\t\tthis.onDispose(this.dispose);\n\t}\n\n\tprivate onPointerDown = (e: PointerEvent) => {\n\t\tconst bounds = this.DM.data.container.getBoundingClientRect();\n\t\tif (\n\t\t\te.clientX < bounds.left ||\n\t\t\te.clientX > bounds.right ||\n\t\t\te.clientY < bounds.top ||\n\t\t\te.clientY > bounds.bottom\n\t\t) {\n\t\t\tif (!this.preventMt) this.startPrevention();\n\t\t} else if (this.preventMt) {\n\t\t\tthis.preventMistouch.initialX = e.clientX;\n\t\t\tthis.preventMistouch.initialY = e.clientY;\n\t\t\tthis.preventMistouch.lastX = e.clientX;\n\t\t\tthis.preventMistouch.lastY = e.clientY;\n\t\t\tthis.preventMistouch.record = true;\n\t\t}\n\t};\n\n\tprivate onPointerMove = (e: PointerEvent) => {\n\t\tif (this.preventMistouch.record) {\n\t\t\tthis.preventMistouch.lastX = e.clientX;\n\t\t\tthis.preventMistouch.lastY = e.clientY;\n\t\t}\n\t};\n\n\tprivate onPointerUp = () => {\n\t\tif (this.preventMistouch.record) {\n\t\t\tthis.preventMistouch.record = false;\n\t\t\tif (\n\t\t\t\tMath.abs(this.preventMistouch.lastX - this.preventMistouch.initialX) +\n\t\t\t\t\tMath.abs(this.preventMistouch.lastY - this.preventMistouch.initialY) <\n\t\t\t\t5\n\t\t\t)\n\t\t\t\tthis.endPrevention();\n\t\t}\n\t};\n\n\tstartPrevention = () => {\n\t\tthis.preventionContainer.classList.remove('hidden');\n\t\tthis.DM.data.container.classList.add('numb');\n\t\tthis.preventMt = true;\n\t};\n\n\tendPrevention = () => {\n\t\tthis.preventMt = false;\n\t\tthis.preventionContainer.classList.add('hidden');\n\t\tsetTimeout(() => this.DM.data.container.classList.remove('numb'), 50); // minimum delay to prevent triggering undesired button touch\n\t};\n\n\tprivate dispose = () => {\n\t\twindow.removeEventListener('pointerdown', this.onPointerDown);\n\t\twindow.removeEventListener('pointermove', this.onPointerMove);\n\t\twindow.removeEventListener('pointerup', this.onPointerUp);\n\t\tthis.preventionContainer.remove();\n\t\tthis._preventionContainer = null;\n\t};\n}\n"],"names":["enterFullscreenIcon","Controls","BaseModule","_controlsPanel","_toggleCollapseBtn","_toggleFullscreenBtn","_zoomOutBtn","_zoomSlider","_zoomInBtn","_resetViewBtn","DM","IH","collapsed","controlsPanel","this","destroyError","toggleCollapseBtn","toggleFullscreenBtn","zoomOutBtn","zoomSlider","zoomInBtn","resetViewBtn","constructor","args","super","options","controlsCollapsed","container","get","DataManager","InteractionHandler","onToggleFullscreen","subscribe","updateFullscreenBtn","Controller","hooks","onRefresh","updateSlider","document","createElement","className","classList","toggle","utilities","applyStyles","innerHTML","appendChild","controlsContent","type","min","max","value","data","addEventListener","toggleCollapse","zoomIn","zoomOut","slide","resetView","toggleFullscreen","augment","toggleControlsCollapse","onDispose","dispose","zoom","middleViewer","trueZoom","Number","scale","enter","shiftFullscreen","String","scaleToSlider","Math","log","removeEventListener","remove","DebugPanel","_debugPanel","debugPanel","update","HTMLContainer","round","offsetX","offsetY","Minimap","_minimapCtx","_viewportRectangle","_minimap","_minimapContainer","_toggleMinimapBtn","minimapCache","centerX","centerY","SM","minimap","minimapCtx","viewportRectangle","minimapContainer","toggleMinimapBtn","minimapCollapsed","updateViewportRectangle","StyleManager","minimapCanvas","width","height","getContext","resizeCanvasForDPR","toggleMinimapCollapse","onStart","start","onRestart","bounds","nodeBounds","displayWidth","clientWidth","displayHeight","clientHeight","scaleX","scaleY","clearRect","save","translate","canvasData","edge","edges","drawMinimapEdge","node","nodes","drawMinimapNode","restore","colors","getColor","color","fillStyle","border","drawRoundRect","x","y","fill","canvasMap","nodeMap","fromNode","ref","toNode","startX","startY","getAnchorCoord","fromSide","endX","endY","toSide","beginPath","moveTo","lineTo","strokeStyle","active","lineWidth","stroke","viewWidth","viewHeight","viewportCenterX","viewportCenterY","viewRectX","viewRectY","viewRectWidth","viewRectHeight","style","left","top","MistouchPreventer","_preventionContainer","preventMt","preventMistouch","record","lastX","lastY","initialX","initialY","preventionContainer","preventionBanner","textContent","mistouchPreventerBannerText","preventMistouchAtStart","startPrevention","window","onPointerDown","onPointerMove","onPointerUp","startMistouchPrevention","endMistouchPrevention","endPrevention","e","getBoundingClientRect","clientX","right","clientY","bottom","abs","add","setTimeout"],"mappings":"qGAmBMA,EACL,+ZAUD,MAAqBC,UAAiBC,EAC7BC,eAAwC,KACxCC,mBAA+C,KAC/CC,qBAAiD,KACjDC,YAAwC,KACxCC,YAAuC,KACvCC,WAAuC,KACvCC,cAA0C,KAC1CC,GACAC,GACAC,UAER,iBAAYC,GACX,GAA4B,OAAxBC,KAAKX,eAAyB,MAAMY,EACxC,OAAOD,KAAKX,cACb,CACA,qBAAYa,GACX,GAAgC,OAA5BF,KAAKV,mBAA6B,MAAMW,EAC5C,OAAOD,KAAKV,kBACb,CACA,uBAAYa,GACX,GAAkC,OAA9BH,KAAKT,qBAA+B,MAAMU,EAC9C,OAAOD,KAAKT,oBACb,CACA,cAAYa,GACX,GAAyB,OAArBJ,KAAKR,YAAsB,MAAMS,EACrC,OAAOD,KAAKR,WACb,CACA,cAAYa,GACX,GAAyB,OAArBL,KAAKP,YAAsB,MAAMQ,EACrC,OAAOD,KAAKP,WACb,CACA,aAAYa,GACX,GAAwB,OAApBN,KAAKN,WAAqB,MAAMO,EACpC,OAAOD,KAAKN,UACb,CACA,gBAAYa,GACX,GAA2B,OAAvBP,KAAKL,cAAwB,MAAMM,EACvC,OAAOD,KAAKL,aACb,CAEA,WAAAa,IAAeC,GACdC,SAASD,GACTT,KAAKF,UAAYE,KAAKW,QAAQC,oBAAqB,EACnDZ,KAAKJ,GAAKI,KAAKa,UAAUC,IAAIC,GAC7Bf,KAAKH,GAAKG,KAAKa,UAAUC,IAAIE,GAC7BhB,KAAKJ,GAAGqB,mBAAmBC,UAAUlB,KAAKmB,qBAC1CnB,KAAKa,UAAUC,IAAIM,GAAYC,MAAMC,UAAUJ,UAAUlB,KAAKuB,cAE9DvB,KAAKX,eAAiBmC,SAASC,cAAc,OAC7CzB,KAAKX,eAAeqC,UAAY,WAChC1B,KAAKX,eAAesC,UAAUC,OAAO,YAAa5B,KAAKF,WAEvD+B,EAAUC,YAAY9B,KAAKX,6lBAE3BW,KAAKV,mBAAqBkC,SAASC,cAAc,UACjDzB,KAAKV,mBAAmBoC,UAAY,mCACpC1B,KAAKV,mBAAmByC,UA3DzB,mMA4DC/B,KAAKX,eAAe2C,YAAYhC,KAAKV,oBAErC,MAAM2C,EAAkBT,SAASC,cAAc,OAC/CQ,EAAgBP,UAAY,mBAE5B1B,KAAKT,qBAAuBiC,SAASC,cAAc,UACnDzB,KAAKT,qBAAqBwC,UAAY7C,EACtC+C,EAAgBD,YAAYhC,KAAKT,sBAEjCS,KAAKR,YAAcgC,SAASC,cAAc,UAC1CzB,KAAKR,YAAYuC,UAxElB,yGAyECE,EAAgBD,YAAYhC,KAAKR,aAEjCQ,KAAKP,YAAc+B,SAASC,cAAc,SAC1CzB,KAAKP,YAAYyC,KAAO,QACxBlC,KAAKP,YAAYiC,UAAY,cAC7B1B,KAAKP,YAAY0C,IAAM,MACvBnC,KAAKP,YAAY2C,IAAM,KACvBpC,KAAKP,YAAY4C,MAAQ,IACzBJ,EAAgBD,YAAYhC,KAAKP,aAEjCO,KAAKN,WAAa8B,SAASC,cAAc,UACzCzB,KAAKN,WAAWqC,UAtFjB,iHAuFCE,EAAgBD,YAAYhC,KAAKN,YAEjCM,KAAKL,cAAgB6B,SAASC,cAAc,UAC5CzB,KAAKL,cAAcoC,UAhGpB,6cAiGCE,EAAgBD,YAAYhC,KAAKL,eAEjCK,KAAKX,eAAe2C,YAAYC,GAEhCjC,KAAKJ,GAAG0C,KAAKzB,UAAUmB,YAAYhC,KAAKX,gBAExCW,KAAKV,mBAAmBiD,iBAAiB,QAASvC,KAAKwC,gBACvDxC,KAAKN,WAAW6C,iBAAiB,QAASvC,KAAKyC,QAC/CzC,KAAKR,YAAY+C,iBAAiB,QAASvC,KAAK0C,SAChD1C,KAAKP,YAAY8C,iBAAiB,QAASvC,KAAK2C,OAChD3C,KAAKL,cAAc4C,iBAAiB,QAASvC,KAAKJ,GAAGgD,WACrD5C,KAAKT,qBAAqBgD,iBAAiB,QAASvC,KAAK6C,kBAEzD7C,KAAK8C,QAAQ,CAAEC,uBAAwB/C,KAAKwC,iBAC5CxC,KAAKgD,UAAUhD,KAAKiD,QACrB,CACAT,eAAiB,KAChBxC,KAAKF,WAAaE,KAAKF,UACvBE,KAAKD,cAAc4B,UAAUC,OAAO,YAAa5B,KAAKF,WACjDE,KAAKF,WAAWE,KAAKuB,gBAEnBkB,OAAS,IAAMzC,KAAKH,GAAGqD,KAAK,IAAKlD,KAAKJ,GAAGuD,gBACzCT,QAAU,IAAM1C,KAAKH,GAAGqD,KAAK,EAAI,IAAKlD,KAAKJ,GAAGuD,gBAC9CR,MAAQ,IACf3C,KAAKH,GAAGuD,SACP,KAAOC,OAAOrD,KAAKK,WAAWgC,OAASrC,KAAKJ,GAAG0C,KAAKgB,MACpDtD,KAAKJ,GAAGuD,gBAGFhC,oBAAuBoC,IACnBvD,KAAKG,oBAAoB4B,UAAhCwB,EA3HL,mXA4H2CrE,GAEnC2D,iBAAmB,IAAM7C,KAAKJ,GAAG4D,kBAEjCjC,aAAe,KAClBvB,KAAKF,YACTE,KAAKK,WAAWgC,MAAQoB,OAAOzD,KAAK0D,cAAc1D,KAAKJ,GAAG0C,KAAKgB,UAExDI,cAAiBJ,GAAkBK,KAAKC,IAAIN,GAASK,KAAKC,IAAI,KAE9DX,QAAU,KACjBjD,KAAKE,kBAAkB2D,oBAAoB,QAAS7D,KAAKwC,gBACzDxC,KAAKM,UAAUuD,oBAAoB,QAAS7D,KAAKyC,QACjDzC,KAAKI,WAAWyD,oBAAoB,QAAS7D,KAAK0C,SAClD1C,KAAKK,WAAWwD,oBAAoB,QAAS7D,KAAK2C,OAClD3C,KAAKO,aAAasD,oBAAoB,QAAS7D,KAAKJ,GAAGgD,WACvD5C,KAAKG,oBAAoB0D,oBAAoB,QAAS7D,KAAK6C,kBAC3D7C,KAAKD,cAAc+D,SACnB9D,KAAKX,eAAiB,KACtBW,KAAKV,mBAAqB,KAC1BU,KAAKN,WAAa,KAClBM,KAAKR,YAAc,KACnBQ,KAAKP,YAAc,KACnBO,KAAKL,cAAgB,KACrBK,KAAKT,qBAAuB,MCnK9B,MAAqBwE,UAAmB3E,EAC/B4E,YAAqC,KACrCpE,GAER,cAAYqE,GACX,IAAKjE,KAAKgE,YAAa,MAAM/D,EAC7B,OAAOD,KAAKgE,WACb,CAEA,WAAAxD,IAAeC,GACdC,SAASD,GACTT,KAAKJ,GAAKI,KAAKa,UAAUC,IAAIC,GAC7Bf,KAAKa,UAAUC,IAAIM,GAAYC,MAAMC,UAAUJ,UAAUlB,KAAKkE,QAC9DlE,KAAKgE,YAAcxC,SAASC,cAAc,OAC1CzB,KAAKgE,YAAYtC,UAAY,+BAC7B,MAAMyC,EAAgBnE,KAAKJ,GAAG0C,KAAKzB,UACnCgB,EAAUC,YAAYqC,2LACtBA,EAAcnC,YAAYhC,KAAKgE,aAC/BhE,KAAKgD,UAAUhD,KAAKiD,QACrB,CAEQiB,OAAS,KAChB,MAAME,EAAQvC,EAAUuC,MAClB9B,EAAOtC,KAAKJ,GAAG0C,KACrBtC,KAAKiE,WAAWlC,UAAY,aAAaqC,EAAM9B,EAAKgB,MAAO,oBAAoBc,EAAM9B,EAAK+B,QAAS,OAAOD,EAAM9B,EAAKgC,QAAS,UAGvHrB,QAAU,KACjBjD,KAAKiE,WAAWH,SAChB9D,KAAKgE,YAAc,MChBrB,MAAqBO,UAAgBnF,EAC5BoF,YAA+C,KAC/CC,mBAA4C,KAC5CC,SAAkC,KAClCC,kBAA2C,KAC3CC,kBAA8C,KAC9CC,aAAoE,CAC3EvB,MAAO,EACPwB,QAAS,EACTC,QAAS,GAEFnF,GACAoF,GACAlF,UAER,WAAYmF,GACX,GAAsB,OAAlBjF,KAAK0E,SAAmB,MAAMzE,EAClC,OAAOD,KAAK0E,QACb,CACA,cAAYQ,GACX,GAAyB,OAArBlF,KAAKwE,YAAsB,MAAMvE,EACrC,OAAOD,KAAKwE,WACb,CACA,qBAAYW,GACX,GAAgC,OAA5BnF,KAAKyE,mBAA6B,MAAMxE,EAC5C,OAAOD,KAAKyE,kBACb,CACA,oBAAYW,GACX,GAA+B,OAA3BpF,KAAK2E,kBAA4B,MAAM1E,EAC3C,OAAOD,KAAK2E,iBACb,CACA,oBAAYU,GACX,GAA+B,OAA3BrF,KAAK4E,kBAA4B,MAAM3E,EAC3C,OAAOD,KAAK4E,iBACb,CAEA,WAAApE,IAAeC,GACdC,SAASD,GACTT,KAAKF,UAAYE,KAAKW,QAAQ2E,mBAAoB,EAClDtF,KAAKa,UAAUC,IAAIM,GAAYC,MAAMC,UAAUJ,UAAUlB,KAAKuF,yBAC9DvF,KAAKJ,GAAKI,KAAKa,UAAUC,IAAIC,GAC7Bf,KAAKgF,GAAKhF,KAAKa,UAAUC,IAAI0E,GAE7BxF,KAAK2E,kBAAoBnD,SAASC,cAAc,OAChDzB,KAAK2E,kBAAkBjD,UAAY,oBAEnCG,EAAUC,YAAY9B,KAAK2E,2/BAE3B3E,KAAK4E,kBAAoBpD,SAASC,cAAc,UAChDzB,KAAK4E,kBAAkBlD,UAAY,kDACnC1B,KAAK4E,kBAAkB7C,UApDxB,mMAqDC/B,KAAK2E,kBAAkB3C,YAAYhC,KAAK4E,mBAExC5E,KAAK0E,SAAWlD,SAASC,cAAc,OACvCzB,KAAK0E,SAAShD,UAAY,2BAC1B,MAAM+D,EAAgBjE,SAASC,cAAc,UAC7CgE,EAAc/D,UAAY,iBAC1B+D,EAAcC,MAAQ,IACtBD,EAAcE,OAAS,IAEvB3F,KAAK0E,SAAS1C,YAAYyD,GAC1BzF,KAAKwE,YAAciB,EAAcG,WAAW,MAC5C5F,KAAKyE,mBAAqBjD,SAASC,cAAc,OACjDzB,KAAKyE,mBAAmB/C,UAAY,qBACpC1B,KAAK0E,SAAS1C,YAAYhC,KAAKyE,oBAC/BzE,KAAK2E,kBAAkB3C,YAAYhC,KAAK0E,UAExC1E,KAAKJ,GAAG0C,KAAKzB,UAAUmB,YAAYhC,KAAK2E,mBAExC3E,KAAK2E,kBAAkBhD,UAAUC,OAAO,YAAa5B,KAAKF,WAE1DE,KAAK4E,kBAAkBrC,iBAAiB,QAASvC,KAAKwC,gBACtDX,EAAUgE,mBAAmBJ,EAAeA,EAAcC,MAAOD,EAAcE,QAE/E3F,KAAK8C,QAAQ,CAAEgD,sBAAuB9F,KAAKwC,iBAC3CxC,KAAK+F,QAAQ/F,KAAKgG,OAClBhG,KAAKiG,UAAUjG,KAAKgG,OACpBhG,KAAKgD,UAAUhD,KAAKiD,QACrB,CAEAT,eAAiB,KAChBxC,KAAKF,WAAaE,KAAKF,UACvBE,KAAKoF,iBAAiBzD,UAAUC,OAAO,YAAa5B,KAAKF,WACpDE,KAAKF,WAAWE,KAAKuF,2BAGnBS,MAAQ,KACf,MAAME,EAASlG,KAAKJ,GAAG0C,KAAK6D,WAC5B,IAAKD,EAAQ,OACb,MAAME,EAAepG,KAAKiF,QAAQoB,YAC5BC,EAAgBtG,KAAKiF,QAAQsB,aAC7BC,EAASJ,EAAeF,EAAOR,MAC/Be,EAASH,EAAgBJ,EAAOP,OACtC3F,KAAK6E,aAAavB,MAAmC,GAA3BK,KAAKxB,IAAIqE,EAAQC,GAC3CzG,KAAK6E,aAAaC,QAAUsB,EAAe,EAC3CpG,KAAK6E,aAAaE,QAAUuB,EAAgB,EAC5CtG,KAAKkF,WAAWwB,UAAU,EAAG,EAAGN,EAAcE,GAC9CtG,KAAKkF,WAAWyB,OAChB3G,KAAKkF,WAAW0B,UAAU5G,KAAK6E,aAAaC,QAAS9E,KAAK6E,aAAaE,SACvE/E,KAAKkF,WAAW5B,MAAMtD,KAAK6E,aAAavB,MAAOtD,KAAK6E,aAAavB,OACjEtD,KAAKkF,WAAW0B,WAAWV,EAAOpB,SAAUoB,EAAOnB,SACnD,MAAM8B,EAAa7G,KAAKJ,GAAG0C,KAAKuE,WAChC,IAAA,MAAWC,KAAQD,EAAWE,MAAO/G,KAAKgH,gBAAgBF,GAC1D,IAAA,MAAWG,KAAQJ,EAAWK,MAAOlH,KAAKmH,gBAAgBF,GAC1DjH,KAAKkF,WAAWkC,WAGTD,gBAAmBF,IAC1B,MAAMI,EAASrH,KAAKgF,GAAGsC,SAASL,EAAKM,OAErCvH,KAAKkF,WAAWsC,UAAYH,EAAOI,OACnC5F,EAAU6F,cAAc1H,KAAKkF,WAAY+B,EAAKU,EAAGV,EAAKW,EAAGX,EAAKvB,MAAOuB,EAAKtB,OAF3D,IAGf3F,KAAKkF,WAAW2C,QAGTb,gBAAmBF,IAC1B,MAAMgB,EAAY9H,KAAKJ,GAAG0C,KAAKyF,QACzBC,EAAWF,EAAUhB,EAAKkB,UAAUC,IACpCC,EAASJ,EAAUhB,EAAKoB,QAAQD,IACtC,IAAKD,IAAaE,EAAQ,OAC1B,MAAQP,EAAGQ,EAAQP,EAAGQ,GAAWvG,EAAUwG,eAAeL,EAAUlB,EAAKwB,WACjEX,EAAGY,EAAMX,EAAGY,GAAS3G,EAAUwG,eAAeH,EAAQpB,EAAK2B,QACnEzI,KAAKkF,WAAWwD,YAChB1I,KAAKkF,WAAWyD,OAAOR,EAAQC,GAC/BpI,KAAKkF,WAAW0D,OAAOL,EAAMC,GAC7BxI,KAAKkF,WAAW2D,YAAc7I,KAAKgF,GAAGsC,SAASR,EAAKS,OAAOuB,OAC3D9I,KAAKkF,WAAW6D,UAAY,GAC5B/I,KAAKkF,WAAW8D,UAGTzD,wBAA0B,KACjC,GAAIvF,KAAKF,UAAW,OACpB,MAAMoG,EAASlG,KAAKJ,GAAG0C,KAAK6D,WACtBtF,EAAYb,KAAKJ,GAAG0C,KAAKzB,UACzByC,EAAQtD,KAAKJ,GAAG0C,KAAKgB,MAC3B,IAAK4C,EAAQ,OACb,MAAM+C,EAAYpI,EAAUwF,YAAc/C,EACpC4F,EAAarI,EAAU0F,aAAejD,EACtC6F,GAAmBnJ,KAAKJ,GAAG0C,KAAK+B,QAAUf,EAAQzC,EAAUwF,aAAe,EAAI/C,GAC/E8F,GACJpJ,KAAKJ,GAAG0C,KAAKgC,QAAUhB,EAAQzC,EAAU0F,cAAgB,EAAIjD,GACzD+F,EACLrJ,KAAK6E,aAAaC,SACjBqE,EAAkBF,EAAY,EAAI/C,EAAOpB,SAAW9E,KAAK6E,aAAavB,MAClEgG,EACLtJ,KAAK6E,aAAaE,SACjBqE,EAAkBF,EAAa,EAAIhD,EAAOnB,SAAW/E,KAAK6E,aAAavB,MACnEiG,EAAgBN,EAAYjJ,KAAK6E,aAAavB,MAC9CkG,EAAiBN,EAAalJ,KAAK6E,aAAavB,MACtDtD,KAAKmF,kBAAkBsE,MAAMC,KAAO,GAAGL,MACvCrJ,KAAKmF,kBAAkBsE,MAAME,IAAM,GAAGL,MACtCtJ,KAAKmF,kBAAkBsE,MAAM/D,MAAQ,GAAG6D,MACxCvJ,KAAKmF,kBAAkBsE,MAAM9D,OAAS,GAAG6D,OAGlCvG,QAAU,KACjBjD,KAAKqF,iBAAiBxB,oBAAoB,QAAS7D,KAAKwC,gBACxDxC,KAAKkF,WAAWwB,UAAU,EAAG,EAAG1G,KAAKiF,QAAQoB,YAAarG,KAAKiF,QAAQsB,cACvEvG,KAAKoF,iBAAiBtB,SACtB9D,KAAK2E,kBAAoB,KACzB3E,KAAK4E,kBAAoB,KACzB5E,KAAKyE,mBAAqB,KAC1BzE,KAAK0E,SAAW,MCrKlB,MAAqBkF,UAA0BxK,EACtCyK,qBAA8C,KAC9CC,WAAqB,EACrBlK,GACAmK,gBAMJ,CACHC,QAAQ,EACRC,MAAO,EACPC,MAAO,EACPC,SAAU,EACVC,SAAU,GAGX,uBAAYC,GACX,GAAkC,OAA9BrK,KAAK6J,qBAA+B,MAAM5J,EAC9C,OAAOD,KAAK6J,oBACb,CAEA,WAAArJ,IAAeC,GACdC,SAASD,GAET,MAAM6J,EAAmB9I,SAASC,cAAc,OAChD6I,EAAiB5I,UAAY,qCAC7B4I,EAAiBC,YAChBvK,KAAKW,QAAQ6J,6BAA+B,sBAC7CxK,KAAKJ,GAAKI,KAAKa,UAAUC,IAAIC,GAC7Bf,KAAK6J,qBAAuBrI,SAASC,cAAc,OACnDzB,KAAK6J,qBAAqBnI,UAAY,8BAEtCG,EAAUC,YAAY9B,KAAK6J,uiBAC3B7J,KAAK6J,qBAAqB7H,YAAYsI,GACtCtK,KAAKJ,GAAG0C,KAAKzB,UAAUmB,YAAYhC,KAAK6J,sBAEpC7J,KAAKW,QAAQ8J,wBAAwBzK,KAAK0K,kBAE9CC,OAAOpI,iBAAiB,cAAevC,KAAK4K,eAC5CD,OAAOpI,iBAAiB,cAAevC,KAAK6K,eAC5CF,OAAOpI,iBAAiB,YAAavC,KAAK8K,aAE1C9K,KAAK8C,QAAQ,CACZiI,wBAAyB/K,KAAK0K,gBAC9BM,sBAAuBhL,KAAKiL,gBAE7BjL,KAAKgD,UAAUhD,KAAKiD,QACrB,CAEQ2H,cAAiBM,IACxB,MAAMhF,EAASlG,KAAKJ,GAAG0C,KAAKzB,UAAUsK,wBAErCD,EAAEE,QAAUlF,EAAOwD,MACnBwB,EAAEE,QAAUlF,EAAOmF,OACnBH,EAAEI,QAAUpF,EAAOyD,KACnBuB,EAAEI,QAAUpF,EAAOqF,OAEdvL,KAAK8J,WAAW9J,KAAK0K,kBAChB1K,KAAK8J,YACf9J,KAAK+J,gBAAgBI,SAAWe,EAAEE,QAClCpL,KAAK+J,gBAAgBK,SAAWc,EAAEI,QAClCtL,KAAK+J,gBAAgBE,MAAQiB,EAAEE,QAC/BpL,KAAK+J,gBAAgBG,MAAQgB,EAAEI,QAC/BtL,KAAK+J,gBAAgBC,QAAS,IAIxBa,cAAiBK,IACpBlL,KAAK+J,gBAAgBC,SACxBhK,KAAK+J,gBAAgBE,MAAQiB,EAAEE,QAC/BpL,KAAK+J,gBAAgBG,MAAQgB,EAAEI,UAIzBR,YAAc,KACjB9K,KAAK+J,gBAAgBC,SACxBhK,KAAK+J,gBAAgBC,QAAS,EAE7BrG,KAAK6H,IAAIxL,KAAK+J,gBAAgBE,MAAQjK,KAAK+J,gBAAgBI,UAC1DxG,KAAK6H,IAAIxL,KAAK+J,gBAAgBG,MAAQlK,KAAK+J,gBAAgBK,UAC5D,GAEApK,KAAKiL,kBAIRP,gBAAkB,KACjB1K,KAAKqK,oBAAoB1I,UAAUmC,OAAO,UAC1C9D,KAAKJ,GAAG0C,KAAKzB,UAAUc,UAAU8J,IAAI,QACrCzL,KAAK8J,WAAY,GAGlBmB,cAAgB,KACfjL,KAAK8J,WAAY,EACjB9J,KAAKqK,oBAAoB1I,UAAU8J,IAAI,UACvCC,WAAW,IAAM1L,KAAKJ,GAAG0C,KAAKzB,UAAUc,UAAUmC,OAAO,QAAS,KAG3Db,QAAU,KACjB0H,OAAO9G,oBAAoB,cAAe7D,KAAK4K,eAC/CD,OAAO9G,oBAAoB,cAAe7D,KAAK6K,eAC/CF,OAAO9G,oBAAoB,YAAa7D,KAAK8K,aAC7C9K,KAAKqK,oBAAoBvG,SACzB9D,KAAK6J,qBAAuB"}
|
package/dist/react.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{J as e}from"./index-BPBGNZi4.js";import{useRef as t,useEffect as n}from"react";function r({modules:r,options:a,prerenderedContent:c="",className:s,style:i,id:m,theme:o,canvas:u,attachmentDir:l}){const d=t(null),h=t(null);return n(()=>{if(!d.current)return;const t=new e(Object.assign(a??{},{container:d.current,canvas:u,attachmentDir:l,theme:o}),r);return h.current=t,t.dispose},[a,r]),n(()=>{h.current&&h.current.changeTheme(o)}),n(()=>{h.current&&h.current.load({canvas:u,attachmentDir:l})}),/* @__PURE__ */React.createElement("section",{ref:d,dangerouslySetInnerHTML:{__html:c},style:{maxWidth:"100vw",maxHeight:"100vh",...i},className:s,id:m})}export{r as default};
|
|
2
|
-
//# sourceMappingURL=react.js.map
|
package/dist/react.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"react.js","sources":["../src/bridges/reactComponent.tsx"],"sourcesContent":["import JSONCanvasViewer, { type JSONCanvasViewerInterface } from '$';\nimport type { ModuleInputCtor, UserOptions } from '$/declarations';\nimport { useEffect, useRef } from 'react';\n\nexport default function JSONCanvasViewerReact<T extends ModuleInputCtor>({\n\tmodules,\n\toptions,\n\tprerenderedContent = '',\n\tclassName,\n\tstyle,\n\tid,\n\ttheme,\n\tcanvas,\n\tattachmentDir,\n}: {\n\tmodules?: T;\n\toptions?: Omit<UserOptions<T>, 'container' | 'theme' | 'canvas' | 'attachmentDir'>;\n\tprerenderedContent?: string;\n\tclassName?: string;\n\tstyle?: React.CSSProperties;\n\tid?: string;\n\ttheme?: 'dark' | 'light';\n\tcanvas?: JSONCanvas;\n\tattachmentDir?: string;\n}) {\n\tconst containerRef = useRef<HTMLDivElement>(null);\n\tconst instanceRef = useRef<null | JSONCanvasViewerInterface>(null);\n\n\tuseEffect(() => {\n\t\tif (!containerRef.current) return;\n\t\tconst instance = new JSONCanvasViewer(\n\t\t\tObject.assign(options ?? {}, {\n\t\t\t\tcontainer: containerRef.current,\n\t\t\t\tcanvas,\n\t\t\t\tattachmentDir,\n\t\t\t\ttheme,\n\t\t\t}) as UserOptions<T>,\n\t\t\tmodules,\n\t\t);\n\t\tinstanceRef.current = instance;\n\t\treturn instance.dispose;\n\t\t// oxlint-disable-next-line eslint-plugin-react-hooks/exhaustive-deps\n\t}, [options, modules]);\n\n\tuseEffect(() => {\n\t\tif (!instanceRef.current) return;\n\t\tinstanceRef.current.changeTheme(theme);\n\t});\n\n\tuseEffect(() => {\n\t\tif (!instanceRef.current) return;\n\t\tinstanceRef.current.load({ canvas, attachmentDir });\n\t});\n\n\treturn (\n\t\t<section\n\t\t\tref={containerRef}\n\t\t\tdangerouslySetInnerHTML={{ __html: prerenderedContent }}\n\t\t\tstyle={{ maxWidth: '100vw', maxHeight: '100vh', ...style }}\n\t\t\tclassName={className}\n\t\t\tid={id}\n\t\t/>\n\t);\n}\n"],"names":["JSONCanvasViewerReact","modules","options","prerenderedContent","className","style","id","theme","canvas","attachmentDir","containerRef","useRef","instanceRef","useEffect","current","instance","JSONCanvasViewer","Object","assign","container","dispose","changeTheme","load","React","createElement","ref","dangerouslySetInnerHTML","__html","maxWidth","maxHeight"],"mappings":"sFAIA,SAAwBA,GAAiDC,QACxEA,EAAAC,QACAA,EAAAC,mBACAA,EAAqB,GAAAC,UACrBA,EAAAC,MACAA,EAAAC,GACAA,EAAAC,MACAA,EAAAC,OACAA,EAAAC,cACAA,IAYA,MAAMC,EAAeC,EAAuB,MACtCC,EAAcD,EAAyC,MA4B7D,OA1BAE,EAAU,KACT,IAAKH,EAAaI,QAAS,OAC3B,MAAMC,EAAW,IAAIC,EACpBC,OAAOC,OAAOhB,GAAW,GAAI,CAC5BiB,UAAWT,EAAaI,QACxBN,SACAC,gBACAF,UAEDN,GAGD,OADAW,EAAYE,QAAUC,EACfA,EAASK,SAEd,CAAClB,EAASD,IAEbY,EAAU,KACJD,EAAYE,SACjBF,EAAYE,QAAQO,YAAYd,KAGjCM,EAAU,KACJD,EAAYE,SACjBF,EAAYE,QAAQQ,KAAK,CAAEd,SAAQC,mCAInCc,MAAAC,cAAC,UAAA,CACAC,IAAKf,EACLgB,wBAAyB,CAAEC,OAAQxB,GACnCE,MAAO,CAAEuB,SAAU,QAASC,UAAW,WAAYxB,GACnDD,YACAE,MAGH"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"renderToString-Dp8A-Rka.js","sources":["../src/bridges/renderToString.ts"],"sourcesContent":["import type { MarkdownParser } from '$/declarations';\n\nexport default async function (options: {\n\tcanvas: JSONCanvas;\n\tattachmentDir?: string;\n\tmarkdownParser?: MarkdownParser;\n}) {\n\tconst render = async (node: JSONCanvasNode) =>\n\t\tawait renderer(node, options.markdownParser ?? ((markdown: string) => markdown));\n\tconst nodes = options.canvas.nodes ?? [];\n\tconst basePath = options.attachmentDir ?? './';\n\tnodes.forEach((node) => {\n\t\tif (node.type === 'file' && !node.file.includes('http')) {\n\t\t\tconst file = node.file.split('/');\n\t\t\tnode.file = basePath + file.pop();\n\t\t}\n\t});\n\tconst renderedContent: Array<string> = [];\n\tawait Promise.all(nodes.map(async (node) => renderedContent.push(await render(node))));\n\treturn renderedContent.join('');\n}\n\nasync function renderer(node: JSONCanvasNode, parse: MarkdownParser) {\n\tswitch (node.type) {\n\t\tcase 'text':\n\t\t\treturn await parse(node.text);\n\t\tcase 'file':\n\t\t\treturn await fileProcessor(node, parse);\n\t\tcase 'link':\n\t\t\treturn `<a href=\"${node.url}\" target=\"_blank\" rel=\"nofollow\">${node.url}</a>`;\n\t\tdefault:\n\t\t\treturn '';\n\t}\n}\n\nasync function fileProcessor(node: JSONCanvasFileNode, parse: MarkdownParser) {\n\tif (node.file.match(/\\.md$/i)) return await loadMarkdown(node.file, parse);\n\telse if (node.file.match(/\\.(png|jpg|jpeg|gif|svg|webp)$/i))\n\t\treturn `<img src=\"${node.file}\" alt=\"${node.file.split('/').pop()}\">`;\n\telse if (node.file.match(/\\.(mp3|wav)$/i)) return `<audio src=\"${node.file}\" controls></audio>`;\n\treturn '';\n}\n\nasync function loadMarkdown(path: string, parse: MarkdownParser) {\n\tlet parsedContent: string;\n\ttry {\n\t\tconst response = await fetch(path);\n\t\tconst result = await response.text();\n\t\tconst frontmatterMatch = result.match(/^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/);\n\t\tif (frontmatterMatch) parsedContent = await parse(frontmatterMatch[2]);\n\t\telse parsedContent = await parse(result);\n\t} catch {\n\t\tparsedContent = 'Failed to load content.';\n\t}\n\treturn parsedContent;\n}\n"],"names":["async","renderToString","options","render","node","parse","type","text","file","match","path","parsedContent","response","fetch","result","frontmatterMatch","loadMarkdown","split","pop","fileProcessor","url","renderer","markdownParser","markdown","nodes","canvas","basePath","attachmentDir","forEach","includes","renderedContent","Promise","all","map","push","join"],"mappings":"AAEAA,eAAAC,EAA+BC,GAK9B,MAAMC,EAASH,MAAOI,SAevBJ,eAAwBI,EAAsBC,GAC7C,OAAQD,EAAKE,MACZ,IAAK,OACJ,aAAaD,EAAMD,EAAKG,MACzB,IAAK,OACJ,aAQHP,eAA6BI,EAA0BC,GACtD,GAAID,EAAKI,KAAKC,MAAM,uBAOrBT,eAA4BU,EAAcL,GACzC,IAAIM,EACJ,IACC,MAAMC,QAAiBC,MAAMH,GACvBI,QAAeF,EAASL,OACxBQ,EAAmBD,EAAOL,MAAM,qCAChBE,EAAlBI,QAAwCV,EAAMU,EAAiB,UACxCV,EAAMS,EAClC,CAAA,MACCH,EAAgB,yBACjB,CACA,OAAOA,CACR,CAnB6CK,CAAaZ,EAAKI,KAAMH,GAAK,GAChED,EAAKI,KAAKC,MAAM,mCACxB,MAAO,aAAaL,EAAKI,cAAcJ,EAAKI,KAAKS,MAAM,KAAKC,UAAK,GACzDd,EAAKI,KAAKC,MAAM,iBAAkB,MAAO,eAAeL,EAAKI,0BACtE,MAAO,EACR,CAdgBW,CAAcf,EAAMC,GAClC,IAAK,OACJ,MAAO,YAAYD,EAAKgB,uCAAuChB,EAAKgB,UACrE,QACC,MAAO,GAEV,CAzBQC,CAASjB,EAAMF,EAAQoB,gBAAA,CAAoBC,GAAqBA,IACjEC,EAAQtB,EAAQuB,OAAOD,OAAS,GAChCE,EAAWxB,EAAQyB,eAAiB,KAC1CH,EAAMI,QAASxB,IACd,GAAkB,SAAdA,EAAKE,OAAoBF,EAAKI,KAAKqB,SAAS,QAAS,CACxD,MAAMrB,EAAOJ,EAAKI,KAAKS,MAAM,KAC7Bb,EAAKI,KAAOkB,EAAWlB,EAAKU,KAC7B,IAED,MAAMY,EAAiC,GAEvC,aADMC,QAAQC,IAAIR,EAAMS,IAAIjC,MAAOI,GAAS0B,EAAgBI,WAAW/B,EAAOC,MACvE0B,EAAgBK,KAAK,GAC7B"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{B as t,d as i,C as e,S as s,D as a,u as o}from"./interactionHandler-CrVH9u7P.js";class h extends t{_canvas;ctx;DM;SM;zoomInOptimize={lastDrawnScale:0,lastDrawnViewport:{left:0,right:0,top:0,bottom:0},timeout:null,lastCallTime:0};get canvas(){if(null===this._canvas)throw i;return this._canvas}constructor(...t){super(...t);const i=this.container.get(e);this.SM=this.container.get(s),i.hooks.onRefresh.subscribe(this.redraw),i.hooks.onResize.subscribe(this.optimizeDPR),this.DM=this.container.get(a),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;o.resizeCanvasForDPR(this.canvas,t.offsetWidth,t.offsetHeight)};redraw=()=>{const t=this.DM.data.offsetX,i=this.DM.data.offsetY,e=this.DM.data.scale,s=this.getCurrentViewport(t,i,e);if(!this.options.zoomInOptimization)return void this.trueRedraw(t,i,e,s);this.zoomInOptimize.timeout&&(clearTimeout(this.zoomInOptimize.timeout),this.zoomInOptimize.timeout=null);const a=Date.now();if(this.isInside(s,this.zoomInOptimize.lastDrawnViewport)&&e!==this.zoomInOptimize.lastDrawnScale){if(a-this.zoomInOptimize.lastCallTime<500)return this.zoomInOptimize.timeout=setTimeout(()=>{this.trueRedraw(t,i,e,s),this.zoomInOptimize.lastCallTime=a,this.zoomInOptimize.timeout=null},60),void this.fakeRedraw(s,e)}this.zoomInOptimize.lastCallTime=a,this.trueRedraw(t,i,e,s)};trueRedraw(t,i,e,s){this.zoomInOptimize.lastDrawnViewport=s,this.zoomInOptimize.lastDrawnScale=e,this.canvas.style.transform="",this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.ctx.save(),this.drawGridDots(e,t,i),this.ctx.translate(t,i),this.ctx.scale(e,e),Object.values(this.DM.data.nodeMap).forEach(t=>{if(this.isOutside(t.box,s))return;const i=t.ref;"file"===i.type?this.drawFile(t):"group"===i.type&&this.drawGroup(i,e)}),Object.values(this.DM.data.edgeMap).forEach(t=>{this.isOutside(t.box,s)||this.drawEdge(t)}),this.ctx.restore()}fakeRedraw(t,i){const e=i/this.zoomInOptimize.lastDrawnScale,s=(this.zoomInOptimize.lastDrawnViewport.left-t.left)*i,a=(this.zoomInOptimize.lastDrawnViewport.top-t.top)*i;this.canvas.style.transform=`translate(${s}px, ${a}px) scale(${e})`}isInside=(t,i)=>t.left>i.left&&t.top>i.top&&t.right<i.right&&t.bottom<i.bottom;isOutside=(t,i)=>t.right<i.left||t.bottom<i.top||t.left>i.right||t.top>i.bottom;getCurrentViewport=(t,i,e)=>{const s=-t/e,a=-i/e,o=this.DM.data.container;return{left:s,top:a,right:s+o.clientWidth/e,bottom:a+o.clientHeight/e}};drawLabelBar=(t,i,e,s,a,o)=>{const h=30*o,r=6*o,c=8*o,n=16*o,l=6*o;this.ctx.save(),this.ctx.translate(t,i),this.ctx.scale(1/o,1/o),this.ctx.font=`${n}px 'Inter', sans-serif`;const d=this.ctx.measureText(e).width+2*l;this.ctx.translate(0,-h-c),this.ctx.fillStyle=s,this.ctx.beginPath(),this.ctx.moveTo(r,0),this.ctx.lineTo(d-r,0),this.ctx.quadraticCurveTo(d,0,d,r),this.ctx.lineTo(d,h-r),this.ctx.quadraticCurveTo(d,h,d-r,h),this.ctx.lineTo(r,h),this.ctx.quadraticCurveTo(0,h,0,h-r),this.ctx.lineTo(0,r),this.ctx.quadraticCurveTo(0,0,r,0),this.ctx.closePath(),this.ctx.fill(),this.ctx.fillStyle=a,this.ctx.fillText(e,l,.65*h),this.ctx.restore()};drawNodeBackground=t=>{const i=this.SM.getColor(t.color);this.ctx.globalAlpha=1,this.ctx.fillStyle=i.background,o.drawRoundRect(this.ctx,t.x+1,t.y+1,t.width-2,t.height-2,12),this.ctx.fill(),this.ctx.strokeStyle=i.border,this.ctx.lineWidth=2,o.drawRoundRect(this.ctx,t.x,t.y,t.width,t.height,12),this.ctx.stroke()};drawGroup=(t,i)=>{if(this.drawNodeBackground(t),t.label){const e=this.SM.getColor(t.color);this.drawLabelBar(t.x,t.y,t.label,e.active,e.text,i)}};drawFile=t=>{this.ctx.fillStyle=this.SM.getColor().text;const i=t.ref;this.ctx.font="16px sans-serif",this.ctx.fillText(t.fileName??"",i.x+5,i.y-10)};drawEdge=t=>{const i=t.ref,e=this.DM.data.nodeMap[i.fromNode].ref,s=this.DM.data.nodeMap[i.toNode].ref,a=o.getAnchorCoord,{x:h,y:r}=a(e,i.fromSide),{x:c,y:n}=a(s,i.toSide),l=this.SM.getColor(i.color);let[d,x,m,f]=[0,0,0,0];if(t.controlPoints?[d,x,m,f]=t.controlPoints:([d,x,m,f]=this.getControlPoints(h,r,c,n,i.fromSide,i.toSide),t.controlPoints=[d,x,m,f]),this.drawCurvedPath(h,r,c,n,d,x,m,f,l.active),this.drawArrowhead(c,n,m,f,l.active),i.label){const t=.5,e=(1-t)**3*h+3*(1-t)**2*t*d+3*(1-t)*t*t*m+t**3*c,s=(1-t)**3*r+3*(1-t)**2*t*x+3*(1-t)*t*t*f+t**3*n;this.ctx.font="18px sans-serif";const a=8,p=this.ctx.measureText(i.label).width+2*a,u=20;this.ctx.fillStyle=l.active,this.ctx.beginPath(),o.drawRoundRect(this.ctx,e-p/2,s-u/2-2,p,u,4),this.ctx.fill(),this.ctx.fillStyle=l.text,this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.fillText(i.label,e,s-2),this.ctx.textAlign="left",this.ctx.textBaseline="alphabetic"}};getControlPoints=(t,i,e,s,a,o)=>{const h=e-t,r=s-i,c=Math.min(Math.abs(h),Math.abs(r))+.3*Math.max(Math.abs(h),Math.abs(r)),n=(l=.5*c,d=60,x=300,Math.max(d,Math.min(x,l)));var l,d,x;let m=t,f=i,p=e,u=s;switch(a){case"top":f=i-n;break;case"bottom":f=i+n;break;case"left":m=t-n;break;case"right":m=t+n}switch(o){case"top":u=s-n;break;case"bottom":u=s+n;break;case"left":p=e-n;break;case"right":p=e+n}return[m,f,p,u]};drawGridDots=(t,i,e)=>{const s=10*2**-Math.floor(Math.log2(t))*t,a=this.canvas.width,o=this.canvas.height,h=i%s,r=e%s;this.ctx.fillStyle=this.SM.getNamedColor("dots");for(let c=h;c<=a;c+=s)for(let t=r;t<=o;t+=s)this.ctx.beginPath(),this.ctx.arc(c,t,1,0,2*Math.PI),this.ctx.fill()};drawCurvedPath=(t,i,e,s,a,o,h,r,c)=>{this.ctx.beginPath(),this.ctx.moveTo(t,i),this.ctx.bezierCurveTo(a,o,h,r,e,s),this.ctx.strokeStyle=c,this.ctx.lineWidth=2,this.ctx.stroke()};drawArrowhead=(t,i,e,s,a)=>{const o=t-e,h=i-s,r=Math.sqrt(o*o+h*h);if(0===r)return;const c=o/r,n=h/r,l=t-12*c-4*n,d=i-12*n+4*c,x=t-12*c+4*n,m=i-12*n-4*c;this.ctx.beginPath(),this.ctx.fillStyle=a,this.ctx.moveTo(t,i),this.ctx.lineTo(l,d),this.ctx.lineTo(x,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{h as R};
|
|
2
|
-
//# sourceMappingURL=renderer-BGA72dN1.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"renderer-BGA72dN1.js","sources":["../src/core/renderer.ts"],"sourcesContent":["import { type BaseArgs, BaseModule } from '$/baseModule';\nimport Controller from '$/controller';\nimport DataManager, { type EdgeItem, type NodeItem } from '$/dataManager';\nimport type { BaseOptions, 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 = 2;\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\ninterface Options extends BaseOptions {\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":["Renderer","BaseModule","_canvas","ctx","DM","SM","zoomInOptimize","lastDrawnScale","lastDrawnViewport","left","right","top","bottom","timeout","lastCallTime","canvas","this","destroyError","constructor","args","super","controller","container","get","Controller","StyleManager","hooks","onRefresh","subscribe","redraw","onResize","optimizeDPR","DataManager","document","createElement","className","getContext","data","appendChild","onDispose","dispose","utilities","resizeCanvasForDPR","offsetWidth","offsetHeight","offsetX","offsetY","scale","currentViewport","getCurrentViewport","options","zoomInOptimization","trueRedraw","clearTimeout","now","Date","isInside","setTimeout","fakeRedraw","style","transform","clearRect","width","height","save","drawGridDots","translate","Object","values","nodeMap","forEach","item","isOutside","box","node","ref","type","drawFile","drawGroup","edgeMap","drawEdge","restore","cssScale","currentOffsetX","currentOffsetY","inner","outer","clientWidth","clientHeight","drawLabelBar","x","y","label","color","textColor","barHeight","radius","yOffset","fontSize","xPadding","font","barWidth","measureText","fillStyle","beginPath","moveTo","lineTo","quadraticCurveTo","closePath","fill","fillText","drawNodeBackground","colors","getColor","globalAlpha","background","drawRoundRect","NODE_BORDER_WIDTH","strokeStyle","border","lineWidth","stroke","active","text","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","remove"],"mappings":"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"}
|
|
@@ -1,12 +0,0 @@
|
|
|
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;
|