json-canvas-viewer 3.2.0 → 3.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/baseModule.ts","../node_modules/.pnpm/@needle-di+core@1.1.0/node_modules/@needle-di/core/dist/utils.js","../node_modules/.pnpm/@needle-di+core@1.1.0/node_modules/@needle-di/core/dist/providers.js","../node_modules/.pnpm/@needle-di+core@1.1.0/node_modules/@needle-di/core/dist/tokens.js","../node_modules/.pnpm/@needle-di+core@1.1.0/node_modules/@needle-di/core/dist/decorators.js","../node_modules/.pnpm/@needle-di+core@1.1.0/node_modules/@needle-di/core/dist/factory.js","../node_modules/.pnpm/@needle-di+core@1.1.0/node_modules/@needle-di/core/dist/context.js","../node_modules/.pnpm/@needle-di+core@1.1.0/node_modules/@needle-di/core/dist/container.js","../src/shared.ts","../src/dataManager.ts","../src/controller.ts","../src/overlayManager.ts","../src/interactionHandler.ts","../src/renderer.ts","../src/utilities.ts","../src/index.ts","../src/controls/index.ts","../src/debugPanel/index.ts","../src/canvasViewer.ts","../src/minimap/index.ts","../src/mistouchPreventer/index.ts"],"sourcesContent":["import type { Container } from '@needle-di/core';\nimport type { DefaultOptions, Empty, GeneralFunction, GeneralObject, Utilities } from '@/declarations';\n\nexport type BaseArgs = [Container, GeneralObject, Utilities];\n\nexport type GeneralModuleCtor = typeof BaseModule<GeneralObject>;\nexport type GeneralModule = InstanceType<GeneralModuleCtor>;\n\nexport class BaseModule<O extends GeneralObject = Empty> {\n\tconstructor(\n\t\tprotected container: Container,\n\t\toptions: GeneralObject,\n\t\tprotected utilities: Utilities,\n\t) {\n\t\tObject.assign(this.options, options);\n\t}\n\n\toptions = {} as DefaultOptions & O;\n\n\tdispose?: GeneralFunction;\n}\n","/**\n * Type-guard to assert if the given object is an (abstract) class.\n *\n * @internal\n */\nexport function isClassLike(target) {\n return typeof target === \"function\";\n}\n/**\n * Returns all parent classes of a given class.\n *\n * @internal\n */\nexport function getParentClasses(target) {\n const parentClasses = [];\n let currentClass = target;\n while (Object.getPrototypeOf(currentClass).name) {\n const parentClass = Object.getPrototypeOf(currentClass);\n parentClasses.push(parentClass);\n currentClass = parentClass;\n }\n return parentClasses;\n}\n/**\n * Ensures a given value is not null or undefined.\n *\n * @internal\n */\nexport function assertPresent(value) {\n if (value === null || value === undefined) {\n throw Error(`Expected value to be not null or undefined`);\n }\n return value;\n}\nexport function windowedSlice(array, step = 2) {\n const result = [];\n array.some((_, i) => {\n if (i + step > array.length)\n return true;\n result.push(array.slice(i, i + step));\n });\n return result;\n}\n/**\n * Retries as long as it encounters any error that is instance of `errorClass`.\n * Awaits the result of the `onError` callback before retrying.\n *\n * @internal\n */\nexport async function retryOn(errorClass, block, onError) {\n while (true) {\n try {\n return await block();\n }\n catch (error) {\n if (!(error instanceof errorClass)) {\n throw error;\n }\n await onError(error);\n }\n }\n}\n/**\n * Assert that there is a single element in an array. Throws the error from error provider if not.\n *\n * @internal\n */\nexport function assertSingle(array, errorProvider) {\n if (array.length > 1) {\n throw errorProvider();\n }\n const first = array.at(0);\n if (first === undefined) {\n throw errorProvider();\n }\n return first;\n}\n/**\n * Type-guard for `never` types, can be used to create exhaustive branches.\n *\n * @internal\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport function assertNever(_) {\n throw new Error(\"invalid state\");\n}\n/**\n * Executes a callback, wrapping its result in a Promise.\n * Static version of `Promise.try()` (currently stage 3).\n *\n * @internal\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/try\n */\nexport async function promiseTry(block) {\n return await new Promise((resolve) => resolve(block()));\n}\n/**\n * Simple function that returns a Promise with a certain delay.\n *\n * @internal\n */\nexport function delay(delayInMs) {\n return new Promise((resolve) => setTimeout(resolve, delayInMs));\n}\n//# sourceMappingURL=utils.js.map","import { isClassLike } from \"./utils.js\";\nexport function isConstructorProvider(provider) {\n return isClassLike(provider);\n}\nexport function isClassProvider(provider) {\n return \"provide\" in provider && \"useClass\" in provider;\n}\nexport function isValueProvider(provider) {\n return \"provide\" in provider && \"useValue\" in provider;\n}\nexport function isFactoryProvider(provider) {\n return \"provide\" in provider && \"useFactory\" in provider;\n}\nexport function isAsyncProvider(provider) {\n return isFactoryProvider(provider) && provider.async === true;\n}\nexport function isExistingProvider(provider) {\n return \"provide\" in provider && \"useExisting\" in provider;\n}\nexport function isMultiProvider(provider) {\n return \"provide\" in provider && \"multi\" in provider && provider.multi === true;\n}\n//# sourceMappingURL=providers.js.map","import { isClassLike } from \"./utils.js\";\nimport {} from \"./providers.js\";\nimport * as Guards from \"./providers.js\";\n/**\n * A unique injection token object, that is used by reference. Can hold a generic type.\n * Can optionally hold an (async) factory.\n */\nexport class InjectionToken {\n description;\n options;\n constructor(description, options) {\n this.description = description;\n this.options = options;\n }\n toString() {\n return `InjectionToken \"${String(this.description)}\"`;\n }\n}\n/**\n * Type-guard to check if a token is a class reference.\n *\n * @internal\n */\nexport function isClassToken(token) {\n return isClassLike(token);\n}\n/**\n * Type-guard to check if a token is an InjectionToken\n *\n * @internal\n */\nexport function isInjectionToken(token) {\n return token instanceof InjectionToken;\n}\n/**\n * Describes a token, useful for error messages.\n *\n * @internal\n */\nexport function toString(token) {\n if (isClassLike(token)) {\n return token.name;\n }\n else if (typeof token === \"symbol\") {\n return token.description ?? String(token);\n }\n else if (token instanceof InjectionToken) {\n return token.toString();\n }\n else {\n return token;\n }\n}\n/**\n * Returns the token for a provider.\n *\n * @internal\n */\nexport function getToken(provider) {\n return Guards.isConstructorProvider(provider) ? provider : provider.provide;\n}\n//# sourceMappingURL=tokens.js.map","import { getParentClasses } from \"./utils.js\";\n/**\n * The @injectable() decorator allows you to automatically bind a class as singleton service\n * when requesting it from a DI container.\n */\nexport function injectable() {\n return (target) => {\n getParentClasses(target).forEach((parentClass) => {\n if (!Object.getOwnPropertyDescriptor(parentClass, injectableSymbol)) {\n Object.defineProperty(parentClass, injectableSymbol, {\n value: [target],\n writable: true,\n enumerable: false,\n });\n }\n else {\n const injectableParentClass = parentClass;\n injectableParentClass[injectableSymbol] = [...injectableParentClass[injectableSymbol], target];\n }\n });\n Object.defineProperty(target, injectableSymbol, {\n value: [target],\n writable: true,\n });\n };\n}\nexport const injectableSymbol = Symbol(\"injectable\");\nexport function isInjectable(target) {\n // eslint-disable-next-line no-prototype-builtins\n return target.hasOwnProperty(injectableSymbol);\n}\nexport function getInjectableTargets(target) {\n return target[injectableSymbol];\n}\n//# sourceMappingURL=decorators.js.map","import {} from \"./providers.js\";\nimport { getToken, toString } from \"./tokens.js\";\nimport * as Guards from \"./providers.js\";\nimport { assertNever, retryOn } from \"./utils.js\";\nimport { Container } from \"./container.js\";\n/**\n * @internal\n */\nexport class Factory {\n container;\n underConstruction = [];\n constructor(container) {\n this.container = container;\n }\n construct(provider, token) {\n if (Guards.isAsyncProvider(provider)) {\n throw new AsyncProvidersInSyncInjectionContextError(token);\n }\n try {\n if (this.underConstruction.includes(provider)) {\n const dependencyGraph = [...this.underConstruction, provider].map(getToken).map(toString);\n throw new CircularDependencyError(dependencyGraph);\n }\n this.underConstruction.push(provider);\n return this.doConstruct(provider);\n }\n finally {\n this.underConstruction.pop();\n }\n }\n async constructAsync(provider) {\n try {\n if (this.underConstruction.includes(provider)) {\n const dependencyGraph = [...this.underConstruction, provider].map(getToken).map(toString);\n throw new CircularDependencyError(dependencyGraph);\n }\n this.underConstruction.push(provider);\n if (Guards.isAsyncProvider(provider)) {\n return [await provider.useFactory(this.container)];\n }\n // in class and constructor providers, we allow stuff to be synchronously injected,\n // by just retrying when we encounter an async dependency down the road.\n // todo: this feels like an ugly workaround, so let's create something nice for this.\n if (Guards.isClassProvider(provider) || Guards.isConstructorProvider(provider)) {\n const create = Guards.isConstructorProvider(provider)\n ? () => [new provider()]\n : () => [new provider.useClass()];\n return retryOn(AsyncProvidersInSyncInjectionContextError, async () => create(), async (error) => {\n await this.container.getAsync(error.token, { multi: true, optional: true });\n });\n }\n // all other types of providers are constructed synchronously anyway.\n return this.doConstruct(provider);\n }\n finally {\n this.underConstruction.pop();\n }\n }\n doConstruct(provider) {\n if (Guards.isConstructorProvider(provider)) {\n return [new provider()];\n }\n else if (Guards.isClassProvider(provider)) {\n return [new provider.useClass()];\n }\n else if (Guards.isValueProvider(provider)) {\n return [provider.useValue];\n }\n else if (Guards.isFactoryProvider(provider)) {\n return [provider.useFactory(this.container)];\n }\n else if (Guards.isExistingProvider(provider)) {\n return this.container.get(provider.useExisting, { multi: true });\n }\n return assertNever(provider);\n }\n}\n/**\n * An error that occurs when an async provider is requested in a synchronous context.\n *\n * @internal\n */\nclass AsyncProvidersInSyncInjectionContextError extends Error {\n token;\n constructor(token) {\n super(`Some providers for token ${toString(token)} are async, please use injectAsync() or container.getAsync() instead`);\n this.token = token;\n }\n}\nclass CircularDependencyError extends Error {\n constructor(graph) {\n super(`Detected circular dependency: ${graph.join(\" -> \")}. Please change your dependency graph or use lazy injection instead.`);\n }\n}\n//# sourceMappingURL=factory.js.map","import { Container } from \"./container.js\";\nexport function inject(token, options) {\n try {\n return _currentContext.run((container) => container.get(token, options));\n }\n catch (error) {\n if (error instanceof NeedsInjectionContextError && options?.optional === true) {\n return undefined;\n }\n throw error;\n }\n}\nexport function injectAsync(token, options) {\n try {\n if (options?.lazy) {\n return _currentContext.run((container) => container.getAsync(token, { ...options, lazy: true }));\n }\n return _currentContext.runAsync((container) => container.getAsync(token, { ...options, lazy: false }));\n }\n catch (error) {\n if (error instanceof NeedsInjectionContextError && options?.optional === true) {\n return Promise.resolve(undefined);\n }\n return Promise.reject(error);\n }\n}\n/**\n * The global context does not allow dependency injection.\n *\n * @internal\n */\nclass GlobalContext {\n run() {\n throw new NeedsInjectionContextError();\n }\n runAsync() {\n throw new NeedsInjectionContextError();\n }\n}\n/**\n * An injection context allows to perform dependency injection with `inject()` and `injectAsync()`.\n *\n * @internal\n */\nclass InjectionContext {\n container;\n constructor(container) {\n this.container = container;\n }\n run(block) {\n const originalContext = _currentContext;\n try {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n _currentContext = this;\n return block(this.container);\n }\n finally {\n _currentContext = originalContext;\n }\n }\n async runAsync(block) {\n const originalContext = _currentContext;\n try {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n _currentContext = this;\n return await block(this.container);\n }\n finally {\n _currentContext = originalContext;\n }\n }\n}\nlet _currentContext = new GlobalContext();\n/**\n * Creates a new injection context.\n *\n * @internal\n */\nexport function injectionContext(container) {\n return new InjectionContext(container);\n}\n/**\n * An error that occurs when `inject()` or `injectAsync()` is used outside an injection context.\n *\n * @internal\n */\nclass NeedsInjectionContextError extends Error {\n constructor() {\n super(`You can only invoke inject() or injectAsync() within an injection context`);\n }\n}\n//# sourceMappingURL=context.js.map","import { isClassToken, toString, isInjectionToken, getToken } from \"./tokens.js\";\nimport * as Guards from \"./providers.js\";\nimport { getInjectableTargets, isInjectable } from \"./decorators.js\";\nimport { assertPresent, assertSingle, getParentClasses, promiseTry, windowedSlice } from \"./utils.js\";\nimport { Factory } from \"./factory.js\";\nimport { injectionContext } from \"./context.js\";\n/**\n * A dependency injection (DI) container will keep track of all bindings\n * and hold the actual instances of your services.\n */\nexport class Container {\n providers = new Map();\n singletons = new Map();\n parent;\n factory;\n constructor(parent) {\n this.parent = parent;\n this.factory = new Factory(this);\n this.bind({\n provide: Container,\n useValue: this,\n });\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n bindAll(...providers) {\n providers.forEach((it) => this.bind(it));\n return this;\n }\n /**\n * Binds a provider to this container.\n *\n * {@link https://needle-di.io/concepts/binding.html#binding}\n */\n bind(provider) {\n const token = getToken(provider);\n // running some validations...\n if (Guards.isExistingProvider(provider) && provider.provide === provider.useExisting) {\n throw Error(`The provider for token ${toString(token)} with \"useExisting\" cannot refer to itself.`);\n }\n if (!Guards.isExistingProvider(provider) && this.singletons.has(token)) {\n throw Error(`Cannot bind a new provider for ${toString(token)}, since the existing provider was already constructed.`);\n }\n // ignore the new provider if it was already provided\n if (Guards.isExistingProvider(provider) &&\n Guards.isMultiProvider(provider) &&\n this.existingProviderAlreadyProvided(token, provider.useExisting)) {\n return this;\n }\n const providers = this.providers.get(token) ?? [];\n // validating multi-provider inconsistencies...\n const multi = Guards.isMultiProvider(provider);\n if (multi && providers.some((it) => !Guards.isMultiProvider(it))) {\n throw Error(`Cannot bind ${toString(token)} as multi-provider, since there is already a provider which is not a multi-provider.`);\n }\n else if (!multi && providers.some((it) => Guards.isMultiProvider(it))) {\n if (!providers.every(Guards.isExistingProvider)) {\n throw Error(`Cannot bind ${toString(token)} as provider, since there are already provider(s) that are multi-providers.`);\n }\n }\n // appending or replacing providers...\n this.providers.set(token, multi ? [...providers, provider] : [provider]);\n // inheritance support: also bind parent classes to their immediate child classes\n if (isClassToken(token) && (Guards.isClassProvider(provider) || Guards.isConstructorProvider(provider))) {\n windowedSlice([token, ...getParentClasses(token)]).forEach(([childClass, parentClass]) => {\n const parentProvider = {\n provide: parentClass,\n useExisting: childClass,\n multi: true,\n };\n const existingParentProviders = this.providers.get(parentClass) ?? [];\n if (!this.existingProviderAlreadyProvided(parentClass, childClass)) {\n this.providers.set(parentClass, [...existingParentProviders, parentProvider]);\n }\n });\n }\n return this;\n }\n /**\n * Unbinds a provider.\n *\n * {@link https://needle-di.io/concepts/binding.html#binding}\n */\n unbind(provider) {\n const token = getToken(provider);\n this.providers.delete(token);\n this.singletons.delete(token);\n return this;\n }\n /**\n * Unbinds all providers.\n *\n * {@link https://needle-di.io/concepts/binding.html#binding}\n */\n unbindAll() {\n this.providers.clear();\n this.singletons.clear();\n return this;\n }\n get(token, options) {\n const lazy = options?.lazy ?? false;\n if (lazy) {\n return () => this.get(token, { ...options, lazy: false });\n }\n this.autoBindIfNeeded(token);\n const optional = options?.optional ?? false;\n if (!this.providers.has(token)) {\n if (this.parent) {\n return this.parent.get(token, { ...options, lazy: false });\n }\n if (optional) {\n return undefined;\n }\n throw Error(`No provider(s) found for ${toString(token)}`);\n }\n const providers = assertPresent(this.providers.get(token));\n if (!this.singletons.has(token)) {\n injectionContext(this).run(() => {\n const values = providers.flatMap((provider) => this.factory.construct(provider, token));\n this.singletons.set(token, values);\n });\n }\n const singletons = assertPresent(this.singletons.get(token));\n const multi = options?.multi ?? false;\n if (multi) {\n return singletons;\n }\n else {\n return assertSingle(singletons, () => Error(`Requesting a single value for ${toString(token)}, but multiple values were provided. ` +\n `Consider passing \"{ multi: true }\" to inject all values, or adjust your bindings accordingly.`));\n }\n }\n getAsync(token, options) {\n const lazy = options?.lazy ?? false;\n if (lazy) {\n return () => this.getAsync(token, { ...options, lazy: false });\n }\n return promiseTry(async () => {\n this.autoBindIfNeeded(token);\n const optional = options?.optional ?? false;\n if (!this.providers.has(token)) {\n if (optional) {\n return undefined;\n }\n throw Error(`No provider(s) found for ${toString(token)}`);\n }\n const providers = assertPresent(this.providers.get(token));\n if (!this.singletons.has(token)) {\n await injectionContext(this).runAsync(async () => {\n const values = await Promise.all(providers.map((it) => this.factory.constructAsync(it)));\n this.singletons.set(token, values.flat());\n });\n }\n const singletons = assertPresent(this.singletons.get(token));\n const multi = options?.multi ?? false;\n if (multi) {\n return singletons;\n }\n else {\n return assertSingle(singletons, () => new Error(`Requesting a single value for ${toString(token)}, but multiple values were provided. ` +\n `Consider passing \"{ multi: true }\" to inject all values, or adjust your bindings accordingly.`));\n }\n });\n }\n /**\n * Creates a child container.\n *\n * {@link https://needle-di.io/advanced/child-containers.html}\n */\n createChild() {\n return new Container(this);\n }\n /**\n * Returns whether the container has one or more providers for this token.\n */\n has(token) {\n return this.providers.has(token) || (this.parent?.has(token) ?? false);\n }\n autoBindIfNeeded(token) {\n if (this.singletons.has(token)) {\n return;\n }\n if (isClassToken(token) && isInjectable(token)) {\n const targetClasses = getInjectableTargets(token);\n targetClasses\n .filter((targetClass) => !this.providers.has(targetClass))\n .forEach((targetClass) => {\n this.bind({\n provide: targetClass,\n useClass: targetClass,\n multi: true,\n });\n });\n }\n else if (!this.providers.has(token) && isInjectionToken(token) && token.options?.factory) {\n const async = token.options.async;\n if (!async) {\n this.bind({\n provide: token,\n async: false,\n useFactory: token.options.factory,\n });\n }\n else if (async) {\n this.bind({\n provide: token,\n async: true,\n useFactory: token.options.factory,\n });\n }\n }\n }\n existingProviderAlreadyProvided(token, existingToken) {\n return (this.providers.get(token) ?? []).some((it) => Guards.isExistingProvider(it) && it.provide === token && it.useExisting === existingToken);\n }\n}\n/**\n * Bootstraps a new container and obtains a service using the provided token.\n */\nexport function bootstrap(token) {\n return new Container().get(token);\n}\n/**\n * Bootstraps a new container and obtains a service asynchronously using the provided token.\n */\nexport function bootstrapAsync(token) {\n return new Container().getAsync(token);\n}\n//# sourceMappingURL=container.js.map","import type { GeneralArguments } from '@/declarations';\n\nexport const unexpectedError = new Error(\n\t'[JSONCanvasViewer] This error is unexpected, probably caused by canvas file corruption. If you assure the error is not by accident, please contact the developer and show how to reproduce.',\n);\nexport const destroyError = new Error(\"[JSONCanvasViewer] Resource hasn't been set up or has been disposed.\");\n\nexport interface RuntimeJSONCanvasNode extends JSONCanvasNode {\n\tmdContent?: string;\n\tmdFrontmatter?: Record<string, string>;\n}\n\nexport function makeHook<Args extends GeneralArguments = []>() {\n\ttype MatchingFunc = (...args: Args) => unknown;\n\ttype Hook = {\n\t\t(...args: Args): void;\n\t\tsubs: Set<MatchingFunc>;\n\t\tsubscribe(callback: MatchingFunc): void;\n\t\tunsubscribe(callback: MatchingFunc): void;\n\t};\n\tconst result: Hook = (...args: Args) => {\n\t\tresult.subs.forEach(callback => {\n\t\t\tcallback(...args);\n\t\t});\n\t};\n\tresult.subs = new Set();\n\tresult.subscribe = (callback: MatchingFunc) => {\n\t\tresult.subs.add(callback);\n\t};\n\tresult.unsubscribe = (callback: MatchingFunc) => {\n\t\tresult.subs.delete(callback);\n\t};\n\treturn result;\n}\n","import type { Coordinates, NodeBounds } from '@/declarations';\nimport { makeHook, unexpectedError } from '@/shared';\nimport { BaseModule } from './baseModule';\n\nconst GRID_CELL_SIZE = 800;\nconst INITIAL_VIEWPORT_PADDING = 100;\n\nexport default class DataManager extends BaseModule {\n\tprivate spatialGrid: Record<string, Array<JSONCanvasNode>> | null = null;\n\thooks = {\n\t\tonToggleFullscreen: makeHook<[boolean]>(),\n\t\tonCanvasFetched: makeHook(),\n\t};\n\tdata = {\n\t\tcanvasData: undefined as unknown as JSONCanvas,\n\t\tnodeMap: {} as Record<string, JSONCanvasNode>,\n\t\tcanvasBaseDir: undefined as unknown as string,\n\t\tnodeBounds: undefined as unknown as NodeBounds,\n\t\toffsetX: 0,\n\t\toffsetY: 0,\n\t\tscale: 1,\n\t\tcontainer: document.createElement('div'),\n\t};\n\n\tloadCanvas = async () => {\n\t\tconst path = this.options.canvasPath;\n\t\ttry {\n\t\t\tthis.resolvePath(path);\n\t\t\tthis.data.canvasData = await fetch(path).then(res => res.json());\n\t\t\tthis.data.canvasData.nodes.forEach((node: JSONCanvasNode) => {\n\t\t\t\tif (node.type === 'file' && node.file && !node.file.includes('http')) {\n\t\t\t\t\tconst file = node.file.split('/');\n\t\t\t\t\tnode.file = file[file.length - 1];\n\t\t\t\t}\n\t\t\t\tthis.data.nodeMap[node.id] = node;\n\t\t\t});\n\t\t\tthis.data.nodeBounds = this.calculateNodeBounds();\n\t\t\tthis.buildSpatialGrid();\n\t\t\tthis.hooks.onCanvasFetched();\n\t\t} catch (err) {\n\t\t\tconsole.error('Failed to load canvas data:', err);\n\t\t}\n\t};\n\n\tprivate resolvePath = (path: string) => {\n\t\tif (/^https?:\\/\\//.test(path)) this.data.canvasBaseDir = path.substring(0, path.lastIndexOf('/') + 1);\n\t\telse {\n\t\t\tconst lastSlash = path.lastIndexOf('/');\n\t\t\tthis.data.canvasBaseDir = lastSlash !== -1 ? path.substring(0, lastSlash + 1) : './';\n\t\t}\n\t};\n\n\tfindNodeAt = (screenCoords: Coordinates) => {\n\t\tconst { x, y } = this.C2W(this.C2C({ x: screenCoords.x, y: screenCoords.y }));\n\t\tlet candidates: Array<JSONCanvasNode> = [];\n\t\tif (!this.spatialGrid) candidates = this.data.canvasData.nodes;\n\t\telse {\n\t\t\tconst col = Math.floor(x / GRID_CELL_SIZE);\n\t\t\tconst row = Math.floor(y / GRID_CELL_SIZE);\n\t\t\tconst key = `${col},${row}`;\n\t\t\tcandidates = this.spatialGrid[key] || [];\n\t\t}\n\t\tfor (const node of candidates) {\n\t\t\tif (\n\t\t\t\tx < node.x ||\n\t\t\t\tx > node.x + node.width ||\n\t\t\t\ty < node.y ||\n\t\t\t\ty > node.y + node.height ||\n\t\t\t\tthis.judgeInteract(node) === 'non-interactive'\n\t\t\t)\n\t\t\t\tcontinue;\n\t\t\treturn node;\n\t\t}\n\t\treturn null;\n\t};\n\n\t// how should the app handle node interactions\n\tprivate judgeInteract = (node: JSONCanvasNode | null) => {\n\t\tconst type = !node ? 'default' : node.type;\n\t\tswitch (type) {\n\t\t\tcase 'text':\n\t\t\tcase 'link':\n\t\t\t\treturn 'select';\n\t\t\tcase 'file': {\n\t\t\t\tconst file = node?.file;\n\t\t\t\tif (!file) throw unexpectedError;\n\t\t\t\tif (file.match(/\\.(md|wav|mp3)$/i)) return 'select';\n\t\t\t\telse return 'non-interactive';\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\treturn 'non-interactive';\n\t\t}\n\t};\n\n\tprivate calculateNodeBounds() {\n\t\tlet minX = Infinity,\n\t\t\tminY = Infinity,\n\t\t\tmaxX = -Infinity,\n\t\t\tmaxY = -Infinity;\n\t\tthis.data.canvasData.nodes.forEach(node => {\n\t\t\tminX = Math.min(minX, node.x);\n\t\t\tminY = Math.min(minY, node.y);\n\t\t\tmaxX = Math.max(maxX, node.x + node.width);\n\t\t\tmaxY = Math.max(maxY, node.y + node.height);\n\t\t});\n\t\tconst width = maxX - minX;\n\t\tconst height = maxY - minY;\n\t\tconst centerX = minX + width / 2;\n\t\tconst centerY = minY + height / 2;\n\t\treturn { minX, minY, maxX, maxY, width, height, centerX, centerY };\n\t}\n\n\tprivate buildSpatialGrid() {\n\t\tconst canvasData = this.data.canvasData;\n\t\tif (canvasData.nodes.length < 50) return;\n\t\tthis.spatialGrid = {};\n\t\tfor (const node of canvasData.nodes) {\n\t\t\tconst minCol = Math.floor(node.x / GRID_CELL_SIZE);\n\t\t\tconst maxCol = Math.floor((node.x + node.width) / GRID_CELL_SIZE);\n\t\t\tconst minRow = Math.floor(node.y / GRID_CELL_SIZE);\n\t\t\tconst maxRow = Math.floor((node.y + node.height) / GRID_CELL_SIZE);\n\t\t\tfor (let col = minCol; col <= maxCol; col++) {\n\t\t\t\tfor (let row = minRow; row <= maxRow; row++) {\n\t\t\t\t\tconst key = `${col},${row}`;\n\t\t\t\t\tif (!this.spatialGrid[key]) this.spatialGrid[key] = [];\n\t\t\t\t\tthis.spatialGrid[key].push(node);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tzoom = (factor: number, origin: Coordinates) => {\n\t\tconst newScale = this.data.scale * factor;\n\t\tthis.zoomToScale(newScale, origin);\n\t};\n\tzoomToScale = (newScale: number, origin: Coordinates) => {\n\t\tconst validNewScale = Math.max(Math.min(newScale, 20), 0.05);\n\t\tconst scale = this.data.scale;\n\t\tif (validNewScale === scale) return;\n\t\tconst canvasCoords = this.C2C(origin);\n\t\tthis.data.offsetX = origin.x - (canvasCoords.x * validNewScale) / scale;\n\t\tthis.data.offsetY = origin.y - (canvasCoords.y * validNewScale) / scale;\n\t\tthis.data.scale = validNewScale;\n\t};\n\tpan = ({ x, y }: Coordinates) => {\n\t\tthis.data.offsetX = this.data.offsetX + x;\n\t\tthis.data.offsetY = this.data.offsetY + y;\n\t};\n\tpanToCoords = ({ x, y }: Coordinates) => {\n\t\tthis.data.offsetX = x;\n\t\tthis.data.offsetY = y;\n\t};\n\tshiftFullscreen = (option: string = 'toggle') => {\n\t\tif (!document.fullscreenElement && (option === 'toggle' || option === 'enter')) {\n\t\t\tthis.data.container.requestFullscreen();\n\t\t\tthis.hooks.onToggleFullscreen(true);\n\t\t} else if (document.fullscreenElement && (option === 'toggle' || option === 'exit')) {\n\t\t\tdocument.exitFullscreen();\n\t\t\tthis.hooks.onToggleFullscreen(false);\n\t\t}\n\t};\n\tresetView = () => {\n\t\tconst bounds = this.data.nodeBounds;\n\t\tconst container = this.data.container;\n\t\tif (!bounds || !container) return;\n\t\tconst contentWidth = bounds.width + INITIAL_VIEWPORT_PADDING * 2;\n\t\tconst contentHeight = bounds.height + INITIAL_VIEWPORT_PADDING * 2;\n\t\t// Use logical dimensions for scaling calculations\n\t\tconst viewWidth = container.clientWidth;\n\t\tconst viewHeight = container.clientHeight;\n\t\tconst scaleX = viewWidth / contentWidth;\n\t\tconst scaleY = viewHeight / contentHeight;\n\t\tconst newScale = Math.round(Math.min(scaleX, scaleY) * 1000) / 1000;\n\t\tconst contentCenterX = bounds.centerX;\n\t\tconst contentCenterY = bounds.centerY;\n\t\tconst initialView = {\n\t\t\tscale: newScale,\n\t\t\toffsetX: viewWidth / 2 - contentCenterX * newScale,\n\t\t\toffsetY: viewHeight / 2 - contentCenterY * newScale,\n\t\t};\n\t\tthis.data.offsetX = initialView.offsetX;\n\t\tthis.data.offsetY = initialView.offsetY;\n\t\tthis.data.scale = initialView.scale;\n\t};\n\n\t// Container to Canvas\n\tprivate C2C = ({ x: containerX, y: containerY }: Coordinates) => ({\n\t\tx: containerX - this.data.offsetX,\n\t\ty: containerY - this.data.offsetY,\n\t});\n\t// Canvas to World\n\tprivate C2W = ({ x: canvasX, y: canvasY }: Coordinates) => ({\n\t\tx: canvasX / this.data.scale,\n\t\ty: canvasY / this.data.scale,\n\t});\n\n\tmiddleViewer = () => {\n\t\tconst container = this.data.container;\n\t\treturn {\n\t\t\tx: container.clientWidth / 2,\n\t\t\ty: container.clientHeight / 2,\n\t\t\twidth: container.clientWidth,\n\t\t\theight: container.clientHeight,\n\t\t};\n\t};\n\n\tdispose = () => {\n\t\tthis.data.container.remove();\n\t};\n}\n","import { type BaseArgs, BaseModule } from '@/baseModule';\nimport DataManager from '@/dataManager';\nimport { makeHook } from '@/shared';\nimport style from '@/styles.scss?inline';\n\ntype Options = {\n\tnoShadow?: boolean;\n};\n\nexport default class Controller extends BaseModule<Options> {\n\tprivate animationId: null | number = null;\n\tprivate resizeAnimationId: null | number = null;\n\tprivate DM: DataManager;\n\tprivate 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: makeHook<[number, number]>(),\n\t\tonRefresh: makeHook(),\n\t};\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tthis.DM = this.container.get(DataManager);\n\t\tthis.DM.hooks.onCanvasFetched.subscribe(this.onFetched);\n\n\t\tconst parentContainer = this.options.container;\n\t\twhile (parentContainer.firstElementChild) parentContainer.firstElementChild.remove();\n\t\tparentContainer.innerHTML = '';\n\n\t\tconst noShadow = this.options.noShadow || false;\n\t\tconst realContainer = noShadow ? parentContainer : parentContainer.attachShadow({ mode: 'open' });\n\n\t\tthis.utilities.applyStyles(realContainer, style);\n\n\t\tconst HTMLContainer = this.DM.data.container;\n\t\tHTMLContainer.classList.add('container');\n\t\trealContainer.appendChild(HTMLContainer);\n\t}\n\n\tprivate onFetched = () => {\n\t\tthis.DM.resetView();\n\t\tthis.resizeObserver.observe(this.DM.data.container);\n\t\tthis.animationId = requestAnimationFrame(this.draw);\n\t};\n\n\tprivate draw = () => {\n\t\tif (\n\t\t\tthis.perFrame.lastScale !== this.DM.data.scale ||\n\t\t\tthis.perFrame.lastOffsets.x !== this.DM.data.offsetX ||\n\t\t\tthis.perFrame.lastOffsets.y !== this.DM.data.offsetY\n\t\t)\n\t\t\tthis.refresh();\n\t\tthis.animationId = requestAnimationFrame(this.draw);\n\t};\n\n\tprivate refresh = () => {\n\t\tthis.perFrame.lastScale = this.DM.data.scale;\n\t\tthis.perFrame.lastOffsets = {\n\t\t\tx: this.DM.data.offsetX,\n\t\t\ty: this.DM.data.offsetY,\n\t\t};\n\t\tthis.hooks.onRefresh();\n\t};\n\n\tprivate onResize = () => {\n\t\tthis.resizeAnimationId = requestAnimationFrame(() => {\n\t\t\tconst center = this.DM.middleViewer();\n\t\t\tif (this.lastResizeCenter.x && this.lastResizeCenter.y) {\n\t\t\t\tthis.DM.data.offsetX = this.DM.data.offsetX + center.x - this.lastResizeCenter.x;\n\t\t\t\tthis.DM.data.offsetY = this.DM.data.offsetY + center.y - this.lastResizeCenter.y;\n\t\t\t}\n\t\t\tthis.lastResizeCenter.x = center.x;\n\t\t\tthis.lastResizeCenter.y = center.y;\n\t\t\tthis.hooks.onResize(center.width, center.height);\n\t\t\tthis.refresh();\n\t\t});\n\t};\n\tprivate resizeObserver: ResizeObserver = new ResizeObserver(this.onResize);\n\n\tdispose = () => {\n\t\tif (this.animationId) cancelAnimationFrame(this.animationId);\n\t\tif (this.resizeAnimationId) cancelAnimationFrame(this.resizeAnimationId);\n\t\tthis.resizeObserver.disconnect();\n\t};\n}\n","import Purify from 'dompurify';\nimport { micromark } from 'micromark';\nimport { gfm, gfmHtml } from 'micromark-extension-gfm';\nimport { type BaseArgs, BaseModule } from '@/baseModule';\nimport Controller from '@/controller';\nimport DataManager from '@/dataManager';\nimport InteractionHandler from '@/interactionHandler';\nimport { destroyError, makeHook, type RuntimeJSONCanvasNode, unexpectedError } from '@/shared';\n\nexport default class OverlayManager extends BaseModule {\n\tprivate _overlaysLayer: HTMLDivElement | null = document.createElement('div');\n\tprivate overlays: Record<string, HTMLDivElement> = {}; // { id: node } the overlays in viewport\n\tprivate selectedId: string | null = null;\n\tprivate eventListeners: Record<string, Array<EventListener | null>> = {};\n\tprivate DM: DataManager;\n\tprivate IH: () => InteractionHandler;\n\tprivate parser = (markdown: string) =>\n\t\tmicromark(markdown, { extensions: [gfm()], htmlExtensions: [gfmHtml()] });\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: makeHook(),\n\t\tonInteractionEnd: makeHook(),\n\t};\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tthis.DM = this.container.get(DataManager);\n\t\tthis.IH = this.container.get(InteractionHandler, { lazy: true });\n\t\tconst controller = this.container.get(Controller);\n\t\tthis.DM.hooks.onCanvasFetched.subscribe(this.onFetched);\n\t\tcontroller.hooks.onRefresh.subscribe(this.updateOverlays);\n\n\t\tthis._overlaysLayer = document.createElement('div');\n\t\tthis._overlaysLayer.className = 'overlays';\n\t\tthis.DM.data.container.appendChild(this.overlaysLayer);\n\t}\n\n\tprivate onFetched = () => {\n\t\tthis.IH().onClick.subscribe(this.select);\n\t\tconst cbd = this.DM.data.canvasBaseDir;\n\t\tconst overlayCreators = {\n\t\t\ttext: (node: RuntimeJSONCanvasNode) => {\n\t\t\t\tif (!node.text) throw unexpectedError;\n\t\t\t\tthis.updateOrCreateOverlay(node, node.text, 'text');\n\t\t\t},\n\t\t\tfile: (node: RuntimeJSONCanvasNode) => {\n\t\t\t\tif (!node.file) throw unexpectedError;\n\t\t\t\tif (node.file.match(/\\.md$/i)) this.loadMarkdownForNode(node);\n\t\t\t\telse if (node.file.match(/\\.(png|jpg|jpeg|gif|svg|webp)$/i))\n\t\t\t\t\tthis.updateOrCreateOverlay(node, cbd + node.file, 'image');\n\t\t\t\telse if (node.file.match(/\\.(mp3|wav)$/i))\n\t\t\t\t\tthis.updateOrCreateOverlay(node, cbd + node.file, 'audio');\n\t\t\t},\n\t\t\tlink: (node: RuntimeJSONCanvasNode) => {\n\t\t\t\tif (!node.url) throw unexpectedError;\n\t\t\t\tthis.updateOrCreateOverlay(node, node.url, 'link');\n\t\t\t},\n\t\t\tgroup: () => {},\n\t\t};\n\t\tObject.values(this.DM.data.nodeMap).forEach(node => {\n\t\t\toverlayCreators[node.type](node);\n\t\t});\n\t};\n\n\tprivate select = (id: string | null) => {\n\t\tconst previous = !this.selectedId ? null : this.overlays[this.selectedId];\n\t\tconst current = !id ? null : this.overlays[id];\n\t\tif (previous) previous.classList.remove('active');\n\t\tif (current) {\n\t\t\tcurrent.classList.add('active');\n\t\t\tthis.hooks.onInteractionStart();\n\t\t} else this.hooks.onInteractionEnd();\n\t\tthis.selectedId = id;\n\t};\n\n\tprivate loadMarkdownForNode = async (node: RuntimeJSONCanvasNode) => {\n\t\tif (!node.mdContent) {\n\t\t\tnode.mdContent = 'Loading...';\n\t\t\tthis.updateOrCreateOverlay(node, node.mdContent, 'markdown');\n\t\t\ttry {\n\t\t\t\tif (!node.file) throw unexpectedError;\n\t\t\t\tconst response = await fetch(this.DM.data.canvasBaseDir + node.file);\n\t\t\t\tconst result = await response.text();\n\t\t\t\tconst frontmatterMatch = result.match(/^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/);\n\t\t\t\tif (frontmatterMatch) {\n\t\t\t\t\tconst frontmatter = frontmatterMatch[1]\n\t\t\t\t\t\t.split('\\n')\n\t\t\t\t\t\t.reduce((acc: Record<string, string>, line) => {\n\t\t\t\t\t\t\tconst [key, value] = line.split(':').map(s => s.trim());\n\t\t\t\t\t\t\tacc[key] = value;\n\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t}, {});\n\t\t\t\t\tnode.mdContent = Purify.sanitize(this.parser(frontmatterMatch[2].trim()));\n\t\t\t\t\tnode.mdFrontmatter = frontmatter;\n\t\t\t\t} else node.mdContent = Purify.sanitize(this.parser(result));\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error('[JSONCanvasViewer] Failed to load markdown:', err);\n\t\t\t\tnode.mdContent = 'Failed to load content.';\n\t\t\t}\n\t\t}\n\t\tthis.updateOrCreateOverlay(node, node.mdContent, 'markdown');\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 updateOrCreateOverlay(node: RuntimeJSONCanvasNode, 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\tif (element.style.display === 'none') element.style.display = 'flex';\n\t\tif (type === 'markdown') {\n\t\t\tconst parsedContentContainer = element.getElementsByClassName('parsed-content-wrapper')[0];\n\t\t\tif (!node.mdContent) throw unexpectedError;\n\t\t\tif (parsedContentContainer.innerHTML !== node.mdContent)\n\t\t\t\tparsedContentContainer.innerHTML = node.mdContent;\n\t\t\tif (!element.classList.contains('rtl') && node.mdFrontmatter?.direction === 'rtl')\n\t\t\t\telement.classList.add('rtl');\n\t\t}\n\t}\n\n\tprivate async constructOverlay(node: RuntimeJSONCanvasNode, content: string, type: string) {\n\t\tconst color = this.utilities.getColor(node.color);\n\t\tconst overlay = document.createElement('div');\n\t\toverlay.classList.add('overlay-container');\n\t\toverlay.id = node.id;\n\t\toverlay.style.backgroundColor = color.background;\n\t\toverlay.style.setProperty('--active-color', color.active);\n\t\tswitch (type) {\n\t\t\tcase 'text':\n\t\t\tcase 'markdown': {\n\t\t\t\toverlay.classList.add('markdown-content');\n\t\t\t\tconst parsedContentWrapper = document.createElement('div');\n\t\t\t\tparsedContentWrapper.innerHTML = Purify.sanitize(this.parser(content || ''));\n\t\t\t\tparsedContentWrapper.classList.add('parsed-content-wrapper');\n\t\t\t\toverlay.appendChild(parsedContentWrapper);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'link': {\n\t\t\t\tconst iframe = document.createElement('iframe');\n\t\t\t\tiframe.src = content;\n\t\t\t\tiframe.sandbox = 'allow-scripts allow-same-origin';\n\t\t\t\tiframe.className = 'link-iframe';\n\t\t\t\tiframe.loading = 'lazy';\n\t\t\t\toverlay.appendChild(iframe);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'audio': {\n\t\t\t\tconst audio = document.createElement('audio');\n\t\t\t\taudio.className = 'audio';\n\t\t\t\taudio.src = content;\n\t\t\t\taudio.controls = true;\n\t\t\t\toverlay.appendChild(audio);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'image': {\n\t\t\t\tconst img = document.createElement('img');\n\t\t\t\timg.src = content;\n\t\t\t\timg.loading = 'lazy';\n\t\t\t\toverlay.appendChild(img);\n\t\t\t}\n\t\t}\n\t\tswitch (type) {\n\t\t\tcase 'link':\n\t\t\tcase 'audio': {\n\t\t\t\tconst clickLayer = document.createElement('div');\n\t\t\t\tclickLayer.className = 'click-layer';\n\t\t\t\toverlay.appendChild(clickLayer);\n\t\t\t}\n\t\t}\n\t\tconst overlayBorder = document.createElement('div');\n\t\toverlayBorder.className = 'overlay-border';\n\t\toverlayBorder.style.borderColor = color.border;\n\t\toverlay.appendChild(overlayBorder);\n\t\tconst onStart = () => {\n\t\t\tif (node.id === this.selectedId) this.hooks.onInteractionStart();\n\t\t};\n\t\tconst onEnd = () => {\n\t\t\tif (node.id === this.selectedId) this.hooks.onInteractionEnd();\n\t\t};\n\t\toverlay.addEventListener('pointerenter', onStart);\n\t\toverlay.addEventListener('pointerleave', onEnd);\n\t\toverlay.addEventListener('touchstart', onStart);\n\t\toverlay.addEventListener('touchend', onEnd);\n\t\tthis.eventListeners[node.id] = [onStart, onEnd];\n\t\treturn overlay;\n\t}\n\n\tdispose = () => {\n\t\twhile (this.overlaysLayer.firstElementChild) {\n\t\t\tconst child = this.overlaysLayer.firstElementChild;\n\t\t\tif (this.eventListeners[child.id]) {\n\t\t\t\tconst onStart = this.eventListeners[child.id][0];\n\t\t\t\tconst onEnd = this.eventListeners[child.id][1];\n\t\t\t\tif (!onStart || !onEnd) throw destroyError;\n\t\t\t\tchild.removeEventListener('pointerenter', onStart);\n\t\t\t\tchild.removeEventListener('pointerleave', onEnd);\n\t\t\t\tchild.removeEventListener('touchstart', onStart);\n\t\t\t\tchild.removeEventListener('touchend', onEnd);\n\t\t\t\tthis.eventListeners[child.id][0] = null;\n\t\t\t\tthis.eventListeners[child.id][1] = null;\n\t\t\t}\n\t\t\tchild.remove();\n\t\t}\n\t\tthis.overlaysLayer.remove();\n\t\tthis._overlaysLayer = null;\n\t};\n}\n","import {\n\tClick,\n\ttype Ctors,\n\tDrag,\n\tMultitouchPanZoom,\n\tPointeract,\n\tPreventDefault,\n\ttype StdEvents,\n\tWheelPanZoom,\n} from 'pointeract';\nimport { type BaseArgs, BaseModule } from '@/baseModule';\nimport DataManager from '@/dataManager';\nimport OverlayManager from '@/overlayManager';\nimport { makeHook } from '@/shared';\n\ntype Options = {\n\tinteractions?: {\n\t\tproControlSchema?: boolean;\n\t\tzoomFactor?: number;\n\t\tlockControlSchema?: boolean;\n\t};\n};\n\nexport default class InteractionHandler extends BaseModule<Options> {\n\tprivate pointeract: Pointeract<Ctors<[Click, Drag, WheelPanZoom, PreventDefault, MultitouchPanZoom]>>;\n\tprivate DM: DataManager;\n\tprivate OM: OverlayManager;\n\tonClick = makeHook<[string | null]>();\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tthis.DM = this.container.get(DataManager);\n\t\tthis.OM = this.container.get(OverlayManager);\n\t\tconst options = Object.assign(\n\t\t\t{ proControlSchema: false, zoomFactor: 0.1, lockControlSchema: false },\n\t\t\tthis.options.interactions || {},\n\t\t);\n\t\tthis.pointeract = new Pointeract(\n\t\t\tthis.DM.data.container,\n\t\t\t[Click, Drag, WheelPanZoom, PreventDefault, MultitouchPanZoom],\n\t\t\toptions,\n\t\t);\n\t\tthis.startInteraction = this.pointeract.start;\n\t\tthis.stopInteraction = this.pointeract.stop;\n\t\tconst OM = this.container.get(OverlayManager);\n\t\tOM.hooks.onInteractionStart.subscribe(this.stopInteraction);\n\t\tOM.hooks.onInteractionEnd.subscribe(this.startInteraction);\n\t\tthis.DM.hooks.onCanvasFetched.subscribe(this.onFetched);\n\t}\n\tstopInteraction: Pointeract['stop'];\n\tstartInteraction: Pointeract['start'];\n\n\tprivate onFetched = () => {\n\t\tthis.pointeract.on('pan', this.onPan);\n\t\tthis.pointeract.on('drag', this.onPan);\n\t\tthis.pointeract.on('zoom', this.onZoom);\n\t\tthis.pointeract.on('trueClick', this.onTrueClick);\n\t\tthis.pointeract.start();\n\t};\n\n\tprivate onPan = (event: StdEvents['pan']) => {\n\t\tthis.DM.pan(event.detail);\n\t};\n\tprivate onZoom = (event: StdEvents['zoom']) => {\n\t\tconst detail = event.detail;\n\t\tthis.DM.zoom(detail.factor, { x: detail.x, y: detail.y });\n\t};\n\n\tprivate onTrueClick = (e: StdEvents['trueClick']) => {\n\t\tconst detail = e.detail;\n\t\tfunction isUIControl(target: HTMLElement | null) {\n\t\t\tif (!target) return false;\n\t\t\treturn target.closest('.controls') || target.closest('button') || target.closest('input');\n\t\t}\n\t\tif (isUIControl(e.detail.target as HTMLElement | null)) return;\n\t\tconst node = this.DM.findNodeAt({ x: detail.x, y: detail.y });\n\t\tthis.onClick(node ? node.id : null);\n\t};\n\n\tdispose = () => {\n\t\tthis.pointeract.off('pan', this.onPan);\n\t\tthis.pointeract.off('zoom', this.onZoom);\n\t\tthis.pointeract.off('trueClick', this.onTrueClick);\n\t\tthis.pointeract.dispose();\n\t};\n}\n","import { type BaseArgs, BaseModule } from '@/baseModule';\nimport Controller from '@/controller';\nimport DataManager from '@/dataManager';\nimport { destroyError, unexpectedError } from '@/shared';\n\ninterface viewport {\n\tleft: number;\n\tright: number;\n\ttop: number;\n\tbottom: number;\n}\n\ninterface RuntimeJSONCanvasEdge extends JSONCanvasEdge {\n\tcontrolPoints?: Array<number>;\n}\n\nconst ARROW_LENGTH = 12;\nconst ARROW_WIDTH = 7;\nconst NODE_RADIUS = 12;\nconst FONT_COLOR = '#fff';\nconst CSS_ZOOM_REDRAW_INTERVAL = 500;\n\nexport default class Renderer extends BaseModule {\n\tprivate _canvas: HTMLCanvasElement | null;\n\tprivate ctx: CanvasRenderingContext2D;\n\tprivate DM: DataManager;\n\tprivate zoomInOptimize: {\n\t\tlastDrawnScale: number;\n\t\tlastDrawnViewport: viewport;\n\t\ttimeout: NodeJS.Timeout | null;\n\t\tlastCallTime: number;\n\t} = {\n\t\tlastDrawnScale: 0,\n\t\tlastDrawnViewport: {\n\t\t\tleft: 0,\n\t\t\tright: 0,\n\t\t\ttop: 0,\n\t\t\tbottom: 0,\n\t\t},\n\t\ttimeout: null,\n\t\tlastCallTime: 0,\n\t};\n\n\tprivate get canvas() {\n\t\tif (this._canvas === null) throw destroyError;\n\t\treturn this._canvas;\n\t}\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tconst controller = this.container.get(Controller);\n\t\tcontroller.hooks.onRefresh.subscribe(this.redraw);\n\t\tcontroller.hooks.onResize.subscribe(this.optimizeDPR);\n\t\tthis.DM = this.container.get(DataManager);\n\t\tthis._canvas = document.createElement('canvas');\n\t\tthis._canvas.className = 'main-canvas';\n\t\tthis.ctx = this._canvas.getContext('2d') as CanvasRenderingContext2D;\n\t\tthis.DM.data.container.appendChild(this._canvas);\n\t}\n\n\tprivate optimizeDPR = () => {\n\t\tconst container = this.DM.data.container;\n\t\tthis.utilities.resizeCanvasForDPR(this.canvas, container.offsetWidth, container.offsetHeight);\n\t};\n\n\tprivate redraw = () => {\n\t\tif (this.zoomInOptimize.timeout) {\n\t\t\tclearTimeout(this.zoomInOptimize.timeout);\n\t\t\tthis.zoomInOptimize.timeout = null;\n\t\t}\n\t\tconst now = Date.now();\n\t\tconst offsetX = this.DM.data.offsetX;\n\t\tconst offsetY = this.DM.data.offsetY;\n\t\tconst scale = this.DM.data.scale;\n\t\tconst currentViewport = this.getCurrentViewport(offsetX, offsetY, scale);\n\t\tif (\n\t\t\tthis.isViewportInside(currentViewport, this.zoomInOptimize.lastDrawnViewport) &&\n\t\t\tscale !== this.zoomInOptimize.lastDrawnScale\n\t\t) {\n\t\t\tconst timeSinceLast = now - this.zoomInOptimize.lastCallTime;\n\t\t\tif (timeSinceLast < CSS_ZOOM_REDRAW_INTERVAL) {\n\t\t\t\tthis.zoomInOptimize.timeout = setTimeout(() => {\n\t\t\t\t\tthis.trueRedraw(offsetX, offsetY, scale, currentViewport);\n\t\t\t\t\tthis.zoomInOptimize.lastCallTime = now;\n\t\t\t\t\tthis.zoomInOptimize.timeout = null;\n\t\t\t\t}, 60);\n\t\t\t\tthis.fakeRedraw(currentViewport, scale);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tthis.zoomInOptimize.lastCallTime = now;\n\t\tthis.trueRedraw(offsetX, offsetY, scale, currentViewport);\n\t};\n\n\tprivate trueRedraw(offsetX: number, offsetY: number, scale: number, currentViewport: viewport) {\n\t\tthis.zoomInOptimize.lastDrawnViewport = currentViewport;\n\t\tthis.zoomInOptimize.lastDrawnScale = scale;\n\t\tthis.canvas.style.transform = '';\n\t\tthis.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n\t\tthis.ctx.save();\n\t\tthis.ctx.translate(offsetX, offsetY);\n\t\tthis.ctx.scale(scale, scale);\n\t\tconst canvasData = this.DM.data.canvasData;\n\t\tcanvasData.nodes.forEach(node => {\n\t\t\tswitch (node.type) {\n\t\t\t\tcase 'group':\n\t\t\t\t\tthis.drawGroup(node, scale);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'file':\n\t\t\t\t\tthis.drawFileNode(node);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\t\tcanvasData.edges.forEach(edge => {\n\t\t\tthis.drawEdge(edge);\n\t\t});\n\t\tthis.ctx.restore();\n\t}\n\n\tprivate fakeRedraw(currentViewport: viewport, scale: number) {\n\t\tconst cssScale = scale / this.zoomInOptimize.lastDrawnScale;\n\t\tconst currentOffsetX = (this.zoomInOptimize.lastDrawnViewport.left - currentViewport.left) * scale;\n\t\tconst currentOffsetY = (this.zoomInOptimize.lastDrawnViewport.top - currentViewport.top) * scale;\n\t\tthis.canvas.style.transform = `translate(${currentOffsetX}px, ${currentOffsetY}px) scale(${cssScale})`;\n\t}\n\n\tprivate isViewportInside = (inner: viewport, outer: viewport) =>\n\t\tinner.left > outer.left &&\n\t\tinner.top > outer.top &&\n\t\tinner.right < outer.right &&\n\t\tinner.bottom < outer.bottom;\n\n\tprivate getCurrentViewport = (offsetX: number, offsetY: number, scale: number) => {\n\t\tconst left = -offsetX / scale;\n\t\tconst top = -offsetY / scale;\n\t\tconst container = this.DM.data.container;\n\t\tconst right = left + container.clientWidth / scale;\n\t\tconst bottom = top + container.clientHeight / scale;\n\t\treturn { left, top, right, bottom };\n\t};\n\n\tprivate drawLabelBar = (x: number, y: number, label: string, color: string, scale: number) => {\n\t\tconst barHeight = 30 * scale;\n\t\tconst radius = 6 * scale;\n\t\tconst yOffset = 8 * scale;\n\t\tconst fontSize = 16 * scale;\n\t\tconst xPadding = 6 * scale;\n\t\tthis.ctx.save();\n\t\tthis.ctx.translate(x, y);\n\t\tthis.ctx.scale(1 / scale, 1 / scale);\n\t\tthis.ctx.font = `${fontSize}px 'Inter', sans-serif`;\n\t\tconst barWidth = this.ctx.measureText(label).width + 2 * xPadding;\n\t\tthis.ctx.translate(0, -barHeight - yOffset);\n\t\tthis.ctx.fillStyle = color;\n\t\tthis.ctx.beginPath();\n\t\tthis.ctx.moveTo(radius, 0);\n\t\tthis.ctx.lineTo(barWidth - radius, 0);\n\t\tthis.ctx.quadraticCurveTo(barWidth, 0, barWidth, radius);\n\t\tthis.ctx.lineTo(barWidth, barHeight - radius);\n\t\tthis.ctx.quadraticCurveTo(barWidth, barHeight, barWidth - radius, barHeight);\n\t\tthis.ctx.lineTo(radius, barHeight);\n\t\tthis.ctx.quadraticCurveTo(0, barHeight, 0, barHeight - radius);\n\t\tthis.ctx.lineTo(0, radius);\n\t\tthis.ctx.quadraticCurveTo(0, 0, radius, 0);\n\t\tthis.ctx.closePath();\n\t\tthis.ctx.fill();\n\t\tthis.ctx.fillStyle = FONT_COLOR;\n\t\tthis.ctx.fillText(label, xPadding, barHeight * 0.65);\n\t\tthis.ctx.restore();\n\t};\n\n\tprivate drawNodeBackground = (node: JSONCanvasNode) => {\n\t\tconst colors = this.utilities.getColor(node.color);\n\t\tconst radius = NODE_RADIUS;\n\t\tthis.ctx.globalAlpha = 1.0;\n\t\tthis.ctx.fillStyle = colors.background;\n\t\tthis.utilities.drawRoundRect(\n\t\t\tthis.ctx,\n\t\t\tnode.x + 1,\n\t\t\tnode.y + 1,\n\t\t\tnode.width - 2,\n\t\t\tnode.height - 2,\n\t\t\tradius,\n\t\t);\n\t\tthis.ctx.fill();\n\t\tthis.ctx.strokeStyle = colors.border;\n\t\tthis.ctx.lineWidth = 2;\n\t\tthis.utilities.drawRoundRect(this.ctx, node.x, node.y, node.width, node.height, radius);\n\t\tthis.ctx.stroke();\n\t};\n\n\tprivate drawGroup = (node: JSONCanvasNode, scale: number) => {\n\t\tthis.drawNodeBackground(node);\n\t\tif (node.label)\n\t\t\tthis.drawLabelBar(node.x, node.y, node.label, this.utilities.getColor(node.color).border, scale);\n\t};\n\n\tprivate drawFileNode = (node: JSONCanvasNode) => {\n\t\tif (!node.file) throw unexpectedError;\n\t\tthis.ctx.fillStyle = FONT_COLOR;\n\t\tthis.ctx.font = '16px sans-serif';\n\t\tthis.ctx.fillText(node.file, node.x + 5, node.y - 10);\n\t};\n\n\tprivate drawEdge = (edge: RuntimeJSONCanvasEdge) => {\n\t\tconst { fromNode, toNode } = this.getEdgeNodes(edge);\n\t\tif (!fromNode || !toNode) throw unexpectedError;\n\t\tconst gac = this.utilities.getAnchorCoord;\n\t\tconst [startX, startY] = gac(fromNode, edge.fromSide);\n\t\tconst [endX, endY] = gac(toNode, edge.toSide);\n\t\tlet [startControlX, startControlY, endControlX, endControlY] = [0, 0, 0, 0];\n\t\tif (!edge.controlPoints) {\n\t\t\t[startControlX, startControlY, endControlX, endControlY] = this.getControlPoints(\n\t\t\t\tstartX,\n\t\t\t\tstartY,\n\t\t\t\tendX,\n\t\t\t\tendY,\n\t\t\t\tedge.fromSide,\n\t\t\t\tedge.toSide,\n\t\t\t);\n\t\t\tedge.controlPoints = [startControlX, startControlY, endControlX, endControlY];\n\t\t} else [startControlX, startControlY, endControlX, endControlY] = edge.controlPoints;\n\t\tthis.drawCurvedPath(\n\t\t\tstartX,\n\t\t\tstartY,\n\t\t\tendX,\n\t\t\tendY,\n\t\t\tstartControlX,\n\t\t\tstartControlY,\n\t\t\tendControlX,\n\t\t\tendControlY,\n\t\t);\n\t\tthis.drawArrowhead(endX, endY, endControlX, endControlY);\n\t\tif (edge.label) {\n\t\t\tconst t = 0.5;\n\t\t\tconst x =\n\t\t\t\t(1 - t) ** 3 * startX +\n\t\t\t\t3 * (1 - t) ** 2 * t * startControlX +\n\t\t\t\t3 * (1 - t) * t * t * endControlX +\n\t\t\t\tt ** 3 * endX;\n\t\t\tconst y =\n\t\t\t\t(1 - t) ** 3 * startY +\n\t\t\t\t3 * (1 - t) ** 2 * t * startControlY +\n\t\t\t\t3 * (1 - t) * t * t * endControlY +\n\t\t\t\tt ** 3 * endY;\n\t\t\tthis.ctx.font = '18px sans-serif';\n\t\t\tconst metrics = this.ctx.measureText(edge.label);\n\t\t\tconst padding = 8;\n\t\t\tconst labelWidth = metrics.width + padding * 2;\n\t\t\tconst labelHeight = 20;\n\t\t\tthis.ctx.fillStyle = '#222';\n\t\t\tthis.ctx.beginPath();\n\t\t\tthis.utilities.drawRoundRect(\n\t\t\t\tthis.ctx,\n\t\t\t\tx - labelWidth / 2,\n\t\t\t\ty - labelHeight / 2 - 2,\n\t\t\t\tlabelWidth,\n\t\t\t\tlabelHeight,\n\t\t\t\t4,\n\t\t\t);\n\t\t\tthis.ctx.fill();\n\t\t\tthis.ctx.fillStyle = '#ccc';\n\t\t\tthis.ctx.textAlign = 'center';\n\t\t\tthis.ctx.textBaseline = 'middle';\n\t\t\tthis.ctx.fillText(edge.label, x, y - 2);\n\t\t\tthis.ctx.textAlign = 'left';\n\t\t\tthis.ctx.textBaseline = 'alphabetic';\n\t\t}\n\t};\n\n\tprivate getEdgeNodes = (edge: JSONCanvasEdge) => ({\n\t\tfromNode: this.DM.data.nodeMap[edge.fromNode],\n\t\ttoNode: this.DM.data.nodeMap[edge.toNode],\n\t});\n\n\tprivate getControlPoints = (\n\t\tstartX: number,\n\t\tstartY: number,\n\t\tendX: number,\n\t\tendY: number,\n\t\tfromSide: string,\n\t\ttoSide: string,\n\t) => {\n\t\tconst distanceX = endX - startX;\n\t\tconst distanceY = endY - startY;\n\t\tconst realDistance =\n\t\t\tMath.min(Math.abs(distanceX), Math.abs(distanceY)) +\n\t\t\t0.3 * Math.max(Math.abs(distanceX), Math.abs(distanceY));\n\t\tconst clamp = (val: number, min: number, max: number) => Math.max(min, Math.min(max, val));\n\t\tconst PADDING = clamp(realDistance * 0.5, 60, 300);\n\t\tlet startControlX = startX;\n\t\tlet startControlY = startY;\n\t\tlet endControlX = endX;\n\t\tlet endControlY = endY;\n\t\tswitch (fromSide) {\n\t\t\tcase 'top':\n\t\t\t\tstartControlY = startY - PADDING;\n\t\t\t\tbreak;\n\t\t\tcase 'bottom':\n\t\t\t\tstartControlY = startY + PADDING;\n\t\t\t\tbreak;\n\t\t\tcase 'left':\n\t\t\t\tstartControlX = startX - PADDING;\n\t\t\t\tbreak;\n\t\t\tcase 'right':\n\t\t\t\tstartControlX = startX + PADDING;\n\t\t\t\tbreak;\n\t\t}\n\t\tswitch (toSide) {\n\t\t\tcase 'top':\n\t\t\t\tendControlY = endY - PADDING;\n\t\t\t\tbreak;\n\t\t\tcase 'bottom':\n\t\t\t\tendControlY = endY + PADDING;\n\t\t\t\tbreak;\n\t\t\tcase 'left':\n\t\t\t\tendControlX = endX - PADDING;\n\t\t\t\tbreak;\n\t\t\tcase 'right':\n\t\t\t\tendControlX = endX + PADDING;\n\t\t\t\tbreak;\n\t\t}\n\t\treturn [startControlX, startControlY, endControlX, endControlY];\n\t};\n\n\tprivate drawCurvedPath = (\n\t\tstartX: number,\n\t\tstartY: number,\n\t\tendX: number,\n\t\tendY: number,\n\t\tc1x: number,\n\t\tc1y: number,\n\t\tc2x: number,\n\t\tc2y: number,\n\t) => {\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 = '#ccc';\n\t\tthis.ctx.lineWidth = 2;\n\t\tthis.ctx.stroke();\n\t};\n\n\tprivate drawArrowhead = (tipX: number, tipY: number, fromX: number, fromY: number) => {\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 = '#ccc';\n\t\tthis.ctx.moveTo(tipX, tipY);\n\t\tthis.ctx.lineTo(leftX, leftY);\n\t\tthis.ctx.lineTo(rightX, rightY);\n\t\tthis.ctx.closePath();\n\t\tthis.ctx.fill();\n\t};\n\n\tdispose = () => {\n\t\tif (this.zoomInOptimize.timeout) {\n\t\t\tclearTimeout(this.zoomInOptimize.timeout);\n\t\t\tthis.zoomInOptimize.timeout = null;\n\t\t}\n\t\tthis.canvas.remove();\n\t\tthis._canvas = null;\n\t};\n}\n","import { unexpectedError } from '@/shared';\n\nexport default {\n\tround,\n\tresizeCanvasForDPR,\n\tapplyStyles,\n\tdrawRoundRect,\n\tgetAnchorCoord,\n\tgetColor,\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 [midX, node.y];\n\t\tcase 'bottom':\n\t\t\treturn [midX, node.y + node.height];\n\t\tcase 'left':\n\t\t\treturn [node.x, midY];\n\t\tcase 'right':\n\t\t\treturn [node.x + node.width, midY];\n\t\tdefault:\n\t\t\treturn [midX, midY];\n\t}\n}\n\nfunction getColor(colorIndex: string = '0') {\n\tlet themeColor = null;\n\n\tfunction hexToRgb(hex: string) {\n\t\tconst cleanHex = hex.replace('#', '');\n\t\tconst r = parseInt(cleanHex.substring(0, 2), 16);\n\t\tconst g = parseInt(cleanHex.substring(2, 4), 16);\n\t\tconst b = parseInt(cleanHex.substring(4, 6), 16);\n\t\treturn { r, g, b };\n\t}\n\n\tif (colorIndex.length === 1) {\n\t\tswitch (colorIndex) {\n\t\t\tcase '1':\n\t\t\t\tthemeColor = 'rgba(255, 120, 129, ?)';\n\t\t\t\tbreak;\n\t\t\tcase '2':\n\t\t\t\tthemeColor = 'rgba(251, 187, 131, ?)';\n\t\t\t\tbreak;\n\t\t\tcase '3':\n\t\t\t\tthemeColor = 'rgba(255, 232, 139, ?)';\n\t\t\t\tbreak;\n\t\t\tcase '4':\n\t\t\t\tthemeColor = 'rgba(124, 211, 124, ?)';\n\t\t\t\tbreak;\n\t\t\tcase '5':\n\t\t\t\tthemeColor = 'rgba(134, 223, 226, ?)';\n\t\t\t\tbreak;\n\t\t\tcase '6':\n\t\t\t\tthemeColor = 'rgba(203, 158, 255, ?)';\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthemeColor = 'rgba(140, 140, 140, ?)';\n\t\t}\n\t} else {\n\t\tconst rgb = hexToRgb(colorIndex);\n\t\tthemeColor = `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ?)`;\n\t}\n\treturn {\n\t\tborder: themeColor.replace('?', '0.75'),\n\t\tbackground: themeColor.replace('?', '0.1'),\n\t\tactive: themeColor.replace('?', '1'),\n\t};\n}\n\nfunction resizeCanvasForDPR(canvas: HTMLCanvasElement, width: number, height: number) {\n\tconst dpr = window.devicePixelRatio || 1;\n\tconst ctx = canvas.getContext('2d');\n\tif (!ctx) throw unexpectedError;\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","export { type BaseArgs, BaseModule } from '@/baseModule';\nexport { JSONCanvasViewer } from '@/canvasViewer';\nexport { default as Controls } from '@/controls';\nexport { default as DebugPanel } from '@/debugPanel';\nexport { default as Minimap } from '@/minimap';\nexport { default as MistouchPreventer } from '@/mistouchPreventer';\n\nimport Controller from '@/controller';\nimport DataManager from '@/dataManager';\nimport InteractionHandler from '@/interactionHandler';\nimport OverlayManager from '@/overlayManager';\nimport Renderer from '@/renderer';\nexport const developerSuite = {\n\tController,\n\tDataManager,\n\tInteractionHandler,\n\tRenderer,\n\tOverlayManager,\n};\n","import { type BaseArgs, BaseModule } from '@/baseModule';\nimport Controller from '@/controller';\nimport DataManager from '@/dataManager';\nimport { destroyError } from '@/shared';\nimport style from './styles.scss?inline';\n\ntype Options = {\n\tcontrolsCollapsed?: boolean;\n};\n\nexport default class Controls extends BaseModule<Options> {\n\tprivate _controlsPanel: HTMLDivElement | null = null;\n\tprivate _toggleCollapseBtn: HTMLButtonElement | null = null;\n\tprivate _toggleFullscreenBtn: HTMLButtonElement | null = null;\n\tprivate _zoomOutBtn: HTMLButtonElement | null = null;\n\tprivate _zoomSlider: HTMLInputElement | null = null;\n\tprivate _zoomInBtn: HTMLButtonElement | null = null;\n\tprivate _resetViewBtn: HTMLButtonElement | null = null;\n\tprivate DM: DataManager;\n\tprivate collapsed: boolean;\n\n\tprivate get controlsPanel() {\n\t\tif (this._controlsPanel === null) throw destroyError;\n\t\treturn this._controlsPanel;\n\t}\n\tprivate get toggleCollapseBtn() {\n\t\tif (this._toggleCollapseBtn === null) throw destroyError;\n\t\treturn this._toggleCollapseBtn;\n\t}\n\tprivate get toggleFullscreenBtn() {\n\t\tif (this._toggleFullscreenBtn === null) throw destroyError;\n\t\treturn this._toggleFullscreenBtn;\n\t}\n\tprivate get zoomOutBtn() {\n\t\tif (this._zoomOutBtn === null) throw destroyError;\n\t\treturn this._zoomOutBtn;\n\t}\n\tprivate get zoomSlider() {\n\t\tif (this._zoomSlider === null) throw destroyError;\n\t\treturn this._zoomSlider;\n\t}\n\tprivate get zoomInBtn() {\n\t\tif (this._zoomInBtn === null) throw destroyError;\n\t\treturn this._zoomInBtn;\n\t}\n\tprivate get resetViewBtn() {\n\t\tif (this._resetViewBtn === null) throw destroyError;\n\t\treturn this._resetViewBtn;\n\t}\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tthis.collapsed = this.options.controlsCollapsed || false;\n\t\tthis.DM = this.container.get(DataManager);\n\t\tthis.DM.hooks.onToggleFullscreen.subscribe(this.updateFullscreenBtn);\n\t\tthis.container.get(Controller).hooks.onRefresh.subscribe(this.updateSlider);\n\n\t\tthis._controlsPanel = document.createElement('div');\n\t\tthis._controlsPanel.className = 'controls';\n\t\tthis._controlsPanel.classList.toggle('collapsed', this.collapsed);\n\n\t\tthis.utilities.applyStyles(this._controlsPanel, style);\n\n\t\tthis._toggleCollapseBtn = document.createElement('button');\n\t\tthis._toggleCollapseBtn.className = 'collapse-button';\n\t\tthis._toggleCollapseBtn.innerHTML =\n\t\t\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\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 = `<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>`;\n\t\tcontrolsContent.appendChild(this._toggleFullscreenBtn);\n\n\t\tthis._zoomOutBtn = document.createElement('button');\n\t\tthis._zoomOutBtn.innerHTML =\n\t\t\t'<svg viewBox=\"-1.2 -1.2 26.4 26.4\"><path d=\"M6 12h12\" stroke-width=\"2\" stroke-linecap=\"round\" /></svg>';\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 =\n\t\t\t'<svg viewBox=\"-1.2 -1.2 26.4 26.4\"><path d=\"M6 12h12m-6-6v12\" stroke-width=\"2\" stroke-linecap=\"round\" /></svg>';\n\t\tcontrolsContent.appendChild(this._zoomInBtn);\n\n\t\tthis._resetViewBtn = document.createElement('button');\n\t\tthis._resetViewBtn.innerHTML =\n\t\t\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>';\n\t\tcontrolsContent.appendChild(this._resetViewBtn);\n\n\t\tthis._controlsPanel.appendChild(controlsContent);\n\n\t\tthis.DM.data.container.appendChild(this._controlsPanel);\n\n\t\tthis._toggleCollapseBtn.addEventListener('click', this.toggleCollapse);\n\t\tthis._zoomInBtn.addEventListener('click', this.zoomIn);\n\t\tthis._zoomOutBtn.addEventListener('click', this.zoomOut);\n\t\tthis._zoomSlider.addEventListener('input', this.slide);\n\t\tthis._resetViewBtn.addEventListener('click', this.DM.resetView);\n\t\tthis._toggleFullscreenBtn.addEventListener('click', this.toggleFullscreen);\n\t}\n\ttoggleCollapse = () => this.controlsPanel.classList.toggle('collapsed');\n\tprivate zoomIn = () => this.DM.zoom(1.1, this.DM.middleViewer());\n\tprivate zoomOut = () => this.DM.zoom(1 / 1.1, this.DM.middleViewer());\n\tprivate slide = () => this.DM.zoomToScale(1.1 ** Number(this.zoomSlider.value), this.DM.middleViewer());\n\n\tprivate updateFullscreenBtn = (enter: boolean) => {\n\t\tif (enter)\n\t\t\tthis.toggleFullscreenBtn.innerHTML = `<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>`;\n\t\telse\n\t\t\tthis.toggleFullscreenBtn.innerHTML = `<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>`;\n\t};\n\tprivate toggleFullscreen = () => this.DM.shiftFullscreen('toggle');\n\n\tprivate updateSlider = () => {\n\t\tthis.zoomSlider.value = String(this.scaleToSlider(this.DM.data.scale));\n\t};\n\tprivate scaleToSlider = (scale: number) => Math.log(scale) / Math.log(1.1);\n\n\tdispose = () => {\n\t\tthis.toggleCollapseBtn.removeEventListener('click', this.toggleCollapse);\n\t\tthis.zoomInBtn.removeEventListener('click', this.zoomIn);\n\t\tthis.zoomOutBtn.removeEventListener('click', this.zoomOut);\n\t\tthis.zoomSlider.removeEventListener('input', this.slide);\n\t\tthis.resetViewBtn.removeEventListener('click', this.DM.resetView);\n\t\tthis.toggleFullscreenBtn.removeEventListener('click', this.toggleFullscreen);\n\t\tthis.controlsPanel.remove();\n\t\tthis._controlsPanel = null;\n\t\tthis._toggleCollapseBtn = null;\n\t\tthis._zoomInBtn = null;\n\t\tthis._zoomOutBtn = null;\n\t\tthis._zoomSlider = null;\n\t\tthis._resetViewBtn = null;\n\t\tthis._toggleFullscreenBtn = null;\n\t};\n}\n","import { type BaseArgs, BaseModule } from '@/baseModule';\nimport Controller from '@/controller';\nimport DataManager from '@/dataManager';\nimport { destroyError } from '@/shared';\nimport style from './styles.scss?inline';\n\nexport default class DebugPanel extends BaseModule {\n\tprivate _debugPanel: HTMLDivElement | null = null;\n\tprivate DM: DataManager;\n\n\tprivate get debugPanel() {\n\t\tif (!this._debugPanel) throw destroyError;\n\t\treturn this._debugPanel;\n\t}\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tthis.DM = this.container.get(DataManager);\n\t\tthis.container.get(Controller).hooks.onRefresh.subscribe(this.update);\n\t\tthis._debugPanel = document.createElement('div');\n\t\tthis._debugPanel.className = 'debug-panel';\n\t\tconst HTMLContainer = this.DM.data.container;\n\t\tthis.utilities.applyStyles(HTMLContainer, style);\n\t\tHTMLContainer.appendChild(this._debugPanel);\n\t}\n\n\tprivate update = () => {\n\t\tconst round = this.utilities.round;\n\t\tconst data = this.DM.data;\n\t\tthis.debugPanel.innerHTML = `<p>Scale: ${round(data.scale, 3)}</p><p>Offset: ${round(data.offsetX, 1)}, ${round(data.offsetY, 1)}</p>`;\n\t};\n\n\tdispose = () => {\n\t\tthis.debugPanel.remove();\n\t\tthis._debugPanel = null;\n\t};\n}\n","import { Container } from '@needle-di/core';\nimport type { GeneralModuleCtor } from '@/baseModule';\nimport Controller from '@/controller';\nimport DataManager from '@/dataManager';\nimport type { ModuleInput, Options } from '@/declarations';\nimport InteractionHandler from '@/interactionHandler';\nimport OverlayManager from '@/overlayManager';\nimport Renderer from '@/renderer';\nimport utilities from '@/utilities';\n\ntype InternalModules = [\n\ttypeof DataManager,\n\ttypeof Controller,\n\ttypeof OverlayManager,\n\ttypeof InteractionHandler,\n\ttypeof Renderer,\n];\n\nexport class JSONCanvasViewer<M extends ModuleInput = []> {\n\tprivate options: Options<[...InternalModules, ...M]>;\n\tprivate allModules: ModuleInput;\n\tcontainer: Container;\n\n\tconstructor(options: Options<[...InternalModules, ...M]>, modules?: M) {\n\t\tthis.container = new Container();\n\t\tthis.options = options;\n\t\tconst bind = (Class: GeneralModuleCtor) => {\n\t\t\tthis.container.bind({\n\t\t\t\tprovide: Class,\n\t\t\t\tuseFactory: () => new Class(this.container, this.options, utilities),\n\t\t\t});\n\t\t};\n\t\tthis.allModules = [\n\t\t\tDataManager,\n\t\t\tController,\n\t\t\tOverlayManager,\n\t\t\tInteractionHandler,\n\t\t\tRenderer,\n\t\t\t...(modules || []),\n\t\t];\n\n\t\tthis.allModules.forEach(bind);\n\t\tthis.allModules.forEach(Module => {\n\t\t\tthis.container.get(Module);\n\t\t});\n\t\tthis.container.get(DataManager).loadCanvas();\n\t}\n\n\tdispose = () => {\n\t\tconst container = this.options.container;\n\t\twhile (container.firstChild) container.firstChild.remove();\n\t\tthis.allModules.reverse();\n\t\tthis.allModules.forEach(Module => {\n\t\t\tconst module = this.container.get(Module);\n\t\t\tif (module.dispose) module.dispose();\n\t\t});\n\t};\n}\n","import { type BaseArgs, BaseModule } from '@/baseModule';\nimport Controller from '@/controller';\nimport DataManager from '@/dataManager';\nimport { destroyError } from '@/shared';\nimport style from './styles.scss?inline';\n\ntype Options = {\n\tminimapCollapsed?: boolean;\n};\n\nexport default class Minimap extends BaseModule<Options> {\n\tprivate _minimapCtx: CanvasRenderingContext2D | null = null;\n\tprivate _viewportRectangle: HTMLDivElement | null = null;\n\tprivate _minimap: HTMLDivElement | null = null;\n\tprivate _minimapContainer: HTMLDivElement | null = null;\n\tprivate _toggleMinimapBtn: HTMLButtonElement | null = null;\n\tprivate minimapCache: { scale: number; centerX: number; centerY: number } = {\n\t\tscale: 1,\n\t\tcenterX: 0,\n\t\tcenterY: 0,\n\t};\n\tprivate DM: DataManager;\n\tprivate collapsed: boolean;\n\n\tprivate get minimap() {\n\t\tif (this._minimap === null) throw destroyError;\n\t\treturn this._minimap;\n\t}\n\tprivate get minimapCtx() {\n\t\tif (this._minimapCtx === null) throw destroyError;\n\t\treturn this._minimapCtx;\n\t}\n\tprivate get viewportRectangle() {\n\t\tif (this._viewportRectangle === null) throw destroyError;\n\t\treturn this._viewportRectangle;\n\t}\n\tprivate get minimapContainer() {\n\t\tif (this._minimapContainer === null) throw destroyError;\n\t\treturn this._minimapContainer;\n\t}\n\tprivate get toggleMinimapBtn() {\n\t\tif (this._toggleMinimapBtn === null) throw destroyError;\n\t\treturn this._toggleMinimapBtn;\n\t}\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tthis.collapsed = this.options.minimapCollapsed || false;\n\t\tthis.container.get(Controller).hooks.onRefresh.subscribe(this.updateViewportRectangle);\n\t\tthis.DM = this.container.get(DataManager);\n\t\tthis.DM.hooks.onCanvasFetched.subscribe(this.drawMinimap);\n\n\t\tthis._minimapContainer = document.createElement('div');\n\t\tthis._minimapContainer.className = 'minimap-container';\n\n\t\tthis.utilities.applyStyles(this._minimapContainer, style);\n\n\t\tthis._toggleMinimapBtn = document.createElement('button');\n\t\tthis._toggleMinimapBtn.className = 'toggle-minimap collapse-button';\n\t\tthis._toggleMinimapBtn.innerHTML =\n\t\t\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\t\tthis._minimapContainer.appendChild(this._toggleMinimapBtn);\n\n\t\tthis._minimap = document.createElement('div');\n\t\tthis._minimap.className = 'minimap';\n\t\tconst minimapCanvas = document.createElement('canvas');\n\t\tminimapCanvas.className = 'minimap-canvas';\n\t\tminimapCanvas.width = 200;\n\t\tminimapCanvas.height = 150;\n\n\t\tthis._minimap.appendChild(minimapCanvas);\n\t\tthis._minimapCtx = minimapCanvas.getContext('2d') as CanvasRenderingContext2D;\n\t\tthis._viewportRectangle = document.createElement('div');\n\t\tthis._viewportRectangle.className = 'viewport-rectangle';\n\t\tthis._minimap.appendChild(this._viewportRectangle);\n\t\tthis._minimapContainer.appendChild(this._minimap);\n\n\t\tthis.DM.data.container.appendChild(this._minimapContainer);\n\n\t\tthis._minimapContainer.classList.toggle('collapsed', this.collapsed);\n\n\t\tthis._toggleMinimapBtn.addEventListener('click', this.toggleCollapse);\n\t\tthis.utilities.resizeCanvasForDPR(minimapCanvas, minimapCanvas.width, minimapCanvas.height);\n\t}\n\n\ttoggleCollapse = () => {\n\t\tthis.collapsed = !this.collapsed;\n\t\tthis.minimapContainer.classList.toggle('collapsed', this.collapsed);\n\t\tif (!this.collapsed) this.updateViewportRectangle();\n\t};\n\n\tprivate drawMinimap = () => {\n\t\tconst bounds = this.DM.data.nodeBounds;\n\t\tif (!bounds) return;\n\t\tconst displayWidth = this.minimap.clientWidth;\n\t\tconst displayHeight = this.minimap.clientHeight;\n\t\tconst scaleX = displayWidth / bounds.width;\n\t\tconst scaleY = displayHeight / bounds.height;\n\t\tthis.minimapCache.scale = Math.min(scaleX, scaleY) * 0.9;\n\t\tthis.minimapCache.centerX = displayWidth / 2;\n\t\tthis.minimapCache.centerY = displayHeight / 2;\n\t\tthis.minimapCtx.clearRect(0, 0, displayWidth, displayHeight);\n\t\tthis.minimapCtx.save();\n\t\tthis.minimapCtx.translate(this.minimapCache.centerX, this.minimapCache.centerY);\n\t\tthis.minimapCtx.scale(this.minimapCache.scale, this.minimapCache.scale);\n\t\tthis.minimapCtx.translate(-bounds.centerX, -bounds.centerY);\n\t\tconst canvasData = this.DM.data.canvasData;\n\t\tfor (const edge of canvasData.edges) this.drawMinimapEdge(edge);\n\t\tfor (const node of canvasData.nodes) this.drawMinimapNode(node);\n\t\tthis.minimapCtx.restore();\n\t};\n\n\tprivate drawMinimapNode = (node: JSONCanvasNode) => {\n\t\tconst colors = this.utilities.getColor(node.color);\n\t\tconst radius = 25;\n\t\tthis.minimapCtx.fillStyle = colors.border;\n\t\tthis.minimapCtx.globalAlpha = 0.3;\n\t\tthis.utilities.drawRoundRect(this.minimapCtx, node.x, node.y, node.width, node.height, radius);\n\t\tthis.minimapCtx.fill();\n\t\tthis.minimapCtx.globalAlpha = 1.0;\n\t};\n\n\tprivate drawMinimapEdge = (edge: JSONCanvasEdge) => {\n\t\tconst nodeMap = this.DM.data.nodeMap;\n\t\tconst fromNode = nodeMap[edge.fromNode];\n\t\tconst toNode = nodeMap[edge.toNode];\n\t\tif (!fromNode || !toNode) return;\n\t\tconst [startX, startY] = this.utilities.getAnchorCoord(fromNode, edge.fromSide);\n\t\tconst [endX, endY] = this.utilities.getAnchorCoord(toNode, edge.toSide);\n\t\tthis.minimapCtx.beginPath();\n\t\tthis.minimapCtx.moveTo(startX, startY);\n\t\tthis.minimapCtx.lineTo(endX, endY);\n\t\tthis.minimapCtx.strokeStyle = '#555';\n\t\tthis.minimapCtx.lineWidth = 10;\n\t\tthis.minimapCtx.stroke();\n\t};\n\n\tprivate updateViewportRectangle = () => {\n\t\tif (this.collapsed) return;\n\t\tconst bounds = this.DM.data.nodeBounds;\n\t\tconst container = this.DM.data.container;\n\t\tconst scale = this.DM.data.scale;\n\t\tif (!bounds) return;\n\t\tconst viewWidth = container.clientWidth / scale;\n\t\tconst viewHeight = container.clientHeight / scale;\n\t\tconst viewportCenterX = -this.DM.data.offsetX / scale + container.clientWidth / (2 * scale);\n\t\tconst viewportCenterY = -this.DM.data.offsetY / scale + container.clientHeight / (2 * scale);\n\t\tconst viewRectX =\n\t\t\tthis.minimapCache.centerX +\n\t\t\t(viewportCenterX - viewWidth / 2 - bounds.centerX) * this.minimapCache.scale;\n\t\tconst viewRectY =\n\t\t\tthis.minimapCache.centerY +\n\t\t\t(viewportCenterY - viewHeight / 2 - bounds.centerY) * this.minimapCache.scale;\n\t\tconst viewRectWidth = viewWidth * this.minimapCache.scale;\n\t\tconst viewRectHeight = viewHeight * this.minimapCache.scale;\n\t\tthis.viewportRectangle.style.left = `${viewRectX}px`;\n\t\tthis.viewportRectangle.style.top = `${viewRectY}px`;\n\t\tthis.viewportRectangle.style.width = `${viewRectWidth}px`;\n\t\tthis.viewportRectangle.style.height = `${viewRectHeight}px`;\n\t};\n\n\tdispose = () => {\n\t\tthis.toggleMinimapBtn.removeEventListener('click', this.toggleCollapse);\n\t\tthis.minimapCtx.clearRect(0, 0, this.minimap.clientWidth, this.minimap.clientHeight);\n\t\tthis.minimapContainer.remove();\n\t\tthis._minimapContainer = null;\n\t\tthis._toggleMinimapBtn = null;\n\t\tthis._viewportRectangle = null;\n\t\tthis._minimap = null;\n\t};\n}\n","import { type BaseArgs, BaseModule } from '@/baseModule';\nimport DataManager from '@/dataManager';\nimport { destroyError } from '@/shared';\nimport style from './styles.scss?inline';\n\ntype Options = {\n\tmistouchPreventer?: {\n\t\tpreventAtStart?: boolean;\n\t\tlabelText?: string;\n\t};\n};\n\nexport default class MistouchPreventer extends BaseModule<Options> {\n\tprivate _preventionContainer: HTMLDivElement | null = null;\n\tprivate preventMt: boolean = false;\n\tprivate DM: DataManager;\n\tprivate preventMistouch: {\n\t\trecord: boolean;\n\t\tlastX: number;\n\t\tlastY: number;\n\t\tinitialX: number;\n\t\tinitialY: number;\n\t} = {\n\t\trecord: false,\n\t\tlastX: 0,\n\t\tlastY: 0,\n\t\tinitialX: 0,\n\t\tinitialY: 0,\n\t};\n\n\tprivate get preventionContainer() {\n\t\tif (this._preventionContainer === null) throw destroyError;\n\t\treturn this._preventionContainer;\n\t}\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tconst options = Object.assign(\n\t\t\t{\n\t\t\t\tpreventAtStart: true,\n\t\t\t\tlabelText: 'Click on to unlock.',\n\t\t\t},\n\t\t\tthis.options.mistouchPreventer || {},\n\t\t);\n\n\t\tconst preventionBanner = document.createElement('div');\n\t\tpreventionBanner.className = 'prevention-banner';\n\t\tpreventionBanner.textContent = options.labelText;\n\t\tthis.DM = this.container.get(DataManager);\n\t\tthis._preventionContainer = document.createElement('div');\n\t\tthis._preventionContainer.className = 'prevention-container hidden';\n\n\t\tthis.utilities.applyStyles(this._preventionContainer, style);\n\t\tthis._preventionContainer.appendChild(preventionBanner);\n\t\tthis.DM.data.container.appendChild(this._preventionContainer);\n\n\t\tif (options.preventAtStart) this.startPrevention();\n\n\t\twindow.addEventListener('pointerdown', this.onPointerDown);\n\t\twindow.addEventListener('pointermove', this.onPointerMove);\n\t\twindow.addEventListener('pointerup', this.onPointerUp);\n\t}\n\n\tprivate onPointerDown = (e: PointerEvent) => {\n\t\tconst bounds = this.DM.data.container.getBoundingClientRect();\n\t\tif (\n\t\t\te.clientX < bounds.left ||\n\t\t\te.clientX > bounds.right ||\n\t\t\te.clientY < bounds.top ||\n\t\t\te.clientY > bounds.bottom\n\t\t) {\n\t\t\tif (!this.preventMt) this.startPrevention();\n\t\t} else if (this.preventMt) {\n\t\t\tthis.preventMistouch.initialX = e.clientX;\n\t\t\tthis.preventMistouch.initialY = e.clientY;\n\t\t\tthis.preventMistouch.lastX = e.clientX;\n\t\t\tthis.preventMistouch.lastY = e.clientY;\n\t\t\tthis.preventMistouch.record = true;\n\t\t}\n\t};\n\n\tprivate onPointerMove = (e: PointerEvent) => {\n\t\tif (this.preventMistouch.record) {\n\t\t\tthis.preventMistouch.lastX = e.clientX;\n\t\t\tthis.preventMistouch.lastY = e.clientY;\n\t\t}\n\t};\n\n\tprivate onPointerUp = () => {\n\t\tif (this.preventMistouch.record) {\n\t\t\tthis.preventMistouch.record = false;\n\t\t\tif (\n\t\t\t\tMath.abs(this.preventMistouch.lastX - this.preventMistouch.initialX) +\n\t\t\t\t\tMath.abs(this.preventMistouch.lastY - this.preventMistouch.initialY) <\n\t\t\t\t5\n\t\t\t)\n\t\t\t\tthis.endPrevention();\n\t\t}\n\t};\n\n\tstartPrevention = () => {\n\t\tthis.preventionContainer.classList.remove('hidden');\n\t\tthis.DM.data.container.classList.add('numb');\n\t\tthis.preventMt = true;\n\t};\n\n\tendPrevention = () => {\n\t\tthis.preventMt = false;\n\t\tthis.preventionContainer.classList.add('hidden');\n\t\tsetTimeout(() => this.DM.data.container.classList.remove('numb'), 50); // minimum delay to prevent triggering undesired button touch\n\t};\n\n\tdispose = () => {\n\t\twindow.removeEventListener('pointerdown', this.onPointerDown);\n\t\twindow.removeEventListener('pointermove', this.onPointerMove);\n\t\twindow.removeEventListener('pointerup', this.onPointerUp);\n\t\tthis.preventionContainer.remove();\n\t\tthis._preventionContainer = null;\n\t};\n}\n"],"names":["BaseModule","constructor","container","options","utilities","this","Object","assign","dispose","isClassLike","target","getParentClasses","parentClasses","currentClass","getPrototypeOf","name","parentClass","push","assertPresent","value","Error","assertSingle","array","errorProvider","length","first","at","isConstructorProvider","provider","isClassProvider","isFactoryProvider","isAsyncProvider","async","isExistingProvider","isMultiProvider","multi","InjectionToken","description","toString","String","isClassToken","token","getToken","Guards.isConstructorProvider","provide","injectableSymbol","Factory","underConstruction","construct","Guards.isAsyncProvider","AsyncProvidersInSyncInjectionContextError","includes","dependencyGraph","map","CircularDependencyError","doConstruct","pop","constructAsync","useFactory","Guards.isClassProvider","create","useClass","errorClass","block","onError","error","retryOn","getAsync","optional","Guards.isValueProvider","useValue","Guards.isFactoryProvider","Guards.isExistingProvider","get","useExisting","assertNever","super","graph","join","InjectionContext","run","originalContext","_currentContext","runAsync","NeedsInjectionContextError","injectionContext","Container","providers","Map","singletons","parent","factory","bind","bindAll","forEach","it","has","Guards.isMultiProvider","existingProviderAlreadyProvided","some","every","set","step","result","_","i","slice","windowedSlice","childClass","parentProvider","existingParentProviders","unbind","delete","unbindAll","clear","lazy","autoBindIfNeeded","values","flatMap","Promise","resolve","promiseTry","all","flat","createChild","hasOwnProperty","targetClasses","getInjectableTargets","filter","targetClass","isInjectionToken","existingToken","unexpectedError","destroyError","makeHook","args","subs","callback","Set","subscribe","add","unsubscribe","GRID_CELL_SIZE","DataManager","spatialGrid","hooks","onToggleFullscreen","onCanvasFetched","data","canvasData","nodeMap","canvasBaseDir","nodeBounds","offsetX","offsetY","scale","document","createElement","loadCanvas","path","canvasPath","resolvePath","fetch","then","res","json","nodes","node","type","file","split","id","calculateNodeBounds","buildSpatialGrid","err","console","test","substring","lastIndexOf","lastSlash","findNodeAt","screenCoords","x","y","C2W","C2C","candidates","key","Math","floor","width","height","judgeInteract","match","minX","Infinity","minY","maxX","maxY","min","max","centerX","centerY","minCol","maxCol","minRow","maxRow","col","row","zoom","factor","origin","newScale","zoomToScale","validNewScale","canvasCoords","pan","panToCoords","shiftFullscreen","option","fullscreenElement","exitFullscreen","requestFullscreen","resetView","bounds","contentWidth","INITIAL_VIEWPORT_PADDING","contentHeight","viewWidth","clientWidth","viewHeight","clientHeight","scaleX","scaleY","round","initialView","containerX","containerY","canvasX","canvasY","middleViewer","remove","Controller","animationId","resizeAnimationId","DM","perFrame","lastScale","lastOffsets","lastResizeCenter","onResize","onRefresh","onFetched","parentContainer","firstElementChild","innerHTML","realContainer","noShadow","attachShadow","mode","applyStyles","HTMLContainer","classList","appendChild","resizeObserver","observe","requestAnimationFrame","draw","refresh","center","ResizeObserver","cancelAnimationFrame","disconnect","OverlayManager","_overlaysLayer","overlays","selectedId","eventListeners","IH","parser","markdown","micromark","extensions","gfm","htmlExtensions","gfmHtml","overlaysLayer","onInteractionStart","onInteractionEnd","InteractionHandler","controller","updateOverlays","className","onClick","select","cbd","overlayCreators","text","updateOrCreateOverlay","loadMarkdownForNode","link","url","group","previous","current","mdContent","response","frontmatterMatch","frontmatter","reduce","acc","line","s","trim","Purify","sanitize","mdFrontmatter","style","transform","content","element","constructOverlay","left","top","display","parsedContentContainer","getElementsByClassName","contains","direction","color","getColor","overlay","backgroundColor","background","setProperty","active","parsedContentWrapper","iframe","src","sandbox","loading","audio","controls","img","clickLayer","overlayBorder","borderColor","border","onStart","onEnd","addEventListener","child","removeEventListener","pointeract","OM","proControlSchema","zoomFactor","lockControlSchema","interactions","Pointeract","Click","Drag","WheelPanZoom","PreventDefault","MultitouchPanZoom","startInteraction","start","stopInteraction","stop","on","onPan","onZoom","onTrueClick","event","detail","e","closest","off","FONT_COLOR","Renderer","_canvas","ctx","zoomInOptimize","lastDrawnScale","lastDrawnViewport","right","bottom","timeout","lastCallTime","canvas","redraw","optimizeDPR","getContext","resizeCanvasForDPR","offsetWidth","offsetHeight","clearTimeout","now","Date","currentViewport","getCurrentViewport","isViewportInside","setTimeout","trueRedraw","fakeRedraw","clearRect","save","translate","drawGroup","drawFileNode","edges","edge","drawEdge","restore","cssScale","currentOffsetX","currentOffsetY","inner","outer","drawLabelBar","label","barHeight","radius","yOffset","fontSize","xPadding","font","barWidth","measureText","fillStyle","beginPath","moveTo","lineTo","quadraticCurveTo","closePath","fill","fillText","drawNodeBackground","colors","globalAlpha","drawRoundRect","strokeStyle","lineWidth","stroke","fromNode","toNode","getEdgeNodes","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","abs","PADDING","val","c1x","c1y","c2x","c2y","bezierCurveTo","tipX","tipY","fromX","fromY","dx","dy","sqrt","unitX","unitY","leftX","leftY","rightX","rightY","roundedNum","digits","dpr","window","devicePixelRatio","setTransform","styleString","side","midX","midY","colorIndex","themeColor","rgb","hex","cleanHex","replace","r","parseInt","g","b","hexToRgb","developerSuite","_controlsPanel","_toggleCollapseBtn","_toggleFullscreenBtn","_zoomOutBtn","_zoomSlider","_zoomInBtn","_resetViewBtn","collapsed","controlsPanel","toggleCollapseBtn","toggleFullscreenBtn","zoomOutBtn","zoomSlider","zoomInBtn","resetViewBtn","controlsCollapsed","updateFullscreenBtn","updateSlider","toggle","controlsContent","toggleCollapse","zoomIn","zoomOut","slide","toggleFullscreen","Number","enter","scaleToSlider","log","_debugPanel","debugPanel","update","allModules","modules","Class","Module","firstChild","reverse","module","_minimapCtx","_viewportRectangle","_minimap","_minimapContainer","_toggleMinimapBtn","minimapCache","minimap","minimapCtx","viewportRectangle","minimapContainer","toggleMinimapBtn","minimapCollapsed","updateViewportRectangle","drawMinimap","minimapCanvas","displayWidth","displayHeight","drawMinimapEdge","drawMinimapNode","viewportCenterX","viewportCenterY","viewRectX","viewRectY","viewRectWidth","viewRectHeight","_preventionContainer","preventMt","preventMistouch","record","lastX","lastY","initialX","initialY","preventionContainer","preventAtStart","labelText","mistouchPreventer","preventionBanner","textContent","startPrevention","onPointerDown","onPointerMove","onPointerUp","getBoundingClientRect","clientX","clientY","endPrevention"],"mappings":"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","x_google_ignoreList":[1,2,3,4,5,6,7]}
1
+ {"version":3,"file":"index.cjs","sources":["../src/baseModule.ts","../node_modules/.pnpm/@needle-di+core@1.1.0/node_modules/@needle-di/core/dist/utils.js","../node_modules/.pnpm/@needle-di+core@1.1.0/node_modules/@needle-di/core/dist/providers.js","../node_modules/.pnpm/@needle-di+core@1.1.0/node_modules/@needle-di/core/dist/tokens.js","../node_modules/.pnpm/@needle-di+core@1.1.0/node_modules/@needle-di/core/dist/decorators.js","../node_modules/.pnpm/@needle-di+core@1.1.0/node_modules/@needle-di/core/dist/factory.js","../node_modules/.pnpm/@needle-di+core@1.1.0/node_modules/@needle-di/core/dist/context.js","../node_modules/.pnpm/@needle-di+core@1.1.0/node_modules/@needle-di/core/dist/container.js","../src/utilities.ts","../src/dataManager.ts","../src/controller.ts","../src/shared.ts","../src/overlayManager.ts","../src/interactionHandler.ts","../src/renderer.ts","../src/index.ts","../src/controls/index.ts","../src/debugPanel/index.ts","../src/canvasViewer.ts","../src/minimap/index.ts","../src/mistouchPreventer/index.ts","../src/renderToString.ts"],"sourcesContent":["import type { Container } from '@needle-di/core';\nimport type { DefaultOptions, Empty, GeneralFunction, GeneralObject } from '@/declarations';\n\nexport type BaseArgs = [Container, GeneralObject];\n\nexport type GeneralModuleCtor = typeof BaseModule<GeneralObject>;\nexport type GeneralModule = InstanceType<GeneralModuleCtor>;\n\nexport class BaseModule<O extends GeneralObject = Empty> {\n\tconstructor(\n\t\tprotected container: Container,\n\t\toptions: GeneralObject,\n\t) {\n\t\tObject.assign(this.options, options);\n\t}\n\n\toptions = {} as DefaultOptions & O;\n\n\tdispose?: GeneralFunction;\n}\n","/**\n * Type-guard to assert if the given object is an (abstract) class.\n *\n * @internal\n */\nexport function isClassLike(target) {\n return typeof target === \"function\";\n}\n/**\n * Returns all parent classes of a given class.\n *\n * @internal\n */\nexport function getParentClasses(target) {\n const parentClasses = [];\n let currentClass = target;\n while (Object.getPrototypeOf(currentClass).name) {\n const parentClass = Object.getPrototypeOf(currentClass);\n parentClasses.push(parentClass);\n currentClass = parentClass;\n }\n return parentClasses;\n}\n/**\n * Ensures a given value is not null or undefined.\n *\n * @internal\n */\nexport function assertPresent(value) {\n if (value === null || value === undefined) {\n throw Error(`Expected value to be not null or undefined`);\n }\n return value;\n}\nexport function windowedSlice(array, step = 2) {\n const result = [];\n array.some((_, i) => {\n if (i + step > array.length)\n return true;\n result.push(array.slice(i, i + step));\n });\n return result;\n}\n/**\n * Retries as long as it encounters any error that is instance of `errorClass`.\n * Awaits the result of the `onError` callback before retrying.\n *\n * @internal\n */\nexport async function retryOn(errorClass, block, onError) {\n while (true) {\n try {\n return await block();\n }\n catch (error) {\n if (!(error instanceof errorClass)) {\n throw error;\n }\n await onError(error);\n }\n }\n}\n/**\n * Assert that there is a single element in an array. Throws the error from error provider if not.\n *\n * @internal\n */\nexport function assertSingle(array, errorProvider) {\n if (array.length > 1) {\n throw errorProvider();\n }\n const first = array.at(0);\n if (first === undefined) {\n throw errorProvider();\n }\n return first;\n}\n/**\n * Type-guard for `never` types, can be used to create exhaustive branches.\n *\n * @internal\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport function assertNever(_) {\n throw new Error(\"invalid state\");\n}\n/**\n * Executes a callback, wrapping its result in a Promise.\n * Static version of `Promise.try()` (currently stage 3).\n *\n * @internal\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/try\n */\nexport async function promiseTry(block) {\n return await new Promise((resolve) => resolve(block()));\n}\n/**\n * Simple function that returns a Promise with a certain delay.\n *\n * @internal\n */\nexport function delay(delayInMs) {\n return new Promise((resolve) => setTimeout(resolve, delayInMs));\n}\n//# sourceMappingURL=utils.js.map","import { isClassLike } from \"./utils.js\";\nexport function isConstructorProvider(provider) {\n return isClassLike(provider);\n}\nexport function isClassProvider(provider) {\n return \"provide\" in provider && \"useClass\" in provider;\n}\nexport function isValueProvider(provider) {\n return \"provide\" in provider && \"useValue\" in provider;\n}\nexport function isFactoryProvider(provider) {\n return \"provide\" in provider && \"useFactory\" in provider;\n}\nexport function isAsyncProvider(provider) {\n return isFactoryProvider(provider) && provider.async === true;\n}\nexport function isExistingProvider(provider) {\n return \"provide\" in provider && \"useExisting\" in provider;\n}\nexport function isMultiProvider(provider) {\n return \"provide\" in provider && \"multi\" in provider && provider.multi === true;\n}\n//# sourceMappingURL=providers.js.map","import { isClassLike } from \"./utils.js\";\nimport {} from \"./providers.js\";\nimport * as Guards from \"./providers.js\";\n/**\n * A unique injection token object, that is used by reference. Can hold a generic type.\n * Can optionally hold an (async) factory.\n */\nexport class InjectionToken {\n description;\n options;\n constructor(description, options) {\n this.description = description;\n this.options = options;\n }\n toString() {\n return `InjectionToken \"${String(this.description)}\"`;\n }\n}\n/**\n * Type-guard to check if a token is a class reference.\n *\n * @internal\n */\nexport function isClassToken(token) {\n return isClassLike(token);\n}\n/**\n * Type-guard to check if a token is an InjectionToken\n *\n * @internal\n */\nexport function isInjectionToken(token) {\n return token instanceof InjectionToken;\n}\n/**\n * Describes a token, useful for error messages.\n *\n * @internal\n */\nexport function toString(token) {\n if (isClassLike(token)) {\n return token.name;\n }\n else if (typeof token === \"symbol\") {\n return token.description ?? String(token);\n }\n else if (token instanceof InjectionToken) {\n return token.toString();\n }\n else {\n return token;\n }\n}\n/**\n * Returns the token for a provider.\n *\n * @internal\n */\nexport function getToken(provider) {\n return Guards.isConstructorProvider(provider) ? provider : provider.provide;\n}\n//# sourceMappingURL=tokens.js.map","import { getParentClasses } from \"./utils.js\";\n/**\n * The @injectable() decorator allows you to automatically bind a class as singleton service\n * when requesting it from a DI container.\n */\nexport function injectable() {\n return (target) => {\n getParentClasses(target).forEach((parentClass) => {\n if (!Object.getOwnPropertyDescriptor(parentClass, injectableSymbol)) {\n Object.defineProperty(parentClass, injectableSymbol, {\n value: [target],\n writable: true,\n enumerable: false,\n });\n }\n else {\n const injectableParentClass = parentClass;\n injectableParentClass[injectableSymbol] = [...injectableParentClass[injectableSymbol], target];\n }\n });\n Object.defineProperty(target, injectableSymbol, {\n value: [target],\n writable: true,\n });\n };\n}\nexport const injectableSymbol = Symbol(\"injectable\");\nexport function isInjectable(target) {\n // eslint-disable-next-line no-prototype-builtins\n return target.hasOwnProperty(injectableSymbol);\n}\nexport function getInjectableTargets(target) {\n return target[injectableSymbol];\n}\n//# sourceMappingURL=decorators.js.map","import {} from \"./providers.js\";\nimport { getToken, toString } from \"./tokens.js\";\nimport * as Guards from \"./providers.js\";\nimport { assertNever, retryOn } from \"./utils.js\";\nimport { Container } from \"./container.js\";\n/**\n * @internal\n */\nexport class Factory {\n container;\n underConstruction = [];\n constructor(container) {\n this.container = container;\n }\n construct(provider, token) {\n if (Guards.isAsyncProvider(provider)) {\n throw new AsyncProvidersInSyncInjectionContextError(token);\n }\n try {\n if (this.underConstruction.includes(provider)) {\n const dependencyGraph = [...this.underConstruction, provider].map(getToken).map(toString);\n throw new CircularDependencyError(dependencyGraph);\n }\n this.underConstruction.push(provider);\n return this.doConstruct(provider);\n }\n finally {\n this.underConstruction.pop();\n }\n }\n async constructAsync(provider) {\n try {\n if (this.underConstruction.includes(provider)) {\n const dependencyGraph = [...this.underConstruction, provider].map(getToken).map(toString);\n throw new CircularDependencyError(dependencyGraph);\n }\n this.underConstruction.push(provider);\n if (Guards.isAsyncProvider(provider)) {\n return [await provider.useFactory(this.container)];\n }\n // in class and constructor providers, we allow stuff to be synchronously injected,\n // by just retrying when we encounter an async dependency down the road.\n // todo: this feels like an ugly workaround, so let's create something nice for this.\n if (Guards.isClassProvider(provider) || Guards.isConstructorProvider(provider)) {\n const create = Guards.isConstructorProvider(provider)\n ? () => [new provider()]\n : () => [new provider.useClass()];\n return retryOn(AsyncProvidersInSyncInjectionContextError, async () => create(), async (error) => {\n await this.container.getAsync(error.token, { multi: true, optional: true });\n });\n }\n // all other types of providers are constructed synchronously anyway.\n return this.doConstruct(provider);\n }\n finally {\n this.underConstruction.pop();\n }\n }\n doConstruct(provider) {\n if (Guards.isConstructorProvider(provider)) {\n return [new provider()];\n }\n else if (Guards.isClassProvider(provider)) {\n return [new provider.useClass()];\n }\n else if (Guards.isValueProvider(provider)) {\n return [provider.useValue];\n }\n else if (Guards.isFactoryProvider(provider)) {\n return [provider.useFactory(this.container)];\n }\n else if (Guards.isExistingProvider(provider)) {\n return this.container.get(provider.useExisting, { multi: true });\n }\n return assertNever(provider);\n }\n}\n/**\n * An error that occurs when an async provider is requested in a synchronous context.\n *\n * @internal\n */\nclass AsyncProvidersInSyncInjectionContextError extends Error {\n token;\n constructor(token) {\n super(`Some providers for token ${toString(token)} are async, please use injectAsync() or container.getAsync() instead`);\n this.token = token;\n }\n}\nclass CircularDependencyError extends Error {\n constructor(graph) {\n super(`Detected circular dependency: ${graph.join(\" -> \")}. Please change your dependency graph or use lazy injection instead.`);\n }\n}\n//# sourceMappingURL=factory.js.map","import { Container } from \"./container.js\";\nexport function inject(token, options) {\n try {\n return _currentContext.run((container) => container.get(token, options));\n }\n catch (error) {\n if (error instanceof NeedsInjectionContextError && options?.optional === true) {\n return undefined;\n }\n throw error;\n }\n}\nexport function injectAsync(token, options) {\n try {\n if (options?.lazy) {\n return _currentContext.run((container) => container.getAsync(token, { ...options, lazy: true }));\n }\n return _currentContext.runAsync((container) => container.getAsync(token, { ...options, lazy: false }));\n }\n catch (error) {\n if (error instanceof NeedsInjectionContextError && options?.optional === true) {\n return Promise.resolve(undefined);\n }\n return Promise.reject(error);\n }\n}\n/**\n * The global context does not allow dependency injection.\n *\n * @internal\n */\nclass GlobalContext {\n run() {\n throw new NeedsInjectionContextError();\n }\n runAsync() {\n throw new NeedsInjectionContextError();\n }\n}\n/**\n * An injection context allows to perform dependency injection with `inject()` and `injectAsync()`.\n *\n * @internal\n */\nclass InjectionContext {\n container;\n constructor(container) {\n this.container = container;\n }\n run(block) {\n const originalContext = _currentContext;\n try {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n _currentContext = this;\n return block(this.container);\n }\n finally {\n _currentContext = originalContext;\n }\n }\n async runAsync(block) {\n const originalContext = _currentContext;\n try {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n _currentContext = this;\n return await block(this.container);\n }\n finally {\n _currentContext = originalContext;\n }\n }\n}\nlet _currentContext = new GlobalContext();\n/**\n * Creates a new injection context.\n *\n * @internal\n */\nexport function injectionContext(container) {\n return new InjectionContext(container);\n}\n/**\n * An error that occurs when `inject()` or `injectAsync()` is used outside an injection context.\n *\n * @internal\n */\nclass NeedsInjectionContextError extends Error {\n constructor() {\n super(`You can only invoke inject() or injectAsync() within an injection context`);\n }\n}\n//# sourceMappingURL=context.js.map","import { isClassToken, toString, isInjectionToken, getToken } from \"./tokens.js\";\nimport * as Guards from \"./providers.js\";\nimport { getInjectableTargets, isInjectable } from \"./decorators.js\";\nimport { assertPresent, assertSingle, getParentClasses, promiseTry, windowedSlice } from \"./utils.js\";\nimport { Factory } from \"./factory.js\";\nimport { injectionContext } from \"./context.js\";\n/**\n * A dependency injection (DI) container will keep track of all bindings\n * and hold the actual instances of your services.\n */\nexport class Container {\n providers = new Map();\n singletons = new Map();\n parent;\n factory;\n constructor(parent) {\n this.parent = parent;\n this.factory = new Factory(this);\n this.bind({\n provide: Container,\n useValue: this,\n });\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n bindAll(...providers) {\n providers.forEach((it) => this.bind(it));\n return this;\n }\n /**\n * Binds a provider to this container.\n *\n * {@link https://needle-di.io/concepts/binding.html#binding}\n */\n bind(provider) {\n const token = getToken(provider);\n // running some validations...\n if (Guards.isExistingProvider(provider) && provider.provide === provider.useExisting) {\n throw Error(`The provider for token ${toString(token)} with \"useExisting\" cannot refer to itself.`);\n }\n if (!Guards.isExistingProvider(provider) && this.singletons.has(token)) {\n throw Error(`Cannot bind a new provider for ${toString(token)}, since the existing provider was already constructed.`);\n }\n // ignore the new provider if it was already provided\n if (Guards.isExistingProvider(provider) &&\n Guards.isMultiProvider(provider) &&\n this.existingProviderAlreadyProvided(token, provider.useExisting)) {\n return this;\n }\n const providers = this.providers.get(token) ?? [];\n // validating multi-provider inconsistencies...\n const multi = Guards.isMultiProvider(provider);\n if (multi && providers.some((it) => !Guards.isMultiProvider(it))) {\n throw Error(`Cannot bind ${toString(token)} as multi-provider, since there is already a provider which is not a multi-provider.`);\n }\n else if (!multi && providers.some((it) => Guards.isMultiProvider(it))) {\n if (!providers.every(Guards.isExistingProvider)) {\n throw Error(`Cannot bind ${toString(token)} as provider, since there are already provider(s) that are multi-providers.`);\n }\n }\n // appending or replacing providers...\n this.providers.set(token, multi ? [...providers, provider] : [provider]);\n // inheritance support: also bind parent classes to their immediate child classes\n if (isClassToken(token) && (Guards.isClassProvider(provider) || Guards.isConstructorProvider(provider))) {\n windowedSlice([token, ...getParentClasses(token)]).forEach(([childClass, parentClass]) => {\n const parentProvider = {\n provide: parentClass,\n useExisting: childClass,\n multi: true,\n };\n const existingParentProviders = this.providers.get(parentClass) ?? [];\n if (!this.existingProviderAlreadyProvided(parentClass, childClass)) {\n this.providers.set(parentClass, [...existingParentProviders, parentProvider]);\n }\n });\n }\n return this;\n }\n /**\n * Unbinds a provider.\n *\n * {@link https://needle-di.io/concepts/binding.html#binding}\n */\n unbind(provider) {\n const token = getToken(provider);\n this.providers.delete(token);\n this.singletons.delete(token);\n return this;\n }\n /**\n * Unbinds all providers.\n *\n * {@link https://needle-di.io/concepts/binding.html#binding}\n */\n unbindAll() {\n this.providers.clear();\n this.singletons.clear();\n return this;\n }\n get(token, options) {\n const lazy = options?.lazy ?? false;\n if (lazy) {\n return () => this.get(token, { ...options, lazy: false });\n }\n this.autoBindIfNeeded(token);\n const optional = options?.optional ?? false;\n if (!this.providers.has(token)) {\n if (this.parent) {\n return this.parent.get(token, { ...options, lazy: false });\n }\n if (optional) {\n return undefined;\n }\n throw Error(`No provider(s) found for ${toString(token)}`);\n }\n const providers = assertPresent(this.providers.get(token));\n if (!this.singletons.has(token)) {\n injectionContext(this).run(() => {\n const values = providers.flatMap((provider) => this.factory.construct(provider, token));\n this.singletons.set(token, values);\n });\n }\n const singletons = assertPresent(this.singletons.get(token));\n const multi = options?.multi ?? false;\n if (multi) {\n return singletons;\n }\n else {\n return assertSingle(singletons, () => Error(`Requesting a single value for ${toString(token)}, but multiple values were provided. ` +\n `Consider passing \"{ multi: true }\" to inject all values, or adjust your bindings accordingly.`));\n }\n }\n getAsync(token, options) {\n const lazy = options?.lazy ?? false;\n if (lazy) {\n return () => this.getAsync(token, { ...options, lazy: false });\n }\n return promiseTry(async () => {\n this.autoBindIfNeeded(token);\n const optional = options?.optional ?? false;\n if (!this.providers.has(token)) {\n if (optional) {\n return undefined;\n }\n throw Error(`No provider(s) found for ${toString(token)}`);\n }\n const providers = assertPresent(this.providers.get(token));\n if (!this.singletons.has(token)) {\n await injectionContext(this).runAsync(async () => {\n const values = await Promise.all(providers.map((it) => this.factory.constructAsync(it)));\n this.singletons.set(token, values.flat());\n });\n }\n const singletons = assertPresent(this.singletons.get(token));\n const multi = options?.multi ?? false;\n if (multi) {\n return singletons;\n }\n else {\n return assertSingle(singletons, () => new Error(`Requesting a single value for ${toString(token)}, but multiple values were provided. ` +\n `Consider passing \"{ multi: true }\" to inject all values, or adjust your bindings accordingly.`));\n }\n });\n }\n /**\n * Creates a child container.\n *\n * {@link https://needle-di.io/advanced/child-containers.html}\n */\n createChild() {\n return new Container(this);\n }\n /**\n * Returns whether the container has one or more providers for this token.\n */\n has(token) {\n return this.providers.has(token) || (this.parent?.has(token) ?? false);\n }\n autoBindIfNeeded(token) {\n if (this.singletons.has(token)) {\n return;\n }\n if (isClassToken(token) && isInjectable(token)) {\n const targetClasses = getInjectableTargets(token);\n targetClasses\n .filter((targetClass) => !this.providers.has(targetClass))\n .forEach((targetClass) => {\n this.bind({\n provide: targetClass,\n useClass: targetClass,\n multi: true,\n });\n });\n }\n else if (!this.providers.has(token) && isInjectionToken(token) && token.options?.factory) {\n const async = token.options.async;\n if (!async) {\n this.bind({\n provide: token,\n async: false,\n useFactory: token.options.factory,\n });\n }\n else if (async) {\n this.bind({\n provide: token,\n async: true,\n useFactory: token.options.factory,\n });\n }\n }\n }\n existingProviderAlreadyProvided(token, existingToken) {\n return (this.providers.get(token) ?? []).some((it) => Guards.isExistingProvider(it) && it.provide === token && it.useExisting === existingToken);\n }\n}\n/**\n * Bootstraps a new container and obtains a service using the provided token.\n */\nexport function bootstrap(token) {\n return new Container().get(token);\n}\n/**\n * Bootstraps a new container and obtains a service asynchronously using the provided token.\n */\nexport function bootstrapAsync(token) {\n return new Container().getAsync(token);\n}\n//# sourceMappingURL=container.js.map","import type { GeneralArguments } from '@/declarations';\n\nexport default {\n\tround,\n\tresizeCanvasForDPR,\n\tapplyStyles,\n\tdrawRoundRect,\n\tgetAnchorCoord,\n\tgetColor,\n\tresolvePath,\n\tmakeHook,\n};\n\nfunction applyStyles(container: HTMLElement | ShadowRoot, styleString: string) {\n\tconst style = document.createElement('style');\n\tstyle.innerHTML = styleString;\n\tcontainer.appendChild(style);\n}\n\nfunction drawRoundRect(\n\tctx: CanvasRenderingContext2D,\n\tx: number,\n\ty: number,\n\twidth: number,\n\theight: number,\n\tradius: number,\n) {\n\tctx.beginPath();\n\tctx.moveTo(x + radius, y);\n\tctx.lineTo(x + width - radius, y);\n\tctx.quadraticCurveTo(x + width, y, x + width, y + radius);\n\tctx.lineTo(x + width, y + height - radius);\n\tctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);\n\tctx.lineTo(x + radius, y + height);\n\tctx.quadraticCurveTo(x, y + height, x, y + height - radius);\n\tctx.lineTo(x, y + radius);\n\tctx.quadraticCurveTo(x, y, x + radius, y);\n\tctx.closePath();\n}\n\nfunction getAnchorCoord(node: JSONCanvasNode, side: 'top' | 'bottom' | 'left' | 'right') {\n\tconst midX = node.x + node.width / 2;\n\tconst midY = node.y + node.height / 2;\n\tswitch (side) {\n\t\tcase 'top':\n\t\t\treturn [midX, node.y];\n\t\tcase 'bottom':\n\t\t\treturn [midX, node.y + node.height];\n\t\tcase 'left':\n\t\t\treturn [node.x, midY];\n\t\tcase 'right':\n\t\t\treturn [node.x + node.width, midY];\n\t\tdefault:\n\t\t\treturn [midX, midY];\n\t}\n}\n\nfunction getColor(colorIndex: string = '0') {\n\tlet themeColor = null;\n\n\tfunction hexToRgb(hex: string) {\n\t\tconst cleanHex = hex.replace('#', '');\n\t\tconst r = parseInt(cleanHex.substring(0, 2), 16);\n\t\tconst g = parseInt(cleanHex.substring(2, 4), 16);\n\t\tconst b = parseInt(cleanHex.substring(4, 6), 16);\n\t\treturn { r, g, b };\n\t}\n\n\tif (colorIndex.length === 1) {\n\t\tswitch (colorIndex) {\n\t\t\tcase '1':\n\t\t\t\tthemeColor = 'rgba(255, 120, 129, ?)';\n\t\t\t\tbreak;\n\t\t\tcase '2':\n\t\t\t\tthemeColor = 'rgba(251, 187, 131, ?)';\n\t\t\t\tbreak;\n\t\t\tcase '3':\n\t\t\t\tthemeColor = 'rgba(255, 232, 139, ?)';\n\t\t\t\tbreak;\n\t\t\tcase '4':\n\t\t\t\tthemeColor = 'rgba(124, 211, 124, ?)';\n\t\t\t\tbreak;\n\t\t\tcase '5':\n\t\t\t\tthemeColor = 'rgba(134, 223, 226, ?)';\n\t\t\t\tbreak;\n\t\t\tcase '6':\n\t\t\t\tthemeColor = 'rgba(203, 158, 255, ?)';\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthemeColor = 'rgba(140, 140, 140, ?)';\n\t\t}\n\t} else {\n\t\tconst rgb = hexToRgb(colorIndex);\n\t\tthemeColor = `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ?)`;\n\t}\n\treturn {\n\t\tborder: themeColor.replace('?', '0.75'),\n\t\tbackground: themeColor.replace('?', '0.1'),\n\t\tactive: themeColor.replace('?', '1'),\n\t};\n}\n\nfunction resizeCanvasForDPR(canvas: HTMLCanvasElement, width: number, height: number) {\n\tconst dpr = window.devicePixelRatio || 1;\n\tconst ctx = canvas.getContext('2d');\n\tif (!ctx)\n\t\tthrow new Error(\n\t\t\t'[JSONCanvasViewer] This error is unexpected, probably caused uncontrollable runtime errors. Please contact the developer and show how to reproduce.',\n\t\t);\n\tcanvas.width = Math.round(width * dpr);\n\tcanvas.height = Math.round(height * dpr);\n\tctx.setTransform(1, 0, 0, 1, 0, 0);\n\tctx.scale(dpr, dpr);\n}\n\nfunction round(roundedNum: number, digits: number) {\n\tconst factor = 10 ** digits;\n\treturn Math.round(roundedNum * factor) / factor;\n}\n\nfunction resolvePath(path: string) {\n\tif (/^https?:\\/\\//.test(path)) return path.substring(0, path.lastIndexOf('/') + 1);\n\telse {\n\t\tconst lastSlash = path.lastIndexOf('/');\n\t\treturn lastSlash !== -1 ? path.substring(0, lastSlash + 1) : './';\n\t}\n}\n\nfunction makeHook<Args extends GeneralArguments = []>() {\n\ttype MatchingFunc = (...args: Args) => unknown;\n\ttype Hook = {\n\t\t(...args: Args): void;\n\t\tsubs: Set<MatchingFunc>;\n\t\tsubscribe(callback: MatchingFunc): void;\n\t\tunsubscribe(callback: MatchingFunc): void;\n\t};\n\tconst result: Hook = (...args: Args) => {\n\t\tresult.subs.forEach(callback => {\n\t\t\tcallback(...args);\n\t\t});\n\t};\n\tresult.subs = new Set();\n\tresult.subscribe = (callback: MatchingFunc) => {\n\t\tresult.subs.add(callback);\n\t};\n\tresult.unsubscribe = (callback: MatchingFunc) => {\n\t\tresult.subs.delete(callback);\n\t};\n\treturn result;\n}\n","import { BaseModule } from '@/baseModule';\nimport type { Coordinates, NodeBounds } from '@/declarations';\nimport utilities from '@/utilities';\n\nconst GRID_CELL_SIZE = 800;\nconst INITIAL_VIEWPORT_PADDING = 100;\n\nexport default class DataManager extends BaseModule {\n\tprivate spatialGrid: Record<string, Array<JSONCanvasNode>> | null = null;\n\thooks = {\n\t\tonToggleFullscreen: utilities.makeHook<[boolean]>(),\n\t\tonCanvasFetched: utilities.makeHook(),\n\t};\n\tdata = {\n\t\tcanvasData: undefined as unknown as Required<JSONCanvas>,\n\t\tnodeMap: {} as Record<string, JSONCanvasNode>,\n\t\tcanvasBaseDir: undefined as unknown as string,\n\t\tnodeBounds: undefined as unknown as NodeBounds,\n\t\toffsetX: 0,\n\t\toffsetY: 0,\n\t\tscale: 1,\n\t\tcontainer: document.createElement('div'),\n\t};\n\n\tloadCanvas = async () => {\n\t\tconst path = this.options.canvasPath;\n\t\ttry {\n\t\t\tthis.data.canvasBaseDir = utilities.resolvePath(path);\n\t\t\tthis.data.canvasData = Object.assign(\n\t\t\t\t{\n\t\t\t\t\tnodes: [],\n\t\t\t\t\tedges: [],\n\t\t\t\t},\n\t\t\t\tawait fetch(path).then(res => res.json()),\n\t\t\t);\n\t\t\tthis.data.canvasData.nodes.forEach(node => {\n\t\t\t\tif (node.type === 'file' && !node.file.includes('http')) {\n\t\t\t\t\tconst file = node.file.split('/');\n\t\t\t\t\tnode.file = file[file.length - 1];\n\t\t\t\t}\n\t\t\t\tthis.data.nodeMap[node.id] = node;\n\t\t\t});\n\t\t\tthis.data.nodeBounds = this.calculateNodeBounds();\n\t\t\tthis.buildSpatialGrid();\n\t\t\tthis.hooks.onCanvasFetched();\n\t\t} catch (err) {\n\t\t\tconsole.error('Failed to load canvas data:', err);\n\t\t}\n\t};\n\n\tfindNodeAt = (screenCoords: Coordinates) => {\n\t\tconst { x, y } = this.C2W(this.C2C({ x: screenCoords.x, y: screenCoords.y }));\n\t\tlet candidates: Array<JSONCanvasNode> = [];\n\t\tif (!this.spatialGrid) candidates = this.data.canvasData.nodes;\n\t\telse {\n\t\t\tconst col = Math.floor(x / GRID_CELL_SIZE);\n\t\t\tconst row = Math.floor(y / GRID_CELL_SIZE);\n\t\t\tconst key = `${col},${row}`;\n\t\t\tcandidates = this.spatialGrid[key] || [];\n\t\t}\n\t\tfor (const node of candidates) {\n\t\t\tif (\n\t\t\t\tx < node.x ||\n\t\t\t\tx > node.x + node.width ||\n\t\t\t\ty < node.y ||\n\t\t\t\ty > node.y + node.height ||\n\t\t\t\tthis.judgeInteract(node) === 'non-interactive'\n\t\t\t)\n\t\t\t\tcontinue;\n\t\t\treturn node;\n\t\t}\n\t\treturn null;\n\t};\n\n\t// how should the app handle node interactions\n\tprivate judgeInteract = (node: JSONCanvasNode | null) => {\n\t\tswitch (node?.type) {\n\t\t\tcase 'text':\n\t\t\tcase 'link':\n\t\t\t\treturn 'select';\n\t\t\tcase 'file': {\n\t\t\t\tif (node.file.match(/\\.(md|wav|mp3)$/i)) return 'select';\n\t\t\t\telse return 'non-interactive';\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\treturn 'non-interactive';\n\t\t}\n\t};\n\n\tprivate calculateNodeBounds() {\n\t\tlet minX = Infinity,\n\t\t\tminY = Infinity,\n\t\t\tmaxX = -Infinity,\n\t\t\tmaxY = -Infinity;\n\t\tthis.data.canvasData.nodes.forEach(node => {\n\t\t\tminX = Math.min(minX, node.x);\n\t\t\tminY = Math.min(minY, node.y);\n\t\t\tmaxX = Math.max(maxX, node.x + node.width);\n\t\t\tmaxY = Math.max(maxY, node.y + node.height);\n\t\t});\n\t\tconst width = maxX - minX;\n\t\tconst height = maxY - minY;\n\t\tconst centerX = minX + width / 2;\n\t\tconst centerY = minY + height / 2;\n\t\treturn { minX, minY, maxX, maxY, width, height, centerX, centerY };\n\t}\n\n\tprivate buildSpatialGrid() {\n\t\tconst canvasData = this.data.canvasData;\n\t\tif (canvasData.nodes.length < 50) return;\n\t\tthis.spatialGrid = {};\n\t\tfor (const node of canvasData.nodes) {\n\t\t\tconst minCol = Math.floor(node.x / GRID_CELL_SIZE);\n\t\t\tconst maxCol = Math.floor((node.x + node.width) / GRID_CELL_SIZE);\n\t\t\tconst minRow = Math.floor(node.y / GRID_CELL_SIZE);\n\t\t\tconst maxRow = Math.floor((node.y + node.height) / GRID_CELL_SIZE);\n\t\t\tfor (let col = minCol; col <= maxCol; col++) {\n\t\t\t\tfor (let row = minRow; row <= maxRow; row++) {\n\t\t\t\t\tconst key = `${col},${row}`;\n\t\t\t\t\tif (!this.spatialGrid[key]) this.spatialGrid[key] = [];\n\t\t\t\t\tthis.spatialGrid[key].push(node);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tzoom = (factor: number, origin: Coordinates) => {\n\t\tconst newScale = this.data.scale * factor;\n\t\tthis.zoomToScale(newScale, origin);\n\t};\n\tzoomToScale = (newScale: number, origin: Coordinates) => {\n\t\tconst validNewScale = Math.max(Math.min(newScale, 20), 0.05);\n\t\tconst scale = this.data.scale;\n\t\tif (validNewScale === scale) return;\n\t\tconst canvasCoords = this.C2C(origin);\n\t\tthis.data.offsetX = origin.x - (canvasCoords.x * validNewScale) / scale;\n\t\tthis.data.offsetY = origin.y - (canvasCoords.y * validNewScale) / scale;\n\t\tthis.data.scale = validNewScale;\n\t};\n\tpan = ({ x, y }: Coordinates) => {\n\t\tthis.data.offsetX = this.data.offsetX + x;\n\t\tthis.data.offsetY = this.data.offsetY + y;\n\t};\n\tpanToCoords = ({ x, y }: Coordinates) => {\n\t\tthis.data.offsetX = x;\n\t\tthis.data.offsetY = y;\n\t};\n\tshiftFullscreen = (option: string = 'toggle') => {\n\t\tif (!document.fullscreenElement && (option === 'toggle' || option === 'enter')) {\n\t\t\tthis.data.container.requestFullscreen();\n\t\t\tthis.hooks.onToggleFullscreen(true);\n\t\t} else if (document.fullscreenElement && (option === 'toggle' || option === 'exit')) {\n\t\t\tdocument.exitFullscreen();\n\t\t\tthis.hooks.onToggleFullscreen(false);\n\t\t}\n\t};\n\tresetView = () => {\n\t\tconst bounds = this.data.nodeBounds;\n\t\tconst container = this.data.container;\n\t\tif (!bounds || !container) return;\n\t\tconst contentWidth = bounds.width + INITIAL_VIEWPORT_PADDING * 2;\n\t\tconst contentHeight = bounds.height + INITIAL_VIEWPORT_PADDING * 2;\n\t\t// Use logical dimensions for scaling calculations\n\t\tconst viewWidth = container.clientWidth;\n\t\tconst viewHeight = container.clientHeight;\n\t\tconst scaleX = viewWidth / contentWidth;\n\t\tconst scaleY = viewHeight / contentHeight;\n\t\tconst newScale = Math.round(Math.min(scaleX, scaleY) * 1000) / 1000;\n\t\tconst contentCenterX = bounds.centerX;\n\t\tconst contentCenterY = bounds.centerY;\n\t\tconst initialView = {\n\t\t\tscale: newScale,\n\t\t\toffsetX: viewWidth / 2 - contentCenterX * newScale,\n\t\t\toffsetY: viewHeight / 2 - contentCenterY * newScale,\n\t\t};\n\t\tthis.data.offsetX = initialView.offsetX;\n\t\tthis.data.offsetY = initialView.offsetY;\n\t\tthis.data.scale = initialView.scale;\n\t};\n\n\t// Container to Canvas\n\tprivate C2C = ({ x: containerX, y: containerY }: Coordinates) => ({\n\t\tx: containerX - this.data.offsetX,\n\t\ty: containerY - this.data.offsetY,\n\t});\n\t// Canvas to World\n\tprivate C2W = ({ x: canvasX, y: canvasY }: Coordinates) => ({\n\t\tx: canvasX / this.data.scale,\n\t\ty: canvasY / this.data.scale,\n\t});\n\n\tmiddleViewer = () => {\n\t\tconst container = this.data.container;\n\t\treturn {\n\t\t\tx: container.clientWidth / 2,\n\t\t\ty: container.clientHeight / 2,\n\t\t\twidth: container.clientWidth,\n\t\t\theight: container.clientHeight,\n\t\t};\n\t};\n\n\tdispose = () => {\n\t\tthis.data.container.remove();\n\t};\n}\n","import { type BaseArgs, BaseModule } from '@/baseModule';\nimport DataManager from '@/dataManager';\nimport style from '@/styles.scss?inline';\nimport utilities from '@/utilities';\n\ntype Options = {\n\tnoShadow?: boolean;\n};\n\nexport default class Controller extends BaseModule<Options> {\n\tprivate animationId: null | number = null;\n\tprivate resizeAnimationId: null | number = null;\n\tprivate DM: DataManager;\n\tprivate 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.DM.hooks.onCanvasFetched.subscribe(this.onFetched);\n\n\t\tconst parentContainer = this.options.container;\n\t\twhile (parentContainer.firstElementChild) parentContainer.firstElementChild.remove();\n\t\tparentContainer.innerHTML = '';\n\n\t\tconst noShadow = this.options.noShadow || false;\n\t\tconst realContainer = noShadow ? parentContainer : parentContainer.attachShadow({ mode: 'open' });\n\n\t\tutilities.applyStyles(realContainer, style);\n\n\t\tconst HTMLContainer = this.DM.data.container;\n\t\tHTMLContainer.classList.add('container');\n\t\trealContainer.appendChild(HTMLContainer);\n\t}\n\n\tprivate onFetched = () => {\n\t\tthis.DM.resetView();\n\t\tthis.resizeObserver.observe(this.DM.data.container);\n\t\tthis.animationId = requestAnimationFrame(this.draw);\n\t};\n\n\tprivate draw = () => {\n\t\tif (\n\t\t\tthis.perFrame.lastScale !== this.DM.data.scale ||\n\t\t\tthis.perFrame.lastOffsets.x !== this.DM.data.offsetX ||\n\t\t\tthis.perFrame.lastOffsets.y !== this.DM.data.offsetY\n\t\t)\n\t\t\tthis.refresh();\n\t\tthis.animationId = requestAnimationFrame(this.draw);\n\t};\n\n\tprivate refresh = () => {\n\t\tthis.perFrame.lastScale = this.DM.data.scale;\n\t\tthis.perFrame.lastOffsets = {\n\t\t\tx: this.DM.data.offsetX,\n\t\t\ty: this.DM.data.offsetY,\n\t\t};\n\t\tthis.hooks.onRefresh();\n\t};\n\n\tprivate onResize = () => {\n\t\tthis.resizeAnimationId = requestAnimationFrame(() => {\n\t\t\tconst center = this.DM.middleViewer();\n\t\t\tif (this.lastResizeCenter.x && this.lastResizeCenter.y) {\n\t\t\t\tthis.DM.data.offsetX = this.DM.data.offsetX + center.x - this.lastResizeCenter.x;\n\t\t\t\tthis.DM.data.offsetY = this.DM.data.offsetY + center.y - this.lastResizeCenter.y;\n\t\t\t}\n\t\t\tthis.lastResizeCenter.x = center.x;\n\t\t\tthis.lastResizeCenter.y = center.y;\n\t\t\tthis.hooks.onResize(center.width, center.height);\n\t\t\tthis.refresh();\n\t\t});\n\t};\n\tprivate resizeObserver: ResizeObserver = new ResizeObserver(this.onResize);\n\n\tdispose = () => {\n\t\tif (this.animationId) cancelAnimationFrame(this.animationId);\n\t\tif (this.resizeAnimationId) cancelAnimationFrame(this.resizeAnimationId);\n\t\tthis.resizeObserver.disconnect();\n\t};\n}\n","export const destroyError = new Error(\"[JSONCanvasViewer] Resource hasn't been set up or has been disposed.\");\n","import { micromark } from 'micromark';\nimport { type BaseArgs, BaseModule } from '@/baseModule';\nimport Controller from '@/controller';\nimport DataManager from '@/dataManager';\nimport InteractionHandler from '@/interactionHandler';\nimport { destroyError } from '@/shared';\nimport utilities from '@/utilities';\n\ntype Options = {\n\tmicromark?: Parameters<typeof micromark>[1];\n};\n\nexport default class OverlayManager extends BaseModule<Options> {\n\tprivate _overlaysLayer: HTMLDivElement | null = document.createElement('div');\n\tprivate overlays: Record<string, HTMLDivElement> = {}; // { id: node } the overlays in viewport\n\tprivate selectedId: string | null = null;\n\tprivate eventListeners: Record<string, Array<EventListener | null>> = {};\n\tprivate DM: DataManager;\n\tprivate IH: () => InteractionHandler;\n\tprivate parse: (markdown: string) => string;\n\n\tprivate get overlaysLayer() {\n\t\tif (!this._overlaysLayer) throw destroyError;\n\t\treturn this._overlaysLayer;\n\t}\n\n\thooks = {\n\t\tonInteractionStart: utilities.makeHook(),\n\t\tonInteractionEnd: utilities.makeHook(),\n\t};\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tthis.parse = (markdown: string) => micromark(markdown, this.options.micromark);\n\t\tthis.DM = this.container.get(DataManager);\n\t\tthis.IH = this.container.get(InteractionHandler, { lazy: true });\n\t\tconst controller = this.container.get(Controller);\n\t\tthis.DM.hooks.onCanvasFetched.subscribe(this.onFetched);\n\t\tcontroller.hooks.onRefresh.subscribe(this.updateOverlays);\n\n\t\tthis._overlaysLayer = document.createElement('div');\n\t\tthis._overlaysLayer.className = 'overlays';\n\t\tthis.DM.data.container.appendChild(this.overlaysLayer);\n\t}\n\n\tprivate onFetched = () => {\n\t\tthis.IH().onClick.subscribe(this.select);\n\t\tconst cbd = this.DM.data.canvasBaseDir;\n\t\tconst createOverlay = async (node: JSONCanvasNode) => {\n\t\t\tswitch (node.type) {\n\t\t\t\tcase 'text': {\n\t\t\t\t\tthis.updateOverlay(node, node.text, 'text');\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'file': {\n\t\t\t\t\tif (node.file.match(/\\.md$/i)) this.loadMarkdownForNode(node);\n\t\t\t\t\telse if (node.file.match(/\\.(png|jpg|jpeg|gif|svg|webp)$/i))\n\t\t\t\t\t\tthis.updateOverlay(node, cbd + node.file, 'image');\n\t\t\t\t\telse if (node.file.match(/\\.(mp3|wav)$/i))\n\t\t\t\t\t\tthis.updateOverlay(node, cbd + node.file, 'audio');\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'link': {\n\t\t\t\t\tthis.updateOverlay(node, node.url, 'link');\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tObject.values(this.DM.data.nodeMap).forEach(node => {\n\t\t\tcreateOverlay(node);\n\t\t});\n\t};\n\n\tprivate select = (id: string | null) => {\n\t\tconst previous = !this.selectedId ? null : this.overlays[this.selectedId];\n\t\tconst current = !id ? null : this.overlays[id];\n\t\tif (previous) previous.classList.remove('active');\n\t\tif (current) {\n\t\t\tcurrent.classList.add('active');\n\t\t\tthis.hooks.onInteractionStart();\n\t\t} else this.hooks.onInteractionEnd();\n\t\tthis.selectedId = id;\n\t};\n\n\tprivate loadMarkdownForNode = async (node: JSONCanvasFileNode) => {\n\t\tthis.updateOverlay(node, 'Loading...', 'text');\n\t\tlet parsedContent: string;\n\t\ttry {\n\t\t\tconst response = await fetch(this.DM.data.canvasBaseDir + node.file);\n\t\t\tconst result = await response.text();\n\t\t\tconst frontmatterMatch = result.match(/^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/);\n\t\t\tif (frontmatterMatch) parsedContent = this.parse(frontmatterMatch[2]);\n\t\t\telse parsedContent = this.parse(result);\n\t\t} catch (err) {\n\t\t\tconsole.error('[JSONCanvasViewer] Failed to load markdown:', err);\n\t\t\tparsedContent = 'Failed to load content.';\n\t\t}\n\t\tthis.updateOverlay(node, parsedContent, 'text');\n\t};\n\n\tprivate updateOverlays = () => {\n\t\tconst data = this.DM.data;\n\t\tthis.overlaysLayer.style.transform = `translate(${data.offsetX}px, ${data.offsetY}px) scale(${data.scale})`;\n\t};\n\n\tprivate updateOverlay(node: JSONCanvasNode, content: string, type: string) {\n\t\tlet element = this.overlays[node.id];\n\t\tif (!element) {\n\t\t\telement = this.constructOverlay(node, content, type);\n\t\t\tthis.overlaysLayer.appendChild(element);\n\t\t\tthis.overlays[node.id] = element;\n\t\t\telement.style.left = `${node.x}px`;\n\t\t\telement.style.top = `${node.y}px`;\n\t\t\telement.style.width = `${node.width}px`;\n\t\t\telement.style.height = `${node.height}px`;\n\t\t} else if (type === 'text') {\n\t\t\tconst parsedContentContainer = element.getElementsByClassName('parsed-content-wrapper')[0];\n\t\t\tparsedContentContainer.innerHTML = content;\n\t\t}\n\t}\n\n\tprivate constructOverlay(node: JSONCanvasNode, content: string, type: string) {\n\t\tconst color = utilities.getColor(node.color);\n\t\tconst overlay = document.createElement('div');\n\t\toverlay.classList.add('overlay-container');\n\t\toverlay.id = node.id;\n\t\toverlay.style.backgroundColor = color.background;\n\t\toverlay.style.setProperty('--active-color', color.active);\n\t\tswitch (type) {\n\t\t\tcase 'text': {\n\t\t\t\toverlay.classList.add('markdown-content');\n\t\t\t\tconst parsedContentWrapper = document.createElement('div');\n\t\t\t\tparsedContentWrapper.innerHTML = this.parse(content || '');\n\t\t\t\tparsedContentWrapper.classList.add('parsed-content-wrapper');\n\t\t\t\toverlay.appendChild(parsedContentWrapper);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'link': {\n\t\t\t\tconst iframe = document.createElement('iframe');\n\t\t\t\tiframe.src = content;\n\t\t\t\tiframe.sandbox = 'allow-scripts allow-same-origin';\n\t\t\t\tiframe.className = 'link-iframe';\n\t\t\t\tiframe.loading = 'lazy';\n\t\t\t\toverlay.appendChild(iframe);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'audio': {\n\t\t\t\tconst audio = document.createElement('audio');\n\t\t\t\taudio.className = 'audio';\n\t\t\t\taudio.src = content;\n\t\t\t\taudio.controls = true;\n\t\t\t\toverlay.appendChild(audio);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'image': {\n\t\t\t\tconst img = document.createElement('img');\n\t\t\t\timg.src = content;\n\t\t\t\timg.loading = 'lazy';\n\t\t\t\toverlay.appendChild(img);\n\t\t\t}\n\t\t}\n\t\tswitch (type) {\n\t\t\tcase 'link':\n\t\t\tcase 'audio': {\n\t\t\t\tconst clickLayer = document.createElement('div');\n\t\t\t\tclickLayer.className = 'click-layer';\n\t\t\t\toverlay.appendChild(clickLayer);\n\t\t\t}\n\t\t}\n\t\tconst overlayBorder = document.createElement('div');\n\t\toverlayBorder.className = 'overlay-border';\n\t\toverlayBorder.style.borderColor = color.border;\n\t\toverlay.appendChild(overlayBorder);\n\t\tconst onStart = () => {\n\t\t\tif (node.id === this.selectedId) this.hooks.onInteractionStart();\n\t\t};\n\t\tconst onEnd = () => {\n\t\t\tif (node.id === this.selectedId) this.hooks.onInteractionEnd();\n\t\t};\n\t\toverlay.addEventListener('pointerenter', onStart);\n\t\toverlay.addEventListener('pointerleave', onEnd);\n\t\toverlay.addEventListener('touchstart', onStart);\n\t\toverlay.addEventListener('touchend', onEnd);\n\t\tthis.eventListeners[node.id] = [onStart, onEnd];\n\t\treturn overlay;\n\t}\n\n\tdispose = () => {\n\t\twhile (this.overlaysLayer.firstElementChild) {\n\t\t\tconst child = this.overlaysLayer.firstElementChild;\n\t\t\tif (this.eventListeners[child.id]) {\n\t\t\t\tconst onStart = this.eventListeners[child.id][0];\n\t\t\t\tconst onEnd = this.eventListeners[child.id][1];\n\t\t\t\tif (!onStart || !onEnd) throw destroyError;\n\t\t\t\tchild.removeEventListener('pointerenter', onStart);\n\t\t\t\tchild.removeEventListener('pointerleave', onEnd);\n\t\t\t\tchild.removeEventListener('touchstart', onStart);\n\t\t\t\tchild.removeEventListener('touchend', onEnd);\n\t\t\t\tthis.eventListeners[child.id][0] = null;\n\t\t\t\tthis.eventListeners[child.id][1] = null;\n\t\t\t}\n\t\t\tchild.remove();\n\t\t}\n\t\tthis.overlaysLayer.remove();\n\t\tthis._overlaysLayer = null;\n\t};\n}\n","import {\n\tClick,\n\ttype Ctors,\n\tDrag,\n\tMultitouchPanZoom,\n\tPointeract,\n\ttype Options as PointeractOptions,\n\tPreventDefault,\n\ttype StdEvents,\n\tWheelPanZoom,\n} from 'pointeract';\nimport { type BaseArgs, BaseModule } from '@/baseModule';\nimport DataManager from '@/dataManager';\nimport OverlayManager from '@/overlayManager';\nimport utilities from '@/utilities';\n\ntype Options = {\n\tpointeract?: PointeractOptions<Ctors<[Click, Drag, WheelPanZoom, PreventDefault, MultitouchPanZoom]>>;\n};\n\nexport default class InteractionHandler extends BaseModule<Options> {\n\tprivate pointeract: Pointeract<Ctors<[Click, Drag, WheelPanZoom, PreventDefault, MultitouchPanZoom]>>;\n\tprivate DM: DataManager;\n\tonClick = utilities.makeHook<[string | null]>();\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tthis.DM = this.container.get(DataManager);\n\t\tconst options = Object.assign(this.options.pointeract || {}, {\n\t\t\tcoordinateOutput: 'relative',\n\t\t});\n\t\tthis.pointeract = new Pointeract(\n\t\t\tthis.DM.data.container,\n\t\t\t[Click, Drag, WheelPanZoom, PreventDefault, MultitouchPanZoom],\n\t\t\toptions,\n\t\t);\n\t\tthis.startInteraction = this.pointeract.start;\n\t\tthis.stopInteraction = this.pointeract.stop;\n\t\tconst OM = this.container.get(OverlayManager);\n\t\tOM.hooks.onInteractionStart.subscribe(this.stopInteraction);\n\t\tOM.hooks.onInteractionEnd.subscribe(this.startInteraction);\n\t\tthis.DM.hooks.onCanvasFetched.subscribe(this.onFetched);\n\t}\n\tstopInteraction: Pointeract['stop'];\n\tstartInteraction: Pointeract['start'];\n\n\tprivate onFetched = () => {\n\t\tthis.pointeract.on('pan', this.onPan);\n\t\tthis.pointeract.on('drag', this.onPan);\n\t\tthis.pointeract.on('zoom', this.onZoom);\n\t\tthis.pointeract.on('trueClick', this.onTrueClick);\n\t\tthis.pointeract.start();\n\t};\n\n\tprivate onPan = (event: StdEvents['pan']) => {\n\t\tthis.DM.pan(event.detail);\n\t};\n\tprivate onZoom = (event: StdEvents['zoom']) => {\n\t\tconst detail = event.detail;\n\t\tthis.DM.zoom(detail.factor, { x: detail.x, y: detail.y });\n\t};\n\n\tprivate onTrueClick = (e: StdEvents['trueClick']) => {\n\t\tconst detail = e.detail;\n\t\tfunction isUIControl(target: HTMLElement | null) {\n\t\t\tif (!target) return false;\n\t\t\treturn target.closest('.controls') || target.closest('button') || target.closest('input');\n\t\t}\n\t\tif (isUIControl(e.detail.target as HTMLElement | null)) return;\n\t\tconst node = this.DM.findNodeAt({ x: detail.x, y: detail.y });\n\t\tthis.onClick(node ? node.id : null);\n\t};\n\n\tdispose = () => {\n\t\tthis.pointeract.off('pan', this.onPan);\n\t\tthis.pointeract.off('zoom', this.onZoom);\n\t\tthis.pointeract.off('trueClick', this.onTrueClick);\n\t\tthis.pointeract.dispose();\n\t};\n}\n","import { type BaseArgs, BaseModule } from '@/baseModule';\nimport Controller from '@/controller';\nimport DataManager from '@/dataManager';\nimport { destroyError } from '@/shared';\nimport utilities from '@/utilities';\n\ninterface viewport {\n\tleft: number;\n\tright: number;\n\ttop: number;\n\tbottom: number;\n}\n\ninterface RuntimeJSONCanvasEdge extends JSONCanvasEdge {\n\tcontrolPoints?: Array<number>;\n}\n\nconst ARROW_LENGTH = 12;\nconst ARROW_WIDTH = 7;\nconst NODE_RADIUS = 12;\nconst FONT_COLOR = '#fff';\nconst CSS_ZOOM_REDRAW_INTERVAL = 500;\n\nexport default class Renderer extends BaseModule {\n\tprivate _canvas: HTMLCanvasElement | null;\n\tprivate ctx: CanvasRenderingContext2D;\n\tprivate DM: DataManager;\n\tprivate zoomInOptimize: {\n\t\tlastDrawnScale: number;\n\t\tlastDrawnViewport: viewport;\n\t\ttimeout: NodeJS.Timeout | null;\n\t\tlastCallTime: number;\n\t} = {\n\t\tlastDrawnScale: 0,\n\t\tlastDrawnViewport: {\n\t\t\tleft: 0,\n\t\t\tright: 0,\n\t\t\ttop: 0,\n\t\t\tbottom: 0,\n\t\t},\n\t\ttimeout: null,\n\t\tlastCallTime: 0,\n\t};\n\n\tprivate get canvas() {\n\t\tif (this._canvas === null) throw destroyError;\n\t\treturn this._canvas;\n\t}\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tconst controller = this.container.get(Controller);\n\t\tcontroller.hooks.onRefresh.subscribe(this.redraw);\n\t\tcontroller.hooks.onResize.subscribe(this.optimizeDPR);\n\t\tthis.DM = this.container.get(DataManager);\n\t\tthis._canvas = document.createElement('canvas');\n\t\tthis._canvas.className = 'main-canvas';\n\t\tthis.ctx = this._canvas.getContext('2d') as CanvasRenderingContext2D;\n\t\tthis.DM.data.container.appendChild(this._canvas);\n\t}\n\n\tprivate optimizeDPR = () => {\n\t\tconst container = this.DM.data.container;\n\t\tutilities.resizeCanvasForDPR(this.canvas, container.offsetWidth, container.offsetHeight);\n\t};\n\n\tprivate redraw = () => {\n\t\tif (this.zoomInOptimize.timeout) {\n\t\t\tclearTimeout(this.zoomInOptimize.timeout);\n\t\t\tthis.zoomInOptimize.timeout = null;\n\t\t}\n\t\tconst now = Date.now();\n\t\tconst offsetX = this.DM.data.offsetX;\n\t\tconst offsetY = this.DM.data.offsetY;\n\t\tconst scale = this.DM.data.scale;\n\t\tconst currentViewport = this.getCurrentViewport(offsetX, offsetY, scale);\n\t\tif (\n\t\t\tthis.isViewportInside(currentViewport, this.zoomInOptimize.lastDrawnViewport) &&\n\t\t\tscale !== this.zoomInOptimize.lastDrawnScale\n\t\t) {\n\t\t\tconst timeSinceLast = now - this.zoomInOptimize.lastCallTime;\n\t\t\tif (timeSinceLast < CSS_ZOOM_REDRAW_INTERVAL) {\n\t\t\t\tthis.zoomInOptimize.timeout = setTimeout(() => {\n\t\t\t\t\tthis.trueRedraw(offsetX, offsetY, scale, currentViewport);\n\t\t\t\t\tthis.zoomInOptimize.lastCallTime = now;\n\t\t\t\t\tthis.zoomInOptimize.timeout = null;\n\t\t\t\t}, 60);\n\t\t\t\tthis.fakeRedraw(currentViewport, scale);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tthis.zoomInOptimize.lastCallTime = now;\n\t\tthis.trueRedraw(offsetX, offsetY, scale, currentViewport);\n\t};\n\n\tprivate trueRedraw(offsetX: number, offsetY: number, scale: number, currentViewport: viewport) {\n\t\tthis.zoomInOptimize.lastDrawnViewport = currentViewport;\n\t\tthis.zoomInOptimize.lastDrawnScale = scale;\n\t\tthis.canvas.style.transform = '';\n\t\tthis.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n\t\tthis.ctx.save();\n\t\tthis.ctx.translate(offsetX, offsetY);\n\t\tthis.ctx.scale(scale, scale);\n\t\tconst canvasData = this.DM.data.canvasData;\n\t\tcanvasData.nodes.forEach(node => {\n\t\t\tswitch (node.type) {\n\t\t\t\tcase 'group':\n\t\t\t\t\tthis.drawGroup(node, scale);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'file':\n\t\t\t\t\tthis.drawFileNode(node);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\t\tcanvasData.edges.forEach(edge => {\n\t\t\tthis.drawEdge(edge);\n\t\t});\n\t\tthis.ctx.restore();\n\t}\n\n\tprivate fakeRedraw(currentViewport: viewport, scale: number) {\n\t\tconst cssScale = scale / this.zoomInOptimize.lastDrawnScale;\n\t\tconst currentOffsetX = (this.zoomInOptimize.lastDrawnViewport.left - currentViewport.left) * scale;\n\t\tconst currentOffsetY = (this.zoomInOptimize.lastDrawnViewport.top - currentViewport.top) * scale;\n\t\tthis.canvas.style.transform = `translate(${currentOffsetX}px, ${currentOffsetY}px) scale(${cssScale})`;\n\t}\n\n\tprivate isViewportInside = (inner: viewport, outer: viewport) =>\n\t\tinner.left > outer.left &&\n\t\tinner.top > outer.top &&\n\t\tinner.right < outer.right &&\n\t\tinner.bottom < outer.bottom;\n\n\tprivate getCurrentViewport = (offsetX: number, offsetY: number, scale: number) => {\n\t\tconst left = -offsetX / scale;\n\t\tconst top = -offsetY / scale;\n\t\tconst container = this.DM.data.container;\n\t\tconst right = left + container.clientWidth / scale;\n\t\tconst bottom = top + container.clientHeight / scale;\n\t\treturn { left, top, right, bottom };\n\t};\n\n\tprivate drawLabelBar = (x: number, y: number, label: string, color: string, scale: number) => {\n\t\tconst barHeight = 30 * scale;\n\t\tconst radius = 6 * scale;\n\t\tconst yOffset = 8 * scale;\n\t\tconst fontSize = 16 * scale;\n\t\tconst xPadding = 6 * scale;\n\t\tthis.ctx.save();\n\t\tthis.ctx.translate(x, y);\n\t\tthis.ctx.scale(1 / scale, 1 / scale);\n\t\tthis.ctx.font = `${fontSize}px 'Inter', sans-serif`;\n\t\tconst barWidth = this.ctx.measureText(label).width + 2 * xPadding;\n\t\tthis.ctx.translate(0, -barHeight - yOffset);\n\t\tthis.ctx.fillStyle = color;\n\t\tthis.ctx.beginPath();\n\t\tthis.ctx.moveTo(radius, 0);\n\t\tthis.ctx.lineTo(barWidth - radius, 0);\n\t\tthis.ctx.quadraticCurveTo(barWidth, 0, barWidth, radius);\n\t\tthis.ctx.lineTo(barWidth, barHeight - radius);\n\t\tthis.ctx.quadraticCurveTo(barWidth, barHeight, barWidth - radius, barHeight);\n\t\tthis.ctx.lineTo(radius, barHeight);\n\t\tthis.ctx.quadraticCurveTo(0, barHeight, 0, barHeight - radius);\n\t\tthis.ctx.lineTo(0, radius);\n\t\tthis.ctx.quadraticCurveTo(0, 0, radius, 0);\n\t\tthis.ctx.closePath();\n\t\tthis.ctx.fill();\n\t\tthis.ctx.fillStyle = FONT_COLOR;\n\t\tthis.ctx.fillText(label, xPadding, barHeight * 0.65);\n\t\tthis.ctx.restore();\n\t};\n\n\tprivate drawNodeBackground = (node: JSONCanvasNode) => {\n\t\tconst colors = utilities.getColor(node.color);\n\t\tconst radius = NODE_RADIUS;\n\t\tthis.ctx.globalAlpha = 1.0;\n\t\tthis.ctx.fillStyle = colors.background;\n\t\tutilities.drawRoundRect(this.ctx, node.x + 1, node.y + 1, node.width - 2, node.height - 2, radius);\n\t\tthis.ctx.fill();\n\t\tthis.ctx.strokeStyle = colors.border;\n\t\tthis.ctx.lineWidth = 2;\n\t\tutilities.drawRoundRect(this.ctx, node.x, node.y, node.width, node.height, radius);\n\t\tthis.ctx.stroke();\n\t};\n\n\tprivate drawGroup = (node: JSONCanvasGroupNode, scale: number) => {\n\t\tthis.drawNodeBackground(node);\n\t\tif (node.label)\n\t\t\tthis.drawLabelBar(node.x, node.y, node.label, utilities.getColor(node.color).border, scale);\n\t};\n\n\tprivate drawFileNode = (node: JSONCanvasFileNode) => {\n\t\tthis.ctx.fillStyle = FONT_COLOR;\n\t\tthis.ctx.font = '16px sans-serif';\n\t\tthis.ctx.fillText(node.file, node.x + 5, node.y - 10);\n\t};\n\n\tprivate drawEdge = (edge: RuntimeJSONCanvasEdge) => {\n\t\tconst { fromNode, toNode } = this.getEdgeNodes(edge);\n\t\tconst gac = utilities.getAnchorCoord;\n\t\tconst [startX, startY] = gac(fromNode, edge.fromSide);\n\t\tconst [endX, endY] = gac(toNode, edge.toSide);\n\t\tlet [startControlX, startControlY, endControlX, endControlY] = [0, 0, 0, 0];\n\t\tif (!edge.controlPoints) {\n\t\t\t[startControlX, startControlY, endControlX, endControlY] = this.getControlPoints(\n\t\t\t\tstartX,\n\t\t\t\tstartY,\n\t\t\t\tendX,\n\t\t\t\tendY,\n\t\t\t\tedge.fromSide,\n\t\t\t\tedge.toSide,\n\t\t\t);\n\t\t\tedge.controlPoints = [startControlX, startControlY, endControlX, endControlY];\n\t\t} else [startControlX, startControlY, endControlX, endControlY] = edge.controlPoints;\n\t\tthis.drawCurvedPath(\n\t\t\tstartX,\n\t\t\tstartY,\n\t\t\tendX,\n\t\t\tendY,\n\t\t\tstartControlX,\n\t\t\tstartControlY,\n\t\t\tendControlX,\n\t\t\tendControlY,\n\t\t);\n\t\tthis.drawArrowhead(endX, endY, endControlX, endControlY);\n\t\tif (edge.label) {\n\t\t\tconst t = 0.5;\n\t\t\tconst x =\n\t\t\t\t(1 - t) ** 3 * startX +\n\t\t\t\t3 * (1 - t) ** 2 * t * startControlX +\n\t\t\t\t3 * (1 - t) * t * t * endControlX +\n\t\t\t\tt ** 3 * endX;\n\t\t\tconst y =\n\t\t\t\t(1 - t) ** 3 * startY +\n\t\t\t\t3 * (1 - t) ** 2 * t * startControlY +\n\t\t\t\t3 * (1 - t) * t * t * endControlY +\n\t\t\t\tt ** 3 * endY;\n\t\t\tthis.ctx.font = '18px sans-serif';\n\t\t\tconst metrics = this.ctx.measureText(edge.label);\n\t\t\tconst padding = 8;\n\t\t\tconst labelWidth = metrics.width + padding * 2;\n\t\t\tconst labelHeight = 20;\n\t\t\tthis.ctx.fillStyle = '#222';\n\t\t\tthis.ctx.beginPath();\n\t\t\tutilities.drawRoundRect(\n\t\t\t\tthis.ctx,\n\t\t\t\tx - labelWidth / 2,\n\t\t\t\ty - labelHeight / 2 - 2,\n\t\t\t\tlabelWidth,\n\t\t\t\tlabelHeight,\n\t\t\t\t4,\n\t\t\t);\n\t\t\tthis.ctx.fill();\n\t\t\tthis.ctx.fillStyle = '#ccc';\n\t\t\tthis.ctx.textAlign = 'center';\n\t\t\tthis.ctx.textBaseline = 'middle';\n\t\t\tthis.ctx.fillText(edge.label, x, y - 2);\n\t\t\tthis.ctx.textAlign = 'left';\n\t\t\tthis.ctx.textBaseline = 'alphabetic';\n\t\t}\n\t};\n\n\tprivate getEdgeNodes = (edge: JSONCanvasEdge) => ({\n\t\tfromNode: this.DM.data.nodeMap[edge.fromNode],\n\t\ttoNode: this.DM.data.nodeMap[edge.toNode],\n\t});\n\n\tprivate getControlPoints = (\n\t\tstartX: number,\n\t\tstartY: number,\n\t\tendX: number,\n\t\tendY: number,\n\t\tfromSide: string,\n\t\ttoSide: string,\n\t) => {\n\t\tconst distanceX = endX - startX;\n\t\tconst distanceY = endY - startY;\n\t\tconst realDistance =\n\t\t\tMath.min(Math.abs(distanceX), Math.abs(distanceY)) +\n\t\t\t0.3 * Math.max(Math.abs(distanceX), Math.abs(distanceY));\n\t\tconst clamp = (val: number, min: number, max: number) => Math.max(min, Math.min(max, val));\n\t\tconst PADDING = clamp(realDistance * 0.5, 60, 300);\n\t\tlet startControlX = startX;\n\t\tlet startControlY = startY;\n\t\tlet endControlX = endX;\n\t\tlet endControlY = endY;\n\t\tswitch (fromSide) {\n\t\t\tcase 'top':\n\t\t\t\tstartControlY = startY - PADDING;\n\t\t\t\tbreak;\n\t\t\tcase 'bottom':\n\t\t\t\tstartControlY = startY + PADDING;\n\t\t\t\tbreak;\n\t\t\tcase 'left':\n\t\t\t\tstartControlX = startX - PADDING;\n\t\t\t\tbreak;\n\t\t\tcase 'right':\n\t\t\t\tstartControlX = startX + PADDING;\n\t\t\t\tbreak;\n\t\t}\n\t\tswitch (toSide) {\n\t\t\tcase 'top':\n\t\t\t\tendControlY = endY - PADDING;\n\t\t\t\tbreak;\n\t\t\tcase 'bottom':\n\t\t\t\tendControlY = endY + PADDING;\n\t\t\t\tbreak;\n\t\t\tcase 'left':\n\t\t\t\tendControlX = endX - PADDING;\n\t\t\t\tbreak;\n\t\t\tcase 'right':\n\t\t\t\tendControlX = endX + PADDING;\n\t\t\t\tbreak;\n\t\t}\n\t\treturn [startControlX, startControlY, endControlX, endControlY];\n\t};\n\n\tprivate drawCurvedPath = (\n\t\tstartX: number,\n\t\tstartY: number,\n\t\tendX: number,\n\t\tendY: number,\n\t\tc1x: number,\n\t\tc1y: number,\n\t\tc2x: number,\n\t\tc2y: number,\n\t) => {\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 = '#ccc';\n\t\tthis.ctx.lineWidth = 2;\n\t\tthis.ctx.stroke();\n\t};\n\n\tprivate drawArrowhead = (tipX: number, tipY: number, fromX: number, fromY: number) => {\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 = '#ccc';\n\t\tthis.ctx.moveTo(tipX, tipY);\n\t\tthis.ctx.lineTo(leftX, leftY);\n\t\tthis.ctx.lineTo(rightX, rightY);\n\t\tthis.ctx.closePath();\n\t\tthis.ctx.fill();\n\t};\n\n\tdispose = () => {\n\t\tif (this.zoomInOptimize.timeout) {\n\t\t\tclearTimeout(this.zoomInOptimize.timeout);\n\t\t\tthis.zoomInOptimize.timeout = null;\n\t\t}\n\t\tthis.canvas.remove();\n\t\tthis._canvas = null;\n\t};\n}\n","export { type BaseArgs, BaseModule } from '@/baseModule';\nexport { JSONCanvasViewer } from '@/canvasViewer';\nexport { default as Controls } from '@/controls';\nexport { default as DebugPanel } from '@/debugPanel';\nexport { default as Minimap } from '@/minimap';\nexport { default as MistouchPreventer } from '@/mistouchPreventer';\nexport { default as renderToString } from '@/renderToString';\nexport { default as CanvasUtils } from '@/utilities';\n\nimport Controller from '@/controller';\nimport DataManager from '@/dataManager';\nimport InteractionHandler from '@/interactionHandler';\nimport OverlayManager from '@/overlayManager';\nimport Renderer from '@/renderer';\nexport const developerSuite = {\n\tController,\n\tDataManager,\n\tInteractionHandler,\n\tRenderer,\n\tOverlayManager,\n};\n","import { type BaseArgs, BaseModule } from '@/baseModule';\nimport Controller from '@/controller';\nimport DataManager from '@/dataManager';\nimport { destroyError } from '@/shared';\nimport utilities from '@/utilities';\nimport style from './styles.scss?inline';\n\ntype Options = {\n\tcontrolsCollapsed?: boolean;\n};\n\nexport default class Controls extends BaseModule<Options> {\n\tprivate _controlsPanel: HTMLDivElement | null = null;\n\tprivate _toggleCollapseBtn: HTMLButtonElement | null = null;\n\tprivate _toggleFullscreenBtn: HTMLButtonElement | null = null;\n\tprivate _zoomOutBtn: HTMLButtonElement | null = null;\n\tprivate _zoomSlider: HTMLInputElement | null = null;\n\tprivate _zoomInBtn: HTMLButtonElement | null = null;\n\tprivate _resetViewBtn: HTMLButtonElement | null = null;\n\tprivate DM: DataManager;\n\tprivate collapsed: boolean;\n\n\tprivate get controlsPanel() {\n\t\tif (this._controlsPanel === null) throw destroyError;\n\t\treturn this._controlsPanel;\n\t}\n\tprivate get toggleCollapseBtn() {\n\t\tif (this._toggleCollapseBtn === null) throw destroyError;\n\t\treturn this._toggleCollapseBtn;\n\t}\n\tprivate get toggleFullscreenBtn() {\n\t\tif (this._toggleFullscreenBtn === null) throw destroyError;\n\t\treturn this._toggleFullscreenBtn;\n\t}\n\tprivate get zoomOutBtn() {\n\t\tif (this._zoomOutBtn === null) throw destroyError;\n\t\treturn this._zoomOutBtn;\n\t}\n\tprivate get zoomSlider() {\n\t\tif (this._zoomSlider === null) throw destroyError;\n\t\treturn this._zoomSlider;\n\t}\n\tprivate get zoomInBtn() {\n\t\tif (this._zoomInBtn === null) throw destroyError;\n\t\treturn this._zoomInBtn;\n\t}\n\tprivate get resetViewBtn() {\n\t\tif (this._resetViewBtn === null) throw destroyError;\n\t\treturn this._resetViewBtn;\n\t}\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tthis.collapsed = this.options.controlsCollapsed || false;\n\t\tthis.DM = this.container.get(DataManager);\n\t\tthis.DM.hooks.onToggleFullscreen.subscribe(this.updateFullscreenBtn);\n\t\tthis.container.get(Controller).hooks.onRefresh.subscribe(this.updateSlider);\n\n\t\tthis._controlsPanel = document.createElement('div');\n\t\tthis._controlsPanel.className = 'controls';\n\t\tthis._controlsPanel.classList.toggle('collapsed', this.collapsed);\n\n\t\tutilities.applyStyles(this._controlsPanel, style);\n\n\t\tthis._toggleCollapseBtn = document.createElement('button');\n\t\tthis._toggleCollapseBtn.className = 'collapse-button';\n\t\tthis._toggleCollapseBtn.innerHTML =\n\t\t\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\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 = `<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>`;\n\t\tcontrolsContent.appendChild(this._toggleFullscreenBtn);\n\n\t\tthis._zoomOutBtn = document.createElement('button');\n\t\tthis._zoomOutBtn.innerHTML =\n\t\t\t'<svg viewBox=\"-1.2 -1.2 26.4 26.4\"><path d=\"M6 12h12\" stroke-width=\"2\" stroke-linecap=\"round\" /></svg>';\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 =\n\t\t\t'<svg viewBox=\"-1.2 -1.2 26.4 26.4\"><path d=\"M6 12h12m-6-6v12\" stroke-width=\"2\" stroke-linecap=\"round\" /></svg>';\n\t\tcontrolsContent.appendChild(this._zoomInBtn);\n\n\t\tthis._resetViewBtn = document.createElement('button');\n\t\tthis._resetViewBtn.innerHTML =\n\t\t\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>';\n\t\tcontrolsContent.appendChild(this._resetViewBtn);\n\n\t\tthis._controlsPanel.appendChild(controlsContent);\n\n\t\tthis.DM.data.container.appendChild(this._controlsPanel);\n\n\t\tthis._toggleCollapseBtn.addEventListener('click', this.toggleCollapse);\n\t\tthis._zoomInBtn.addEventListener('click', this.zoomIn);\n\t\tthis._zoomOutBtn.addEventListener('click', this.zoomOut);\n\t\tthis._zoomSlider.addEventListener('input', this.slide);\n\t\tthis._resetViewBtn.addEventListener('click', this.DM.resetView);\n\t\tthis._toggleFullscreenBtn.addEventListener('click', this.toggleFullscreen);\n\t}\n\ttoggleCollapse = () => {\n\t\tthis.collapsed = !this.collapsed;\n\t\tthis.controlsPanel.classList.toggle('collapsed', this.collapsed);\n\t\tif (!this.collapsed) this.updateSlider();\n\t};\n\tprivate zoomIn = () => this.DM.zoom(1.1, this.DM.middleViewer());\n\tprivate zoomOut = () => this.DM.zoom(1 / 1.1, this.DM.middleViewer());\n\tprivate slide = () => this.DM.zoomToScale(1.1 ** Number(this.zoomSlider.value), this.DM.middleViewer());\n\n\tprivate updateFullscreenBtn = (enter: boolean) => {\n\t\tif (enter)\n\t\t\tthis.toggleFullscreenBtn.innerHTML = `<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>`;\n\t\telse\n\t\t\tthis.toggleFullscreenBtn.innerHTML = `<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>`;\n\t};\n\tprivate toggleFullscreen = () => this.DM.shiftFullscreen('toggle');\n\n\tprivate updateSlider = () => {\n\t\tif (this.collapsed) return;\n\t\tthis.zoomSlider.value = String(this.scaleToSlider(this.DM.data.scale));\n\t};\n\tprivate scaleToSlider = (scale: number) => Math.log(scale) / Math.log(1.1);\n\n\tdispose = () => {\n\t\tthis.toggleCollapseBtn.removeEventListener('click', this.toggleCollapse);\n\t\tthis.zoomInBtn.removeEventListener('click', this.zoomIn);\n\t\tthis.zoomOutBtn.removeEventListener('click', this.zoomOut);\n\t\tthis.zoomSlider.removeEventListener('input', this.slide);\n\t\tthis.resetViewBtn.removeEventListener('click', this.DM.resetView);\n\t\tthis.toggleFullscreenBtn.removeEventListener('click', this.toggleFullscreen);\n\t\tthis.controlsPanel.remove();\n\t\tthis._controlsPanel = null;\n\t\tthis._toggleCollapseBtn = null;\n\t\tthis._zoomInBtn = null;\n\t\tthis._zoomOutBtn = null;\n\t\tthis._zoomSlider = null;\n\t\tthis._resetViewBtn = null;\n\t\tthis._toggleFullscreenBtn = null;\n\t};\n}\n","import { type BaseArgs, BaseModule } from '@/baseModule';\nimport Controller from '@/controller';\nimport DataManager from '@/dataManager';\nimport { destroyError } from '@/shared';\nimport utilities from '@/utilities';\nimport style from './styles.scss?inline';\n\nexport default class DebugPanel extends BaseModule {\n\tprivate _debugPanel: HTMLDivElement | null = null;\n\tprivate DM: DataManager;\n\n\tprivate get debugPanel() {\n\t\tif (!this._debugPanel) throw destroyError;\n\t\treturn this._debugPanel;\n\t}\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tthis.DM = this.container.get(DataManager);\n\t\tthis.container.get(Controller).hooks.onRefresh.subscribe(this.update);\n\t\tthis._debugPanel = document.createElement('div');\n\t\tthis._debugPanel.className = 'debug-panel';\n\t\tconst HTMLContainer = this.DM.data.container;\n\t\tutilities.applyStyles(HTMLContainer, style);\n\t\tHTMLContainer.appendChild(this._debugPanel);\n\t}\n\n\tprivate update = () => {\n\t\tconst round = utilities.round;\n\t\tconst data = this.DM.data;\n\t\tthis.debugPanel.innerHTML = `<p>Scale: ${round(data.scale, 3)}</p><p>Offset: ${round(data.offsetX, 1)}, ${round(data.offsetY, 1)}</p>`;\n\t};\n\n\tdispose = () => {\n\t\tthis.debugPanel.remove();\n\t\tthis._debugPanel = null;\n\t};\n}\n","import { Container } from '@needle-di/core';\nimport type { GeneralModuleCtor } from '@/baseModule';\nimport Controller from '@/controller';\nimport DataManager from '@/dataManager';\nimport type { ModuleInput, Options } from '@/declarations';\nimport InteractionHandler from '@/interactionHandler';\nimport OverlayManager from '@/overlayManager';\nimport Renderer from '@/renderer';\n\ntype InternalModules = [\n\ttypeof DataManager,\n\ttypeof Controller,\n\ttypeof OverlayManager,\n\ttypeof InteractionHandler,\n\ttypeof Renderer,\n];\n\nexport class JSONCanvasViewer<M extends ModuleInput = []> {\n\tprivate options: Options<[...InternalModules, ...M]>;\n\tprivate allModules: ModuleInput;\n\tcontainer: Container;\n\n\tconstructor(options: Options<[...InternalModules, ...M]>, modules?: M) {\n\t\tthis.container = new Container();\n\t\tthis.options = options;\n\t\tconst bind = (Class: GeneralModuleCtor) => {\n\t\t\tthis.container.bind({\n\t\t\t\tprovide: Class,\n\t\t\t\tuseFactory: () => new Class(this.container, this.options),\n\t\t\t});\n\t\t};\n\t\tthis.allModules = [\n\t\t\tDataManager,\n\t\t\tController,\n\t\t\tOverlayManager,\n\t\t\tInteractionHandler,\n\t\t\tRenderer,\n\t\t\t...(modules || []),\n\t\t];\n\n\t\tthis.allModules.forEach(bind);\n\t\tthis.allModules.forEach(Module => {\n\t\t\tthis.container.get(Module);\n\t\t});\n\t\tthis.container.get(DataManager).loadCanvas();\n\t}\n\n\tdispose = () => {\n\t\tconst container = this.options.container;\n\t\twhile (container.firstChild) container.firstChild.remove();\n\t\tthis.allModules.reverse();\n\t\tthis.allModules.forEach(Module => {\n\t\t\tconst module = this.container.get(Module);\n\t\t\tif (module.dispose) module.dispose();\n\t\t});\n\t};\n}\n","import { type BaseArgs, BaseModule } from '@/baseModule';\nimport Controller from '@/controller';\nimport DataManager from '@/dataManager';\nimport { destroyError } from '@/shared';\nimport utilities from '@/utilities';\nimport style from './styles.scss?inline';\n\ntype Options = {\n\tminimapCollapsed?: boolean;\n};\n\nexport default class Minimap extends BaseModule<Options> {\n\tprivate _minimapCtx: CanvasRenderingContext2D | null = null;\n\tprivate _viewportRectangle: HTMLDivElement | null = null;\n\tprivate _minimap: HTMLDivElement | null = null;\n\tprivate _minimapContainer: HTMLDivElement | null = null;\n\tprivate _toggleMinimapBtn: HTMLButtonElement | null = null;\n\tprivate minimapCache: { scale: number; centerX: number; centerY: number } = {\n\t\tscale: 1,\n\t\tcenterX: 0,\n\t\tcenterY: 0,\n\t};\n\tprivate DM: DataManager;\n\tprivate collapsed: boolean;\n\n\tprivate get minimap() {\n\t\tif (this._minimap === null) throw destroyError;\n\t\treturn this._minimap;\n\t}\n\tprivate get minimapCtx() {\n\t\tif (this._minimapCtx === null) throw destroyError;\n\t\treturn this._minimapCtx;\n\t}\n\tprivate get viewportRectangle() {\n\t\tif (this._viewportRectangle === null) throw destroyError;\n\t\treturn this._viewportRectangle;\n\t}\n\tprivate get minimapContainer() {\n\t\tif (this._minimapContainer === null) throw destroyError;\n\t\treturn this._minimapContainer;\n\t}\n\tprivate get toggleMinimapBtn() {\n\t\tif (this._toggleMinimapBtn === null) throw destroyError;\n\t\treturn this._toggleMinimapBtn;\n\t}\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tthis.collapsed = this.options.minimapCollapsed || false;\n\t\tthis.container.get(Controller).hooks.onRefresh.subscribe(this.updateViewportRectangle);\n\t\tthis.DM = this.container.get(DataManager);\n\t\tthis.DM.hooks.onCanvasFetched.subscribe(this.drawMinimap);\n\n\t\tthis._minimapContainer = document.createElement('div');\n\t\tthis._minimapContainer.className = 'minimap-container';\n\n\t\tutilities.applyStyles(this._minimapContainer, style);\n\n\t\tthis._toggleMinimapBtn = document.createElement('button');\n\t\tthis._toggleMinimapBtn.className = 'toggle-minimap collapse-button';\n\t\tthis._toggleMinimapBtn.innerHTML =\n\t\t\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\t\tthis._minimapContainer.appendChild(this._toggleMinimapBtn);\n\n\t\tthis._minimap = document.createElement('div');\n\t\tthis._minimap.className = 'minimap';\n\t\tconst minimapCanvas = document.createElement('canvas');\n\t\tminimapCanvas.className = 'minimap-canvas';\n\t\tminimapCanvas.width = 200;\n\t\tminimapCanvas.height = 150;\n\n\t\tthis._minimap.appendChild(minimapCanvas);\n\t\tthis._minimapCtx = minimapCanvas.getContext('2d') as CanvasRenderingContext2D;\n\t\tthis._viewportRectangle = document.createElement('div');\n\t\tthis._viewportRectangle.className = 'viewport-rectangle';\n\t\tthis._minimap.appendChild(this._viewportRectangle);\n\t\tthis._minimapContainer.appendChild(this._minimap);\n\n\t\tthis.DM.data.container.appendChild(this._minimapContainer);\n\n\t\tthis._minimapContainer.classList.toggle('collapsed', this.collapsed);\n\n\t\tthis._toggleMinimapBtn.addEventListener('click', this.toggleCollapse);\n\t\tutilities.resizeCanvasForDPR(minimapCanvas, minimapCanvas.width, minimapCanvas.height);\n\t}\n\n\ttoggleCollapse = () => {\n\t\tthis.collapsed = !this.collapsed;\n\t\tthis.minimapContainer.classList.toggle('collapsed', this.collapsed);\n\t\tif (!this.collapsed) this.updateViewportRectangle();\n\t};\n\n\tprivate drawMinimap = () => {\n\t\tconst bounds = this.DM.data.nodeBounds;\n\t\tif (!bounds) return;\n\t\tconst displayWidth = this.minimap.clientWidth;\n\t\tconst displayHeight = this.minimap.clientHeight;\n\t\tconst scaleX = displayWidth / bounds.width;\n\t\tconst scaleY = displayHeight / bounds.height;\n\t\tthis.minimapCache.scale = Math.min(scaleX, scaleY) * 0.9;\n\t\tthis.minimapCache.centerX = displayWidth / 2;\n\t\tthis.minimapCache.centerY = displayHeight / 2;\n\t\tthis.minimapCtx.clearRect(0, 0, displayWidth, displayHeight);\n\t\tthis.minimapCtx.save();\n\t\tthis.minimapCtx.translate(this.minimapCache.centerX, this.minimapCache.centerY);\n\t\tthis.minimapCtx.scale(this.minimapCache.scale, this.minimapCache.scale);\n\t\tthis.minimapCtx.translate(-bounds.centerX, -bounds.centerY);\n\t\tconst canvasData = this.DM.data.canvasData;\n\t\tfor (const edge of canvasData.edges) this.drawMinimapEdge(edge);\n\t\tfor (const node of canvasData.nodes) this.drawMinimapNode(node);\n\t\tthis.minimapCtx.restore();\n\t};\n\n\tprivate drawMinimapNode = (node: JSONCanvasNode) => {\n\t\tconst colors = utilities.getColor(node.color);\n\t\tconst radius = 25;\n\t\tthis.minimapCtx.fillStyle = colors.border;\n\t\tthis.minimapCtx.globalAlpha = 0.3;\n\t\tutilities.drawRoundRect(this.minimapCtx, node.x, node.y, node.width, node.height, radius);\n\t\tthis.minimapCtx.fill();\n\t\tthis.minimapCtx.globalAlpha = 1.0;\n\t};\n\n\tprivate drawMinimapEdge = (edge: JSONCanvasEdge) => {\n\t\tconst nodeMap = this.DM.data.nodeMap;\n\t\tconst fromNode = nodeMap[edge.fromNode];\n\t\tconst toNode = nodeMap[edge.toNode];\n\t\tif (!fromNode || !toNode) return;\n\t\tconst [startX, startY] = utilities.getAnchorCoord(fromNode, edge.fromSide);\n\t\tconst [endX, endY] = utilities.getAnchorCoord(toNode, edge.toSide);\n\t\tthis.minimapCtx.beginPath();\n\t\tthis.minimapCtx.moveTo(startX, startY);\n\t\tthis.minimapCtx.lineTo(endX, endY);\n\t\tthis.minimapCtx.strokeStyle = '#555';\n\t\tthis.minimapCtx.lineWidth = 10;\n\t\tthis.minimapCtx.stroke();\n\t};\n\n\tprivate updateViewportRectangle = () => {\n\t\tif (this.collapsed) return;\n\t\tconst bounds = this.DM.data.nodeBounds;\n\t\tconst container = this.DM.data.container;\n\t\tconst scale = this.DM.data.scale;\n\t\tif (!bounds) return;\n\t\tconst viewWidth = container.clientWidth / scale;\n\t\tconst viewHeight = container.clientHeight / scale;\n\t\tconst viewportCenterX = -this.DM.data.offsetX / scale + container.clientWidth / (2 * scale);\n\t\tconst viewportCenterY = -this.DM.data.offsetY / scale + container.clientHeight / (2 * scale);\n\t\tconst viewRectX =\n\t\t\tthis.minimapCache.centerX +\n\t\t\t(viewportCenterX - viewWidth / 2 - bounds.centerX) * this.minimapCache.scale;\n\t\tconst viewRectY =\n\t\t\tthis.minimapCache.centerY +\n\t\t\t(viewportCenterY - viewHeight / 2 - bounds.centerY) * this.minimapCache.scale;\n\t\tconst viewRectWidth = viewWidth * this.minimapCache.scale;\n\t\tconst viewRectHeight = viewHeight * this.minimapCache.scale;\n\t\tthis.viewportRectangle.style.left = `${viewRectX}px`;\n\t\tthis.viewportRectangle.style.top = `${viewRectY}px`;\n\t\tthis.viewportRectangle.style.width = `${viewRectWidth}px`;\n\t\tthis.viewportRectangle.style.height = `${viewRectHeight}px`;\n\t};\n\n\tdispose = () => {\n\t\tthis.toggleMinimapBtn.removeEventListener('click', this.toggleCollapse);\n\t\tthis.minimapCtx.clearRect(0, 0, this.minimap.clientWidth, this.minimap.clientHeight);\n\t\tthis.minimapContainer.remove();\n\t\tthis._minimapContainer = null;\n\t\tthis._toggleMinimapBtn = null;\n\t\tthis._viewportRectangle = null;\n\t\tthis._minimap = null;\n\t};\n}\n","import { type BaseArgs, BaseModule } from '@/baseModule';\nimport DataManager from '@/dataManager';\nimport { destroyError } from '@/shared';\nimport utilities from '@/utilities';\nimport style from './styles.scss?inline';\n\ntype Options = {\n\tmistouchPreventer?: {\n\t\tpreventAtStart?: boolean;\n\t\tlabelText?: string;\n\t};\n};\n\nexport default class MistouchPreventer extends BaseModule<Options> {\n\tprivate _preventionContainer: HTMLDivElement | null = null;\n\tprivate preventMt: boolean = false;\n\tprivate DM: DataManager;\n\tprivate preventMistouch: {\n\t\trecord: boolean;\n\t\tlastX: number;\n\t\tlastY: number;\n\t\tinitialX: number;\n\t\tinitialY: number;\n\t} = {\n\t\trecord: false,\n\t\tlastX: 0,\n\t\tlastY: 0,\n\t\tinitialX: 0,\n\t\tinitialY: 0,\n\t};\n\n\tprivate get preventionContainer() {\n\t\tif (this._preventionContainer === null) throw destroyError;\n\t\treturn this._preventionContainer;\n\t}\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tconst options = Object.assign(\n\t\t\t{\n\t\t\t\tpreventAtStart: true,\n\t\t\t\tlabelText: 'Click on to unlock.',\n\t\t\t},\n\t\t\tthis.options.mistouchPreventer || {},\n\t\t);\n\n\t\tconst preventionBanner = document.createElement('div');\n\t\tpreventionBanner.className = 'prevention-banner';\n\t\tpreventionBanner.textContent = options.labelText;\n\t\tthis.DM = this.container.get(DataManager);\n\t\tthis._preventionContainer = document.createElement('div');\n\t\tthis._preventionContainer.className = 'prevention-container hidden';\n\n\t\tutilities.applyStyles(this._preventionContainer, style);\n\t\tthis._preventionContainer.appendChild(preventionBanner);\n\t\tthis.DM.data.container.appendChild(this._preventionContainer);\n\n\t\tif (options.preventAtStart) this.startPrevention();\n\n\t\twindow.addEventListener('pointerdown', this.onPointerDown);\n\t\twindow.addEventListener('pointermove', this.onPointerMove);\n\t\twindow.addEventListener('pointerup', this.onPointerUp);\n\t}\n\n\tprivate onPointerDown = (e: PointerEvent) => {\n\t\tconst bounds = this.DM.data.container.getBoundingClientRect();\n\t\tif (\n\t\t\te.clientX < bounds.left ||\n\t\t\te.clientX > bounds.right ||\n\t\t\te.clientY < bounds.top ||\n\t\t\te.clientY > bounds.bottom\n\t\t) {\n\t\t\tif (!this.preventMt) this.startPrevention();\n\t\t} else if (this.preventMt) {\n\t\t\tthis.preventMistouch.initialX = e.clientX;\n\t\t\tthis.preventMistouch.initialY = e.clientY;\n\t\t\tthis.preventMistouch.lastX = e.clientX;\n\t\t\tthis.preventMistouch.lastY = e.clientY;\n\t\t\tthis.preventMistouch.record = true;\n\t\t}\n\t};\n\n\tprivate onPointerMove = (e: PointerEvent) => {\n\t\tif (this.preventMistouch.record) {\n\t\t\tthis.preventMistouch.lastX = e.clientX;\n\t\t\tthis.preventMistouch.lastY = e.clientY;\n\t\t}\n\t};\n\n\tprivate onPointerUp = () => {\n\t\tif (this.preventMistouch.record) {\n\t\t\tthis.preventMistouch.record = false;\n\t\t\tif (\n\t\t\t\tMath.abs(this.preventMistouch.lastX - this.preventMistouch.initialX) +\n\t\t\t\t\tMath.abs(this.preventMistouch.lastY - this.preventMistouch.initialY) <\n\t\t\t\t5\n\t\t\t)\n\t\t\t\tthis.endPrevention();\n\t\t}\n\t};\n\n\tstartPrevention = () => {\n\t\tthis.preventionContainer.classList.remove('hidden');\n\t\tthis.DM.data.container.classList.add('numb');\n\t\tthis.preventMt = true;\n\t};\n\n\tendPrevention = () => {\n\t\tthis.preventMt = false;\n\t\tthis.preventionContainer.classList.add('hidden');\n\t\tsetTimeout(() => this.DM.data.container.classList.remove('numb'), 50); // minimum delay to prevent triggering undesired button touch\n\t};\n\n\tdispose = () => {\n\t\twindow.removeEventListener('pointerdown', this.onPointerDown);\n\t\twindow.removeEventListener('pointermove', this.onPointerMove);\n\t\twindow.removeEventListener('pointerup', this.onPointerUp);\n\t\tthis.preventionContainer.remove();\n\t\tthis._preventionContainer = null;\n\t};\n}\n","import { micromark } from 'micromark';\nimport utilities from './utilities';\n\ntype Parse = (markdown: string) => string;\n\nexport default async function (path: string, micromarkOptions?: Parameters<typeof micromark>[1]) {\n\tconst parse = (markdown: string) => micromark(markdown, micromarkOptions);\n\tconst render = (node: JSONCanvasNode) => renderer(node, parse);\n\tconst nodes = Object.assign(\n\t\t{\n\t\t\tnodes: [],\n\t\t\tedges: [],\n\t\t},\n\t\tawait fetch(path).then(res => res.json()),\n\t).nodes as Array<JSONCanvasNode>;\n\tconst basePath = utilities.resolvePath(path);\n\tnodes.forEach(node => {\n\t\tif (node.type === 'file' && !node.file.includes('http')) {\n\t\t\tconst file = node.file.split('/');\n\t\t\tnode.file = basePath + file.pop();\n\t\t}\n\t});\n\tlet result = '';\n\tnodes.forEach(node => {\n\t\tresult += render(node);\n\t});\n\treturn result;\n}\n\nfunction renderer(node: JSONCanvasNode, parse: Parse) {\n\tswitch (node.type) {\n\t\tcase 'text':\n\t\t\treturn parse(node.text);\n\t\tcase 'file':\n\t\t\treturn fileProcessor(node, parse);\n\t\tcase 'link':\n\t\t\treturn `<a href=\"${node.url}\" target=\"_blank\" rel=\"nofollow noreferrer\">${node.url}</a>`;\n\t\tdefault:\n\t\t\treturn '';\n\t}\n}\n\nfunction fileProcessor(node: JSONCanvasFileNode, parse: Parse) {\n\tif (node.file.match(/\\.md$/i)) return loadMarkdown(node.file, parse);\n\telse if (node.file.match(/\\.(png|jpg|jpeg|gif|svg|webp)$/i))\n\t\treturn `<img src=\"${node.file}\" alt=\"${node.file.split('/').pop()}\">`;\n\telse if (node.file.match(/\\.(mp3|wav)$/i)) return `<audio src=\"${node.file}\" controls></audio>`;\n}\n\nasync function loadMarkdown(path: string, parse: Parse) {\n\tlet parsedContent: string;\n\ttry {\n\t\tconst response = await fetch(path);\n\t\tconst result = await response.text();\n\t\tconst frontmatterMatch = result.match(/^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/);\n\t\tif (frontmatterMatch) parsedContent = parse(frontmatterMatch[2]);\n\t\telse parsedContent = parse(result);\n\t} catch {\n\t\tparsedContent = 'Failed to load content.';\n\t}\n\treturn parsedContent;\n}\n"],"names":["BaseModule","constructor","container","options","this","Object","assign","dispose","isClassLike","target","getParentClasses","parentClasses","currentClass","getPrototypeOf","name","parentClass","push","assertPresent","value","Error","assertSingle","array","errorProvider","length","first","at","isConstructorProvider","provider","isClassProvider","isFactoryProvider","isAsyncProvider","async","isExistingProvider","isMultiProvider","multi","InjectionToken","description","toString","String","isClassToken","token","getToken","Guards.isConstructorProvider","provide","injectableSymbol","Factory","underConstruction","construct","Guards.isAsyncProvider","AsyncProvidersInSyncInjectionContextError","includes","dependencyGraph","map","CircularDependencyError","doConstruct","pop","constructAsync","useFactory","Guards.isClassProvider","create","useClass","errorClass","block","onError","error","retryOn","getAsync","optional","Guards.isValueProvider","useValue","Guards.isFactoryProvider","Guards.isExistingProvider","get","useExisting","assertNever","super","graph","join","InjectionContext","run","originalContext","_currentContext","runAsync","NeedsInjectionContextError","injectionContext","Container","providers","Map","singletons","parent","factory","bind","bindAll","forEach","it","has","Guards.isMultiProvider","existingProviderAlreadyProvided","some","every","set","step","result","_","i","slice","windowedSlice","childClass","parentProvider","existingParentProviders","unbind","delete","unbindAll","clear","lazy","autoBindIfNeeded","values","flatMap","Promise","resolve","promiseTry","all","flat","createChild","hasOwnProperty","targetClasses","getInjectableTargets","filter","targetClass","isInjectionToken","existingToken","utilities","round","roundedNum","digits","factor","Math","resizeCanvasForDPR","canvas","width","height","dpr","window","devicePixelRatio","ctx","getContext","setTransform","scale","applyStyles","styleString","style","document","createElement","innerHTML","appendChild","drawRoundRect","x","y","radius","beginPath","moveTo","lineTo","quadraticCurveTo","closePath","getAnchorCoord","node","side","midX","midY","getColor","colorIndex","themeColor","rgb","hex","cleanHex","replace","r","parseInt","substring","g","b","hexToRgb","border","background","active","resolvePath","path","test","lastIndexOf","lastSlash","makeHook","args","subs","callback","Set","subscribe","add","unsubscribe","GRID_CELL_SIZE","DataManager","spatialGrid","hooks","onToggleFullscreen","onCanvasFetched","data","canvasData","nodeMap","canvasBaseDir","nodeBounds","offsetX","offsetY","loadCanvas","canvasPath","nodes","edges","fetch","then","res","json","type","file","split","id","calculateNodeBounds","buildSpatialGrid","err","console","findNodeAt","screenCoords","C2W","C2C","candidates","key","floor","judgeInteract","match","minX","Infinity","minY","maxX","maxY","min","max","centerX","centerY","minCol","maxCol","minRow","maxRow","col","row","zoom","origin","newScale","zoomToScale","validNewScale","canvasCoords","pan","panToCoords","shiftFullscreen","option","fullscreenElement","exitFullscreen","requestFullscreen","resetView","bounds","contentWidth","INITIAL_VIEWPORT_PADDING","contentHeight","viewWidth","clientWidth","viewHeight","clientHeight","scaleX","scaleY","initialView","containerX","containerY","canvasX","canvasY","middleViewer","remove","Controller","animationId","resizeAnimationId","DM","perFrame","lastScale","lastOffsets","lastResizeCenter","onResize","onRefresh","onFetched","parentContainer","firstElementChild","realContainer","noShadow","attachShadow","mode","HTMLContainer","classList","resizeObserver","observe","requestAnimationFrame","draw","refresh","center","ResizeObserver","cancelAnimationFrame","disconnect","destroyError","OverlayManager","_overlaysLayer","overlays","selectedId","eventListeners","IH","parse","overlaysLayer","onInteractionStart","onInteractionEnd","markdown","micromark","InteractionHandler","controller","updateOverlays","className","onClick","select","cbd","createOverlay","updateOverlay","text","loadMarkdownForNode","url","previous","current","parsedContent","response","frontmatterMatch","transform","content","element","getElementsByClassName","constructOverlay","left","top","color","overlay","backgroundColor","setProperty","parsedContentWrapper","iframe","src","sandbox","loading","audio","controls","img","clickLayer","overlayBorder","borderColor","onStart","onEnd","addEventListener","child","removeEventListener","pointeract","coordinateOutput","Pointeract","Click","Drag","WheelPanZoom","PreventDefault","MultitouchPanZoom","startInteraction","start","stopInteraction","stop","OM","on","onPan","onZoom","onTrueClick","event","detail","e","closest","off","FONT_COLOR","Renderer","_canvas","zoomInOptimize","lastDrawnScale","lastDrawnViewport","right","bottom","timeout","lastCallTime","redraw","optimizeDPR","offsetWidth","offsetHeight","clearTimeout","now","Date","currentViewport","getCurrentViewport","isViewportInside","setTimeout","trueRedraw","fakeRedraw","clearRect","save","translate","drawGroup","drawFileNode","edge","drawEdge","restore","cssScale","currentOffsetX","currentOffsetY","inner","outer","drawLabelBar","label","barHeight","yOffset","fontSize","xPadding","font","barWidth","measureText","fillStyle","fill","fillText","drawNodeBackground","colors","globalAlpha","strokeStyle","lineWidth","stroke","fromNode","toNode","getEdgeNodes","gac","startX","startY","fromSide","endX","endY","toSide","startControlX","startControlY","endControlX","endControlY","controlPoints","getControlPoints","drawCurvedPath","drawArrowhead","t","padding","labelWidth","labelHeight","textAlign","textBaseline","distanceX","distanceY","realDistance","abs","PADDING","val","c1x","c1y","c2x","c2y","bezierCurveTo","tipX","tipY","fromX","fromY","dx","dy","sqrt","unitX","unitY","leftX","leftY","rightX","rightY","developerSuite","_controlsPanel","_toggleCollapseBtn","_toggleFullscreenBtn","_zoomOutBtn","_zoomSlider","_zoomInBtn","_resetViewBtn","collapsed","controlsPanel","toggleCollapseBtn","toggleFullscreenBtn","zoomOutBtn","zoomSlider","zoomInBtn","resetViewBtn","controlsCollapsed","updateFullscreenBtn","updateSlider","toggle","controlsContent","toggleCollapse","zoomIn","zoomOut","slide","toggleFullscreen","Number","enter","scaleToSlider","log","_debugPanel","debugPanel","update","allModules","modules","Class","Module","firstChild","reverse","module","_minimapCtx","_viewportRectangle","_minimap","_minimapContainer","_toggleMinimapBtn","minimapCache","minimap","minimapCtx","viewportRectangle","minimapContainer","toggleMinimapBtn","minimapCollapsed","updateViewportRectangle","drawMinimap","minimapCanvas","displayWidth","displayHeight","drawMinimapEdge","drawMinimapNode","viewportCenterX","viewportCenterY","viewRectX","viewRectY","viewRectWidth","viewRectHeight","_preventionContainer","preventMt","preventMistouch","record","lastX","lastY","initialX","initialY","preventionContainer","preventAtStart","labelText","mistouchPreventer","preventionBanner","textContent","startPrevention","onPointerDown","onPointerMove","onPointerUp","getBoundingClientRect","clientX","clientY","endPrevention","micromarkOptions","render","loadMarkdown","fileProcessor","renderer","basePath"],"mappings":"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","x_google_ignoreList":[1,2,3,4,5,6,7]}