@kabel-project/kabel 1.0.9 → 1.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/kabel.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"kabel.js","mappings":"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","sources":["webpack://Kabel/webpack/universalModuleDefinition","webpack://Kabel/webpack/bootstrap","webpack://Kabel/./util/has-prop.ts","webpack://Kabel/./renderers/atlas/atlas.ts","webpack://Kabel/./util/user-state.ts","webpack://Kabel/./src/flyout.ts","webpack://Kabel/./src/core.ts","webpack://Kabel/./themes/default.ts","webpack://Kabel/./events/comment-input.ts","webpack://Kabel/./util/uid.ts","webpack://Kabel/./util/escape-html.ts","webpack://Kabel/./src/comment.ts","webpack://Kabel/./comment-renderer/renderer.ts","webpack://Kabel/./renderers/apollo/apollo.ts","webpack://Kabel/./renderers/renderer.ts","webpack://Kabel/./node_modules/svgpath/lib/path_parse.js","webpack://Kabel/./themes/themes.ts","webpack://Kabel/./util/unescape-html.ts","webpack://Kabel/./src/widget.ts","webpack://Kabel/./src/undo-redo.ts","webpack://Kabel/./src/inject-headless.ts","webpack://Kabel/./node_modules/svgpath/lib/ellipse.js","webpack://Kabel/./src/workspace-coords.ts","webpack://Kabel/./src/workspace-svg.ts","webpack://Kabel/./util/parse-color.ts","webpack://Kabel/./util/path.ts","webpack://Kabel/./node_modules/svgpath/lib/transform_parse.js","webpack://Kabel/./controllers/wasd.ts","webpack://Kabel/./src/fonts-manager.ts","webpack://Kabel/./events/connection-line.ts","webpack://Kabel/./src/field.ts","webpack://Kabel/./src/renderer-map.ts","webpack://Kabel/./src/grid.ts","webpack://Kabel/./events/node-x-btn.ts","webpack://Kabel/./src/colors.ts","webpack://Kabel/./node_modules/svgpath/lib/matrix.js","webpack://Kabel/./controllers/base.ts","webpack://Kabel/./renderers/apollo/renderer.ts","webpack://Kabel/./src/workspace.ts","webpack://Kabel/./util/styler.ts","webpack://Kabel/./src/inject.ts","webpack://Kabel/./src/headless-node.ts","webpack://Kabel/./util/env.ts","webpack://Kabel/./src/nodesvg.ts","webpack://Kabel/./src/ctx-menu-registry.ts","webpack://Kabel/./util/window-listeners.ts","webpack://Kabel/./util/emitter.ts","webpack://Kabel/./src/toolbox.ts","webpack://Kabel/./src/main-workspace.ts","webpack://Kabel/./events/draggable.ts","webpack://Kabel/./util/wait-anim-frames.ts","webpack://Kabel/./src/prototypes.ts","webpack://Kabel/./src/dropdown-menu.ts","webpack://Kabel/./src/widget-prototypes.ts","webpack://Kabel/./events/comment-drag-handle.ts","webpack://Kabel/./util/eventer.ts","webpack://Kabel/./node_modules/svgpath/lib/a2c.js","webpack://Kabel/./node_modules/svgpath/index.js","webpack://Kabel/./src/index.ts","webpack://Kabel/./src/coordinates.ts","webpack://Kabel/./renderers/constants.ts","webpack://Kabel/./node_modules/svgpath/lib/svgpath.js","webpack://Kabel/./src/styles.css","webpack://Kabel/./events/connector.ts","webpack://Kabel/./src/category.ts","webpack://Kabel/./renderers/representer-node.ts","webpack://Kabel/./src/connection.ts","webpack://Kabel/./renderers/apollo/constants.ts","webpack://Kabel/./events/input-box.ts","webpack://Kabel/./renderers/representer.ts","webpack://Kabel/./src/context-menu.ts","webpack://Kabel/./themes/dark.ts","webpack://Kabel/./node_modules/@svgdotjs/svg.js/dist/svg.node.cjs","webpack://Kabel/./events/events.ts","webpack://Kabel/webpack/runtime/define property getters","webpack://Kabel/webpack/runtime/hasOwnProperty shorthand","webpack://Kabel/webpack/runtime/make namespace object","webpack://Kabel/webpack/startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Kabel\"] = factory();\n\telse\n\t\troot[\"Kabel\"] = factory();\n})(this, () => {\nreturn ","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","\r\nexport default function hasProp(obj: object, name: string) {\r\n return Object.prototype.hasOwnProperty.call(obj, name)\r\n}","import RendererConstants from \"../constants\";\r\nimport Renderer from \"../renderer\";\r\nimport Representer from \"../representer\";\r\nimport { RepresenterNode } from \"../representer-node\";\r\n\r\n\r\n\r\n\r\n\r\nexport {\r\n Renderer,\r\n RendererConstants as Constants,\r\n Representer,\r\n RepresenterNode\r\n}","type StateChangeCallback = (addedOrRemoved: 0 | 1) => void;\r\n\r\nclass UserState {\r\n private state: Set<string>;\r\n private callbacks: Map<string, StateChangeCallback[]>;\r\n /**\r\n * Stores the user's current UIX state\r\n * Ex: 'typing'\r\n */\r\n constructor() {\r\n this.state = new Set();\r\n this.callbacks = new Map();\r\n }\r\n\r\n /** \r\n * Adds a state\r\n * @param name - The name of the state (ex: 'typing')\r\n */\r\n setState(name: string) {\r\n const wasPresent = this.state.has(name);\r\n if (!wasPresent) {\r\n this.state.add(name);\r\n this.triggerCallbacks(name, 1);\r\n }\r\n }\r\n\r\n /** \r\n * Removes a state\r\n * @param name - The name of the state (ex: 'typing')\r\n */\r\n removeState(name: string) {\r\n const wasPresent = this.state.has(name);\r\n if (wasPresent) {\r\n this.state.delete(name);\r\n this.triggerCallbacks(name, 0);\r\n }\r\n }\r\n\r\n /** \r\n * Checks if a state is active\r\n * @param name - The name of the state (ex: 'typing')\r\n */\r\n hasState(name: string) {\r\n return this.state.has(name);\r\n }\r\n\r\n /** \r\n * Registers a callback for state changes \r\n * @param name - Name of the state to check changes for.\r\n * @param cb - Callback to call on state change.\r\n */\r\n onStateChange(name: string, cb: StateChangeCallback) {\r\n if (!this.callbacks.has(name)) this.callbacks.set(name, []);\r\n this.callbacks.get(name)!.push(cb);\r\n }\r\n\r\n /** Internal: triggers callbacks for a state */\r\n private triggerCallbacks(name: string, addedOrRemoved: 0 | 1) {\r\n const cbs = this.callbacks.get(name);\r\n if (!cbs) return;\r\n for (const cb of cbs) cb(addedOrRemoved);\r\n }\r\n}\r\nconst userState = new UserState();\r\nexport default userState;\r\nexport {\r\n UserState\r\n};","import newHeadlessNode from \"./headless-node\";\r\nimport { TblxNodeStruct } from \"./inject\";\r\nimport Toolbox from \"./toolbox\";\r\nimport { parseColor } from \"../util/parse-color\";\r\nimport { Color } from \"./visual-types\";\r\n\r\n/**\r\n * Represents a flyout menu for a toolbox in Kabel.\r\n * Displays a list of nodes that can be dragged into a workspace.\r\n */\r\nclass Flyout {\r\n\tcontainer: HTMLDivElement;\r\n\tvisible: boolean;\r\n\ttoolbox?: Toolbox|undefined;\r\n\r\n\tconstructor(toolbox?: Toolbox) {\r\n\t\tthis.toolbox = toolbox;\r\n\r\n\t\tthis.container = document.createElement(\"div\");\r\n\t\tthis.container.className = \"KabelFlyout\";\r\n\r\n\t\tthis.visible = false;\r\n\r\n\t\tif (toolbox) {\r\n\t\t\ttoolbox.workspace._wsTop.appendChild(this.container);\r\n\t\t} else {\r\n\t\t\tdocument.body.appendChild(this.container);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Populates the flyout with a list of nodes.\r\n\t */\r\n\tfill(nodes: TblxNodeStruct[]) {\r\n\t\tthis.clear();\r\n\t\tnodes.forEach(node => {\r\n\t\t\tconst headlessNode = newHeadlessNode(node.type as string);\r\n\t\t\tif (!headlessNode) return;\r\n\r\n\t\t\tconst nodeEl = this.createNodeElement(headlessNode);\r\n\t\t\tthis.container.appendChild(nodeEl);\r\n\t\t});\r\n\r\n\t\tthis.show();\r\n\t}\r\n\r\n\t/**\r\n\t * Creates a DOM element for a node with event listeners attached.\r\n\t */\r\n\tprivate createNodeElement(headlessNode: any): HTMLDivElement {\r\n\t\tconst nodeEl = document.createElement(\"div\");\r\n\t\tnodeEl.className = \"KabelFlyoutNode\";\r\n\t\tnodeEl.textContent = headlessNode.labelText;\r\n\r\n\t\tthis.applyNodeStyles(nodeEl, headlessNode.colors.primary);\r\n\r\n\t\tnodeEl.addEventListener(\"mousedown\", e => this.onNodeMouseDown(e, headlessNode));\r\n\t\treturn nodeEl;\r\n\t}\r\n\r\n\t/**\r\n\t * Applies consistent styling to a node element.\r\n\t */\r\n\tprivate applyNodeStyles(el: HTMLElement, bgColor: Color) {\r\n\t\tel.style.backgroundColor = parseColor(bgColor);\r\n\t\tel.style.padding = \"4px 8px\";\r\n\t\tel.style.cursor = \"pointer\";\r\n\r\n\t\tif (this.toolbox?.workspace?.renderer?.constants) {\r\n\t\t\tconst c = this.toolbox.workspace.renderer.constants;\r\n\t\t\tel.style.fontFamily = c.FONT_FAMILY;\r\n\t\t\tel.style.fontSize = `${c.FONT_SIZE}px`;\r\n\t\t\tel.style.color = parseColor(c.FONT_COLOR);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handles starting a drag operation for a node.\r\n\t */\r\n\tprivate onNodeMouseDown(e: MouseEvent, headlessNode: any) {\r\n\t\tif (!this.toolbox) return;\r\n\r\n\t\tconst ghostEl = this.createGhostNode(headlessNode);\r\n\t\tdocument.body.appendChild(ghostEl);\r\n\r\n\t\tconst moveGhost = (ev: MouseEvent) => {\r\n\t\t\tghostEl.style.left = ev.clientX + 4 + \"px\";\r\n\t\t\tghostEl.style.top = ev.clientY + 4 + \"px\";\r\n\t\t};\r\n\r\n\t\tconst releaseGhost = (ev: MouseEvent) => {\r\n\t\t\tdocument.removeEventListener(\"mousemove\", moveGhost);\r\n\t\t\tdocument.removeEventListener(\"mouseup\", releaseGhost);\r\n\r\n\t\t\tthis.dropNode(ev, headlessNode);\r\n\r\n\t\t\tghostEl.remove();\r\n\t\t};\r\n\r\n\t\tdocument.addEventListener(\"mousemove\", moveGhost);\r\n\t\tdocument.addEventListener(\"mouseup\", releaseGhost);\r\n\r\n\t\te.preventDefault();\r\n\t}\r\n\r\n\t/**\r\n\t * Creates a ghost element that follows the mouse during drag.\r\n\t */\r\n\tprivate createGhostNode(headlessNode: any): HTMLDivElement {\r\n\t\tconst ghostEl = document.createElement(\"div\");\r\n\t\tghostEl.className = \"KabelGhostNode\";\r\n\t\tghostEl.textContent = headlessNode.labelText;\r\n\t\tghostEl.style.position = \"absolute\";\r\n\t\tghostEl.style.pointerEvents = \"none\";\r\n\r\n\t\tthis.applyNodeStyles(ghostEl, headlessNode.colors.primary);\r\n\t\treturn ghostEl;\r\n\t}\r\n\r\n\t/**\r\n\t * Handles dropping a node into the workspace if the mouse is over it.\r\n\t */\r\n\tprivate dropNode(ev: MouseEvent, node: TblxNodeStruct) {\r\n\t\tif (!this.toolbox) return;\r\n\r\n\t\tconst svg = this.toolbox.workspace.svg.node as SVGSVGElement;\r\n\t\tconst rect = svg.getBoundingClientRect();\r\n\r\n\t\tif (\r\n\t\t\tev.clientX >= rect.left &&\r\n\t\t\tev.clientX <= rect.right &&\r\n\t\t\tev.clientY >= rect.top &&\r\n\t\t\tev.clientY <= rect.bottom\r\n\t\t) {\r\n\t\t\tconst { x: wsX, y: wsY } = this.toolbox.workspace.screenToWorkspace(\r\n\t\t\t\tev.clientX - rect.left,\r\n\t\t\t\tev.clientY - rect.top\r\n\t\t\t);\r\n\r\n\t\t\tconst nodews = this.toolbox.workspace.spawnAt(node.type as string, wsX, wsY);\r\n\t\t\tif (nodews) {\r\n\t\t\t\tfor (let argName in node.arguments) {\r\n\t\t\t\t\tnodews.setFieldValue(argName, node.arguments[argName]);\r\n\t\t\t\t}\r\n\t\t\t\tthis.toolbox.workspace.drawNode(nodews.id);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tshow() {\r\n\t\tthis.container.style.display = \"block\";\r\n\t\tthis.visible = true;\r\n\t}\r\n\r\n\thide() {\r\n\t\tthis.container.style.display = \"none\";\r\n\t\tthis.visible = false;\r\n\t}\r\n\r\n\tclear() {\r\n\t\tthis.container.innerHTML = \"\";\r\n\t}\r\n}\r\n\r\nexport default Flyout;\r\n","import RendererConstants from '../renderers/constants'\r\nimport Renderer from '../renderers/renderer'\r\nimport CategoryColors from './colors'\r\nimport Connection, { Connectable } from './connection'\r\nimport Coordinates from './coordinates'\r\nimport Field, {\r\n FieldOptions,\r\n FieldVisualInfo,\r\n AnyFieldCls,\r\n AnyField,\r\n DummyField,\r\n FieldMap,\r\n NumberField,\r\n OptConnectField,\r\n TextField\r\n} from './field'\r\nimport inject, { InjectMsg, InjectOptions } from './inject'\r\nimport {\r\n clearMainWorkspace,\r\n getMainWorkspace,\r\n setMainWorkspace\r\n} from './main-workspace'\r\nimport NodeSvg, { NodeJson, NodeEvents, InputFieldJson } from './nodesvg'\r\nimport NodePrototypes from './prototypes'\r\nimport WorkspaceSvg from './workspace-svg'\r\nimport { NodePrototype } from './node-types'\r\nimport {\r\n Color,\r\n ColorStyle,\r\n Hex,\r\n RGBObject,\r\n RGBString,\r\n RGBTuple\r\n} from './visual-types'\r\nimport { parseColor } from '../util/parse-color'\r\nimport eventer, { Eventer } from '../util/eventer'\r\nimport * as Path from '../util/path'\r\nimport * as SVG from '@svgdotjs/svg.js'\r\nimport * as UID from '../util/uid'\r\nimport hasProp from '../util/has-prop'\r\nimport EventEmitter from '../util/emitter'\r\nimport userState from '../util/user-state'\r\nimport '../events/events'\r\nimport WorkspaceController from '../controllers/base'\r\nimport WASDController from '../controllers/wasd'\r\nimport { RMap, RendererMap } from './renderer-map'\r\nimport styler, { Styler } from '../util/styler'\r\nimport WidgetPrototypes from './widget-prototypes'\r\nimport Widget from './widget'\r\nimport ContextOptsRegistry, { ContextMenu } from './ctx-menu-registry'\r\nimport { Showable } from './context-menu'\r\nimport escapeAttr from '../util/escape-html'\r\nimport unescapeAttr from '../util/unescape-html'\r\nimport waitFrames from '../util/wait-anim-frames'\r\nimport CommentModel from './comment'\r\nimport CommentRenderer from '../comment-renderer/renderer'\r\nimport dropdownContainer from './dropdown-menu'\r\nimport Representer from '../renderers/representer'\r\nimport { RepresenterNode } from '../renderers/representer-node'\r\nimport windowListeners, { addWindowListener, clearWindowListeners, removeWindowListener } from '../util/window-listeners'\r\nimport * as FontManager from './fonts-manager';\r\nimport env from \"../util/env\";\r\nimport Workspace from './workspace'\r\nimport injectHeadless from './inject-headless'\r\nimport createHeadlessNode from './headless-node';\r\nimport * as apollo from '../renderers/apollo/apollo';\r\nimport * as atlas from '../renderers/atlas/atlas';\r\nimport KabelWSTheme from '../themes/default'\r\nimport KabelDarkTheme from '../themes/dark'\r\n/** Register default renderers. */\r\nRendererMap['default'] = atlas.Renderer;\r\nRendererMap[atlas.Renderer.NAME] = atlas.Renderer;\r\nRendererMap[apollo.Renderer.NAME] = apollo.Renderer;\r\n\r\nif (env.isBrowser) {\r\n // Use FontsManager to load default Kabel fonts.\r\n FontManager.loadGoogleFont('Fredoka');\r\n}\r\n/**\r\n * Utility method to register a field globally by name\r\n * @param name - Field identifier\r\n * @param cls - Class constructor for the field\r\n */\r\nField.register = function (name: string, cls: Function) {\r\n FieldMap[name] = cls as AnyFieldCls\r\n}\r\n\r\n/**\r\n * Utility method to unregister a field globally by name\r\n * @param name - Field identifier\r\n */\r\nField.unregister = function (name: string) {\r\n delete FieldMap[name]\r\n}\r\n\r\n/**\r\n * Central Kabel object exposing all main modules, utilities, and defaults\r\n */\r\nconst Kabel = {\r\n env, // Environment information\r\n UIX: { // User experience enhancing utilities.\r\n /** Event manager, loads events from '../events' and lets us attach them to svg.js elements to give them behavior that's seperated from the renderer. */\r\n events: eventer as Eventer,\r\n /** Font manager, used to load fonts. */\r\n FontManager,\r\n /** * State Manager, Makes things possible: E.G (the 'typing' state when you type in a input box..) * Used in controllers so you dont move when typing characters like a w s or d etc. */\r\n userState,\r\n /** Window listeners manager */\r\n windowListeners: {\r\n addWindowListener,\r\n removeWindowListener,\r\n clearWindowListeners,\r\n windowListeners\r\n }\r\n },\r\n Themes: {\r\n Classic: KabelWSTheme,\r\n Dark: KabelDarkTheme\r\n },\r\n /** Context menu manager */\r\n ContextMenu,\r\n /**\r\n * Utility methods and constants for various purposes.\r\n * @property Path - Utility methods for handling SVG paths.\r\n * @property waitFrames - Utility method to wait for a certain number of animation frames.\r\n */\r\n Utils: {\r\n Path,\r\n waitFrames,\r\n SVG, // Re-exporting svg.js for convenience\r\n parseColor,\r\n UID,\r\n EventEmitter,\r\n hasProp,\r\n styler,\r\n Styler,\r\n escapeHTML: escapeAttr,\r\n unescapeHTML: unescapeAttr\r\n },\r\n Widget,\r\n CategoryColors,\r\n Connection,\r\n Coordinates,\r\n Field,\r\n DummyField,\r\n FieldMap,\r\n NumberField,\r\n OptConnectField,\r\n TextField,\r\n inject,\r\n injectHeadless,\r\n createHeadlessNode,\r\n InjectMsg,\r\n clearMainWorkspace,\r\n getMainWorkspace,\r\n setMainWorkspace,\r\n NodeSvg,\r\n Nodes: NodePrototypes,\r\n Widgets: WidgetPrototypes,\r\n WorkspaceSvg,\r\n Workspace,\r\n WorkspaceController,\r\n WASDController,\r\n nodeRendering: {\r\n SVG: SVG, // also re-export svg.js here for easier access in renderers\r\n rendererMap: RMap,\r\n Apollo: apollo,\r\n Atlas: atlas,\r\n Renderer: Renderer,\r\n RendererConstants: RendererConstants,\r\n Representer: Representer,\r\n RepresenterNode: RepresenterNode\r\n },\r\n atlas,\r\n apollo,\r\n commentRendering: { CommentModel, CommentRenderer },\r\n Dropdown: dropdownContainer\r\n}\r\n\r\n/**\r\n * Provides a getter/setter for the main workspace\r\n * @property _mainWorkspace - Get or set the currently active workspace\r\n */\r\nObject.defineProperty(Kabel, '_mainWorkspace', {\r\n get(): WorkspaceSvg | Workspace | null {\r\n return getMainWorkspace()\r\n },\r\n set(v: WorkspaceSvg | Workspace | undefined | null | false | 0 | string) {\r\n if (\r\n v === undefined ||\r\n v === null ||\r\n v === false ||\r\n v === 0 ||\r\n typeof v === 'string'\r\n ) {\r\n return clearMainWorkspace()\r\n }\r\n return setMainWorkspace(v)\r\n }\r\n})\r\n\r\nexport default Kabel\r\n","import type {WSTheme} from '../src/workspace-svg'\r\n\r\n\r\n\r\nconst KabelWSTheme: WSTheme = {\r\n\tUIStyles: {\r\n workspaceBGColor: '#ffffff',\r\n\t\ttoolboxCategoriesBG: {\r\n\t\t\tposition: 'absolute',\r\n\t\t\tleft: '0',\r\n\t\t\ttop: '0',\r\n\t\t\twidth: '20%',\r\n\t\t\theight: '100%',\r\n\t\t\tbackground: 'rgba(240,240,240,0.9)',\r\n\t\t\toverflowY: 'auto',\r\n\t\t},\r\n\t\ttoolboxFlyoutBG: {\r\n\t\t\tdisplay: 'none',\r\n\t\t\tbackground: 'rgba(240,240,240,0.9)', // reuse same neutral bg\r\n\t\t\toverflowY: 'auto',\r\n\t\t\tpadding: '4px', // like nodes padding\r\n\t\t\tborderRadius: '4px',\r\n\t\t\tboxShadow: '0 2px 6px rgba(0,0,0,0.15)',\r\n\t\t},\r\n\t},\r\n};\r\n\r\nexport default KabelWSTheme;","import { Element as SvgElement, Rect as SvgRect, Text as SvgText } from \"@svgdotjs/svg.js\";\r\nimport CommentModel from \"../src/comment\";\r\nimport eventer, { EventSetupFn } from \"../util/eventer\";\r\nimport userState from '../util/user-state';\r\nimport Renderer from \"../comment-renderer/renderer\"\r\n\r\ntype InitArgs = {\r\n comment: CommentModel;\r\n text: SvgText;\r\n renderer: Renderer;\r\n};\r\n\r\nfunction initCommentInput(element: SvgElement, rawArgs: any) {\r\n const args = rawArgs as InitArgs;\r\n const comment = args.comment;\r\n const txt = args.text as SvgText;\r\n const rect = element as unknown as SvgRect;\r\n const renderer = args.renderer;\r\n\r\n let editing = false;\r\n let skipNextClick = false;\r\n let buffer = comment.getText() ?? \"\";\r\n let cursorPos = buffer.length;\r\n let anchorPos = buffer.length;\r\n\r\n const PADDING_X = 4;\r\n const PADDING_Y = 4;\r\n\r\n function getSelectionRange() {\r\n const start = Math.min(cursorPos, anchorPos);\r\n const end = Math.max(cursorPos, anchorPos);\r\n return { start, end };\r\n }\r\n\r\n function hasSelection() {\r\n return cursorPos !== anchorPos;\r\n }\r\n\r\n function deleteSelection() {\r\n if (!hasSelection()) return false;\r\n const { start, end } = getSelectionRange();\r\n buffer = buffer.slice(0, start) + buffer.slice(end);\r\n cursorPos = start;\r\n anchorPos = start;\r\n return true;\r\n }\r\n\r\n function encodeForSvg(s: string) {\r\n return s.replace(/ /g, \"\\u00A0\").replace(/\\n/g, \"&#10;\");\r\n }\r\n\r\n function ensureTspansPreserve(node: Element) {\r\n Array.from(node.childNodes).forEach((child) => {\r\n if (child.nodeType === 1) (child as Element).setAttribute(\"xml:space\", \"preserve\");\r\n });\r\n }\r\n\r\n let caretLine: SvgRect | null = null;\r\n let selectionRect: SvgRect | null = null;\r\n\r\n // --- MEASURE TEXT WIDTH USING COMMENT RENDERER ---\r\n function measureTextWidth(text: string, fontSize?: number, fontFamily?: string) {\r\n // Delegate to renderer’s measureTextBbox logic\r\n const tempText = renderer.getSvg().text(text).font({ size: fontSize || 12, family: fontFamily || \"Arial\" });\r\n const bbox = renderer.measureTextBbox(tempText);\r\n tempText.remove();\r\n return bbox.width;\r\n }\r\n\r\n function updateText() {\r\n const { start, end } = getSelectionRange();\r\n const hasSel = hasSelection();\r\n\r\n // redraw main text\r\n txt.clear().tspan(encodeForSvg(buffer));\r\n txt.attr({ \"xml:space\": \"preserve\" });\r\n try { ensureTspansPreserve(txt.node as Element); } catch { }\r\n txt.leading(1.2);\r\n\r\n // --- selection highlight ---\r\n if (hasSel) {\r\n const fontSize = parseFloat(txt.attr('font-size') as string) || 14;\r\n const fontFamily = txt.attr('font-family') as string || 'Arial';\r\n\r\n const textBeforeStart = buffer.slice(0, start);\r\n const textBeforeEnd = buffer.slice(0, end);\r\n\r\n const bbox = txt.bbox();\r\n const highlightX = bbox.x + measureTextWidth(textBeforeStart, fontSize, fontFamily);\r\n const highlightWidth = Math.max(\r\n measureTextWidth(textBeforeEnd, fontSize, fontFamily) - measureTextWidth(textBeforeStart, fontSize, fontFamily),\r\n 1\r\n );\r\n const highlightY = bbox.y;\r\n const highlightH = bbox.height;\r\n\r\n if (!selectionRect) {\r\n //@ts-ignore\r\n selectionRect = rect!.parent()!.rect?.(highlightWidth, highlightH)\r\n .fill('#3390ff')\r\n .attr({ 'fill-opacity': 0.35 });\r\n selectionRect!.node.parentNode!.insertBefore(selectionRect!.node, txt.node);\r\n } else {\r\n selectionRect.size(highlightWidth, highlightH);\r\n }\r\n\r\n selectionRect!.move(highlightX, highlightY);\r\n } else {\r\n if (selectionRect) { selectionRect.remove(); selectionRect = null; }\r\n }\r\n\r\n // --- caret ---\r\n if (editing) {\r\n const fontSize = parseFloat(txt.attr('font-size') as string) || 14;\r\n const fontFamily = txt.attr('font-family') as string || 'Arial';\r\n const textBeforeCaret = buffer.slice(0, cursorPos);\r\n const caretXOffset = measureTextWidth(textBeforeCaret, fontSize, fontFamily);\r\n\r\n const bbox = txt.bbox();\r\n const caretY = bbox.y;\r\n const caretH = bbox.height;\r\n\r\n //@ts-ignore\r\n if (!caretLine) caretLine = rect.parent().rect(1, caretH).fill('#000');\r\n\r\n caretLine!.size(1, caretH).move(bbox.x + caretXOffset, caretY);\r\n } else {\r\n if (caretLine) { caretLine.remove(); caretLine = null; }\r\n }\r\n\r\n // --- resize background rect ---\r\n const bbox = txt.bbox();\r\n const handleRadius = 6;\r\n const textOffsetX = PADDING_X + handleRadius * 2 + 4;\r\n const rectW = Math.max(16, Math.ceil(bbox.width) + textOffsetX + PADDING_X);\r\n const rectH = Math.max(16, Math.ceil(bbox.height) + PADDING_Y * 2);\r\n rect.size(rectW, rectH);\r\n\r\n comment._tempInputBBox = {\r\n width: rectW,\r\n height: rectH,\r\n textX: textOffsetX,\r\n textY: PADDING_Y\r\n };\r\n }\r\n\r\n // --- editing lifecycle ---\r\n function startEditing(ev?: MouseEvent) {\r\n if (editing) return;\r\n editing = true;\r\n buffer = comment.getText() ?? \"\";\r\n cursorPos = buffer.length;\r\n anchorPos = buffer.length;\r\n\r\n userState.setState('typing');\r\n\r\n if (ev) {\r\n const rectBox = txt.node.getBoundingClientRect();\r\n //@ts-ignore\r\n const zoom = renderer.getWs().getZoom();\r\n const clickX = (ev.clientX - rectBox.left - PADDING_X) / zoom;\r\n\r\n let cumulativeWidth = 0;\r\n cursorPos = 0;\r\n for (let i = 0; i < buffer.length; i++) {\r\n const charWidth = measureTextWidth(buffer[i] as string);\r\n if (cumulativeWidth + charWidth / 2 >= clickX) break;\r\n cumulativeWidth += charWidth;\r\n cursorPos = i + 1;\r\n }\r\n }\r\n\r\n anchorPos = cursorPos;\r\n updateText();\r\n skipNextClick = true;\r\n\r\n document.addEventListener(\"keydown\", onKeyDown);\r\n document.addEventListener(\"mousedown\", onClickOutside);\r\n }\r\n\r\n function stopEditing(commit = true) {\r\n if (!editing) return;\r\n editing = false;\r\n userState.removeState(\"typing\");\r\n document.removeEventListener(\"keydown\", onKeyDown, { capture: true });\r\n document.removeEventListener(\"mousedown\", onClickOutside);\r\n\r\n if (commit) comment.setTextNoRedraw(buffer);\r\n updateText();\r\n comment.getWorkspace()?.redraw?.();\r\n }\r\n\r\n\r\n function onKeyDown(e: KeyboardEvent) {\r\n if (!editing) return;\r\n\r\n if (e.key === \"Escape\") { e.preventDefault(); stopEditing(false); return; }\r\n\r\n if (e.key === \"Enter\") {\r\n e.preventDefault();\r\n stopEditing(true);\r\n } else if (e.key === \"Backspace\") {\r\n e.preventDefault();\r\n if (hasSelection()) {\r\n deleteSelection();\r\n } else if (cursorPos > 0) {\r\n buffer = buffer.slice(0, cursorPos - 1) + buffer.slice(cursorPos);\r\n cursorPos--;\r\n anchorPos = cursorPos;\r\n }\r\n } else if (e.key === \"Delete\") {\r\n e.preventDefault();\r\n if (hasSelection()) {\r\n deleteSelection();\r\n } else if (cursorPos < buffer.length) {\r\n buffer = buffer.slice(0, cursorPos) + buffer.slice(cursorPos + 1);\r\n }\r\n }\r\n else if (e.key === \"ArrowLeft\") {\r\n e.preventDefault();\r\n if (e.shiftKey) {\r\n // extend selection left\r\n cursorPos = Math.max(0, cursorPos - 1);\r\n } else {\r\n // collapse selection and move\r\n cursorPos = Math.max(0, cursorPos - 1);\r\n anchorPos = cursorPos;\r\n }\r\n } else if (e.key === \"ArrowRight\") {\r\n e.preventDefault();\r\n if (e.shiftKey) {\r\n // extend selection right\r\n cursorPos = Math.min(buffer.length, cursorPos + 1);\r\n } else {\r\n // collapse selection and move\r\n cursorPos = Math.min(buffer.length, cursorPos + 1);\r\n anchorPos = cursorPos;\r\n }\r\n } else if (e.key === \"Home\") {\r\n e.preventDefault();\r\n if (e.shiftKey) {\r\n cursorPos = 0; // anchor unchanged\r\n } else {\r\n cursorPos = 0;\r\n anchorPos = cursorPos;\r\n }\r\n } else if (e.key === \"End\") {\r\n e.preventDefault();\r\n if (e.shiftKey) {\r\n cursorPos = buffer.length;\r\n } else {\r\n cursorPos = buffer.length;\r\n anchorPos = cursorPos;\r\n }\r\n } else if (e.key.length === 1 && !e.ctrlKey && !e.metaKey) {\r\n e.preventDefault();\r\n if (hasSelection()) deleteSelection();\r\n buffer = buffer.slice(0, cursorPos) + e.key + buffer.slice(cursorPos);\r\n cursorPos++;\r\n anchorPos = cursorPos;\r\n }\r\n\r\n updateText();\r\n comment.setTextNoRedraw(buffer);\r\n }\r\n\r\n function onClickOutside(ev: MouseEvent) {\r\n if (!editing) return;\r\n if (skipNextClick) { skipNextClick = false; return; }\r\n const targ = ev.target as Node;\r\n if (targ !== rect.node && targ !== txt.node) stopEditing(true);\r\n }\r\n\r\n const onRectDown = (ev: Event) => startEditing(ev as MouseEvent);\r\n const onTextDown = (ev: Event) => startEditing(ev as MouseEvent);\r\n\r\n rect.on(\"mousedown\", onRectDown as any);\r\n txt.on(\"mousedown\", onTextDown as any);\r\n\r\n updateText();\r\n\r\n return () => {\r\n rect.off(\"mousedown\", onRectDown as any);\r\n txt.off(\"mousedown\", onTextDown as any);\r\n document.removeEventListener(\"keydown\", onKeyDown, { capture: true });\r\n document.removeEventListener(\"mousedown\", onClickOutside);\r\n };\r\n}\r\n\r\neventer.registerEvent(\"k_commentinp\", initCommentInput as EventSetupFn);\r\nexport default initCommentInput;\r\n","// uid.ts\r\n\r\n/**\r\n * Strategy used to generate UIDs.\r\n */\r\nexport type UIDStrategy = \"uuidv4\" | \"ulid\" | \"nanoid\" | \"short\";\r\n\r\nexport interface UIDOptions {\r\n /** For \"nanoid\": length of the id (default 21) */\r\n size?: number;\r\n /** For \"nanoid\": custom alphabet (default URL-safe) */\r\n alphabet?: string;\r\n}\r\n\r\n/** Web Crypto shim (browser + Node 16+) */\r\nconst cryptoAPI: Crypto | null =\r\n (typeof globalThis !== \"undefined\" && (globalThis as any).crypto) || null;\r\n\r\n/**\r\n * Returns a Uint8Array of random bytes.\r\n * Uses Web Crypto if available; falls back to Math.random otherwise (not cryptographically secure).\r\n *\r\n * @param {number} len - Number of random bytes to generate.\r\n * @returns {Uint8Array} Random bytes array.\r\n */\r\nfunction randBytes(len: number): Uint8Array {\r\n if (cryptoAPI?.getRandomValues) {\r\n const buf = new Uint8Array(len);\r\n cryptoAPI.getRandomValues(buf);\r\n return buf;\r\n }\r\n // Last resort (very old envs). Not cryptographically strong.\r\n const buf = new Uint8Array(len);\r\n for (let i = 0; i < len; i++) buf[i] = Math.floor(Math.random() * 256);\r\n return buf;\r\n}\r\n\r\n/**\r\n * Generates an RFC4122-compliant UUID v4.\r\n * Uses `crypto.randomUUID` if available.\r\n *\r\n * @returns {string} UUID v4 string.\r\n */\r\nexport function uuidv4(): string {\r\n const g: any = globalThis as any;\r\n if (g?.crypto?.randomUUID) return g.crypto.randomUUID();\r\n\r\n const b = randBytes(16);\r\n // Per RFC: set version + variant bits\r\n // @ts-ignore\r\n b[6] = (b[6] & 0x0f) | 0x40;\r\n // @ts-ignore\r\n b[8] = (b[8] & 0x3f) | 0x80;\r\n\r\n const hex: string[] = [];\r\n for (let i = 0; i < 256; i++) hex.push(i.toString(16).padStart(2, \"0\"));\r\n\r\n return (\r\n // @ts-ignore\r\n hex[b[0]] + hex[b[1]] + hex[b[2]] + hex[b[3]] + \"-\" +\r\n // @ts-ignore\r\n hex[b[4]] + hex[b[5]] + \"-\" +\r\n // @ts-ignore\r\n hex[b[6]] + hex[b[7]] + \"-\" +\r\n // @ts-ignore\r\n hex[b[8]] + hex[b[9]] + \"-\" +\r\n // @ts-ignore\r\n hex[b[10]] + hex[b[11]] + hex[b[12]] + hex[b[13]] + hex[b[14]] + hex[b[15]]\r\n );\r\n}\r\n\r\n/** Crockford Base32 alphabet for ULID */\r\nconst CROCK32 = \"0123456789ABCDEFGHJKMNPQRSTVWXYZ\"; // no I L O U\r\n\r\n/**\r\n * Generates a 26-character ULID (time-sortable unique ID).\r\n *\r\n * @param {number} [date] - Optional timestamp in milliseconds. Defaults to `Date.now()`.\r\n * @returns {string} ULID string.\r\n */\r\nexport function ulid(date?: number): string {\r\n const time = (typeof date === \"number\" ? date : Date.now()) >>> 0; // low 32 bits\r\n const timeHi = Math.floor((typeof date === \"number\" ? date : Date.now()) / 0x100000000) >>> 0; // high 32\r\n // ULID uses 48-bit time; do base32 encode 48 bits\r\n const time48 = new Uint8Array(6);\r\n // write 48-bit big-endian\r\n let t = BigInt(typeof date === \"number\" ? date : Date.now());\r\n for (let i = 5; i >= 0; i--) {\r\n time48[i] = Number(t & 0xffn);\r\n t >>= 8n;\r\n }\r\n // first 10 chars = time\r\n let out = \"\";\r\n let acc = 0;\r\n let bits = 0;\r\n for (let i = 0; i < 6; i++) {\r\n // @ts-ignore\r\n acc = (acc << 8) | time48[i];\r\n bits += 8;\r\n while (bits >= 5) {\r\n bits -= 5;\r\n out += CROCK32[(acc >>> bits) & 31];\r\n }\r\n }\r\n if (bits > 0) out += CROCK32[(acc << (5 - bits)) & 31];\r\n out = out.slice(0, 10);\r\n\r\n // last 16 chars = randomness (80 bits)\r\n const rnd = randBytes(10);\r\n acc = 0; bits = 0;\r\n for (let i = 0; i < rnd.length; i++) {\r\n // @ts-ignore\r\n acc = (acc << 8) | rnd[i];\r\n bits += 8;\r\n while (bits >= 5) {\r\n bits -= 5;\r\n out += CROCK32[(acc >>> bits) & 31];\r\n }\r\n }\r\n if (bits > 0) out += CROCK32[(acc << (5 - bits)) & 31];\r\n\r\n return out.slice(0, 26);\r\n}\r\n\r\n/** NanoID-style: URL-safe alphabet by default, configurable length/alphabet */\r\nconst DEFAULT_ALPHABET =\r\n \"_-0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\";\r\n/**\r\n * Generates a NanoID-style string.\r\n *\r\n * @param {number} [size=21] - Length of the generated ID.\r\n * @param {string} [alphabet=DEFAULT_ALPHABET] - Alphabet to use.\r\n * @returns {string} Generated NanoID string.\r\n */\r\nexport function nanoid(size: number = 21, alphabet: string = DEFAULT_ALPHABET): string {\r\n if (size <= 0) throw new Error(\"size must be > 0\");\r\n const mask = (1 << Math.ceil(Math.log2(alphabet.length))) - 1;\r\n let id = \"\";\r\n while (id.length < size) {\r\n const bytes = randBytes(1);\r\n // @ts-ignore\r\n const idx = bytes[0] & mask;\r\n if (idx < alphabet.length) id += alphabet[idx];\r\n }\r\n return id;\r\n}\r\n\r\n/**\r\n * Generates a short, mostly-unique ID (timestamp + counter + random).\r\n * Not cryptographically strong.\r\n *\r\n * @returns {string} Short UID string.\r\n */\r\nlet _ctr = 0;\r\nexport function shortId(): string {\r\n const ts = Date.now().toString(36);\r\n _ctr = (_ctr + 1) & 0xfff; // 0..4095\r\n const c = _ctr.toString(36).padStart(3, \"0\");\r\n const r = Array.from(randBytes(3))\r\n .map(b => (b & 0x3f).toString(36).padStart(2, \"0\"))\r\n .join(\"\")\r\n .slice(0, 4);\r\n return `${ts}${c}${r}`;\r\n}\r\n\r\n/**\r\n * Generates a UID using the specified strategy.\r\n *\r\n * @param {UIDStrategy} [strategy=\"uuidv4\"] - The UID strategy to use.\r\n * @param {UIDOptions} [opts={}] - Options for the selected strategy.\r\n * @returns {string} Generated UID.\r\n */\r\nexport function generateUID(strategy: UIDStrategy = \"uuidv4\", opts: UIDOptions = {}): string {\r\n switch (strategy) {\r\n case \"uuidv4\": return uuidv4();\r\n case \"ulid\": return ulid();\r\n case \"nanoid\": return nanoid(opts.size ?? 21, opts.alphabet ?? DEFAULT_ALPHABET);\r\n case \"short\": return shortId();\r\n default: {\r\n const _exhaustive: never = strategy;\r\n return uuidv4();\r\n }\r\n }\r\n}\r\n","/**\r\n * Escapes special characters in a string to their corresponding HTML entities.\r\n *\r\n * Specifically, it replaces:\r\n * - `&` with `&amp;`\r\n * - `'` with `&apos;`\r\n * - `\"` with `&quot;`\r\n * - `<` with `&lt;`\r\n * - `>` with `&gt;`\r\n *\r\n * @param {string} s - The string to escape.\r\n * @returns {string} The escaped string with special characters replaced by HTML entities.\r\n */\r\nfunction escapeAttr(s: string): string {\r\n return s.replace(/&/g, \"&amp;\")\r\n .replace(/'/g, \"&apos;\")\r\n .replace(/\"/g, \"&quot;\")\r\n .replace(/</g, \"&lt;\")\r\n .replace(/>/g, \"&gt;\");\r\n}\r\n\r\nexport default escapeAttr;\r\n","import { G, Line } from \"@svgdotjs/svg.js\";\r\nimport NodeSvg from \"./nodesvg\";\r\nimport WorkspaceSvg from \"./workspace-svg\";\r\nimport Coordinates from \"./coordinates\";\r\nimport { generateUID } from \"../util/uid\";\r\nimport Workspace from \"./workspace\";\r\n\r\n\r\nexport interface CommentSerialized {\r\n id: string;\r\n text: string;\r\n coords: { x: number; y: number };\r\n parent: string | null; // node ID if node comment, null if workspace comment\r\n}\r\n/**\r\n * Represents a comment attached to either a NodeSvg or a WorkspaceSvg.\r\n */\r\nclass CommentModel {\r\n /** The comment text */\r\n _text: string;\r\n\r\n /** True if this comment belongs to the workspace instead of a node */\r\n _isWorkspaceComment: boolean;\r\n\r\n /** Parent NodeSvg or WorkspaceSvg to which this comment belongs */\r\n _parent: NodeSvg | WorkspaceSvg | Workspace;\r\n\r\n /** SVG group representing this comment in the DOM */\r\n svgGroup?: G | undefined;\r\n\r\n /** Coordinates relative to parent */\r\n relativeCoords: Coordinates;\r\n\r\n /** Optional SVG line connecting the comment to its node */\r\n svgLine?: Line | undefined;\r\n\r\n /** Temporary bounding box info for input handling */\r\n _tempInputBBox?: { width: number; height: number; textX: number; textY: number };\r\n\r\n /** Unique identifier for this comment */\r\n id: string;\r\n\r\n /**\r\n * Creates a new comment attached to a node or workspace.\r\n * @param parent - NodeSvg or WorkspaceSvg this comment belongs to\r\n */\r\n constructor(parent: NodeSvg | WorkspaceSvg | Workspace) {\r\n this._parent = parent;\r\n this._isWorkspaceComment = parent instanceof WorkspaceSvg;\r\n this._text = \"\";\r\n this.relativeCoords = new Coordinates(0, 0); // Coordinates relative to this._parent\r\n this.id = generateUID(\"nanoid\", {\r\n alphabet: \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0129384756!)@(#*$&%^\",\r\n });\r\n }\r\n\r\n /**\r\n * Sets the text of the comment without triggering a comment redraw.\r\n * @param value - New text content\r\n * @returns The updated text\r\n */\r\n setTextNoRedraw(value: string): string {\r\n return (this._text = value);\r\n }\r\n\r\n /**\r\n * Retrieves the current text of the comment.\r\n * @returns The comment text\r\n */\r\n getText(): string {\r\n return this._text;\r\n }\r\n\r\n /**\r\n * Sets the text of the comment and triggers a redraw of all comments in the workspace.\r\n * @param value - New text content\r\n * @returns The updated text\r\n */\r\n setText(value: string): string {\r\n const res = (this._text = value);\r\n if (this.getWorkspace().isHeadless) return res;\r\n this.getWorkspace().renderer.clearComments();\r\n this.getWorkspace().renderer.drawComments();\r\n return res;\r\n }\r\n\r\n /**\r\n * Returns true if this comment is attached to a node.\r\n */\r\n isNodeComment(): boolean {\r\n return !this._isWorkspaceComment;\r\n }\r\n\r\n /**\r\n * Returns true if this comment is attached to the workspace.\r\n */\r\n isWorkspaceComment(): boolean {\r\n return this._isWorkspaceComment;\r\n }\r\n\r\n /**\r\n * Gets the workspace that owns this comment.\r\n */\r\n getWorkspace(): WorkspaceSvg {\r\n if (this.isWorkspaceComment()) {\r\n return this._parent as WorkspaceSvg;\r\n } else {\r\n return (this._parent as NodeSvg)?.workspace as WorkspaceSvg;\r\n }\r\n }\r\n /**\r\n * Convert to JSON structure holding all important data.\r\n */\r\n toJson(): CommentSerialized {\r\n return {\r\n text: this.getText(),\r\n coords: { x: this.relativeCoords.x, y: this.relativeCoords.y },\r\n parent: this.isWorkspaceComment() ? null : (this._parent as NodeSvg).id,\r\n id: this.id\r\n }\r\n }\r\n\r\n /**\r\n * Creates a CommentModel from serialized data.\r\n * @param data - The serialized comment\r\n * @param workspace - The workspace to attach the comment to\r\n * @param nodeMap - Optional map of node IDs to NodeSvg instances\r\n */\r\n static fromJson(\r\n data: CommentSerialized,\r\n ): CommentModel {\r\n const comment = new CommentModel(null as any as WorkspaceSvg | NodeSvg);\r\n comment.id = data.id;\r\n comment.relativeCoords = new Coordinates(data.coords.x, data.coords.y);\r\n comment.setTextNoRedraw(data.text);\r\n\r\n return comment;\r\n }\r\n}\r\n\r\nexport default CommentModel;\r\nexport { CommentModel };\r\n","import Renderer from '../renderers/renderer';\r\nimport WorkspaceSvg from '../src/workspace-svg';\r\nimport NodeSvg from '../src/nodesvg';\r\nimport CommentModel from '../src/comment';\r\nimport { Element, SVG, Svg } from '@svgdotjs/svg.js';\r\nimport eventer from '../util/eventer';\r\n\r\nclass CommentRenderer {\r\n\tstatic get NAME() { return 'cr_atlas'; }\r\n\tstatic get COMMENT_G_TAG() { return 'KabelCommentGroup'; }\r\n\tstatic get COMMENT_LINE_TAG() { return 'KabelCommentLine'; }\r\n\tstatic get COMMENT_TEXT_EL() { return 'KabelCommentText'; }\r\n\tstatic get COMMENT_DRAG_EL() { return 'KabelCommentDragHandle'; }\r\n\tstatic get RENDERER_TAG_EL() { return 'KabelCommentElTag'; }\r\n\r\n\tworkspace: WorkspaceSvg;\r\n\r\n\tconstructor(workspace: WorkspaceSvg) {\r\n\t\tthis.workspace = workspace;\r\n\t}\r\n\r\n\tencodeForSvg(s: string) {\r\n\t\treturn s.replace(/ /g, \"\\u00A0\");\r\n\t}\r\n\r\n\tensureTspansPreserve(node: HTMLElement) {\r\n\t\tArray.from(node.childNodes).forEach((child) => {\r\n\t\t\tif (child.nodeType === 1) {\r\n\t\t\t\t(child as HTMLElement).setAttribute(\"xml:space\", \"preserve\");\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tmeasureTextBbox(textEl: Element) {\r\n\t\treturn textEl.bbox();\r\n\t}\r\n\r\n\tdrawComment(comment: CommentModel) {\r\n\t\tconst svg = this.getSvg();\r\n\t\tthis._removeExistingElements(comment);\r\n\r\n\t\tconst g = svg.group().addClass(CommentRenderer.COMMENT_G_TAG);\r\n\t\tg.attr({\r\n\t\t\t'comment-data': JSON.stringify({\r\n\t\t\t\tid: comment.id,\r\n\t\t\t\tisws: comment.isWorkspaceComment()\r\n\t\t\t})\r\n\t\t});\r\n\t\tcomment.svgGroup = g;\r\n\r\n\t\tconst padding = 4;\r\n\t\tconst handleRadius = 6;\r\n\t\tconst textOffsetX = padding + handleRadius * 2 + 4;\r\n\r\n\t\tconst displayEncoded = this.encodeForSvg(comment.getText());\r\n\t\tconst textEl = this._createTextElement(g, displayEncoded, textOffsetX, padding);\r\n\r\n\t\tconst bbox = this.measureTextBbox(textEl);\r\n\r\n\t\tconst rect = this._createBackgroundRect(g, bbox, padding, handleRadius);\r\n\t\tconst dragHandle = this._createDragHandle(g, bbox, padding, handleRadius);\r\n\r\n\t\tthis._addEventer(rect, dragHandle, comment, textEl);\r\n\r\n\t\tconst { screenPos, zoom } = this._computeScreenPosition(comment);\r\n\t\tg.attr({ transform: `translate(${screenPos.x}, ${screenPos.y}) scale(${zoom})` });\r\n\r\n\t\tif (comment._parent instanceof NodeSvg && comment._parent.svgGroup) {\r\n\t\t\tthis._drawLineToNode(comment, padding);\r\n\t\t}\r\n\t}\r\n\r\n\trefreshCommentTransforms() {\r\n\t\tfor (const comment of [\r\n\t\t\t...this.workspace.getComments(),\r\n\t\t\t...Array.from(this.workspace._nodeDB.values())\r\n\t\t\t\t.map(n => n.getComment())\r\n\t\t\t\t.filter(c => !!c) as CommentModel[]\r\n\t\t]) {\r\n\t\t\tif (!comment.svgGroup) continue;\r\n\r\n\t\t\tconst { screenPos, zoom } = this._computeScreenPosition(comment);\r\n\t\t\tcomment.svgGroup.attr({ transform: `translate(${screenPos.x}, ${screenPos.y}) scale(${zoom})` });\r\n\r\n\t\t\tif (comment.svgLine) {\r\n\t\t\t\tcomment.svgLine.remove();\r\n\t\t\t\tcomment.svgLine = undefined;\r\n\t\t\t}\r\n\r\n\t\t\tif (comment._parent instanceof NodeSvg) {\r\n\t\t\t\tthis._drawLineToNode(comment, 4);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tprivate _removeExistingElements(comment: CommentModel) {\r\n\t\tif (comment.svgGroup) comment.svgGroup.remove();\r\n\t\tif (comment.svgLine) comment.svgLine.remove();\r\n\t}\r\n\r\n\tprivate _createTextElement(parent: Element, text: string, x: number, y: number) {\r\n //@ts-ignore\r\n\t\tconst textEl = parent.text(text)\r\n\t\t\t.font({ family: 'Arial', size: 12 })\r\n\t\t\t.fill('#000')\r\n\t\t\t.move(x, y)\r\n\t\t\t.addClass(CommentRenderer.COMMENT_TEXT_EL);\r\n\r\n\t\ttextEl.node.style.userSelect = 'none';\r\n\t\t// @ts-ignore\r\n\t\ttextEl.node.style!.webkitUserSelect = 'none';\r\n\t\t// @ts-ignore\r\n\t\ttextEl.node.style!.msUserSelect = 'none';\r\n\t\t// @ts-ignore\r\n\t\ttextEl.node.style!.MozUserSelect = 'none';\r\n\t\treturn textEl;\r\n\t}\r\n\r\n\tprivate _createBackgroundRect(parent: Element, bbox: any, padding: number, handleRadius: number) {\r\n //@ts-ignore\r\n\t\treturn parent.rect(bbox.width + padding * 2 + handleRadius * 2 + 4, bbox.height + padding * 2)\r\n\t\t\t.fill('#ffffcc')\r\n\t\t\t.stroke({ color: '#cccc99', width: 1 })\r\n\t\t\t.radius(4)\r\n\t\t\t.back();\r\n\t}\r\n\r\n\tprivate _createDragHandle(parent: Element, bbox: any, padding: number, handleRadius: number) {\r\n //@ts-ignore\r\n\t\treturn parent.circle(handleRadius * 2)\r\n\t\t\t.fill('#adad7d')\r\n\t\t\t.move(padding, padding + (bbox.height / 2) - handleRadius)\r\n\t\t\t.addClass(CommentRenderer.COMMENT_DRAG_EL);\r\n\t}\r\n\r\n\tprivate _addEventer(rect: Element, dragHandle: Element, comment: CommentModel, textEl: Element) {\r\n\t\teventer.addElement(dragHandle, 'k_draghandle', { comment })\r\n\t\t\t.tagElement(dragHandle, CommentRenderer.RENDERER_TAG_EL);\r\n\t\teventer.addElement(rect, \"k_commentinp\", { comment, text: textEl, renderer: this })\r\n\t\t\t.tagElement(rect, CommentRenderer.RENDERER_TAG_EL);\r\n\t}\r\n\r\n\tprivate _computeScreenPosition(comment: CommentModel) {\r\n\t\tlet workspaceX = comment.relativeCoords.x;\r\n\t\tlet workspaceY = comment.relativeCoords.y;\r\n\r\n\t\tif (comment._parent instanceof NodeSvg) {\r\n\t\t\tconst nodePos = comment._parent.relativeCoords;\r\n\t\t\tworkspaceX += nodePos.x;\r\n\t\t\tworkspaceY += nodePos.y;\r\n\t\t}\r\n\r\n\t\tconst screenPos = this.workspace.workspaceToScreen(workspaceX, workspaceY);\r\n\t\tconst zoom = this.workspace.getZoom();\r\n\t\treturn { screenPos, zoom };\r\n\t}\r\n\r\n\tprivate _drawLineToNode(comment: CommentModel, padding: number) {\r\n\t\tif (!comment || !(comment._parent instanceof NodeSvg) || !comment.svgGroup) return;\r\n\t\tconst svg = this.getSvg();\r\n\t\tconst ws = this.workspace;\r\n\r\n\t\tif (comment.svgLine) comment.svgLine.remove();\r\n\r\n\t\tconst nodeWSPos = comment._parent.relativeCoords;\r\n\t\tconst nodeBBox = comment._parent.svgGroup!.bbox();\r\n\t\tconst nodeTopCenter = ws.workspaceToScreen(\r\n\t\t\tnodeWSPos.x + nodeBBox.width / 2,\r\n\t\t\tnodeWSPos.y\r\n\t\t);\r\n\r\n\t\tconst parentWSPos = comment._parent.relativeCoords;\r\n\t\tconst commentRelPos = comment.relativeCoords;\r\n\t\tconst commentAbsX = parentWSPos.x + commentRelPos.x;\r\n\t\tconst commentAbsY = parentWSPos.y + commentRelPos.y;\r\n\t\tconst commentBBox = comment.svgGroup!.bbox();\r\n\t\tconst commentTopCenter = ws.workspaceToScreen(\r\n\t\t\tcommentAbsX + (commentBBox.width + padding * 2) / 2,\r\n\t\t\tcommentAbsY\r\n\t\t);\r\n\r\n\t\tcomment.svgLine = svg.line(\r\n\t\t\tnodeTopCenter.x, nodeTopCenter.y,\r\n\t\t\tcommentTopCenter.x, commentTopCenter.y\r\n\t\t)\r\n\t\t\t.stroke({ color: '#888', width: 1, dasharray: '3,2' })\r\n\t\t\t.addClass(CommentRenderer.COMMENT_LINE_TAG)\r\n\t\t\t.back();\r\n\t}\r\n\r\n\tclearAllComments() {\r\n\t\tconst svg = this.getSvg();\r\n\t\tsvg.find(`.${CommentRenderer.COMMENT_G_TAG}`).forEach(el => el.remove());\r\n\t\tsvg.find(`.${CommentRenderer.COMMENT_LINE_TAG}`).forEach(el => el.remove());\r\n\t\teventer.destroyByTag(CommentRenderer.RENDERER_TAG_EL);\r\n\r\n\t\tfor (let [_, node] of this.workspace._nodeDB) {\r\n\t\t\tconst comment = node.getComment();\r\n\t\t\tif (comment) comment.svgGroup = undefined;\r\n\t\t}\r\n\r\n\t\tfor (const comment of this.workspace.getComments()) {\r\n\t\t\tcomment.svgGroup = undefined;\r\n\t\t}\r\n\t}\r\n\r\n\tclearCommentLines() {\r\n\t\tconst svg = this.getSvg();\r\n\t\tsvg.find(`.${CommentRenderer.COMMENT_LINE_TAG}`).forEach(el => el.remove());\r\n\t}\r\n\r\n\tdrawAllComments() {\r\n\t\tfor (const comment of this.workspace.getComments()) this.drawComment(comment);\r\n\t\tfor (let [_, node] of this.workspace._nodeDB) {\r\n\t\t\tconst comment = node.getComment();\r\n\t\t\tif (comment) this.drawComment(comment);\r\n\t\t}\r\n\t}\r\n\r\n\tgetSvg(): Svg {\r\n\t\treturn this.workspace.svg;\r\n\t}\r\n getWs(): WorkspaceSvg {\r\n return this.workspace;\r\n }\r\n}\r\n\r\nexport default CommentRenderer;\r\n","\r\nimport ApolloRenderer from \"./renderer\"\r\nimport ApolloConstants from \"./constants\"\r\nimport Representer from \"../representer\"\r\nimport { RepresenterNode } from \"../representer-node\"\r\n\r\nexport interface apolloType {\r\n Renderer: typeof ApolloRenderer;\r\n Constants: typeof ApolloConstants;\r\n Representer: typeof Representer;\r\n RepresenterNode: typeof RepresenterNode;\r\n}\r\n\r\n\r\nexport {\r\n ApolloRenderer as Renderer,\r\n ApolloConstants as Constants,\r\n // Despite apollo not extending these, we still need to re-export them for the API.\r\n Representer,\r\n RepresenterNode\r\n}","import RendererConstants from \"./constants\";\r\nimport WorkspaceSvg from '../src/workspace-svg';\r\nimport NodeSvg from '../src/nodesvg';\r\nimport * as Path from '../util/path';\r\nimport { parseColor } from \"../util/parse-color\";\r\nimport { G, Path as SvgPath, Svg, StrokeData, Element, List, Rect } from \"@svgdotjs/svg.js\";\r\nimport { Color, ColorStyle, Hex } from \"../src/visual-types\";\r\nimport Field, { AnyField, ConnectableField, DummyField, FieldRawBoxData, OptConnectField } from \"../src/field\";\r\nimport eventer from '../util/eventer';\r\nimport Connection, { Connectable } from \"../src/connection\";\r\nimport escapeAttr from '../util/escape-html';\r\nimport unescapeAttr from '../util/unescape-html';\r\nimport CommentRenderer from \"../comment-renderer/renderer\";\r\nimport { FieldVisualInfo } from \"../src/field\";\r\nimport { RepresenterNode } from \"./representer-node\";\r\nimport type Representer from \"./representer\";\r\n\r\nexport interface ConnectorToFrom {\r\n to: Connection,\r\n from: Connection,\r\n fromCircle?: SvgPath,\r\n toCircle?: SvgPath,\r\n originConn: Connection,\r\n originCircle: SvgPath\r\n}\r\nexport interface DrawState {\r\n id: string;\r\n shadow?: SvgPath;\r\n topbar?: SvgPath | null;\r\n bg?: SvgPath | null;\r\n group?: G | null;\r\n fieldCol?: G | null;\r\n fieldPosY?: number | null; // starts under topbar, goes down by field height each time one is drawn. This determines position\r\n xButton?: G;\r\n pendingConnections: ConnectorToFrom[]\r\n}\r\nexport interface NodeMeasurements {\r\n width: number;\r\n height: number;\r\n fields: { width: number; height: number }[];\r\n}\r\n\r\nclass Renderer {\r\n /**\r\n * Set of constants the renderer uses for drawing nodes.\r\n */\r\n _constants!: RendererConstants;\r\n /**\r\n * The current node being rendered.\r\n */\r\n _currentNode: NodeSvg | null;\r\n /**\r\n * The SVG group element for the current node.\r\n */\r\n _nodeGroup: G | null;\r\n /**\r\n * The current drawing state for the node.\r\n */\r\n _nodeDraw: DrawState | null;\r\n /**\r\n * The workspace this renderer is associated with.\r\n */\r\n _ws: WorkspaceSvg;\r\n /**\r\n * Array of stored draw states for rendered nodes.\r\n */\r\n _drawStates: DrawState[];\r\n /**\r\n * Comment renderer instance used for rendering comments.\r\n */\r\n _commentDrawer!: CommentRenderer;\r\n /**\r\n * Representer instance used for building node representations.\r\n */\r\n representer!: Representer;\r\n /**\r\n * Constant overrides provided during renderer instantiation.\r\n */\r\n constantOverrides: Partial<RendererConstants>;\r\n /**\r\n * Tag used for node group elements in the SVG.\r\n */\r\n static get NODE_G_TAG() {\r\n return 'AtlasNodeSVG';\r\n }\r\n /**\r\n * Tag used for renderer elements in the SVG.\r\n */\r\n static get ELEMENT_TAG() {\r\n return 'AtlasElement'\r\n }\r\n /**\r\n * Tag used for connection line elements in the SVG.\r\n */\r\n static get CONN_LINE_TAG() {\r\n return 'AtlasConnectionLine';\r\n }\r\n /**\r\n * Tag used for connector elements in the SVG.\r\n */\r\n static get CONNECTOR_TAG() {\r\n return 'AtlasConnectionBubble';\r\n }\r\n /**\r\n * Tag used for line X mark elements in the SVG.\r\n */\r\n static get LINE_X_MARK_TAG() {\r\n return 'AtlasLineXMark';\r\n }\r\n /**\r\n * Tag used for background pattern elements in the SVG. This is constant, do not modify it in subclasses.\r\n */\r\n static get BACKGROUND_PATTERN() {\r\n /** ! CONSTANT ! DO NOT CHANGE ! CONSTANT ! */\r\n return 'WorkspaceBgPattern'\r\n }\r\n /**\r\n * Name of the renderer.\r\n */\r\n static get NAME() {\r\n return 'atlas'; // default is called atlas.\r\n }\r\n /**\r\n * Constructor for the Renderer class.\r\n * @param workspace - The workspace associated with the renderer.\r\n * @param overrides - Optional constant overrides for the renderer.\r\n */\r\n constructor(workspace: WorkspaceSvg, overrides: Partial<RendererConstants> = {}) {\r\n this._ws = workspace;\r\n this._currentNode = null;\r\n this._nodeGroup = null;\r\n this._nodeDraw = null;\r\n this._drawStates = [];\r\n this.constantOverrides = overrides;\r\n this.init();\r\n }\r\n /**\r\n * Initializes the renderer by setting up the comment renderer, representer, and constants.\r\n */\r\n init() {\r\n this.initCommentRenderer();\r\n this.initRepresenter();\r\n this.initConstants();\r\n }\r\n /**\r\n * Initializes the renderer constants with any provided overrides.\r\n */\r\n initConstants() {\r\n this._constants = new RendererConstants(this.constantOverrides);\r\n }\r\n /**\r\n * Initializes the representer for the renderer.\r\n */\r\n initRepresenter() {\r\n const Representer = (require('./representer').default);\r\n this.representer = new Representer();\r\n }\r\n /**\r\n * Initializes the comment renderer for the workspace.\r\n */\r\n initCommentRenderer() {\r\n this._commentDrawer = new CommentRenderer(this.getWs());\r\n }\r\n /**\r\n * Sets the connection to be processed.\r\n * @param c - The connection to set.\r\n */\r\n setConnect(c: ConnectorToFrom) {\r\n this.state?.pendingConnections?.push?.(c);\r\n }\r\n /**\r\n * Sets the renderer constants.\r\n * @param c - Partial constants to override.\r\n * @returns The updated constants.\r\n */\r\n setConstants(c: Partial<RendererConstants> = {}) {\r\n return Object.assign(this._constants, c);\r\n }\r\n /**\r\n * Gets the renderer constants, merging with node style if applicable.\r\n */\r\n get constants(): RendererConstants {\r\n if (!this.node) return this._constants;\r\n\r\n const { primary, secondary, tertiary, ...restColors } = this.node.colors;\r\n\r\n return {\r\n ...this._constants,\r\n ...restColors\r\n };\r\n }\r\n /**\r\n * Sets the renderer constants.\r\n */\r\n set constants(c: Partial<RendererConstants>) {\r\n this.setConstants(c);\r\n }\r\n /**\r\n * Gets the current node being rendered.\r\n */\r\n get node() {\r\n return this._currentNode;\r\n }\r\n /**\r\n * Gets the SVG.js instance from the workspace.\r\n */\r\n get svg(): Svg {\r\n return this.getWs().svg; // Svg.js instance\r\n }\r\n /**\r\n * Gets the current drawing state.\r\n */\r\n get state(): null | undefined | DrawState {\r\n return this._nodeDraw;\r\n }\r\n /**\r\n * Gets the workspace associated with the renderer.\r\n * @returns The workspace instance.\r\n */\r\n getWs() {\r\n return this._ws;\r\n }\r\n // MEASURING -\r\n\r\n /**\r\n * Gets the base measurements for a node.\r\n * @returns The base width and height of the node.\r\n */\r\n getNodeBaseMeasurements() {\r\n const c = this.constants;\r\n return {\r\n width: c.NODE_BASE_WIDTH,\r\n height: c.NODE_BASE_HEIGHT\r\n }\r\n }\r\n /**\r\n * Measures the width of the given text.\r\n * @param text - The text to measure.\r\n * @param fontSize - The font size to use.\r\n * @param fontFamily - The font family to use.\r\n * @returns The width of the text.\r\n */\r\n measureTextWidth(text: string, fontSize?: number, fontFamily?: string): number {\r\n const c = this.constants;\r\n\r\n // fallback in case SVG is not ready\r\n if (!this.svg) return text.length * (fontSize ?? c.FONT_SIZE) * 0.6;\r\n\r\n const txt = this.svg.text(text)\r\n .font({\r\n family: fontFamily ?? c.FONT_FAMILY,\r\n size: fontSize ?? c.FONT_SIZE,\r\n anchor: 'start'\r\n })\r\n .opacity(0); // hide it\r\n\r\n const width = txt.bbox().width;\r\n txt.remove(); // clean up\r\n return width;\r\n }\r\n /**\r\n * Measures the height of the given text.\r\n * @param text - The text to measure.\r\n * @param fontSize - The font size to use.\r\n * @param fontFamily - The font family to use.\r\n * @returns The height of the text.\r\n */\r\n measureTextHeight(text: string, fontSize?: number, fontFamily?: string): number {\r\n const c = this.constants;\r\n\r\n // fallback in case SVG is not ready\r\n if (!this.svg) return (fontSize ?? c.FONT_SIZE);\r\n\r\n const txt = this.svg.text(text)\r\n .font({\r\n family: fontFamily ?? c.FONT_FAMILY,\r\n size: fontSize ?? c.FONT_SIZE,\r\n anchor: 'start'\r\n })\r\n .opacity(0); // hide it\r\n\r\n const height = txt.bbox().height;\r\n txt.remove(); // clean up\r\n return height;\r\n }\r\n /**\r\n * Measures the dimensions of a raw input field.\r\n * @param text - The text content of the raw field.\r\n * @returns The width and height of the raw field.\r\n */\r\n measureRawField(text: string = \"\") {\r\n const c = this.constants;\r\n const textW = this.measureTextWidth(text);\r\n const width = Math.max(c.FIELD_RAW_BASE_WIDTH, textW + c.INPUT_BOX_PADDING * 2);\r\n const height = c.FIELD_RAW_BASE_HEIGHT;\r\n return { width, height };\r\n }\r\n /**\r\n * Measures the label of a field.\r\n * @param field - The field to measure the label for.\r\n * @returns The width and height of the label.\r\n */\r\n measureLabel(field: AnyField): { width: number, height: number } {\r\n const c = this.constants;\r\n const label = field.getLabel?.();\r\n if (!label) return { width: 0, height: 0 };\r\n\r\n const width = this.measureTextWidth(label);\r\n const height = this.measureTextHeight(label);\r\n\r\n return { width, height };\r\n }\r\n /**\r\n * Measures the raw input of a field.\r\n * @param field - The field to measure the raw input for.\r\n * @returns The width and height of the raw input.\r\n */\r\n measureRaw(field: AnyField): { width: number, height: number } {\r\n if (!field.hasRaw()) return { width: 0, height: 0 };\r\n\r\n const c = this.constants;\r\n const raw = this.measureRawField(field.getValue?.() ?? \"\");\r\n return {\r\n width: raw.width,\r\n height: raw.height\r\n };\r\n }\r\n /**\r\n * Measures the custom editor of a field.\r\n * @param field - The field to measure the custom editor for.\r\n * @returns The width and height of the custom editor.\r\n */\r\n measureCustom(field: AnyField): { width: number, height: number } {\r\n if (!field.isCustomEditor()) return { width: 0, height: 0 };\r\n\r\n const c = this.constants;\r\n const m = field.measureMyself();\r\n if (!m) return { width: 0, height: 0 };\r\n\r\n let width = m.width as number;\r\n let height = m.height as number;\r\n\r\n return { width, height };\r\n }\r\n /**\r\n * Gets the padding to apply when measuring a field.\r\n * @returns The width and height padding for the field.\r\n */\r\n getFieldMeasurementPadding() {\r\n return { width: this.constants.FIELD_SPACEX, height: 0 }\r\n }\r\n /**\r\n * Measures the overall dimensions of a field.\r\n * @param field - The field to measure.\r\n * @returns The width and height of the field.\r\n */\r\n measureField(field: AnyField) {\r\n // parts of the measurement, correct order matters.\r\n const parts = [\r\n this.getFieldMeasurementPadding(),\r\n this.measureLabel(field),\r\n this.measureRaw(field),\r\n this.measureCustom(field),\r\n this.getFieldMeasurementPadding()\r\n ];\r\n\r\n let width = 0, height = 0;\r\n for (const { width: w, height: h } of parts) {\r\n width += w;\r\n height = Math.max(height, h);\r\n }\r\n\r\n return { width, height };\r\n }\r\n /**\r\n * Measures the overall dimensions of the current node.\r\n * @returns The measurements of the node including width, height, and field dimensions.\r\n */\r\n measureNodeDimensions(): NodeMeasurements | void | null {\r\n if (!this.node) return;\r\n\r\n const c = this.constants;\r\n\r\n const base = this.measureBaseAndLabel();\r\n\r\n const fieldResult = this.measureFields(\r\n c.TOPBAR_HEIGHT + c.FIELD_SPACEY,\r\n base.width,\r\n base.height\r\n );\r\n\r\n return {\r\n width: fieldResult.width,\r\n height: fieldResult.height + c.FOOTER_HEIGHT,\r\n fields: fieldResult.fields\r\n };\r\n }\r\n /**\r\n * Measures all fields of the current node.\r\n * @param startY The starting Y position for the fields.\r\n * @param startWidth The starting width of the node.\r\n * @param startHeight The starting height of the node.\r\n * @returns The width, height, and field dimensions.\r\n */\r\n measureFields(\r\n startY: number,\r\n startWidth: number,\r\n startHeight: number\r\n ): {\r\n width: number;\r\n height: number;\r\n fields: { width: number; height: number }[];\r\n } {\r\n const c = this.constants;\r\n const node = this.node!;\r\n\r\n let y = startY;\r\n let totalWidth = startWidth;\r\n let totalHeight = startHeight;\r\n const fields: { width: number; height: number }[] = [];\r\n\r\n for (const field of node.allFields()) {\r\n const m = this.measureField(field);\r\n fields.push(m);\r\n\r\n totalWidth = Math.max(\r\n totalWidth,\r\n m.width + c.FIELD_MARGIN_X * 2\r\n );\r\n\r\n const bottom = y + m.height;\r\n if (bottom + c.FIELD_MARGIN_Y > totalHeight) {\r\n totalHeight = bottom + c.FIELD_MARGIN_Y;\r\n }\r\n\r\n y += m.height + c.FIELD_MARGIN_Y;\r\n }\r\n\r\n return { width: totalWidth, height: totalHeight, fields };\r\n }\r\n /**\r\n * Measures the base dimensions of the current node including label.\r\n * @returns The width and height of the node base and label.\r\n */\r\n private measureBaseAndLabel(): { width: number; height: number } {\r\n const c = this.constants;\r\n const node = this.node!;\r\n\r\n const base = this.getNodeBaseMeasurements();\r\n let width = base.width;\r\n let height = base.height;\r\n\r\n if (node.labelText) {\r\n const labelW = this.measureTextWidth(\r\n node.labelText,\r\n c.FONT_SIZE,\r\n c.FONT_FAMILY\r\n );\r\n\r\n width = Math.max(\r\n width,\r\n labelW + c.TOPBAR_LABEL_MARGIN_X * 2\r\n );\r\n }\r\n\r\n return { width, height };\r\n }\r\n // renderNode METHOD + NODE DRAW INITING.\r\n /**\r\n * Renders the specified node by drawing it and building its representation.\r\n * @param nodeIdOrNode The node or node ID to render.\r\n * @returns Void.\r\n */\r\n renderNode(nodeIdOrNode: NodeSvg | string) {\r\n this.startNode(nodeIdOrNode);\r\n if (!this.node) return;\r\n this.drawNode();\r\n this.representer.build(this.node as NodeSvg, this, this.state as DrawState);\r\n this.storeState();\r\n }\r\n /**\r\n * Starts rendering the specified node.\r\n * @param nodeIdOrNode The node or node ID to start rendering.\r\n */\r\n startNode(nodeIdOrNode: NodeSvg | string) {\r\n const ws = this.getWs();\r\n if (nodeIdOrNode instanceof NodeSvg) {\r\n this._currentNode = nodeIdOrNode;\r\n } else {\r\n const node = ws.getNode(nodeIdOrNode);\r\n if (node instanceof NodeSvg) {\r\n this._currentNode = node;\r\n } else {\r\n this._currentNode = null;\r\n }\r\n }\r\n }\r\n // DRAW-STATE MANAGEMENT -\r\n /**\r\n * Build a draw state for the given node group and ID.\r\n * @param nodeGroup - The SVG group element for the node.\r\n * @param id - The ID of the node.\r\n * @returns - The constructed DrawState object.\r\n */\r\n drawState(nodeGroup: G, id: string): DrawState {\r\n return {\r\n id,\r\n group: nodeGroup,\r\n fieldPosY: 0,\r\n pendingConnections: []\r\n }\r\n }\r\n /**\r\n * Stores the current draw state.\r\n */\r\n storeState() {\r\n this._drawStates.push(this.state as DrawState);\r\n }\r\n // DRAWING + EVENT INITIALIZING VIA EVENTER\r\n /**\r\n * Draws a raw input field.\r\n * @param fieldGroup - The SVG group element for the field.\r\n * @param field - The field to draw.\r\n * @param startX - The starting X position for the field.\r\n * @returns The rectangle and text elements of the raw field.\r\n */\r\n drawFieldRaw(fieldGroup: G, field: AnyField, startX: number = 0) {\r\n const c = this.constants;\r\n const value = field.getDisplayValue?.() ?? \"\";\r\n const { width, height } = this.measureRawField(value);\r\n\r\n const rect = fieldGroup.rect(width, height)\r\n .fill(parseColor(c.FIELD_RAW_COLOR))\r\n .stroke({ color: parseColor(c.FIELD_RAW_OUTLINE_COLOR), width: c.FIELD_RAW_OUTLINE_STROKE })\r\n .radius(3);\r\n\r\n const txt = fieldGroup.text(value)\r\n .font({\r\n family: c.FONT_FAMILY,\r\n size: c.FONT_SIZE,\r\n anchor: c.INPUT_BOX_TEXT_ANCHOR\r\n })\r\n .fill(parseColor(c.FIELD_RAW_TEXT_COLOR));\r\n txt.node.style.userSelect = 'none';\r\n\r\n const rawBox: FieldRawBoxData = {\r\n box: rect,\r\n txt\r\n }\r\n\r\n const textBBox = txt.bbox();\r\n const offsetY = (height - textBBox.height) / 2;\r\n\r\n // move relative to startX (after label)\r\n rect.move(startX, 0);\r\n txt.move(startX + c.INPUT_BOX_PADDING, offsetY);\r\n eventer.addElement(rect, \"k_inputbox\", {\r\n field, // the field object that has .getValue() and .setValue(v)\r\n text: txt, // the svg.js Text element you drew\r\n renderer: this, // the renderer instance, must have .measureRawField and .constants\r\n startX // x-offset where the box should start (after label)\r\n }).tagElement(rect, [(this.constructor as typeof Renderer).ELEMENT_TAG, `node_${this.node!.id}`])\r\n\r\n return { rect, txt, rawBox };\r\n }\r\n\r\n /**\r\n * Draws the label of a field.\r\n * @param fieldGroup - The SVG group element for the field.\r\n * @param field - The field to draw the label for.\r\n * @param startX - The starting X position for the label.\r\n * @returns The width used by the label including spacing.\r\n */\r\n drawFieldLabel(fieldGroup: G, field: AnyField, startX: number = 0): number {\r\n const c = this.constants;\r\n const label = field.getLabel?.();\r\n if (!label) return 0;\r\n\r\n const txt = fieldGroup.text(label)\r\n .font({\r\n family: c.FONT_FAMILY,\r\n size: c.FONT_SIZE,\r\n anchor: 'start'\r\n })\r\n .fill(parseColor(c.FONT_COLOR));\r\n txt.node.style.userSelect = 'none';\r\n const bbox = txt.bbox();\r\n const offsetY = (Math.max(c.FIELD_RAW_BASE_HEIGHT, bbox.height) - bbox.height) / 2;\r\n\r\n // move label relative to startX\r\n txt.move(startX, offsetY);\r\n\r\n // return width used for next element\r\n return bbox.width + c.LABEL_SPACING;\r\n }\r\n /**\r\n * Draws the X button on the node's top bar.\r\n * @returns Void.\r\n */\r\n drawNodeXButton() {\r\n const node = this.node;\r\n const state = this._nodeDraw;\r\n if (!node || !state || !state.group) return;\r\n\r\n const c = this.constants;\r\n\r\n const measurements = this.measureNodeDimensions();\r\n const width = measurements?.width ?? c.NODE_BASE_WIDTH;\r\n\r\n const btnSize = c.TOPBAR_HEIGHT * 0.6;\r\n const padding = (c.TOPBAR_HEIGHT - btnSize) / 2;\r\n\r\n // Button group\r\n const xGroup = state.group.group().attr({ class: 'node-x-clse' });\r\n eventer.addElement(xGroup, 'k_closenode', {\r\n workspace: this.getWs(),\r\n node\r\n }).tagElement(xGroup, [(this.constructor as typeof Renderer).ELEMENT_TAG, `node_${node.id}`]);\r\n // Background\r\n xGroup.rect(btnSize, btnSize)\r\n .fill('#ffffff00')\r\n .radius(2)\r\n .move(width - btnSize - padding, padding);\r\n\r\n // X mark\r\n const txt = xGroup.text('×')\r\n .font({\r\n family: c.FONT_FAMILY,\r\n size: btnSize * 0.8,\r\n weight: 'bold',\r\n anchor: 'middle'\r\n })\r\n .fill('#fff')\r\n .attr({\r\n 'text-anchor': 'middle', // horizontal centering\r\n 'dominant-baseline': 'middle' // vertical centering\r\n });\r\n txt.node.style.userSelect = 'none';\r\n // Apply transform to center it inside the button\r\n txt.transform({\r\n translateX: width - btnSize / 2 - padding,\r\n translateY: padding + btnSize / 2\r\n });\r\n\r\n state.xButton = xGroup;\r\n }\r\n /**\r\n * Draws a connector on the specified side of the node.\r\n * @param nodeGroup - The SVG group element for the node.\r\n * @param nodeBg - The background SVG path of the node.\r\n * @param y - The Y position for the connector.\r\n * @param side - The side to draw the connector on ('left' or 'right').\r\n * @param color - The color of the connector.\r\n * @returns The SVG path of the connector or null if not drawn.\r\n */\r\n drawConnector(nodeGroup: G, nodeBg: SvgPath, y: number, side: 'left' | 'right', color: string): SvgPath | void | undefined | null {\r\n const c = this.constants;\r\n if (!nodeGroup || !nodeBg) return null;\r\n\r\n const bbox = nodeBg.bbox(); // get dimensions of the background\r\n const group = nodeGroup; // attach connector to top-level node group\r\n const x = side === 'left' ? 0 : bbox.width;\r\n\r\n if (c.CONNECTOR_TRIANGLE) {\r\n // small triangle connector\r\n const triSize = c.CONNECTOR_TRI_SIZE;\r\n let path = Path.roundedTri(triSize, triSize, 1);\r\n\r\n // flip triangle horizontally for left side\r\n if (side === 'left') path = Path.rotatePath(path, 180, triSize / 2, triSize / 2);\r\n\r\n const tri = group.path(path)\r\n .fill(parseColor(color as Hex))\r\n .stroke({ color: parseColor('#00000000'), width: 0 });\r\n tri.attr({\r\n class: (this.constructor as typeof Renderer).CONNECTOR_TAG\r\n })\r\n const offsetX = side === 'left' ? -triSize : 0;\r\n tri.transform({ translateX: x + offsetX, translateY: y - triSize / 2 });\r\n\r\n return tri;\r\n } else {\r\n // circle connector\r\n const radius = c.CONNECTOR_RADIUS;\r\n const circlePath = Path.circle(radius);\r\n\r\n const circ = group.path(circlePath)\r\n .fill(parseColor(color as Hex))\r\n .stroke({ color: parseColor('#00000000'), width: 0 })\r\n .move(x - radius, y - radius); // center circle at (x, y)\r\n circ.attr({\r\n class: (this.constructor as typeof Renderer).CONNECTOR_TAG\r\n })\r\n return circ;\r\n }\r\n }\r\n\r\n /**\r\n * Draws the label on the node's top bar.\r\n * @param nodeGroup - The SVG group element for the node.\r\n * @returns Void.\r\n */\r\n drawNodeLabel(nodeGroup: G) {\r\n const node = this.node;\r\n const c = this.constants;\r\n if (!node) return;\r\n\r\n if (node.labelText) {\r\n const txt = nodeGroup.text(node.labelText)\r\n .font({\r\n family: c.FONT_FAMILY,\r\n size: c.FONT_SIZE,\r\n anchor: 'start',\r\n weight: c.TOPBAR_LABEL_BOLDED ? '600' : 'normal'\r\n })\r\n .fill(parseColor(c.FONT_COLOR));\r\n\r\n txt.node.style.userSelect = 'none';\r\n\r\n const bbox = txt.bbox();\r\n const offsetY = (c.TOPBAR_HEIGHT - bbox.height) / 2;\r\n\r\n txt.move(c.TOPBAR_LABEL_MARGIN_X, offsetY + c.TOPBAR_LABEL_MARGIN_Y);\r\n }\r\n }\r\n\r\n /**\r\n * Draws the current node.\r\n * @returns Void.\r\n */\r\n drawNode() {\r\n if (!this.node) return;\r\n\r\n const node = this.node;\r\n const state = this.drawState(this.createNodeGroup(node), node.id);\r\n this._nodeDraw = state;\r\n\r\n const measurements = this.measureNodeDimensions();\r\n\r\n this.drawNodeBase(state, measurements as NodeMeasurements);\r\n this.drawNodeTopbar(state, this.getNodeColors(), measurements as NodeMeasurements);\r\n this.drawNodeXButton();\r\n this.drawNodeLabel(state.group!);\r\n this.makeNodeDraggable(state.group!, state.topbar!, node);\r\n\r\n this.createFieldGroup(state);\r\n this.drawAllFieldsForNode(measurements as NodeMeasurements);\r\n\r\n this.drawPreviousNextConnections(state, node, state.group!, measurements as NodeMeasurements);\r\n }\r\n /**\r\n * Creates the SVG group for the given node.\r\n * @param node - The node to create the group for.\r\n * @returns The created SVG group element.\r\n */\r\n createNodeGroup(node: NodeSvg): G {\r\n const nodeGroup = this.svg.group().attr({\r\n 'data-node-id': escapeAttr(node.id),\r\n 'class': (this.constructor as typeof Renderer).NODE_G_TAG\r\n });\r\n const screenPos = this._ws.workspaceToScreen(node.relativeCoords.x, node.relativeCoords.y);\r\n nodeGroup.attr({ transform: `translate(${screenPos.x}, ${screenPos.y})` });\r\n return nodeGroup;\r\n }\r\n /**\r\n * Draws the base and shadow of the node.\r\n * @param state - The current drawing state.\r\n * @param measurements - The measurements of the node.\r\n */\r\n drawNodeBase(state: DrawState, measurements: NodeMeasurements | null) {\r\n const c = this.constants;\r\n const width = measurements?.width ?? c.NODE_BASE_WIDTH;\r\n const height = measurements?.height ?? c.NODE_BASE_HEIGHT;\r\n const radius = c.CORNER_RADIUS;\r\n state.bg = state.group!.path(Path.roundedRect(width, height, radius))\r\n .fill(parseColor(c.NODE_BG_COLOR))\r\n .stroke({ color: parseColor(c.NODE_OUTLINE_COLOR), width: 2 } as StrokeData);\r\n state.shadow = state.group!.path(Path.roundedRect(width, height, radius))\r\n .fill('rgba(0,0,0,0.2)')\r\n .move(Number(state.bg.x()) + 5, Number(state.bg.y()) + 5)\r\n .back(); // make sure it's behind the node\r\n }\r\n /**\r\n * Draw the node's topbar\r\n * @param state - The draw state\r\n * @param colors - The colors of the node.\r\n * @param measurements - The measurement data of the node.\r\n */\r\n drawNodeTopbar(state: DrawState, colors: ColorStyle, measurements: NodeMeasurements | null) {\r\n const c = this.constants;\r\n const width = measurements?.width ?? c.NODE_BASE_WIDTH;\r\n const radius = c.CORNER_RADIUS;\r\n state.topbar = state.group!.path(Path.roundedRect(width, c.TOPBAR_HEIGHT, radius))\r\n .fill(parseColor(colors.primary))\r\n .stroke({ color: parseColor(colors.tertiary), width: 2 } as StrokeData);\r\n }\r\n /**\r\n * Make a node draggable.\r\n * @param nodeGroup - The node group to make draggable\r\n * @param dragHandle - The drag handle\r\n * @param node - The nodesvg\r\n */\r\n makeNodeDraggable(nodeGroup: G, dragHandle: SvgPath, node: NodeSvg) {\r\n eventer.addElement(nodeGroup, 'k_draggable', {\r\n dragel: dragHandle,\r\n group: nodeGroup,\r\n node,\r\n type: 2\r\n }).tagElement(nodeGroup, [(this.constructor as typeof Renderer).ELEMENT_TAG, `node_${node.id}`]);\r\n }\r\n /** Create the field group for the node */\r\n createFieldGroup(state: DrawState) {\r\n const c = this.constants;\r\n const fieldsGroup = state.group!.group();\r\n fieldsGroup.attr({ transform: `translate(0, ${c.TOPBAR_HEIGHT + c.FIELD_SPACEY})` });\r\n state.fieldCol = fieldsGroup;\r\n }\r\n /**\r\n * Draw a field on a node.\r\n * @param field - The field to draw\r\n * @param measurements - The node's measurements\r\n * @param idx - Index of the field in the fieldColumn list\r\n * @param y - the y position of the field\r\n * @returns \r\n */\r\n drawFieldForNode(field: AnyField, measurements: NodeMeasurements, idx: number, y: number) {\r\n const node = this.node;\r\n const state = this.state;\r\n const c = this.constants;\r\n if (!node || !state || !state.fieldCol) return;\r\n const fieldsGroup = state.fieldCol;\r\n const nodeGroup = state.group as G;\r\n const fm = measurements?.fields[idx];\r\n if (!fm) return;\r\n\r\n // default left alignment\r\n let alignX = c.FIELD_MARGIN_X;\r\n\r\n const fieldGroup = fieldsGroup.group();\r\n fieldGroup.attr({ transform: `translate(${alignX}, ${y})` });\r\n field.svgGroup = fieldGroup;\r\n state.fieldPosY = y;\r\n\r\n // draw label first, get its used width\r\n const xUsed = this.drawFieldLabel(fieldGroup, field);\r\n if (field.isCustomEditor()) {\r\n // field fully owns drawing\r\n field.drawMyself({\r\n measuredWidth: fm.width,\r\n measuredHeight: fm.height,\r\n xUsed,\r\n fieldGroup,\r\n nodeGroup,\r\n svg: this.svg,\r\n background: state!.bg as unknown as Rect\r\n });\r\n } else {\r\n let rawData, cBubbleData = undefined;\r\n // if raw, draw right after label\r\n if (field.hasRaw()) {\r\n const { rawBox } = this.drawFieldRaw(fieldGroup, field, xUsed);\r\n rawData = rawBox;\r\n }\r\n if (field.hasConnectable() && (field as ConnectableField)!.connection) {\r\n const halfHeight = (fm.height + (field.hasRaw() ? 0 : c.FIELD_MARGIN_Y)) / 2;\r\n const absY = c.TOPBAR_HEIGHT + c.FIELD_SPACEY + y + halfHeight;\r\n\r\n\r\n const c3 = this.drawConnector(\r\n nodeGroup,\r\n state.bg as SvgPath,\r\n absY,\r\n 'right',\r\n parseColor(c.FIELD_CONN_COLOR)\r\n );\r\n if (c3) {\r\n const c = {\r\n from: (field as ConnectableField)!.connection as Connection,\r\n to: ((field as ConnectableField)!.connection.getTo() as NodeSvg)?.previousConnection as Connection,\r\n fromCircle: c3 as SvgPath,\r\n originCircle: c3 as SvgPath,\r\n originConn: (field as ConnectableField)!.connection as Connection\r\n };\r\n cBubbleData = {\r\n connector: c3,\r\n connState: c\r\n }\r\n this.setConnect(c);\r\n eventer.addElement(c3, 'k_connectbubble', {\r\n connection: (field as ConnectableField)!.connection as Connection,\r\n field\r\n }).tagElement(c3, [(this.constructor as typeof Renderer).ELEMENT_TAG, `node_${node.id}`]);\r\n }\r\n }\r\n field.onDraw(rawData, cBubbleData);\r\n }\r\n }\r\n /**\r\n * Draw all fields on a node\r\n * @param nodeMeasurements - The node's measurements\r\n * @returns The final Y position.\r\n */\r\n drawAllFieldsForNode(nodeMeasurements: NodeMeasurements | null = null) {\r\n const node = this.node;\r\n let y = 0;\r\n const state = this.state;\r\n const c = this.constants;\r\n if (!node || !state || !state.fieldCol) return;\r\n const fieldsGroup = state.fieldCol;\r\n const nodeGroup = state.group as G;\r\n\r\n const measurements = nodeMeasurements ?? this.measureNodeDimensions();\r\n\r\n node.allFields().forEach((field, idx) => {\r\n this.drawFieldForNode(field, measurements as NodeMeasurements, idx, y);\r\n const fm = measurements?.fields[idx];\r\n if (!fm) return;\r\n y += fm.height + c.FIELD_MARGIN_Y;\r\n });\r\n\r\n state.fieldPosY = y;\r\n return y;\r\n }\r\n /**\r\n * Draw the previous and next connections of a node.\r\n * @param state - The draw-state\r\n * @param node - The node-svg\r\n * @param nodeGroup - the node's group\r\n * @param measurements - the node's measurements\r\n * @returns Void\r\n */\r\n drawPreviousNextConnections(state: DrawState, node: NodeSvg, nodeGroup: G, measurements: { width: number, height: number } | null = null) {\r\n if (!state || !node) return;\r\n if (!state.bg) return;\r\n const c = this.constants;\r\n const colors: ColorStyle = this.getNodeColors();\r\n /**\r\n * Draw connectors.\r\n */\r\n const bbox = state.bg?.bbox();\r\n const cY = (bbox?.height ?? measurements?.height) - c.FOOTER_HEIGHT;\r\n\r\n // Previous connection (left)\r\n if (node.previousConnection) {\r\n const c1 = this.drawConnector(nodeGroup, state.bg, cY, 'left', parseColor(colors.primary) as string);\r\n if (c1) {\r\n const c = ({\r\n from: node.previousConnection,\r\n to: this.resolveConnectable(node.previousConnection.getFrom(), node.previousConnection) as Connection,\r\n fromCircle: c1 as SvgPath,\r\n originConn: node.previousConnection,\r\n originCircle: c1\r\n });\r\n this.setConnect(c);\r\n eventer.addElement(c1, 'k_connectbubble', {\r\n connection: node.previousConnection,\r\n node\r\n }).tagElement(c1, [(this.constructor as typeof Renderer).ELEMENT_TAG, `node_${node.id}`]);\r\n // fill any waiting connectors from other nodes\r\n this._fillOtherNodeConnectorCircle(node.previousConnection, c1 as SvgPath, true);\r\n }\r\n }\r\n\r\n // Next connection (right)\r\n if (node.nextConnection) {\r\n const c2 = this.drawConnector(nodeGroup, state.bg, cY, 'right', parseColor(colors.primary) as string);\r\n if (c2) {\r\n const c = ({\r\n from: node.nextConnection,\r\n to: this.resolveConnectable(node.nextConnection.getTo(), node.nextConnection) as Connection,\r\n fromCircle: c2 as SvgPath,\r\n originConn: node.nextConnection,\r\n originCircle: c2\r\n });\r\n this.setConnect(c);\r\n eventer.addElement(c2, 'k_connectbubble', {\r\n connection: node.nextConnection,\r\n node\r\n }).tagElement(c2, [(this.constructor as typeof Renderer).ELEMENT_TAG, `node_${node.id}`]);\r\n // fill any waiting connectors from other nodes\r\n this._fillOtherNodeConnectorCircle(node.nextConnection, c2 as SvgPath, false);\r\n }\r\n }\r\n }\r\n // REFRESHING TRANSFORMS AND COMMENTS -\r\n /**\r\n * Refreshes the comment transforms.\r\n * @returns Void.\r\n */\r\n refreshComments() {\r\n return this._commentDrawer?.refreshCommentTransforms?.();\r\n }\r\n /**\r\n * Clears all comments from the workspace.\r\n * @returns Void.\r\n */\r\n clearComments() {\r\n return this._commentDrawer?.clearAllComments?.();\r\n }\r\n /**\r\n * Draws all comments in the workspace.\r\n * @returns Void.\r\n */\r\n drawComments() {\r\n return this._commentDrawer?.drawAllComments?.();\r\n }\r\n /**\r\n * Gets the current zoom level of the workspace.\r\n * @returns The zoom level.\r\n */\r\n getZoom() {\r\n return this._ws.getZoom() ?? 1;\r\n }\r\n /**\r\n * Applies the current zoom level to the specified node group.\r\n * @param nodeG - The SVG group element of the node.\r\n * @param node - The node to apply zoom to.\r\n */\r\n applyZoomToNode(nodeG: G, node: NodeSvg) {\r\n const zoom = this.getZoom();\r\n const { x, y } = this._ws.workspaceToScreen(node.relativeCoords.x, node.relativeCoords.y);\r\n nodeG.attr({ transform: `translate(${x}, ${y}) scale(${zoom})` });\r\n }\r\n /**\r\n * Refreshes the transforms of all nodes in the workspace.\r\n * @returns Void.\r\n */\r\n refreshNodeTransforms() {\r\n const nodeGroups = this.svg.find(`.${(this.constructor as typeof Renderer).NODE_G_TAG}`);\r\n const zoom = this.getZoom();\r\n\r\n for (let nodeG of nodeGroups) {\r\n const node = this._ws.getNode(unescapeAttr(nodeG.attr('data-node-id')));\r\n if (!node) continue;\r\n const { x, y } = this._ws.workspaceToScreen(node.relativeCoords.x, node.relativeCoords.y);\r\n nodeG.attr({ transform: `translate(${x}, ${y}) scale(${zoom})` });\r\n }\r\n\r\n this.refreshConnectionLines();\r\n this.refreshComments();\r\n }\r\n\r\n /**\r\n * Refreshes all connection lines in the workspace.\r\n * @returns Void.\r\n */\r\n refreshConnectionLines() {\r\n this.clearLines();\r\n this.drawLinesForAllNodes();\r\n }\r\n /**\r\n * Gets the colors for the current node.\r\n * @returns The color style of the node.\r\n */\r\n getNodeColors(): ColorStyle {\r\n const node: NodeSvg = this.node as NodeSvg;\r\n const colors: ColorStyle = node.colors ?? {\r\n primary: '#000',\r\n secondary: '#000',\r\n tertirary: '#000',\r\n category: ''\r\n };\r\n return colors;\r\n }\r\n // CONNECTOR BUBBLE HANDLING + CONNECTION RESOLVING -\r\n /**\r\n * Fill every node's connector bubble data with the corresponding bubble its connected to on a sibling node.\r\n */\r\n fillAllNodeConnectorBubbles() {\r\n for (const state of this._drawStates) {\r\n for (const connPair of state.pendingConnections) {\r\n const { originConn } = connPair;\r\n if (!originConn) continue;\r\n\r\n // Only try to fill missing sides with real circles from other pending connections\r\n if (!connPair.fromCircle) {\r\n const match = this._drawStates\r\n .flatMap(s => s.pendingConnections)\r\n .find(p => p.originConn === connPair.from && p.originCircle);\r\n if (match) connPair.fromCircle = match.originCircle;\r\n }\r\n\r\n if (!connPair.toCircle) {\r\n const match = this._drawStates\r\n .flatMap(s => s.pendingConnections)\r\n .find(p => p.originConn === connPair.to && p.originCircle);\r\n if (match) connPair.toCircle = match.originCircle;\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * Resolves the connectable to the appropriate connection based on the originating connection.\r\n * @param connectable - The connectable entity (NodeSvg or Field).\r\n * @param fromConn - The originating connection.\r\n * @returns \r\n */\r\n resolveConnectable(connectable: Connectable, fromConn: Connection): Connection | null | undefined {\r\n if (!connectable || !fromConn) return undefined;\r\n\r\n // If the connection is an input (previous), return the connectable's output (next) connection\r\n if (fromConn.isPrevious) {\r\n\r\n if (connectable instanceof NodeSvg) return connectable.nextConnection;\r\n // @ts-ignore\r\n if (connectable instanceof Field) return connectable.connection;\r\n }\r\n\r\n // If the connection is an output (next), return the connectable's input (previous) connection\r\n if (!fromConn.isPrevious) {\r\n if (connectable instanceof NodeSvg) return connectable.previousConnection;\r\n // @ts-ignore\r\n if (connectable instanceof Field) return connectable.connection;\r\n }\r\n }\r\n /**\r\n * Fills in the connector circle for other nodes based on the given connection.\r\n * @param conn - The connection to match.\r\n * @param circle - The SVG path of the connector circle.\r\n * @param isPrevious - Whether the connection is a previous connection.\r\n */\r\n _fillOtherNodeConnectorCircle(conn: Connection, circle: SvgPath, isPrevious: boolean) {\r\n for (const state of this._drawStates) {\r\n for (const connPair of state.pendingConnections) {\r\n // Only fill if the connection actually matches\r\n if (isPrevious) {\r\n // fill toCircle if this connPair expects 'conn' as its 'to'\r\n if (connPair.to === conn && !connPair.toCircle) {\r\n connPair.toCircle = circle;\r\n }\r\n } else {\r\n // fill fromCircle if this connPair expects 'conn' as its 'from'\r\n if (connPair.from === conn && !connPair.fromCircle) {\r\n connPair.fromCircle = circle;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n // LINE DRAWING -\r\n /**\r\n * Draw the connection lines between node's connector bubbles.\r\n */\r\n drawLinesForAllNodes() {\r\n const c = this.constants;\r\n const wsSvg = this._ws.svg;\r\n\r\n this.fillAllNodeConnectorBubbles();\r\n const drawnCircles = new Set<SvgPath>(); // store circles we've already drawn lines from/to\r\n\r\n for (const state of this._drawStates) {\r\n for (const connPair of state.pendingConnections) {\r\n const { fromCircle, toCircle } = connPair;\r\n if (connPair.from !== connPair.originConn) continue;\r\n if (!fromCircle || !toCircle) continue;\r\n\r\n // skip if either circle was already used\r\n if (drawnCircles.has(fromCircle) || drawnCircles.has(toCircle)) continue;\r\n\r\n // mark circles as used\r\n drawnCircles.add(fromCircle);\r\n drawnCircles.add(toCircle);\r\n // Get DOM elements\r\n const fromEl = fromCircle.node as SVGPathElement;\r\n const toEl = toCircle.node as SVGPathElement;\r\n\r\n // Use getBBox + getScreenCTM for absolute coordinates\r\n const fromBBox = fromEl.getBBox();\r\n const toBBox = toEl.getBBox();\r\n\r\n const fromCTM = fromEl.getScreenCTM()!;\r\n const toCTM = toEl.getScreenCTM()!;\r\n\r\n const startX = fromBBox.x + fromBBox.width / 2;\r\n const startY = fromBBox.y + fromBBox.height / 2;\r\n const endX = toBBox.x + toBBox.width / 2;\r\n const endY = toBBox.y + toBBox.height / 2;\r\n\r\n // Transform to screen coordinates\r\n const absStartX = startX * fromCTM.a + startY * fromCTM.c + fromCTM.e;\r\n const absStartY = startX * fromCTM.b + startY * fromCTM.d + fromCTM.f;\r\n const absEndX = endX * toCTM.a + endY * toCTM.c + toCTM.e;\r\n const absEndY = endX * toCTM.b + endY * toCTM.d + toCTM.f;\r\n\r\n // Draw the line\r\n let pathStr: string;\r\n if (c.CONNECTOR_LINE_CURVED) {\r\n const dx = Math.abs(absEndX - absStartX);\r\n const cp1x = absStartX + Math.sign(absEndX - absStartX) * Math.max(30, dx * 0.3);\r\n const cp2x = absEndX - Math.sign(absEndX - absStartX) * Math.max(30, dx * 0.3);\r\n pathStr = `M ${absStartX} ${absStartY} C ${cp1x} ${absStartY}, ${cp2x} ${absEndY}, ${absEndX} ${absEndY}`;\r\n } else {\r\n pathStr = `M ${absStartX} ${absStartY} L ${absEndX} ${absEndY}`;\r\n }\r\n const zoom = this._ws.getZoom();\r\n const strokeWidth = c.CONNECTOR_LINE_WIDTH * zoom;\r\n const line = wsSvg.path(pathStr)\r\n .stroke({ color: parseColor(fromCircle.fill() as Color), width: strokeWidth })\r\n .fill('none')\r\n .attr({ class: (this.constructor as typeof Renderer).CONN_LINE_TAG });\r\n\r\n eventer.addElement(line, 'k_connline', {\r\n fromConn: connPair.from,\r\n toConn: connPair.to,\r\n renderer: this\r\n }).tagElement(line, [(this.constructor as typeof Renderer).ELEMENT_TAG, (this.constructor as typeof Renderer).LINE_X_MARK_TAG]);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Clear connection lines and their X marks.\r\n */\r\n clearLines() {\r\n for (let line of this.getWs().svg.find(`.${(this.constructor as typeof Renderer).CONN_LINE_TAG}`)) {\r\n line.remove();\r\n }\r\n for (let mark of this.getWs().svg.find(`.${(this.constructor as typeof Renderer).LINE_X_MARK_TAG}`)) {\r\n mark.remove();\r\n }\r\n }\r\n /**\r\n * Clear the entire screen.\r\n */\r\n clearScreen() {\r\n // Destroy elements that were tagged (eventer system)\r\n eventer.destroyByTag((this.constructor as typeof Renderer).ELEMENT_TAG);\r\n\r\n // Remove all SVG children **except the background pattern rect**\r\n this._ws.svg.children().forEach((el) => {\r\n const isBackground = el.hasClass((this.constructor as typeof Renderer).BACKGROUND_PATTERN);\r\n const isDefs = el.node.tagName == 'defs';\r\n const isBgRect = el.classes().includes(WorkspaceSvg.BACKGROUND_CLASS);\r\n if (!isBackground && !isDefs && !isBgRect) el.remove();\r\n });\r\n\r\n // Reset internal draw state\r\n this._drawStates = [];\r\n }\r\n /**\r\n * Remove pending connections for a specific connection\r\n * @param conn - The connection\r\n */\r\n undoPendingConnsFor(conn: ConnectorToFrom) {\r\n for (let state of this._drawStates) {\r\n for (let conn0 of state.pendingConnections) {\r\n if (conn0.toCircle == conn.originCircle) {\r\n delete conn0.toCircle;\r\n }\r\n if (conn0.fromCircle == conn.originCircle) {\r\n delete conn0.fromCircle;\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * Called whenever a node must be visually rendered or rerendered.\r\n * Implementations must be idempotent.\r\n * @param node - The node to render/rerender\r\n * @returns SVG group of the node.\r\n */\r\n rerenderNode(node: NodeSvg) {\r\n // wipe old drawstate + events for this node\r\n const idx = this._drawStates.findIndex(s => s.id === node.id);\r\n if (idx !== -1) {\r\n const state = this._drawStates[idx];\r\n for (let pendingConn of state!.pendingConnections) {\r\n this.undoPendingConnsFor(pendingConn);\r\n }\r\n state!.group?.remove();\r\n eventer.destroyByTag(`node_${node.id}`);\r\n this._drawStates.splice(idx, 1);\r\n }\r\n\r\n // rebuild node\r\n this.startNode(node);\r\n this.drawNode();\r\n this.representer.build(this.node as NodeSvg, this, this.state as DrawState);\r\n this.storeState();\r\n\r\n // refresh *all* lines once the node is back in place\r\n this.refreshNodeTransforms();\r\n return (node.svg as RepresenterNode).getRaw();\r\n }\r\n\r\n}\r\n\r\nexport default Renderer;\r\n","'use strict';\n\n\nvar paramCounts = { a: 7, c: 6, h: 1, l: 2, m: 2, r: 4, q: 4, s: 4, t: 2, v: 1, z: 0 };\n\nvar SPECIAL_SPACES = [\n 0x1680, 0x180E, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006,\n 0x2007, 0x2008, 0x2009, 0x200A, 0x202F, 0x205F, 0x3000, 0xFEFF\n];\n\nfunction isSpace(ch) {\n return (ch === 0x0A) || (ch === 0x0D) || (ch === 0x2028) || (ch === 0x2029) || // Line terminators\n // White spaces\n (ch === 0x20) || (ch === 0x09) || (ch === 0x0B) || (ch === 0x0C) || (ch === 0xA0) ||\n (ch >= 0x1680 && SPECIAL_SPACES.indexOf(ch) >= 0);\n}\n\nfunction isCommand(code) {\n /*eslint-disable no-bitwise*/\n switch (code | 0x20) {\n case 0x6D/* m */:\n case 0x7A/* z */:\n case 0x6C/* l */:\n case 0x68/* h */:\n case 0x76/* v */:\n case 0x63/* c */:\n case 0x73/* s */:\n case 0x71/* q */:\n case 0x74/* t */:\n case 0x61/* a */:\n case 0x72/* r */:\n return true;\n }\n return false;\n}\n\nfunction isArc(code) {\n return (code | 0x20) === 0x61;\n}\n\nfunction isDigit(code) {\n return (code >= 48 && code <= 57); // 0..9\n}\n\nfunction isDigitStart(code) {\n return (code >= 48 && code <= 57) || /* 0..9 */\n code === 0x2B || /* + */\n code === 0x2D || /* - */\n code === 0x2E; /* . */\n}\n\n\nfunction State(path) {\n this.index = 0;\n this.path = path;\n this.max = path.length;\n this.result = [];\n this.param = 0.0;\n this.err = '';\n this.segmentStart = 0;\n this.data = [];\n}\n\nfunction skipSpaces(state) {\n while (state.index < state.max && isSpace(state.path.charCodeAt(state.index))) {\n state.index++;\n }\n}\n\n\nfunction scanFlag(state) {\n var ch = state.path.charCodeAt(state.index);\n\n if (ch === 0x30/* 0 */) {\n state.param = 0;\n state.index++;\n return;\n }\n\n if (ch === 0x31/* 1 */) {\n state.param = 1;\n state.index++;\n return;\n }\n\n state.err = 'SvgPath: arc flag can be 0 or 1 only (at pos ' + state.index + ')';\n}\n\n\nfunction scanParam(state) {\n var start = state.index,\n index = start,\n max = state.max,\n zeroFirst = false,\n hasCeiling = false,\n hasDecimal = false,\n hasDot = false,\n ch;\n\n if (index >= max) {\n state.err = 'SvgPath: missed param (at pos ' + index + ')';\n return;\n }\n ch = state.path.charCodeAt(index);\n\n if (ch === 0x2B/* + */ || ch === 0x2D/* - */) {\n index++;\n ch = (index < max) ? state.path.charCodeAt(index) : 0;\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n //\n if (!isDigit(ch) && ch !== 0x2E/* . */) {\n state.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n return;\n }\n\n if (ch !== 0x2E/* . */) {\n zeroFirst = (ch === 0x30/* 0 */);\n index++;\n\n ch = (index < max) ? state.path.charCodeAt(index) : 0;\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n state.err = 'SvgPath: numbers started with `0` such as `09` are illegal (at pos ' + start + ')';\n return;\n }\n }\n\n while (index < max && isDigit(state.path.charCodeAt(index))) {\n index++;\n hasCeiling = true;\n }\n ch = (index < max) ? state.path.charCodeAt(index) : 0;\n }\n\n if (ch === 0x2E/* . */) {\n hasDot = true;\n index++;\n while (isDigit(state.path.charCodeAt(index))) {\n index++;\n hasDecimal = true;\n }\n ch = (index < max) ? state.path.charCodeAt(index) : 0;\n }\n\n if (ch === 0x65/* e */ || ch === 0x45/* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n state.err = 'SvgPath: invalid float exponent (at pos ' + index + ')';\n return;\n }\n\n index++;\n\n ch = (index < max) ? state.path.charCodeAt(index) : 0;\n if (ch === 0x2B/* + */ || ch === 0x2D/* - */) {\n index++;\n }\n if (index < max && isDigit(state.path.charCodeAt(index))) {\n while (index < max && isDigit(state.path.charCodeAt(index))) {\n index++;\n }\n } else {\n state.err = 'SvgPath: invalid float exponent (at pos ' + index + ')';\n return;\n }\n }\n\n state.index = index;\n state.param = parseFloat(state.path.slice(start, index)) + 0.0;\n}\n\n\nfunction finalizeSegment(state) {\n var cmd, cmdLC;\n\n // Process duplicated commands (without comand name)\n\n // This logic is shamelessly borrowed from Raphael\n // https://github.com/DmitryBaranovskiy/raphael/\n //\n cmd = state.path[state.segmentStart];\n cmdLC = cmd.toLowerCase();\n\n var params = state.data;\n\n if (cmdLC === 'm' && params.length > 2) {\n state.result.push([ cmd, params[0], params[1] ]);\n params = params.slice(2);\n cmdLC = 'l';\n cmd = (cmd === 'm') ? 'l' : 'L';\n }\n\n if (cmdLC === 'r') {\n state.result.push([ cmd ].concat(params));\n } else {\n\n while (params.length >= paramCounts[cmdLC]) {\n state.result.push([ cmd ].concat(params.splice(0, paramCounts[cmdLC])));\n if (!paramCounts[cmdLC]) {\n break;\n }\n }\n }\n}\n\n\nfunction scanSegment(state) {\n var max = state.max,\n cmdCode, is_arc, comma_found, need_params, i;\n\n state.segmentStart = state.index;\n cmdCode = state.path.charCodeAt(state.index);\n is_arc = isArc(cmdCode);\n\n if (!isCommand(cmdCode)) {\n state.err = 'SvgPath: bad command ' + state.path[state.index] + ' (at pos ' + state.index + ')';\n return;\n }\n\n need_params = paramCounts[state.path[state.index].toLowerCase()];\n\n state.index++;\n skipSpaces(state);\n\n state.data = [];\n\n if (!need_params) {\n // Z\n finalizeSegment(state);\n return;\n }\n\n comma_found = false;\n\n for (;;) {\n for (i = need_params; i > 0; i--) {\n if (is_arc && (i === 3 || i === 4)) scanFlag(state);\n else scanParam(state);\n\n if (state.err.length) {\n finalizeSegment(state);\n return;\n }\n state.data.push(state.param);\n\n skipSpaces(state);\n comma_found = false;\n\n if (state.index < max && state.path.charCodeAt(state.index) === 0x2C/* , */) {\n state.index++;\n skipSpaces(state);\n comma_found = true;\n }\n }\n\n // after ',' param is mandatory\n if (comma_found) {\n continue;\n }\n\n if (state.index >= state.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(state.path.charCodeAt(state.index))) {\n break;\n }\n }\n\n finalizeSegment(state);\n}\n\n\n/* Returns array of segments:\n *\n * [\n * [ command, coord1, coord2, ... ]\n * ]\n */\nmodule.exports = function pathParse(svgPath) {\n var state = new State(svgPath);\n var max = state.max;\n\n skipSpaces(state);\n\n while (state.index < max && !state.err.length) {\n scanSegment(state);\n }\n\n if (state.result.length) {\n if ('mM'.indexOf(state.result[0][0]) < 0) {\n state.err = 'SvgPath: string should start with `M` or `m`';\n state.result = [];\n } else {\n state.result[0][0] = 'M';\n }\n }\n\n return {\n err: state.err,\n segments: state.result\n };\n};\n","import KabelWSTheme from './default';\r\nimport KabelDarkTheme from './dark';\r\n\r\nconst Themes = {\r\n Classic: KabelWSTheme,\r\n Dark: KabelDarkTheme\r\n}\r\n\r\nexport default Themes;","/**\r\n * Converts HTML-escaped characters in a string back to their literal form.\r\n *\r\n * Specifically, it replaces:\r\n * - `&lt;` with `<`\r\n * - `&gt;` with `>`\r\n * - `&quot;` with `\"`\r\n * - `&apos;` with `'`\r\n * - `&amp;` with `&`\r\n *\r\n * @param {string} s - The string containing HTML-escaped characters.\r\n * @returns {string} The unescaped string with HTML entities replaced by their literal characters.\r\n */\r\nfunction unescapeAttr(s: string): string {\r\n\treturn s.replace(/&lt;/g, \"<\")\r\n\t\t\t.replace(/&gt;/g, \">\")\r\n\t\t\t.replace(/&quot;/g, '\"')\r\n\t\t\t.replace(/&apos;/g, \"'\")\r\n\t\t\t.replace(/&amp;/g, \"&\");\r\n}\r\n\r\nexport default unescapeAttr;\r\n","import WorkspaceSvg from \"./workspace-svg\";\r\nimport Coordinates from \"./coordinates\";\r\nimport { generateUID } from \"../util/uid\";\r\nimport Workspace from \"./workspace\";\r\n\r\nexport interface WidgetOptions {\r\n /**\r\n * Widget class to instantiate for the widget, by default it uses Kabel's\r\n */\r\n cls?: typeof Widget;\r\n /**\r\n * Coordinates to spawn the widget at.\r\n */\r\n coords?: Coordinates; // where to position the widget\r\n /**\r\n * Width of the widget\r\n */\r\n width?: number; // optional width\r\n /**\r\n * Height of the widget.\r\n */\r\n height?: number; // optional height\r\n /**\r\n * Class to give the widget's html container.\r\n */\r\n className?: string; // optional CSS class\r\n /**\r\n * Widget inner HTML default content.\r\n */\r\n html?: string; // inner HTML\r\n /**\r\n * Widget name\r\n */\r\n name: string;\r\n /**\r\n * Sets up a new widget of this type\r\n * @param this - This context of the function points to widget.\r\n * @param widget - The widget this function is called on.\r\n * @param html - The html container of the widget.\r\n * @returns - Void.\r\n */\r\n init?: (this: WidgetOptions, widget: Widget, html: HTMLElement) => void;\r\n}\r\nclass Widget {\r\n workspace: WorkspaceSvg|Workspace;\r\n container: HTMLDivElement;\r\n coords: Coordinates;\r\n width: number;\r\n height: number;\r\n visible: boolean;\r\n name: string;\r\n id: string;\r\n options: WidgetOptions;\r\n static WIDGET_GLOBAL_ID = 0;\r\n constructor(workspace: WorkspaceSvg|Workspace, options: WidgetOptions = { name: `Untitled(${Widget.WIDGET_GLOBAL_ID++})` }) {\r\n this.workspace = workspace;\r\n this.coords = options.coords ?? new Coordinates(0, 0);\r\n this.width = options.width ?? 200;\r\n this.height = options.height ?? 100;\r\n this.visible = false;\r\n this.name = options.name;\r\n this.id = generateUID('nanoid', { alphabet: 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0129384756!)@(#*$&%^' });\r\n this.options = options;\r\n this.container = document.createElement(\"div\");\r\n this.container.className = options.className ?? \"KabelWidget\";\r\n this.container.style.position = \"absolute\";\r\n this.container.style.left = `${this.coords.x}px`;\r\n this.container.style.top = `${this.coords.y}px`;\r\n this.container.style.width = `${this.width}px`;\r\n this.container.style.height = `${this.height}px`;\r\n this.container.style.background = \"rgba(255,255,255,0.9)\";\r\n this.container.style.border = \"1px solid #aaa\";\r\n this.container.style.borderRadius = \"4px\";\r\n this.container.style.boxShadow = \"0 2px 6px rgba(0,0,0,0.2)\";\r\n this.container.style.pointerEvents = \"auto\";\r\n this.container.style.zIndex = \"1000\"; // overlays nodes\r\n\r\n if (options.html) this.container.innerHTML = options.html;\r\n\r\n if (!this.workspace.isHeadless) (this.workspace as WorkspaceSvg)._wsTop.appendChild(this.container);\r\n this.hide();\r\n if (typeof options.init !== 'undefined' && options.init) {\r\n options.init(this, this.container);\r\n }\r\n }\r\n\r\n // Show the widget\r\n show() {\r\n this.container.style.display = \"block\";\r\n this.visible = true;\r\n }\r\n\r\n // Hide the widget\r\n hide() {\r\n this.container.style.display = \"none\";\r\n this.visible = false;\r\n }\r\n\r\n // Move the widget to new coords\r\n setCoords(coords: Coordinates) {\r\n this.coords = coords;\r\n this.container.style.left = `${coords.x}px`;\r\n this.container.style.top = `${coords.y}px`;\r\n }\r\n\r\n // Update the HTML content\r\n setHTML(html: string) {\r\n this.container.innerHTML = html;\r\n }\r\n // Bring widget back from the dead after a .destroy call\r\n reanimate() {\r\n this.container = document.createElement(\"div\");\r\n this.container.className = this.options.className ?? \"KabelWidget\";\r\n this.container.style.position = \"absolute\";\r\n this.container.style.left = `${this.coords.x}px`;\r\n this.container.style.top = `${this.coords.y}px`;\r\n this.container.style.width = `${this.width}px`;\r\n this.container.style.height = `${this.height}px`;\r\n this.container.style.background = \"rgba(255,255,255,0.9)\";\r\n this.container.style.border = \"1px solid #aaa\";\r\n this.container.style.borderRadius = \"4px\";\r\n this.container.style.boxShadow = \"0 2px 6px rgba(0,0,0,0.2)\";\r\n this.container.style.pointerEvents = \"auto\";\r\n this.container.style.zIndex = \"1000\"; // overlays nodes\r\n \r\n if (this.options.html) this.container.innerHTML = this.options.html;\r\n if (this.workspace.isHeadless) return;\r\n\r\n (this.workspace as WorkspaceSvg)._wsTop.appendChild(this.container);\r\n this.workspace._addWidgetToDB(this);\r\n }\r\n // Destroy widget & cleanup.\r\n destroy() {\r\n this.container.remove();\r\n this.workspace._delWidgetFromDB(this);\r\n }\r\n}\r\n\r\nexport default Widget;\r\n","import WorkspaceSvg from \"./workspace-svg\";\r\n\r\ninterface HistoryEntry {\r\n\tstate: any; // serialized workspace or diff\r\n}\r\n\r\nexport default class UndoRedoHistory {\r\n\tprivate ws: WorkspaceSvg;\r\n\tprivate undoStack: HistoryEntry[] = [];\r\n\tprivate redoStack: HistoryEntry[] = [];\r\n\tprivate isRecording: boolean = true;\r\n\r\n\tconstructor(ws: WorkspaceSvg) {\r\n\t\tthis.ws = ws;\r\n\t}\r\n\r\n\temitChange() {\r\n\t\tif (!this.isRecording) return;\r\n\t\tif (!this.ws.recordHistory) return;\r\n\r\n\t\tconst state = this.ws.toJson ? this.ws.toJson(true) : {};\r\n\t\tthis.undoStack.push({ state });\r\n\t\tthis.redoStack.length = 0;\r\n\r\n\t\t//console.log(\"[emitChange] pushed state. undoStack size:\", this.undoStack.length, \"redoStack cleared\");\r\n\t}\r\n\r\n\tundo() {\r\n\t\t//console.log(\"[undo] called. undoStack size:\", this.undoStack.length, \"redoStack size:\", this.redoStack.length);\r\n\r\n\t\tif (this.undoStack.length <= 1) {\r\n\t\t\t//console.log(\"[undo] nothing to undo.\");\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst current = this.undoStack.pop();\r\n\t\t//console.log(\"[undo] popped current state:\", current);\r\n\r\n\t\tconst prev = this.undoStack[this.undoStack.length - 1];\r\n\t\t//console.log(\"[undo] previous state to restore:\", prev);\r\n\r\n\t\tif (!prev) {\r\n\t\t\t//console.log(\"[undo] no previous state found.\");\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.isRecording = false;\r\n\t\tthis.ws.fromJson?.(prev.state);\r\n\t\tthis.isRecording = true;\r\n\r\n\t\tthis.redoStack.push(current as HistoryEntry);\r\n\t\t//console.log(\"[undo] state restored. undoStack size now:\", this.undoStack.length, \"redoStack size now:\", this.redoStack.length);\r\n\t}\r\n\r\n\tredo() {\r\n\t\t//console.log(\"[redo] called. undoStack size:\", this.undoStack.length, \"redoStack size:\", this.redoStack.length);\r\n\r\n\t\tconst entry = this.redoStack.pop();\r\n\t\tif (!entry) {\r\n\t\t\t//console.log(\"[redo] nothing to redo.\");\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t//console.log(\"[redo] popping state from redoStack:\", entry);\r\n\r\n\t\tthis.isRecording = false;\r\n\t\tthis.ws.fromJson?.(entry.state);\r\n\t\tthis.isRecording = true;\r\n\r\n\t\tthis.undoStack.push(entry);\r\n\t\t//console.log(\"[redo] state restored. undoStack size now:\", this.undoStack.length, \"redoStack size now:\", this.redoStack.length);\r\n\t}\r\n\r\n\tclear() {\r\n\t\tthis.undoStack = [];\r\n\t\tthis.redoStack = [];\r\n\t\t//console.log(\"[clear] undo and redo stacks cleared\");\r\n\t}\r\n\r\n\tcanUndo() {\r\n\t\treturn this.undoStack.length > 1;\r\n\t}\r\n\r\n\tcanRedo() {\r\n\t\treturn this.redoStack.length > 0;\r\n\t}\r\n}\r\n","import { InjectMsg } from \"./inject\";\r\nimport { setMainWorkspace } from \"./main-workspace\";\r\nimport Workspace from \"./workspace\";\r\n\r\n\r\n\r\n\r\nfunction injectHeadless() : Workspace | undefined {\r\n try {\r\n const ws = new Workspace();\r\n setMainWorkspace(ws);\r\n return ws;\r\n } catch (e) {\r\n new InjectMsg(`Failed to initialize workspace: ${(e as Error).message}`).err();\r\n }\r\n}\r\n\r\nexport default injectHeadless;","'use strict';\n\n/* eslint-disable space-infix-ops */\n\n// The precision used to consider an ellipse as a circle\n//\nvar epsilon = 0.0000000001;\n\n// To convert degree in radians\n//\nvar torad = Math.PI / 180;\n\n// Class constructor :\n// an ellipse centred at 0 with radii rx,ry and x - axis - angle ax.\n//\nfunction Ellipse(rx, ry, ax) {\n if (!(this instanceof Ellipse)) { return new Ellipse(rx, ry, ax); }\n this.rx = rx;\n this.ry = ry;\n this.ax = ax;\n}\n\n// Apply a linear transform m to the ellipse\n// m is an array representing a matrix :\n// - -\n// | m[0] m[2] |\n// | m[1] m[3] |\n// - -\n//\nEllipse.prototype.transform = function (m) {\n // We consider the current ellipse as image of the unit circle\n // by first scale(rx,ry) and then rotate(ax) ...\n // So we apply ma = m x rotate(ax) x scale(rx,ry) to the unit circle.\n var c = Math.cos(this.ax * torad), s = Math.sin(this.ax * torad);\n var ma = [\n this.rx * (m[0]*c + m[2]*s),\n this.rx * (m[1]*c + m[3]*s),\n this.ry * (-m[0]*s + m[2]*c),\n this.ry * (-m[1]*s + m[3]*c)\n ];\n\n // ma * transpose(ma) = [ J L ]\n // [ L K ]\n // L is calculated later (if the image is not a circle)\n var J = ma[0]*ma[0] + ma[2]*ma[2],\n K = ma[1]*ma[1] + ma[3]*ma[3];\n\n // the discriminant of the characteristic polynomial of ma * transpose(ma)\n var D = ((ma[0]-ma[3])*(ma[0]-ma[3]) + (ma[2]+ma[1])*(ma[2]+ma[1])) *\n ((ma[0]+ma[3])*(ma[0]+ma[3]) + (ma[2]-ma[1])*(ma[2]-ma[1]));\n\n // the \"mean eigenvalue\"\n var JK = (J + K) / 2;\n\n // check if the image is (almost) a circle\n if (D < epsilon * JK) {\n // if it is\n this.rx = this.ry = Math.sqrt(JK);\n this.ax = 0;\n return this;\n }\n\n // if it is not a circle\n var L = ma[0]*ma[1] + ma[2]*ma[3];\n\n D = Math.sqrt(D);\n\n // {l1,l2} = the two eigen values of ma * transpose(ma)\n var l1 = JK + D/2,\n l2 = JK - D/2;\n // the x - axis - rotation angle is the argument of the l1 - eigenvector\n /*eslint-disable indent*/\n this.ax = (Math.abs(L) < epsilon && Math.abs(l1 - K) < epsilon) ?\n 90\n :\n Math.atan(Math.abs(L) > Math.abs(l1 - K) ?\n (l1 - J) / L\n :\n L / (l1 - K)\n ) * 180 / Math.PI;\n /*eslint-enable indent*/\n\n // if ax > 0 => rx = sqrt(l1), ry = sqrt(l2), else exchange axes and ax += 90\n if (this.ax >= 0) {\n // if ax in [0,90]\n this.rx = Math.sqrt(l1);\n this.ry = Math.sqrt(l2);\n } else {\n // if ax in ]-90,0[ => exchange axes\n this.ax += 90;\n this.rx = Math.sqrt(l2);\n this.ry = Math.sqrt(l1);\n }\n\n return this;\n};\n\n// Check if the ellipse is (almost) degenerate, i.e. rx = 0 or ry = 0\n//\nEllipse.prototype.isDegenerate = function () {\n return (this.rx < epsilon * this.ry || this.ry < epsilon * this.rx);\n};\n\nmodule.exports = Ellipse;\n","import Coordinates from \"./coordinates\";\r\n\r\n\r\n\r\n/**\r\n * A class that represents Workspace Camera Coords.\r\n * May be used in the future, right now its a no-op Coords wrapper.\r\n */\r\nclass WorkspaceCoords extends Coordinates {\r\n constructor(x = 0, y = 0) {\r\n super(x, y);\r\n }\r\n}\r\nexport default WorkspaceCoords;","import Coordinates from \"./coordinates\";\r\nimport NodeSvg from \"./nodesvg\";\r\nimport { Svg, SVG, Pattern, Rect } from '@svgdotjs/svg.js';\r\nimport Renderer from '../renderers/renderer';\r\nimport { InjectOptions } from \"./inject\";\r\nimport WorkspaceCoords from \"./workspace-coords\";\r\nimport WorkspaceController from '../controllers/base';\r\nimport WASDController from '../controllers/wasd';\r\nimport { RMap } from \"./renderer-map\";\r\nimport Toolbox from \"./toolbox\";\r\nimport NodePrototypes from \"./prototypes\";\r\nimport newHeadlessNode from \"./headless-node\";\r\nimport Widget from \"./widget\";\r\nimport WidgetPrototypes from \"./widget-prototypes\";\r\nimport ContextMenuHTML from \"./context-menu\";\r\nimport CommentModel from \"./comment\";\r\nimport Field, { ConnectableField } from \"./field\";\r\nimport waitFrames from \"../util/wait-anim-frames\";\r\nimport { addWindowListener } from \"../util/window-listeners\";\r\nimport Grid from \"./grid\";\r\nimport UndoRedoHistory from \"./undo-redo\";\r\nimport hasProp from \"../util/has-prop\";\r\nimport Workspace from \"./workspace\";\r\nimport Themes from '../themes/themes';\r\nimport { Color } from \"./visual-types\";\r\nimport { parseColor } from \"../util/parse-color\";\r\n\r\nexport interface IDragState {\r\n isDragging: boolean;\r\n startX: number;\r\n startY: number;\r\n lastX: number;\r\n lastY: number;\r\n deltaX: number;\r\n deltaY: number;\r\n offsetX: number;\r\n offsetY: number;\r\n node: NodeSvg | null;\r\n}\r\n\r\nfunction resolveController(options: InjectOptions): typeof WorkspaceController {\r\n if (options?.controls) {\r\n if (options?.controls.wasd) {\r\n return WASDController;\r\n }\r\n }\r\n return WorkspaceController;\r\n}\r\n\r\nexport interface WSTheme {\r\n UIStyles?: {\r\n workspaceBGColor?: Color;\r\n toolboxCategoriesBG?: Partial<CSSStyleDeclaration>;\r\n toolboxFlyoutBG?: Partial<CSSStyleDeclaration>;\r\n }\r\n}\r\ntype ThemeKeys = keyof typeof Themes; // \"Classic\" | \"Dark\"\r\n/** \r\n * Represents the visual workspace containing nodes and connections.\r\n * Handles rendering, panning, and coordinate transformations.\r\n */\r\nclass WorkspaceSvg extends Workspace {\r\n static get BACKGROUND_CLASS() {\r\n return 'WorkspaceBackgroundRect';\r\n }\r\n /**\r\n * Theme of the workspace\r\n */\r\n theme!: WSTheme;\r\n /**\r\n * Workspace background pattern items.\r\n */\r\n grid?: Grid;\r\n /** Top-left offset of the workspace viewport */\r\n _camera: WorkspaceCoords;\r\n\r\n /** Node storage by unique ID */\r\n _nodeDB: Map<string, NodeSvg>;\r\n\r\n /** Root HTML container for the workspace */\r\n _root: HTMLElement;\r\n\r\n /** Top-level wrapper for the SVG */\r\n _wsTop: HTMLElement;\r\n\r\n /** SVG.js instance for rendering */\r\n svg: Svg;\r\n /** The background element */\r\n _backgroundRect!: Rect;\r\n /** Renderer instance for drawing nodes and connections */\r\n renderer: Renderer;\r\n\r\n /** Options for workspace behavior and rendering overrides */\r\n options: InjectOptions;\r\n\r\n /** Flag to temporarily prevent redraws */\r\n noRedraw: boolean;\r\n /**\r\n * A class instance that moves the camera based on user interactions.\r\n */\r\n controller: WorkspaceController;\r\n /**\r\n * Toolbox for the workspace.\r\n */\r\n toolbox?: Toolbox;\r\n /**\r\n * A list of widgets active in this workspace\r\n */\r\n _widgetDB: Map<string, Widget>\r\n\r\n /**\r\n * A manager for the context menu widget\r\n */\r\n _ctxMenu: ContextMenuHTML\r\n /**\r\n * A list of comments for this workspace.\r\n */\r\n _commentDB: Set<CommentModel>;\r\n /**\r\n * Undo/redo history\r\n */\r\n history: UndoRedoHistory;\r\n /**\r\n * Whether to record undo/redo history or not\r\n */\r\n recordHistory: boolean = true;\r\n /**\r\n * Stack of old recordHistory values for toggleHistory\r\n */\r\n recordHistoryRecord: boolean[];\r\n /**\r\n * Internal flag to indicate if the camera has moved this frame.\r\n */\r\n _didMove: boolean = false;\r\n /**\r\n * Listeners to call when the workspace moves.\r\n */\r\n moveListeners: (() => void)[];\r\n /** Current drag state for node dragging */\r\n dragState: IDragState | null = null;\r\n /**\r\n * Creates a new WorkspaceSvg instance.\r\n * @param root - The root HTML element containing the workspace.\r\n * @param wsTop - The top-level wrapper element for the SVG.\r\n * @param options - Configuration and renderer override options.\r\n */\r\n constructor(root: HTMLElement, wsTop: HTMLElement, options: InjectOptions) {\r\n super();\r\n this.isHeadless = false;\r\n wsTop.style.width = '100%';\r\n wsTop.style.height = '100%';\r\n\r\n this._root = root;\r\n this._wsTop = wsTop;\r\n this.svg = SVG().addTo(this._wsTop).size('100%', '100%');\r\n this.options = options;\r\n let RClass: typeof Renderer = RMap.resolve(options.renderer);\r\n this.renderer = new RClass(this, this.options.rendererOverrides || {});\r\n\r\n const themeKey = (typeof options.theme === 'string' && options.theme in Themes)\r\n ? options.theme as ThemeKeys\r\n : 'Classic';\r\n\r\n const theme = (typeof options.theme === 'object' && options.theme)\r\n ? options.theme\r\n : Themes[themeKey];\r\n\r\n if (this.options.toolbox) {\r\n this.toolbox = new Toolbox(this);\r\n }\r\n\r\n this._camera = new WorkspaceCoords(0, 0);\r\n this._nodeDB = new Map();\r\n this.noRedraw = false;\r\n this.controller = new (options.Controller ?? resolveController(options))(this);\r\n this._widgetDB = new Map();\r\n this._ctxMenu = new ContextMenuHTML(this);\r\n this._commentDB = new Set();\r\n this.history = new UndoRedoHistory(this);\r\n this.recordHistoryRecord = [];\r\n this.moveListeners = [];\r\n if (options.initUndoRedo !== false) {\r\n this.history.emitChange();\r\n }\r\n this.theme = {}; //placeholder\r\n this._initBackground();\r\n\r\n this.setTheme(theme); // set theme to user-defined theme.\r\n }\r\n setTheme(theme: WSTheme) {\r\n try {\r\n this.theme = structuredClone(theme);\r\n } catch {\r\n this.theme = Object.assign({}, theme);\r\n }\r\n // Clone theme so you can mutate ws.theme seperate from Kabels.Themes[ThemeName]\r\n if (this.toolbox) this.toolbox.updateStyles(this.theme);\r\n if (this.theme.UIStyles) {\r\n this._backgroundRect.fill(parseColor(this.theme.UIStyles.workspaceBGColor || '#fffffff'))\r\n }\r\n }\r\n /**\r\n * Getter and setter for whether we moved or not this frame.\r\n */\r\n get didMove() { return this._didMove; }\r\n set didMove(value: boolean) {\r\n this._didMove = value;\r\n if (value) {\r\n waitFrames(1, () => { this._didMove = false; });\r\n }\r\n }\r\n /**\r\n * Sets the drag state of the workspace.\r\n * @param params - Drag state parameters.\r\n * @returns Void.\r\n */\r\n setDragState(params: {\r\n node: NodeSvg | null;\r\n startX: number;\r\n startY: number;\r\n currentX: number;\r\n currentY: number;\r\n offsetX?: number;\r\n offsetY?: number;\r\n }) {\r\n if (!params.node) {\r\n this.dragState = null;\r\n return;\r\n }\r\n\r\n const {\r\n node,\r\n startX,\r\n startY,\r\n currentX,\r\n currentY,\r\n offsetX = 0,\r\n offsetY = 0\r\n } = params;\r\n\r\n this.dragState = {\r\n isDragging: true,\r\n node,\r\n startX,\r\n startY,\r\n offsetX,\r\n offsetY,\r\n lastX: currentX,\r\n lastY: currentY,\r\n deltaX: currentX - startX,\r\n deltaY: currentY - startY\r\n };\r\n }\r\n beginDrag(node: NodeSvg, startX: number, startY: number, offsetX: number = 0, offsetY: number = 0) {\r\n this.dragState = {\r\n isDragging: true,\r\n node,\r\n startX,\r\n startY,\r\n offsetX,\r\n offsetY,\r\n lastX: startX,\r\n lastY: startY,\r\n deltaX: 0,\r\n deltaY: 0\r\n };\r\n }\r\n /**\r\n * Updates the current drag position.\r\n * @param currentX - Current X position.\r\n * @param currentY - Current Y position.\r\n * @returns Void.\r\n */\r\n updateDrag(currentX: number, currentY: number) {\r\n if (!this.dragState || !this.dragState.node) return;\r\n\r\n this.dragState.lastX = currentX;\r\n this.dragState.lastY = currentY;\r\n this.dragState.deltaX = currentX - this.dragState.startX;\r\n this.dragState.deltaY = currentY - this.dragState.startY;\r\n }\r\n endDrag() {\r\n // Set drag state.isDragging to false instead of clearing.\r\n if (this.dragState) this.dragState.isDragging = false;\r\n }\r\n\r\n\r\n /**\r\n * Fires all move listeners registered to this workspace.\r\n */\r\n fireMoveListeners() {\r\n this.moveListeners.forEach(e => e());\r\n }\r\n /**\r\n * Adds a move listener to the workspace.\r\n * @param listener - The listener function to add.\r\n * @returns A function to remove the added listener.\r\n */\r\n addMoveListener(listener: () => void): () => void {\r\n this.moveListeners.push(listener);\r\n return () => {\r\n this.removeMoveListener(listener);\r\n }\r\n }\r\n /**\r\n * Removes a move listener from the workspace.\r\n * @param listener - The listener function to remove.\r\n */\r\n removeMoveListener(listener: () => void) {\r\n this.moveListeners = this.moveListeners.filter(e => e != listener);\r\n }\r\n /**\r\n * Emits a change event for the workspace, triggering\r\n * undo/redo history tracking.\r\n */\r\n emitChange() {\r\n this.history.emitChange();\r\n }\r\n\r\n /**\r\n * Temporarily sets the workspace's history recording state.\r\n * Pushes the previous state onto a stack for later restoration.\r\n * \r\n * @param {boolean} value - Whether history recording should be enabled.\r\n */\r\n toggleHistory(value: boolean) {\r\n this.recordHistoryRecord.push(this.recordHistory);\r\n this.recordHistory = value;\r\n }\r\n\r\n /**\r\n * Restores the previous history recording state from the stack.\r\n * Use after a temporary toggle to revert to the previous state.\r\n */\r\n untoggleHistory() {\r\n if (this.recordHistoryRecord.length == 0 || this.recordHistoryRecord.length < 0) return;\r\n this.recordHistory = this.recordHistoryRecord.pop() as boolean;\r\n }\r\n\r\n /**\r\n * Sets the background grid up based on user selected options.\r\n */\r\n _initBackground() {\r\n try {\r\n this._backgroundRect = this.svg.rect(this.svg.width(), this.svg.height())\r\n .fill(parseColor(this.theme.UIStyles?.workspaceBGColor || '#ffffff'))\r\n .addClass(WorkspaceSvg.BACKGROUND_CLASS)\r\n .addTo(this.svg);\r\n\r\n // ensure it has a parent\r\n this.svg.add(this._backgroundRect);\r\n\r\n // now you can safely move it to the back\r\n this._backgroundRect.back();\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n if (this.options.grid) {\r\n this.grid = new Grid(this, this.svg, this.options.grid);\r\n }\r\n }\r\n /**\r\n * Updates the transform of the background grid\r\n */\r\n _updateBackgroundTransform() {\r\n this.grid?.updateTransform?.();\r\n try {\r\n this._backgroundRect.back();\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n }\r\n\r\n /**\r\n * Get the current zoom factor of the workspace.\r\n * @returns - The zoom factor\r\n */\r\n getZoom() {\r\n return this.controller.getZoom();\r\n }\r\n /**\r\n * Refresh comments.\r\n */\r\n refreshComments() {\r\n this.renderer.refreshComments();\r\n }\r\n /**\r\n * Get all comments\r\n * @returns {CommentModel[]}\r\n */\r\n getComments() {\r\n return Array.from(this._commentDB);\r\n }\r\n /**\r\n * Duplicate node data from one to another\r\n * @param nodeSvg - The node\r\n */\r\n cloneNode(nodeSvg: NodeSvg) {\r\n const n = new NodeSvg(nodeSvg.prototype, this);\r\n n.init();\r\n n.fromNode(nodeSvg);\r\n this.redraw();\r\n }\r\n /**\r\n * Internal: Add widget to DB\r\n * @param wdgt - The widget\r\n */\r\n _addWidgetToDB(wdgt: Widget) {\r\n this._widgetDB.set(wdgt.id, wdgt);\r\n }\r\n /**\r\n * Internal: Delete a widget from DB.\r\n * @param wdgt - Widget to delete\r\n */\r\n _delWidgetFromDB(wdgt: Widget) {\r\n this._widgetDB.delete(wdgt.id);\r\n }\r\n /**\r\n * Create a new widget of type.\r\n * @param type - The prototype\r\n * @returns {Widget|void}\r\n */\r\n newWidget(type: string): void | Widget {\r\n const opts = WidgetPrototypes[type];\r\n if (!opts) return;\r\n if (opts.cls) {\r\n const wdgt = new (opts.cls)(this, opts);\r\n this._addWidgetToDB(wdgt);\r\n return wdgt;\r\n }\r\n const wdgt = new Widget(this, opts);\r\n this._addWidgetToDB(wdgt);\r\n return wdgt;\r\n }\r\n /**\r\n * Get a widget\r\n * @param id - Identifier\r\n * @returns {Widget|undefined} - A widget\r\n */\r\n getWidget(id: string): Widget | undefined {\r\n if (this._widgetDB.has(id)) return this._widgetDB.get(id);\r\n return undefined;\r\n }\r\n /**\r\n * Returns the current width and height of the workspace's svg content size in pixels.\r\n * Useful for camera positioning.\r\n */\r\n getContentSize(): { width: number; height: number } {\r\n const bbox = this.svg.bbox();\r\n return { width: bbox.width, height: bbox.height };\r\n }\r\n /**\r\n * Returns the current width and height of the workspace in pixels.\r\n * Useful for camera centering, zoom calculations, and viewport sizing.\r\n */\r\n getSize(): { width: number; height: number } {\r\n const rect = this._wsTop.getBoundingClientRect();\r\n return { width: rect.width, height: rect.height };\r\n }\r\n\r\n /**\r\n * Updates all connection lines & node screen positions without a full redraw.\r\n * Used when nodes are dragged or the camera moves.\r\n */\r\n refresh() {\r\n this.renderer.refreshNodeTransforms();\r\n this._updateBackgroundTransform();\r\n }\r\n\r\n /** Draws all nodes in the workspace. Very heavy. */\r\n drawAllNodes() {\r\n for (let [nodeId, _] of this._nodeDB) {\r\n this.drawNode(nodeId);\r\n }\r\n }\r\n\r\n /** Redraws the entire workspace unless noRedraw is set. */\r\n redraw() {\r\n if (this.noRedraw) return;\r\n this.renderer.clearScreen();\r\n this.drawAllNodes();\r\n this.refresh();\r\n this.renderer.clearComments();\r\n this.renderer.drawComments();\r\n }\r\n\r\n /**\r\n * Converts workspace coordinates to screen (SVG) coordinates.\r\n * @param x - X position in workspace coordinates.\r\n * @param y - Y position in workspace coordinates.\r\n * @returns Screen coordinates as a Coordinates instance.\r\n */\r\n workspaceToScreen(workX: number, workY: number) {\r\n const zoom = this.getZoom();\r\n // _camera represents the top-left of the visible viewport in workspace coords\r\n const x = (workX - this._camera.x) * zoom;\r\n const y = (workY - this._camera.y) * zoom;\r\n return { x, y };\r\n }\r\n\r\n /**\r\n * Converts screen (SVG) coordinates to workspace coordinates.\r\n * @param x - X position in screen coordinates.\r\n * @param y - Y position in screen coordinates.\r\n * @returns Workspace coordinates as a Coordinates instance.\r\n */\r\n screenToWorkspace(screenX: number, screenY: number) {\r\n const zoom = this.getZoom();\r\n const workX = screenX / zoom + this._camera.x;\r\n const workY = screenY / zoom + this._camera.y;\r\n return { x: workX, y: workY };\r\n }\r\n\r\n /**\r\n * Draws a node by its ID.\r\n * @param id - The ID of the node to render.\r\n * @returns The rendered node.\r\n */\r\n drawNode(id: string) {\r\n return this.renderer.rerenderNode(this._nodeDB.get(id) as NodeSvg);\r\n }\r\n\r\n /**\r\n * Adds a node to the workspace.\r\n * @param node - The node instance to add.\r\n * @param nodeId - Optional custom ID to use instead of node.id.\r\n */\r\n addNode(node: NodeSvg, nodeId?: string) {\r\n let id = nodeId || node.id;\r\n if (this._nodeDB.has(id)) {\r\n console.warn(`Node with id ${id} already exists, overwriting.`);\r\n }\r\n if (node.workspace !== this) {\r\n node.workspace = this;\r\n }\r\n this._nodeDB.set(id, node);\r\n this.drawNode(id);\r\n this.history.emitChange();\r\n\r\n }\r\n\r\n /**\r\n * Create a new node of *type*.\r\n * @param type - The node's prototype name.\r\n */\r\n newNode(type: keyof typeof NodePrototypes, add: boolean = true): NodeSvg | undefined {\r\n if (!NodePrototypes[type]) return;\r\n const node = newHeadlessNode(type as string);\r\n if (!node) return;\r\n if (add) this.addNode(node);\r\n return node;\r\n }\r\n /**\r\n * Spawns a node at x, y of prototype type\r\n * @param type - The node prototype name\r\n * @param x - X position\r\n * @param y - Y position\r\n * @returns {Node} - The new node\r\n */\r\n spawnAt(type: keyof typeof NodePrototypes, x: number, y: number): NodeSvg | undefined {\r\n const node = this.newNode(type, false);\r\n if (!node) return;\r\n node.relativeCoords.set(x, y);\r\n this.addNode(node);\r\n this.drawNode(node.id);\r\n return node;\r\n }\r\n /**\r\n * Dereference a node from all of its connected neighbors\r\n */\r\n derefNode(node: NodeSvg) {\r\n // Disconnect from previous node or field\r\n const prev = node.previousConnection?.getFrom?.();\r\n if (prev instanceof NodeSvg) {\r\n prev.nextConnection?.disconnectTo();\r\n } else if (prev instanceof ConnectableField && prev.hasConnectable()) {\r\n prev.disconnect();\r\n }\r\n\r\n // Disconnect from next node\r\n const next = node.nextConnection?.getTo?.();\r\n if (next instanceof NodeSvg) {\r\n next.previousConnection?.disconnectFrom();\r\n }\r\n\r\n // Disconnect all fields\r\n for (let field of node.allFields()) {\r\n if ((field as ConnectableField).hasConnectable?.()) {\r\n (field as ConnectableField).disconnect();\r\n }\r\n }\r\n }\r\n /**\r\n * Removes a node by its ID.\r\n * @param id - The ID of the node to remove.\r\n */\r\n removeNodeById(id: string) {\r\n const node = this._nodeDB.get(id);\r\n if (!node) return;\r\n\r\n this.derefNode(node);\r\n this._nodeDB.delete(id);\r\n this.redraw();\r\n this.history.emitChange();\r\n\r\n }\r\n\r\n\r\n /**\r\n * Removes a node by its instance.\r\n * @param node - The node instance to remove.\r\n */\r\n removeNode(node: NodeSvg) {\r\n if (!node) return;\r\n this.removeNodeById(node.id);\r\n }\r\n\r\n /**\r\n * Retrieves a node by its ID.\r\n * @param id - The ID of the node.\r\n * @returns The NodeSvg instance or undefined if not found.\r\n */\r\n getNode(id: string | NodeSvg): NodeSvg | undefined {\r\n if (id instanceof NodeSvg) return id;\r\n return this._nodeDB.get(id);\r\n }\r\n\r\n /**\r\n * Pans the camera by the given delta values.\r\n * @param dx - Change in X direction.\r\n * @param dy - Change in Y direction.\r\n */\r\n pan(dx: number, dy: number) {\r\n this.controller.pan(dx, dy);\r\n }\r\n /**\r\n * Comment methods\r\n */\r\n\r\n /**\r\n * Adds a comment, returns the model.\r\n */\r\n addComment() {\r\n const model = new CommentModel(this);\r\n this._commentDB.add(model);\r\n this.redrawComments();\r\n return model;\r\n }\r\n /**\r\n * Gets a comment by id\r\n * @param id - The comment id.\r\n */\r\n getComment(id: string) {\r\n return Array.from(this._commentDB).find(e => e.id === id);\r\n }\r\n /**\r\n * Remove a comment by its instance or id.\r\n * @param commentOrId - The comment instance or its id.\r\n */\r\n removeComment(commentOrId: CommentModel | string) {\r\n let comment: CommentModel | undefined;\r\n\r\n if (typeof commentOrId === \"string\") {\r\n comment = this.getComment(commentOrId);\r\n } else {\r\n comment = commentOrId;\r\n }\r\n\r\n if (!comment) return false;\r\n\r\n this._commentDB.delete(comment);\r\n this.redrawComments();\r\n return true;\r\n }\r\n /**\r\n * Redraw all comments in this workspace.\r\n */\r\n redrawComments() {\r\n this.renderer.clearComments();\r\n this.renderer.drawComments();\r\n }\r\n /**\r\n * Deserialize this workspace from json data.\r\n * @param json - Serialized workspace\r\n */\r\n fromJson(json: { nodes: any[]; circular: boolean }, recordBigEvent: boolean = false) {\r\n this.toggleHistory(false); // disable recording\r\n\r\n for (let [_, node] of this._nodeDB.entries()) {\r\n this.removeNode(node);\r\n }\r\n if (json.circular) {\r\n for (let node of json.nodes) {\r\n NodeSvg.deserialize(node, this);\r\n }\r\n } else {\r\n for (let node of json.nodes) {\r\n NodeSvg.fromJson(node, this);\r\n }\r\n }\r\n\r\n this.untoggleHistory(); // restore previous history state\r\n\r\n // only emit a single snapshot if we were told to treat it as a user-level event\r\n if (recordBigEvent && this.recordHistory) {\r\n this.history.emitChange();\r\n }\r\n }\r\n\r\n /**\r\n * Serialize this workspace, optionally using circular references.\r\n */\r\n toJson(circular: boolean) {\r\n const nodes = [];\r\n if (circular) {\r\n for (let [id, node] of this._nodeDB) {\r\n if (node.topLevel) {\r\n nodes.push(node.serialize());\r\n }\r\n }\r\n } else {\r\n for (let [id, node] of this._nodeDB) {\r\n if (node.topLevel) {\r\n nodes.push(node.toJson());\r\n }\r\n }\r\n }\r\n\r\n return {\r\n circular,\r\n nodes\r\n }\r\n }\r\n}\r\n\r\nexport default WorkspaceSvg;\r\n","// color-utils.ts\r\nimport type { Color, Hex } from '../src/visual-types';\r\n\r\n/**\r\n * Parse any Color type into a hex string \"#RRGGBB\"\r\n */\r\nexport function parseColor(color: Color): Hex {\r\n\tif (typeof color === 'string') {\r\n\t\tif (color.startsWith('#')) {\r\n\t\t\t// Already a hex string, normalize to full #RRGGBB\r\n\t\t\tlet hex = color.slice(1);\r\n\t\t\tif (hex.length === 3) hex = hex.split('').map(c => c + c).join('');\r\n\t\t\treturn `#${hex}`;\r\n\t\t} else {\r\n\t\t\t// RGB string \"r, g, b\"\r\n\t\t\tconst parts = color.split(',').map(s => parseInt(s.trim(), 10));\r\n\t\t\tif (parts.length !== 3) throw new Error(`Invalid RGB string: ${color}`);\r\n\t\t\tconst [r, g, b] = parts;\r\n if ((!r && r!== 0) || (!g && g!== 0) || (!b && b !== 0)) {\r\n console.warn(\r\n \"Invalid RGB tuple\"\r\n );\r\n return \"#000\";\r\n }\r\n\t\t\treturn `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b\r\n\t\t\t\t.toString(16)\r\n\t\t\t\t.padStart(2, '0')}`;\r\n\t\t}\r\n\t} else if (Array.isArray(color)) {\r\n\t\t// RGBTuple [r,g,b]\r\n\t\tconst [r, g, b] = color;\r\n\t\treturn `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b\r\n\t\t\t.toString(16)\r\n\t\t\t.padStart(2, '0')}`;\r\n\t} else {\r\n\t\t// RGBObject {r,g,b}\r\n\t\tconst { r, g, b } = color;\r\n\t\treturn `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b\r\n\t\t\t.toString(16)\r\n\t\t\t.padStart(2, '0')}`;\r\n\t}\r\n}\r\n","// path.ts\r\n/**\r\n * Utility functions to generate SVG path strings or translate them.\r\n */\r\n\r\n/** Rounded rectangle */\r\nexport function roundedRect(width: number, height: number, radius: number): string {\r\n\tradius = Math.min(radius, width / 2, height / 2);\r\n\treturn `\r\n\t\tM${radius},0\r\n\t\tH${width - radius}\r\n\t\tA${radius},${radius} 0 0 1 ${width},${radius}\r\n\t\tV${height - radius}\r\n\t\tA${radius},${radius} 0 0 1 ${width - radius},${height}\r\n\t\tH${radius}\r\n\t\tA${radius},${radius} 0 0 1 0,${height - radius}\r\n\t\tV${radius}\r\n\t\tA${radius},${radius} 0 0 1 ${radius},0\r\n\t\tZ\r\n\t`.replace(/\\s+/g, ' ').trim();\r\n}\r\n\r\n/** Rounded triangle pointing up */\r\nexport function roundedTri(width: number, height: number, radius: number): string {\r\n\tconst halfW = width / 2;\r\n\tradius = Math.min(radius, halfW, height / 2);\r\n\treturn `\r\n\t\tM${halfW},0\r\n\t\tL${width - radius},${height - radius}\r\n\t\tA${radius},${radius} 0 0 1 ${width - radius*2},${height}\r\n\t\tL${radius*2},${height}\r\n\t\tA${radius},${radius} 0 0 1 ${radius},${height - radius}\r\n\t\tZ\r\n\t`.replace(/\\s+/g, ' ').trim();\r\n}\r\n\r\n/** Circle */\r\nexport function circle(radius: number): string {\r\n\treturn `\r\n\t\tM${radius},0\r\n\t\tA${radius},${radius} 0 1,0 ${-radius},0\r\n\t\tA${radius},${radius} 0 1,0 ${radius},0\r\n\t\tZ\r\n\t`.replace(/\\s+/g, ' ').trim();\r\n}\r\n\r\n/** Ellipse */\r\nexport function ellipse(rx: number, ry: number): string {\r\n\treturn `\r\n\t\tM${rx},0\r\n\t\tA${rx},${ry} 0 1,0 ${-rx},0\r\n\t\tA${rx},${ry} 0 1,0 ${rx},0\r\n\t\tZ\r\n\t`.replace(/\\s+/g, ' ').trim();\r\n}\r\n\r\n/** Star with n points */\r\nexport function star(radius: number, points: number = 5): string {\r\n\tif (points < 2) throw new Error('Star must have at least 2 points');\r\n\tlet path = '';\r\n\tconst step = (Math.PI * 2) / (points * 2);\r\n\tfor (let i = 0; i < points * 2; i++) {\r\n\t\tconst r = i % 2 === 0 ? radius : radius / 2;\r\n\t\tconst x = r * Math.sin(i * step);\r\n\t\tconst y = -r * Math.cos(i * step);\r\n\t\tpath += i === 0 ? `M${x},${y}` : ` L${x},${y}`;\r\n\t}\r\n\tpath += ' Z';\r\n\treturn path;\r\n}\r\n\r\n/** Regular polygon (triangle, pentagon, hexagon, etc) */\r\nexport function polygon(radius: number, sides: number = 3): string {\r\n\tif (sides < 3) throw new Error('Polygon must have at least 3 sides');\r\n\tlet path = '';\r\n\tconst step = (Math.PI * 2) / sides;\r\n\tfor (let i = 0; i < sides; i++) {\r\n\t\tconst x = radius * Math.cos(i * step - Math.PI / 2);\r\n\t\tconst y = radius * Math.sin(i * step - Math.PI / 2);\r\n\t\tpath += i === 0 ? `M${x},${y}` : ` L${x},${y}`;\r\n\t}\r\n\tpath += ' Z';\r\n\treturn path;\r\n}\r\nimport SvgPath from 'svgpath';\r\n\r\n/**\r\n * Rotate an SVG path string around a given point\r\n * @param path - SVG path string\r\n * @param angle - rotation angle in degrees\r\n * @param cx - x-coordinate of rotation center (default 0)\r\n * @param cy - y-coordinate of rotation center (default 0)\r\n * @returns new rotated SVG path string\r\n */\r\nexport function rotatePath(path: string, angle: number, cx = 0, cy = 0): string {\r\n\treturn new SvgPath(path)\r\n\t\t.rotate(angle, cx, cy)\r\n\t\t.toString();\r\n}\r\n","'use strict';\n\n\nvar Matrix = require('./matrix');\n\nvar operations = {\n matrix: true,\n scale: true,\n rotate: true,\n translate: true,\n skewX: true,\n skewY: true\n};\n\nvar CMD_SPLIT_RE = /\\s*(matrix|translate|scale|rotate|skewX|skewY)\\s*\\(\\s*(.+?)\\s*\\)[\\s,]*/;\nvar PARAMS_SPLIT_RE = /[\\s,]+/;\n\n\nmodule.exports = function transformParse(transformString) {\n var matrix = new Matrix();\n var cmd, params;\n\n // Split value into ['', 'translate', '10 50', '', 'scale', '2', '', 'rotate', '-45', '']\n transformString.split(CMD_SPLIT_RE).forEach(function (item) {\n\n // Skip empty elements\n if (!item.length) { return; }\n\n // remember operation\n if (typeof operations[item] !== 'undefined') {\n cmd = item;\n return;\n }\n\n // extract params & att operation to matrix\n params = item.split(PARAMS_SPLIT_RE).map(function (i) {\n return +i || 0;\n });\n\n // If params count is not correct - ignore command\n switch (cmd) {\n case 'matrix':\n if (params.length === 6) {\n matrix.matrix(params);\n }\n return;\n\n case 'scale':\n if (params.length === 1) {\n matrix.scale(params[0], params[0]);\n } else if (params.length === 2) {\n matrix.scale(params[0], params[1]);\n }\n return;\n\n case 'rotate':\n if (params.length === 1) {\n matrix.rotate(params[0], 0, 0);\n } else if (params.length === 3) {\n matrix.rotate(params[0], params[1], params[2]);\n }\n return;\n\n case 'translate':\n if (params.length === 1) {\n matrix.translate(params[0], 0);\n } else if (params.length === 2) {\n matrix.translate(params[0], params[1]);\n }\n return;\n\n case 'skewX':\n if (params.length === 1) {\n matrix.skewX(params[0]);\n }\n return;\n\n case 'skewY':\n if (params.length === 1) {\n matrix.skewY(params[0]);\n }\n return;\n }\n });\n\n return matrix;\n};\n","import WorkspaceController from './base';\r\nimport WorkspaceSvg from '../src/workspace-svg';\r\nimport userState from '../util/user-state';\r\n\r\ninterface Vec2 { x: number; y: number; }\r\n\r\nexport default class WASDController extends WorkspaceController {\r\n moveSpeed: number;\r\n doAccelerate?: boolean;\r\n accelSpeed: number;\r\n friction: number;\r\n velocity: Vec2;\r\n zoom: number = 1;\r\n zoomSpeed: number;\r\n minZoom: number;\r\n maxZoom: number;\r\n isFalloff: boolean;\r\n constructor(workspace: WorkspaceSvg, moveSpeed?: number) {\r\n super(workspace);\r\n this.moveSpeed = workspace.options.moveSpeed || moveSpeed || 5;\r\n\r\n this.doAccelerate = workspace.options?.controls?.wasdSmooth ?? false;\r\n this.accelSpeed = workspace.options?.controls?.wasdAccelerate ?? 0.2;\r\n this.friction = workspace.options?.controls?.wasdFriction ?? 0.85;\r\n\r\n this.velocity = { x: 0, y: 0 };\r\n this.isFalloff = false;\r\n\r\n // Zoom settings\r\n this.zoomSpeed = workspace.options?.controls?.zoomSpeed ?? 0.1;\r\n this.minZoom = workspace.options?.controls?.minZoom ?? 0.1;\r\n this.maxZoom = workspace.options?.controls?.maxZoom ?? 4;\r\n this.zoom = 1;\r\n // Bind wheel for zoom\r\n workspace._wsTop.addEventListener('wheel', this.onWheel.bind(this), { passive: false });\r\n }\r\n\r\n canMove() {\r\n return !userState.hasState('typing');\r\n }\r\n\r\n update() {\r\n super.update();\r\n if (!this.canMove()) return;\r\n\r\n let inputX = 0;\r\n let inputY = 0;\r\n\r\n if (this.keysDown.has('w') || this.keysDown.has('ArrowUp')) inputY -= 1;\r\n if (this.keysDown.has('s') || this.keysDown.has('ArrowDown')) inputY += 1;\r\n if (this.keysDown.has('a') || this.keysDown.has('ArrowLeft')) inputX -= 1;\r\n if (this.keysDown.has('d') || this.keysDown.has('ArrowRight')) inputX += 1;\r\n\r\n if (this.doAccelerate) {\r\n // Accelerate velocity towards input direction\r\n this.velocity.x += inputX * this.accelSpeed;\r\n this.velocity.y += inputY * this.accelSpeed;\r\n\r\n // Apply friction\r\n this.velocity.x *= this.friction;\r\n this.velocity.y *= this.friction;\r\n if (inputX == 0 && inputY == 0) {\r\n this.isFalloff = true;\r\n } else {\r\n this.isFalloff = false;\r\n }\r\n // Only pan if velocity is noticeable\r\n if (Math.abs(this.velocity.x) > 0.01 || Math.abs(this.velocity.y) > 0.01) {\r\n this.pan(this.velocity.x, this.velocity.y);\r\n }\r\n } else {\r\n // Instant movement\r\n const dx = inputX * this.moveSpeed;\r\n const dy = inputY * this.moveSpeed;\r\n if (dx !== 0 || dy !== 0) this.pan(dx, dy);\r\n }\r\n }\r\n pan(dx: number, dy: number) {\r\n const x = this.workspace._camera.x, y = this.workspace._camera.y;\r\n this.workspace._camera.x += dx;\r\n this.workspace._camera.y += dy;\r\n if (x == this.workspace._camera.x && y == this.workspace._camera.y) {\r\n return;\r\n }\r\n if (!this.isFalloff) {\r\n this._throttledFireDidMove();\r\n this.workspace.didMove = true;\r\n this.workspace.fireMoveListeners();\r\n this.refreshPos();\r\n }\r\n this.refreshPos();\r\n }\r\n /**\r\n * Handles wheel events for zooming.\r\n * Zooms around the mouse position for intuitive zooming.\r\n */\r\n onWheel(e: WheelEvent) {\r\n e.preventDefault();\r\n\r\n const oldZoom = this.getZoom();\r\n let delta = -e.deltaY * this.zoomSpeed * 0.01; // normalize wheel\r\n let newZoom = oldZoom * (1 + delta);\r\n\r\n // Clamp zoom\r\n newZoom = Math.max(this.minZoom, Math.min(this.maxZoom, newZoom));\r\n\r\n // Zoom around cursor\r\n const mouseX = e.clientX;\r\n const mouseY = e.clientY;\r\n\r\n const wsMouse = this.workspace.screenToWorkspace(mouseX, mouseY);\r\n\r\n // Apply new zoom\r\n this.setZoom(newZoom);\r\n\r\n // Adjust camera so the point under cursor stays stable\r\n this.workspace._camera.x = wsMouse.x - mouseX / newZoom;\r\n this.workspace._camera.y = wsMouse.y - mouseY / newZoom;\r\n\r\n this.workspace.refresh();\r\n }\r\n\r\n /** Returns current zoom level */\r\n getZoom() {\r\n return this.zoom;\r\n }\r\n\r\n /** Sets zoom directly */\r\n setZoom(zoom: number) {\r\n this.zoom = zoom;\r\n }\r\n}\r\n","\r\n\r\n// fonts-manager.ts\r\n\r\nconst loadedFonts: Record<string, Promise<void>> = {};\r\n\r\n/**\r\n * Load a Google Font by name and optional weights.\r\n * Returns a promise that resolves when the font is available.\r\n */\r\nexport function loadGoogleFont(\r\n\tname: string,\r\n\tweights: number[] = [400, 700]\r\n): Promise<void> {\r\n\tif (loadedFonts[name]) return loadedFonts[name]; // already loading/loaded\r\n\r\n\tconst linkId = `gf-${name.replace(/\\s+/g, '-')}`;\r\n\tif (!document.getElementById(linkId)) {\r\n\t\tconst link = document.createElement('link');\r\n\t\tlink.id = linkId;\r\n\t\tlink.rel = 'stylesheet';\r\n\t\tconst weightsParam = weights.join(';');\r\n\t\tlink.href = `https://fonts.googleapis.com/css2?family=${name.replace(\r\n\t\t\t/\\s+/g,\r\n\t\t\t'+'\r\n\t\t)}:wght@${weightsParam}&display=swap`;\r\n\t\tdocument.head.appendChild(link);\r\n\t}\r\n\r\n\t// wait for all requested weights to be loaded\r\n\tconst fontPromises = weights.map((w) =>\r\n\t\tdocument.fonts.load(`${w} 1em ${name}`)\r\n\t);\r\n\r\n\tconst promise = Promise.all(fontPromises).then(() => undefined);\r\n\tloadedFonts[name] = promise;\r\n\treturn promise;\r\n}\r\n","import { Element, Svg } from '@svgdotjs/svg.js';\r\nimport NodeSvg from '../src/nodesvg';\r\nimport eventer from '../util/eventer';\r\nimport type { EventSetupFn } from '../util/eventer';\r\nimport WorkspaceSvg from '../src/workspace-svg';\r\nimport userState from '../util/user-state';\r\nimport Renderer, { ConnectorToFrom, DrawState } from '../renderers/renderer';\r\n\r\n\r\n\r\nfunction initConnectionLine(element: Element, args: Record<string, any>): () => void {\r\n // click destroys the line\r\n const handleClick = () => {\r\n args.fromConn.disconnectTo();\r\n args.toConn.disconnectFrom();\r\n element.remove();\r\n xMark.remove();\r\n const remove: ConnectorToFrom[] = [];\r\n for (let state of args.renderer._drawStates as DrawState[]) {\r\n for (let pair of state.pendingConnections) {\r\n if (pair.from == args.fromConn && pair.to == args.toConn) {\r\n remove.push(pair);\r\n }\r\n if (pair.from = args.toConn && pair.to == args.fromConn) {\r\n remove.push(pair);\r\n }\r\n }\r\n state.pendingConnections = state.pendingConnections.filter(e => !remove.includes(e));\r\n }\r\n };\r\n\r\n // create X element\r\n const bbox = element.bbox();\r\n const midX = bbox.x + bbox.width / 2;\r\n const midY = bbox.y + bbox.height / 2;\r\n const xMark = (element.parent()! as Svg).text('X').font({\r\n family: 'Fredoka, sans-serif',\r\n size: 46,\r\n weight: '700',\r\n anchor: 'middle',\r\n leading: '1em'\r\n })\r\n .addClass((args.renderer.constructor as typeof Renderer).LINE_X_MARK_TAG)\r\n .center(midX, midY)\r\n .fill('#fff') // white fill\r\n .stroke({ color: '#000', width: 2 }) // black outline\r\n .hide();\r\n\r\n xMark.on('click', handleClick)\r\n xMark.node.style.userSelect = 'none';\r\n // show X on hover\r\n element.on('mouseover', () => xMark.show());\r\n element.on('mouseout', () => xMark.hide());\r\n\r\n // attach click event\r\n element.on('click', handleClick);\r\n\r\n // cleanup function\r\n return () => {\r\n element.off('click', handleClick);\r\n element.off('mouseover');\r\n element.off('mouseout');\r\n xMark.off('click', handleClick);\r\n xMark.remove();\r\n };\r\n}\r\n// ok\r\neventer.registerEvent('k_connline', initConnectionLine as EventSetupFn);\r\n","import Connection, { Connectable } from \"./connection\";\r\nimport { G, Path, Rect, Svg, SVG, Text } from '@svgdotjs/svg.js';\r\nimport NodeSvg from \"./nodesvg\";\r\nimport { ConnectorToFrom } from \"../renderers/renderer\";\r\nimport dropdownContainer, { DropdownOptions } from \"./dropdown-menu\";\r\nimport WorkspaceSvg from \"./workspace-svg\";\r\n/**\r\n * Options used to initialize a Field.\r\n */\r\nexport interface FieldOptions { /** Name of the field */\r\n name: string;\r\n /** Human-readable label for the field */\r\n label: string;\r\n /** Key used to identify the field type in FieldTypesMap */\r\n type: string;\r\n /** Field value (optional) */\r\n value?: any;\r\n /** Only used by OptConnectField to determine internal value type */\r\n fld_type?: \"number\" | \"string\";\r\n [key: string]: any;\r\n};\r\n\r\nexport interface FieldVisualInfo {\r\n measuredWidth: number; // The width approximated by the field itself.\r\n measuredHeight: number; // The height approximated by the field itself.\r\n background: Rect; // The node's background element.\r\n svg: Svg; // The workspace's SVG.js svg\r\n nodeGroup: G; // Group for the node\r\n fieldGroup: G; // A group containing the label & input.\r\n xUsed: number; // The amount of x space used up by the label.\r\n}\r\nexport interface FieldRawBoxData {\r\n box: Rect;\r\n txt: Text;\r\n}\r\nexport interface FieldConnectionData {\r\n connector: Path;\r\n connState: ConnectorToFrom\r\n}\r\n/**\r\n * Base class for all fields.\r\n * @template T The type of the value stored in the field\r\n */\r\nclass Field<T = any> {\r\n label: string;\r\n name: string;\r\n type: string;\r\n node?: NodeSvg;\r\n editable: boolean;\r\n svgGroup?: G;\r\n protected value: T | null;\r\n static register(name: string, cls: Function) { };\r\n static unregister(name: string) { };\r\n constructor() {\r\n this.label = '';\r\n this.name = '';\r\n this.type = '';\r\n this.value = null;\r\n this.editable = true;\r\n }\r\n onDraw(rawBox?: FieldRawBoxData, connectionBubble?: FieldConnectionData) {\r\n\r\n }\r\n canEditConnector() {\r\n return false;\r\n }\r\n /**\r\n * Set whether or not you can edit this field.\r\n * @param val - The value to set to.\r\n */\r\n setEditable(val: boolean) {\r\n this.editable = val;\r\n if (this.node) {\r\n this.node?.workspace?.renderer?.rerenderNode?.(this.node)\r\n }\r\n }\r\n /**\r\n * Ask whether or not we can edit this field.\r\n */\r\n canEdit() {\r\n return this.editable;\r\n }\r\n /**\r\n * Set field name to something else.\r\n * @param name string\r\n * @returns the new name.\r\n */\r\n setName(name: string) {\r\n return this.name = name;\r\n }\r\n /**\r\n * Initialize the field from JSON options.\r\n * @param json FieldOptions object\r\n */\r\n fromJson(json: FieldOptions, workspace?: WorkspaceSvg) {\r\n if (json.name !== undefined) this.name = json.name;\r\n if (json.label !== undefined) this.label = json.label;\r\n if (json.type !== undefined) this.type = json.type;\r\n if (json.value !== undefined) this.value = json.value;\r\n if (json.editable) this.setEditable(Boolean(json.editable));\r\n }\r\n\r\n /** @returns The field's name/key */\r\n getName(): string {\r\n return this.name;\r\n }\r\n\r\n /** @returns The human-readable label */\r\n getLabel(): string {\r\n return this.label;\r\n }\r\n\r\n /**\r\n * Set the human-readable label\r\n * @param label New label\r\n * @returns The updated label\r\n */\r\n setLabel(label: string): string {\r\n return this.label = label;\r\n }\r\n\r\n /** @returns Whether this field is a raw value field (text/number) */\r\n hasRaw(): boolean {\r\n return true;\r\n }\r\n\r\n /** @returns Whether this field supports connections */\r\n hasConnectable(): boolean {\r\n return false;\r\n }\r\n /** @returns Whether we have a custom editor/input look */\r\n isCustomEditor(): boolean {\r\n return false;\r\n }\r\n /**\r\n * Make the input's custom look.\r\n * @param fieldVisualInfo - The visual info of the field, mutate this if needed.\r\n */\r\n drawMyself(fieldVisualInfo: FieldVisualInfo) {\r\n return;\r\n }\r\n /** Return width & height of your field's custom editor */\r\n measureMyself() {\r\n return { width: null, height: null }; // if either is null then the renderer measures for us (meaning we have a connection or other type of raw field.)\r\n }\r\n /** @returns The stored value */\r\n getValue(): T | null {\r\n return this.value;\r\n }\r\n\r\n /**\r\n * Set the stored value\r\n * @param val New value\r\n */\r\n setValue(val: T) {\r\n this.value = val;\r\n }\r\n\r\n /** @returns The value as it should be displayed (can differ from internal value) */\r\n getDisplayValue(): T | null {\r\n return this.getValue();\r\n }\r\n toJson(deep: boolean, alreadyProcessed: { [key: string]: any }): FieldOptions {\r\n return {\r\n name: this.name,\r\n label: this.label,\r\n type: this.type,\r\n value: this.getValue()\r\n };\r\n }\r\n}\r\n/**\r\n * Used when you want just a label with no actual value. Any value related methods are no-op.\r\n */\r\nexport class DummyField {\r\n label: string;\r\n name: string;\r\n type: string;\r\n node?: NodeSvg;\r\n editable: boolean;\r\n svgGroup?: G;\r\n\r\n constructor() {\r\n this.label = '';\r\n this.name = '';\r\n this.type = '';\r\n this.editable = false;\r\n }\r\n onDraw(rawBox?: FieldRawBoxData, connectionBubble?: FieldConnectionData) {\r\n\r\n }\r\n canEditConnector() {\r\n return false;\r\n }\r\n /**\r\n * Set whether or not you can edit this field.\r\n * @param val - The value to set to.\r\n */\r\n setEditable(val: boolean) {\r\n this.editable = val;\r\n if (this.node) {\r\n this.node?.workspace?.renderer?.rerenderNode?.(this.node)\r\n }\r\n }\r\n /**\r\n * Ask whether or not we can edit this field.\r\n */\r\n canEdit() {\r\n return this.editable;\r\n }\r\n /**\r\n * Set field name to something else.\r\n * @param name string\r\n * @returns the new name.\r\n */\r\n setName(name: string) {\r\n return this.name = name;\r\n }\r\n /**\r\n * Initialize the field from JSON options.\r\n * @param json FieldOptions object\r\n */\r\n fromJson(json: FieldOptions) {\r\n if (json.name !== undefined) this.name = json.name;\r\n if (json.label !== undefined) this.label = json.label;\r\n if (json.type !== undefined) this.type = json.type;\r\n }\r\n /** @returns Whether this field is a raw value field (text/number) */\r\n hasRaw(): boolean {\r\n return false;\r\n }\r\n\r\n /** @returns Whether this field supports connections */\r\n hasConnectable(): boolean {\r\n return false;\r\n }\r\n /** @returns The field's name/key */\r\n getName(): string {\r\n return this.name;\r\n }\r\n\r\n /** @returns The human-readable label */\r\n getLabel(): string {\r\n return this.label;\r\n }\r\n /**\r\n * Set the human-readable label\r\n * @param label New label\r\n * @returns The updated label\r\n */\r\n setLabel(label: string): string {\r\n return this.label = label;\r\n }\r\n /** @returns Whether we have a custom editor/input look */\r\n isCustomEditor(): boolean {\r\n return false;\r\n }\r\n /**\r\n * Make the input's custom look.\r\n * @param fieldVisualInfo - The visual info of the field, mutate this if needed.\r\n */\r\n drawMyself(fieldVisualInfo: FieldVisualInfo) {\r\n return;\r\n }\r\n /** Return width & height of your field's custom editor */\r\n measureMyself() {\r\n return { width: 0, height: 0 }; // if either is null then the renderer measures for us (meaning we have a connection or other type of raw field.)\r\n }\r\n /**\r\n * Dummy fields have no value.\r\n * @returns {null}\r\n */\r\n getValue() {\r\n return null;\r\n }\r\n /**\r\n * No-op for dummy fields\r\n */\r\n setValue(_: any) { }\r\n /** @returns The value as it should be displayed (can differ from internal value) */\r\n getDisplayValue() {\r\n return this.getValue();\r\n }\r\n toJson(deep: boolean, alreadyProcessed: { [key: string]: any }): FieldOptions {\r\n return {\r\n name: this.name,\r\n label: this.label,\r\n type: this.type,\r\n value: this.getValue()\r\n };\r\n }\r\n}\r\n/**\r\n * Base class for fields that can be connected to other fields.\r\n * @template T The type of the value stored in the field\r\n */\r\nexport class ConnectableField<T = any> extends Field<T> {\r\n connection: Connection;\r\n\r\n constructor() {\r\n super();\r\n this.connection = new Connection(this, null);\r\n this.value = null as T;\r\n }\r\n hasConnectable(): boolean {\r\n return true;\r\n }\r\n\r\n hasRaw(): boolean {\r\n return false;\r\n }\r\n\r\n /** Disconnect this field from any connected Connectable */\r\n disconnect() {\r\n const to = this.connection.to;\r\n if (to instanceof NodeSvg && to?.previousConnection?.from) {\r\n to.previousConnection.from = null;\r\n this.connection.to = null;\r\n }\r\n }\r\n fromJson(json: FieldOptions, workspace?: WorkspaceSvg) {\r\n super.fromJson(json);\r\n\r\n // If the value is a serialized node, rebuild it\r\n if (json.value && typeof json.value === \"object\" && json.value.id) {\r\n this.value = NodeSvg._deserialize(json.value, {}, workspace) as any;\r\n this.connection.setTo(this.value as Connectable);\r\n } else if (json.value instanceof NodeSvg) {\r\n this.value = json.value as any;\r\n this.connection.setTo(this.value as Connectable);\r\n } else {\r\n this.value = json.value;\r\n }\r\n\r\n return this;\r\n }\r\n toJson(deep: boolean, alreadyProcessed: { [key: string]: any }): FieldOptions {\r\n let val: any = this.getValue();\r\n // If it's connected to a node, store it's serialized form.\r\n if (val instanceof NodeSvg) val = { node: alreadyProcessed[val.id] ? (deep ? alreadyProcessed[val.id] : val.id) : val.serialize(alreadyProcessed) };\r\n\r\n return {\r\n ...super.toJson(true, alreadyProcessed),\r\n value: val\r\n };\r\n }\r\n}\r\n\r\n/** Field storing a numeric value */\r\nexport class NumberField extends Field<number> {\r\n constructor() {\r\n super();\r\n }\r\n\r\n fromJson(json: FieldOptions) {\r\n super.fromJson(json);\r\n if (json.value !== undefined) this.setValue(Number(json.value));\r\n }\r\n setValue(val: number) {\r\n this.value = Number(val);\r\n }\r\n}\r\n\r\n/** Field storing a string value */\r\nexport class TextField extends Field<string> {\r\n constructor() {\r\n super();\r\n }\r\n fromJson(json: FieldOptions) {\r\n super.fromJson(json);\r\n if (json.value !== undefined) this.setValue(String(json.value));\r\n }\r\n setValue(val: string) {\r\n this.value = String(val);\r\n }\r\n}\r\n\r\n/**\r\n * Optional connectable field.\r\n * Can store either a number or string depending on fld_type.\r\n */\r\nexport class OptConnectField extends ConnectableField<number | string | NodeSvg> {\r\n fldType: \"number\" | \"string\";\r\n\r\n constructor() {\r\n super();\r\n this.fldType = \"string\";\r\n }\r\n canEditConnector(): boolean {\r\n return true;\r\n }\r\n canEdit() {\r\n if (this.getValue() instanceof NodeSvg) {\r\n return false;\r\n }\r\n return this.editable;\r\n }\r\n getValue(): string | number | NodeSvg | null {\r\n if (this.connection && this.connection.getTo()) {\r\n return this.connection.getTo() as NodeSvg;\r\n } else {\r\n return this.value;\r\n }\r\n }\r\n hasRaw() {\r\n return true;\r\n }\r\n hasConnectable() {\r\n return true;\r\n }\r\n /**\r\n * Set field type.\r\n * @param type \"number\"|\"string\"\r\n */\r\n setFieldType(type: \"number\" | \"string\") {\r\n this.fldType = type;\r\n }\r\n /**\r\n * Initialize from JSON, respecting fld_type\r\n * @param json FieldOptions\r\n */\r\n fromJson(json: FieldOptions, workspace?: WorkspaceSvg) {\r\n super.fromJson(json, workspace);\r\n this.fldType = json.fld_type || \"string\";\r\n if (this.value != null && typeof this.value === this.fldType) {\r\n this.setValue(this.value as number | string);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Set the value, converting to number or string depending on fld_type\r\n * @param val The new value\r\n */\r\n setValue(val: number | string) {\r\n if (this.fldType === \"number\") this.value = Number(val);\r\n else this.value = String(val);\r\n }\r\n\r\n /**\r\n * @returns Display value for UI purposes (never null)\r\n */\r\n getDisplayValue(): string {\r\n if (this.value == null) return this.fldType === \"number\" ? \"0\" : \"\";\r\n if (this.getValue() instanceof NodeSvg) return '[NODE]'; // If theres a connection\r\n return String(this.value);\r\n }\r\n toJson(deep: boolean, alreadyProcessed: { [key: string]: any }): FieldOptions {\r\n let val: any = this.getValue();\r\n // If it's connected to a node, store it's serialized form.\r\n if (val instanceof NodeSvg) val = { node: deep ? val.serialize(alreadyProcessed) : val.id };\r\n\r\n return {\r\n ...super.toJson(true, alreadyProcessed),\r\n fld_type: this.fldType,\r\n value: val\r\n };\r\n }\r\n}\r\nexport type DropdownItem = { text: string, value: string } | string\r\nexport class DropdownField extends Field<string> {\r\n options: DropdownItem[] | null;\r\n _selected: DropdownItem | null;\r\n _isOpen: boolean;\r\n\r\n constructor() {\r\n super();\r\n this.options = null;\r\n this._selected = null;\r\n this._isOpen = false;\r\n }\r\n\r\n onDraw(rawBox?: FieldRawBoxData) {\r\n if (!rawBox || !this.options) return;\r\n\r\n const { box, txt } = rawBox;\r\n const toggle = () => this.toggleDropdown(rawBox);\r\n box.click(toggle);\r\n txt.click(toggle);\r\n }\r\n\r\n private toggleDropdown(rawBox: FieldRawBoxData) {\r\n if (dropdownContainer.getOwner() === this) {\r\n this.closeDropdown();\r\n } else {\r\n this.openDropdown(rawBox);\r\n }\r\n rawBox.txt.text(this.getDisplayValue());\r\n }\r\n\r\n private openDropdown(rawBox: FieldRawBoxData) {\r\n if (!this.options) return;\r\n\r\n const items = this.options.map(option => ({\r\n label: typeof option === 'string' ? option : option.text,\r\n value: typeof option === 'string' ? option : option.value\r\n }));\r\n\r\n dropdownContainer.show(this, {\r\n items,\r\n width: rawBox.box.bbox().width * 2,\r\n onSelect: (value: string) => {\r\n if (!this.options) return;\r\n const original = this.options.find(\r\n e => e === value || (typeof e !== 'string' && e.value === value)\r\n );\r\n if (original) {\r\n this._selected = original;\r\n this.setValue(value);\r\n this.closeDropdown();\r\n this?.node?.workspace?.emitChange?.();\r\n this?.node?.workspace?.renderer?.rerenderNode?.(this.node);\r\n }\r\n }\r\n } as DropdownOptions);\r\n }\r\n\r\n private closeDropdown() {\r\n dropdownContainer.hideIfOwner(this);\r\n }\r\n\r\n canEdit() {\r\n return false;\r\n }\r\n\r\n getSelected() {\r\n return this._selected;\r\n }\r\n fromJson(json: FieldOptions) {\r\n super.fromJson(json);\r\n this.options = json.options as DropdownItem[] || null;\r\n this._selected = this.options?.[0] ?? null;\r\n if (this._selected) this.setValue(typeof this._selected === 'string' ? this._selected : this._selected.value);\r\n }\r\n\r\n /**\r\n * Display value of dropdowns.\r\n * @returns - Display value\r\n */\r\n getDisplayValue(): string {\r\n const text = typeof this._selected === 'string' ? this._selected : this._selected?.text || '';\r\n const arrow = dropdownContainer.getOwner() == this ? '▲' : '▼'; // toggles open/closed\r\n return text + ' ' + arrow;\r\n }\r\n\r\n /**\r\n * Set options on this dropdown\r\n * @param options - List of options\r\n */\r\n setOptions(options: DropdownItem[]) {\r\n this.options = options;\r\n this._selected = this.options?.[0] ?? null;\r\n if (this._selected) this.setValue(\r\n typeof this._selected === 'string' ? this._selected : this._selected.value\r\n );\r\n }\r\n /**\r\n * \r\n * @param deep - Whether to recursive it.\r\n * @param alreadyProcessed - Map of already serialized nodes.\r\n * @returns - Json of this field.\r\n */\r\n toJson(deep: boolean, alreadyProcessed: { [key: string]: any }): FieldOptions {\r\n return { ...super.toJson(deep, alreadyProcessed), options: this.options };\r\n }\r\n}\r\n\r\n/**\r\n * Any field instance type\r\n */\r\nexport type AnyField = Field | OptConnectField | NumberField | TextField | DummyField | ConnectableField;\r\n/**\r\n * Any field class type\r\n */\r\nexport type AnyFieldCls = typeof Field | typeof OptConnectField | typeof ConnectableField | typeof NumberField | typeof TextField | typeof DummyField;\r\nexport const FieldMap: {\r\n field_both: typeof OptConnectField;\r\n field_string: typeof TextField;\r\n field_num: typeof NumberField;\r\n field_dummy: typeof DummyField;\r\n field_str: typeof TextField;\r\n connection: typeof ConnectableField;\r\n [key: string]: AnyFieldCls;\r\n} = {\r\n 'field_both': OptConnectField,\r\n 'field_string': TextField,\r\n 'field_num': NumberField,\r\n 'field_dummy': DummyField,\r\n 'field_str': TextField,\r\n 'connection': ConnectableField,\r\n 'dropdown': DropdownField\r\n}\r\n\r\n\r\nexport default Field;\r\n","import type RendererType from \"../renderers/renderer\";\r\nimport Renderer from \"../renderers/renderer\";\r\n/**\r\n * Interface for the renderer map.\r\n * Maps a string key (renderer name) to a renderer class.\r\n */\r\ninterface RendererMapInterface {\r\n [key: string]: typeof RendererType;\r\n}\r\n\r\n// Top-level renderer map storage\r\nconst RendererMap: RendererMapInterface = {};\r\n\r\n/**\r\n * Class for managing registered renderer classes.\r\n * Provides methods to register, delete, get, list, and resolve renderers.\r\n */\r\nclass RMap {\r\n /**\r\n * Registers a renderer class under a given name.\r\n * @param RendererCls The renderer class to register\r\n * @param optName Optional name to register under. Defaults to `RendererCls.NAME`\r\n */\r\n static register(RendererCls: typeof RendererType, optName?: string) {\r\n const name = optName ?? RendererCls.NAME;\r\n RendererMap[name] = RendererCls;\r\n }\r\n\r\n /**\r\n * Deletes a renderer from the map by name.\r\n * Cannot delete the \"default\" renderer.\r\n * @param name The name of the renderer to delete\r\n * @returns `true` if deleted, `false` otherwise\r\n */\r\n static delete(name: string) {\r\n if (name === 'default') return false;\r\n if (RendererMap[name]) {\r\n delete RendererMap[name];\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Retrieves a renderer class by name.\r\n * Returns the default renderer if the name is not found.\r\n * @param name The name of the renderer to get\r\n * @returns The renderer class\r\n */\r\n static get(name: string): typeof RendererType {\r\n const Renderer = require(\"../renderers/renderer\").default as typeof RendererType;\r\n return RendererMap[name] ?? RendererMap['default'] ?? Renderer;\r\n }\r\n\r\n /**\r\n * Lists all registered renderer names.\r\n * @returns Array of registered renderer names\r\n */\r\n static list() {\r\n return Object.keys(RendererMap);\r\n }\r\n\r\n /**\r\n * Resolves input into a renderer class.\r\n * - If `input` is undefined, returns the default renderer\r\n * - If `input` is a string, returns the renderer with that name\r\n * - If `input` is a class, returns the class itself\r\n * @param input Optional renderer name or class\r\n * @returns Renderer class\r\n */\r\n static resolve(input?: string | typeof RendererType): typeof RendererType {\r\n const Renderer = require(\"../renderers/renderer\").default as typeof RendererType;\r\n\r\n if (!input) return RendererMap['default'] ?? Renderer;\r\n\r\n if (typeof input === 'string') return RMap.get(input);\r\n\r\n if (typeof input === 'function') return input as typeof RendererType;\r\n\r\n return RendererMap['default'] ?? Renderer;\r\n }\r\n}\r\n\r\n// Default renderers registered in core.ts\r\n\r\nexport { RMap, RendererMap };\r\n","import { Svg, Pattern, Rect } from \"@svgdotjs/svg.js\";\r\nimport WorkspaceSvg from \"./workspace-svg\";\r\nimport { addWindowListener } from \"../util/window-listeners\";\r\n\r\n/**\r\n * Options for configuring the workspace grid.\r\n * @typedef {Object} GridOptions\r\n * @property {\"dotted\"|\"celled\"} [type=\"dotted\"] - The type of grid to render.\r\n * @property {number} [spacing=40] - The spacing between grid dots or cells.\r\n * @property {number} [dotSize=2] - The radius of the dots (only for dotted type).\r\n * @property {number} [strokeWidth=2] - Stroke width of the cells (only for celled type).\r\n * @property {string} [color=\"#bebebeff\"] - Color of the grid.\r\n */\r\nexport interface GridOptions {\r\n type?: \"dotted\" | \"celled\";\r\n spacing?: number;\r\n dotSize?: number;\r\n strokeWidth?: number;\r\n color?: string;\r\n}\r\n\r\n/**\r\n * Handles drawing and managing a workspace background grid.\r\n */\r\nexport default class Grid {\r\n private ws: WorkspaceSvg;\r\n private svg: Svg;\r\n private pattern?: Pattern;\r\n private rect?: Rect;\r\n\r\n /** Cached + normalized grid values */\r\n private grid: Required<GridOptions>;\r\n\r\n /**\r\n * Creates a new Grid instance and attaches it to the given workspace SVG.\r\n * @param {WorkspaceSvg} ws - The workspace this grid belongs to.\r\n * @param {Svg} svg - The SVG element to draw the grid into.\r\n * @param {GridOptions} opts - Initial options for the grid.\r\n */\r\n constructor(ws: WorkspaceSvg, svg: Svg, opts: GridOptions) {\r\n this.ws = ws;\r\n this.svg = svg;\r\n\r\n this.grid = {\r\n type: opts.type ?? \"dotted\",\r\n spacing: opts.spacing ?? 40,\r\n dotSize: opts.dotSize ?? 2,\r\n strokeWidth: opts.strokeWidth ?? 2,\r\n color: opts.color ?? \"#bebebeff\",\r\n };\r\n\r\n this.init();\r\n }\r\n\r\n /**\r\n * Initializes the grid pattern, background rect, and attaches resize listener.\r\n * @private\r\n */\r\n private init() {\r\n if (this.rect) {\r\n this.rect.remove();\r\n }\r\n const { type, spacing, dotSize, strokeWidth, color } = this.grid;\r\n\r\n let defs = this.svg.findOne(\"defs\");\r\n if (!defs) defs = this.svg.defs();\r\n\r\n this.pattern = this.svg.pattern(spacing, spacing, (add) => {\r\n if (type === \"dotted\") {\r\n add\r\n .circle(dotSize * 2)\r\n .fill(color)\r\n .move(spacing / 2 - dotSize, spacing / 2 - dotSize);\r\n } else {\r\n add.rect(spacing, spacing).stroke({ color, width: strokeWidth }).fill(\"none\");\r\n }\r\n });\r\n this.pattern.attr({ patternUnits: \"userSpaceOnUse\" });\r\n defs.add(this.pattern);\r\n\r\n const { width, height } = this.ws.getSize();\r\n this.rect = this.svg\r\n .rect(width, height)\r\n .fill(this.pattern)\r\n .back()\r\n .addClass(\"WorkspaceBgPattern\");\r\n\r\n addWindowListener(\"resize\", () => this.resize());\r\n }\r\n\r\n /**\r\n * Resizes the grid background rect to fit the workspace size.\r\n */\r\n resize() {\r\n if (!this.rect) return;\r\n const { width, height } = this.ws.getSize();\r\n this.rect.size(width, height).back();\r\n this.ws._backgroundRect.back();\r\n }\r\n\r\n /**\r\n * Updates the grid pattern transform according to zoom and camera position.\r\n * Scales the dots/cells to match zoom and repositions them based on camera.\r\n */\r\n updateTransform() {\r\n if (!this.pattern || !this.rect) return;\r\n const { type, spacing, dotSize, strokeWidth, color } = this.grid;\r\n\r\n const zoom = this.ws.getZoom();\r\n const scaledSpacing = spacing * zoom;\r\n\r\n this.pattern.attr({ width: scaledSpacing, height: scaledSpacing });\r\n this.pattern.clear();\r\n\r\n if (type === \"dotted\") {\r\n const scaledDot = Math.max(dotSize * zoom, 0.5);\r\n this.pattern\r\n .circle(scaledDot * 2)\r\n .fill(color)\r\n .move(scaledSpacing / 2 - scaledDot, scaledSpacing / 2 - scaledDot);\r\n } else {\r\n this.pattern\r\n .rect(scaledSpacing, scaledSpacing)\r\n .stroke({ color, width: strokeWidth * zoom })\r\n .fill(\"none\");\r\n }\r\n\r\n const cam = this.ws._camera;\r\n this.pattern.attr({\r\n patternTransform: `translate(${-cam.x * zoom % scaledSpacing}, ${-cam.y * zoom % scaledSpacing})`,\r\n });\r\n\r\n this.resize();\r\n this.ws._backgroundRect.back();\r\n }\r\n\r\n /**\r\n * Updates internal grid options from the workspace configuration.\r\n */\r\n updateOptions() {\r\n const opts = this.ws.options!.grid;\r\n this.grid = {\r\n type: opts!.type ?? \"dotted\",\r\n spacing: opts!.spacing ?? 40,\r\n dotSize: opts!.dotSize ?? 2,\r\n strokeWidth: opts!.strokeWidth ?? 2,\r\n color: opts!.color ?? \"#bebebeff\",\r\n };\r\n this.init();\r\n }\r\n\r\n /**\r\n * Dynamically sets new grid options and rebuilds the grid pattern.\r\n * @param {Partial<GridOptions>} newOpts - New options to apply.\r\n */\r\n setOptions(newOpts: Partial<GridOptions>) {\r\n Object.assign(this.grid, newOpts);\r\n this.rect?.remove?.();\r\n this.pattern?.remove?.();\r\n this.init(); // rebuild\r\n }\r\n}\r\n","import { Element, G } from '@svgdotjs/svg.js';\r\nimport NodeSvg from '../src/nodesvg';\r\nimport eventer, { EventSetupFn } from '../util/eventer';\r\nimport WorkspaceSvg from '../src/workspace-svg';\r\n\r\nfunction initXButton(element: Element, args: Record<string, any>): () => void {\r\n\tconst xBtnGroup = element as G;\r\n\tconst ws: WorkspaceSvg = args.workspace;\r\n\r\n\t// click handler\r\n\tconst onClick = () => {\r\n\t\tws.removeNode(args.node);\r\n\t};\r\n\r\n\t// attach\r\n\txBtnGroup.on('click', onClick);\r\n\r\n\t// return cleanup function\r\n\treturn () => {\r\n\t\txBtnGroup.off('click', onClick);\r\n\t};\r\n}\r\n\r\n// register as Kabel event\r\neventer.registerEvent('k_closenode', initXButton as EventSetupFn);\r\n","import { Color, ColorStyle } from \"./visual-types\";\r\n\r\n/**\r\n * Stores color styles for node categories.\r\n * \r\n * Each key is a category name, and the value is a ColorStyle object\r\n * containing colors like primary, secondary, and tertiary.\r\n * \r\n * Example:\r\n * ```ts\r\n * CategoryColors[\"logic\"] = {\r\n * primary: \"#FF0000\",\r\n * secondary: \"#00FF00\",\r\n * tertiary: \"#0000FF\"\r\n * };\r\n * ```\r\n */\r\nconst CategoryColors: { [key: string]: ColorStyle } = {};\r\n\r\nexport default CategoryColors;\r\n","'use strict';\n\n// combine 2 matrixes\n// m1, m2 - [a, b, c, d, e, g]\n//\nfunction combine(m1, m2) {\n return [\n m1[0] * m2[0] + m1[2] * m2[1],\n m1[1] * m2[0] + m1[3] * m2[1],\n m1[0] * m2[2] + m1[2] * m2[3],\n m1[1] * m2[2] + m1[3] * m2[3],\n m1[0] * m2[4] + m1[2] * m2[5] + m1[4],\n m1[1] * m2[4] + m1[3] * m2[5] + m1[5]\n ];\n}\n\n\nfunction Matrix() {\n if (!(this instanceof Matrix)) { return new Matrix(); }\n this.queue = []; // list of matrixes to apply\n this.cache = null; // combined matrix cache\n}\n\n\nMatrix.prototype.matrix = function (m) {\n if (m[0] === 1 && m[1] === 0 && m[2] === 0 && m[3] === 1 && m[4] === 0 && m[5] === 0) {\n return this;\n }\n this.cache = null;\n this.queue.push(m);\n return this;\n};\n\n\nMatrix.prototype.translate = function (tx, ty) {\n if (tx !== 0 || ty !== 0) {\n this.cache = null;\n this.queue.push([ 1, 0, 0, 1, tx, ty ]);\n }\n return this;\n};\n\n\nMatrix.prototype.scale = function (sx, sy) {\n if (sx !== 1 || sy !== 1) {\n this.cache = null;\n this.queue.push([ sx, 0, 0, sy, 0, 0 ]);\n }\n return this;\n};\n\n\nMatrix.prototype.rotate = function (angle, rx, ry) {\n var rad, cos, sin;\n\n if (angle !== 0) {\n this.translate(rx, ry);\n\n rad = angle * Math.PI / 180;\n cos = Math.cos(rad);\n sin = Math.sin(rad);\n\n this.queue.push([ cos, sin, -sin, cos, 0, 0 ]);\n this.cache = null;\n\n this.translate(-rx, -ry);\n }\n return this;\n};\n\n\nMatrix.prototype.skewX = function (angle) {\n if (angle !== 0) {\n this.cache = null;\n this.queue.push([ 1, 0, Math.tan(angle * Math.PI / 180), 1, 0, 0 ]);\n }\n return this;\n};\n\n\nMatrix.prototype.skewY = function (angle) {\n if (angle !== 0) {\n this.cache = null;\n this.queue.push([ 1, Math.tan(angle * Math.PI / 180), 0, 1, 0, 0 ]);\n }\n return this;\n};\n\n\n// Flatten queue\n//\nMatrix.prototype.toArray = function () {\n if (this.cache) {\n return this.cache;\n }\n\n if (!this.queue.length) {\n this.cache = [ 1, 0, 0, 1, 0, 0 ];\n return this.cache;\n }\n\n this.cache = this.queue[0];\n\n if (this.queue.length === 1) {\n return this.cache;\n }\n\n for (var i = 1; i < this.queue.length; i++) {\n this.cache = combine(this.cache, this.queue[i]);\n }\n\n return this.cache;\n};\n\n\n// Apply list of matrixes to (x,y) point.\n// If `isRelative` set, `translate` component of matrix will be skipped\n//\nMatrix.prototype.calc = function (x, y, isRelative) {\n var m;\n\n // Don't change point on empty transforms queue\n if (!this.queue.length) { return [ x, y ]; }\n\n // Calculate final matrix, if not exists\n //\n // NB. if you deside to apply transforms to point one-by-one,\n // they should be taken in reverse order\n\n if (!this.cache) {\n this.cache = this.toArray();\n }\n\n m = this.cache;\n\n // Apply matrix to point\n return [\n x * m[0] + y * m[2] + (isRelative ? 0 : m[4]),\n x * m[1] + y * m[3] + (isRelative ? 0 : m[5])\n ];\n};\n\n\nmodule.exports = Matrix;\n","import WorkspaceSvg from '../src/workspace-svg';\r\nimport userState from '../util/user-state';\r\n\r\ninterface Vec2 { x: number; y: number; }\r\n\r\nexport default class WorkspaceController {\r\n workspace: WorkspaceSvg;\r\n\r\n keysDown: Set<string>;\r\n mouseBtns: Set<number>;\r\n mousePos: Vec2;\r\n lastMousePos: Vec2;\r\n isDragging: boolean;\r\n\r\n wheelDelta: number;\r\n movedListeners: (() => void)[];\r\n _lastMoveFire = 0;\r\n _moveThrottleMs = 100; // bump this to whatever doesn't lag you\r\n _queuedMove = false;\r\n _moveTimeout: any = null;\r\n _updateInt: any;\r\n\r\n constructor(workspace: WorkspaceSvg) {\r\n this.workspace = workspace;\r\n\r\n this.keysDown = new Set();\r\n this.mouseBtns = new Set();\r\n this.mousePos = { x: 0, y: 0 };\r\n this.lastMousePos = { x: 0, y: 0 };\r\n this.isDragging = false;\r\n this.wheelDelta = 0;\r\n this.movedListeners = [];\r\n\r\n this._setupListeners();\r\n\r\n this._updateInt = setInterval(() => this.update(), 16);\r\n }\r\n addMoveListener(cb: () => void) {\r\n this.movedListeners.push(cb);\r\n }\r\n\r\n removeMoveListener(cb: () => void) {\r\n const i = this.movedListeners.indexOf(cb);\r\n if (i !== -1) this.movedListeners.splice(i, 1);\r\n }\r\n\r\n fireDidMove() {\r\n if (typeof queueMicrotask !== 'undefined') {\r\n queueMicrotask(() => {\r\n for (let cb of this.movedListeners) {\r\n try { cb(); } catch (e) { console.error(e); }\r\n }\r\n });\r\n } else {\r\n Promise.resolve().then(() => {\r\n for (let cb of this.movedListeners) {\r\n try { cb(); } catch (e) { console.error(e); }\r\n }\r\n });\r\n }\r\n }\r\n\r\n _throttledFireDidMove() {\r\n const now = performance.now();\r\n\r\n // enough time passed → fire instantly\r\n if (now - this._lastMoveFire >= this._moveThrottleMs) {\r\n this._lastMoveFire = now;\r\n this.fireDidMove();\r\n return;\r\n }\r\n\r\n // otherwise queue ONE fire\r\n if (!this._queuedMove) {\r\n this._queuedMove = true;\r\n const wait = this._moveThrottleMs - (now - this._lastMoveFire);\r\n\r\n this._moveTimeout = setTimeout(() => {\r\n this._queuedMove = false;\r\n this._lastMoveFire = performance.now();\r\n this.fireDidMove();\r\n }, wait);\r\n }\r\n }\r\n getZoom() {\r\n return 1;\r\n }\r\n canMove() {\r\n return true;\r\n }\r\n private _setupListeners() {\r\n window.addEventListener('keydown', e => this.keysDown.add(e.key));\r\n window.addEventListener('keyup', e => this.keysDown.delete(e.key));\r\n\r\n window.addEventListener('mousedown', e => this.mouseBtns.add(e.button));\r\n window.addEventListener('mouseup', e => this.mouseBtns.delete(e.button));\r\n\r\n window.addEventListener('mousemove', e => {\r\n this.lastMousePos = { ...this.mousePos };\r\n this.mousePos = { x: e.clientX, y: e.clientY };\r\n });\r\n\r\n window.addEventListener('wheel', e => {\r\n this.wheelDelta = e.deltaY;\r\n });\r\n\r\n window.addEventListener('mousedown', e => {\r\n if (e.button === 0) this.isDragging = true;\r\n });\r\n window.addEventListener('mouseup', e => {\r\n if (e.button === 0) this.isDragging = false;\r\n });\r\n }\r\n\r\n update() {\r\n // Can handle keyboard shortcuts or auto-pan here\r\n }\r\n\r\n // --- Camera methods ---\r\n pan(dx: number, dy: number) {\r\n const x = this.workspace._camera.x, y = this.workspace._camera.y;\r\n this.workspace._camera.x += dx;\r\n this.workspace._camera.y += dy;\r\n if (x == this.workspace._camera.x && y == this.workspace._camera.y) {\r\n return;\r\n }\r\n this._throttledFireDidMove();\r\n this.workspace.didMove = true;\r\n this.workspace.fireMoveListeners();\r\n this.refreshPos();\r\n }\r\n\r\n setCamera(pos: Vec2) {\r\n const x = this.workspace._camera.x, y = this.workspace._camera.y;\r\n this.workspace._camera.x = pos.x;\r\n this.workspace._camera.y = pos.y;\r\n if (x == this.workspace._camera.x && y == this.workspace._camera.y) {\r\n return;\r\n }\r\n this._throttledFireDidMove();\r\n this.workspace.didMove = true;\r\n this.workspace.fireMoveListeners();\r\n this.refreshPos();\r\n }\r\n\r\n centerOn(pos: Vec2) {\r\n const wsSize = this.workspace.getSize?.() ?? { width: 0, height: 0 };\r\n this.setCamera({\r\n x: pos.x - wsSize.width / 2,\r\n y: pos.y - wsSize.height / 2\r\n });\r\n }\r\n\r\n\r\n\r\n // --- Coordinate conversion ---\r\n screenToWorkspace(x: number, y: number): Vec2 {\r\n const cam = this.workspace._camera;\r\n return {\r\n x: x + cam.x,\r\n y: y + cam.y\r\n };\r\n }\r\n\r\n workspaceToScreen(x: number, y: number): Vec2 {\r\n const cam = this.workspace._camera;\r\n return {\r\n x: (x - cam.x),\r\n y: (y - cam.y)\r\n };\r\n }\r\n\r\n // --- Refresh ---\r\n refreshPos() {\r\n this.workspace.refresh?.();\r\n }\r\n\r\n redraw() {\r\n this.workspace.redraw?.();\r\n }\r\n\r\n // --- Cleanup ---\r\n stop() {\r\n clearInterval(this._updateInt);\r\n }\r\n}\r\n","\r\nimport { Path as SvgPath, StrokeData, G } from \"@svgdotjs/svg.js\";\r\nimport * as Path from '../../util/path'\r\nimport { ColorStyle, Hex } from \"../../src/visual-types\";\r\nimport WorkspaceSvg from \"../../src/workspace-svg\";\r\nimport Renderer, { DrawState, NodeMeasurements } from \"../renderer\"; // Saying the value of \"Renderer\" is undefined when it's clearly defined and theres no circular refs.\r\nimport ApolloConstants from \"./constants\";\r\nimport { parseColor } from \"../../util/parse-color\";\r\nimport eventer from \"../../util/eventer\";\r\nimport NodeSvg from \"../../src/nodesvg\";\r\nimport Connection from \"../../src/connection\";\r\nimport { AnyField, FieldRawBoxData } from \"../../src/field\";\r\nconsole.log(Renderer);\r\n\r\nfunction darkenColor(hex: string, amount: number = 0.2): string {\r\n // Remove # if present\r\n hex = hex.replace(/^#/, \"\");\r\n\r\n // Parse r, g, b\r\n const r = parseInt(hex.substring(0, 2), 16);\r\n const g = parseInt(hex.substring(2, 4), 16);\r\n const b = parseInt(hex.substring(4, 6), 16);\r\n\r\n // Darken each channel\r\n const newR = Math.max(0, Math.floor(r * (1 - amount)));\r\n const newG = Math.max(0, Math.floor(g * (1 - amount)));\r\n const newB = Math.max(0, Math.floor(b * (1 - amount)));\r\n\r\n // Convert back to hex and pad with 0s\r\n const toHex = (c: number) => c.toString(16).padStart(2, \"0\");\r\n\r\n return `#${toHex(newR)}${toHex(newG)}${toHex(newB)}`;\r\n}\r\n\r\n\r\n\r\n\r\n/**\r\n * ApolloRenderer\r\n * \r\n * Custom renderer extending the base `Renderer` for a visual programming workspace.\r\n * This renderer provides a distinct node style:\r\n * - Node background uses the primary color entirely\r\n * - Topbar is hidden (but still present for dragging)\r\n * - Bottom-right dog-ear decoration\r\n * - Previous connection at the top, next connection at the bottom\r\n */\r\nclass ApolloRenderer extends Renderer {\r\n declare _constants: ApolloConstants;\r\n\r\n static get NAME() {\r\n return 'apollo';\r\n }\r\n static get ElEMENT_TAG() {\r\n return 'ApolloElement';\r\n }\r\n /**\r\n * Constructor\r\n * @param workspace - The WorkspaceSvg instance\r\n * @param overrides - Partial constant overrides for ApolloConstants\r\n */\r\n constructor(workspace: WorkspaceSvg, overrides: Partial<ApolloConstants>) {\r\n super(workspace, overrides);\r\n }\r\n\r\n /** \r\n * Typed getter for renderer constants\r\n */\r\n get constants(): ApolloConstants {\r\n return super.constants as ApolloConstants;\r\n }\r\n\r\n /** Initialize constants using Apollo-specific overrides */\r\n initConstants() {\r\n this._constants = new ApolloConstants(this.constantOverrides);\r\n }\r\n\r\n /**\r\n * Draws the node's topbar.\r\n * Overridden to hide the topbar visually while retaining its group for dragging.\r\n * @param state - Current draw state\r\n * @param colors - Node colors\r\n * @param measurements - Node dimensions\r\n */\r\n drawNodeTopbar(state: DrawState, colors: ColorStyle, measurements: NodeMeasurements | null) {\r\n const c = this.constants;\r\n const width = measurements?.width ?? c.NODE_BASE_WIDTH;\r\n const radius = c.CORNER_RADIUS;\r\n\r\n state.topbar = state.group!.path(Path.roundedRect(width, c.TOPBAR_HEIGHT, radius))\r\n .fill('transparent');\r\n }\r\n\r\n /**\r\n * Draws the node background with rounded corners and bottom-right dog-ear cut.\r\n * Also creates a shadow.\r\n * @param state - Current draw state\r\n * @param measurements - Node dimensions\r\n */\r\n drawNodeBase(state: DrawState, measurements: NodeMeasurements | null) {\r\n const c = this.constants;\r\n const width = measurements?.width ?? c.NODE_BASE_WIDTH;\r\n const height = measurements?.height ?? c.NODE_BASE_HEIGHT;\r\n const r = c.CORNER_RADIUS;\r\n\r\n const dogear = this.constants.SHAPES.Dogear;\r\n const cutW = dogear?.Width ?? 0;\r\n const cutH = dogear?.Height ?? 0;\r\n\r\n // Rounded rect with bottom-right cut\r\n const roundedRect = `M${r},0 H${width - r} Q${width},0 ${width},${r} V${height - cutH} L${width - cutW},${height} H${r} Q0,${height} 0,${height - r} V${r} Q0,0 ${r},0 Z`;\r\n\r\n const colors = this.getNodeColors();\r\n const primary = parseColor(colors.primary) as string;\r\n const stroke = parseColor(colors.secondary) as string;\r\n\r\n // Node background\r\n state.bg = state.group!.path(roundedRect)\r\n .fill(primary)\r\n .stroke({ color: stroke, width: 2 });\r\n\r\n // Dog-ear decoration\r\n this.drawDogEar(state, state.group as G, width, height, colors);\r\n\r\n // Node shadow\r\n state.shadow = state.group!.path(roundedRect)\r\n .fill('rgba(0,0,0,0.2)')\r\n .stroke('none')\r\n .attr({ 'pointer-events': 'none' })\r\n .move(Number(state.bg.x()) + 5, Number(state.bg.y()) + 5)\r\n .back();\r\n }\r\n\r\n /**\r\n * Draws a dog-ear decoration at the node's bottom-right corner\r\n * @param state - Current draw state\r\n * @param nodeG - Node's SVG group\r\n * @param w - Node width\r\n * @param h - Node height\r\n * @param colors - Node colors\r\n */\r\n drawDogEar(state: DrawState, nodeG: G, w: number, h: number, colors: ColorStyle) {\r\n const pathDef = this.constants.SHAPES.Dogear?.PathMain;\r\n if (!pathDef) return;\r\n\r\n const dogEar = nodeG.path(pathDef)\r\n .fill(parseColor(colors.secondary) as string)\r\n .stroke({ color: parseColor(colors.tertiary) as string, width: 1 } as StrokeData);\r\n\r\n const offsetX = w - this.constants.SHAPES.Dogear!.Width;\r\n const offsetY = h - this.constants.SHAPES.Dogear!.Height;\r\n dogEar.move(offsetX, offsetY);\r\n dogEar.front();\r\n }\r\n\r\n /**\r\n * Draws previous and next connections for the node.\r\n * Previous connection is on top, next is on bottom.\r\n * @param state - Draw state\r\n * @param node - NodeSvg instance\r\n * @param nodeGroup - Node's SVG group\r\n * @param measurements - Node dimensions\r\n */\r\n drawPreviousNextConnections(state: DrawState, node: NodeSvg, nodeGroup: G, measurements: { width: number, height: number } | null = null) {\r\n if (!state || !node || !state.bg) return;\r\n\r\n const c = this.constants;\r\n const colors: ColorStyle = this.getNodeColors();\r\n const bbox = state.bg.bbox();\r\n\r\n // Top connector (previous)\r\n if (node.previousConnection) {\r\n const c1 = this.drawPrimaryConnector(nodeGroup, state.bg, 'top', parseColor(this._constants.CONNECTOR_COLOR) as string);\r\n if (c1) {\r\n const conn = {\r\n from: node.previousConnection,\r\n to: this.resolveConnectable(node.previousConnection.getFrom(), node.previousConnection) as Connection,\r\n fromCircle: c1 as SvgPath,\r\n originConn: node.previousConnection,\r\n originCircle: c1\r\n };\r\n this.setConnect(conn);\r\n eventer.addElement(c1, 'k_connectbubble', { connection: node.previousConnection, node })\r\n .tagElement(c1, [(this.constructor as typeof Renderer).ELEMENT_TAG, `node_${node.id}`]);\r\n this._fillOtherNodeConnectorCircle(node.previousConnection, c1 as SvgPath, true);\r\n }\r\n }\r\n\r\n // Bottom connector (next)\r\n if (node.nextConnection) {\r\n const c2 = this.drawPrimaryConnector(nodeGroup, state.bg, 'bottom', parseColor(this._constants.CONNECTOR_COLOR) as string);\r\n if (c2) {\r\n const conn = {\r\n from: node.nextConnection,\r\n to: this.resolveConnectable(node.nextConnection.getTo(), node.nextConnection) as Connection,\r\n fromCircle: c2 as SvgPath,\r\n originConn: node.nextConnection,\r\n originCircle: c2\r\n };\r\n this.setConnect(conn);\r\n eventer.addElement(c2, 'k_connectbubble', { connection: node.nextConnection, node })\r\n .tagElement(c2, [(this.constructor as typeof Renderer).ELEMENT_TAG, `node_${node.id}`]);\r\n this._fillOtherNodeConnectorCircle(node.nextConnection, c2 as SvgPath, false);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Draws a primary connector (triangle or circle) on either the top or bottom edge.\r\n * @param nodeGroup - Node's SVG group\r\n * @param nodeBg - Node background path\r\n * @param side - 'top' or 'bottom'\r\n * @param color - Connector color\r\n * @returns SvgPath of the connector\r\n */\r\n drawPrimaryConnector(nodeGroup: G, nodeBg: SvgPath, side: 'top' | 'bottom', color: string): SvgPath | void {\r\n const c = this.constants;\r\n if (!nodeGroup || !nodeBg) return;\r\n\r\n const bbox = nodeBg.bbox();\r\n const triSize = c.CONNECTOR_TRI_SIZE;\r\n const radius = c.CONNECTOR_RADIUS;\r\n const x = bbox.width / 2;\r\n let y: number;\r\n let element: SvgPath;\r\n\r\n if (c.CONNECTOR_TRIANGLE) {\r\n let path = Path.roundedTri(triSize, triSize, 1);\r\n if (side === 'top') y = -triSize;\r\n else { y = bbox.height; path = Path.rotatePath(path, 180, triSize / 2, triSize / 2); }\r\n\r\n element = nodeGroup.path(path)\r\n .fill(parseColor(color as Hex))\r\n .stroke({ color: parseColor('#00000000'), width: 0 })\r\n .transform({ translateX: x - triSize / 2, translateY: y });\r\n } else {\r\n const circlePath = Path.circle(radius);\r\n y = side === 'top' ? 0 : bbox.height;\r\n\r\n element = nodeGroup.path(circlePath)\r\n .fill(parseColor(color as Hex))\r\n .stroke({ color: parseColor('#00000000'), width: 0 })\r\n .move(x - radius, y - radius);\r\n }\r\n\r\n element.attr({ class: (this.constructor as typeof Renderer).CONNECTOR_TAG });\r\n return element;\r\n }\r\n /**\r\n * Draws a raw input field.\r\n * @param fieldGroup - The SVG group element for the field.\r\n * @param field - The field to draw.\r\n * @param startX - The starting X position for the field.\r\n * @returns The rectangle and text elements of the raw field.\r\n */\r\n drawFieldRaw(fieldGroup: G, field: AnyField, startX: number = 0) {\r\n const c = this.constants;\r\n const value = field.getDisplayValue?.() ?? \"\";\r\n const { width, height } = this.measureRawField(value);\r\n\r\n // Draw the rectangle\r\n const rect = fieldGroup.rect(width, height)\r\n .fill(parseColor(c.FIELD_RAW_COLOR))\r\n .stroke({ color: parseColor(c.FIELD_RAW_OUTLINE_COLOR), width: c.FIELD_RAW_OUTLINE_STROKE })\r\n .radius(20);\r\n\r\n // Draw the text\r\n const txt = fieldGroup.text(value)\r\n .font({\r\n family: c.FONT_FAMILY,\r\n size: c.FONT_SIZE,\r\n anchor: 'start'\r\n })\r\n .fill(parseColor(c.FIELD_RAW_TEXT_COLOR));\r\n txt.node.style.userSelect = 'none';\r\n\r\n const rawBox: FieldRawBoxData = { box: rect, txt };\r\n\r\n // Measure text dimensions\r\n const textBBox = txt.bbox();\r\n\r\n // Vertical centering\r\n const offsetY = (height - textBBox.height) / 2;\r\n\r\n // Horizontal centering with padding\r\n const paddedWidth = width - 2 * c.INPUT_BOX_PADDING;\r\n const offsetX = startX + c.INPUT_BOX_PADDING + Math.max(0, (paddedWidth - textBBox.width) / 2);\r\n\r\n // Move elements\r\n rect.move(startX, 0);\r\n txt.move(offsetX, offsetY);\r\n\r\n // Add event listener\r\n eventer.addElement(rect, \"k_inputbox\", {\r\n field,\r\n text: txt,\r\n renderer: this,\r\n startX\r\n }).tagElement(rect, [(this.constructor as typeof Renderer).ELEMENT_TAG, `node_${this.node!.id}`]);\r\n\r\n return { rect, txt, rawBox };\r\n }\r\n\r\n /**\r\n * Draws the full node (base, topbar, fields, connectors, label, etc.)\r\n */\r\n drawNode() {\r\n if (!this.node) return;\r\n\r\n const colors = this.getNodeColors();\r\n const node = this.node;\r\n const state = this.drawState(this.createNodeGroup(node), node.id);\r\n this._nodeDraw = state;\r\n\r\n const measurements = this.measureNodeDimensions();\r\n if (!measurements) return;\r\n\r\n this.drawNodeBase(state, measurements as NodeMeasurements);\r\n this.drawNodeTopbar(state, colors, measurements as NodeMeasurements);\r\n this.drawNodeXButton();\r\n this.drawNodeLabel(state.group!);\r\n this.makeNodeDraggable(state.group!, state.topbar!, node);\r\n\r\n this.createFieldGroup(state);\r\n this.drawAllFieldsForNode(measurements as NodeMeasurements);\r\n this.drawPreviousNextConnections(state, node, state.group!, measurements as NodeMeasurements);\r\n }\r\n}\r\n\r\n\r\nexport default ApolloRenderer;","import NodePrototypes from \"./prototypes\";\r\nimport newHeadlessNode from \"./headless-node\";\r\nimport Widget from \"./widget\";\r\nimport WidgetPrototypes from \"./widget-prototypes\";\r\nimport CommentModel from \"./comment\";\r\nimport UndoRedoHistory from \"./undo-redo\";\r\nimport { ConnectableField } from \"./field\";\r\n\r\n/**\r\n * Headless workspace that holds nodes, widgets, and comments without any rendering or camera.\r\n */\r\nclass Workspace {\r\n\t_nodeDB: Map<string, any>; // Node storage\r\n\t_widgetDB: Map<string, Widget>;\r\n\t_commentDB: Set<CommentModel>;\r\n isHeadless: boolean = true;\r\n\tconstructor() {\r\n\t\tthis._nodeDB = new Map();\r\n\t\tthis._widgetDB = new Map();\r\n\t\tthis._commentDB = new Set();\r\n\t}\r\n\r\n\t/** Node management */\r\n\taddNode(node: any, nodeId?: string) {\r\n\t\tconst id = nodeId || node.id;\r\n\t\tif (this._nodeDB.has(id)) {\r\n\t\t\tconsole.warn(`Node with id ${id} already exists, overwriting.`);\r\n\t\t}\r\n\t\tif (node.workspace !== this) node.workspace = this;\r\n\t\tthis._nodeDB.set(id, node);\r\n\t}\r\n\r\n\tnewNode(type: keyof typeof NodePrototypes, add: boolean = true) {\r\n\t\tif (!NodePrototypes[type]) return;\r\n\t\tconst node = newHeadlessNode(type as string);\r\n\t\tif (!node) return;\r\n\t\tif (add) this.addNode(node);\r\n\t\treturn node;\r\n\t}\r\n\r\n\tspawnAt(type: keyof typeof NodePrototypes, x: number, y: number) {\r\n\t\tconst node = this.newNode(type, false);\r\n\t\tif (!node) return;\r\n\t\tnode.relativeCoords.set(x, y);\r\n\t\tthis.addNode(node);\r\n\t\treturn node;\r\n\t}\r\n\r\n\tgetNode(id: string | any) {\r\n\t\tif (id instanceof Object && id.id) return id;\r\n\t\treturn this._nodeDB.get(id);\r\n\t}\r\n\r\n\tremoveNodeById(id: string) {\r\n\t\tconst node = this._nodeDB.get(id);\r\n\t\tif (!node) return;\r\n\t\tthis.derefNode(node);\r\n\t\tthis._nodeDB.delete(id);\r\n\t}\r\n\r\n\tremoveNode(node: any) {\r\n\t\tif (!node) return;\r\n\t\tthis.removeNodeById(node.id);\r\n\t}\r\n\r\n\tderefNode(node: any) {\r\n\t\tconst prev = node.previousConnection?.getFrom?.();\r\n\t\tif (prev?.nextConnection) prev.nextConnection.disconnectTo?.();\r\n\t\tconst next = node.nextConnection?.getTo?.();\r\n\t\tif (next?.previousConnection) next.previousConnection.disconnectFrom?.();\r\n\r\n\t\tfor (let field of node.allFields()) {\r\n\t\t\tif ((field as ConnectableField).hasConnectable?.()) {\r\n\t\t\t\t(field as ConnectableField).disconnect();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/** Widget management */\r\n\tnewWidget(type: string): Widget | void {\r\n\t\tconst opts = WidgetPrototypes[type];\r\n\t\tif (!opts) return;\r\n\t\tconst wdgt = opts.cls ? new opts.cls(this, opts) : new Widget(this, opts);\r\n\t\tthis._widgetDB.set(wdgt.id, wdgt);\r\n\t\treturn wdgt;\r\n\t}\r\n\r\n\tgetWidget(id: string): Widget | undefined {\r\n\t\treturn this._widgetDB.get(id);\r\n\t}\r\n\r\n\t/** Comment management */\r\n\taddComment() {\r\n\t\tconst model = new CommentModel(this);\r\n\t\tthis._commentDB.add(model);\r\n\t\treturn model;\r\n\t}\r\n\r\n\tgetComment(id: string) {\r\n\t\treturn Array.from(this._commentDB).find(e => e.id === id);\r\n\t}\r\n\r\n\tremoveComment(commentOrId: CommentModel | string) {\r\n\t\tlet comment: CommentModel | undefined;\r\n\t\tif (typeof commentOrId === \"string\") comment = this.getComment(commentOrId);\r\n\t\telse comment = commentOrId;\r\n\t\tif (!comment) return false;\r\n\t\tthis._commentDB.delete(comment);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tgetComments() {\r\n\t\treturn Array.from(this._commentDB);\r\n\t}\r\n\r\n /**\r\n * Internal: Add widget to DB\r\n * @param wdgt - The widget\r\n */\r\n _addWidgetToDB(wdgt: Widget) {\r\n this._widgetDB.set(wdgt.id, wdgt);\r\n }\r\n /**\r\n * Internal: Delete a widget from DB.\r\n * @param wdgt - Widget to delete\r\n */\r\n _delWidgetFromDB(wdgt: Widget) {\r\n this._widgetDB.delete(wdgt.id);\r\n }\r\n \r\n\t/** Serialization */\r\n\tfromJson(json: { nodes: any[]; circular: boolean }, recordBigEvent: boolean = false) {\r\n\t\tfor (let [, node] of this._nodeDB.entries()) this.removeNode(node);\r\n\r\n\t\tif (json.circular) {\r\n\t\t\tfor (let node of json.nodes) {\r\n\t\t\t\t(node.constructor as any).deserialize(node, this);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tfor (let node of json.nodes) {\r\n\t\t\t\t(node.constructor as any).fromJson(node, this);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\ttoJson(circular: boolean) {\r\n\t\tconst nodes = [];\r\n\t\tfor (let [, node] of this._nodeDB) {\r\n\t\t\tif (node.topLevel) nodes.push(circular ? node.serialize() : node.toJson());\r\n\t\t}\r\n\t\treturn { circular, nodes };\r\n\t}\r\n}\r\n\r\nexport default Workspace;\r\n","class Styler {\r\n\tprivate styles: Map<string, HTMLStyleElement>;\r\n\r\n\tconstructor() {\r\n\t\tthis.styles = new Map();\r\n\t}\r\n\r\n\tappendStyles(id: string, css: string): void {\r\n\t\tif (this.styles.has(id)) return; // Do not append if id exists\r\n\r\n\t\tconst styleEl = document.createElement('style');\r\n\t\tstyleEl.id = id;\r\n\t\tstyleEl.textContent = css;\r\n\t\tdocument.head.appendChild(styleEl);\r\n\t\tthis.styles.set(id, styleEl);\r\n\t}\r\n\r\n\tremoveStyles(id: string): void {\r\n\t\tconst styleEl = this.styles.get(id);\r\n\t\tif (!styleEl) return;\r\n\r\n\t\tstyleEl.remove();\r\n\t\tthis.styles.delete(id);\r\n\t}\r\n\r\n\tupdateStyles(id: string, css: string): void {\r\n\t\tconst styleEl = this.styles.get(id);\r\n\t\tif (!styleEl) return;\r\n\r\n\t\tstyleEl.textContent = css;\r\n\t}\r\n\r\n\thasStyles(id: string): boolean {\r\n\t\treturn this.styles.has(id);\r\n\t}\r\n}\r\nexport {\r\n Styler\r\n}\r\nconst styler = new Styler();\r\nexport default styler;","import WorkspaceController from \"../controllers/base\";\r\nimport Renderer from \"../renderers/renderer\";\r\nimport { clearMainWorkspace, getMainWorkspace, setMainWorkspace } from \"./main-workspace\";\r\nimport WorkspaceSvg, { WSTheme } from \"./workspace-svg\";\r\nimport NodePrototypes from \"./prototypes\"; // Object\r\nimport { FieldOptions } from \"./field\";\r\nimport { Color, Hex } from \"./visual-types\";\r\nimport styler from '../util/styler';\r\n// @ts-ignore\r\nimport _kabelStyles from './styles.css';\r\nimport env from \"../util/env\";\r\n\r\nconst kabelStyles: string = _kabelStyles;\r\n\r\n/**\r\n * Represents a field in a toolbox node.\r\n * Can contain any extra properties as needed by the field type.\r\n */\r\nexport interface TblxFieldStruct {\r\n /** Field value */\r\n value: any;\r\n\r\n /** Additional field-specific properties */\r\n [key: string]: any;\r\n}\r\n\r\n/**\r\n * Represents a node in a toolbox.\r\n */\r\nexport interface TblxNodeStruct {\r\n /** Node type (matches NodePrototypes key or arbitrary string) */\r\n type: keyof typeof NodePrototypes | string;\r\n\r\n /** Map of field names to field data */\r\n arguments: {\r\n [key: string]: TblxFieldStruct;\r\n };\r\n}\r\n\r\n/**\r\n * Represents a category in the toolbox, which contains multiple nodes.\r\n */\r\nexport interface TblxCategoryStruct {\r\n /** Category name */\r\n name: string;\r\n\r\n /** Category color */\r\n color: Color;\r\n\r\n /** Nodes contained in this category */\r\n contents: TblxNodeStruct[];\r\n}\r\n\r\n/**\r\n * Discriminated union type representing possible toolbox structures.\r\n * Can be a flyout (list of nodes) or a categorized toolbox.\r\n */\r\nexport type TblxObjStruct =\r\n | {\r\n /** Flyout toolbox type */\r\n type: 'flyout';\r\n contents: TblxNodeStruct[];\r\n }\r\n | {\r\n /** Categorized toolbox type */\r\n type?: 'category';\r\n contents: TblxCategoryStruct[];\r\n }\r\n | {\r\n /** When type is omitted, defaults to categories */\r\n type?: undefined;\r\n contents: TblxCategoryStruct[];\r\n };\r\nexport interface GridOptions {\r\n /**\r\n * The grid's type.\r\n * 'celled' - The grid is celled.\r\n * 'dotted' - The grid is dotted.\r\n */\r\n\ttype: 'celled' | 'dotted';\r\n /**\r\n * Spacing, optional. Default is 40.\r\n */\r\n\tspacing?: number;\r\n /**\r\n * Dot size for 'dotted' grid type.\r\n */\r\n\tdotSize?: number;\r\n /**\r\n * stroke width for 'celled' grid type.\r\n */\r\n\tstrokeWidth?: number;\r\n /**\r\n * Option color for any grid type. Color is #bebebeff by default.\r\n */\r\n color?: Hex\r\n}\r\n/**\r\n * Options used when injecting a new workspace.\r\n */\r\nexport interface InjectOptions {\r\n /** Optional renderer overrides */\r\n rendererOverrides?: { [key: string]: any };\r\n /** Theme for the workspace */\r\n theme?: string|WSTheme;\r\n /** Optional custom controller class */\r\n Controller?: typeof WorkspaceController;\r\n /** Init the workspace's undo state for you, or not. */\r\n initUndoRedo?: boolean;\r\n /** Optional controls configuration */\r\n controls?: {\r\n zoomSpeed?: number;\r\n minZoom?: number;\r\n maxZoom?: number;\r\n wasd?: boolean;\r\n wasdSmooth?: boolean;\r\n wasdAccelerate?: number;\r\n wasdFriction?: number;\r\n };\r\n\r\n /** Optional toolbox structure */\r\n toolbox?: TblxObjStruct;\r\n\r\n /** Optional movement speed of the workspace */\r\n moveSpeed?: number;\r\n\r\n /** Optional renderer: name string or class */\r\n renderer?: string | typeof Renderer;\r\n /**\r\n * Optional grid settings.\r\n */\r\n grid?: GridOptions;\r\n}\r\n\r\n/**\r\n * Utility class for logging injection messages in a structured way.\r\n */\r\nexport class InjectMsg {\r\n /** Message content */\r\n msg: string;\r\n\r\n /**\r\n * Creates a new InjectMsg instance.\r\n * @param msg - Message text\r\n */\r\n constructor(msg: string) {\r\n this.msg = msg;\r\n }\r\n\r\n /** Log as error */\r\n err() {\r\n console.error(`Failed to inject workspace: ${this.msg}`);\r\n }\r\n\r\n /** Log as warning */\r\n wrn() {\r\n console.warn(`Inject warning: ${this.msg}`);\r\n }\r\n\r\n /** Log as info */\r\n info() {\r\n console.info(`Inject info: ${this.msg}`);\r\n }\r\n}\r\n\r\n/**\r\n * Injects a new Kabel workspace into the document.\r\n * Appends the workspace container to the given element (or element ID) and\r\n * sets it as the main workspace.\r\n *\r\n * @param element - HTMLElement or string ID to attach the workspace to\r\n * @param options - Optional InjectOptions to configure the workspace\r\n * @returns The newly created WorkspaceSvg instance, or undefined if injection failed\r\n */\r\nexport default function inject(\r\n element: HTMLElement | string,\r\n options: InjectOptions = {}\r\n): WorkspaceSvg | undefined {\r\n if (!env.isBrowser) {\r\n new InjectMsg(`Cannot inject workspace-svg in non-browser environment (use Kabel.injectHeadless).`).err();\r\n return;\r\n }\r\n // Apply global Kabel styles\r\n styler.appendStyles('KabelStyles', kabelStyles);\r\n\r\n const root =\r\n typeof element === 'string'\r\n ? document.querySelector(`#${element}`) as HTMLElement\r\n : element as HTMLElement;\r\n\r\n if (!root) {\r\n new InjectMsg(`Document does not contain root element (Check element ID).`).err();\r\n return;\r\n }\r\n\r\n if (!document.contains(root)) {\r\n new InjectMsg(`Document does not contain root element.`).err();\r\n return;\r\n }\r\n\r\n // Create workspace wrapper element\r\n const wsTop = document.createElement('div');\r\n wsTop.className = `KabelWorkspaceWrapper`;\r\n root.appendChild(wsTop);\r\n\r\n // Initialize workspace\r\n const ws = new WorkspaceSvg(root, wsTop, options);\r\n\r\n // Set as the main workspace globally\r\n setMainWorkspace(ws);\r\n\r\n return ws;\r\n}\r\n","import { NodePrototype } from \"./node-types\";\r\nimport NodeSvg from \"./nodesvg\";\r\nimport NodePrototypes from \"./prototypes\";\r\n\r\n/**\r\n * Creates a new headless NodeSvg instance without attaching it to a workspace.\r\n * This is useful for programmatic node generation, testing, or serialization.\r\n *\r\n * @param type - The type of node to create. Must exist in NodePrototypes.\r\n * @returns The initialized NodeSvg instance, or `undefined` if the prototype does not exist.\r\n */\r\nfunction newHeadlessNode(type: string): NodeSvg | undefined {\r\n const proto: NodePrototype = NodePrototypes[type as string] as NodePrototype;\r\n\r\n // Return undefined if prototype not found\r\n if (!proto) return;\r\n\r\n // Create a new node instance\r\n const node = new NodeSvg(proto);\r\n\r\n // Initialize the node (calls prototype init, sets defaults)\r\n node.init();\r\n\r\n return node;\r\n}\r\n\r\nexport default newHeadlessNode;\r\n","const isNode = typeof process !== 'undefined' && !!process.versions?.node;\r\nconst isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';\r\nconst isWebWorker = typeof self !== 'undefined' && typeof self.importScripts === 'function';\r\n\r\nconst env: {\r\n isBrowser: boolean;\r\n isNode: boolean;\r\n isWebWorker: boolean;\r\n} = { isNode, isBrowser, isWebWorker };\r\n\r\nexport default env;","import Connection, { Connectable } from \"./connection\";\r\nimport { NodePrototype } from \"./node-types\";\r\nimport { ColorStyle, Color } from './visual-types';\r\nimport hasProp from '../util/has-prop';\r\nimport Field, { AnyField, AnyFieldCls, DummyField, FieldMap, FieldOptions } from \"./field\";\r\nimport CategoryColors from \"./colors\";\r\nimport Coordinates from \"./coordinates\";\r\nimport { generateUID } from \"../util/uid\";\r\nimport EventEmitter from '../util/emitter';\r\nimport { G } from \"@svgdotjs/svg.js\";\r\nimport WorkspaceSvg from \"./workspace-svg\";\r\nimport RendererConstants from \"../renderers/constants\";\r\nimport CommentModel, { CommentSerialized } from \"./comment\";\r\nimport { RepresenterNode } from '../renderers/representer-node';\r\nimport NodePrototypes from \"./prototypes\";\r\n/**\r\n * Represents the JSON structure used to initialize a field on a node.\r\n * Each field has a type, label, and name. Additional properties can be included for field-specific configuration.\r\n */\r\nexport interface InputFieldJson {\r\n /** Human-readable label for the field, shown on the node UI */\r\n label: string;\r\n\r\n /** Field type identifier, corresponding to a field constructor in FieldMap */\r\n type: string;\r\n\r\n /** Unique field name within the node */\r\n name: string;\r\n\r\n /**\r\n * Optional additional properties for field initialization.\r\n * Can include type-specific options like min/max for number fields,\r\n * default values, dropdown options, etc.\r\n */\r\n [key: string]: any;\r\n}\r\n\r\n/**\r\n * Represents a JSON structure for initializing a NodeSvg instance.\r\n * Includes colors, connections, label, fields, category, and type information.\r\n */\r\nexport interface NodeJson {\r\n /** Primary color of the node (e.g., top bar, main connections) */\r\n primaryColor?: Color | undefined;\r\n\r\n /** Secondary color of the node (e.g., field backgrounds) */\r\n secondaryColor?: Color | undefined;\r\n\r\n /** Tertiary color of the node (e.g., outlines) */\r\n tertiaryColor?: Color | undefined;\r\n\r\n /**\r\n * Optional previous connection data.\r\n * Presence triggers creation of a previous connection when initializing NodeSvg.\r\n */\r\n previousConnection?: any | undefined;\r\n\r\n /**\r\n * Optional next connection data.\r\n * Presence triggers creation of a next connection when initializing NodeSvg.\r\n */\r\n nextConnection?: any | undefined;\r\n\r\n /** Optional node label text to display */\r\n labelText?: string | undefined;\r\n\r\n /** Array of field definitions (InputFieldJson) to attach to this node */\r\n arguments?: InputFieldJson[] | undefined;\r\n\r\n /** Optional category name for color theming */\r\n category?: string | undefined;\r\n\r\n /** Node type identifier, used to look up the NodePrototype */\r\n type: string;\r\n}\r\n\r\n/**\r\n * Represents a fully serialized node including its fields, colors, coordinates, connections, and optional comment.\r\n * Used for saving or transferring node data.\r\n */\r\nexport interface SerializedNode {\r\n /** Node type string */\r\n type: string;\r\n\r\n /** Unique node ID */\r\n id: string;\r\n\r\n /** Display label of the node */\r\n label: string;\r\n\r\n /** Node colors including primary, secondary, tertiary, and category */\r\n colors: ColorStyle;\r\n\r\n /** Coordinates of the node relative to its workspace */\r\n relativeCoords: { x: number; y: number };\r\n\r\n /** Optional comment text attached to the node */\r\n comment?: CommentSerialized | undefined;\r\n\r\n /** Array of serialized fields, may contain any field-specific structure */\r\n fields?: any[] | undefined;\r\n\r\n /**\r\n * Serialized representation of the previous connection.\r\n * If `field` is true, the connection originates from a field rather than a node.\r\n */\r\n previousConnection?: { field?: boolean | undefined; node?: SerializedNode | undefined } | undefined;\r\n\r\n /**\r\n * Serialized representation of the next connection.\r\n * If `field` is true, the connection originates from a field rather than a node.\r\n */\r\n nextConnection?: { field?: boolean | undefined; node?: SerializedNode | undefined } | undefined;\r\n}\r\n\r\n/**\r\n * NodeStyle represents the styling configuration of a node.\r\n * Includes ColorStyle properties plus optional renderer-specific constants and arbitrary additional fields.\r\n */\r\nexport type NodeStyle = ColorStyle &\r\n{\r\n /** Optional renderer-specific constants from RendererConstants */\r\n [key in keyof RendererConstants]?: RendererConstants[key];\r\n} &\r\n{\r\n /** Any additional style properties supported by extensions or custom renderers */\r\n [key: string]: any;\r\n};\r\n\r\n/**\r\n * Events emitted by NodeSvg instances.\r\n * Consumers can listen to these events to react to node lifecycle changes.\r\n */\r\nexport interface NodeEvents {\r\n /** Triggered before the node is removed from the workspace */\r\n \"REMOVING\": null;\r\n\r\n /** Triggered immediately after node initialization */\r\n \"INITING\": null;\r\n\r\n /** Triggered while the node is being dragged */\r\n \"NODE_DRAG\": null;\r\n}\r\n\r\n/**\r\n * Represents a node in the workspace.\r\n * Handles connections, fields, colors, serialization, and events.\r\n */\r\nclass NodeSvg extends EventEmitter<NodeEvents> {\r\n /** The previous connection for this node (null if none) */\r\n previousConnection: Connection | null;\r\n /** The next connection for this node (null if none) */\r\n nextConnection: Connection | null;\r\n /** Node type string, usually derived from prototype */\r\n type: string | null;\r\n /** Prototype object providing behavior for this node */\r\n prototype: NodePrototype | null;\r\n /** Node color style object */\r\n colors: NodeStyle; // Node's color scheme\r\n /** Displayed label text for this node */\r\n labelText: string; // Displayed node label\r\n /** Set of fields attached to this node */\r\n _fieldColumn: Set<AnyField>; // Stores attached fields\r\n /** Node coordinates relative to workspace */\r\n relativeCoords: Coordinates;\r\n /** Unique node ID */\r\n id: string;\r\n /** SVG representation of this node */\r\n svg?: RepresenterNode | object | null = null;\r\n /** Workspace this node belongs to */\r\n workspace: WorkspaceSvg | null = null;\r\n /** Optional comment attached to this node */\r\n comment: CommentModel | null\r\n /** Event key: \"REMOVING\" */\r\n static REMOVING: keyof NodeEvents = \"REMOVING\";\r\n\r\n /** Event key: \"INITING\" */\r\n static INITING: keyof NodeEvents = \"INITING\";\r\n /**\r\n * Creates a NodeSvg instance.\r\n * @param prototype Optional NodePrototype to associate with this node.\r\n * @param workspace Optional WorkspaceSvg this node belongs to.\r\n * @param svgGroup Optional SVG group to attach node visuals.\r\n */\r\n constructor(prototype: NodePrototype | null, workspace?: WorkspaceSvg, svgGroup?: G) {\r\n super();\r\n this.type = null;\r\n this.comment = null;\r\n this.prototype = prototype;\r\n this.colors = {\r\n primary: '#000000', // Topbar & connection color\r\n secondary: '#000000', // Field & dropdown backgrounds\r\n tertiary: '#000000', // Outline color\r\n category: '' // Node category name (optional)\r\n };\r\n this.previousConnection = new Connection(null, this, true); //1st arg is from, 2nd is to, third is if this conn is prev\r\n this.nextConnection = new Connection(this, null, false); //1st arg is from, 2nd is to, third is if this conn is prev\r\n this.labelText = '';\r\n this._fieldColumn = new Set();\r\n this.relativeCoords = new Coordinates(0, 0);\r\n this.id = generateUID('nanoid', { alphabet: 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0129384756!)@(#*$&%^' });\r\n if (workspace) {\r\n this.workspace = workspace;\r\n }\r\n if (svgGroup) {\r\n this.svg = new RepresenterNode(this, {\r\n id: this.id,\r\n pendingConnections: [],\r\n group: svgGroup\r\n }, workspace!.renderer)\r\n }\r\n }\r\n /** Returns true if this node has no previous connection (i.e., top-level node) */\r\n get topLevel() {\r\n return !(this.previousConnection?.getFrom());\r\n }\r\n /** Returns the raw SVG group element if present */\r\n get svgGroup() {\r\n return (this.svg as RepresenterNode)?.getRaw?.();\r\n }\r\n /** Returns the text of the node's comment, if any */\r\n getCommentText() {\r\n return this.comment?.getText?.();\r\n }\r\n /** Returns the CommentModel instance for this node, if any */\r\n getComment() {\r\n return this.comment;\r\n }\r\n /** Adds a new comment to this node if none exists */\r\n addComment() {\r\n if (!this.comment) {\r\n this.comment = new CommentModel(this);\r\n return;\r\n }\r\n console.warn('Comment already exists.')\r\n }\r\n /** Sets the text for the node's comment, creating one if needed */\r\n setCommentText(text: string) {\r\n if (!this.comment) {\r\n this.comment = new CommentModel(this);\r\n }\r\n this.comment.setText(text);\r\n }\r\n /** Removes the comment from the node and triggers workspace redraw */\r\n removeComment() {\r\n this.comment = null;\r\n this.workspace?.redrawComments?.();\r\n }\r\n /** Returns an array of all fields attached to this node */\r\n allFields() {\r\n return Array.from(this._fieldColumn);\r\n }\r\n /** Retrieves a field by name from this node */\r\n getFieldByName(name: string): AnyField | null | undefined {\r\n let field: AnyField | null | undefined = this.allFields().find(fld => fld.getName() === name);\r\n\r\n return field;\r\n }\r\n /** Alias for getFieldByName */\r\n getField(name: string): AnyField | null | undefined {\r\n return this.getFieldByName(name);\r\n }\r\n /** Retrieves the current value of a field by name */\r\n getFieldValue(name: string): any | undefined {\r\n const fld: AnyField | null | undefined = this.getFieldByName(name);\r\n if (fld) {\r\n return fld.getValue();\r\n }\r\n return undefined;\r\n }\r\n /** Retrieves the display value of a field by name */\r\n getFieldDisplayValue(name: string): any | undefined {\r\n const fld: AnyField | null | undefined = this.getFieldByName(name);\r\n if (fld) {\r\n return fld.getDisplayValue();\r\n }\r\n return undefined;\r\n }\r\n /** Sets the value of a field by name */\r\n setFieldValue(name: string, value: any) {\r\n const fld: AnyField | null | undefined = this.getFieldByName(name);\r\n if (fld) {\r\n fld.setValue(value as never); // I don't like using the \"as\" statement here, but it's necessary to satisfy TypeScript.\r\n }\r\n return fld;\r\n }\r\n\r\n /**\r\n * Initiates the node, calling prototype methods.\r\n */\r\n init() {\r\n this.emit(NodeSvg.INITING, null);\r\n if (this.prototype) {\r\n if (this.prototype.init) this.prototype.init.call(this, this.prototype, this);\r\n if (this.workspace) {\r\n this.workspace.addNode(this)\r\n }\r\n if (this.prototype.removed) {\r\n this.on(NodeSvg.REMOVING, () => {\r\n this.prototype?.removed.call(this, this.prototype, this);\r\n })\r\n }\r\n } else {\r\n console.warn(`Node with id ${this.id} is missing a prototype.`)\r\n }\r\n }\r\n /** Returns whether this node has a category style applied */\r\n hasCategoryStyle() {\r\n return !!this.colors?.category && this.colors?.category?.length > 0;\r\n }\r\n\r\n /** Returns the category name or null if none */\r\n getCategoryName() {\r\n return this.colors?.category || null;\r\n }\r\n\r\n /** Returns the node's current ColorStyle */\r\n getStyle() {\r\n return this.colors;\r\n }\r\n\r\n /** Internal helper: attach a field to this node */\r\n _appendFieldItem(field: AnyField) {\r\n if (!field) console.warn(\"Falsey field passed to _appendFieldItem.\");\r\n this._fieldColumn.add(field);\r\n }\r\n\r\n /** Initialize node from a NodeJson object */\r\n jsonInit(json: NodeJson) {\r\n if (json.primaryColor) this.colors.primary = json.primaryColor;\r\n if (json.secondaryColor) this.colors.secondary = json.secondaryColor;\r\n if (json.tertiaryColor) this.colors.tertiary = json.tertiaryColor;\r\n\r\n // Apply category colors if defined\r\n if (json.category && CategoryColors[json.category]) {\r\n const style: ColorStyle = CategoryColors[json.category] as ColorStyle;\r\n Object.assign(this.colors, { category: json.category }, style);\r\n }\r\n\r\n this.previousConnection = hasProp(json, 'previousConnection') ? new Connection(null, this, true) : null;\r\n this.nextConnection = hasProp(json, 'nextConnection') ? new Connection(this, null, false) : null;\r\n\r\n if (json.labelText) this.labelText = json.labelText;\r\n if (json.arguments) this.applyJsonArguments(json.arguments);\r\n if (json.type) {\r\n this.type = json.type;\r\n }\r\n }\r\n\r\n /* JAVASCRIPT API */\r\n\r\n /** Apply field definitions from a JSON-like array without full NodeJson */\r\n applyJsonArguments(args: InputFieldJson[]) {\r\n for (let field of args) {\r\n if (!field.type || !field.name) {\r\n console.warn(`Invalid argument definition at: ${args.indexOf(field)}.`);\r\n continue;\r\n }\r\n\r\n const FieldConstructor: AnyFieldCls | undefined = FieldMap[field.type] as AnyFieldCls | undefined;\r\n if (!FieldConstructor) {\r\n console.warn(`Missing field constructor for ${field.type}!`);\r\n continue;\r\n }\r\n\r\n const fld: AnyField = new FieldConstructor();\r\n fld.fromJson(field); // initialize field\r\n fld.node = this;\r\n this._appendFieldItem(fld);\r\n }\r\n return this;\r\n }\r\n /** Appends a connection field to this node */\r\n appendConnection(name: string): Field {\r\n const fld = new (FieldMap['connection'])();\r\n this._appendFieldItem(fld);\r\n fld.setName(name);\r\n fld.node = this;\r\n return fld;\r\n }\r\n /** Appends a numeric input field to this node */\r\n appendNumber(name: string): Field {\r\n const fld = new (FieldMap['field_num'])();\r\n this._appendFieldItem(fld);\r\n fld.setName(name);\r\n fld.node = this;\r\n return fld;\r\n }\r\n /** Appends a text input field to this node */\r\n appendText(name: string): Field {\r\n const fld = new (FieldMap['field_str'])();\r\n this._appendFieldItem(fld);\r\n fld.setName(name);\r\n fld.node = this;\r\n return fld;\r\n }\r\n\r\n /** Appends a field that can hold a connection or raw value */\r\n appendOptLink(name: string): Field {\r\n const fld = new (FieldMap['field_both'])();\r\n this._appendFieldItem(fld);\r\n fld.setName(name);\r\n fld.node = this;\r\n return fld;\r\n }\r\n /** Sets the category name for the node */\r\n setCategoryName(name: string) {\r\n this.colors.category = name;\r\n return this;\r\n }\r\n /** Applies a ColorStyle to the node */\r\n setStyle(style: ColorStyle) {\r\n // apply properties from style into this.colors\r\n Object.assign(this.colors, style);\r\n return this;\r\n }\r\n\r\n /** Sets primary, secondary, and tertiary colors for the node */\r\n setColor(primary: Color, secondary: Color, tertiary: Color) {\r\n this.setStyle({ primary, secondary, tertiary });\r\n return this;\r\n }\r\n /** Sets the label text for the node */\r\n setLabelText(text: string) {\r\n this.labelText = text;\r\n return this;\r\n }\r\n\r\n /** Add or replace a previous/next connection based on argument */\r\n setConnection(prevOrNext: string | number | boolean) {\r\n const stringed = String(prevOrNext).toLowerCase();\r\n const cast = stringed == '0' ? 0 : (stringed == '1' ? 1 : (stringed == 'true' ? 1 : (stringed == 'false' ? 0 : 3)));\r\n\r\n if (cast === 0) {\r\n this.previousConnection = new Connection(null, this, true);\r\n } else if (cast === 1) {\r\n this.nextConnection = new Connection(this, null, false);\r\n } else {\r\n console.warn('Invalid prevOrNext argument for NodeSvg.setConnection');\r\n }\r\n return this;\r\n }\r\n /** Copies another NodeSvg into this node */\r\n fromNode(other: NodeSvg) {\r\n if (!other) return;\r\n\r\n // Copy primitive props\r\n this.type = other.type;\r\n this.labelText = other.labelText;\r\n this.relativeCoords = new Coordinates(other.relativeCoords.x, other.relativeCoords.y);\r\n\r\n // Copy colors\r\n this.colors = { ...other.colors };\r\n\r\n // Copy connections\r\n this.previousConnection = other.previousConnection\r\n ? new Connection(null, this, true)\r\n : null;\r\n this.nextConnection = other.nextConnection\r\n ? new Connection(this, null, false)\r\n : null;\r\n\r\n // Copy fields\r\n this._fieldColumn.clear();\r\n for (let field of other._fieldColumn) {\r\n const FieldCls = field.constructor as AnyFieldCls;\r\n const newField = (new FieldCls()) as any;\r\n\r\n // Copy basic properties\r\n newField.setName(field.getName());\r\n if ('getValue' in field && 'setValue' in newField) {\r\n newField.setValue(field.getValue());\r\n }\r\n if ('getLabel' in field && 'setLabel' in newField) {\r\n newField.setLabel(field.getLabel())\r\n }\r\n this._appendFieldItem(newField);\r\n }\r\n\r\n // Copy workspace reference\r\n this.workspace = other.workspace;\r\n\r\n // Copy prototype reference\r\n this.prototype = other.prototype;\r\n\r\n\r\n return this;\r\n }\r\n /** Serializes a Connection object, handling fields and nested nodes */\r\n _serializeConnection(\r\n c: Connection,\r\n alreadyProcessed: { [key: string]: SerializedNode }\r\n ): { field?: boolean | undefined; node?: SerializedNode | undefined } {\r\n const returned: { field?: boolean; node?: SerializedNode } = {};\r\n let connected: NodeSvg | AnyField | null = c.isPrevious ? c.getFrom() : c.getTo();\r\n\r\n if (!connected) return returned;\r\n\r\n if (connected instanceof NodeSvg) {\r\n // Avoid serializing the same node twice\r\n if (alreadyProcessed[connected.id]) {\r\n return { node: alreadyProcessed[connected.id] };\r\n }\r\n returned.node = connected.serialize(alreadyProcessed);\r\n } else {\r\n // Field serialization\r\n const fld = connected as AnyField;\r\n // If the field has a node, we serialize the node first\r\n let fieldNode: SerializedNode | undefined;\r\n if (fld.node) {\r\n if (alreadyProcessed[fld.node.id]) {\r\n fieldNode = alreadyProcessed[fld.node.id];\r\n } else {\r\n fieldNode = fld.node.serialize(alreadyProcessed);\r\n }\r\n }\r\n returned.field = true;\r\n if (fieldNode) returned.node = fieldNode;\r\n }\r\n\r\n return returned;\r\n }\r\n\r\n /**\r\n * Serialize a node, this includes circular references. use toJson to avoid those.\r\n * @param alreadyProcessed - Internal.\r\n * @returns \r\n */\r\n serialize(alreadyProcessed: { [key: string]: SerializedNode } = {}): SerializedNode {\r\n if (alreadyProcessed[this.id]) {\r\n return alreadyProcessed[this.id] as SerializedNode;\r\n }\r\n\r\n // Put a placeholder in map *before* serializing connections\r\n const serialized: SerializedNode = {\r\n id: this.id,\r\n type: this.type || '',\r\n colors: { primary: this.colors.primary, secondary: this.colors.secondary, tertiary: this.colors.tertiary, category: this.colors.category } as ColorStyle,\r\n label: this.labelText,\r\n previousConnection: undefined,\r\n nextConnection: undefined,\r\n relativeCoords: { x: this.relativeCoords.x, y: this.relativeCoords.y },\r\n comment: this.comment?.toJson?.(),\r\n fields: [], // fill after placeholder\r\n };\r\n alreadyProcessed[this.id] = serialized;\r\n\r\n // Now safely fill in the heavy parts\r\n serialized.fields = this.allFields().map(fld =>\r\n fld.toJson\r\n ? fld.toJson(true, alreadyProcessed)\r\n : {\r\n name: fld.getName(),\r\n type: fld.constructor.name,\r\n value: fld.getValue ? fld.getValue() : undefined,\r\n }\r\n );\r\n\r\n serialized.previousConnection = this.previousConnection\r\n ? this._serializeConnection(this.previousConnection, alreadyProcessed)\r\n : undefined;\r\n\r\n serialized.nextConnection = this.nextConnection\r\n ? this._serializeConnection(this.nextConnection, alreadyProcessed)\r\n : undefined;\r\n\r\n return serialized;\r\n }\r\n\r\n /**\r\n * Return a flattened version of the serialized node structure, which is non-circular.\r\n * Any node reference inside connections or fields is replaced by its ID.\r\n */\r\n toJson(): {\r\n [id: string]: Omit<SerializedNode, 'previousConnection' | 'nextConnection'> & {\r\n previousConnection?: { field?: FieldOptions; node?: string };\r\n nextConnection?: { field?: FieldOptions; node?: string };\r\n }\r\n } {\r\n const serialized = this.serialize();\r\n const flat: { [id: string]: any } = {};\r\n\r\n const processNode = (node: SerializedNode) => {\r\n if (flat[node.id]) return;\r\n\r\n const copy: any = {\r\n ...node,\r\n previousConnection: node.previousConnection ? { ...node.previousConnection } : undefined,\r\n nextConnection: node.nextConnection ? { ...node.nextConnection } : undefined,\r\n };\r\n\r\n flat[node.id] = copy;\r\n\r\n // Handle connections\r\n if (copy.previousConnection?.node) {\r\n const prevNode = copy.previousConnection.node;\r\n copy.previousConnection.node = prevNode.id;\r\n processNode(prevNode);\r\n }\r\n if (copy.nextConnection?.node) {\r\n const nextNode = copy.nextConnection.node;\r\n copy.nextConnection.node = nextNode.id;\r\n processNode(nextNode);\r\n }\r\n\r\n // Handle fields recursively\r\n if (Array.isArray(copy.fields)) {\r\n for (let fld of copy.fields) {\r\n if (fld.node) {\r\n processNode(fld.node);\r\n fld.node = fld.node.id;\r\n }\r\n for (let key in fld) {\r\n if (fld[key]?.node) {\r\n processNode(fld[key]?.node);\r\n fld[key].node = fld[key].node.id;\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n processNode(serialized);\r\n return flat;\r\n }\r\n\r\n /**\r\n * Reconstruct a NodeSvg from a SerializedNode structure (handles circular references)\r\n */\r\n static _deserialize(\r\n data: SerializedNode,\r\n allNodes: { [id: string]: NodeSvg } = {},\r\n workspace?: WorkspaceSvg\r\n ): NodeSvg {\r\n // If already created, return the existing instance\r\n if (allNodes[data.id]) return allNodes[data.id] as NodeSvg;\r\n\r\n if (workspace && workspace.getNode(data.id)) {\r\n workspace.removeNodeById(data.id); // remove old node which had the same id.\r\n }\r\n // Create a new node with minimal prototype info (can be patched later)\r\n const node = new NodeSvg(NodePrototypes[data.type] as NodePrototype, workspace);\r\n node.id = data.id;\r\n node.init();\r\n node.type = data.type;\r\n node.relativeCoords.set(data.relativeCoords.x, data.relativeCoords.y);\r\n node.labelText = data.label || '';\r\n if (data.comment && workspace) {\r\n node.comment = CommentModel.fromJson(data.comment as CommentSerialized);\r\n node.comment._parent = node;\r\n node.comment._isWorkspaceComment = false;\r\n }\r\n // IMPORTANT: restore colors from serialized data (if present)\r\n if (data.colors) {\r\n // Start with category colors if a category is present and known\r\n if (data.colors.category && CategoryColors[data.colors.category]) {\r\n const style: ColorStyle = CategoryColors[data.colors.category] as ColorStyle;\r\n Object.assign(node.colors, style, { category: data.colors.category });\r\n }\r\n // Then override with explicit serialized colors (primary/secondary/tertiary)\r\n // This preserves explicit color values even when a category was saved\r\n const explicit: Partial<ColorStyle> = {};\r\n if (data.colors.primary) explicit.primary = data.colors.primary;\r\n if (data.colors.secondary) explicit.secondary = data.colors.secondary;\r\n if (data.colors.tertiary) explicit.tertiary = data.colors.tertiary;\r\n if (data.colors.category) explicit.category = data.colors.category;\r\n node.setStyle(explicit as ColorStyle);\r\n }\r\n // Register placeholder before deserializing connections to handle circular refs\r\n allNodes[node.id] = node;\r\n\r\n // Deserialize fields\r\n if (Array.isArray(data.fields)) {\r\n node._fieldColumn = new Set();\r\n for (let fldData of data.fields) {\r\n const FieldConstructor = FieldMap[fldData.type];\r\n if (!FieldConstructor) continue;\r\n\r\n const fld: AnyField = new FieldConstructor();\r\n fld.fromJson(fldData, workspace); // ONLY fldData and workspace\r\n fld.node = node;\r\n node._appendFieldItem(fld);\r\n }\r\n }\r\n\r\n // Deserialize previous/next connections\r\n if (data.previousConnection?.node) {\r\n node.previousConnection = new Connection(null, node, true);\r\n node.previousConnection.setFrom(NodeSvg._deserialize(data.previousConnection.node, allNodes, workspace));\r\n }\r\n\r\n if (data.nextConnection?.node) {\r\n node.nextConnection = new Connection(node, null, false);\r\n node.nextConnection.setTo(NodeSvg._deserialize(data.nextConnection.node, allNodes, workspace));\r\n } else {\r\n workspace?.redraw(); // redraw if we reached the end.\r\n }\r\n\r\n return node;\r\n }\r\n /** Public: Deserialize a SerializedNode or plain object into a NodeSvg attached to a workspace */\r\n static deserialize(json: SerializedNode | any, workspace: WorkspaceSvg) {\r\n return this._deserialize(json as SerializedNode, {}, workspace);\r\n }\r\n /** Reconstructs nodes from a flattened JSON structure into a NodeSvg tree */\r\n static fromJson(flat: Record<string, any>, workspace: WorkspaceSvg): any {\r\n const nodes: Record<string, any> = {};\r\n // shallow clone so we can safely mutate\r\n for (const id in flat) {\r\n nodes[id] = { ...flat[id] };\r\n }\r\n\r\n // rebuild references\r\n for (const id in nodes) {\r\n const node = nodes[id];\r\n\r\n // fix connection refs\r\n if (node.previousConnection?.node) {\r\n const refId = node.previousConnection.node as string;\r\n node.previousConnection = {\r\n ...node.previousConnection,\r\n node: nodes[refId],\r\n };\r\n }\r\n if (node.nextConnection?.node) {\r\n const refId = node.nextConnection.node as string;\r\n node.nextConnection = {\r\n ...node.nextConnection,\r\n node: nodes[refId],\r\n };\r\n }\r\n\r\n // fix fields\r\n if (Array.isArray(node.fields)) {\r\n for (const fld of node.fields) {\r\n if (typeof fld.node === 'string')\r\n fld.node = nodes[fld.node];\r\n\r\n for (const key in fld) {\r\n const maybe = fld[key];\r\n if (maybe?.node && typeof maybe.node === 'string')\r\n maybe.node = nodes[maybe.node];\r\n }\r\n }\r\n }\r\n }\r\n\r\n // the root is just the one w/ no previousConnection\r\n const root = Object.values(nodes).find(n => !n.previousConnection?.node) ?? null;\r\n return this._deserialize(root, {}, workspace);\r\n }\r\n\r\n\r\n}\r\n\r\nexport default NodeSvg;\r\n","import CommentModel from \"./comment\";\r\nimport { ContextMenuOpts, Showable } from \"./context-menu\";\r\nimport NodeSvg from \"./nodesvg\";\r\nimport WorkspaceSvg from \"./workspace-svg\";\r\n\r\n/** Registry for all context menu options */\r\nconst ContextOptsRegistry: ContextMenuOpts[] = [];\r\n\r\n/**\r\n * Global context menu manager\r\n */\r\nconst ContextMenu = {\r\n /**\r\n * Register a new context menu option\r\n * @param id - Unique identifier for the option\r\n * @param option - Configuration for the context menu item\r\n */\r\n registerOption(id: string, option: Omit<ContextMenuOpts, 'id'>) {\r\n const opt = {\r\n id,\r\n click: option.click,\r\n label: option.label,\r\n onHoverStart: option.onHoverStart || (() => { }),\r\n onHoverEnd: option.onHoverEnd || (() => { }),\r\n showFor: option.showFor || 'any'\r\n };\r\n ContextOptsRegistry.push(opt);\r\n },\r\n\r\n /**\r\n * Unregister an existing context menu option by ID\r\n * @param id - ID of the option to remove\r\n */\r\n unregisterOption(id: string) {\r\n const index = ContextOptsRegistry.findIndex(opt => opt.id === id);\r\n if (index >= 0) ContextOptsRegistry.splice(index, 1);\r\n }\r\n};\r\n\r\n// ----- Default options -----\r\n\r\nContextMenu.registerOption('k_delete', {\r\n showFor: 'node',\r\n label: 'Delete',\r\n click: (t) => {\r\n const target = t as NodeSvg;\r\n if (!target.workspace) return;\r\n target.workspace.removeNode(target);\r\n }\r\n});\r\n\r\nContextMenu.registerOption('k_deleteall', {\r\n showFor: 'ws',\r\n label: 'Delete all',\r\n click: (t) => {\r\n const target = t as WorkspaceSvg;\r\n const isSure = window.confirm(`Are you sure you want to delete ${Array.from(target._nodeDB.keys()).length} nodes?`);\r\n if (!isSure) return;\r\n for (let [id, _] of target._nodeDB) {\r\n target.removeNodeById(id);\r\n }\r\n }\r\n});\r\n\r\nContextMenu.registerOption('k_addcomment', {\r\n showFor: ['ws', 'node'],\r\n label: 'Add Comment',\r\n click: (t) => {\r\n const target = t;\r\n if (target instanceof NodeSvg) {\r\n target.addComment();\r\n target.setCommentText('Comment!');\r\n } else if (target instanceof WorkspaceSvg) {\r\n const model = target.addComment();\r\n const pos = target.screenToWorkspace(target._ctxMenu.widget.coords.x, target._ctxMenu.widget.coords.y);\r\n model.relativeCoords.set(pos.x, pos.y);\r\n model.setText('Comment!');\r\n }\r\n }\r\n});\r\nContextMenu.registerOption('k_undo', {\r\n showFor: ['ws', 'node', 'comment'],\r\n label: 'Undo',\r\n click: (t) => {\r\n if (t instanceof NodeSvg) {\r\n t.workspace?.history?.undo();\r\n } else if (t instanceof CommentModel) {\r\n t.getWorkspace()?.history?.undo();\r\n } else if (t instanceof WorkspaceSvg) {\r\n t.history.undo();\r\n }\r\n },\r\n onDraw(el, ws, opt) {\r\n console.log('onDrawCalled');\r\n if (!ws.history.canUndo()) {\r\n (el as HTMLElement).classList.add('disabled')\r\n }\r\n }\r\n})\r\nContextMenu.registerOption('k_redo', {\r\n showFor: ['ws', 'node', 'comment'],\r\n label: 'Redo',\r\n click: (t) => {\r\n if (t instanceof NodeSvg) {\r\n t.workspace?.history?.redo();\r\n } else if (t instanceof CommentModel) {\r\n t.getWorkspace()?.history?.redo();\r\n } else if (t instanceof WorkspaceSvg) {\r\n t.history.redo();\r\n }\r\n },\r\n onDraw(el, ws, opt) {\r\n console.log('onDrawCalled');\r\n if (!ws.history.canRedo()) {\r\n (el as HTMLElement).classList.add('disabled')\r\n }\r\n }\r\n})\r\nContextMenu.registerOption('k_deletecomment', {\r\n showFor: 'comment',\r\n label: 'Delete Comment',\r\n click: (t) => {\r\n const target = t as CommentModel;\r\n if (target.isNodeComment() && target._parent instanceof NodeSvg) {\r\n target._parent.removeComment();\r\n } else {\r\n target.getWorkspace().removeComment(target);\r\n }\r\n }\r\n});\r\n\r\nContextMenu.registerOption('k_duplicate', {\r\n showFor: 'node',\r\n label: 'Duplicate',\r\n click: t => {\r\n const node = t as NodeSvg;\r\n if (!node.workspace) return;\r\n node.workspace.cloneNode(node);\r\n }\r\n});\r\n\r\nexport { ContextMenu };\r\nexport default ContextOptsRegistry;\r\n","type WindowEventKeys =\r\n\t| 'resize'\r\n\t| 'scroll'\r\n\t| 'blur'\r\n\t| 'focus'\r\n\t| 'visibilitychange'\r\n\t| 'pointerlockchange'\r\n\t| 'beforeunload';\r\n\r\ntype WindowListenersMap = Record<WindowEventKeys, Array<(event: Event) => void>>;\r\n\r\nconst windowListeners: WindowListenersMap = {\r\n\tresize: [],\r\n\tscroll: [],\r\n\tblur: [],\r\n\tfocus: [],\r\n\tvisibilitychange: [],\r\n\tpointerlockchange: [],\r\n\tbeforeunload: [],\r\n};\r\n\r\nfunction handleEvent(type: WindowEventKeys, event: Event) {\r\n\tconst list = windowListeners[type];\r\n\tif (!list.length) return;\r\n\tfor (const fn of list) {\r\n\t\ttry {\r\n\t\t\tfn(event);\r\n\t\t} catch (err) {\r\n\t\t\tconsole.error(`[Kabel] Error in window listener for '${type}':`, err);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n// auto attach\r\n(Object.keys(windowListeners) as WindowEventKeys[]).forEach((type) => {\r\n\twindow.addEventListener(type, (e) => handleEvent(type, e));\r\n});\r\n\r\nexport function addWindowListener(\r\n\ttype: WindowEventKeys,\r\n\tfn: (event: Event) => void\r\n) {\r\n\twindowListeners[type].push(fn);\r\n}\r\n\r\nexport function removeWindowListener(\r\n\ttype: WindowEventKeys,\r\n\tfn: (event: Event) => void\r\n) {\r\n\tconst list = windowListeners[type];\r\n\tconst i = list.indexOf(fn);\r\n\tif (i !== -1) list.splice(i, 1);\r\n}\r\n\r\nexport function clearWindowListeners(type?: WindowEventKeys) {\r\n\tif (type) windowListeners[type].length = 0;\r\n\telse (Object.keys(windowListeners) as WindowEventKeys[]).forEach((k) => {\r\n\t\twindowListeners[k].length = 0;\r\n\t});\r\n}\r\n\r\nexport default windowListeners;\r\n","type EventHandler<T = any> = (payload: T) => void;\r\n\r\nclass EventEmitter<Events extends Record<string, any>> {\r\n\tprivate listeners: { [K in keyof Events]?: EventHandler<Events[K]>[] } = {};\r\n\r\n\ton<K extends keyof Events>(event: K, handler: EventHandler<Events[K]>) {\r\n\t\tif (!this.listeners[event]) this.listeners[event] = [];\r\n\t\tthis.listeners[event]!.push(handler);\r\n\t\treturn this;\r\n\t}\r\n\r\n\toff<K extends keyof Events>(event: K, handler: EventHandler<Events[K]>) {\r\n\t\tif (!this.listeners[event]) return this;\r\n\t\tthis.listeners[event] = this.listeners[event]!.filter(h => h !== handler);\r\n\t\treturn this;\r\n\t}\r\n\r\n\temit<K extends keyof Events>(event: K, payload: Events[K]) {\r\n\t\tif (!this.listeners[event]) return false;\r\n\t\tthis.listeners[event]!.forEach(handler => handler(payload));\r\n\t\treturn true;\r\n\t}\r\n\r\n\tonce<K extends keyof Events>(event: K, handler: EventHandler<Events[K]>) {\r\n\t\tconst wrapper = (payload: Events[K]) => {\r\n\t\t\thandler(payload);\r\n\t\t\tthis.off(event, wrapper);\r\n\t\t};\r\n\t\tthis.on(event, wrapper);\r\n\t\treturn this;\r\n\t}\r\n}\r\nexport default EventEmitter;","import Flyout from \"./flyout\";\r\nimport { InjectOptions, TblxCategoryStruct, TblxNodeStruct } from \"./inject\";\r\nimport WorkspaceSvg, { WSTheme } from \"./workspace-svg\";\r\nimport Category from \"./category\";\r\n\r\n/**\r\n * Represents the toolbox in a Kabel workspace.\r\n * The toolbox can be either a flyout or a category-based toolbox.\r\n */\r\nclass Toolbox {\r\n /** Toolbox type: 1 = category toolbox, 2 = flyout toolbox */\r\n type: 1 | 2;\r\n\r\n /** Reference to the workspace this toolbox belongs to */\r\n workspace: WorkspaceSvg;\r\n\r\n /** Workspace options for initialization */\r\n wsOptions: InjectOptions;\r\n\r\n /** Flyout instance for node display */\r\n _flyout: Flyout;\r\n\r\n /** Contents of the toolbox (nodes or categories) */\r\n _contents: TblxNodeStruct[] | TblxCategoryStruct[];\r\n\r\n /** DOM container element for the toolbox */\r\n container: HTMLDivElement;\r\n\r\n /** List of categories (if using a category toolbox) */\r\n _categories: Category[] = [];\r\n\r\n /**\r\n * Creates a new Toolbox instance attached to a workspace.\r\n * @param workspace The workspace instance to attach this toolbox to\r\n */\r\n constructor(workspace: WorkspaceSvg) {\r\n this.workspace = workspace;\r\n this.wsOptions = this.getOptions();\r\n this.type = this.wsOptions.toolbox?.type == \"flyout\" ? 2 : 1;\r\n this._contents = this.wsOptions.toolbox?.contents ?? [];\r\n\r\n // Pass toolbox reference to flyout\r\n this._flyout = new Flyout(this);\r\n\r\n // Create container element\r\n this.container = document.createElement(\"div\");\r\n this.container.className = \"KabelToolbox\";\r\n this.container.style.position = \"absolute\";\r\n this.container.style.left = \"0\";\r\n this.container.style.top = \"0\";\r\n this.container.style.width = \"20%\";\r\n this.container.style.height = \"100%\";\r\n this.container.style.background = \"rgba(240,240,240,0.9)\";\r\n this.container.style.overflowY = \"auto\";\r\n\r\n // Append to workspace top layer\r\n workspace._wsTop.appendChild(this.container);\r\n\r\n // Initialize toolbox depending on type\r\n if (this.type === 1) this.initCategoryToolbox();\r\n if (this.type === 2) this.initFlyoutToolbox();\r\n }\r\n /**\r\n * Applies a WSTheme to the toolbox and flyout elements.\r\n * @param theme The workspace theme to apply\r\n */\r\n updateStyles(theme: WSTheme) {\r\n if (!theme?.UIStyles) return;\r\n\r\n const { toolboxCategoriesBG, toolboxFlyoutBG } = theme.UIStyles;\r\n\r\n const applyStyles = (el: HTMLElement, styles?: Partial<CSSStyleDeclaration>) => {\r\n if (!styles) return;\r\n\r\n for (const key in styles) {\r\n const k = key as keyof CSSStyleDeclaration;\r\n const v = styles[k];\r\n // Only assign if value exists\r\n if (v !== undefined) {\r\n // cast to any to avoid TS errors\r\n (el.style as any)[k] = v;\r\n }\r\n }\r\n };\r\n\r\n if (this.type === 1) applyStyles(this.container, toolboxCategoriesBG);\r\n if (this._flyout?.container) applyStyles(this._flyout.container, toolboxFlyoutBG);\r\n }\r\n\r\n\r\n /**\r\n * Retrieves the workspace options.\r\n * @returns The workspace's InjectOptions\r\n */\r\n getOptions() {\r\n return this.workspace.options;\r\n }\r\n\r\n /**\r\n * Initializes a category-based toolbox.\r\n * Converts the toolbox contents into Category instances and attaches them.\r\n */\r\n initCategoryToolbox() {\r\n const categories = this._contents as TblxCategoryStruct[];\r\n categories.forEach(cData => {\r\n const category = new Category(this, cData);\r\n this._categories.push(category);\r\n });\r\n\r\n // Hide flyout when workspace is clicked\r\n this.workspace.svg.on(\"click\", () => this._flyout.hide());\r\n }\r\n\r\n /**\r\n * Initializes a flyout toolbox.\r\n * Fills the flyout with the node definitions from the toolbox contents.\r\n */\r\n initFlyoutToolbox() {\r\n this.container.style.display = \"none\";\r\n const nodes = this._contents as TblxNodeStruct[];\r\n this._flyout.fill(nodes);\r\n }\r\n}\r\n\r\nexport default Toolbox;\r\n","import Workspace from \"./workspace\";\r\nimport WorkspaceSvg from \"./workspace-svg\";\r\n\r\n/**\r\n * Holds a reference to the main WorkspaceSvg instance.\r\n * Mimics Blockly's getMainWorkspace API for Kabel.\r\n */\r\nlet mainws: WorkspaceSvg | Workspace | null = null;\r\n\r\n/**\r\n * Returns the current main workspace instance.\r\n * \r\n * @returns The main WorkspaceSvg or null if none is set.\r\n */\r\nfunction getMainWorkspace(): WorkspaceSvg | Workspace | null {\r\n return mainws;\r\n}\r\n\r\n/**\r\n * Sets the main workspace reference.\r\n * Calling this updates the global \"main workspace\" for Kabel.\r\n * \r\n * @param ws - The WorkspaceSvg instance to set as main, or null to clear.\r\n * @returns The workspace that was set.\r\n */\r\nfunction setMainWorkspace(ws: WorkspaceSvg | Workspace | null) {\r\n return (mainws = ws);\r\n}\r\n\r\n/**\r\n * Clears the main workspace reference.\r\n * After calling, getMainWorkspace() will return null.\r\n * \r\n * @returns Always returns null.\r\n */\r\nfunction clearMainWorkspace() {\r\n return (mainws = null);\r\n}\r\n\r\nexport {\r\n getMainWorkspace,\r\n setMainWorkspace,\r\n clearMainWorkspace\r\n};\r\n\r\n/**\r\n * Note:\r\n * This mimics the Blockly.getMainWorkspace API.\r\n * When you inject a new workspace in Kabel, calling setMainWorkspace\r\n * sets the global main workspace reference, so you can easily retrieve it later.\r\n */\r\n","import { Element, G } from '@svgdotjs/svg.js';\r\nimport NodeSvg from '../src/nodesvg';\r\nimport eventer from '../util/eventer';\r\nimport type { EventSetupFn } from '../util/eventer';\r\nimport WorkspaceSvg from '../src/workspace-svg';\r\nimport userState from '../util/user-state';\r\n\r\nconst draggableStore: Record<string, { x: number, y: number }> = {};\r\n\r\nfunction initDraggable(element: Element, args: Record<string, any>): () => void {\r\n let isDragging = false;\r\n let offsetX = 0;\r\n let offsetY = 0;\r\n\r\n // fallback to element itself if no drag handle is given\r\n const dragTarget: Element = args.dragel ?? element;\r\n\r\n // Restore position if previously stored (type 3)\r\n if (args.type === 3 && args.id && draggableStore[args.id]) {\r\n const pos = draggableStore[args.id];\r\n if (pos) element.move(pos.x, pos.y);\r\n }\r\n\r\n function onMouseDown(e: MouseEvent) {\r\n if (args.type === 2 && args.node) {\r\n const ws : WorkspaceSvg = args.node.workspace;\r\n if (!ws) return;\r\n\r\n const start = ws.screenToWorkspace(e.clientX, e.clientY);\r\n const nodePos = args.node.relativeCoords;\r\n\r\n offsetX = start.x - nodePos.x;\r\n offsetY = start.y - nodePos.y;\r\n ws.beginDrag(args.node, start.x, start.y);\r\n (args.group as G).front();\r\n \r\n } else {\r\n const bbox = element.bbox();\r\n offsetX = e.clientX - bbox.x;\r\n offsetY = e.clientY - bbox.y;\r\n }\r\n\r\n isDragging = false;\r\n\r\n // Mark user as dragging\r\n userState.setState('dragging');\r\n\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp);\r\n\r\n if (args.type === 1 && args.ondrag) args.ondrag(e);\r\n }\r\n\r\n\r\n function onMouseMove(e: MouseEvent) {\r\n if (!isDragging) {\r\n const dx = e.movementX || 0;\r\n const dy = e.movementY || 0;\r\n if (Math.abs(dx) > 2 || Math.abs(dy) > 2) isDragging = true;\r\n }\r\n if (!isDragging) return;\r\n\r\n if (args.type === 2 && args.node && args.node instanceof NodeSvg) {\r\n const ws: WorkspaceSvg = args.node.workspace as WorkspaceSvg;\r\n if (!ws) return;\r\n\r\n // Compute new workspace coordinates\r\n const mouseWS = ws.screenToWorkspace(e.clientX, e.clientY);\r\n const newX = mouseWS.x - offsetX;\r\n const newY = mouseWS.y - offsetY;\r\n args.node.relativeCoords.set(newX, newY);\r\n ws.updateDrag(newX, newY);\r\n ws.refresh();\r\n // Move node visually\r\n const screenPos = ws.workspaceToScreen(newX, newY);\r\n element.attr({ transform: `translate(${screenPos.x}, ${screenPos.y}) scale(${ws.getZoom()})` });\r\n \r\n args.node.emit('NODE_DRAG', null);\r\n } else if (args.type === 1 && args.onmove) {\r\n const newX = e.clientX - offsetX;\r\n const newY = e.clientY - offsetY;\r\n element.move(newX, newY);\r\n args.onmove({ x: newX, y: newY });\r\n } else if (args.type === 3 && args.id) {\r\n const newX = e.clientX - offsetX;\r\n const newY = e.clientY - offsetY;\r\n element.move(newX, newY);\r\n draggableStore[args.id] = { x: newX, y: newY };\r\n }\r\n }\r\n\r\n function onMouseUp(e: MouseEvent) {\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n\r\n // Remove dragging state\r\n userState.removeState('dragging');\r\n\r\n if (args.type === 1 && args.enddrag) args.enddrag(e);\r\n if (args.type === 2 && args.node && args.node instanceof NodeSvg) {\r\n const ws: WorkspaceSvg = args.node.workspace as WorkspaceSvg;\r\n if (!ws) return;\r\n ws.emitChange();\r\n ws.endDrag();\r\n }\r\n isDragging = false;\r\n }\r\n\r\n dragTarget.node.addEventListener('mousedown', onMouseDown);\r\n\r\n // cleanup\r\n return () => {\r\n dragTarget.node.removeEventListener('mousedown', onMouseDown);\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n };\r\n}\r\n\r\neventer.registerEvent('k_draggable', initDraggable as EventSetupFn);\r\n","/**\r\n * Delays execution of a callback by a specified number of animation frames.\r\n *\r\n * Uses `requestAnimationFrame` to count frames, then calls the provided callback.\r\n *\r\n * @param {number} frames - The number of animation frames to wait before executing the callback.\r\n * @param {() => void} callback - The function to execute after the specified frames have passed.\r\n */\r\nfunction waitFrames(frames: number, callback: () => void): void {\r\n\tlet count = 0;\r\n\r\n\tfunction step() {\r\n\t\tcount++;\r\n\t\tif (count >= frames) {\r\n\t\t\tcallback();\r\n\t\t} else {\r\n\t\t\trequestAnimationFrame(step);\r\n\t\t}\r\n\t}\r\n\r\n\trequestAnimationFrame(step);\r\n}\r\n\r\nexport default waitFrames;\r\n","import { NodePrototype } from \"./node-types\";\r\n\r\n/**\r\n * A registry of all node prototypes by name.\r\n * Maps a string key (node type name) to a NodePrototype object\r\n */\r\nconst NodePrototypes: { [key: string]: NodePrototype } = {};\r\n\r\nexport default NodePrototypes;\r\n","import { G } from \"@svgdotjs/svg.js\";\r\nimport Field, { AnyField } from \"./field\";\r\nimport NodeSvg from \"./nodesvg\";\r\n\r\n/**\r\n * Allowed owner types for the dropdown container.\r\n * Can be either a NodeSvg or a Field.\r\n */\r\nexport type AllowedOwner = NodeSvg | AnyField;\r\n\r\n/**\r\n * Get absolute position of an HTMLElement relative to the document.\r\n * @param el - The HTML element to measure.\r\n * @returns The bounding box with scroll offset.\r\n */\r\nfunction getAbsolutePosition(el: HTMLElement) {\r\n const rect = el.getBoundingClientRect();\r\n return {\r\n x: rect.left + window.scrollX,\r\n y: rect.top + window.scrollY,\r\n width: rect.width,\r\n height: rect.height,\r\n };\r\n}\r\n\r\n/**\r\n * Options for creating a dropdown menu.\r\n */\r\nexport interface DropdownOptions {\r\n /** List of items to display in the dropdown */\r\n items: { label: string; value: string }[];\r\n /** Callback when an item is selected */\r\n onSelect?: (value: string, item: { label: string; value: string }) => void;\r\n /** Optional fixed width of the dropdown */\r\n width?: number;\r\n}\r\n\r\n/**\r\n * Dropdown container for NodeSvg or Field elements.\r\n * Supports singleton behavior (only one dropdown visible at a time).\r\n */\r\nclass DropdownContainer {\r\n private static current: DropdownContainer | null = null;\r\n private owner: AllowedOwner | null = null;\r\n private rootEl: HTMLDivElement;\r\n private options: DropdownOptions | null = null;\r\n private constraint: { x: number; y: number; width: number; height: number };\r\n private offset: { dx: number; dy: number };\r\n private currentRemoveListener: (() => void) | null = null;\r\n /**\r\n * Creates the dropdown container and attaches it to the DOM.\r\n */\r\n constructor() {\r\n this.rootEl = document.createElement(\"div\");\r\n this.rootEl.className = \"KabelDropdownMenu\";\r\n this.rootEl.style.position = \"absolute\";\r\n this.rootEl.style.display = \"none\";\r\n document.body.appendChild(this.rootEl);\r\n\r\n this.constraint = { x: 0, y: 0, width: 0, height: 0 };\r\n this.offset = { dx: 0, dy: 0 };\r\n }\r\n\r\n /**\r\n * Move the dropdown by an offset.\r\n * @param dx - horizontal offset\r\n * @param dy - vertical offset\r\n */\r\n move(dx: number, dy: number) {\r\n this.offset.dx = dx;\r\n this.offset.dy = dy;\r\n this.updatePosition();\r\n }\r\n\r\n /**\r\n * Update the dropdown position based on constraint and offset.\r\n */\r\n private updatePosition() {\r\n const { x, y, height } = this.constraint;\r\n const { dx, dy } = this.offset;\r\n this.rootEl.style.left = `${x + dx}px`;\r\n this.rootEl.style.top = `${y + height + dy}px`; // anchored below\r\n }\r\n\r\n /**\r\n * Set inner HTML content of the dropdown.\r\n * @param html - HTML string\r\n */\r\n setContent(html: string) {\r\n this.rootEl.innerHTML = html;\r\n }\r\n\r\n /**\r\n * Append an element as a child to the dropdown.\r\n * @param element - Element to append\r\n * @returns The appended element\r\n */\r\n appendChild(element: Element) {\r\n this.rootEl.appendChild(element);\r\n return element;\r\n }\r\n\r\n /**\r\n * Show the dropdown for a given owner.\r\n * @param owner - NodeSvg or Field that owns this dropdown\r\n * @param options - Dropdown configuration options\r\n */\r\n show(owner: AllowedOwner, options: DropdownOptions) {\r\n if (!owner.svgGroup) return;\r\n this.hide(); // close existing dropdown first\r\n this.owner = owner;\r\n if (options) this.options = options;\r\n if (this.currentRemoveListener) this.currentRemoveListener();\r\n this.currentRemoveListener = null;\r\n const groupRect = owner.svgGroup.node.getBoundingClientRect();\r\n this.constraint = {\r\n x: groupRect.left + window.scrollX,\r\n y: groupRect.top + window.scrollY,\r\n width: groupRect.width,\r\n height: groupRect.height,\r\n };\r\n\r\n this.offset = { dx: 0, dy: 0 };\r\n\r\n this.rootEl.innerHTML = \"\";\r\n if (options.width) this.rootEl.style.width = `${options.width}px`;\r\n this.rootEl.style.display = \"block\";\r\n\r\n // Render items\r\n if (options.items) {\r\n options.items.forEach((item) => {\r\n const el = document.createElement(\"div\");\r\n el.className = \"KabelDropdownItem\";\r\n el.textContent = item.label;\r\n el.onclick = () => {\r\n options.onSelect?.(item.value, item);\r\n this.hide();\r\n };\r\n this.rootEl.appendChild(el);\r\n });\r\n }\r\n if (owner instanceof NodeSvg) {\r\n // Add a move listener to the node's workspace.\r\n const ws = owner.workspace;\r\n let remove = ws?.addMoveListener(() => {\r\n if (this.owner !== owner) {\r\n remove!(); // disconnect when owner changes.\r\n return;\r\n }\r\n this.hideIfOwner(owner)\r\n });\r\n this.currentRemoveListener = remove as () => void;\r\n }\r\n if (owner instanceof Field) {\r\n // Add a move listener to the field's workspace.\r\n const ws = owner.node!.workspace;\r\n let remove = ws?.addMoveListener(() => {\r\n if (this.owner !== owner) {\r\n console.log(\"Disconnecting..\");\r\n remove!(); // disconnect when owner changes.\r\n return;\r\n }\r\n console.log(\"Hiding..\");\r\n this.hide();\r\n });\r\n this.currentRemoveListener = remove as () => void;\r\n }\r\n this.updatePosition();\r\n DropdownContainer.current = this;\r\n }\r\n\r\n /**\r\n * Hide this dropdown.\r\n */\r\n hide() {\r\n if (DropdownContainer.current !== this) return;\r\n this.rootEl.style.display = \"none\";\r\n this.rootEl.innerHTML = \"\";\r\n this.owner = null;\r\n this.options = null;\r\n DropdownContainer.current = null;\r\n if (this.currentRemoveListener) this.currentRemoveListener();\r\n this.currentRemoveListener = null;\r\n }\r\n\r\n /**\r\n * Hide this dropdown if the given owner currently owns it.\r\n * @param owner - The owner to check\r\n */\r\n hideIfOwner(owner: AllowedOwner) {\r\n if (this.owner === owner) {\r\n this.hide();\r\n }\r\n }\r\n\r\n /** @returns True if the dropdown is currently visible */\r\n isVisible(): boolean {\r\n return DropdownContainer.current === this;\r\n }\r\n\r\n /** @returns The current owner of the dropdown, or null if none */\r\n getOwner(): AllowedOwner | null {\r\n return this.owner;\r\n }\r\n\r\n /** @returns The currently visible dropdown container singleton */\r\n static getCurrent(): DropdownContainer | null {\r\n return DropdownContainer.current;\r\n }\r\n}\r\n\r\n// Singleton export\r\nconst dropdownContainer = new DropdownContainer();\r\nexport default dropdownContainer;\r\nexport { DropdownContainer };\r\n","import { WidgetOptions } from \"./widget\";\r\n\r\n/**\r\n * A list of prototypes for widgets.\r\n */\r\nexport interface WidgetPrototypeList {\r\n [key: string]: WidgetOptions\r\n}\r\n\r\nconst WidgetPrototypes: WidgetPrototypeList = {};\r\nexport default WidgetPrototypes;","import { Element } from '@svgdotjs/svg.js';\r\nimport NodeSvg from '../src/nodesvg';\r\nimport eventer from '../util/eventer';\r\nimport type { EventSetupFn } from '../util/eventer';\r\nimport WorkspaceSvg from '../src/workspace-svg';\r\nimport userState from '../util/user-state';\r\nimport CommentModel from '../src/comment';\r\n\r\n/** The drag handle for comments */\r\nfunction initDraggable(element: Element, args: Record<string, any>): () => void {\r\n const comment = args.comment as CommentModel;\r\n if (!comment) return () => { };\r\n\r\n let startX = 0;\r\n let startY = 0;\r\n let startRelX = 0;\r\n let startRelY = 0;\r\n\r\n function onPointerDown(ev: PointerEvent) {\r\n ev.preventDefault();\r\n\r\n const ws = comment.getWorkspace();\r\n const rel = comment.relativeCoords;\r\n\r\n // Capture offset from pointer to comment in workspace coords\r\n const pointerWS = ws.screenToWorkspace(ev.clientX, ev.clientY);\r\n startRelX = rel.x - pointerWS.x;\r\n startRelY = rel.y - pointerWS.y;\r\n\r\n document.addEventListener('pointermove', onPointerMove);\r\n document.addEventListener('pointerup', onPointerUp);\r\n }\r\n\r\n function onPointerMove(ev: PointerEvent) {\r\n const ws = comment.getWorkspace();\r\n\r\n // Map pointer to workspace\r\n const pointerWS = ws.screenToWorkspace(ev.clientX, ev.clientY);\r\n\r\n // Add initial offset\r\n comment.relativeCoords.set(pointerWS.x + startRelX, pointerWS.y + startRelY);\r\n\r\n ws.refreshComments();\r\n }\r\n\r\n\r\n\r\n function onPointerUp() {\r\n document.removeEventListener('pointermove', onPointerMove);\r\n document.removeEventListener('pointerup', onPointerUp);\r\n }\r\n\r\n element.node.addEventListener('pointerdown', onPointerDown);\r\n\r\n // Cleanup function\r\n return () => {\r\n element.node.removeEventListener('pointerdown', onPointerDown);\r\n };\r\n}\r\n\r\neventer.registerEvent('k_draghandle', initDraggable as EventSetupFn);\r\n","import { Svg, Rect, Circle, G, Path, Element } from '@svgdotjs/svg.js';\r\n\r\nexport type EventType = string;\r\nexport type EventArgs = Record<string, any>;\r\nexport type EventSetupFn = (el: Element, args?: EventArgs) => (() => void) | void;\r\n\r\nexport interface RegisteredEl {\r\n tags: string[],\r\n el: Element;\r\n type: EventType;\r\n args?: EventArgs | undefined; // allow undefined explicitly\r\n destroyFn?: (() => void) | undefined; // allow undefined explicitly\r\n}\r\n\r\n/**\r\n * Used by the Kabel renderer to tag svg.js elements as interactable with the kabel system.\r\n */\r\nclass Eventer {\r\n private elements: RegisteredEl[] = [];\r\n private eventRegistry: Map<EventType, EventSetupFn> = new Map();\r\n\r\n // Register an event type with a setup function\r\n registerEvent(type: EventType, setupFn: EventSetupFn) {\r\n this.eventRegistry.set(type, setupFn);\r\n return this; // allow chaining\r\n }\r\n tagElement(el: Element, tags?: string[] | string) {\r\n if (!tags) return this;\r\n const tagList = Array.isArray(tags) ? tags : [tags];\r\n\r\n // Find the registered elements for this el\r\n for (const reg of this.elements) {\r\n if (reg.el === el) {\r\n for (const t of tagList) {\r\n if (!reg.tags.includes(t)) reg.tags.push(t);\r\n }\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n destroyByTag(tag: string) {\r\n let destroyed = false;\r\n this.elements = this.elements.filter(reg => {\r\n if (reg.tags.includes(tag)) {\r\n if (reg.destroyFn) {\r\n reg.destroyFn();\r\n destroyed = true;\r\n }\r\n return false; // remove this element\r\n }\r\n return true; // keep element\r\n });\r\n return destroyed ? 1 : 0;\r\n }\r\n\r\n // addElement\r\n addElement(el: Element, types: EventType | EventType[], args?: EventArgs) {\r\n const typeList = Array.isArray(types) ? types : [types];\r\n for (const type of typeList) {\r\n const destroyFn = this.setupElement(el, type, args) as (() => void) | undefined;\r\n this.elements.push({\r\n tags: [],\r\n el,\r\n type,\r\n args,\r\n destroyFn\r\n });\r\n }\r\n return this;\r\n }\r\n\r\n // refresh\r\n refresh() {\r\n for (const reg of this.elements) {\r\n if (reg.destroyFn) reg.destroyFn();\r\n reg.destroyFn = this.setupElement(reg.el, reg.type, reg.args) as (() => void) | undefined;\r\n }\r\n }\r\n\r\n\r\n // Destroy event(s) for an element\r\n destroyElement(el: Element, type?: EventType) {\r\n let destroyed = false;\r\n for (const reg of this.elements) {\r\n if (reg.el === el && (!type || reg.type === type)) {\r\n if (reg.destroyFn) {\r\n reg.destroyFn();\r\n destroyed = true;\r\n }\r\n // Remove from elements array\r\n this.elements = this.elements.filter(r => r !== reg);\r\n }\r\n }\r\n return destroyed ? 1 : 0;\r\n }\r\n\r\n private setupElement(el: Element, type: EventType, args?: EventArgs): (() => void) | undefined {\r\n const setupFn = this.eventRegistry.get(type);\r\n if (!setupFn) return;\r\n const destroyFn = setupFn(el, args);\r\n return destroyFn instanceof Function ? destroyFn : undefined;\r\n }\r\n}\r\n\r\nconst eventer = new Eventer();\r\nexport default eventer;\r\nexport { Eventer };\r\n","// Convert an arc to a sequence of cubic bézier curves\n//\n'use strict';\n\n\nvar TAU = Math.PI * 2;\n\n\n/* eslint-disable space-infix-ops */\n\n// Calculate an angle between two unit vectors\n//\n// Since we measure angle between radii of circular arcs,\n// we can use simplified math (without length normalization)\n//\nfunction unit_vector_angle(ux, uy, vx, vy) {\n var sign = (ux * vy - uy * vx < 0) ? -1 : 1;\n var dot = ux * vx + uy * vy;\n\n // Add this to work with arbitrary vectors:\n // dot /= Math.sqrt(ux * ux + uy * uy) * Math.sqrt(vx * vx + vy * vy);\n\n // rounding errors, e.g. -1.0000000000000002 can screw up this\n if (dot > 1.0) { dot = 1.0; }\n if (dot < -1.0) { dot = -1.0; }\n\n return sign * Math.acos(dot);\n}\n\n\n// Convert from endpoint to center parameterization,\n// see http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n//\n// Return [cx, cy, theta1, delta_theta]\n//\nfunction get_arc_center(x1, y1, x2, y2, fa, fs, rx, ry, sin_phi, cos_phi) {\n // Step 1.\n //\n // Moving an ellipse so origin will be the middlepoint between our two\n // points. After that, rotate it to line up ellipse axes with coordinate\n // axes.\n //\n var x1p = cos_phi*(x1-x2)/2 + sin_phi*(y1-y2)/2;\n var y1p = -sin_phi*(x1-x2)/2 + cos_phi*(y1-y2)/2;\n\n var rx_sq = rx * rx;\n var ry_sq = ry * ry;\n var x1p_sq = x1p * x1p;\n var y1p_sq = y1p * y1p;\n\n // Step 2.\n //\n // Compute coordinates of the centre of this ellipse (cx', cy')\n // in the new coordinate system.\n //\n var radicant = (rx_sq * ry_sq) - (rx_sq * y1p_sq) - (ry_sq * x1p_sq);\n\n if (radicant < 0) {\n // due to rounding errors it might be e.g. -1.3877787807814457e-17\n radicant = 0;\n }\n\n radicant /= (rx_sq * y1p_sq) + (ry_sq * x1p_sq);\n radicant = Math.sqrt(radicant) * (fa === fs ? -1 : 1);\n\n var cxp = radicant * rx/ry * y1p;\n var cyp = radicant * -ry/rx * x1p;\n\n // Step 3.\n //\n // Transform back to get centre coordinates (cx, cy) in the original\n // coordinate system.\n //\n var cx = cos_phi*cxp - sin_phi*cyp + (x1+x2)/2;\n var cy = sin_phi*cxp + cos_phi*cyp + (y1+y2)/2;\n\n // Step 4.\n //\n // Compute angles (theta1, delta_theta).\n //\n var v1x = (x1p - cxp) / rx;\n var v1y = (y1p - cyp) / ry;\n var v2x = (-x1p - cxp) / rx;\n var v2y = (-y1p - cyp) / ry;\n\n var theta1 = unit_vector_angle(1, 0, v1x, v1y);\n var delta_theta = unit_vector_angle(v1x, v1y, v2x, v2y);\n\n if (fs === 0 && delta_theta > 0) {\n delta_theta -= TAU;\n }\n if (fs === 1 && delta_theta < 0) {\n delta_theta += TAU;\n }\n\n return [ cx, cy, theta1, delta_theta ];\n}\n\n//\n// Approximate one unit arc segment with bézier curves,\n// see http://math.stackexchange.com/questions/873224\n//\nfunction approximate_unit_arc(theta1, delta_theta) {\n var alpha = 4/3 * Math.tan(delta_theta/4);\n\n var x1 = Math.cos(theta1);\n var y1 = Math.sin(theta1);\n var x2 = Math.cos(theta1 + delta_theta);\n var y2 = Math.sin(theta1 + delta_theta);\n\n return [ x1, y1, x1 - y1*alpha, y1 + x1*alpha, x2 + y2*alpha, y2 - x2*alpha, x2, y2 ];\n}\n\nmodule.exports = function a2c(x1, y1, x2, y2, fa, fs, rx, ry, phi) {\n var sin_phi = Math.sin(phi * TAU / 360);\n var cos_phi = Math.cos(phi * TAU / 360);\n\n // Make sure radii are valid\n //\n var x1p = cos_phi*(x1-x2)/2 + sin_phi*(y1-y2)/2;\n var y1p = -sin_phi*(x1-x2)/2 + cos_phi*(y1-y2)/2;\n\n if (x1p === 0 && y1p === 0) {\n // we're asked to draw line to itself\n return [];\n }\n\n if (rx === 0 || ry === 0) {\n // one of the radii is zero\n return [];\n }\n\n\n // Compensate out-of-range radii\n //\n rx = Math.abs(rx);\n ry = Math.abs(ry);\n\n var lambda = (x1p * x1p) / (rx * rx) + (y1p * y1p) / (ry * ry);\n if (lambda > 1) {\n rx *= Math.sqrt(lambda);\n ry *= Math.sqrt(lambda);\n }\n\n\n // Get center parameters (cx, cy, theta1, delta_theta)\n //\n var cc = get_arc_center(x1, y1, x2, y2, fa, fs, rx, ry, sin_phi, cos_phi);\n\n var result = [];\n var theta1 = cc[2];\n var delta_theta = cc[3];\n\n // Split an arc to multiple segments, so each segment\n // will be less than τ/4 (= 90°)\n //\n var segments = Math.max(Math.ceil(Math.abs(delta_theta) / (TAU / 4)), 1);\n delta_theta /= segments;\n\n for (var i = 0; i < segments; i++) {\n result.push(approximate_unit_arc(theta1, delta_theta));\n theta1 += delta_theta;\n }\n\n // We have a bezier approximation of a unit circle,\n // now need to transform back to the original ellipse\n //\n return result.map(function (curve) {\n for (var i = 0; i < curve.length; i += 2) {\n var x = curve[i + 0];\n var y = curve[i + 1];\n\n // scale\n x *= rx;\n y *= ry;\n\n // rotate\n var xp = cos_phi*x - sin_phi*y;\n var yp = sin_phi*x + cos_phi*y;\n\n // translate\n curve[i + 0] = xp + cc[0];\n curve[i + 1] = yp + cc[1];\n }\n\n return curve;\n });\n};\n","'use strict';\n\nmodule.exports = require('./lib/svgpath');\n","/**\r\n * Kabel Core Export Module\r\n * ------------------------\r\n * Aggregates all core Kabel modules, types, utilities, and components,\r\n * and exports them under a single namespace.\r\n */\r\n\r\nimport RendererConstants from \"../renderers/constants\";\r\nimport Renderer, { DrawState, ConnectorToFrom } from \"../renderers/renderer\";\r\nimport CategoryColors from \"./colors\";\r\nimport Connection, { Connectable } from \"./connection\";\r\nimport Coordinates from \"./coordinates\";\r\nimport Field, { \r\n FieldOptions, FieldVisualInfo, AnyFieldCls, AnyField, DummyField, \r\n FieldMap, NumberField, OptConnectField, TextField, ConnectableField, \r\n FieldRawBoxData, FieldConnectionData \r\n} from \"./field\";\r\nimport inject, { \r\n InjectMsg, InjectOptions, TblxCategoryStruct, TblxObjStruct, \r\n TblxFieldStruct, TblxNodeStruct, GridOptions\r\n} from \"./inject\";\r\nimport { clearMainWorkspace, getMainWorkspace, setMainWorkspace } from \"./main-workspace\";\r\nimport NodeSvg, { NodeJson, NodeEvents, InputFieldJson, SerializedNode } from \"./nodesvg\";\r\nimport NodePrototypes from \"./prototypes\";\r\nimport WorkspaceSvg from \"./workspace-svg\";\r\nimport WorkspaceCoords from \"./workspace-coords\";\r\nimport { NodePrototype } from \"./node-types\";\r\nimport { Color, ColorStyle, Hex, RGBObject, RGBString, RGBTuple } from \"./visual-types\";\r\nimport { parseColor } from \"../util/parse-color\";\r\nimport eventer, { Eventer, EventSetupFn, EventArgs, RegisteredEl } from \"../util/eventer\";\r\nimport hasProp from \"../util/has-prop\";\r\nimport EventEmitter from \"../util/emitter\";\r\nimport * as Path from \"../util/path\";\r\nimport * as SVG from \"@svgdotjs/svg.js\";\r\nimport * as UID from \"../util/uid\";\r\n\r\nimport K from \"./core\";\r\nimport Widget, { WidgetOptions } from \"./widget\";\r\nimport { WidgetPrototypeList } from \"./widget-prototypes\";\r\nimport Showable, { KabelInterface, KabelCommentRendering, KabelNodeRendering, KabelUIX, KabelUtils } from \"./types\";\r\n\r\n//@ts-ignore\r\nconst Kabel: KabelInterface = K;\r\nexport default Kabel;\r\n\r\n// Core types and utilities\r\nexport {\r\n KabelInterface,\r\n TblxCategoryStruct,\r\n TblxNodeStruct,\r\n TblxFieldStruct,\r\n TblxObjStruct,\r\n RendererConstants,\r\n Renderer,\r\n CategoryColors,\r\n Connection,\r\n Coordinates,\r\n Field,\r\n DummyField,\r\n FieldMap,\r\n NumberField,\r\n OptConnectField,\r\n TextField,\r\n FieldOptions,\r\n FieldVisualInfo,\r\n AnyFieldCls,\r\n AnyField,\r\n ConnectableField,\r\n FieldRawBoxData,\r\n FieldConnectionData,\r\n inject,\r\n InjectMsg,\r\n InjectOptions,\r\n clearMainWorkspace,\r\n getMainWorkspace,\r\n setMainWorkspace,\r\n NodeSvg,\r\n NodePrototypes,\r\n WorkspaceSvg,\r\n WorkspaceCoords,\r\n NodePrototype,\r\n Color, ColorStyle, Hex, RGBObject, RGBString, RGBTuple,\r\n NodeJson, NodeEvents, InputFieldJson,\r\n SerializedNode,\r\n Eventer,\r\n EventSetupFn,\r\n EventArgs,\r\n Connectable,\r\n DrawState,\r\n ConnectorToFrom,\r\n WidgetOptions,\r\n WidgetPrototypeList,\r\n KabelCommentRendering,\r\n KabelNodeRendering,\r\n KabelUIX,\r\n KabelUtils,\r\n Showable,\r\n RegisteredEl,\r\n GridOptions\r\n};\r\n\r\n// Core classes used by public API\r\nexport { default as CommentModel } from './comment';\r\n\r\nexport { default as Toolbox } from './toolbox';\r\nexport { default as ContextMenuHTML } from './context-menu';\r\nexport { default as Widget } from './widget';\r\nexport { DropdownContainer } from './dropdown-menu';\r\nexport { RepresenterNode } from '../renderers/representer-node';\r\nexport { default as CommentRenderer } from '../comment-renderer/renderer';\r\nexport { default as Representer } from '../renderers/representer';\r\n\r\n// Controllers\r\nexport { default as WorkspaceController } from '../controllers/base';\r\nexport { default as WASDController } from '../controllers/wasd';\r\n","/**\r\n * Represents a 2D coordinate in space.\r\n */\r\nclass Coordinates {\r\n\t/** X position */\r\n\tx: number;\r\n\t/** Y position */\r\n\ty: number;\r\n\r\n\t/**\r\n\t * Creates a new Coordinates instance\r\n\t * @param x - The x value (default 0)\r\n\t * @param y - The y value (default 0)\r\n\t */\r\n\tconstructor(x: number = 0, y: number = 0) {\r\n\t\tthis.x = x;\r\n\t\tthis.y = y;\r\n\t}\r\n\r\n\t/**\r\n\t * Set the coordinates to new values\r\n\t * @param x - The new x value\r\n\t * @param y - The new y value\r\n\t */\r\n\tset(x: number, y: number) {\r\n\t\tthis.x = x;\r\n\t\tthis.y = y;\r\n\t}\r\n\r\n\t/**\r\n\t * Returns a copy of this coordinate\r\n\t * @returns A new Coordinates instance with the same x and y\r\n\t */\r\n\tclone(): Coordinates {\r\n\t\treturn new Coordinates(this.x, this.y);\r\n\t}\r\n\r\n\t/**\r\n\t * Calculate the Euclidean distance to another coordinate\r\n\t * @param other - The target coordinate\r\n\t * @returns The distance as a number\r\n\t */\r\n\tdistanceTo(other: Coordinates): number {\r\n\t\tconst dx = this.x - other.x;\r\n\t\tconst dy = this.y - other.y;\r\n\t\treturn Math.sqrt(dx * dx + dy * dy);\r\n\t}\r\n\r\n\t/**\r\n\t * Convert the coordinate to a string representation\r\n\t * @returns A string like \"(x, y)\"\r\n\t */\r\n\ttoString(): string {\r\n\t\treturn `(${this.x}, ${this.y})`;\r\n\t}\r\n\r\n\t/**\r\n\t * Convert the coordinate to an array [x, y]\r\n\t * @returns Tuple of numbers [x, y]\r\n\t */\r\n\ttoArray(): [number, number] {\r\n\t\treturn [this.x, this.y];\r\n\t}\r\n\r\n\t/**\r\n\t * Convert the coordinate to an object { x, y }\r\n\t * @returns Object with x and y properties\r\n\t */\r\n\ttoObject(): { x: number; y: number } {\r\n\t\treturn { x: this.x, y: this.y };\r\n\t}\r\n}\r\n\r\nexport default Coordinates;\r\n","import { Color, Hex } from \"../src/visual-types\";\r\n\r\nclass RendererConstants {\r\n CORNER_RADIUS!: number;\r\n NODE_BASE_WIDTH!: number;\r\n NODE_BASE_HEIGHT!: number;\r\n TOPBAR_HEIGHT!: number;\r\n FOOTER_HEIGHT!: number;\r\n PADDING_BIG!: number;\r\n PADDING_MEDIUM!: number;\r\n PADDING_SMALL!: number;\r\n FIELD_SPACEY!: number;\r\n FIELD_SPACEX!: number;\r\n FIELD_RAW_BASE_WIDTH!: number;\r\n FIELD_RAW_BASE_HEIGHT!: number;\r\n INPUT_BOX_PADDING!: number;\r\n INPUT_BOX_TEXT_ANCHOR!: 'start' | 'middle';\r\n LABEL_SPACING!: number;\r\n\r\n FIELD_RAW_COLOR: Color = '#2b2d36ff';\r\n FIELD_RAW_TEXT_COLOR: Color = '#e0e2e8ff';\r\n FIELD_RAW_OUTLINE_COLOR: Color = '#1f2027ff';\r\n FIELD_RAW_OUTLINE_STROKE!: number;\r\n FIELD_CONN_COLOR: Color = '#0c7cccff'\r\n NODE_BG_COLOR: Color = '#2c2d3aff';\r\n NODE_OUTLINE_COLOR: Color = '#1d1e25ff';\r\n CONNECTOR_TRIANGLE!: boolean;\r\n CONNECTION_STROKE_WIDTH!: number;\r\n CONNECTION_STROKE_COLOR_CHOICE!: number;\r\n CONNECTOR_TRI_SIZE!: number;\r\n CONNECTOR_RADIUS!: number;\r\n FONT_FAMILY: string =\r\n '\"Inter\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif';\r\n FONT_SIZE!: number;\r\n FONT_COLOR: Color = '#e0e2e8ff';\r\n\r\n FIELD_MARGIN_X!: number;\r\n FIELD_MARGIN_Y!: number;\r\n TOPBAR_LABEL_MARGIN_X!: number;\r\n TOPBAR_LABEL_MARGIN_Y!: number;\r\n TOPBAR_LABEL_BOLDED!: boolean;\r\n CONNECTOR_LINE_WIDTH: number = 6;\r\n CONNECTOR_LINE_CURVED: boolean = true;\r\n ZOOM_BASE: number = 1; // default scale factor for workspace\r\n\r\n SHAPES: {\r\n [key: string]: {\r\n PathMain: string;\r\n Width: number;\r\n Height: number;\r\n }\r\n } = {}\r\n constructor(overrides: Partial<RendererConstants> = {}) {\r\n this.CONNECTOR_TRI_SIZE = 8;\r\n this.CONNECTOR_RADIUS = 10;\r\n this.CORNER_RADIUS = 6;\r\n this.NODE_BASE_WIDTH = 200;\r\n this.NODE_BASE_HEIGHT = 240;\r\n\r\n this.TOPBAR_HEIGHT = 50;\r\n this.FOOTER_HEIGHT = 25;\r\n this.PADDING_BIG = 16;\r\n this.PADDING_MEDIUM = 8;\r\n this.PADDING_SMALL = 4;\r\n this.FIELD_RAW_BASE_WIDTH = 80;\r\n this.FIELD_RAW_BASE_HEIGHT = 42;\r\n this.INPUT_BOX_PADDING = 6;\r\n this.LABEL_SPACING = 5;\r\n this.INPUT_BOX_TEXT_ANCHOR = 'middle';\r\n this.CONNECTOR_TRIANGLE = false;\r\n this.CONNECTION_STROKE_WIDTH = 2;\r\n this.CONNECTION_STROKE_COLOR_CHOICE = 1;\r\n this.FIELD_RAW_OUTLINE_STROKE = 2;\r\n this.FIELD_SPACEY = 20;\r\n this.FIELD_SPACEX = 20;\r\n this.FONT_SIZE = 20;\r\n this.TOPBAR_LABEL_BOLDED = true;\r\n this.FIELD_MARGIN_X = 16;\r\n this.FIELD_MARGIN_Y = 16;\r\n this.TOPBAR_LABEL_MARGIN_X = 12;\r\n this.TOPBAR_LABEL_MARGIN_Y = 0;\r\n\r\n Object.assign(this, overrides);\r\n }\r\n}\r\n\r\nexport default RendererConstants;\r\n","// SVG Path transformations library\n//\n// Usage:\n//\n// SvgPath('...')\n// .translate(-150, -100)\n// .scale(0.5)\n// .translate(-150, -100)\n// .toFixed(1)\n// .toString()\n//\n\n'use strict';\n\n\nvar pathParse = require('./path_parse');\nvar transformParse = require('./transform_parse');\nvar matrix = require('./matrix');\nvar a2c = require('./a2c');\nvar ellipse = require('./ellipse');\n\n\n// Class constructor\n//\nfunction SvgPath(path) {\n if (!(this instanceof SvgPath)) { return new SvgPath(path); }\n\n var pstate = pathParse(path);\n\n // Array of path segments.\n // Each segment is array [command, param1, param2, ...]\n this.segments = pstate.segments;\n\n // Error message on parse error.\n this.err = pstate.err;\n\n // Transforms stack for lazy evaluation\n this.__stack = [];\n}\n\nSvgPath.from = function (src) {\n if (typeof src === 'string') return new SvgPath(src);\n\n if (src instanceof SvgPath) {\n // Create empty object\n var s = new SvgPath('');\n\n // Clone properies\n s.err = src.err;\n s.segments = src.segments.map(function (sgm) { return sgm.slice(); });\n s.__stack = src.__stack.map(function (m) {\n return matrix().matrix(m.toArray());\n });\n\n return s;\n }\n\n throw new Error('SvgPath.from: invalid param type ' + src);\n};\n\n\nSvgPath.prototype.__matrix = function (m) {\n var self = this, i;\n\n // Quick leave for empty matrix\n if (!m.queue.length) { return; }\n\n this.iterate(function (s, index, x, y) {\n var p, result, name, isRelative;\n\n switch (s[0]) {\n\n // Process 'assymetric' commands separately\n case 'v':\n p = m.calc(0, s[1], true);\n result = (p[0] === 0) ? [ 'v', p[1] ] : [ 'l', p[0], p[1] ];\n break;\n\n case 'V':\n p = m.calc(x, s[1], false);\n result = (p[0] === m.calc(x, y, false)[0]) ? [ 'V', p[1] ] : [ 'L', p[0], p[1] ];\n break;\n\n case 'h':\n p = m.calc(s[1], 0, true);\n result = (p[1] === 0) ? [ 'h', p[0] ] : [ 'l', p[0], p[1] ];\n break;\n\n case 'H':\n p = m.calc(s[1], y, false);\n result = (p[1] === m.calc(x, y, false)[1]) ? [ 'H', p[0] ] : [ 'L', p[0], p[1] ];\n break;\n\n case 'a':\n case 'A':\n // ARC is: ['A', rx, ry, x-axis-rotation, large-arc-flag, sweep-flag, x, y]\n\n // Drop segment if arc is empty (end point === start point)\n /*if ((s[0] === 'A' && s[6] === x && s[7] === y) ||\n (s[0] === 'a' && s[6] === 0 && s[7] === 0)) {\n return [];\n }*/\n\n // Transform rx, ry and the x-axis-rotation\n var ma = m.toArray();\n var e = ellipse(s[1], s[2], s[3]).transform(ma);\n\n // flip sweep-flag if matrix is not orientation-preserving\n if (ma[0] * ma[3] - ma[1] * ma[2] < 0) {\n s[5] = s[5] ? '0' : '1';\n }\n\n // Transform end point as usual (without translation for relative notation)\n p = m.calc(s[6], s[7], s[0] === 'a');\n\n // Empty arcs can be ignored by renderer, but should not be dropped\n // to avoid collisions with `S A S` and so on. Replace with empty line.\n if ((s[0] === 'A' && s[6] === x && s[7] === y) ||\n (s[0] === 'a' && s[6] === 0 && s[7] === 0)) {\n result = [ s[0] === 'a' ? 'l' : 'L', p[0], p[1] ];\n break;\n }\n\n // if the resulting ellipse is (almost) a segment ...\n if (e.isDegenerate()) {\n // replace the arc by a line\n result = [ s[0] === 'a' ? 'l' : 'L', p[0], p[1] ];\n } else {\n // if it is a real ellipse\n // s[0], s[4] and s[5] are not modified\n result = [ s[0], e.rx, e.ry, e.ax, s[4], s[5], p[0], p[1] ];\n }\n\n break;\n\n case 'm':\n // Edge case. The very first `m` should be processed as absolute, if happens.\n // Make sense for coord shift transforms.\n isRelative = index > 0;\n\n p = m.calc(s[1], s[2], isRelative);\n result = [ 'm', p[0], p[1] ];\n break;\n\n default:\n name = s[0];\n result = [ name ];\n isRelative = (name.toLowerCase() === name);\n\n // Apply transformations to the segment\n for (i = 1; i < s.length; i += 2) {\n p = m.calc(s[i], s[i + 1], isRelative);\n result.push(p[0], p[1]);\n }\n }\n\n self.segments[index] = result;\n }, true);\n};\n\n\n// Apply stacked commands\n//\nSvgPath.prototype.__evaluateStack = function () {\n var m, i;\n\n if (!this.__stack.length) { return; }\n\n if (this.__stack.length === 1) {\n this.__matrix(this.__stack[0]);\n this.__stack = [];\n return;\n }\n\n m = matrix();\n i = this.__stack.length;\n\n while (--i >= 0) {\n m.matrix(this.__stack[i].toArray());\n }\n\n this.__matrix(m);\n this.__stack = [];\n};\n\n\n// Convert processed SVG Path back to string\n//\nSvgPath.prototype.toString = function () {\n var result = '', prevCmd = '', cmdSkipped = false;\n\n this.__evaluateStack();\n\n for (var i = 0, len = this.segments.length; i < len; i++) {\n var segment = this.segments[i];\n var cmd = segment[0];\n\n // Command not repeating => store\n if (cmd !== prevCmd || cmd === 'm' || cmd === 'M') {\n // workaround for FontForge SVG importing bug, keep space between \"z m\".\n if (cmd === 'm' && prevCmd === 'z') result += ' ';\n result += cmd;\n\n cmdSkipped = false;\n } else {\n cmdSkipped = true;\n }\n\n // Store segment params\n for (var pos = 1; pos < segment.length; pos++) {\n var val = segment[pos];\n // Space can be skipped\n // 1. After command (always)\n // 2. For negative value (with '-' at start)\n if (pos === 1) {\n if (cmdSkipped && val >= 0) result += ' ';\n } else if (val >= 0) result += ' ';\n\n result += val;\n }\n\n prevCmd = cmd;\n }\n\n return result;\n};\n\n\n// Translate path to (x [, y])\n//\nSvgPath.prototype.translate = function (x, y) {\n this.__stack.push(matrix().translate(x, y || 0));\n return this;\n};\n\n\n// Scale path to (sx [, sy])\n// sy = sx if not defined\n//\nSvgPath.prototype.scale = function (sx, sy) {\n this.__stack.push(matrix().scale(sx, (!sy && (sy !== 0)) ? sx : sy));\n return this;\n};\n\n\n// Rotate path around point (sx [, sy])\n// sy = sx if not defined\n//\nSvgPath.prototype.rotate = function (angle, rx, ry) {\n this.__stack.push(matrix().rotate(angle, rx || 0, ry || 0));\n return this;\n};\n\n\n// Skew path along the X axis by `degrees` angle\n//\nSvgPath.prototype.skewX = function (degrees) {\n this.__stack.push(matrix().skewX(degrees));\n return this;\n};\n\n\n// Skew path along the Y axis by `degrees` angle\n//\nSvgPath.prototype.skewY = function (degrees) {\n this.__stack.push(matrix().skewY(degrees));\n return this;\n};\n\n\n// Apply matrix transform (array of 6 elements)\n//\nSvgPath.prototype.matrix = function (m) {\n this.__stack.push(matrix().matrix(m));\n return this;\n};\n\n\n// Transform path according to \"transform\" attr of SVG spec\n//\nSvgPath.prototype.transform = function (transformString) {\n if (!transformString.trim()) {\n return this;\n }\n this.__stack.push(transformParse(transformString));\n return this;\n};\n\n\n// Round coords with given decimal precition.\n// 0 by default (to integers)\n//\nSvgPath.prototype.round = function (d) {\n var contourStartDeltaX = 0, contourStartDeltaY = 0, deltaX = 0, deltaY = 0, l;\n\n d = d || 0;\n\n this.__evaluateStack();\n\n this.segments.forEach(function (s) {\n var isRelative = (s[0].toLowerCase() === s[0]);\n\n switch (s[0]) {\n case 'H':\n case 'h':\n if (isRelative) { s[1] += deltaX; }\n deltaX = s[1] - s[1].toFixed(d);\n s[1] = +s[1].toFixed(d);\n return;\n\n case 'V':\n case 'v':\n if (isRelative) { s[1] += deltaY; }\n deltaY = s[1] - s[1].toFixed(d);\n s[1] = +s[1].toFixed(d);\n return;\n\n case 'Z':\n case 'z':\n deltaX = contourStartDeltaX;\n deltaY = contourStartDeltaY;\n return;\n\n case 'M':\n case 'm':\n if (isRelative) {\n s[1] += deltaX;\n s[2] += deltaY;\n }\n\n deltaX = s[1] - s[1].toFixed(d);\n deltaY = s[2] - s[2].toFixed(d);\n\n contourStartDeltaX = deltaX;\n contourStartDeltaY = deltaY;\n\n s[1] = +s[1].toFixed(d);\n s[2] = +s[2].toFixed(d);\n return;\n\n case 'A':\n case 'a':\n // [cmd, rx, ry, x-axis-rotation, large-arc-flag, sweep-flag, x, y]\n if (isRelative) {\n s[6] += deltaX;\n s[7] += deltaY;\n }\n\n deltaX = s[6] - s[6].toFixed(d);\n deltaY = s[7] - s[7].toFixed(d);\n\n s[1] = +s[1].toFixed(d);\n s[2] = +s[2].toFixed(d);\n s[3] = +s[3].toFixed(d + 2); // better precision for rotation\n s[6] = +s[6].toFixed(d);\n s[7] = +s[7].toFixed(d);\n return;\n\n default:\n // a c l q s t\n l = s.length;\n\n if (isRelative) {\n s[l - 2] += deltaX;\n s[l - 1] += deltaY;\n }\n\n deltaX = s[l - 2] - s[l - 2].toFixed(d);\n deltaY = s[l - 1] - s[l - 1].toFixed(d);\n\n s.forEach(function (val, i) {\n if (!i) { return; }\n s[i] = +s[i].toFixed(d);\n });\n return;\n }\n });\n\n return this;\n};\n\n\n// Apply iterator function to all segments. If function returns result,\n// current segment will be replaced to array of returned segments.\n// If empty array is returned, current regment will be deleted.\n//\nSvgPath.prototype.iterate = function (iterator, keepLazyStack) {\n var segments = this.segments,\n replacements = {},\n needReplace = false,\n lastX = 0,\n lastY = 0,\n countourStartX = 0,\n countourStartY = 0;\n var i, j, newSegments;\n\n if (!keepLazyStack) {\n this.__evaluateStack();\n }\n\n segments.forEach(function (s, index) {\n\n var res = iterator(s, index, lastX, lastY);\n\n if (Array.isArray(res)) {\n replacements[index] = res;\n needReplace = true;\n }\n\n var isRelative = (s[0] === s[0].toLowerCase());\n\n // calculate absolute X and Y\n switch (s[0]) {\n case 'm':\n case 'M':\n lastX = s[1] + (isRelative ? lastX : 0);\n lastY = s[2] + (isRelative ? lastY : 0);\n countourStartX = lastX;\n countourStartY = lastY;\n return;\n\n case 'h':\n case 'H':\n lastX = s[1] + (isRelative ? lastX : 0);\n return;\n\n case 'v':\n case 'V':\n lastY = s[1] + (isRelative ? lastY : 0);\n return;\n\n case 'z':\n case 'Z':\n // That make sence for multiple contours\n lastX = countourStartX;\n lastY = countourStartY;\n return;\n\n default:\n lastX = s[s.length - 2] + (isRelative ? lastX : 0);\n lastY = s[s.length - 1] + (isRelative ? lastY : 0);\n }\n });\n\n // Replace segments if iterator return results\n\n if (!needReplace) { return this; }\n\n newSegments = [];\n\n for (i = 0; i < segments.length; i++) {\n if (typeof replacements[i] !== 'undefined') {\n for (j = 0; j < replacements[i].length; j++) {\n newSegments.push(replacements[i][j]);\n }\n } else {\n newSegments.push(segments[i]);\n }\n }\n\n this.segments = newSegments;\n\n return this;\n};\n\n\n// Converts segments from relative to absolute\n//\nSvgPath.prototype.abs = function () {\n\n this.iterate(function (s, index, x, y) {\n var name = s[0],\n nameUC = name.toUpperCase(),\n i;\n\n // Skip absolute commands\n if (name === nameUC) { return; }\n\n s[0] = nameUC;\n\n switch (name) {\n case 'v':\n // v has shifted coords parity\n s[1] += y;\n return;\n\n case 'a':\n // ARC is: ['A', rx, ry, x-axis-rotation, large-arc-flag, sweep-flag, x, y]\n // touch x, y only\n s[6] += x;\n s[7] += y;\n return;\n\n default:\n for (i = 1; i < s.length; i++) {\n s[i] += i % 2 ? x : y; // odd values are X, even - Y\n }\n }\n }, true);\n\n return this;\n};\n\n\n// Converts segments from absolute to relative\n//\nSvgPath.prototype.rel = function () {\n\n this.iterate(function (s, index, x, y) {\n var name = s[0],\n nameLC = name.toLowerCase(),\n i;\n\n // Skip relative commands\n if (name === nameLC) { return; }\n\n // Don't touch the first M to avoid potential confusions.\n if (index === 0 && name === 'M') { return; }\n\n s[0] = nameLC;\n\n switch (name) {\n case 'V':\n // V has shifted coords parity\n s[1] -= y;\n return;\n\n case 'A':\n // ARC is: ['A', rx, ry, x-axis-rotation, large-arc-flag, sweep-flag, x, y]\n // touch x, y only\n s[6] -= x;\n s[7] -= y;\n return;\n\n default:\n for (i = 1; i < s.length; i++) {\n s[i] -= i % 2 ? x : y; // odd values are X, even - Y\n }\n }\n }, true);\n\n return this;\n};\n\n\n// Converts arcs to cubic bézier curves\n//\nSvgPath.prototype.unarc = function () {\n this.iterate(function (s, index, x, y) {\n var new_segments, nextX, nextY, result = [], name = s[0];\n\n // Skip anything except arcs\n if (name !== 'A' && name !== 'a') { return null; }\n\n if (name === 'a') {\n // convert relative arc coordinates to absolute\n nextX = x + s[6];\n nextY = y + s[7];\n } else {\n nextX = s[6];\n nextY = s[7];\n }\n\n new_segments = a2c(x, y, nextX, nextY, s[4], s[5], s[1], s[2], s[3]);\n\n // Degenerated arcs can be ignored by renderer, but should not be dropped\n // to avoid collisions with `S A S` and so on. Replace with empty line.\n if (new_segments.length === 0) {\n return [ [ s[0] === 'a' ? 'l' : 'L', s[6], s[7] ] ];\n }\n\n new_segments.forEach(function (s) {\n result.push([ 'C', s[2], s[3], s[4], s[5], s[6], s[7] ]);\n });\n\n return result;\n });\n\n return this;\n};\n\n\n// Converts smooth curves (with missed control point) to generic curves\n//\nSvgPath.prototype.unshort = function () {\n var segments = this.segments;\n var prevControlX, prevControlY, prevSegment;\n var curControlX, curControlY;\n\n // TODO: add lazy evaluation flag when relative commands supported\n\n this.iterate(function (s, idx, x, y) {\n var name = s[0], nameUC = name.toUpperCase(), isRelative;\n\n // First command MUST be M|m, it's safe to skip.\n // Protect from access to [-1] for sure.\n if (!idx) { return; }\n\n if (nameUC === 'T') { // quadratic curve\n isRelative = (name === 't');\n\n prevSegment = segments[idx - 1];\n\n if (prevSegment[0] === 'Q') {\n prevControlX = prevSegment[1] - x;\n prevControlY = prevSegment[2] - y;\n } else if (prevSegment[0] === 'q') {\n prevControlX = prevSegment[1] - prevSegment[3];\n prevControlY = prevSegment[2] - prevSegment[4];\n } else {\n prevControlX = 0;\n prevControlY = 0;\n }\n\n curControlX = -prevControlX;\n curControlY = -prevControlY;\n\n if (!isRelative) {\n curControlX += x;\n curControlY += y;\n }\n\n segments[idx] = [\n isRelative ? 'q' : 'Q',\n curControlX, curControlY,\n s[1], s[2]\n ];\n\n } else if (nameUC === 'S') { // cubic curve\n isRelative = (name === 's');\n\n prevSegment = segments[idx - 1];\n\n if (prevSegment[0] === 'C') {\n prevControlX = prevSegment[3] - x;\n prevControlY = prevSegment[4] - y;\n } else if (prevSegment[0] === 'c') {\n prevControlX = prevSegment[3] - prevSegment[5];\n prevControlY = prevSegment[4] - prevSegment[6];\n } else {\n prevControlX = 0;\n prevControlY = 0;\n }\n\n curControlX = -prevControlX;\n curControlY = -prevControlY;\n\n if (!isRelative) {\n curControlX += x;\n curControlY += y;\n }\n\n segments[idx] = [\n isRelative ? 'c' : 'C',\n curControlX, curControlY,\n s[1], s[2], s[3], s[4]\n ];\n }\n });\n\n return this;\n};\n\n\nmodule.exports = SvgPath;\n","export default \"/* Workspace wrapper: horizontal layout */\\r\\n.KabelWorkspaceWrapper {\\r\\n display: flex;\\r\\n flex-direction: row;\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n background: #f0f0f0;\\r\\n /* light gray background */\\r\\n overflow: hidden;\\r\\n position: relative;\\r\\n}\\r\\n\\r\\n/* Toolbox panel (left) */\\r\\n.KabelToolbox {\\r\\n width: 12%;\\r\\n min-width: 150px;\\r\\n height: 100%;\\r\\n background: rgba(240, 240, 240, 0.95);\\r\\n border-right: 1px solid #ccc;\\r\\n box-sizing: border-box;\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n padding: 8px;\\r\\n overflow-y: auto;\\r\\n}\\r\\n\\r\\n/* Context menu container */\\r\\n.KabelContextMenu {\\r\\n position: absolute;\\r\\n background: #1e1e2f;\\r\\n color: #000000;\\r\\n border-radius: 6px;\\r\\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.35);\\r\\n padding: 4px 0;\\r\\n font-family: 'Segoe UI', sans-serif;\\r\\n font-size: 14px;\\r\\n min-width: 160px;\\r\\n z-index: 9999;\\r\\n user-select: none;\\r\\n overflow: visible;\\r\\n height: auto;\\r\\n transition: opacity 0.15s ease, transform 0.15s ease;\\r\\n opacity: 0;\\r\\n transform: scale(0.95);\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n}\\r\\n\\r\\n/* Show state */\\r\\n.KabelContextMenu.show {\\r\\n opacity: 1;\\r\\n transform: scale(1);\\r\\n}\\r\\n\\r\\n/* Individual option */\\r\\n.KabelContextOption {\\r\\n padding: 8px 16px;\\r\\n cursor: pointer;\\r\\n transition: background 0.15s ease, color 0.15s ease;\\r\\n}\\r\\n.KabelContextOption:hover {\\r\\n background: #b0adb0;\\r\\n color: #fff;\\r\\n}\\r\\n.KabelContextOption.disabled {\\r\\n\\topacity: 0.35;\\r\\n\\tcursor: not-allowed;\\r\\n\\tcolor: #777; /* dim it so it's obviously off */\\r\\n\\tbackground: transparent;\\r\\n\\tpointer-events: none;\\r\\n}\\r\\n\\r\\n/* make sure hover never triggers visually */\\r\\n.KabelContextOption.disabled:hover {\\r\\n\\tbackground: transparent;\\r\\n\\tcolor: #777;\\r\\n}\\r\\n\\r\\n/* Optional: active click effect */\\r\\n.KabelContextOption:active {\\r\\n background: #fff;\\r\\n color: #000;\\r\\n}\\r\\n\\r\\n/* Scrollbar if too many options */\\r\\n.KabelContextMenu::-webkit-scrollbar {\\r\\n width: 6px;\\r\\n}\\r\\n\\r\\n.KabelContextMenu::-webkit-scrollbar-thumb {\\r\\n background: rgba(255, 255, 255, 0.2);\\r\\n border-radius: 3px;\\r\\n}\\r\\n\\r\\n/* Category buttons */\\r\\n\\r\\n.KabelCategoryRow {\\r\\n background: #fff;\\r\\n border: 1px solid #ccc;\\r\\n padding: 4px 8px;\\r\\n margin-bottom: 4px;\\r\\n border-radius: 4px;\\r\\n height: 5%;\\r\\n padding: 6px;\\r\\n cursor: pointer;\\r\\n text-align: left;\\r\\n transition: background 0.2s, color 0.2s;\\r\\n}\\r\\n\\r\\n.KabelToolbox button:hover {\\r\\n background: #e6e6e6;\\r\\n color: #333;\\r\\n}\\r\\n\\r\\n.KabelConnectionBubbleHighlight {\\r\\n stroke: yellow !important;\\r\\n stroke-width: 6px !important;\\r\\n stroke-linejoin: round;\\r\\n stroke-linecap: round;\\r\\n filter: drop-shadow(0 0 6px rgba(255, 255, 0, 0.9));\\r\\n}\\r\\n\\r\\n.KabelConnectionBubbleHighlightWrong {\\r\\n stroke: rgb(255, 0, 0) !important;\\r\\n stroke-width: 6px !important;\\r\\n stroke-linejoin: round;\\r\\n stroke-linecap: round;\\r\\n filter: drop-shadow(0 0 6px rgba(255, 0, 0, 0.9));\\r\\n}\\r\\n\\r\\n/* Container */\\r\\n.KabelDropdownMenu {\\r\\n position: absolute;\\r\\n display: none;\\r\\n background: #1e1e1e;\\r\\n color: #f0f0f0;\\r\\n font-family: sans-serif;\\r\\n font-size: 14px;\\r\\n border: 1px solid #333;\\r\\n border-radius: 6px;\\r\\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25);\\r\\n padding: 4px 0;\\r\\n z-index: 9999;\\r\\n user-select: none;\\r\\n animation: fadeIn 0.15s ease-out;\\r\\n}\\r\\n\\r\\n/* Dropdown items */\\r\\n.KabelDropdownItem {\\r\\n padding: 6px 12px;\\r\\n cursor: pointer;\\r\\n transition: background 0.15s;\\r\\n}\\r\\n\\r\\n/* Hover + focus states */\\r\\n.KabelDropdownItem:hover,\\r\\n.KabelDropdownItem:focus {\\r\\n background: #2d2d2d;\\r\\n}\\r\\n\\r\\n/* Active (clicked) state */\\r\\n.KabelDropdownItem:active {\\r\\n background: #3a3a3a;\\r\\n}\\r\\n\\r\\n/* Optional: highlight selected value */\\r\\n.KabelDropdownItem.selected {\\r\\n background: #444;\\r\\n font-weight: 600;\\r\\n}\\r\\n\\r\\n/* Smooth open effect */\\r\\n@keyframes fadeIn {\\r\\n from {\\r\\n opacity: 0;\\r\\n transform: translateY(-3px);\\r\\n }\\r\\n\\r\\n to {\\r\\n opacity: 1;\\r\\n transform: translateY(0);\\r\\n }\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\n/* Flyout panel (right) */\\r\\n.KabelFlyout {\\r\\n width: 20%;\\r\\n height: 100%;\\r\\n background: rgba(255, 255, 255, 0.95);\\r\\n border-left: 1px solid #ccc;\\r\\n box-sizing: border-box;\\r\\n overflow-y: auto;\\r\\n position: relative;\\r\\n /* for absolute positioning of nodes inside */\\r\\n display: none;\\r\\n /* hidden by default */\\r\\n padding: 8px;\\r\\n}\\r\\n\\r\\n/* Flyout nodes */\\r\\n.KabelFlyoutNode {\\r\\n padding: 6px 10px;\\r\\n margin-bottom: 4px;\\r\\n border-radius: 4px;\\r\\n cursor: pointer;\\r\\n user-select: none;\\r\\n transition: background 0.2s;\\r\\n}\\r\\n\\r\\n.KabelFlyoutNode:hover {\\r\\n background: #e0e0e0;\\r\\n}\\r\\n\\r\\n/* SVG workspace area */\\r\\n.KabelWorkspaceWrapper svg {\\r\\n flex: 1;\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n background: #fff;\\r\\n /* white canvas background */\\r\\n display: block;\\r\\n}\";","import { Element } from '@svgdotjs/svg.js';\r\nimport Connection, { Connectable } from '../src/connection';\r\nimport eventer, { EventArgs } from '../util/eventer';\r\nimport userState from '../util/user-state';\r\nimport Field, { AnyField } from '../src/field';\r\nimport NodeSvg from '../src/nodesvg';\r\nimport waitFrames from '../util/wait-anim-frames';\r\nimport WorkspaceSvg from '../src/workspace-svg';\r\ninterface ConnectionV {\r\n conn: Connection,\r\n el: Element,\r\n args?: EventArgs\r\n}\r\ninterface ConnectionState {\r\n one: null | ConnectionV,\r\n two: null | ConnectionV\r\n}\r\n\r\n\r\nconst cState: ConnectionState = {\r\n one: null,\r\n two: null\r\n}\r\n\r\n\r\nfunction initConnector(el: Element, args?: EventArgs) {\r\n args = args as {\r\n connection: Connection,\r\n node?: NodeSvg,\r\n field?: AnyField\r\n };\r\n if (args.field && !args.field?.canEditConnector) { // If editing isnt allowed, close the event early.\r\n return; \r\n }\r\n el.on('click', () => {\r\n const isPrev = args.connection.isPrevious;\r\n\r\n // First click → must NOT be previous\r\n if (!cState.one) {\r\n if (isPrev) {\r\n el.addClass('KabelConnectionBubbleHighlightWrong');\r\n waitFrames(10, () => {\r\n el.removeClass('KabelConnectionBubbleHighlightWrong');\r\n })\r\n return;\r\n }\r\n cState.one = { conn: args.connection, el, args };\r\n el.addClass('KabelConnectionBubbleHighlight');\r\n userState.setState('connecting')\r\n return;\r\n }\r\n\r\n // Second click → must be previous\r\n if (!cState.two && (args?.node !== cState.one?.args?.node)) {\r\n if (!isPrev) {\r\n el.addClass('KabelConnectionBubbleHighlightWrong');\r\n waitFrames(10, () => {\r\n el.removeClass('KabelConnectionBubbleHighlightWrong');\r\n })\r\n return;\r\n }\r\n if (cState.one.conn === args.connection) return; // ignore clicking the same again\r\n cState.two = { conn: args.connection, el, args };\r\n el.addClass('KabelConnectionBubbleHighlight');\r\n }\r\n\r\n // Both are filled → attempt to connect\r\n if (cState.one && cState.two) {\r\n if (cState.two.args?.node == cState.one.args?.node || cState.two.args?.node === cState.one?.args?.field?.node) {\r\n cState.one.el.addClass('KabelConnectionBubbleHighlightWrong');\r\n cState.two.el.addClass('KabelConnectionBubbleHighlightWrong');\r\n waitFrames(10, () => {\r\n if (!cState) return;\r\n if (!cState.one || !cState.two) return;\r\n cState.one.el.removeClass('KabelConnectionBubbleHighlightWrong');\r\n cState.two.el.removeClass('KabelConnectionBubbleHighlightWrong');\r\n cState.one = null;\r\n cState.two = null;\r\n })\r\n userState.removeState('connecting');\r\n return;\r\n }\r\n const { conn: connA } = cState.one;\r\n const { conn: connB } = cState.two;\r\n\r\n connA.disconnectTo();\r\n connB.disconnectFrom();\r\n\r\n connA.to = cState.two.args?.node;\r\n connB.from = cState.one.args?.node || cState.one.args?.field;\r\n\r\n waitFrames(2, () => {\r\n if (cState.one?.args?.node) {\r\n cState.one.args.node.workspace?.redraw();\r\n (cState.one.args.node.workspace as WorkspaceSvg).emitChange();\r\n } else if (cState.two?.args?.node) {\r\n cState.two.args.node.workspace?.redraw();\r\n (cState!.two!.args.node!.workspace as WorkspaceSvg).emitChange();\r\n\r\n }\r\n \r\n \r\n cState.one = null;\r\n cState.two = null;\r\n userState.removeState('connecting');\r\n\r\n });\r\n }\r\n });\r\n return () => {\r\n el.off('click'); // removes the click listener\r\n };\r\n\r\n}\r\n\r\neventer.registerEvent('k_connectbubble', initConnector);\r\n","import { parseColor } from \"../util/parse-color\";\r\nimport { TblxCategoryStruct, TblxNodeStruct } from \"./inject\";\r\nimport Toolbox from \"./toolbox\";\r\nimport { Color } from \"./visual-types\";\r\n\r\n/**\r\n * Represents a category in the toolbox, containing nodes and a label.\r\n */\r\nclass Category {\r\n\t/** Display label for the category */\r\n\tlabel: string;\r\n\t/** Category color */\r\n\tcolor: Color;\r\n\t/** Nodes contained in this category */\r\n\tcontents: TblxNodeStruct[];\r\n\t/** HTML button element representing this category row */\r\n\t_rowDiv!: HTMLButtonElement;\r\n\t/** Reference to parent toolbox */\r\n\t_toolbox: Toolbox;\r\n\r\n\t/**\r\n\t * @param toolbox The parent Toolbox instance\r\n\t * @param cData Category data (label, color, nodes)\r\n\t */\r\n\tconstructor(toolbox: Toolbox, cData: TblxCategoryStruct) {\r\n\t\tthis.label = cData.name;\r\n\t\tthis.color = cData.color;\r\n\t\tthis.contents = cData.contents;\r\n\t\tthis._toolbox = toolbox;\r\n\t\tthis._makeDiv();\r\n\t}\r\n\r\n\t/** Creates the category button in the UI and attaches click events */\r\n\t_makeDiv() {\r\n\t\tconst btn = document.createElement(\"button\");\r\n\t\tbtn.textContent = this.label;\r\n\t\tbtn.className = \"KabelCategoryRow\";\r\n\t\tbtn.style.backgroundColor = parseColor(this.color);\r\n\t\tbtn.style.color = parseColor('#ffffff');\r\n\t\tthis._rowDiv = btn;\r\n\r\n\t\tbtn.addEventListener(\"click\", e => {\r\n\t\t\te.stopPropagation();\r\n\t\t\tthis._toolbox._flyout.clear();\r\n\t\t\tthis._toolbox._flyout.fill(this.contents);\r\n\t\t\tthis._toolbox._flyout.show();\r\n\t\t});\r\n\r\n\t\tthis._toolbox.container.appendChild(btn);\r\n\t}\r\n\r\n\t/**\r\n\t * Refreshes the category UI with new data\r\n\t * @param cData Partial data to update (name, color, contents)\r\n\t */\r\n\trefresh(cData: Partial<TblxCategoryStruct>) {\r\n\t\tif (cData.name !== undefined) {\r\n\t\t\tthis.label = cData.name;\r\n\t\t\tthis._rowDiv.textContent = this.label;\r\n\t\t}\r\n\t\tif (cData.color !== undefined) {\r\n\t\t\tthis.color = cData.color;\r\n\t\t\tthis._rowDiv.style.backgroundColor = parseColor(this.color);\r\n\t\t}\r\n\t\tif (cData.contents !== undefined) {\r\n\t\t\tthis.contents = cData.contents;\r\n\t\t}\r\n\t}\r\n\r\n\t/** Remove category row from the toolbox */\r\n\tdestroy() {\r\n\t\tthis._rowDiv.remove();\r\n\t\tthis._toolbox = null as unknown as Toolbox;\r\n\t}\r\n\r\n\t/** Hide this category from the UI */\r\n\thide() {\r\n\t\tthis._rowDiv.style.display = \"none\";\r\n\t}\r\n\r\n\t/** Show this category in the UI */\r\n\tshow() {\r\n\t\tthis._rowDiv.style.display = \"\";\r\n\t}\r\n\r\n\t/**\r\n\t * Enable or disable interaction with this category\r\n\t * @param disabled True to disable, false to enable\r\n\t */\r\n\tsetDisabled(disabled: boolean) {\r\n\t\tthis._rowDiv.disabled = disabled;\r\n\t}\r\n\r\n\t/**\r\n\t * Returns a plain object representation of this category\r\n\t * @returns JSON-compatible category object\r\n\t */\r\n\ttoJSON(): TblxCategoryStruct {\r\n\t\treturn {\r\n\t\t\tname: this.label,\r\n\t\t\tcolor: this.color,\r\n\t\t\tcontents: this.contents,\r\n\t\t};\r\n\t}\r\n}\r\n\r\nexport default Category;\r\n","import NodeSvg from '../src/nodesvg';\r\nimport WorkspaceSvg from '../src/workspace-svg';\r\nimport { Element } from '@svgdotjs/svg.js';\r\nimport Renderer, { DrawState } from './renderer';\r\nimport RendererConstants from './constants';\r\nimport { parseColor } from '../util/parse-color';\r\nimport {Color} from '../src/visual-types';\r\n\r\nexport class RepresenterNode {\r\n\tnode: NodeSvg;\r\n\tstate: DrawState;\r\n renderer: Renderer;\r\n\tconstructor(node: NodeSvg, svgState: DrawState, renderer: Renderer) {\r\n this.renderer = renderer;\r\n\t\tthis.node = node;\r\n\t\tthis.state = svgState;\r\n\r\n\t\t// Attach this wrapper to the node for external access\r\n\t\tnode.svg = this;\r\n\t}\r\n getConstant(name: keyof RendererConstants) {\r\n return this.renderer._constants[name];\r\n }\r\n\t/** Move node visually without changing its relativeCoords */\r\n\tmoveTo(x: number, y: number) {\r\n\t\tthis.state.group!.move(x, y);\r\n\t}\r\n\r\n\t/** Scale node visually */\r\n\tsetScale(scale: number) {\r\n\t\tthis.state.group!.scale(scale);\r\n\t}\r\n\r\n\t/** Apply raw transform string */\r\n\tapplyTransform(transform: string) {\r\n\t\tthis.state.group!.attr({ transform });\r\n\t}\r\n\r\n\t/** Access the raw SVG group */\r\n\tgetRaw() {\r\n\t\treturn this.state.group;\r\n\t}\r\n\r\n\t/** Optional: highlight node */\r\n\thighlight(color = '#ff0') {\r\n if (!color || color.length == 0 || typeof color !== 'string') {\r\n this.highlight(parseColor(this.getConstant('NODE_OUTLINE_COLOR') as Color) as string);\r\n return;\r\n }\r\n\t\tthis.state.bg!.stroke({ color, width: 2 });\r\n\t}\r\n}\r\n","import Field, { ConnectableField } from \"./field\";\r\nimport NodeSvg from \"./nodesvg\";\r\n\r\n/**\r\n * A node or field that can participate in a connection.\r\n */\r\nexport type Connectable = NodeSvg | null | Field;\r\n\r\n/**\r\n * Represents a connection between two connectable objects.\r\n */\r\nclass Connection {\r\n\t/** The source of the connection */\r\n\tfrom: Connectable;\r\n\t/** The target of the connection */\r\n\tto: Connectable;\r\n\t/** Whether this connection represents a previous connection (affects rendering/logic) */\r\n\tisPrevious: boolean;\r\n\r\n\t/**\r\n\t * Creates a new Connection.\r\n\t * @param from - The source NodeSvg or Field\r\n\t * @param to - The target NodeSvg or Field\r\n\t * @param isPrevious - True if this connection is a previous connection\r\n\t */\r\n\tconstructor(from: Connectable, to: Connectable, isPrevious: boolean = false) {\r\n\t\tthis.from = from;\r\n\t\tthis.to = to;\r\n\t\tthis.isPrevious = isPrevious;\r\n\t}\r\n\r\n\t/** Returns the target of the connection */\r\n\tgetTo(): Connectable {\r\n\t\treturn this.to;\r\n\t}\r\n\r\n\t/** Returns the source of the connection */\r\n\tgetFrom(): Connectable {\r\n\t\treturn this.from;\r\n\t}\r\n\r\n\t/**\r\n\t * Disconnects this connection from its target.\r\n\t * Safely handles NodeSvg chains and ConnectableFields.\r\n\t */\r\n\tdisconnectTo() {\r\n\t\tif (!this.to) return;\r\n\r\n\t\tif (this.to instanceof NodeSvg && this.to.previousConnection) {\r\n\t\t\tconst prevConn = this.to.previousConnection;\r\n\t\t\tconst prevFrom = prevConn.from;\r\n\r\n\t\t\t// Disconnect NodeSvg chain\r\n\t\t\tif (prevFrom instanceof NodeSvg && prevFrom.nextConnection?.to) {\r\n\t\t\t\tprevFrom.nextConnection.to = null;\r\n\t\t\t}\r\n\r\n\t\t\t// Disconnect Field chain\r\n\t\t\tif (prevFrom instanceof Field && prevFrom.hasConnectable?.()) {\r\n\t\t\t\t(prevFrom as ConnectableField).disconnect();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.to = null;\r\n\t}\r\n\r\n\t/**\r\n\t * Disconnects this connection from its source.\r\n\t * Safely handles NodeSvg chains and ConnectableFields.\r\n\t */\r\n\tdisconnectFrom() {\r\n\t\tif (!this.from) return;\r\n\r\n\t\tif (this.from instanceof NodeSvg && this.from.nextConnection) {\r\n\t\t\tconst next = this.from.nextConnection;\r\n\r\n\t\t\tif (next.to instanceof NodeSvg && next.to.previousConnection?.from) {\r\n\t\t\t\tnext.to.previousConnection.from = null;\r\n\t\t\t} else if (next.to instanceof Field && next.to.hasConnectable()) {\r\n\t\t\t\t(next.to as ConnectableField).disconnect();\r\n\t\t\t}\r\n\r\n\t\t\tnext.to = null;\r\n\t\t} else if (this.from instanceof Field && this.from.hasConnectable()) {\r\n\t\t\t(this.from as ConnectableField).disconnect();\r\n\t\t}\r\n\r\n\t\tthis.from = null;\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the target of this connection (used during deserialization)\r\n\t * @param target - New connection target\r\n\t */\r\n\tsetTo(target: Connectable) {\r\n\t\tthis.to = target;\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the source of this connection (used during deserialization)\r\n\t * @param source - New connection source\r\n\t */\r\n\tsetFrom(source: Connectable) {\r\n\t\tthis.from = source;\r\n\t}\r\n\r\n\t/** Completely isolates this connection, clearing both ends */\r\n\tisolate() {\r\n\t\tthis.from = null as any;\r\n\t\tthis.to = null as any;\r\n\t}\r\n}\r\n\r\nexport default Connection;\r\n","import { Color } from \"../../src/visual-types\";\r\nimport RendererConstants from \"../constants\";\r\n\r\n// Define the new Dogear shape\r\ntype DogearShape = {\r\n PathMain: string;\r\n Width: number;\r\n Height: number;\r\n};\r\n\r\n// Extend the original SHAPES type\r\ntype ApolloShapes = RendererConstants['SHAPES'] & {\r\n Dogear?: DogearShape;\r\n};\r\n\r\nclass ApolloConstants extends RendererConstants {\r\n SHAPES: ApolloShapes = {};\r\n CONNECTOR_COLOR: Color = '#9912e8ff'\r\n FIELD_RAW_COLOR: Color = '#343745ff';\r\n FIELD_RAW_TEXT_COLOR: Color = '#cfd4e4ff';\r\n FIELD_RAW_OUTLINE_COLOR: Color = '#202128ff';\r\n constructor(overrides: Partial<ApolloConstants>) {\r\n super(overrides);\r\n this.CONNECTOR_LINE_WIDTH = 2.5;\r\n this.CORNER_RADIUS = 10;\r\n this.FOOTER_HEIGHT = 25;\r\n this.CONNECTOR_LINE_WIDTH = 7;\r\n this.init();\r\n }\r\n\r\n init() {\r\n this.SHAPES.Dogear = {\r\n PathMain: `M -1 1 Q -1 21 0 30 L 26 0 Q 2 -1 0 0 Z`,\r\n Width: 26,\r\n Height: 30\r\n };\r\n }\r\n}\r\n\r\nexport default ApolloConstants;\r\n","import { Element, Rect, Text } from \"@svgdotjs/svg.js\";\r\nimport eventer, { EventSetupFn } from \"../util/eventer\";\r\nimport userState from '../util/user-state';\r\nimport { Renderer } from \"../src\";\r\n\r\nfunction initInputBox(element: Element, args: Record<string, any>) {\r\n let editing = false;\r\n let skipNextClick = false;\r\n let buffer = args.field.getDisplayValue?.() ?? \"\";\r\n let cursorPos = buffer.length;\r\n let anchorPos = buffer.length;\r\n const txt: Text = args.text;\r\n const rect: Rect = element as Rect;\r\n const renderer = args.renderer as Renderer;\r\n const PADDING_X = 4;\r\n const PADDING_Y = 4;\r\n let caretLine: Rect | null = null;\r\n let selectionRect: Rect | null = null;\r\n // @ts-ignore\r\n txt!.style('user-select', 'none');\r\n // @ts-ignore\r\n rect!.style('user-select', 'none');\r\n\r\n // Helper: measure width of text using renderer or fallback\r\n function measureTextWidth(text: string) {\r\n\r\n if (renderer.measureTextWidth) return renderer.measureTextWidth(text);\r\n return text.length * 8; // rough fallback\r\n }\r\n\r\n function getSelectionRange() {\r\n const start = Math.min(cursorPos, anchorPos);\r\n const end = Math.max(cursorPos, anchorPos);\r\n return { start, end };\r\n }\r\n\r\n function hasSelection() {\r\n return cursorPos !== anchorPos;\r\n }\r\n\r\n function deleteSelection() {\r\n if (!hasSelection()) return false;\r\n const { start, end } = getSelectionRange();\r\n buffer = buffer.slice(0, start) + buffer.slice(end);\r\n cursorPos = start;\r\n anchorPos = start;\r\n return true;\r\n }\r\n\r\n function updateText() {\r\n // redraw main text\r\n txt.text(buffer);\r\n\r\n const { start, end } = getSelectionRange();\r\n const { width: totalWidth } = renderer.measureRawField(buffer);\r\n const { height: rectHeight } = rect.bbox(); // actual rect height\r\n\r\n const textBBox = txt.bbox();\r\n const offsetY = (rectHeight - textBBox.height) / 2; // center vertically\r\n\r\n // --- selection highlight ---\r\n if (hasSelection()) {\r\n const textBeforeStart = buffer.slice(0, start);\r\n const textBeforeEnd = buffer.slice(0, end);\r\n const highlightX = args.startX + PADDING_X + measureTextWidth(textBeforeStart);\r\n const highlightWidth = Math.max(measureTextWidth(textBeforeEnd) - measureTextWidth(textBeforeStart), 1);\r\n const highlightY = offsetY; // use offsetY for vertical alignment\r\n\r\n if (!selectionRect) {\r\n // @ts-ignore\r\n selectionRect = rect.parent()!.rect(highlightWidth, textBBox.height)\r\n .fill('#3390ff')\r\n .attr({ 'fill-opacity': 0.35 });\r\n selectionRect!.node.parentNode!.insertBefore(selectionRect!.node, txt.node);\r\n } else {\r\n selectionRect.size(highlightWidth, textBBox.height);\r\n }\r\n\r\n selectionRect!.move(highlightX, highlightY);\r\n } else {\r\n if (selectionRect) { selectionRect.remove(); selectionRect = null; }\r\n }\r\n\r\n // --- caret ---\r\n if (editing) {\r\n const zoom = renderer.getWs().getZoom(); // workspace zoom\r\n const caretX = (args.startX + PADDING_X + measureTextWidth(buffer.slice(0, cursorPos))); // scale pos\r\n const caretH = textBBox.height;\r\n // @ts-ignore\r\n if (!caretLine) caretLine = rect.parent()!.rect(1, caretH).fill(renderer.constants.FIELD_RAW_TEXT_COLOR);\r\n caretLine!.size(1, caretH).move(caretX, offsetY);\r\n } else {\r\n if (caretLine) { caretLine.remove(); caretLine = null; }\r\n }\r\n\r\n // --- background rect ---\r\n rect.size(Math.max(16, totalWidth + PADDING_X * 2), Math.max(rectHeight, textBBox.height + PADDING_Y * 2));\r\n txt.move(args.startX + PADDING_X, offsetY);\r\n }\r\n\r\n\r\n function onKeyDown(e: KeyboardEvent) {\r\n if (!args.field.canEdit()) { // If editing isnt allowed, close the event early.\r\n if (editing) stopEditing();\r\n return;\r\n }\r\n if (!editing) return;\r\n\r\n if (e.key === \"Escape\") { e.preventDefault(); stopEditing(); return; }\r\n if (e.key === \"Enter\") { e.preventDefault(); stopEditing(); return; }\r\n\r\n if (e.key === \"Backspace\") {\r\n if (!deleteSelection() && cursorPos > 0) {\r\n buffer = buffer.slice(0, cursorPos - 1) + buffer.slice(cursorPos);\r\n cursorPos--;\r\n anchorPos = cursorPos;\r\n }\r\n } else if (e.key === \"Delete\") {\r\n if (!deleteSelection() && cursorPos < buffer.length) {\r\n buffer = buffer.slice(0, cursorPos) + buffer.slice(cursorPos + 1);\r\n }\r\n } else if (e.key === \"ArrowLeft\") {\r\n if (e.shiftKey) cursorPos = Math.max(0, cursorPos - 1);\r\n else { cursorPos = Math.max(0, cursorPos - 1); anchorPos = cursorPos; }\r\n } else if (e.key === \"ArrowRight\") {\r\n if (e.shiftKey) cursorPos = Math.min(buffer.length, cursorPos + 1);\r\n else { cursorPos = Math.min(buffer.length, cursorPos + 1); anchorPos = cursorPos; }\r\n } else if (e.key === \"Home\") {\r\n if (!e.shiftKey) anchorPos = 0;\r\n cursorPos = 0;\r\n } else if (e.key === \"End\") {\r\n if (!e.shiftKey) anchorPos = buffer.length;\r\n cursorPos = buffer.length;\r\n } else if (e.key.length === 1 && !e.ctrlKey && !e.metaKey) {\r\n if (hasSelection()) deleteSelection();\r\n buffer = buffer.slice(0, cursorPos) + e.key + buffer.slice(cursorPos);\r\n cursorPos++;\r\n anchorPos = cursorPos;\r\n } else return;\r\n\r\n e.preventDefault();\r\n updateText();\r\n args.field.setValue(buffer);\r\n }\r\n\r\n function onClickOutside(ev: MouseEvent) {\r\n if (!editing) return;\r\n if (skipNextClick) { skipNextClick = false; return; }\r\n const target = ev.target as Node;\r\n if (target !== rect.node && target !== txt.node) stopEditing();\r\n }\r\n\r\n function startEditing(ev?: MouseEvent) {\r\n if (!args.field.canEdit()) { // If editing isnt allowed, close the event early.\r\n if (editing) stopEditing();\r\n return;\r\n }\r\n if (editing) return;\r\n editing = true;\r\n buffer = args.field.getValue?.() ?? \"\";\r\n cursorPos = buffer.length;\r\n anchorPos = buffer.length;\r\n\r\n userState.setState('typing');\r\n\r\n if (ev) {\r\n const rectBox = rect.node.getBoundingClientRect();\r\n const zoom = renderer.getWs().getZoom(); // workspace zoom\r\n const clickX = (ev.clientX - rectBox.left - PADDING_X) / zoom;\r\n\r\n let cumulativeWidth = 0;\r\n cursorPos = 0;\r\n for (let i = 0; i < buffer.length; i++) {\r\n const charWidth = measureTextWidth(buffer[i]); // scale widths\r\n if (cumulativeWidth + charWidth / 2 >= clickX) break;\r\n cumulativeWidth += charWidth;\r\n cursorPos = i + 1;\r\n }\r\n }\r\n\r\n anchorPos = cursorPos;\r\n updateText();\r\n skipNextClick = true;\r\n\r\n document.addEventListener(\"keydown\", onKeyDown);\r\n document.addEventListener(\"mousedown\", onClickOutside);\r\n }\r\n\r\n function stopEditing() {\r\n editing = false;\r\n userState.removeState('typing');\r\n document.removeEventListener(\"keydown\", onKeyDown);\r\n document.removeEventListener(\"mousedown\", onClickOutside);\r\n args.field.setValue(buffer);\r\n updateText();\r\n renderer.getWs().redraw();\r\n renderer.getWs().emitChange();\r\n }\r\n\r\n rect.on(\"mousedown\", (ev: Event) => startEditing(ev as MouseEvent));\r\n txt.on(\"mousedown\", (ev: Event) => startEditing(ev as MouseEvent));\r\n\r\n updateText();\r\n\r\n return () => {\r\n rect.off(\"mousedown\", startEditing as EventListener);\r\n txt.off(\"mousedown\", startEditing as EventListener);\r\n document.removeEventListener(\"keydown\", onKeyDown);\r\n document.removeEventListener(\"mousedown\", onClickOutside);\r\n };\r\n}\r\n\r\neventer.registerEvent(\"k_inputbox\", initInputBox as EventSetupFn);\r\n","import NodeSvg from '../src/nodesvg';\r\nimport Renderer, { DrawState } from './renderer';\r\nimport { RepresenterNode } from './representer-node';\r\n\r\nexport default class Representer {\r\n\tnodes: Map<string, RepresenterNode> = new Map();\r\n\r\n\t/** Build a representer node for a drawn node */\r\n\tbuild(node: NodeSvg, renderer: Renderer, state: DrawState) {\r\n\t\tif (!node) return;\r\n\t\tconst repNode = new RepresenterNode(node, state, renderer);\r\n\t\tthis.nodes.set(node.id, repNode);\r\n\t\treturn repNode;\r\n\t}\r\n\r\n\t/** Get a representer node by node id */\r\n\tget(nodeId: string): RepresenterNode | undefined {\r\n\t\treturn this.nodes.get(nodeId);\r\n\t}\r\n\r\n\t/** Remove a node from the representer */\r\n\tremove(nodeId: string) {\r\n\t\tthis.nodes.delete(nodeId);\r\n\t}\r\n}\r\n","import WorkspaceController from \"../controllers/base\";\r\nimport unescapeAttr from \"../util/unescape-html\";\r\nimport CommentModel from \"./comment\";\r\nimport Coordinates from \"./coordinates\";\r\nimport ContextOptsRegistry from \"./ctx-menu-registry\";\r\nimport NodeSvg from \"./nodesvg\";\r\nimport Widget from \"./widget\";\r\nimport WorkspaceSvg from \"./workspace-svg\";\r\n/**\r\n * A list of types that a context menu item can show for.\r\n */\r\nexport type Showable = 'node' | 'ws' | 'html' | 'comment' | 'any';\r\n\r\n/**\r\n * Describes a context menu option.\r\n */\r\nexport interface ContextMenuOpts {\r\n /** Function executed when the option is clicked */\r\n click: (target: NodeSvg | WorkspaceSvg | CommentModel | HTMLElement) => void;\r\n /** Optional hover start callback */\r\n onHoverStart?: () => void;\r\n /** Optional hover end callback */\r\n onHoverEnd?: () => void;\r\n /** Specifies which target types this option should appear for */\r\n showFor?: Showable | Showable[];\r\n /** Specifies extra logic for drawing */\r\n onDraw?: (optEl: Node, ws: WorkspaceSvg, opt: ContextMenuOpts) => void;\r\n /** Text label for the menu option */\r\n label: string;\r\n /** Unique ID for the option */\r\n id: string;\r\n}\r\n\r\n/**\r\n * HTML context menu rendered on workspace right-click.\r\n */\r\nclass ContextMenuHTML {\r\n /**\r\n * The workspace.\r\n */\r\n workspace: WorkspaceSvg;\r\n /**\r\n * The workspace's controller\r\n */\r\n controller: WorkspaceController;\r\n /**\r\n * The widget in the workspace to display the menu on.\r\n */\r\n widget: Widget;\r\n /**\r\n * Options for the context menu.\r\n */\r\n options: ContextMenuOpts[];\r\n\r\n /**\r\n * Create a new context menu for a workspace.\r\n * @param workspace - Workspace to attach the context menu to\r\n */\r\n constructor(workspace: WorkspaceSvg) {\r\n this.workspace = workspace;\r\n this.controller = this.workspace.controller;\r\n this.widget = new Widget(this.workspace, {\r\n coords: new Coordinates(0, 0),\r\n name: 'k_contextmenu',\r\n className: 'KabelContextMenu'\r\n });\r\n\r\n // Override show/hide methods to manipulate CSS\r\n this.widget.show = () => {\r\n this.widget.container.classList.add('show');\r\n this.widget.container.style.display = 'flex';\r\n this.widget.visible = true;\r\n };\r\n this.widget.hide = () => {\r\n this.widget.container.classList.remove('show');\r\n this.widget.container.style.display = 'none';\r\n this.widget.visible = false;\r\n };\r\n this.widget.container.style.removeProperty('height');\r\n this.widget.container.style.removeProperty('width');\r\n\r\n this.widget.hide();\r\n this.options = ContextOptsRegistry;\r\n this.initListeners();\r\n }\r\n\r\n /**\r\n * Renders context menu options for a given target.\r\n * @param target - The object the context menu is for\r\n */\r\n renderOptions(target: NodeSvg | WorkspaceSvg | HTMLElement | CommentModel | null) {\r\n this.widget.container.innerHTML = '';\r\n\r\n const filteredOptions = this.options.filter(opt => {\r\n if (!target) return false;\r\n const showFor = Array.isArray(opt.showFor) ? opt.showFor : [opt.showFor];\r\n if (showFor.includes('any')) return true;\r\n if (target instanceof NodeSvg && showFor.includes('node')) return true;\r\n if (target instanceof WorkspaceSvg && showFor.includes('ws')) return true;\r\n if (target instanceof HTMLElement && !(target instanceof SVGSVGElement) && showFor.includes('html')) return true;\r\n if (target instanceof CommentModel && showFor.includes('comment')) return true;\r\n return false;\r\n });\r\n\r\n filteredOptions.forEach((opt, i) => {\r\n const el = document.createElement('div');\r\n el.className = 'KabelContextOption';\r\n el.textContent = opt.label || 'Option ' + i;\r\n\r\n el.addEventListener('click', () => {\r\n if (target) opt.click(target);\r\n this.hide();\r\n });\r\n if (opt.onDraw) opt.onDraw(el, this.workspace, opt);\r\n if (opt.onHoverStart) el.addEventListener('mouseenter', () => opt.onHoverStart?.());\r\n if (opt.onHoverEnd) el.addEventListener('mouseleave', () => opt.onHoverEnd?.());\r\n\r\n this.widget.container.appendChild(el);\r\n });\r\n }\r\n\r\n /**\r\n * Initializes event listeners for showing/hiding the menu.\r\n */\r\n initListeners() {\r\n if (this.controller) {\r\n this.controller.addMoveListener(() => {\r\n if (this.widget.visible) this.hide();\r\n })\r\n }\r\n this.workspace.svg.node.addEventListener('contextmenu', e => {\r\n e.preventDefault();\r\n const mouseX = e.clientX;\r\n const mouseY = e.clientY;\r\n\r\n this.widget.setCoords(new Coordinates(mouseX, mouseY));\r\n this.renderOptions(this.target);\r\n this.widget.show();\r\n });\r\n\r\n document.addEventListener('mousedown', e => {\r\n if (!this.widget.container.contains(e.target as Node)) {\r\n this.hide();\r\n }\r\n });\r\n }\r\n\r\n /** Hides the context menu */\r\n hide() {\r\n this.widget.hide();\r\n }\r\n\r\n /** Returns the current mouse position in workspace coordinates */\r\n get mousePos(): { x: number, y: number } {\r\n return this.controller.mousePos;\r\n }\r\n\r\n /**\r\n * Returns the target element under the mouse for context menu.\r\n */\r\n get target(): NodeSvg | WorkspaceSvg | HTMLElement | CommentModel | null {\r\n let el = document.elementFromPoint(this.mousePos.x, this.mousePos.y) as HTMLElement | null;\r\n if (!el) return null;\r\n if ((el as unknown as SVGSVGElement) === this.workspace.svg.node) return this.workspace;\r\n\r\n if (el && el.classList?.contains?.('WorkspaceBgPattern')) return this.workspace;\r\n\r\n while (el && el !== document.body) {\r\n if (el.tagName.toLowerCase() === 'g' && el.hasAttribute('data-node-id')) {\r\n const nodeId = unescapeAttr(el.getAttribute('data-node-id') as string);\r\n const node = this.workspace.getNode(nodeId);\r\n if (node) return node;\r\n }\r\n if (el.tagName.toLowerCase() === 'g' && el.hasAttribute('comment-data')) {\r\n const dta = JSON.parse(el.getAttribute('comment-data') as string);\r\n if (!dta.id && !dta.isws) continue;\r\n if (dta.isws) {\r\n for (let comment of this.workspace._commentDB) {\r\n if (comment.id === dta.id) return comment;\r\n }\r\n } else {\r\n for (let [_, node] of this.workspace._nodeDB) {\r\n if (node.comment && node.comment.id == dta.id) return node.comment;\r\n }\r\n }\r\n }\r\n el = el.parentElement;\r\n }\r\n\r\n return document.elementFromPoint(this.mousePos.x, this.mousePos.y) as HTMLElement | null;\r\n }\r\n}\r\n\r\nexport default ContextMenuHTML;\r\n","import type { WSTheme } from '../src/workspace-svg';\r\n\r\nconst KabelDarkTheme: WSTheme = {\r\n\tUIStyles: {\r\n\t\tworkspaceBGColor: '#121412ff',\r\n\t\ttoolboxCategoriesBG: {\r\n\t\t\tposition: 'absolute',\r\n\t\t\tleft: '0',\r\n\t\t\ttop: '0',\r\n\t\t\twidth: '20%',\r\n\t\t\theight: '100%',\r\n\t\t\tbackground: '#1b1b1b',\r\n\t\t\tcolor: '#e0e0e0',\r\n\t\t\toverflowY: 'auto',\r\n\t\t\tborder: 'none',\r\n\t\t\toutline: 'none',\r\n\t\t},\r\n\t\ttoolboxFlyoutBG: {\r\n\t\t\tdisplay: 'block',\r\n\t\t\tbackground: '#1e1e1e',\r\n\t\t\tcolor: '#e0e0e0',\r\n\t\t\toverflowY: 'auto',\r\n\t\t\tpadding: '4px', \r\n\t\t\tborderRadius: '4px',\r\n\t\t\tboxShadow: '0 2px 6px rgba(0,0,0,0.5)',\r\n\t\t\tborder: 'none',\r\n\t\t\toutline: 'none',\r\n\t\t},\r\n\t},\r\n};\r\n\r\nexport default KabelDarkTheme;\r\n","/*!\n* @svgdotjs/svg.js - A lightweight library for manipulating and animating SVG.\n* @version 3.2.4\n* https://svgjs.dev/\n*\n* @copyright Wout Fierens <wout@mick-wout.com>\n* @license MIT\n*\n* BUILT: Thu Jun 27 2024 12:00:16 GMT+0200 (Central European Summer Time)\n*/;\n'use strict';\n\nconst methods$1 = {};\nconst names = [];\nfunction registerMethods(name, m) {\n if (Array.isArray(name)) {\n for (const _name of name) {\n registerMethods(_name, m);\n }\n return;\n }\n if (typeof name === 'object') {\n for (const _name in name) {\n registerMethods(_name, name[_name]);\n }\n return;\n }\n addMethodNames(Object.getOwnPropertyNames(m));\n methods$1[name] = Object.assign(methods$1[name] || {}, m);\n}\nfunction getMethodsFor(name) {\n return methods$1[name] || {};\n}\nfunction getMethodNames() {\n return [...new Set(names)];\n}\nfunction addMethodNames(_names) {\n names.push(..._names);\n}\n\n// Map function\nfunction map(array, block) {\n let i;\n const il = array.length;\n const result = [];\n for (i = 0; i < il; i++) {\n result.push(block(array[i]));\n }\n return result;\n}\n\n// Filter function\nfunction filter(array, block) {\n let i;\n const il = array.length;\n const result = [];\n for (i = 0; i < il; i++) {\n if (block(array[i])) {\n result.push(array[i]);\n }\n }\n return result;\n}\n\n// Degrees to radians\nfunction radians(d) {\n return d % 360 * Math.PI / 180;\n}\n\n// Radians to degrees\nfunction degrees(r) {\n return r * 180 / Math.PI % 360;\n}\n\n// Convert camel cased string to dash separated\nfunction unCamelCase(s) {\n return s.replace(/([A-Z])/g, function (m, g) {\n return '-' + g.toLowerCase();\n });\n}\n\n// Capitalize first letter of a string\nfunction capitalize(s) {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\n// Calculate proportional width and height values when necessary\nfunction proportionalSize(element, width, height, box) {\n if (width == null || height == null) {\n box = box || element.bbox();\n if (width == null) {\n width = box.width / box.height * height;\n } else if (height == null) {\n height = box.height / box.width * width;\n }\n }\n return {\n width: width,\n height: height\n };\n}\n\n/**\n * This function adds support for string origins.\n * It searches for an origin in o.origin o.ox and o.originX.\n * This way, origin: {x: 'center', y: 50} can be passed as well as ox: 'center', oy: 50\n **/\nfunction getOrigin(o, element) {\n const origin = o.origin;\n // First check if origin is in ox or originX\n let ox = o.ox != null ? o.ox : o.originX != null ? o.originX : 'center';\n let oy = o.oy != null ? o.oy : o.originY != null ? o.originY : 'center';\n\n // Then check if origin was used and overwrite in that case\n if (origin != null) {\n [ox, oy] = Array.isArray(origin) ? origin : typeof origin === 'object' ? [origin.x, origin.y] : [origin, origin];\n }\n\n // Make sure to only call bbox when actually needed\n const condX = typeof ox === 'string';\n const condY = typeof oy === 'string';\n if (condX || condY) {\n const {\n height,\n width,\n x,\n y\n } = element.bbox();\n\n // And only overwrite if string was passed for this specific axis\n if (condX) {\n ox = ox.includes('left') ? x : ox.includes('right') ? x + width : x + width / 2;\n }\n if (condY) {\n oy = oy.includes('top') ? y : oy.includes('bottom') ? y + height : y + height / 2;\n }\n }\n\n // Return the origin as it is if it wasn't a string\n return [ox, oy];\n}\nconst descriptiveElements = new Set(['desc', 'metadata', 'title']);\nconst isDescriptive = element => descriptiveElements.has(element.nodeName);\nconst writeDataToDom = (element, data, defaults = {}) => {\n const cloned = {\n ...data\n };\n for (const key in cloned) {\n if (cloned[key].valueOf() === defaults[key]) {\n delete cloned[key];\n }\n }\n if (Object.keys(cloned).length) {\n element.node.setAttribute('data-svgjs', JSON.stringify(cloned)); // see #428\n } else {\n element.node.removeAttribute('data-svgjs');\n element.node.removeAttribute('svgjs:data');\n }\n};\n\nvar utils = {\n __proto__: null,\n capitalize: capitalize,\n degrees: degrees,\n filter: filter,\n getOrigin: getOrigin,\n isDescriptive: isDescriptive,\n map: map,\n proportionalSize: proportionalSize,\n radians: radians,\n unCamelCase: unCamelCase,\n writeDataToDom: writeDataToDom\n};\n\n// Default namespaces\nconst svg = 'http://www.w3.org/2000/svg';\nconst html = 'http://www.w3.org/1999/xhtml';\nconst xmlns = 'http://www.w3.org/2000/xmlns/';\nconst xlink = 'http://www.w3.org/1999/xlink';\n\nvar namespaces = {\n __proto__: null,\n html: html,\n svg: svg,\n xlink: xlink,\n xmlns: xmlns\n};\n\nconst globals = {\n window: typeof window === 'undefined' ? null : window,\n document: typeof document === 'undefined' ? null : document\n};\nfunction registerWindow(win = null, doc = null) {\n globals.window = win;\n globals.document = doc;\n}\nconst save = {};\nfunction saveWindow() {\n save.window = globals.window;\n save.document = globals.document;\n}\nfunction restoreWindow() {\n globals.window = save.window;\n globals.document = save.document;\n}\nfunction withWindow(win, fn) {\n saveWindow();\n registerWindow(win, win.document);\n fn(win, win.document);\n restoreWindow();\n}\nfunction getWindow() {\n return globals.window;\n}\n\nclass Base {\n // constructor (node/*, {extensions = []} */) {\n // // this.tags = []\n // //\n // // for (let extension of extensions) {\n // // extension.setup.call(this, node)\n // // this.tags.push(extension.name)\n // // }\n // }\n}\n\nconst elements = {};\nconst root = '___SYMBOL___ROOT___';\n\n// Method for element creation\nfunction create(name, ns = svg) {\n // create element\n return globals.document.createElementNS(ns, name);\n}\nfunction makeInstance(element, isHTML = false) {\n if (element instanceof Base) return element;\n if (typeof element === 'object') {\n return adopter(element);\n }\n if (element == null) {\n return new elements[root]();\n }\n if (typeof element === 'string' && element.charAt(0) !== '<') {\n return adopter(globals.document.querySelector(element));\n }\n\n // Make sure, that HTML elements are created with the correct namespace\n const wrapper = isHTML ? globals.document.createElement('div') : create('svg');\n wrapper.innerHTML = element;\n\n // We can use firstChild here because we know,\n // that the first char is < and thus an element\n element = adopter(wrapper.firstChild);\n\n // make sure, that element doesn't have its wrapper attached\n wrapper.removeChild(wrapper.firstChild);\n return element;\n}\nfunction nodeOrNew(name, node) {\n return node && (node instanceof globals.window.Node || node.ownerDocument && node instanceof node.ownerDocument.defaultView.Node) ? node : create(name);\n}\n\n// Adopt existing svg elements\nfunction adopt(node) {\n // check for presence of node\n if (!node) return null;\n\n // make sure a node isn't already adopted\n if (node.instance instanceof Base) return node.instance;\n if (node.nodeName === '#document-fragment') {\n return new elements.Fragment(node);\n }\n\n // initialize variables\n let className = capitalize(node.nodeName || 'Dom');\n\n // Make sure that gradients are adopted correctly\n if (className === 'LinearGradient' || className === 'RadialGradient') {\n className = 'Gradient';\n\n // Fallback to Dom if element is not known\n } else if (!elements[className]) {\n className = 'Dom';\n }\n return new elements[className](node);\n}\nlet adopter = adopt;\nfunction mockAdopt(mock = adopt) {\n adopter = mock;\n}\nfunction register(element, name = element.name, asRoot = false) {\n elements[name] = element;\n if (asRoot) elements[root] = element;\n addMethodNames(Object.getOwnPropertyNames(element.prototype));\n return element;\n}\nfunction getClass(name) {\n return elements[name];\n}\n\n// Element id sequence\nlet did = 1000;\n\n// Get next named element id\nfunction eid(name) {\n return 'Svgjs' + capitalize(name) + did++;\n}\n\n// Deep new id assignment\nfunction assignNewId(node) {\n // do the same for SVG child nodes as well\n for (let i = node.children.length - 1; i >= 0; i--) {\n assignNewId(node.children[i]);\n }\n if (node.id) {\n node.id = eid(node.nodeName);\n return node;\n }\n return node;\n}\n\n// Method for extending objects\nfunction extend(modules, methods) {\n let key, i;\n modules = Array.isArray(modules) ? modules : [modules];\n for (i = modules.length - 1; i >= 0; i--) {\n for (key in methods) {\n modules[i].prototype[key] = methods[key];\n }\n }\n}\nfunction wrapWithAttrCheck(fn) {\n return function (...args) {\n const o = args[args.length - 1];\n if (o && o.constructor === Object && !(o instanceof Array)) {\n return fn.apply(this, args.slice(0, -1)).attr(o);\n } else {\n return fn.apply(this, args);\n }\n };\n}\n\n// Get all siblings, including myself\nfunction siblings() {\n return this.parent().children();\n}\n\n// Get the current position siblings\nfunction position() {\n return this.parent().index(this);\n}\n\n// Get the next element (will return null if there is none)\nfunction next() {\n return this.siblings()[this.position() + 1];\n}\n\n// Get the next element (will return null if there is none)\nfunction prev() {\n return this.siblings()[this.position() - 1];\n}\n\n// Send given element one step forward\nfunction forward() {\n const i = this.position();\n const p = this.parent();\n\n // move node one step forward\n p.add(this.remove(), i + 1);\n return this;\n}\n\n// Send given element one step backward\nfunction backward() {\n const i = this.position();\n const p = this.parent();\n p.add(this.remove(), i ? i - 1 : 0);\n return this;\n}\n\n// Send given element all the way to the front\nfunction front() {\n const p = this.parent();\n\n // Move node forward\n p.add(this.remove());\n return this;\n}\n\n// Send given element all the way to the back\nfunction back() {\n const p = this.parent();\n\n // Move node back\n p.add(this.remove(), 0);\n return this;\n}\n\n// Inserts a given element before the targeted element\nfunction before(element) {\n element = makeInstance(element);\n element.remove();\n const i = this.position();\n this.parent().add(element, i);\n return this;\n}\n\n// Inserts a given element after the targeted element\nfunction after(element) {\n element = makeInstance(element);\n element.remove();\n const i = this.position();\n this.parent().add(element, i + 1);\n return this;\n}\nfunction insertBefore(element) {\n element = makeInstance(element);\n element.before(this);\n return this;\n}\nfunction insertAfter(element) {\n element = makeInstance(element);\n element.after(this);\n return this;\n}\nregisterMethods('Dom', {\n siblings,\n position,\n next,\n prev,\n forward,\n backward,\n front,\n back,\n before,\n after,\n insertBefore,\n insertAfter\n});\n\n// Parse unit value\nconst numberAndUnit = /^([+-]?(\\d+(\\.\\d*)?|\\.\\d+)(e[+-]?\\d+)?)([a-z%]*)$/i;\n\n// Parse hex value\nconst hex = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i;\n\n// Parse rgb value\nconst rgb = /rgb\\((\\d+),(\\d+),(\\d+)\\)/;\n\n// Parse reference id\nconst reference = /(#[a-z_][a-z0-9\\-_]*)/i;\n\n// splits a transformation chain\nconst transforms = /\\)\\s*,?\\s*/;\n\n// Whitespace\nconst whitespace = /\\s/g;\n\n// Test hex value\nconst isHex = /^#[a-f0-9]{3}$|^#[a-f0-9]{6}$/i;\n\n// Test rgb value\nconst isRgb = /^rgb\\(/;\n\n// Test for blank string\nconst isBlank = /^(\\s+)?$/;\n\n// Test for numeric string\nconst isNumber = /^[+-]?(\\d+(\\.\\d*)?|\\.\\d+)(e[+-]?\\d+)?$/i;\n\n// Test for image url\nconst isImage = /\\.(jpg|jpeg|png|gif|svg)(\\?[^=]+.*)?/i;\n\n// split at whitespace and comma\nconst delimiter = /[\\s,]+/;\n\n// Test for path letter\nconst isPathLetter = /[MLHVCSQTAZ]/i;\n\nvar regex = {\n __proto__: null,\n delimiter: delimiter,\n hex: hex,\n isBlank: isBlank,\n isHex: isHex,\n isImage: isImage,\n isNumber: isNumber,\n isPathLetter: isPathLetter,\n isRgb: isRgb,\n numberAndUnit: numberAndUnit,\n reference: reference,\n rgb: rgb,\n transforms: transforms,\n whitespace: whitespace\n};\n\n// Return array of classes on the node\nfunction classes() {\n const attr = this.attr('class');\n return attr == null ? [] : attr.trim().split(delimiter);\n}\n\n// Return true if class exists on the node, false otherwise\nfunction hasClass(name) {\n return this.classes().indexOf(name) !== -1;\n}\n\n// Add class to the node\nfunction addClass(name) {\n if (!this.hasClass(name)) {\n const array = this.classes();\n array.push(name);\n this.attr('class', array.join(' '));\n }\n return this;\n}\n\n// Remove class from the node\nfunction removeClass(name) {\n if (this.hasClass(name)) {\n this.attr('class', this.classes().filter(function (c) {\n return c !== name;\n }).join(' '));\n }\n return this;\n}\n\n// Toggle the presence of a class on the node\nfunction toggleClass(name) {\n return this.hasClass(name) ? this.removeClass(name) : this.addClass(name);\n}\nregisterMethods('Dom', {\n classes,\n hasClass,\n addClass,\n removeClass,\n toggleClass\n});\n\n// Dynamic style generator\nfunction css(style, val) {\n const ret = {};\n if (arguments.length === 0) {\n // get full style as object\n this.node.style.cssText.split(/\\s*;\\s*/).filter(function (el) {\n return !!el.length;\n }).forEach(function (el) {\n const t = el.split(/\\s*:\\s*/);\n ret[t[0]] = t[1];\n });\n return ret;\n }\n if (arguments.length < 2) {\n // get style properties as array\n if (Array.isArray(style)) {\n for (const name of style) {\n const cased = name;\n ret[name] = this.node.style.getPropertyValue(cased);\n }\n return ret;\n }\n\n // get style for property\n if (typeof style === 'string') {\n return this.node.style.getPropertyValue(style);\n }\n\n // set styles in object\n if (typeof style === 'object') {\n for (const name in style) {\n // set empty string if null/undefined/'' was given\n this.node.style.setProperty(name, style[name] == null || isBlank.test(style[name]) ? '' : style[name]);\n }\n }\n }\n\n // set style for property\n if (arguments.length === 2) {\n this.node.style.setProperty(style, val == null || isBlank.test(val) ? '' : val);\n }\n return this;\n}\n\n// Show element\nfunction show() {\n return this.css('display', '');\n}\n\n// Hide element\nfunction hide() {\n return this.css('display', 'none');\n}\n\n// Is element visible?\nfunction visible() {\n return this.css('display') !== 'none';\n}\nregisterMethods('Dom', {\n css,\n show,\n hide,\n visible\n});\n\n// Store data values on svg nodes\nfunction data(a, v, r) {\n if (a == null) {\n // get an object of attributes\n return this.data(map(filter(this.node.attributes, el => el.nodeName.indexOf('data-') === 0), el => el.nodeName.slice(5)));\n } else if (a instanceof Array) {\n const data = {};\n for (const key of a) {\n data[key] = this.data(key);\n }\n return data;\n } else if (typeof a === 'object') {\n for (v in a) {\n this.data(v, a[v]);\n }\n } else if (arguments.length < 2) {\n try {\n return JSON.parse(this.attr('data-' + a));\n } catch (e) {\n return this.attr('data-' + a);\n }\n } else {\n this.attr('data-' + a, v === null ? null : r === true || typeof v === 'string' || typeof v === 'number' ? v : JSON.stringify(v));\n }\n return this;\n}\nregisterMethods('Dom', {\n data\n});\n\n// Remember arbitrary data\nfunction remember(k, v) {\n // remember every item in an object individually\n if (typeof arguments[0] === 'object') {\n for (const key in k) {\n this.remember(key, k[key]);\n }\n } else if (arguments.length === 1) {\n // retrieve memory\n return this.memory()[k];\n } else {\n // store memory\n this.memory()[k] = v;\n }\n return this;\n}\n\n// Erase a given memory\nfunction forget() {\n if (arguments.length === 0) {\n this._memory = {};\n } else {\n for (let i = arguments.length - 1; i >= 0; i--) {\n delete this.memory()[arguments[i]];\n }\n }\n return this;\n}\n\n// This triggers creation of a new hidden class which is not performant\n// However, this function is not rarely used so it will not happen frequently\n// Return local memory object\nfunction memory() {\n return this._memory = this._memory || {};\n}\nregisterMethods('Dom', {\n remember,\n forget,\n memory\n});\n\nfunction sixDigitHex(hex) {\n return hex.length === 4 ? ['#', hex.substring(1, 2), hex.substring(1, 2), hex.substring(2, 3), hex.substring(2, 3), hex.substring(3, 4), hex.substring(3, 4)].join('') : hex;\n}\nfunction componentHex(component) {\n const integer = Math.round(component);\n const bounded = Math.max(0, Math.min(255, integer));\n const hex = bounded.toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n}\nfunction is(object, space) {\n for (let i = space.length; i--;) {\n if (object[space[i]] == null) {\n return false;\n }\n }\n return true;\n}\nfunction getParameters(a, b) {\n const params = is(a, 'rgb') ? {\n _a: a.r,\n _b: a.g,\n _c: a.b,\n _d: 0,\n space: 'rgb'\n } : is(a, 'xyz') ? {\n _a: a.x,\n _b: a.y,\n _c: a.z,\n _d: 0,\n space: 'xyz'\n } : is(a, 'hsl') ? {\n _a: a.h,\n _b: a.s,\n _c: a.l,\n _d: 0,\n space: 'hsl'\n } : is(a, 'lab') ? {\n _a: a.l,\n _b: a.a,\n _c: a.b,\n _d: 0,\n space: 'lab'\n } : is(a, 'lch') ? {\n _a: a.l,\n _b: a.c,\n _c: a.h,\n _d: 0,\n space: 'lch'\n } : is(a, 'cmyk') ? {\n _a: a.c,\n _b: a.m,\n _c: a.y,\n _d: a.k,\n space: 'cmyk'\n } : {\n _a: 0,\n _b: 0,\n _c: 0,\n space: 'rgb'\n };\n params.space = b || params.space;\n return params;\n}\nfunction cieSpace(space) {\n if (space === 'lab' || space === 'xyz' || space === 'lch') {\n return true;\n } else {\n return false;\n }\n}\nfunction hueToRgb(p, q, t) {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n}\nclass Color {\n constructor(...inputs) {\n this.init(...inputs);\n }\n\n // Test if given value is a color\n static isColor(color) {\n return color && (color instanceof Color || this.isRgb(color) || this.test(color));\n }\n\n // Test if given value is an rgb object\n static isRgb(color) {\n return color && typeof color.r === 'number' && typeof color.g === 'number' && typeof color.b === 'number';\n }\n\n /*\n Generating random colors\n */\n static random(mode = 'vibrant', t) {\n // Get the math modules\n const {\n random,\n round,\n sin,\n PI: pi\n } = Math;\n\n // Run the correct generator\n if (mode === 'vibrant') {\n const l = (81 - 57) * random() + 57;\n const c = (83 - 45) * random() + 45;\n const h = 360 * random();\n const color = new Color(l, c, h, 'lch');\n return color;\n } else if (mode === 'sine') {\n t = t == null ? random() : t;\n const r = round(80 * sin(2 * pi * t / 0.5 + 0.01) + 150);\n const g = round(50 * sin(2 * pi * t / 0.5 + 4.6) + 200);\n const b = round(100 * sin(2 * pi * t / 0.5 + 2.3) + 150);\n const color = new Color(r, g, b);\n return color;\n } else if (mode === 'pastel') {\n const l = (94 - 86) * random() + 86;\n const c = (26 - 9) * random() + 9;\n const h = 360 * random();\n const color = new Color(l, c, h, 'lch');\n return color;\n } else if (mode === 'dark') {\n const l = 10 + 10 * random();\n const c = (125 - 75) * random() + 86;\n const h = 360 * random();\n const color = new Color(l, c, h, 'lch');\n return color;\n } else if (mode === 'rgb') {\n const r = 255 * random();\n const g = 255 * random();\n const b = 255 * random();\n const color = new Color(r, g, b);\n return color;\n } else if (mode === 'lab') {\n const l = 100 * random();\n const a = 256 * random() - 128;\n const b = 256 * random() - 128;\n const color = new Color(l, a, b, 'lab');\n return color;\n } else if (mode === 'grey') {\n const grey = 255 * random();\n const color = new Color(grey, grey, grey);\n return color;\n } else {\n throw new Error('Unsupported random color mode');\n }\n }\n\n // Test if given value is a color string\n static test(color) {\n return typeof color === 'string' && (isHex.test(color) || isRgb.test(color));\n }\n cmyk() {\n // Get the rgb values for the current color\n const {\n _a,\n _b,\n _c\n } = this.rgb();\n const [r, g, b] = [_a, _b, _c].map(v => v / 255);\n\n // Get the cmyk values in an unbounded format\n const k = Math.min(1 - r, 1 - g, 1 - b);\n if (k === 1) {\n // Catch the black case\n return new Color(0, 0, 0, 1, 'cmyk');\n }\n const c = (1 - r - k) / (1 - k);\n const m = (1 - g - k) / (1 - k);\n const y = (1 - b - k) / (1 - k);\n\n // Construct the new color\n const color = new Color(c, m, y, k, 'cmyk');\n return color;\n }\n hsl() {\n // Get the rgb values\n const {\n _a,\n _b,\n _c\n } = this.rgb();\n const [r, g, b] = [_a, _b, _c].map(v => v / 255);\n\n // Find the maximum and minimum values to get the lightness\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n\n // If the r, g, v values are identical then we are grey\n const isGrey = max === min;\n\n // Calculate the hue and saturation\n const delta = max - min;\n const s = isGrey ? 0 : l > 0.5 ? delta / (2 - max - min) : delta / (max + min);\n const h = isGrey ? 0 : max === r ? ((g - b) / delta + (g < b ? 6 : 0)) / 6 : max === g ? ((b - r) / delta + 2) / 6 : max === b ? ((r - g) / delta + 4) / 6 : 0;\n\n // Construct and return the new color\n const color = new Color(360 * h, 100 * s, 100 * l, 'hsl');\n return color;\n }\n init(a = 0, b = 0, c = 0, d = 0, space = 'rgb') {\n // This catches the case when a falsy value is passed like ''\n a = !a ? 0 : a;\n\n // Reset all values in case the init function is rerun with new color space\n if (this.space) {\n for (const component in this.space) {\n delete this[this.space[component]];\n }\n }\n if (typeof a === 'number') {\n // Allow for the case that we don't need d...\n space = typeof d === 'string' ? d : space;\n d = typeof d === 'string' ? 0 : d;\n\n // Assign the values straight to the color\n Object.assign(this, {\n _a: a,\n _b: b,\n _c: c,\n _d: d,\n space\n });\n // If the user gave us an array, make the color from it\n } else if (a instanceof Array) {\n this.space = b || (typeof a[3] === 'string' ? a[3] : a[4]) || 'rgb';\n Object.assign(this, {\n _a: a[0],\n _b: a[1],\n _c: a[2],\n _d: a[3] || 0\n });\n } else if (a instanceof Object) {\n // Set the object up and assign its values directly\n const values = getParameters(a, b);\n Object.assign(this, values);\n } else if (typeof a === 'string') {\n if (isRgb.test(a)) {\n const noWhitespace = a.replace(whitespace, '');\n const [_a, _b, _c] = rgb.exec(noWhitespace).slice(1, 4).map(v => parseInt(v));\n Object.assign(this, {\n _a,\n _b,\n _c,\n _d: 0,\n space: 'rgb'\n });\n } else if (isHex.test(a)) {\n const hexParse = v => parseInt(v, 16);\n const [, _a, _b, _c] = hex.exec(sixDigitHex(a)).map(hexParse);\n Object.assign(this, {\n _a,\n _b,\n _c,\n _d: 0,\n space: 'rgb'\n });\n } else throw Error(\"Unsupported string format, can't construct Color\");\n }\n\n // Now add the components as a convenience\n const {\n _a,\n _b,\n _c,\n _d\n } = this;\n const components = this.space === 'rgb' ? {\n r: _a,\n g: _b,\n b: _c\n } : this.space === 'xyz' ? {\n x: _a,\n y: _b,\n z: _c\n } : this.space === 'hsl' ? {\n h: _a,\n s: _b,\n l: _c\n } : this.space === 'lab' ? {\n l: _a,\n a: _b,\n b: _c\n } : this.space === 'lch' ? {\n l: _a,\n c: _b,\n h: _c\n } : this.space === 'cmyk' ? {\n c: _a,\n m: _b,\n y: _c,\n k: _d\n } : {};\n Object.assign(this, components);\n }\n lab() {\n // Get the xyz color\n const {\n x,\n y,\n z\n } = this.xyz();\n\n // Get the lab components\n const l = 116 * y - 16;\n const a = 500 * (x - y);\n const b = 200 * (y - z);\n\n // Construct and return a new color\n const color = new Color(l, a, b, 'lab');\n return color;\n }\n lch() {\n // Get the lab color directly\n const {\n l,\n a,\n b\n } = this.lab();\n\n // Get the chromaticity and the hue using polar coordinates\n const c = Math.sqrt(a ** 2 + b ** 2);\n let h = 180 * Math.atan2(b, a) / Math.PI;\n if (h < 0) {\n h *= -1;\n h = 360 - h;\n }\n\n // Make a new color and return it\n const color = new Color(l, c, h, 'lch');\n return color;\n }\n /*\n Conversion Methods\n */\n\n rgb() {\n if (this.space === 'rgb') {\n return this;\n } else if (cieSpace(this.space)) {\n // Convert to the xyz color space\n let {\n x,\n y,\n z\n } = this;\n if (this.space === 'lab' || this.space === 'lch') {\n // Get the values in the lab space\n let {\n l,\n a,\n b\n } = this;\n if (this.space === 'lch') {\n const {\n c,\n h\n } = this;\n const dToR = Math.PI / 180;\n a = c * Math.cos(dToR * h);\n b = c * Math.sin(dToR * h);\n }\n\n // Undo the nonlinear function\n const yL = (l + 16) / 116;\n const xL = a / 500 + yL;\n const zL = yL - b / 200;\n\n // Get the xyz values\n const ct = 16 / 116;\n const mx = 0.008856;\n const nm = 7.787;\n x = 0.95047 * (xL ** 3 > mx ? xL ** 3 : (xL - ct) / nm);\n y = 1.0 * (yL ** 3 > mx ? yL ** 3 : (yL - ct) / nm);\n z = 1.08883 * (zL ** 3 > mx ? zL ** 3 : (zL - ct) / nm);\n }\n\n // Convert xyz to unbounded rgb values\n const rU = x * 3.2406 + y * -1.5372 + z * -0.4986;\n const gU = x * -0.9689 + y * 1.8758 + z * 0.0415;\n const bU = x * 0.0557 + y * -0.204 + z * 1.057;\n\n // Convert the values to true rgb values\n const pow = Math.pow;\n const bd = 0.0031308;\n const r = rU > bd ? 1.055 * pow(rU, 1 / 2.4) - 0.055 : 12.92 * rU;\n const g = gU > bd ? 1.055 * pow(gU, 1 / 2.4) - 0.055 : 12.92 * gU;\n const b = bU > bd ? 1.055 * pow(bU, 1 / 2.4) - 0.055 : 12.92 * bU;\n\n // Make and return the color\n const color = new Color(255 * r, 255 * g, 255 * b);\n return color;\n } else if (this.space === 'hsl') {\n // https://bgrins.github.io/TinyColor/docs/tinycolor.html\n // Get the current hsl values\n let {\n h,\n s,\n l\n } = this;\n h /= 360;\n s /= 100;\n l /= 100;\n\n // If we are grey, then just make the color directly\n if (s === 0) {\n l *= 255;\n const color = new Color(l, l, l);\n return color;\n }\n\n // TODO I have no idea what this does :D If you figure it out, tell me!\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n\n // Get the rgb values\n const r = 255 * hueToRgb(p, q, h + 1 / 3);\n const g = 255 * hueToRgb(p, q, h);\n const b = 255 * hueToRgb(p, q, h - 1 / 3);\n\n // Make a new color\n const color = new Color(r, g, b);\n return color;\n } else if (this.space === 'cmyk') {\n // https://gist.github.com/felipesabino/5066336\n // Get the normalised cmyk values\n const {\n c,\n m,\n y,\n k\n } = this;\n\n // Get the rgb values\n const r = 255 * (1 - Math.min(1, c * (1 - k) + k));\n const g = 255 * (1 - Math.min(1, m * (1 - k) + k));\n const b = 255 * (1 - Math.min(1, y * (1 - k) + k));\n\n // Form the color and return it\n const color = new Color(r, g, b);\n return color;\n } else {\n return this;\n }\n }\n toArray() {\n const {\n _a,\n _b,\n _c,\n _d,\n space\n } = this;\n return [_a, _b, _c, _d, space];\n }\n toHex() {\n const [r, g, b] = this._clamped().map(componentHex);\n return `#${r}${g}${b}`;\n }\n toRgb() {\n const [rV, gV, bV] = this._clamped();\n const string = `rgb(${rV},${gV},${bV})`;\n return string;\n }\n toString() {\n return this.toHex();\n }\n xyz() {\n // Normalise the red, green and blue values\n const {\n _a: r255,\n _b: g255,\n _c: b255\n } = this.rgb();\n const [r, g, b] = [r255, g255, b255].map(v => v / 255);\n\n // Convert to the lab rgb space\n const rL = r > 0.04045 ? Math.pow((r + 0.055) / 1.055, 2.4) : r / 12.92;\n const gL = g > 0.04045 ? Math.pow((g + 0.055) / 1.055, 2.4) : g / 12.92;\n const bL = b > 0.04045 ? Math.pow((b + 0.055) / 1.055, 2.4) : b / 12.92;\n\n // Convert to the xyz color space without bounding the values\n const xU = (rL * 0.4124 + gL * 0.3576 + bL * 0.1805) / 0.95047;\n const yU = (rL * 0.2126 + gL * 0.7152 + bL * 0.0722) / 1.0;\n const zU = (rL * 0.0193 + gL * 0.1192 + bL * 0.9505) / 1.08883;\n\n // Get the proper xyz values by applying the bounding\n const x = xU > 0.008856 ? Math.pow(xU, 1 / 3) : 7.787 * xU + 16 / 116;\n const y = yU > 0.008856 ? Math.pow(yU, 1 / 3) : 7.787 * yU + 16 / 116;\n const z = zU > 0.008856 ? Math.pow(zU, 1 / 3) : 7.787 * zU + 16 / 116;\n\n // Make and return the color\n const color = new Color(x, y, z, 'xyz');\n return color;\n }\n\n /*\n Input and Output methods\n */\n\n _clamped() {\n const {\n _a,\n _b,\n _c\n } = this.rgb();\n const {\n max,\n min,\n round\n } = Math;\n const format = v => max(0, min(round(v), 255));\n return [_a, _b, _c].map(format);\n }\n\n /*\n Constructing colors\n */\n}\n\nclass Point {\n // Initialize\n constructor(...args) {\n this.init(...args);\n }\n\n // Clone point\n clone() {\n return new Point(this);\n }\n init(x, y) {\n const base = {\n x: 0,\n y: 0\n };\n\n // ensure source as object\n const source = Array.isArray(x) ? {\n x: x[0],\n y: x[1]\n } : typeof x === 'object' ? {\n x: x.x,\n y: x.y\n } : {\n x: x,\n y: y\n };\n\n // merge source\n this.x = source.x == null ? base.x : source.x;\n this.y = source.y == null ? base.y : source.y;\n return this;\n }\n toArray() {\n return [this.x, this.y];\n }\n transform(m) {\n return this.clone().transformO(m);\n }\n\n // Transform point with matrix\n transformO(m) {\n if (!Matrix.isMatrixLike(m)) {\n m = new Matrix(m);\n }\n const {\n x,\n y\n } = this;\n\n // Perform the matrix multiplication\n this.x = m.a * x + m.c * y + m.e;\n this.y = m.b * x + m.d * y + m.f;\n return this;\n }\n}\nfunction point(x, y) {\n return new Point(x, y).transformO(this.screenCTM().inverseO());\n}\n\nfunction closeEnough(a, b, threshold) {\n return Math.abs(b - a) < (1e-6);\n}\nclass Matrix {\n constructor(...args) {\n this.init(...args);\n }\n static formatTransforms(o) {\n // Get all of the parameters required to form the matrix\n const flipBoth = o.flip === 'both' || o.flip === true;\n const flipX = o.flip && (flipBoth || o.flip === 'x') ? -1 : 1;\n const flipY = o.flip && (flipBoth || o.flip === 'y') ? -1 : 1;\n const skewX = o.skew && o.skew.length ? o.skew[0] : isFinite(o.skew) ? o.skew : isFinite(o.skewX) ? o.skewX : 0;\n const skewY = o.skew && o.skew.length ? o.skew[1] : isFinite(o.skew) ? o.skew : isFinite(o.skewY) ? o.skewY : 0;\n const scaleX = o.scale && o.scale.length ? o.scale[0] * flipX : isFinite(o.scale) ? o.scale * flipX : isFinite(o.scaleX) ? o.scaleX * flipX : flipX;\n const scaleY = o.scale && o.scale.length ? o.scale[1] * flipY : isFinite(o.scale) ? o.scale * flipY : isFinite(o.scaleY) ? o.scaleY * flipY : flipY;\n const shear = o.shear || 0;\n const theta = o.rotate || o.theta || 0;\n const origin = new Point(o.origin || o.around || o.ox || o.originX, o.oy || o.originY);\n const ox = origin.x;\n const oy = origin.y;\n // We need Point to be invalid if nothing was passed because we cannot default to 0 here. That is why NaN\n const position = new Point(o.position || o.px || o.positionX || NaN, o.py || o.positionY || NaN);\n const px = position.x;\n const py = position.y;\n const translate = new Point(o.translate || o.tx || o.translateX, o.ty || o.translateY);\n const tx = translate.x;\n const ty = translate.y;\n const relative = new Point(o.relative || o.rx || o.relativeX, o.ry || o.relativeY);\n const rx = relative.x;\n const ry = relative.y;\n\n // Populate all of the values\n return {\n scaleX,\n scaleY,\n skewX,\n skewY,\n shear,\n theta,\n rx,\n ry,\n tx,\n ty,\n ox,\n oy,\n px,\n py\n };\n }\n static fromArray(a) {\n return {\n a: a[0],\n b: a[1],\n c: a[2],\n d: a[3],\n e: a[4],\n f: a[5]\n };\n }\n static isMatrixLike(o) {\n return o.a != null || o.b != null || o.c != null || o.d != null || o.e != null || o.f != null;\n }\n\n // left matrix, right matrix, target matrix which is overwritten\n static matrixMultiply(l, r, o) {\n // Work out the product directly\n const a = l.a * r.a + l.c * r.b;\n const b = l.b * r.a + l.d * r.b;\n const c = l.a * r.c + l.c * r.d;\n const d = l.b * r.c + l.d * r.d;\n const e = l.e + l.a * r.e + l.c * r.f;\n const f = l.f + l.b * r.e + l.d * r.f;\n\n // make sure to use local variables because l/r and o could be the same\n o.a = a;\n o.b = b;\n o.c = c;\n o.d = d;\n o.e = e;\n o.f = f;\n return o;\n }\n around(cx, cy, matrix) {\n return this.clone().aroundO(cx, cy, matrix);\n }\n\n // Transform around a center point\n aroundO(cx, cy, matrix) {\n const dx = cx || 0;\n const dy = cy || 0;\n return this.translateO(-dx, -dy).lmultiplyO(matrix).translateO(dx, dy);\n }\n\n // Clones this matrix\n clone() {\n return new Matrix(this);\n }\n\n // Decomposes this matrix into its affine parameters\n decompose(cx = 0, cy = 0) {\n // Get the parameters from the matrix\n const a = this.a;\n const b = this.b;\n const c = this.c;\n const d = this.d;\n const e = this.e;\n const f = this.f;\n\n // Figure out if the winding direction is clockwise or counterclockwise\n const determinant = a * d - b * c;\n const ccw = determinant > 0 ? 1 : -1;\n\n // Since we only shear in x, we can use the x basis to get the x scale\n // and the rotation of the resulting matrix\n const sx = ccw * Math.sqrt(a * a + b * b);\n const thetaRad = Math.atan2(ccw * b, ccw * a);\n const theta = 180 / Math.PI * thetaRad;\n const ct = Math.cos(thetaRad);\n const st = Math.sin(thetaRad);\n\n // We can then solve the y basis vector simultaneously to get the other\n // two affine parameters directly from these parameters\n const lam = (a * c + b * d) / determinant;\n const sy = c * sx / (lam * a - b) || d * sx / (lam * b + a);\n\n // Use the translations\n const tx = e - cx + cx * ct * sx + cy * (lam * ct * sx - st * sy);\n const ty = f - cy + cx * st * sx + cy * (lam * st * sx + ct * sy);\n\n // Construct the decomposition and return it\n return {\n // Return the affine parameters\n scaleX: sx,\n scaleY: sy,\n shear: lam,\n rotate: theta,\n translateX: tx,\n translateY: ty,\n originX: cx,\n originY: cy,\n // Return the matrix parameters\n a: this.a,\n b: this.b,\n c: this.c,\n d: this.d,\n e: this.e,\n f: this.f\n };\n }\n\n // Check if two matrices are equal\n equals(other) {\n if (other === this) return true;\n const comp = new Matrix(other);\n return closeEnough(this.a, comp.a) && closeEnough(this.b, comp.b) && closeEnough(this.c, comp.c) && closeEnough(this.d, comp.d) && closeEnough(this.e, comp.e) && closeEnough(this.f, comp.f);\n }\n\n // Flip matrix on x or y, at a given offset\n flip(axis, around) {\n return this.clone().flipO(axis, around);\n }\n flipO(axis, around) {\n return axis === 'x' ? this.scaleO(-1, 1, around, 0) : axis === 'y' ? this.scaleO(1, -1, 0, around) : this.scaleO(-1, -1, axis, around || axis); // Define an x, y flip point\n }\n\n // Initialize\n init(source) {\n const base = Matrix.fromArray([1, 0, 0, 1, 0, 0]);\n\n // ensure source as object\n source = source instanceof Element ? source.matrixify() : typeof source === 'string' ? Matrix.fromArray(source.split(delimiter).map(parseFloat)) : Array.isArray(source) ? Matrix.fromArray(source) : typeof source === 'object' && Matrix.isMatrixLike(source) ? source : typeof source === 'object' ? new Matrix().transform(source) : arguments.length === 6 ? Matrix.fromArray([].slice.call(arguments)) : base;\n\n // Merge the source matrix with the base matrix\n this.a = source.a != null ? source.a : base.a;\n this.b = source.b != null ? source.b : base.b;\n this.c = source.c != null ? source.c : base.c;\n this.d = source.d != null ? source.d : base.d;\n this.e = source.e != null ? source.e : base.e;\n this.f = source.f != null ? source.f : base.f;\n return this;\n }\n inverse() {\n return this.clone().inverseO();\n }\n\n // Inverses matrix\n inverseO() {\n // Get the current parameters out of the matrix\n const a = this.a;\n const b = this.b;\n const c = this.c;\n const d = this.d;\n const e = this.e;\n const f = this.f;\n\n // Invert the 2x2 matrix in the top left\n const det = a * d - b * c;\n if (!det) throw new Error('Cannot invert ' + this);\n\n // Calculate the top 2x2 matrix\n const na = d / det;\n const nb = -b / det;\n const nc = -c / det;\n const nd = a / det;\n\n // Apply the inverted matrix to the top right\n const ne = -(na * e + nc * f);\n const nf = -(nb * e + nd * f);\n\n // Construct the inverted matrix\n this.a = na;\n this.b = nb;\n this.c = nc;\n this.d = nd;\n this.e = ne;\n this.f = nf;\n return this;\n }\n lmultiply(matrix) {\n return this.clone().lmultiplyO(matrix);\n }\n lmultiplyO(matrix) {\n const r = this;\n const l = matrix instanceof Matrix ? matrix : new Matrix(matrix);\n return Matrix.matrixMultiply(l, r, this);\n }\n\n // Left multiplies by the given matrix\n multiply(matrix) {\n return this.clone().multiplyO(matrix);\n }\n multiplyO(matrix) {\n // Get the matrices\n const l = this;\n const r = matrix instanceof Matrix ? matrix : new Matrix(matrix);\n return Matrix.matrixMultiply(l, r, this);\n }\n\n // Rotate matrix\n rotate(r, cx, cy) {\n return this.clone().rotateO(r, cx, cy);\n }\n rotateO(r, cx = 0, cy = 0) {\n // Convert degrees to radians\n r = radians(r);\n const cos = Math.cos(r);\n const sin = Math.sin(r);\n const {\n a,\n b,\n c,\n d,\n e,\n f\n } = this;\n this.a = a * cos - b * sin;\n this.b = b * cos + a * sin;\n this.c = c * cos - d * sin;\n this.d = d * cos + c * sin;\n this.e = e * cos - f * sin + cy * sin - cx * cos + cx;\n this.f = f * cos + e * sin - cx * sin - cy * cos + cy;\n return this;\n }\n\n // Scale matrix\n scale() {\n return this.clone().scaleO(...arguments);\n }\n scaleO(x, y = x, cx = 0, cy = 0) {\n // Support uniform scaling\n if (arguments.length === 3) {\n cy = cx;\n cx = y;\n y = x;\n }\n const {\n a,\n b,\n c,\n d,\n e,\n f\n } = this;\n this.a = a * x;\n this.b = b * y;\n this.c = c * x;\n this.d = d * y;\n this.e = e * x - cx * x + cx;\n this.f = f * y - cy * y + cy;\n return this;\n }\n\n // Shear matrix\n shear(a, cx, cy) {\n return this.clone().shearO(a, cx, cy);\n }\n\n // eslint-disable-next-line no-unused-vars\n shearO(lx, cx = 0, cy = 0) {\n const {\n a,\n b,\n c,\n d,\n e,\n f\n } = this;\n this.a = a + b * lx;\n this.c = c + d * lx;\n this.e = e + f * lx - cy * lx;\n return this;\n }\n\n // Skew Matrix\n skew() {\n return this.clone().skewO(...arguments);\n }\n skewO(x, y = x, cx = 0, cy = 0) {\n // support uniformal skew\n if (arguments.length === 3) {\n cy = cx;\n cx = y;\n y = x;\n }\n\n // Convert degrees to radians\n x = radians(x);\n y = radians(y);\n const lx = Math.tan(x);\n const ly = Math.tan(y);\n const {\n a,\n b,\n c,\n d,\n e,\n f\n } = this;\n this.a = a + b * lx;\n this.b = b + a * ly;\n this.c = c + d * lx;\n this.d = d + c * ly;\n this.e = e + f * lx - cy * lx;\n this.f = f + e * ly - cx * ly;\n return this;\n }\n\n // SkewX\n skewX(x, cx, cy) {\n return this.skew(x, 0, cx, cy);\n }\n\n // SkewY\n skewY(y, cx, cy) {\n return this.skew(0, y, cx, cy);\n }\n toArray() {\n return [this.a, this.b, this.c, this.d, this.e, this.f];\n }\n\n // Convert matrix to string\n toString() {\n return 'matrix(' + this.a + ',' + this.b + ',' + this.c + ',' + this.d + ',' + this.e + ',' + this.f + ')';\n }\n\n // Transform a matrix into another matrix by manipulating the space\n transform(o) {\n // Check if o is a matrix and then left multiply it directly\n if (Matrix.isMatrixLike(o)) {\n const matrix = new Matrix(o);\n return matrix.multiplyO(this);\n }\n\n // Get the proposed transformations and the current transformations\n const t = Matrix.formatTransforms(o);\n const current = this;\n const {\n x: ox,\n y: oy\n } = new Point(t.ox, t.oy).transform(current);\n\n // Construct the resulting matrix\n const transformer = new Matrix().translateO(t.rx, t.ry).lmultiplyO(current).translateO(-ox, -oy).scaleO(t.scaleX, t.scaleY).skewO(t.skewX, t.skewY).shearO(t.shear).rotateO(t.theta).translateO(ox, oy);\n\n // If we want the origin at a particular place, we force it there\n if (isFinite(t.px) || isFinite(t.py)) {\n const origin = new Point(ox, oy).transform(transformer);\n // TODO: Replace t.px with isFinite(t.px)\n // Doesn't work because t.px is also 0 if it wasn't passed\n const dx = isFinite(t.px) ? t.px - origin.x : 0;\n const dy = isFinite(t.py) ? t.py - origin.y : 0;\n transformer.translateO(dx, dy);\n }\n\n // Translate now after positioning\n transformer.translateO(t.tx, t.ty);\n return transformer;\n }\n\n // Translate matrix\n translate(x, y) {\n return this.clone().translateO(x, y);\n }\n translateO(x, y) {\n this.e += x || 0;\n this.f += y || 0;\n return this;\n }\n valueOf() {\n return {\n a: this.a,\n b: this.b,\n c: this.c,\n d: this.d,\n e: this.e,\n f: this.f\n };\n }\n}\nfunction ctm() {\n return new Matrix(this.node.getCTM());\n}\nfunction screenCTM() {\n try {\n /* https://bugzilla.mozilla.org/show_bug.cgi?id=1344537\n This is needed because FF does not return the transformation matrix\n for the inner coordinate system when getScreenCTM() is called on nested svgs.\n However all other Browsers do that */\n if (typeof this.isRoot === 'function' && !this.isRoot()) {\n const rect = this.rect(1, 1);\n const m = rect.node.getScreenCTM();\n rect.remove();\n return new Matrix(m);\n }\n return new Matrix(this.node.getScreenCTM());\n } catch (e) {\n console.warn(`Cannot get CTM from SVG node ${this.node.nodeName}. Is the element rendered?`);\n return new Matrix();\n }\n}\nregister(Matrix, 'Matrix');\n\nfunction parser() {\n // Reuse cached element if possible\n if (!parser.nodes) {\n const svg = makeInstance().size(2, 0);\n svg.node.style.cssText = ['opacity: 0', 'position: absolute', 'left: -100%', 'top: -100%', 'overflow: hidden'].join(';');\n svg.attr('focusable', 'false');\n svg.attr('aria-hidden', 'true');\n const path = svg.path().node;\n parser.nodes = {\n svg,\n path\n };\n }\n if (!parser.nodes.svg.node.parentNode) {\n const b = globals.document.body || globals.document.documentElement;\n parser.nodes.svg.addTo(b);\n }\n return parser.nodes;\n}\n\nfunction isNulledBox(box) {\n return !box.width && !box.height && !box.x && !box.y;\n}\nfunction domContains(node) {\n return node === globals.document || (globals.document.documentElement.contains || function (node) {\n // This is IE - it does not support contains() for top-level SVGs\n while (node.parentNode) {\n node = node.parentNode;\n }\n return node === globals.document;\n }).call(globals.document.documentElement, node);\n}\nclass Box {\n constructor(...args) {\n this.init(...args);\n }\n addOffset() {\n // offset by window scroll position, because getBoundingClientRect changes when window is scrolled\n this.x += globals.window.pageXOffset;\n this.y += globals.window.pageYOffset;\n return new Box(this);\n }\n init(source) {\n const base = [0, 0, 0, 0];\n source = typeof source === 'string' ? source.split(delimiter).map(parseFloat) : Array.isArray(source) ? source : typeof source === 'object' ? [source.left != null ? source.left : source.x, source.top != null ? source.top : source.y, source.width, source.height] : arguments.length === 4 ? [].slice.call(arguments) : base;\n this.x = source[0] || 0;\n this.y = source[1] || 0;\n this.width = this.w = source[2] || 0;\n this.height = this.h = source[3] || 0;\n\n // Add more bounding box properties\n this.x2 = this.x + this.w;\n this.y2 = this.y + this.h;\n this.cx = this.x + this.w / 2;\n this.cy = this.y + this.h / 2;\n return this;\n }\n isNulled() {\n return isNulledBox(this);\n }\n\n // Merge rect box with another, return a new instance\n merge(box) {\n const x = Math.min(this.x, box.x);\n const y = Math.min(this.y, box.y);\n const width = Math.max(this.x + this.width, box.x + box.width) - x;\n const height = Math.max(this.y + this.height, box.y + box.height) - y;\n return new Box(x, y, width, height);\n }\n toArray() {\n return [this.x, this.y, this.width, this.height];\n }\n toString() {\n return this.x + ' ' + this.y + ' ' + this.width + ' ' + this.height;\n }\n transform(m) {\n if (!(m instanceof Matrix)) {\n m = new Matrix(m);\n }\n let xMin = Infinity;\n let xMax = -Infinity;\n let yMin = Infinity;\n let yMax = -Infinity;\n const pts = [new Point(this.x, this.y), new Point(this.x2, this.y), new Point(this.x, this.y2), new Point(this.x2, this.y2)];\n pts.forEach(function (p) {\n p = p.transform(m);\n xMin = Math.min(xMin, p.x);\n xMax = Math.max(xMax, p.x);\n yMin = Math.min(yMin, p.y);\n yMax = Math.max(yMax, p.y);\n });\n return new Box(xMin, yMin, xMax - xMin, yMax - yMin);\n }\n}\nfunction getBox(el, getBBoxFn, retry) {\n let box;\n try {\n // Try to get the box with the provided function\n box = getBBoxFn(el.node);\n\n // If the box is worthless and not even in the dom, retry\n // by throwing an error here...\n if (isNulledBox(box) && !domContains(el.node)) {\n throw new Error('Element not in the dom');\n }\n } catch (e) {\n // ... and calling the retry handler here\n box = retry(el);\n }\n return box;\n}\nfunction bbox() {\n // Function to get bbox is getBBox()\n const getBBox = node => node.getBBox();\n\n // Take all measures so that a stupid browser renders the element\n // so we can get the bbox from it when we try again\n const retry = el => {\n try {\n const clone = el.clone().addTo(parser().svg).show();\n const box = clone.node.getBBox();\n clone.remove();\n return box;\n } catch (e) {\n // We give up...\n throw new Error(`Getting bbox of element \"${el.node.nodeName}\" is not possible: ${e.toString()}`);\n }\n };\n const box = getBox(this, getBBox, retry);\n const bbox = new Box(box);\n return bbox;\n}\nfunction rbox(el) {\n const getRBox = node => node.getBoundingClientRect();\n const retry = el => {\n // There is no point in trying tricks here because if we insert the element into the dom ourselves\n // it obviously will be at the wrong position\n throw new Error(`Getting rbox of element \"${el.node.nodeName}\" is not possible`);\n };\n const box = getBox(this, getRBox, retry);\n const rbox = new Box(box);\n\n // If an element was passed, we want the bbox in the coordinate system of that element\n if (el) {\n return rbox.transform(el.screenCTM().inverseO());\n }\n\n // Else we want it in absolute screen coordinates\n // Therefore we need to add the scrollOffset\n return rbox.addOffset();\n}\n\n// Checks whether the given point is inside the bounding box\nfunction inside(x, y) {\n const box = this.bbox();\n return x > box.x && y > box.y && x < box.x + box.width && y < box.y + box.height;\n}\nregisterMethods({\n viewbox: {\n viewbox(x, y, width, height) {\n // act as getter\n if (x == null) return new Box(this.attr('viewBox'));\n\n // act as setter\n return this.attr('viewBox', new Box(x, y, width, height));\n },\n zoom(level, point) {\n // Its best to rely on the attributes here and here is why:\n // clientXYZ: Doesn't work on non-root svgs because they dont have a CSSBox (silly!)\n // getBoundingClientRect: Doesn't work because Chrome just ignores width and height of nested svgs completely\n // that means, their clientRect is always as big as the content.\n // Furthermore this size is incorrect if the element is further transformed by its parents\n // computedStyle: Only returns meaningful values if css was used with px. We dont go this route here!\n // getBBox: returns the bounding box of its content - that doesn't help!\n let {\n width,\n height\n } = this.attr(['width', 'height']);\n\n // Width and height is a string when a number with a unit is present which we can't use\n // So we try clientXYZ\n if (!width && !height || typeof width === 'string' || typeof height === 'string') {\n width = this.node.clientWidth;\n height = this.node.clientHeight;\n }\n\n // Giving up...\n if (!width || !height) {\n throw new Error('Impossible to get absolute width and height. Please provide an absolute width and height attribute on the zooming element');\n }\n const v = this.viewbox();\n const zoomX = width / v.width;\n const zoomY = height / v.height;\n const zoom = Math.min(zoomX, zoomY);\n if (level == null) {\n return zoom;\n }\n let zoomAmount = zoom / level;\n\n // Set the zoomAmount to the highest value which is safe to process and recover from\n // The * 100 is a bit of wiggle room for the matrix transformation\n if (zoomAmount === Infinity) zoomAmount = Number.MAX_SAFE_INTEGER / 100;\n point = point || new Point(width / 2 / zoomX + v.x, height / 2 / zoomY + v.y);\n const box = new Box(v).transform(new Matrix({\n scale: zoomAmount,\n origin: point\n }));\n return this.viewbox(box);\n }\n }\n});\nregister(Box, 'Box');\n\n// import { subClassArray } from './ArrayPolyfill.js'\n\nclass List extends Array {\n constructor(arr = [], ...args) {\n super(arr, ...args);\n if (typeof arr === 'number') return this;\n this.length = 0;\n this.push(...arr);\n }\n}\nextend([List], {\n each(fnOrMethodName, ...args) {\n if (typeof fnOrMethodName === 'function') {\n return this.map((el, i, arr) => {\n return fnOrMethodName.call(el, el, i, arr);\n });\n } else {\n return this.map(el => {\n return el[fnOrMethodName](...args);\n });\n }\n },\n toArray() {\n return Array.prototype.concat.apply([], this);\n }\n});\nconst reserved = ['toArray', 'constructor', 'each'];\nList.extend = function (methods) {\n methods = methods.reduce((obj, name) => {\n // Don't overwrite own methods\n if (reserved.includes(name)) return obj;\n\n // Don't add private methods\n if (name[0] === '_') return obj;\n\n // Allow access to original Array methods through a prefix\n if (name in Array.prototype) {\n obj['$' + name] = Array.prototype[name];\n }\n\n // Relay every call to each()\n obj[name] = function (...attrs) {\n return this.each(name, ...attrs);\n };\n return obj;\n }, {});\n extend([List], methods);\n};\n\nfunction baseFind(query, parent) {\n return new List(map((parent || globals.document).querySelectorAll(query), function (node) {\n return adopt(node);\n }));\n}\n\n// Scoped find method\nfunction find(query) {\n return baseFind(query, this.node);\n}\nfunction findOne(query) {\n return adopt(this.node.querySelector(query));\n}\n\nlet listenerId = 0;\nconst windowEvents = {};\nfunction getEvents(instance) {\n let n = instance.getEventHolder();\n\n // We dont want to save events in global space\n if (n === globals.window) n = windowEvents;\n if (!n.events) n.events = {};\n return n.events;\n}\nfunction getEventTarget(instance) {\n return instance.getEventTarget();\n}\nfunction clearEvents(instance) {\n let n = instance.getEventHolder();\n if (n === globals.window) n = windowEvents;\n if (n.events) n.events = {};\n}\n\n// Add event binder in the SVG namespace\nfunction on(node, events, listener, binding, options) {\n const l = listener.bind(binding || node);\n const instance = makeInstance(node);\n const bag = getEvents(instance);\n const n = getEventTarget(instance);\n\n // events can be an array of events or a string of events\n events = Array.isArray(events) ? events : events.split(delimiter);\n\n // add id to listener\n if (!listener._svgjsListenerId) {\n listener._svgjsListenerId = ++listenerId;\n }\n events.forEach(function (event) {\n const ev = event.split('.')[0];\n const ns = event.split('.')[1] || '*';\n\n // ensure valid object\n bag[ev] = bag[ev] || {};\n bag[ev][ns] = bag[ev][ns] || {};\n\n // reference listener\n bag[ev][ns][listener._svgjsListenerId] = l;\n\n // add listener\n n.addEventListener(ev, l, options || false);\n });\n}\n\n// Add event unbinder in the SVG namespace\nfunction off(node, events, listener, options) {\n const instance = makeInstance(node);\n const bag = getEvents(instance);\n const n = getEventTarget(instance);\n\n // listener can be a function or a number\n if (typeof listener === 'function') {\n listener = listener._svgjsListenerId;\n if (!listener) return;\n }\n\n // events can be an array of events or a string or undefined\n events = Array.isArray(events) ? events : (events || '').split(delimiter);\n events.forEach(function (event) {\n const ev = event && event.split('.')[0];\n const ns = event && event.split('.')[1];\n let namespace, l;\n if (listener) {\n // remove listener reference\n if (bag[ev] && bag[ev][ns || '*']) {\n // removeListener\n n.removeEventListener(ev, bag[ev][ns || '*'][listener], options || false);\n delete bag[ev][ns || '*'][listener];\n }\n } else if (ev && ns) {\n // remove all listeners for a namespaced event\n if (bag[ev] && bag[ev][ns]) {\n for (l in bag[ev][ns]) {\n off(n, [ev, ns].join('.'), l);\n }\n delete bag[ev][ns];\n }\n } else if (ns) {\n // remove all listeners for a specific namespace\n for (event in bag) {\n for (namespace in bag[event]) {\n if (ns === namespace) {\n off(n, [event, ns].join('.'));\n }\n }\n }\n } else if (ev) {\n // remove all listeners for the event\n if (bag[ev]) {\n for (namespace in bag[ev]) {\n off(n, [ev, namespace].join('.'));\n }\n delete bag[ev];\n }\n } else {\n // remove all listeners on a given node\n for (event in bag) {\n off(n, event);\n }\n clearEvents(instance);\n }\n });\n}\nfunction dispatch(node, event, data, options) {\n const n = getEventTarget(node);\n\n // Dispatch event\n if (event instanceof globals.window.Event) {\n n.dispatchEvent(event);\n } else {\n event = new globals.window.CustomEvent(event, {\n detail: data,\n cancelable: true,\n ...options\n });\n n.dispatchEvent(event);\n }\n return event;\n}\n\nclass EventTarget extends Base {\n addEventListener() {}\n dispatch(event, data, options) {\n return dispatch(this, event, data, options);\n }\n dispatchEvent(event) {\n const bag = this.getEventHolder().events;\n if (!bag) return true;\n const events = bag[event.type];\n for (const i in events) {\n for (const j in events[i]) {\n events[i][j](event);\n }\n }\n return !event.defaultPrevented;\n }\n\n // Fire given event\n fire(event, data, options) {\n this.dispatch(event, data, options);\n return this;\n }\n getEventHolder() {\n return this;\n }\n getEventTarget() {\n return this;\n }\n\n // Unbind event from listener\n off(event, listener, options) {\n off(this, event, listener, options);\n return this;\n }\n\n // Bind given event to listener\n on(event, listener, binding, options) {\n on(this, event, listener, binding, options);\n return this;\n }\n removeEventListener() {}\n}\nregister(EventTarget, 'EventTarget');\n\nfunction noop() {}\n\n// Default animation values\nconst timeline = {\n duration: 400,\n ease: '>',\n delay: 0\n};\n\n// Default attribute values\nconst attrs = {\n // fill and stroke\n 'fill-opacity': 1,\n 'stroke-opacity': 1,\n 'stroke-width': 0,\n 'stroke-linejoin': 'miter',\n 'stroke-linecap': 'butt',\n fill: '#000000',\n stroke: '#000000',\n opacity: 1,\n // position\n x: 0,\n y: 0,\n cx: 0,\n cy: 0,\n // size\n width: 0,\n height: 0,\n // radius\n r: 0,\n rx: 0,\n ry: 0,\n // gradient\n offset: 0,\n 'stop-opacity': 1,\n 'stop-color': '#000000',\n // text\n 'text-anchor': 'start'\n};\n\nvar defaults = {\n __proto__: null,\n attrs: attrs,\n noop: noop,\n timeline: timeline\n};\n\nclass SVGArray extends Array {\n constructor(...args) {\n super(...args);\n this.init(...args);\n }\n clone() {\n return new this.constructor(this);\n }\n init(arr) {\n // This catches the case, that native map tries to create an array with new Array(1)\n if (typeof arr === 'number') return this;\n this.length = 0;\n this.push(...this.parse(arr));\n return this;\n }\n\n // Parse whitespace separated string\n parse(array = []) {\n // If already is an array, no need to parse it\n if (array instanceof Array) return array;\n return array.trim().split(delimiter).map(parseFloat);\n }\n toArray() {\n return Array.prototype.concat.apply([], this);\n }\n toSet() {\n return new Set(this);\n }\n toString() {\n return this.join(' ');\n }\n\n // Flattens the array if needed\n valueOf() {\n const ret = [];\n ret.push(...this);\n return ret;\n }\n}\n\n// Module for unit conversions\nclass SVGNumber {\n // Initialize\n constructor(...args) {\n this.init(...args);\n }\n convert(unit) {\n return new SVGNumber(this.value, unit);\n }\n\n // Divide number\n divide(number) {\n number = new SVGNumber(number);\n return new SVGNumber(this / number, this.unit || number.unit);\n }\n init(value, unit) {\n unit = Array.isArray(value) ? value[1] : unit;\n value = Array.isArray(value) ? value[0] : value;\n\n // initialize defaults\n this.value = 0;\n this.unit = unit || '';\n\n // parse value\n if (typeof value === 'number') {\n // ensure a valid numeric value\n this.value = isNaN(value) ? 0 : !isFinite(value) ? value < 0 ? -3.4e38 : +3.4e38 : value;\n } else if (typeof value === 'string') {\n unit = value.match(numberAndUnit);\n if (unit) {\n // make value numeric\n this.value = parseFloat(unit[1]);\n\n // normalize\n if (unit[5] === '%') {\n this.value /= 100;\n } else if (unit[5] === 's') {\n this.value *= 1000;\n }\n\n // store unit\n this.unit = unit[5];\n }\n } else {\n if (value instanceof SVGNumber) {\n this.value = value.valueOf();\n this.unit = value.unit;\n }\n }\n return this;\n }\n\n // Subtract number\n minus(number) {\n number = new SVGNumber(number);\n return new SVGNumber(this - number, this.unit || number.unit);\n }\n\n // Add number\n plus(number) {\n number = new SVGNumber(number);\n return new SVGNumber(this + number, this.unit || number.unit);\n }\n\n // Multiply number\n times(number) {\n number = new SVGNumber(number);\n return new SVGNumber(this * number, this.unit || number.unit);\n }\n toArray() {\n return [this.value, this.unit];\n }\n toJSON() {\n return this.toString();\n }\n toString() {\n return (this.unit === '%' ? ~~(this.value * 1e8) / 1e6 : this.unit === 's' ? this.value / 1e3 : this.value) + this.unit;\n }\n valueOf() {\n return this.value;\n }\n}\n\nconst colorAttributes = new Set(['fill', 'stroke', 'color', 'bgcolor', 'stop-color', 'flood-color', 'lighting-color']);\nconst hooks = [];\nfunction registerAttrHook(fn) {\n hooks.push(fn);\n}\n\n// Set svg element attribute\nfunction attr(attr, val, ns) {\n // act as full getter\n if (attr == null) {\n // get an object of attributes\n attr = {};\n val = this.node.attributes;\n for (const node of val) {\n attr[node.nodeName] = isNumber.test(node.nodeValue) ? parseFloat(node.nodeValue) : node.nodeValue;\n }\n return attr;\n } else if (attr instanceof Array) {\n // loop through array and get all values\n return attr.reduce((last, curr) => {\n last[curr] = this.attr(curr);\n return last;\n }, {});\n } else if (typeof attr === 'object' && attr.constructor === Object) {\n // apply every attribute individually if an object is passed\n for (val in attr) this.attr(val, attr[val]);\n } else if (val === null) {\n // remove value\n this.node.removeAttribute(attr);\n } else if (val == null) {\n // act as a getter if the first and only argument is not an object\n val = this.node.getAttribute(attr);\n return val == null ? attrs[attr] : isNumber.test(val) ? parseFloat(val) : val;\n } else {\n // Loop through hooks and execute them to convert value\n val = hooks.reduce((_val, hook) => {\n return hook(attr, _val, this);\n }, val);\n\n // ensure correct numeric values (also accepts NaN and Infinity)\n if (typeof val === 'number') {\n val = new SVGNumber(val);\n } else if (colorAttributes.has(attr) && Color.isColor(val)) {\n // ensure full hex color\n val = new Color(val);\n } else if (val.constructor === Array) {\n // Check for plain arrays and parse array values\n val = new SVGArray(val);\n }\n\n // if the passed attribute is leading...\n if (attr === 'leading') {\n // ... call the leading method instead\n if (this.leading) {\n this.leading(val);\n }\n } else {\n // set given attribute on node\n typeof ns === 'string' ? this.node.setAttributeNS(ns, attr, val.toString()) : this.node.setAttribute(attr, val.toString());\n }\n\n // rebuild if required\n if (this.rebuild && (attr === 'font-size' || attr === 'x')) {\n this.rebuild();\n }\n }\n return this;\n}\n\nclass Dom extends EventTarget {\n constructor(node, attrs) {\n super();\n this.node = node;\n this.type = node.nodeName;\n if (attrs && node !== attrs) {\n this.attr(attrs);\n }\n }\n\n // Add given element at a position\n add(element, i) {\n element = makeInstance(element);\n\n // If non-root svg nodes are added we have to remove their namespaces\n if (element.removeNamespace && this.node instanceof globals.window.SVGElement) {\n element.removeNamespace();\n }\n if (i == null) {\n this.node.appendChild(element.node);\n } else if (element.node !== this.node.childNodes[i]) {\n this.node.insertBefore(element.node, this.node.childNodes[i]);\n }\n return this;\n }\n\n // Add element to given container and return self\n addTo(parent, i) {\n return makeInstance(parent).put(this, i);\n }\n\n // Returns all child elements\n children() {\n return new List(map(this.node.children, function (node) {\n return adopt(node);\n }));\n }\n\n // Remove all elements in this container\n clear() {\n // remove children\n while (this.node.hasChildNodes()) {\n this.node.removeChild(this.node.lastChild);\n }\n return this;\n }\n\n // Clone element\n clone(deep = true, assignNewIds = true) {\n // write dom data to the dom so the clone can pickup the data\n this.writeDataToDom();\n\n // clone element\n let nodeClone = this.node.cloneNode(deep);\n if (assignNewIds) {\n // assign new id\n nodeClone = assignNewId(nodeClone);\n }\n return new this.constructor(nodeClone);\n }\n\n // Iterates over all children and invokes a given block\n each(block, deep) {\n const children = this.children();\n let i, il;\n for (i = 0, il = children.length; i < il; i++) {\n block.apply(children[i], [i, children]);\n if (deep) {\n children[i].each(block, deep);\n }\n }\n return this;\n }\n element(nodeName, attrs) {\n return this.put(new Dom(create(nodeName), attrs));\n }\n\n // Get first child\n first() {\n return adopt(this.node.firstChild);\n }\n\n // Get a element at the given index\n get(i) {\n return adopt(this.node.childNodes[i]);\n }\n getEventHolder() {\n return this.node;\n }\n getEventTarget() {\n return this.node;\n }\n\n // Checks if the given element is a child\n has(element) {\n return this.index(element) >= 0;\n }\n html(htmlOrFn, outerHTML) {\n return this.xml(htmlOrFn, outerHTML, html);\n }\n\n // Get / set id\n id(id) {\n // generate new id if no id set\n if (typeof id === 'undefined' && !this.node.id) {\n this.node.id = eid(this.type);\n }\n\n // don't set directly with this.node.id to make `null` work correctly\n return this.attr('id', id);\n }\n\n // Gets index of given element\n index(element) {\n return [].slice.call(this.node.childNodes).indexOf(element.node);\n }\n\n // Get the last child\n last() {\n return adopt(this.node.lastChild);\n }\n\n // matches the element vs a css selector\n matches(selector) {\n const el = this.node;\n const matcher = el.matches || el.matchesSelector || el.msMatchesSelector || el.mozMatchesSelector || el.webkitMatchesSelector || el.oMatchesSelector || null;\n return matcher && matcher.call(el, selector);\n }\n\n // Returns the parent element instance\n parent(type) {\n let parent = this;\n\n // check for parent\n if (!parent.node.parentNode) return null;\n\n // get parent element\n parent = adopt(parent.node.parentNode);\n if (!type) return parent;\n\n // loop through ancestors if type is given\n do {\n if (typeof type === 'string' ? parent.matches(type) : parent instanceof type) return parent;\n } while (parent = adopt(parent.node.parentNode));\n return parent;\n }\n\n // Basically does the same as `add()` but returns the added element instead\n put(element, i) {\n element = makeInstance(element);\n this.add(element, i);\n return element;\n }\n\n // Add element to given container and return container\n putIn(parent, i) {\n return makeInstance(parent).add(this, i);\n }\n\n // Remove element\n remove() {\n if (this.parent()) {\n this.parent().removeElement(this);\n }\n return this;\n }\n\n // Remove a given child\n removeElement(element) {\n this.node.removeChild(element.node);\n return this;\n }\n\n // Replace this with element\n replace(element) {\n element = makeInstance(element);\n if (this.node.parentNode) {\n this.node.parentNode.replaceChild(element.node, this.node);\n }\n return element;\n }\n round(precision = 2, map = null) {\n const factor = 10 ** precision;\n const attrs = this.attr(map);\n for (const i in attrs) {\n if (typeof attrs[i] === 'number') {\n attrs[i] = Math.round(attrs[i] * factor) / factor;\n }\n }\n this.attr(attrs);\n return this;\n }\n\n // Import / Export raw svg\n svg(svgOrFn, outerSVG) {\n return this.xml(svgOrFn, outerSVG, svg);\n }\n\n // Return id on string conversion\n toString() {\n return this.id();\n }\n words(text) {\n // This is faster than removing all children and adding a new one\n this.node.textContent = text;\n return this;\n }\n wrap(node) {\n const parent = this.parent();\n if (!parent) {\n return this.addTo(node);\n }\n const position = parent.index(this);\n return parent.put(node, position).put(this);\n }\n\n // write svgjs data to the dom\n writeDataToDom() {\n // dump variables recursively\n this.each(function () {\n this.writeDataToDom();\n });\n return this;\n }\n\n // Import / Export raw svg\n xml(xmlOrFn, outerXML, ns) {\n if (typeof xmlOrFn === 'boolean') {\n ns = outerXML;\n outerXML = xmlOrFn;\n xmlOrFn = null;\n }\n\n // act as getter if no svg string is given\n if (xmlOrFn == null || typeof xmlOrFn === 'function') {\n // The default for exports is, that the outerNode is included\n outerXML = outerXML == null ? true : outerXML;\n\n // write svgjs data to the dom\n this.writeDataToDom();\n let current = this;\n\n // An export modifier was passed\n if (xmlOrFn != null) {\n current = adopt(current.node.cloneNode(true));\n\n // If the user wants outerHTML we need to process this node, too\n if (outerXML) {\n const result = xmlOrFn(current);\n current = result || current;\n\n // The user does not want this node? Well, then he gets nothing\n if (result === false) return '';\n }\n\n // Deep loop through all children and apply modifier\n current.each(function () {\n const result = xmlOrFn(this);\n const _this = result || this;\n\n // If modifier returns false, discard node\n if (result === false) {\n this.remove();\n\n // If modifier returns new node, use it\n } else if (result && this !== _this) {\n this.replace(_this);\n }\n }, true);\n }\n\n // Return outer or inner content\n return outerXML ? current.node.outerHTML : current.node.innerHTML;\n }\n\n // Act as setter if we got a string\n\n // The default for import is, that the current node is not replaced\n outerXML = outerXML == null ? false : outerXML;\n\n // Create temporary holder\n const well = create('wrapper', ns);\n const fragment = globals.document.createDocumentFragment();\n\n // Dump raw svg\n well.innerHTML = xmlOrFn;\n\n // Transplant nodes into the fragment\n for (let len = well.children.length; len--;) {\n fragment.appendChild(well.firstElementChild);\n }\n const parent = this.parent();\n\n // Add the whole fragment at once\n return outerXML ? this.replace(fragment) && parent : this.add(fragment);\n }\n}\nextend(Dom, {\n attr,\n find,\n findOne\n});\nregister(Dom, 'Dom');\n\nclass Element extends Dom {\n constructor(node, attrs) {\n super(node, attrs);\n\n // initialize data object\n this.dom = {};\n\n // create circular reference\n this.node.instance = this;\n if (node.hasAttribute('data-svgjs') || node.hasAttribute('svgjs:data')) {\n // pull svgjs data from the dom (getAttributeNS doesn't work in html5)\n this.setData(JSON.parse(node.getAttribute('data-svgjs')) ?? JSON.parse(node.getAttribute('svgjs:data')) ?? {});\n }\n }\n\n // Move element by its center\n center(x, y) {\n return this.cx(x).cy(y);\n }\n\n // Move by center over x-axis\n cx(x) {\n return x == null ? this.x() + this.width() / 2 : this.x(x - this.width() / 2);\n }\n\n // Move by center over y-axis\n cy(y) {\n return y == null ? this.y() + this.height() / 2 : this.y(y - this.height() / 2);\n }\n\n // Get defs\n defs() {\n const root = this.root();\n return root && root.defs();\n }\n\n // Relative move over x and y axes\n dmove(x, y) {\n return this.dx(x).dy(y);\n }\n\n // Relative move over x axis\n dx(x = 0) {\n return this.x(new SVGNumber(x).plus(this.x()));\n }\n\n // Relative move over y axis\n dy(y = 0) {\n return this.y(new SVGNumber(y).plus(this.y()));\n }\n getEventHolder() {\n return this;\n }\n\n // Set height of element\n height(height) {\n return this.attr('height', height);\n }\n\n // Move element to given x and y values\n move(x, y) {\n return this.x(x).y(y);\n }\n\n // return array of all ancestors of given type up to the root svg\n parents(until = this.root()) {\n const isSelector = typeof until === 'string';\n if (!isSelector) {\n until = makeInstance(until);\n }\n const parents = new List();\n let parent = this;\n while ((parent = parent.parent()) && parent.node !== globals.document && parent.nodeName !== '#document-fragment') {\n parents.push(parent);\n if (!isSelector && parent.node === until.node) {\n break;\n }\n if (isSelector && parent.matches(until)) {\n break;\n }\n if (parent.node === this.root().node) {\n // We worked our way to the root and didn't match `until`\n return null;\n }\n }\n return parents;\n }\n\n // Get referenced element form attribute value\n reference(attr) {\n attr = this.attr(attr);\n if (!attr) return null;\n const m = (attr + '').match(reference);\n return m ? makeInstance(m[1]) : null;\n }\n\n // Get parent document\n root() {\n const p = this.parent(getClass(root));\n return p && p.root();\n }\n\n // set given data to the elements data property\n setData(o) {\n this.dom = o;\n return this;\n }\n\n // Set element size to given width and height\n size(width, height) {\n const p = proportionalSize(this, width, height);\n return this.width(new SVGNumber(p.width)).height(new SVGNumber(p.height));\n }\n\n // Set width of element\n width(width) {\n return this.attr('width', width);\n }\n\n // write svgjs data to the dom\n writeDataToDom() {\n writeDataToDom(this, this.dom);\n return super.writeDataToDom();\n }\n\n // Move over x-axis\n x(x) {\n return this.attr('x', x);\n }\n\n // Move over y-axis\n y(y) {\n return this.attr('y', y);\n }\n}\nextend(Element, {\n bbox,\n rbox,\n inside,\n point,\n ctm,\n screenCTM\n});\nregister(Element, 'Element');\n\n// Define list of available attributes for stroke and fill\nconst sugar = {\n stroke: ['color', 'width', 'opacity', 'linecap', 'linejoin', 'miterlimit', 'dasharray', 'dashoffset'],\n fill: ['color', 'opacity', 'rule'],\n prefix: function (t, a) {\n return a === 'color' ? t : t + '-' + a;\n }\n}\n\n// Add sugar for fill and stroke\n;\n['fill', 'stroke'].forEach(function (m) {\n const extension = {};\n let i;\n extension[m] = function (o) {\n if (typeof o === 'undefined') {\n return this.attr(m);\n }\n if (typeof o === 'string' || o instanceof Color || Color.isRgb(o) || o instanceof Element) {\n this.attr(m, o);\n } else {\n // set all attributes from sugar.fill and sugar.stroke list\n for (i = sugar[m].length - 1; i >= 0; i--) {\n if (o[sugar[m][i]] != null) {\n this.attr(sugar.prefix(m, sugar[m][i]), o[sugar[m][i]]);\n }\n }\n }\n return this;\n };\n registerMethods(['Element', 'Runner'], extension);\n});\nregisterMethods(['Element', 'Runner'], {\n // Let the user set the matrix directly\n matrix: function (mat, b, c, d, e, f) {\n // Act as a getter\n if (mat == null) {\n return new Matrix(this);\n }\n\n // Act as a setter, the user can pass a matrix or a set of numbers\n return this.attr('transform', new Matrix(mat, b, c, d, e, f));\n },\n // Map rotation to transform\n rotate: function (angle, cx, cy) {\n return this.transform({\n rotate: angle,\n ox: cx,\n oy: cy\n }, true);\n },\n // Map skew to transform\n skew: function (x, y, cx, cy) {\n return arguments.length === 1 || arguments.length === 3 ? this.transform({\n skew: x,\n ox: y,\n oy: cx\n }, true) : this.transform({\n skew: [x, y],\n ox: cx,\n oy: cy\n }, true);\n },\n shear: function (lam, cx, cy) {\n return this.transform({\n shear: lam,\n ox: cx,\n oy: cy\n }, true);\n },\n // Map scale to transform\n scale: function (x, y, cx, cy) {\n return arguments.length === 1 || arguments.length === 3 ? this.transform({\n scale: x,\n ox: y,\n oy: cx\n }, true) : this.transform({\n scale: [x, y],\n ox: cx,\n oy: cy\n }, true);\n },\n // Map translate to transform\n translate: function (x, y) {\n return this.transform({\n translate: [x, y]\n }, true);\n },\n // Map relative translations to transform\n relative: function (x, y) {\n return this.transform({\n relative: [x, y]\n }, true);\n },\n // Map flip to transform\n flip: function (direction = 'both', origin = 'center') {\n if ('xybothtrue'.indexOf(direction) === -1) {\n origin = direction;\n direction = 'both';\n }\n return this.transform({\n flip: direction,\n origin: origin\n }, true);\n },\n // Opacity\n opacity: function (value) {\n return this.attr('opacity', value);\n }\n});\nregisterMethods('radius', {\n // Add x and y radius\n radius: function (x, y = x) {\n const type = (this._element || this).type;\n return type === 'radialGradient' ? this.attr('r', new SVGNumber(x)) : this.rx(x).ry(y);\n }\n});\nregisterMethods('Path', {\n // Get path length\n length: function () {\n return this.node.getTotalLength();\n },\n // Get point at length\n pointAt: function (length) {\n return new Point(this.node.getPointAtLength(length));\n }\n});\nregisterMethods(['Element', 'Runner'], {\n // Set font\n font: function (a, v) {\n if (typeof a === 'object') {\n for (v in a) this.font(v, a[v]);\n return this;\n }\n return a === 'leading' ? this.leading(v) : a === 'anchor' ? this.attr('text-anchor', v) : a === 'size' || a === 'family' || a === 'weight' || a === 'stretch' || a === 'variant' || a === 'style' ? this.attr('font-' + a, v) : this.attr(a, v);\n }\n});\n\n// Add events to elements\nconst methods = ['click', 'dblclick', 'mousedown', 'mouseup', 'mouseover', 'mouseout', 'mousemove', 'mouseenter', 'mouseleave', 'touchstart', 'touchmove', 'touchleave', 'touchend', 'touchcancel', 'contextmenu', 'wheel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel'].reduce(function (last, event) {\n // add event to Element\n const fn = function (f) {\n if (f === null) {\n this.off(event);\n } else {\n this.on(event, f);\n }\n return this;\n };\n last[event] = fn;\n return last;\n}, {});\nregisterMethods('Element', methods);\n\n// Reset all transformations\nfunction untransform() {\n return this.attr('transform', null);\n}\n\n// merge the whole transformation chain into one matrix and returns it\nfunction matrixify() {\n const matrix = (this.attr('transform') || ''\n // split transformations\n ).split(transforms).slice(0, -1).map(function (str) {\n // generate key => value pairs\n const kv = str.trim().split('(');\n return [kv[0], kv[1].split(delimiter).map(function (str) {\n return parseFloat(str);\n })];\n }).reverse()\n // merge every transformation into one matrix\n .reduce(function (matrix, transform) {\n if (transform[0] === 'matrix') {\n return matrix.lmultiply(Matrix.fromArray(transform[1]));\n }\n return matrix[transform[0]].apply(matrix, transform[1]);\n }, new Matrix());\n return matrix;\n}\n\n// add an element to another parent without changing the visual representation on the screen\nfunction toParent(parent, i) {\n if (this === parent) return this;\n if (isDescriptive(this.node)) return this.addTo(parent, i);\n const ctm = this.screenCTM();\n const pCtm = parent.screenCTM().inverse();\n this.addTo(parent, i).untransform().transform(pCtm.multiply(ctm));\n return this;\n}\n\n// same as above with parent equals root-svg\nfunction toRoot(i) {\n return this.toParent(this.root(), i);\n}\n\n// Add transformations\nfunction transform(o, relative) {\n // Act as a getter if no object was passed\n if (o == null || typeof o === 'string') {\n const decomposed = new Matrix(this).decompose();\n return o == null ? decomposed : decomposed[o];\n }\n if (!Matrix.isMatrixLike(o)) {\n // Set the origin according to the defined transform\n o = {\n ...o,\n origin: getOrigin(o, this)\n };\n }\n\n // The user can pass a boolean, an Element or an Matrix or nothing\n const cleanRelative = relative === true ? this : relative || false;\n const result = new Matrix(cleanRelative).transform(o);\n return this.attr('transform', result);\n}\nregisterMethods('Element', {\n untransform,\n matrixify,\n toParent,\n toRoot,\n transform\n});\n\nclass Container extends Element {\n flatten() {\n this.each(function () {\n if (this instanceof Container) {\n return this.flatten().ungroup();\n }\n });\n return this;\n }\n ungroup(parent = this.parent(), index = parent.index(this)) {\n // when parent != this, we want append all elements to the end\n index = index === -1 ? parent.children().length : index;\n this.each(function (i, children) {\n // reverse each\n return children[children.length - i - 1].toParent(parent, index);\n });\n return this.remove();\n }\n}\nregister(Container, 'Container');\n\nclass Defs extends Container {\n constructor(node, attrs = node) {\n super(nodeOrNew('defs', node), attrs);\n }\n flatten() {\n return this;\n }\n ungroup() {\n return this;\n }\n}\nregister(Defs, 'Defs');\n\nclass Shape extends Element {}\nregister(Shape, 'Shape');\n\n// Radius x value\nfunction rx(rx) {\n return this.attr('rx', rx);\n}\n\n// Radius y value\nfunction ry(ry) {\n return this.attr('ry', ry);\n}\n\n// Move over x-axis\nfunction x$3(x) {\n return x == null ? this.cx() - this.rx() : this.cx(x + this.rx());\n}\n\n// Move over y-axis\nfunction y$3(y) {\n return y == null ? this.cy() - this.ry() : this.cy(y + this.ry());\n}\n\n// Move by center over x-axis\nfunction cx$1(x) {\n return this.attr('cx', x);\n}\n\n// Move by center over y-axis\nfunction cy$1(y) {\n return this.attr('cy', y);\n}\n\n// Set width of element\nfunction width$2(width) {\n return width == null ? this.rx() * 2 : this.rx(new SVGNumber(width).divide(2));\n}\n\n// Set height of element\nfunction height$2(height) {\n return height == null ? this.ry() * 2 : this.ry(new SVGNumber(height).divide(2));\n}\n\nvar circled = {\n __proto__: null,\n cx: cx$1,\n cy: cy$1,\n height: height$2,\n rx: rx,\n ry: ry,\n width: width$2,\n x: x$3,\n y: y$3\n};\n\nclass Ellipse extends Shape {\n constructor(node, attrs = node) {\n super(nodeOrNew('ellipse', node), attrs);\n }\n size(width, height) {\n const p = proportionalSize(this, width, height);\n return this.rx(new SVGNumber(p.width).divide(2)).ry(new SVGNumber(p.height).divide(2));\n }\n}\nextend(Ellipse, circled);\nregisterMethods('Container', {\n // Create an ellipse\n ellipse: wrapWithAttrCheck(function (width = 0, height = width) {\n return this.put(new Ellipse()).size(width, height).move(0, 0);\n })\n});\nregister(Ellipse, 'Ellipse');\n\nclass Fragment extends Dom {\n constructor(node = globals.document.createDocumentFragment()) {\n super(node);\n }\n\n // Import / Export raw xml\n xml(xmlOrFn, outerXML, ns) {\n if (typeof xmlOrFn === 'boolean') {\n ns = outerXML;\n outerXML = xmlOrFn;\n xmlOrFn = null;\n }\n\n // because this is a fragment we have to put all elements into a wrapper first\n // before we can get the innerXML from it\n if (xmlOrFn == null || typeof xmlOrFn === 'function') {\n const wrapper = new Dom(create('wrapper', ns));\n wrapper.add(this.node.cloneNode(true));\n return wrapper.xml(false, ns);\n }\n\n // Act as setter if we got a string\n return super.xml(xmlOrFn, false, ns);\n }\n}\nregister(Fragment, 'Fragment');\n\nfunction from(x, y) {\n return (this._element || this).type === 'radialGradient' ? this.attr({\n fx: new SVGNumber(x),\n fy: new SVGNumber(y)\n }) : this.attr({\n x1: new SVGNumber(x),\n y1: new SVGNumber(y)\n });\n}\nfunction to(x, y) {\n return (this._element || this).type === 'radialGradient' ? this.attr({\n cx: new SVGNumber(x),\n cy: new SVGNumber(y)\n }) : this.attr({\n x2: new SVGNumber(x),\n y2: new SVGNumber(y)\n });\n}\n\nvar gradiented = {\n __proto__: null,\n from: from,\n to: to\n};\n\nclass Gradient extends Container {\n constructor(type, attrs) {\n super(nodeOrNew(type + 'Gradient', typeof type === 'string' ? null : type), attrs);\n }\n\n // custom attr to handle transform\n attr(a, b, c) {\n if (a === 'transform') a = 'gradientTransform';\n return super.attr(a, b, c);\n }\n bbox() {\n return new Box();\n }\n targets() {\n return baseFind('svg [fill*=' + this.id() + ']');\n }\n\n // Alias string conversion to fill\n toString() {\n return this.url();\n }\n\n // Update gradient\n update(block) {\n // remove all stops\n this.clear();\n\n // invoke passed block\n if (typeof block === 'function') {\n block.call(this, this);\n }\n return this;\n }\n\n // Return the fill id\n url() {\n return 'url(#' + this.id() + ')';\n }\n}\nextend(Gradient, gradiented);\nregisterMethods({\n Container: {\n // Create gradient element in defs\n gradient(...args) {\n return this.defs().gradient(...args);\n }\n },\n // define gradient\n Defs: {\n gradient: wrapWithAttrCheck(function (type, block) {\n return this.put(new Gradient(type)).update(block);\n })\n }\n});\nregister(Gradient, 'Gradient');\n\nclass Pattern extends Container {\n // Initialize node\n constructor(node, attrs = node) {\n super(nodeOrNew('pattern', node), attrs);\n }\n\n // custom attr to handle transform\n attr(a, b, c) {\n if (a === 'transform') a = 'patternTransform';\n return super.attr(a, b, c);\n }\n bbox() {\n return new Box();\n }\n targets() {\n return baseFind('svg [fill*=' + this.id() + ']');\n }\n\n // Alias string conversion to fill\n toString() {\n return this.url();\n }\n\n // Update pattern by rebuilding\n update(block) {\n // remove content\n this.clear();\n\n // invoke passed block\n if (typeof block === 'function') {\n block.call(this, this);\n }\n return this;\n }\n\n // Return the fill id\n url() {\n return 'url(#' + this.id() + ')';\n }\n}\nregisterMethods({\n Container: {\n // Create pattern element in defs\n pattern(...args) {\n return this.defs().pattern(...args);\n }\n },\n Defs: {\n pattern: wrapWithAttrCheck(function (width, height, block) {\n return this.put(new Pattern()).update(block).attr({\n x: 0,\n y: 0,\n width: width,\n height: height,\n patternUnits: 'userSpaceOnUse'\n });\n })\n }\n});\nregister(Pattern, 'Pattern');\n\nclass Image extends Shape {\n constructor(node, attrs = node) {\n super(nodeOrNew('image', node), attrs);\n }\n\n // (re)load image\n load(url, callback) {\n if (!url) return this;\n const img = new globals.window.Image();\n on(img, 'load', function (e) {\n const p = this.parent(Pattern);\n\n // ensure image size\n if (this.width() === 0 && this.height() === 0) {\n this.size(img.width, img.height);\n }\n if (p instanceof Pattern) {\n // ensure pattern size if not set\n if (p.width() === 0 && p.height() === 0) {\n p.size(this.width(), this.height());\n }\n }\n if (typeof callback === 'function') {\n callback.call(this, e);\n }\n }, this);\n on(img, 'load error', function () {\n // dont forget to unbind memory leaking events\n off(img);\n });\n return this.attr('href', img.src = url, xlink);\n }\n}\nregisterAttrHook(function (attr, val, _this) {\n // convert image fill and stroke to patterns\n if (attr === 'fill' || attr === 'stroke') {\n if (isImage.test(val)) {\n val = _this.root().defs().image(val);\n }\n }\n if (val instanceof Image) {\n val = _this.root().defs().pattern(0, 0, pattern => {\n pattern.add(val);\n });\n }\n return val;\n});\nregisterMethods({\n Container: {\n // create image element, load image and set its size\n image: wrapWithAttrCheck(function (source, callback) {\n return this.put(new Image()).size(0, 0).load(source, callback);\n })\n }\n});\nregister(Image, 'Image');\n\nclass PointArray extends SVGArray {\n // Get bounding box of points\n bbox() {\n let maxX = -Infinity;\n let maxY = -Infinity;\n let minX = Infinity;\n let minY = Infinity;\n this.forEach(function (el) {\n maxX = Math.max(el[0], maxX);\n maxY = Math.max(el[1], maxY);\n minX = Math.min(el[0], minX);\n minY = Math.min(el[1], minY);\n });\n return new Box(minX, minY, maxX - minX, maxY - minY);\n }\n\n // Move point string\n move(x, y) {\n const box = this.bbox();\n\n // get relative offset\n x -= box.x;\n y -= box.y;\n\n // move every point\n if (!isNaN(x) && !isNaN(y)) {\n for (let i = this.length - 1; i >= 0; i--) {\n this[i] = [this[i][0] + x, this[i][1] + y];\n }\n }\n return this;\n }\n\n // Parse point string and flat array\n parse(array = [0, 0]) {\n const points = [];\n\n // if it is an array, we flatten it and therefore clone it to 1 depths\n if (array instanceof Array) {\n array = Array.prototype.concat.apply([], array);\n } else {\n // Else, it is considered as a string\n // parse points\n array = array.trim().split(delimiter).map(parseFloat);\n }\n\n // validate points - https://svgwg.org/svg2-draft/shapes.html#DataTypePoints\n // Odd number of coordinates is an error. In such cases, drop the last odd coordinate.\n if (array.length % 2 !== 0) array.pop();\n\n // wrap points in two-tuples\n for (let i = 0, len = array.length; i < len; i = i + 2) {\n points.push([array[i], array[i + 1]]);\n }\n return points;\n }\n\n // Resize poly string\n size(width, height) {\n let i;\n const box = this.bbox();\n\n // recalculate position of all points according to new size\n for (i = this.length - 1; i >= 0; i--) {\n if (box.width) this[i][0] = (this[i][0] - box.x) * width / box.width + box.x;\n if (box.height) this[i][1] = (this[i][1] - box.y) * height / box.height + box.y;\n }\n return this;\n }\n\n // Convert array to line object\n toLine() {\n return {\n x1: this[0][0],\n y1: this[0][1],\n x2: this[1][0],\n y2: this[1][1]\n };\n }\n\n // Convert array to string\n toString() {\n const array = [];\n // convert to a poly point string\n for (let i = 0, il = this.length; i < il; i++) {\n array.push(this[i].join(','));\n }\n return array.join(' ');\n }\n transform(m) {\n return this.clone().transformO(m);\n }\n\n // transform points with matrix (similar to Point.transform)\n transformO(m) {\n if (!Matrix.isMatrixLike(m)) {\n m = new Matrix(m);\n }\n for (let i = this.length; i--;) {\n // Perform the matrix multiplication\n const [x, y] = this[i];\n this[i][0] = m.a * x + m.c * y + m.e;\n this[i][1] = m.b * x + m.d * y + m.f;\n }\n return this;\n }\n}\n\nconst MorphArray = PointArray;\n\n// Move by left top corner over x-axis\nfunction x$2(x) {\n return x == null ? this.bbox().x : this.move(x, this.bbox().y);\n}\n\n// Move by left top corner over y-axis\nfunction y$2(y) {\n return y == null ? this.bbox().y : this.move(this.bbox().x, y);\n}\n\n// Set width of element\nfunction width$1(width) {\n const b = this.bbox();\n return width == null ? b.width : this.size(width, b.height);\n}\n\n// Set height of element\nfunction height$1(height) {\n const b = this.bbox();\n return height == null ? b.height : this.size(b.width, height);\n}\n\nvar pointed = {\n __proto__: null,\n MorphArray: MorphArray,\n height: height$1,\n width: width$1,\n x: x$2,\n y: y$2\n};\n\nclass Line extends Shape {\n // Initialize node\n constructor(node, attrs = node) {\n super(nodeOrNew('line', node), attrs);\n }\n\n // Get array\n array() {\n return new PointArray([[this.attr('x1'), this.attr('y1')], [this.attr('x2'), this.attr('y2')]]);\n }\n\n // Move by left top corner\n move(x, y) {\n return this.attr(this.array().move(x, y).toLine());\n }\n\n // Overwrite native plot() method\n plot(x1, y1, x2, y2) {\n if (x1 == null) {\n return this.array();\n } else if (typeof y1 !== 'undefined') {\n x1 = {\n x1,\n y1,\n x2,\n y2\n };\n } else {\n x1 = new PointArray(x1).toLine();\n }\n return this.attr(x1);\n }\n\n // Set element size to given width and height\n size(width, height) {\n const p = proportionalSize(this, width, height);\n return this.attr(this.array().size(p.width, p.height).toLine());\n }\n}\nextend(Line, pointed);\nregisterMethods({\n Container: {\n // Create a line element\n line: wrapWithAttrCheck(function (...args) {\n // make sure plot is called as a setter\n // x1 is not necessarily a number, it can also be an array, a string and a PointArray\n return Line.prototype.plot.apply(this.put(new Line()), args[0] != null ? args : [0, 0, 0, 0]);\n })\n }\n});\nregister(Line, 'Line');\n\nclass Marker extends Container {\n // Initialize node\n constructor(node, attrs = node) {\n super(nodeOrNew('marker', node), attrs);\n }\n\n // Set height of element\n height(height) {\n return this.attr('markerHeight', height);\n }\n orient(orient) {\n return this.attr('orient', orient);\n }\n\n // Set marker refX and refY\n ref(x, y) {\n return this.attr('refX', x).attr('refY', y);\n }\n\n // Return the fill id\n toString() {\n return 'url(#' + this.id() + ')';\n }\n\n // Update marker\n update(block) {\n // remove all content\n this.clear();\n\n // invoke passed block\n if (typeof block === 'function') {\n block.call(this, this);\n }\n return this;\n }\n\n // Set width of element\n width(width) {\n return this.attr('markerWidth', width);\n }\n}\nregisterMethods({\n Container: {\n marker(...args) {\n // Create marker element in defs\n return this.defs().marker(...args);\n }\n },\n Defs: {\n // Create marker\n marker: wrapWithAttrCheck(function (width, height, block) {\n // Set default viewbox to match the width and height, set ref to cx and cy and set orient to auto\n return this.put(new Marker()).size(width, height).ref(width / 2, height / 2).viewbox(0, 0, width, height).attr('orient', 'auto').update(block);\n })\n },\n marker: {\n // Create and attach markers\n marker(marker, width, height, block) {\n let attr = ['marker'];\n\n // Build attribute name\n if (marker !== 'all') attr.push(marker);\n attr = attr.join('-');\n\n // Set marker attribute\n marker = arguments[1] instanceof Marker ? arguments[1] : this.defs().marker(width, height, block);\n return this.attr(attr, marker);\n }\n }\n});\nregister(Marker, 'Marker');\n\n/***\nBase Class\n==========\nThe base stepper class that will be\n***/\n\nfunction makeSetterGetter(k, f) {\n return function (v) {\n if (v == null) return this[k];\n this[k] = v;\n if (f) f.call(this);\n return this;\n };\n}\nconst easing = {\n '-': function (pos) {\n return pos;\n },\n '<>': function (pos) {\n return -Math.cos(pos * Math.PI) / 2 + 0.5;\n },\n '>': function (pos) {\n return Math.sin(pos * Math.PI / 2);\n },\n '<': function (pos) {\n return -Math.cos(pos * Math.PI / 2) + 1;\n },\n bezier: function (x1, y1, x2, y2) {\n // see https://www.w3.org/TR/css-easing-1/#cubic-bezier-algo\n return function (t) {\n if (t < 0) {\n if (x1 > 0) {\n return y1 / x1 * t;\n } else if (x2 > 0) {\n return y2 / x2 * t;\n } else {\n return 0;\n }\n } else if (t > 1) {\n if (x2 < 1) {\n return (1 - y2) / (1 - x2) * t + (y2 - x2) / (1 - x2);\n } else if (x1 < 1) {\n return (1 - y1) / (1 - x1) * t + (y1 - x1) / (1 - x1);\n } else {\n return 1;\n }\n } else {\n return 3 * t * (1 - t) ** 2 * y1 + 3 * t ** 2 * (1 - t) * y2 + t ** 3;\n }\n };\n },\n // see https://www.w3.org/TR/css-easing-1/#step-timing-function-algo\n steps: function (steps, stepPosition = 'end') {\n // deal with \"jump-\" prefix\n stepPosition = stepPosition.split('-').reverse()[0];\n let jumps = steps;\n if (stepPosition === 'none') {\n --jumps;\n } else if (stepPosition === 'both') {\n ++jumps;\n }\n\n // The beforeFlag is essentially useless\n return (t, beforeFlag = false) => {\n // Step is called currentStep in referenced url\n let step = Math.floor(t * steps);\n const jumping = t * step % 1 === 0;\n if (stepPosition === 'start' || stepPosition === 'both') {\n ++step;\n }\n if (beforeFlag && jumping) {\n --step;\n }\n if (t >= 0 && step < 0) {\n step = 0;\n }\n if (t <= 1 && step > jumps) {\n step = jumps;\n }\n return step / jumps;\n };\n }\n};\nclass Stepper {\n done() {\n return false;\n }\n}\n\n/***\nEasing Functions\n================\n***/\n\nclass Ease extends Stepper {\n constructor(fn = timeline.ease) {\n super();\n this.ease = easing[fn] || fn;\n }\n step(from, to, pos) {\n if (typeof from !== 'number') {\n return pos < 1 ? from : to;\n }\n return from + (to - from) * this.ease(pos);\n }\n}\n\n/***\nController Types\n================\n***/\n\nclass Controller extends Stepper {\n constructor(fn) {\n super();\n this.stepper = fn;\n }\n done(c) {\n return c.done;\n }\n step(current, target, dt, c) {\n return this.stepper(current, target, dt, c);\n }\n}\nfunction recalculate() {\n // Apply the default parameters\n const duration = (this._duration || 500) / 1000;\n const overshoot = this._overshoot || 0;\n\n // Calculate the PID natural response\n const eps = 1e-10;\n const pi = Math.PI;\n const os = Math.log(overshoot / 100 + eps);\n const zeta = -os / Math.sqrt(pi * pi + os * os);\n const wn = 3.9 / (zeta * duration);\n\n // Calculate the Spring values\n this.d = 2 * zeta * wn;\n this.k = wn * wn;\n}\nclass Spring extends Controller {\n constructor(duration = 500, overshoot = 0) {\n super();\n this.duration(duration).overshoot(overshoot);\n }\n step(current, target, dt, c) {\n if (typeof current === 'string') return current;\n c.done = dt === Infinity;\n if (dt === Infinity) return target;\n if (dt === 0) return current;\n if (dt > 100) dt = 16;\n dt /= 1000;\n\n // Get the previous velocity\n const velocity = c.velocity || 0;\n\n // Apply the control to get the new position and store it\n const acceleration = -this.d * velocity - this.k * (current - target);\n const newPosition = current + velocity * dt + acceleration * dt * dt / 2;\n\n // Store the velocity\n c.velocity = velocity + acceleration * dt;\n\n // Figure out if we have converged, and if so, pass the value\n c.done = Math.abs(target - newPosition) + Math.abs(velocity) < 0.002;\n return c.done ? target : newPosition;\n }\n}\nextend(Spring, {\n duration: makeSetterGetter('_duration', recalculate),\n overshoot: makeSetterGetter('_overshoot', recalculate)\n});\nclass PID extends Controller {\n constructor(p = 0.1, i = 0.01, d = 0, windup = 1000) {\n super();\n this.p(p).i(i).d(d).windup(windup);\n }\n step(current, target, dt, c) {\n if (typeof current === 'string') return current;\n c.done = dt === Infinity;\n if (dt === Infinity) return target;\n if (dt === 0) return current;\n const p = target - current;\n let i = (c.integral || 0) + p * dt;\n const d = (p - (c.error || 0)) / dt;\n const windup = this._windup;\n\n // antiwindup\n if (windup !== false) {\n i = Math.max(-windup, Math.min(i, windup));\n }\n c.error = p;\n c.integral = i;\n c.done = Math.abs(p) < 0.001;\n return c.done ? target : current + (this.P * p + this.I * i + this.D * d);\n }\n}\nextend(PID, {\n windup: makeSetterGetter('_windup'),\n p: makeSetterGetter('P'),\n i: makeSetterGetter('I'),\n d: makeSetterGetter('D')\n});\n\nconst segmentParameters = {\n M: 2,\n L: 2,\n H: 1,\n V: 1,\n C: 6,\n S: 4,\n Q: 4,\n T: 2,\n A: 7,\n Z: 0\n};\nconst pathHandlers = {\n M: function (c, p, p0) {\n p.x = p0.x = c[0];\n p.y = p0.y = c[1];\n return ['M', p.x, p.y];\n },\n L: function (c, p) {\n p.x = c[0];\n p.y = c[1];\n return ['L', c[0], c[1]];\n },\n H: function (c, p) {\n p.x = c[0];\n return ['H', c[0]];\n },\n V: function (c, p) {\n p.y = c[0];\n return ['V', c[0]];\n },\n C: function (c, p) {\n p.x = c[4];\n p.y = c[5];\n return ['C', c[0], c[1], c[2], c[3], c[4], c[5]];\n },\n S: function (c, p) {\n p.x = c[2];\n p.y = c[3];\n return ['S', c[0], c[1], c[2], c[3]];\n },\n Q: function (c, p) {\n p.x = c[2];\n p.y = c[3];\n return ['Q', c[0], c[1], c[2], c[3]];\n },\n T: function (c, p) {\n p.x = c[0];\n p.y = c[1];\n return ['T', c[0], c[1]];\n },\n Z: function (c, p, p0) {\n p.x = p0.x;\n p.y = p0.y;\n return ['Z'];\n },\n A: function (c, p) {\n p.x = c[5];\n p.y = c[6];\n return ['A', c[0], c[1], c[2], c[3], c[4], c[5], c[6]];\n }\n};\nconst mlhvqtcsaz = 'mlhvqtcsaz'.split('');\nfor (let i = 0, il = mlhvqtcsaz.length; i < il; ++i) {\n pathHandlers[mlhvqtcsaz[i]] = function (i) {\n return function (c, p, p0) {\n if (i === 'H') c[0] = c[0] + p.x;else if (i === 'V') c[0] = c[0] + p.y;else if (i === 'A') {\n c[5] = c[5] + p.x;\n c[6] = c[6] + p.y;\n } else {\n for (let j = 0, jl = c.length; j < jl; ++j) {\n c[j] = c[j] + (j % 2 ? p.y : p.x);\n }\n }\n return pathHandlers[i](c, p, p0);\n };\n }(mlhvqtcsaz[i].toUpperCase());\n}\nfunction makeAbsolut(parser) {\n const command = parser.segment[0];\n return pathHandlers[command](parser.segment.slice(1), parser.p, parser.p0);\n}\nfunction segmentComplete(parser) {\n return parser.segment.length && parser.segment.length - 1 === segmentParameters[parser.segment[0].toUpperCase()];\n}\nfunction startNewSegment(parser, token) {\n parser.inNumber && finalizeNumber(parser, false);\n const pathLetter = isPathLetter.test(token);\n if (pathLetter) {\n parser.segment = [token];\n } else {\n const lastCommand = parser.lastCommand;\n const small = lastCommand.toLowerCase();\n const isSmall = lastCommand === small;\n parser.segment = [small === 'm' ? isSmall ? 'l' : 'L' : lastCommand];\n }\n parser.inSegment = true;\n parser.lastCommand = parser.segment[0];\n return pathLetter;\n}\nfunction finalizeNumber(parser, inNumber) {\n if (!parser.inNumber) throw new Error('Parser Error');\n parser.number && parser.segment.push(parseFloat(parser.number));\n parser.inNumber = inNumber;\n parser.number = '';\n parser.pointSeen = false;\n parser.hasExponent = false;\n if (segmentComplete(parser)) {\n finalizeSegment(parser);\n }\n}\nfunction finalizeSegment(parser) {\n parser.inSegment = false;\n if (parser.absolute) {\n parser.segment = makeAbsolut(parser);\n }\n parser.segments.push(parser.segment);\n}\nfunction isArcFlag(parser) {\n if (!parser.segment.length) return false;\n const isArc = parser.segment[0].toUpperCase() === 'A';\n const length = parser.segment.length;\n return isArc && (length === 4 || length === 5);\n}\nfunction isExponential(parser) {\n return parser.lastToken.toUpperCase() === 'E';\n}\nconst pathDelimiters = new Set([' ', ',', '\\t', '\\n', '\\r', '\\f']);\nfunction pathParser(d, toAbsolute = true) {\n let index = 0;\n let token = '';\n const parser = {\n segment: [],\n inNumber: false,\n number: '',\n lastToken: '',\n inSegment: false,\n segments: [],\n pointSeen: false,\n hasExponent: false,\n absolute: toAbsolute,\n p0: new Point(),\n p: new Point()\n };\n while (parser.lastToken = token, token = d.charAt(index++)) {\n if (!parser.inSegment) {\n if (startNewSegment(parser, token)) {\n continue;\n }\n }\n if (token === '.') {\n if (parser.pointSeen || parser.hasExponent) {\n finalizeNumber(parser, false);\n --index;\n continue;\n }\n parser.inNumber = true;\n parser.pointSeen = true;\n parser.number += token;\n continue;\n }\n if (!isNaN(parseInt(token))) {\n if (parser.number === '0' || isArcFlag(parser)) {\n parser.inNumber = true;\n parser.number = token;\n finalizeNumber(parser, true);\n continue;\n }\n parser.inNumber = true;\n parser.number += token;\n continue;\n }\n if (pathDelimiters.has(token)) {\n if (parser.inNumber) {\n finalizeNumber(parser, false);\n }\n continue;\n }\n if (token === '-' || token === '+') {\n if (parser.inNumber && !isExponential(parser)) {\n finalizeNumber(parser, false);\n --index;\n continue;\n }\n parser.number += token;\n parser.inNumber = true;\n continue;\n }\n if (token.toUpperCase() === 'E') {\n parser.number += token;\n parser.hasExponent = true;\n continue;\n }\n if (isPathLetter.test(token)) {\n if (parser.inNumber) {\n finalizeNumber(parser, false);\n } else if (!segmentComplete(parser)) {\n throw new Error('parser Error');\n } else {\n finalizeSegment(parser);\n }\n --index;\n }\n }\n if (parser.inNumber) {\n finalizeNumber(parser, false);\n }\n if (parser.inSegment && segmentComplete(parser)) {\n finalizeSegment(parser);\n }\n return parser.segments;\n}\n\nfunction arrayToString(a) {\n let s = '';\n for (let i = 0, il = a.length; i < il; i++) {\n s += a[i][0];\n if (a[i][1] != null) {\n s += a[i][1];\n if (a[i][2] != null) {\n s += ' ';\n s += a[i][2];\n if (a[i][3] != null) {\n s += ' ';\n s += a[i][3];\n s += ' ';\n s += a[i][4];\n if (a[i][5] != null) {\n s += ' ';\n s += a[i][5];\n s += ' ';\n s += a[i][6];\n if (a[i][7] != null) {\n s += ' ';\n s += a[i][7];\n }\n }\n }\n }\n }\n }\n return s + ' ';\n}\nclass PathArray extends SVGArray {\n // Get bounding box of path\n bbox() {\n parser().path.setAttribute('d', this.toString());\n return new Box(parser.nodes.path.getBBox());\n }\n\n // Move path string\n move(x, y) {\n // get bounding box of current situation\n const box = this.bbox();\n\n // get relative offset\n x -= box.x;\n y -= box.y;\n if (!isNaN(x) && !isNaN(y)) {\n // move every point\n for (let l, i = this.length - 1; i >= 0; i--) {\n l = this[i][0];\n if (l === 'M' || l === 'L' || l === 'T') {\n this[i][1] += x;\n this[i][2] += y;\n } else if (l === 'H') {\n this[i][1] += x;\n } else if (l === 'V') {\n this[i][1] += y;\n } else if (l === 'C' || l === 'S' || l === 'Q') {\n this[i][1] += x;\n this[i][2] += y;\n this[i][3] += x;\n this[i][4] += y;\n if (l === 'C') {\n this[i][5] += x;\n this[i][6] += y;\n }\n } else if (l === 'A') {\n this[i][6] += x;\n this[i][7] += y;\n }\n }\n }\n return this;\n }\n\n // Absolutize and parse path to array\n parse(d = 'M0 0') {\n if (Array.isArray(d)) {\n d = Array.prototype.concat.apply([], d).toString();\n }\n return pathParser(d);\n }\n\n // Resize path string\n size(width, height) {\n // get bounding box of current situation\n const box = this.bbox();\n let i, l;\n\n // If the box width or height is 0 then we ignore\n // transformations on the respective axis\n box.width = box.width === 0 ? 1 : box.width;\n box.height = box.height === 0 ? 1 : box.height;\n\n // recalculate position of all points according to new size\n for (i = this.length - 1; i >= 0; i--) {\n l = this[i][0];\n if (l === 'M' || l === 'L' || l === 'T') {\n this[i][1] = (this[i][1] - box.x) * width / box.width + box.x;\n this[i][2] = (this[i][2] - box.y) * height / box.height + box.y;\n } else if (l === 'H') {\n this[i][1] = (this[i][1] - box.x) * width / box.width + box.x;\n } else if (l === 'V') {\n this[i][1] = (this[i][1] - box.y) * height / box.height + box.y;\n } else if (l === 'C' || l === 'S' || l === 'Q') {\n this[i][1] = (this[i][1] - box.x) * width / box.width + box.x;\n this[i][2] = (this[i][2] - box.y) * height / box.height + box.y;\n this[i][3] = (this[i][3] - box.x) * width / box.width + box.x;\n this[i][4] = (this[i][4] - box.y) * height / box.height + box.y;\n if (l === 'C') {\n this[i][5] = (this[i][5] - box.x) * width / box.width + box.x;\n this[i][6] = (this[i][6] - box.y) * height / box.height + box.y;\n }\n } else if (l === 'A') {\n // resize radii\n this[i][1] = this[i][1] * width / box.width;\n this[i][2] = this[i][2] * height / box.height;\n\n // move position values\n this[i][6] = (this[i][6] - box.x) * width / box.width + box.x;\n this[i][7] = (this[i][7] - box.y) * height / box.height + box.y;\n }\n }\n return this;\n }\n\n // Convert array to string\n toString() {\n return arrayToString(this);\n }\n}\n\nconst getClassForType = value => {\n const type = typeof value;\n if (type === 'number') {\n return SVGNumber;\n } else if (type === 'string') {\n if (Color.isColor(value)) {\n return Color;\n } else if (delimiter.test(value)) {\n return isPathLetter.test(value) ? PathArray : SVGArray;\n } else if (numberAndUnit.test(value)) {\n return SVGNumber;\n } else {\n return NonMorphable;\n }\n } else if (morphableTypes.indexOf(value.constructor) > -1) {\n return value.constructor;\n } else if (Array.isArray(value)) {\n return SVGArray;\n } else if (type === 'object') {\n return ObjectBag;\n } else {\n return NonMorphable;\n }\n};\nclass Morphable {\n constructor(stepper) {\n this._stepper = stepper || new Ease('-');\n this._from = null;\n this._to = null;\n this._type = null;\n this._context = null;\n this._morphObj = null;\n }\n at(pos) {\n return this._morphObj.morph(this._from, this._to, pos, this._stepper, this._context);\n }\n done() {\n const complete = this._context.map(this._stepper.done).reduce(function (last, curr) {\n return last && curr;\n }, true);\n return complete;\n }\n from(val) {\n if (val == null) {\n return this._from;\n }\n this._from = this._set(val);\n return this;\n }\n stepper(stepper) {\n if (stepper == null) return this._stepper;\n this._stepper = stepper;\n return this;\n }\n to(val) {\n if (val == null) {\n return this._to;\n }\n this._to = this._set(val);\n return this;\n }\n type(type) {\n // getter\n if (type == null) {\n return this._type;\n }\n\n // setter\n this._type = type;\n return this;\n }\n _set(value) {\n if (!this._type) {\n this.type(getClassForType(value));\n }\n let result = new this._type(value);\n if (this._type === Color) {\n result = this._to ? result[this._to[4]]() : this._from ? result[this._from[4]]() : result;\n }\n if (this._type === ObjectBag) {\n result = this._to ? result.align(this._to) : this._from ? result.align(this._from) : result;\n }\n result = result.toConsumable();\n this._morphObj = this._morphObj || new this._type();\n this._context = this._context || Array.apply(null, Array(result.length)).map(Object).map(function (o) {\n o.done = true;\n return o;\n });\n return result;\n }\n}\nclass NonMorphable {\n constructor(...args) {\n this.init(...args);\n }\n init(val) {\n val = Array.isArray(val) ? val[0] : val;\n this.value = val;\n return this;\n }\n toArray() {\n return [this.value];\n }\n valueOf() {\n return this.value;\n }\n}\nclass TransformBag {\n constructor(...args) {\n this.init(...args);\n }\n init(obj) {\n if (Array.isArray(obj)) {\n obj = {\n scaleX: obj[0],\n scaleY: obj[1],\n shear: obj[2],\n rotate: obj[3],\n translateX: obj[4],\n translateY: obj[5],\n originX: obj[6],\n originY: obj[7]\n };\n }\n Object.assign(this, TransformBag.defaults, obj);\n return this;\n }\n toArray() {\n const v = this;\n return [v.scaleX, v.scaleY, v.shear, v.rotate, v.translateX, v.translateY, v.originX, v.originY];\n }\n}\nTransformBag.defaults = {\n scaleX: 1,\n scaleY: 1,\n shear: 0,\n rotate: 0,\n translateX: 0,\n translateY: 0,\n originX: 0,\n originY: 0\n};\nconst sortByKey = (a, b) => {\n return a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0;\n};\nclass ObjectBag {\n constructor(...args) {\n this.init(...args);\n }\n align(other) {\n const values = this.values;\n for (let i = 0, il = values.length; i < il; ++i) {\n // If the type is the same we only need to check if the color is in the correct format\n if (values[i + 1] === other[i + 1]) {\n if (values[i + 1] === Color && other[i + 7] !== values[i + 7]) {\n const space = other[i + 7];\n const color = new Color(this.values.splice(i + 3, 5))[space]().toArray();\n this.values.splice(i + 3, 0, ...color);\n }\n i += values[i + 2] + 2;\n continue;\n }\n if (!other[i + 1]) {\n return this;\n }\n\n // The types differ, so we overwrite the new type with the old one\n // And initialize it with the types default (e.g. black for color or 0 for number)\n const defaultObject = new other[i + 1]().toArray();\n\n // Than we fix the values array\n const toDelete = values[i + 2] + 3;\n values.splice(i, toDelete, other[i], other[i + 1], other[i + 2], ...defaultObject);\n i += values[i + 2] + 2;\n }\n return this;\n }\n init(objOrArr) {\n this.values = [];\n if (Array.isArray(objOrArr)) {\n this.values = objOrArr.slice();\n return;\n }\n objOrArr = objOrArr || {};\n const entries = [];\n for (const i in objOrArr) {\n const Type = getClassForType(objOrArr[i]);\n const val = new Type(objOrArr[i]).toArray();\n entries.push([i, Type, val.length, ...val]);\n }\n entries.sort(sortByKey);\n this.values = entries.reduce((last, curr) => last.concat(curr), []);\n return this;\n }\n toArray() {\n return this.values;\n }\n valueOf() {\n const obj = {};\n const arr = this.values;\n\n // for (var i = 0, len = arr.length; i < len; i += 2) {\n while (arr.length) {\n const key = arr.shift();\n const Type = arr.shift();\n const num = arr.shift();\n const values = arr.splice(0, num);\n obj[key] = new Type(values); // .valueOf()\n }\n return obj;\n }\n}\nconst morphableTypes = [NonMorphable, TransformBag, ObjectBag];\nfunction registerMorphableType(type = []) {\n morphableTypes.push(...[].concat(type));\n}\nfunction makeMorphable() {\n extend(morphableTypes, {\n to(val) {\n return new Morphable().type(this.constructor).from(this.toArray()) // this.valueOf())\n .to(val);\n },\n fromArray(arr) {\n this.init(arr);\n return this;\n },\n toConsumable() {\n return this.toArray();\n },\n morph(from, to, pos, stepper, context) {\n const mapper = function (i, index) {\n return stepper.step(i, to[index], pos, context[index], context);\n };\n return this.fromArray(from.map(mapper));\n }\n });\n}\n\nclass Path extends Shape {\n // Initialize node\n constructor(node, attrs = node) {\n super(nodeOrNew('path', node), attrs);\n }\n\n // Get array\n array() {\n return this._array || (this._array = new PathArray(this.attr('d')));\n }\n\n // Clear array cache\n clear() {\n delete this._array;\n return this;\n }\n\n // Set height of element\n height(height) {\n return height == null ? this.bbox().height : this.size(this.bbox().width, height);\n }\n\n // Move by left top corner\n move(x, y) {\n return this.attr('d', this.array().move(x, y));\n }\n\n // Plot new path\n plot(d) {\n return d == null ? this.array() : this.clear().attr('d', typeof d === 'string' ? d : this._array = new PathArray(d));\n }\n\n // Set element size to given width and height\n size(width, height) {\n const p = proportionalSize(this, width, height);\n return this.attr('d', this.array().size(p.width, p.height));\n }\n\n // Set width of element\n width(width) {\n return width == null ? this.bbox().width : this.size(width, this.bbox().height);\n }\n\n // Move by left top corner over x-axis\n x(x) {\n return x == null ? this.bbox().x : this.move(x, this.bbox().y);\n }\n\n // Move by left top corner over y-axis\n y(y) {\n return y == null ? this.bbox().y : this.move(this.bbox().x, y);\n }\n}\n\n// Define morphable array\nPath.prototype.MorphArray = PathArray;\n\n// Add parent method\nregisterMethods({\n Container: {\n // Create a wrapped path element\n path: wrapWithAttrCheck(function (d) {\n // make sure plot is called as a setter\n return this.put(new Path()).plot(d || new PathArray());\n })\n }\n});\nregister(Path, 'Path');\n\n// Get array\nfunction array() {\n return this._array || (this._array = new PointArray(this.attr('points')));\n}\n\n// Clear array cache\nfunction clear() {\n delete this._array;\n return this;\n}\n\n// Move by left top corner\nfunction move$2(x, y) {\n return this.attr('points', this.array().move(x, y));\n}\n\n// Plot new path\nfunction plot(p) {\n return p == null ? this.array() : this.clear().attr('points', typeof p === 'string' ? p : this._array = new PointArray(p));\n}\n\n// Set element size to given width and height\nfunction size$1(width, height) {\n const p = proportionalSize(this, width, height);\n return this.attr('points', this.array().size(p.width, p.height));\n}\n\nvar poly = {\n __proto__: null,\n array: array,\n clear: clear,\n move: move$2,\n plot: plot,\n size: size$1\n};\n\nclass Polygon extends Shape {\n // Initialize node\n constructor(node, attrs = node) {\n super(nodeOrNew('polygon', node), attrs);\n }\n}\nregisterMethods({\n Container: {\n // Create a wrapped polygon element\n polygon: wrapWithAttrCheck(function (p) {\n // make sure plot is called as a setter\n return this.put(new Polygon()).plot(p || new PointArray());\n })\n }\n});\nextend(Polygon, pointed);\nextend(Polygon, poly);\nregister(Polygon, 'Polygon');\n\nclass Polyline extends Shape {\n // Initialize node\n constructor(node, attrs = node) {\n super(nodeOrNew('polyline', node), attrs);\n }\n}\nregisterMethods({\n Container: {\n // Create a wrapped polygon element\n polyline: wrapWithAttrCheck(function (p) {\n // make sure plot is called as a setter\n return this.put(new Polyline()).plot(p || new PointArray());\n })\n }\n});\nextend(Polyline, pointed);\nextend(Polyline, poly);\nregister(Polyline, 'Polyline');\n\nclass Rect extends Shape {\n // Initialize node\n constructor(node, attrs = node) {\n super(nodeOrNew('rect', node), attrs);\n }\n}\nextend(Rect, {\n rx,\n ry\n});\nregisterMethods({\n Container: {\n // Create a rect element\n rect: wrapWithAttrCheck(function (width, height) {\n return this.put(new Rect()).size(width, height);\n })\n }\n});\nregister(Rect, 'Rect');\n\nclass Queue {\n constructor() {\n this._first = null;\n this._last = null;\n }\n\n // Shows us the first item in the list\n first() {\n return this._first && this._first.value;\n }\n\n // Shows us the last item in the list\n last() {\n return this._last && this._last.value;\n }\n push(value) {\n // An item stores an id and the provided value\n const item = typeof value.next !== 'undefined' ? value : {\n value: value,\n next: null,\n prev: null\n };\n\n // Deal with the queue being empty or populated\n if (this._last) {\n item.prev = this._last;\n this._last.next = item;\n this._last = item;\n } else {\n this._last = item;\n this._first = item;\n }\n\n // Return the current item\n return item;\n }\n\n // Removes the item that was returned from the push\n remove(item) {\n // Relink the previous item\n if (item.prev) item.prev.next = item.next;\n if (item.next) item.next.prev = item.prev;\n if (item === this._last) this._last = item.prev;\n if (item === this._first) this._first = item.next;\n\n // Invalidate item\n item.prev = null;\n item.next = null;\n }\n shift() {\n // Check if we have a value\n const remove = this._first;\n if (!remove) return null;\n\n // If we do, remove it and relink things\n this._first = remove.next;\n if (this._first) this._first.prev = null;\n this._last = this._first ? this._last : null;\n return remove.value;\n }\n}\n\nconst Animator = {\n nextDraw: null,\n frames: new Queue(),\n timeouts: new Queue(),\n immediates: new Queue(),\n timer: () => globals.window.performance || globals.window.Date,\n transforms: [],\n frame(fn) {\n // Store the node\n const node = Animator.frames.push({\n run: fn\n });\n\n // Request an animation frame if we don't have one\n if (Animator.nextDraw === null) {\n Animator.nextDraw = globals.window.requestAnimationFrame(Animator._draw);\n }\n\n // Return the node so we can remove it easily\n return node;\n },\n timeout(fn, delay) {\n delay = delay || 0;\n\n // Work out when the event should fire\n const time = Animator.timer().now() + delay;\n\n // Add the timeout to the end of the queue\n const node = Animator.timeouts.push({\n run: fn,\n time: time\n });\n\n // Request another animation frame if we need one\n if (Animator.nextDraw === null) {\n Animator.nextDraw = globals.window.requestAnimationFrame(Animator._draw);\n }\n return node;\n },\n immediate(fn) {\n // Add the immediate fn to the end of the queue\n const node = Animator.immediates.push(fn);\n // Request another animation frame if we need one\n if (Animator.nextDraw === null) {\n Animator.nextDraw = globals.window.requestAnimationFrame(Animator._draw);\n }\n return node;\n },\n cancelFrame(node) {\n node != null && Animator.frames.remove(node);\n },\n clearTimeout(node) {\n node != null && Animator.timeouts.remove(node);\n },\n cancelImmediate(node) {\n node != null && Animator.immediates.remove(node);\n },\n _draw(now) {\n // Run all the timeouts we can run, if they are not ready yet, add them\n // to the end of the queue immediately! (bad timeouts!!! [sarcasm])\n let nextTimeout = null;\n const lastTimeout = Animator.timeouts.last();\n while (nextTimeout = Animator.timeouts.shift()) {\n // Run the timeout if its time, or push it to the end\n if (now >= nextTimeout.time) {\n nextTimeout.run();\n } else {\n Animator.timeouts.push(nextTimeout);\n }\n\n // If we hit the last item, we should stop shifting out more items\n if (nextTimeout === lastTimeout) break;\n }\n\n // Run all of the animation frames\n let nextFrame = null;\n const lastFrame = Animator.frames.last();\n while (nextFrame !== lastFrame && (nextFrame = Animator.frames.shift())) {\n nextFrame.run(now);\n }\n let nextImmediate = null;\n while (nextImmediate = Animator.immediates.shift()) {\n nextImmediate();\n }\n\n // If we have remaining timeouts or frames, draw until we don't anymore\n Animator.nextDraw = Animator.timeouts.first() || Animator.frames.first() ? globals.window.requestAnimationFrame(Animator._draw) : null;\n }\n};\n\nconst makeSchedule = function (runnerInfo) {\n const start = runnerInfo.start;\n const duration = runnerInfo.runner.duration();\n const end = start + duration;\n return {\n start: start,\n duration: duration,\n end: end,\n runner: runnerInfo.runner\n };\n};\nconst defaultSource = function () {\n const w = globals.window;\n return (w.performance || w.Date).now();\n};\nclass Timeline extends EventTarget {\n // Construct a new timeline on the given element\n constructor(timeSource = defaultSource) {\n super();\n this._timeSource = timeSource;\n\n // terminate resets all variables to their initial state\n this.terminate();\n }\n active() {\n return !!this._nextFrame;\n }\n finish() {\n // Go to end and pause\n this.time(this.getEndTimeOfTimeline() + 1);\n return this.pause();\n }\n\n // Calculates the end of the timeline\n getEndTime() {\n const lastRunnerInfo = this.getLastRunnerInfo();\n const lastDuration = lastRunnerInfo ? lastRunnerInfo.runner.duration() : 0;\n const lastStartTime = lastRunnerInfo ? lastRunnerInfo.start : this._time;\n return lastStartTime + lastDuration;\n }\n getEndTimeOfTimeline() {\n const endTimes = this._runners.map(i => i.start + i.runner.duration());\n return Math.max(0, ...endTimes);\n }\n getLastRunnerInfo() {\n return this.getRunnerInfoById(this._lastRunnerId);\n }\n getRunnerInfoById(id) {\n return this._runners[this._runnerIds.indexOf(id)] || null;\n }\n pause() {\n this._paused = true;\n return this._continue();\n }\n persist(dtOrForever) {\n if (dtOrForever == null) return this._persist;\n this._persist = dtOrForever;\n return this;\n }\n play() {\n // Now make sure we are not paused and continue the animation\n this._paused = false;\n return this.updateTime()._continue();\n }\n reverse(yes) {\n const currentSpeed = this.speed();\n if (yes == null) return this.speed(-currentSpeed);\n const positive = Math.abs(currentSpeed);\n return this.speed(yes ? -positive : positive);\n }\n\n // schedules a runner on the timeline\n schedule(runner, delay, when) {\n if (runner == null) {\n return this._runners.map(makeSchedule);\n }\n\n // The start time for the next animation can either be given explicitly,\n // derived from the current timeline time or it can be relative to the\n // last start time to chain animations directly\n\n let absoluteStartTime = 0;\n const endTime = this.getEndTime();\n delay = delay || 0;\n\n // Work out when to start the animation\n if (when == null || when === 'last' || when === 'after') {\n // Take the last time and increment\n absoluteStartTime = endTime;\n } else if (when === 'absolute' || when === 'start') {\n absoluteStartTime = delay;\n delay = 0;\n } else if (when === 'now') {\n absoluteStartTime = this._time;\n } else if (when === 'relative') {\n const runnerInfo = this.getRunnerInfoById(runner.id);\n if (runnerInfo) {\n absoluteStartTime = runnerInfo.start + delay;\n delay = 0;\n }\n } else if (when === 'with-last') {\n const lastRunnerInfo = this.getLastRunnerInfo();\n const lastStartTime = lastRunnerInfo ? lastRunnerInfo.start : this._time;\n absoluteStartTime = lastStartTime;\n } else {\n throw new Error('Invalid value for the \"when\" parameter');\n }\n\n // Manage runner\n runner.unschedule();\n runner.timeline(this);\n const persist = runner.persist();\n const runnerInfo = {\n persist: persist === null ? this._persist : persist,\n start: absoluteStartTime + delay,\n runner\n };\n this._lastRunnerId = runner.id;\n this._runners.push(runnerInfo);\n this._runners.sort((a, b) => a.start - b.start);\n this._runnerIds = this._runners.map(info => info.runner.id);\n this.updateTime()._continue();\n return this;\n }\n seek(dt) {\n return this.time(this._time + dt);\n }\n source(fn) {\n if (fn == null) return this._timeSource;\n this._timeSource = fn;\n return this;\n }\n speed(speed) {\n if (speed == null) return this._speed;\n this._speed = speed;\n return this;\n }\n stop() {\n // Go to start and pause\n this.time(0);\n return this.pause();\n }\n time(time) {\n if (time == null) return this._time;\n this._time = time;\n return this._continue(true);\n }\n\n // Remove the runner from this timeline\n unschedule(runner) {\n const index = this._runnerIds.indexOf(runner.id);\n if (index < 0) return this;\n this._runners.splice(index, 1);\n this._runnerIds.splice(index, 1);\n runner.timeline(null);\n return this;\n }\n\n // Makes sure, that after pausing the time doesn't jump\n updateTime() {\n if (!this.active()) {\n this._lastSourceTime = this._timeSource();\n }\n return this;\n }\n\n // Checks if we are running and continues the animation\n _continue(immediateStep = false) {\n Animator.cancelFrame(this._nextFrame);\n this._nextFrame = null;\n if (immediateStep) return this._stepImmediate();\n if (this._paused) return this;\n this._nextFrame = Animator.frame(this._step);\n return this;\n }\n _stepFn(immediateStep = false) {\n // Get the time delta from the last time and update the time\n const time = this._timeSource();\n let dtSource = time - this._lastSourceTime;\n if (immediateStep) dtSource = 0;\n const dtTime = this._speed * dtSource + (this._time - this._lastStepTime);\n this._lastSourceTime = time;\n\n // Only update the time if we use the timeSource.\n // Otherwise use the current time\n if (!immediateStep) {\n // Update the time\n this._time += dtTime;\n this._time = this._time < 0 ? 0 : this._time;\n }\n this._lastStepTime = this._time;\n this.fire('time', this._time);\n\n // This is for the case that the timeline was seeked so that the time\n // is now before the startTime of the runner. That is why we need to set\n // the runner to position 0\n\n // FIXME:\n // However, resetting in insertion order leads to bugs. Considering the case,\n // where 2 runners change the same attribute but in different times,\n // resetting both of them will lead to the case where the later defined\n // runner always wins the reset even if the other runner started earlier\n // and therefore should win the attribute battle\n // this can be solved by resetting them backwards\n for (let k = this._runners.length; k--;) {\n // Get and run the current runner and ignore it if its inactive\n const runnerInfo = this._runners[k];\n const runner = runnerInfo.runner;\n\n // Make sure that we give the actual difference\n // between runner start time and now\n const dtToStart = this._time - runnerInfo.start;\n\n // Dont run runner if not started yet\n // and try to reset it\n if (dtToStart <= 0) {\n runner.reset();\n }\n }\n\n // Run all of the runners directly\n let runnersLeft = false;\n for (let i = 0, len = this._runners.length; i < len; i++) {\n // Get and run the current runner and ignore it if its inactive\n const runnerInfo = this._runners[i];\n const runner = runnerInfo.runner;\n let dt = dtTime;\n\n // Make sure that we give the actual difference\n // between runner start time and now\n const dtToStart = this._time - runnerInfo.start;\n\n // Dont run runner if not started yet\n if (dtToStart <= 0) {\n runnersLeft = true;\n continue;\n } else if (dtToStart < dt) {\n // Adjust dt to make sure that animation is on point\n dt = dtToStart;\n }\n if (!runner.active()) continue;\n\n // If this runner is still going, signal that we need another animation\n // frame, otherwise, remove the completed runner\n const finished = runner.step(dt).done;\n if (!finished) {\n runnersLeft = true;\n // continue\n } else if (runnerInfo.persist !== true) {\n // runner is finished. And runner might get removed\n const endTime = runner.duration() - runner.time() + this._time;\n if (endTime + runnerInfo.persist < this._time) {\n // Delete runner and correct index\n runner.unschedule();\n --i;\n --len;\n }\n }\n }\n\n // Basically: we continue when there are runners right from us in time\n // when -->, and when runners are left from us when <--\n if (runnersLeft && !(this._speed < 0 && this._time === 0) || this._runnerIds.length && this._speed < 0 && this._time > 0) {\n this._continue();\n } else {\n this.pause();\n this.fire('finished');\n }\n return this;\n }\n terminate() {\n // cleanup memory\n\n // Store the timing variables\n this._startTime = 0;\n this._speed = 1.0;\n\n // Determines how long a runner is hold in memory. Can be a dt or true/false\n this._persist = 0;\n\n // Keep track of the running animations and their starting parameters\n this._nextFrame = null;\n this._paused = true;\n this._runners = [];\n this._runnerIds = [];\n this._lastRunnerId = -1;\n this._time = 0;\n this._lastSourceTime = 0;\n this._lastStepTime = 0;\n\n // Make sure that step is always called in class context\n this._step = this._stepFn.bind(this, false);\n this._stepImmediate = this._stepFn.bind(this, true);\n }\n}\nregisterMethods({\n Element: {\n timeline: function (timeline) {\n if (timeline == null) {\n this._timeline = this._timeline || new Timeline();\n return this._timeline;\n } else {\n this._timeline = timeline;\n return this;\n }\n }\n }\n});\n\nclass Runner extends EventTarget {\n constructor(options) {\n super();\n\n // Store a unique id on the runner, so that we can identify it later\n this.id = Runner.id++;\n\n // Ensure a default value\n options = options == null ? timeline.duration : options;\n\n // Ensure that we get a controller\n options = typeof options === 'function' ? new Controller(options) : options;\n\n // Declare all of the variables\n this._element = null;\n this._timeline = null;\n this.done = false;\n this._queue = [];\n\n // Work out the stepper and the duration\n this._duration = typeof options === 'number' && options;\n this._isDeclarative = options instanceof Controller;\n this._stepper = this._isDeclarative ? options : new Ease();\n\n // We copy the current values from the timeline because they can change\n this._history = {};\n\n // Store the state of the runner\n this.enabled = true;\n this._time = 0;\n this._lastTime = 0;\n\n // At creation, the runner is in reset state\n this._reseted = true;\n\n // Save transforms applied to this runner\n this.transforms = new Matrix();\n this.transformId = 1;\n\n // Looping variables\n this._haveReversed = false;\n this._reverse = false;\n this._loopsDone = 0;\n this._swing = false;\n this._wait = 0;\n this._times = 1;\n this._frameId = null;\n\n // Stores how long a runner is stored after being done\n this._persist = this._isDeclarative ? true : null;\n }\n static sanitise(duration, delay, when) {\n // Initialise the default parameters\n let times = 1;\n let swing = false;\n let wait = 0;\n duration = duration ?? timeline.duration;\n delay = delay ?? timeline.delay;\n when = when || 'last';\n\n // If we have an object, unpack the values\n if (typeof duration === 'object' && !(duration instanceof Stepper)) {\n delay = duration.delay ?? delay;\n when = duration.when ?? when;\n swing = duration.swing || swing;\n times = duration.times ?? times;\n wait = duration.wait ?? wait;\n duration = duration.duration ?? timeline.duration;\n }\n return {\n duration: duration,\n delay: delay,\n swing: swing,\n times: times,\n wait: wait,\n when: when\n };\n }\n active(enabled) {\n if (enabled == null) return this.enabled;\n this.enabled = enabled;\n return this;\n }\n\n /*\n Private Methods\n ===============\n Methods that shouldn't be used externally\n */\n addTransform(transform) {\n this.transforms.lmultiplyO(transform);\n return this;\n }\n after(fn) {\n return this.on('finished', fn);\n }\n animate(duration, delay, when) {\n const o = Runner.sanitise(duration, delay, when);\n const runner = new Runner(o.duration);\n if (this._timeline) runner.timeline(this._timeline);\n if (this._element) runner.element(this._element);\n return runner.loop(o).schedule(o.delay, o.when);\n }\n clearTransform() {\n this.transforms = new Matrix();\n return this;\n }\n\n // TODO: Keep track of all transformations so that deletion is faster\n clearTransformsFromQueue() {\n if (!this.done || !this._timeline || !this._timeline._runnerIds.includes(this.id)) {\n this._queue = this._queue.filter(item => {\n return !item.isTransform;\n });\n }\n }\n delay(delay) {\n return this.animate(0, delay);\n }\n duration() {\n return this._times * (this._wait + this._duration) - this._wait;\n }\n during(fn) {\n return this.queue(null, fn);\n }\n ease(fn) {\n this._stepper = new Ease(fn);\n return this;\n }\n /*\n Runner Definitions\n ==================\n These methods help us define the runtime behaviour of the Runner or they\n help us make new runners from the current runner\n */\n\n element(element) {\n if (element == null) return this._element;\n this._element = element;\n element._prepareRunner();\n return this;\n }\n finish() {\n return this.step(Infinity);\n }\n loop(times, swing, wait) {\n // Deal with the user passing in an object\n if (typeof times === 'object') {\n swing = times.swing;\n wait = times.wait;\n times = times.times;\n }\n\n // Sanitise the values and store them\n this._times = times || Infinity;\n this._swing = swing || false;\n this._wait = wait || 0;\n\n // Allow true to be passed\n if (this._times === true) {\n this._times = Infinity;\n }\n return this;\n }\n loops(p) {\n const loopDuration = this._duration + this._wait;\n if (p == null) {\n const loopsDone = Math.floor(this._time / loopDuration);\n const relativeTime = this._time - loopsDone * loopDuration;\n const position = relativeTime / this._duration;\n return Math.min(loopsDone + position, this._times);\n }\n const whole = Math.floor(p);\n const partial = p % 1;\n const time = loopDuration * whole + this._duration * partial;\n return this.time(time);\n }\n persist(dtOrForever) {\n if (dtOrForever == null) return this._persist;\n this._persist = dtOrForever;\n return this;\n }\n position(p) {\n // Get all of the variables we need\n const x = this._time;\n const d = this._duration;\n const w = this._wait;\n const t = this._times;\n const s = this._swing;\n const r = this._reverse;\n let position;\n if (p == null) {\n /*\n This function converts a time to a position in the range [0, 1]\n The full explanation can be found in this desmos demonstration\n https://www.desmos.com/calculator/u4fbavgche\n The logic is slightly simplified here because we can use booleans\n */\n\n // Figure out the value without thinking about the start or end time\n const f = function (x) {\n const swinging = s * Math.floor(x % (2 * (w + d)) / (w + d));\n const backwards = swinging && !r || !swinging && r;\n const uncliped = Math.pow(-1, backwards) * (x % (w + d)) / d + backwards;\n const clipped = Math.max(Math.min(uncliped, 1), 0);\n return clipped;\n };\n\n // Figure out the value by incorporating the start time\n const endTime = t * (w + d) - w;\n position = x <= 0 ? Math.round(f(1e-5)) : x < endTime ? f(x) : Math.round(f(endTime - 1e-5));\n return position;\n }\n\n // Work out the loops done and add the position to the loops done\n const loopsDone = Math.floor(this.loops());\n const swingForward = s && loopsDone % 2 === 0;\n const forwards = swingForward && !r || r && swingForward;\n position = loopsDone + (forwards ? p : 1 - p);\n return this.loops(position);\n }\n progress(p) {\n if (p == null) {\n return Math.min(1, this._time / this.duration());\n }\n return this.time(p * this.duration());\n }\n\n /*\n Basic Functionality\n ===================\n These methods allow us to attach basic functions to the runner directly\n */\n queue(initFn, runFn, retargetFn, isTransform) {\n this._queue.push({\n initialiser: initFn || noop,\n runner: runFn || noop,\n retarget: retargetFn,\n isTransform: isTransform,\n initialised: false,\n finished: false\n });\n const timeline = this.timeline();\n timeline && this.timeline()._continue();\n return this;\n }\n reset() {\n if (this._reseted) return this;\n this.time(0);\n this._reseted = true;\n return this;\n }\n reverse(reverse) {\n this._reverse = reverse == null ? !this._reverse : reverse;\n return this;\n }\n schedule(timeline, delay, when) {\n // The user doesn't need to pass a timeline if we already have one\n if (!(timeline instanceof Timeline)) {\n when = delay;\n delay = timeline;\n timeline = this.timeline();\n }\n\n // If there is no timeline, yell at the user...\n if (!timeline) {\n throw Error('Runner cannot be scheduled without timeline');\n }\n\n // Schedule the runner on the timeline provided\n timeline.schedule(this, delay, when);\n return this;\n }\n step(dt) {\n // If we are inactive, this stepper just gets skipped\n if (!this.enabled) return this;\n\n // Update the time and get the new position\n dt = dt == null ? 16 : dt;\n this._time += dt;\n const position = this.position();\n\n // Figure out if we need to run the stepper in this frame\n const running = this._lastPosition !== position && this._time >= 0;\n this._lastPosition = position;\n\n // Figure out if we just started\n const duration = this.duration();\n const justStarted = this._lastTime <= 0 && this._time > 0;\n const justFinished = this._lastTime < duration && this._time >= duration;\n this._lastTime = this._time;\n if (justStarted) {\n this.fire('start', this);\n }\n\n // Work out if the runner is finished set the done flag here so animations\n // know, that they are running in the last step (this is good for\n // transformations which can be merged)\n const declarative = this._isDeclarative;\n this.done = !declarative && !justFinished && this._time >= duration;\n\n // Runner is running. So its not in reset state anymore\n this._reseted = false;\n let converged = false;\n // Call initialise and the run function\n if (running || declarative) {\n this._initialise(running);\n\n // clear the transforms on this runner so they dont get added again and again\n this.transforms = new Matrix();\n converged = this._run(declarative ? dt : position);\n this.fire('step', this);\n }\n // correct the done flag here\n // declarative animations itself know when they converged\n this.done = this.done || converged && declarative;\n if (justFinished) {\n this.fire('finished', this);\n }\n return this;\n }\n\n /*\n Runner animation methods\n ========================\n Control how the animation plays\n */\n time(time) {\n if (time == null) {\n return this._time;\n }\n const dt = time - this._time;\n this.step(dt);\n return this;\n }\n timeline(timeline) {\n // check explicitly for undefined so we can set the timeline to null\n if (typeof timeline === 'undefined') return this._timeline;\n this._timeline = timeline;\n return this;\n }\n unschedule() {\n const timeline = this.timeline();\n timeline && timeline.unschedule(this);\n return this;\n }\n\n // Run each initialise function in the runner if required\n _initialise(running) {\n // If we aren't running, we shouldn't initialise when not declarative\n if (!running && !this._isDeclarative) return;\n\n // Loop through all of the initialisers\n for (let i = 0, len = this._queue.length; i < len; ++i) {\n // Get the current initialiser\n const current = this._queue[i];\n\n // Determine whether we need to initialise\n const needsIt = this._isDeclarative || !current.initialised && running;\n running = !current.finished;\n\n // Call the initialiser if we need to\n if (needsIt && running) {\n current.initialiser.call(this);\n current.initialised = true;\n }\n }\n }\n\n // Save a morpher to the morpher list so that we can retarget it later\n _rememberMorpher(method, morpher) {\n this._history[method] = {\n morpher: morpher,\n caller: this._queue[this._queue.length - 1]\n };\n\n // We have to resume the timeline in case a controller\n // is already done without being ever run\n // This can happen when e.g. this is done:\n // anim = el.animate(new SVG.Spring)\n // and later\n // anim.move(...)\n if (this._isDeclarative) {\n const timeline = this.timeline();\n timeline && timeline.play();\n }\n }\n\n // Try to set the target for a morpher if the morpher exists, otherwise\n // Run each run function for the position or dt given\n _run(positionOrDt) {\n // Run all of the _queue directly\n let allfinished = true;\n for (let i = 0, len = this._queue.length; i < len; ++i) {\n // Get the current function to run\n const current = this._queue[i];\n\n // Run the function if its not finished, we keep track of the finished\n // flag for the sake of declarative _queue\n const converged = current.runner.call(this, positionOrDt);\n current.finished = current.finished || converged === true;\n allfinished = allfinished && current.finished;\n }\n\n // We report when all of the constructors are finished\n return allfinished;\n }\n\n // do nothing and return false\n _tryRetarget(method, target, extra) {\n if (this._history[method]) {\n // if the last method wasn't even initialised, throw it away\n if (!this._history[method].caller.initialised) {\n const index = this._queue.indexOf(this._history[method].caller);\n this._queue.splice(index, 1);\n return false;\n }\n\n // for the case of transformations, we use the special retarget function\n // which has access to the outer scope\n if (this._history[method].caller.retarget) {\n this._history[method].caller.retarget.call(this, target, extra);\n // for everything else a simple morpher change is sufficient\n } else {\n this._history[method].morpher.to(target);\n }\n this._history[method].caller.finished = false;\n const timeline = this.timeline();\n timeline && timeline.play();\n return true;\n }\n return false;\n }\n}\nRunner.id = 0;\nclass FakeRunner {\n constructor(transforms = new Matrix(), id = -1, done = true) {\n this.transforms = transforms;\n this.id = id;\n this.done = done;\n }\n clearTransformsFromQueue() {}\n}\nextend([Runner, FakeRunner], {\n mergeWith(runner) {\n return new FakeRunner(runner.transforms.lmultiply(this.transforms), runner.id);\n }\n});\n\n// FakeRunner.emptyRunner = new FakeRunner()\n\nconst lmultiply = (last, curr) => last.lmultiplyO(curr);\nconst getRunnerTransform = runner => runner.transforms;\nfunction mergeTransforms() {\n // Find the matrix to apply to the element and apply it\n const runners = this._transformationRunners.runners;\n const netTransform = runners.map(getRunnerTransform).reduce(lmultiply, new Matrix());\n this.transform(netTransform);\n this._transformationRunners.merge();\n if (this._transformationRunners.length() === 1) {\n this._frameId = null;\n }\n}\nclass RunnerArray {\n constructor() {\n this.runners = [];\n this.ids = [];\n }\n add(runner) {\n if (this.runners.includes(runner)) return;\n const id = runner.id + 1;\n this.runners.push(runner);\n this.ids.push(id);\n return this;\n }\n clearBefore(id) {\n const deleteCnt = this.ids.indexOf(id + 1) || 1;\n this.ids.splice(0, deleteCnt, 0);\n this.runners.splice(0, deleteCnt, new FakeRunner()).forEach(r => r.clearTransformsFromQueue());\n return this;\n }\n edit(id, newRunner) {\n const index = this.ids.indexOf(id + 1);\n this.ids.splice(index, 1, id + 1);\n this.runners.splice(index, 1, newRunner);\n return this;\n }\n getByID(id) {\n return this.runners[this.ids.indexOf(id + 1)];\n }\n length() {\n return this.ids.length;\n }\n merge() {\n let lastRunner = null;\n for (let i = 0; i < this.runners.length; ++i) {\n const runner = this.runners[i];\n const condition = lastRunner && runner.done && lastRunner.done && (\n // don't merge runner when persisted on timeline\n !runner._timeline || !runner._timeline._runnerIds.includes(runner.id)) && (!lastRunner._timeline || !lastRunner._timeline._runnerIds.includes(lastRunner.id));\n if (condition) {\n // the +1 happens in the function\n this.remove(runner.id);\n const newRunner = runner.mergeWith(lastRunner);\n this.edit(lastRunner.id, newRunner);\n lastRunner = newRunner;\n --i;\n } else {\n lastRunner = runner;\n }\n }\n return this;\n }\n remove(id) {\n const index = this.ids.indexOf(id + 1);\n this.ids.splice(index, 1);\n this.runners.splice(index, 1);\n return this;\n }\n}\nregisterMethods({\n Element: {\n animate(duration, delay, when) {\n const o = Runner.sanitise(duration, delay, when);\n const timeline = this.timeline();\n return new Runner(o.duration).loop(o).element(this).timeline(timeline.play()).schedule(o.delay, o.when);\n },\n delay(by, when) {\n return this.animate(0, by, when);\n },\n // this function searches for all runners on the element and deletes the ones\n // which run before the current one. This is because absolute transformations\n // overwrite anything anyway so there is no need to waste time computing\n // other runners\n _clearTransformRunnersBefore(currentRunner) {\n this._transformationRunners.clearBefore(currentRunner.id);\n },\n _currentTransform(current) {\n return this._transformationRunners.runners\n // we need the equal sign here to make sure, that also transformations\n // on the same runner which execute before the current transformation are\n // taken into account\n .filter(runner => runner.id <= current.id).map(getRunnerTransform).reduce(lmultiply, new Matrix());\n },\n _addRunner(runner) {\n this._transformationRunners.add(runner);\n\n // Make sure that the runner merge is executed at the very end of\n // all Animator functions. That is why we use immediate here to execute\n // the merge right after all frames are run\n Animator.cancelImmediate(this._frameId);\n this._frameId = Animator.immediate(mergeTransforms.bind(this));\n },\n _prepareRunner() {\n if (this._frameId == null) {\n this._transformationRunners = new RunnerArray().add(new FakeRunner(new Matrix(this)));\n }\n }\n }\n});\n\n// Will output the elements from array A that are not in the array B\nconst difference = (a, b) => a.filter(x => !b.includes(x));\nextend(Runner, {\n attr(a, v) {\n return this.styleAttr('attr', a, v);\n },\n // Add animatable styles\n css(s, v) {\n return this.styleAttr('css', s, v);\n },\n styleAttr(type, nameOrAttrs, val) {\n if (typeof nameOrAttrs === 'string') {\n return this.styleAttr(type, {\n [nameOrAttrs]: val\n });\n }\n let attrs = nameOrAttrs;\n if (this._tryRetarget(type, attrs)) return this;\n let morpher = new Morphable(this._stepper).to(attrs);\n let keys = Object.keys(attrs);\n this.queue(function () {\n morpher = morpher.from(this.element()[type](keys));\n }, function (pos) {\n this.element()[type](morpher.at(pos).valueOf());\n return morpher.done();\n }, function (newToAttrs) {\n // Check if any new keys were added\n const newKeys = Object.keys(newToAttrs);\n const differences = difference(newKeys, keys);\n\n // If their are new keys, initialize them and add them to morpher\n if (differences.length) {\n // Get the values\n const addedFromAttrs = this.element()[type](differences);\n\n // Get the already initialized values\n const oldFromAttrs = new ObjectBag(morpher.from()).valueOf();\n\n // Merge old and new\n Object.assign(oldFromAttrs, addedFromAttrs);\n morpher.from(oldFromAttrs);\n }\n\n // Get the object from the morpher\n const oldToAttrs = new ObjectBag(morpher.to()).valueOf();\n\n // Merge in new attributes\n Object.assign(oldToAttrs, newToAttrs);\n\n // Change morpher target\n morpher.to(oldToAttrs);\n\n // Make sure that we save the work we did so we don't need it to do again\n keys = newKeys;\n attrs = newToAttrs;\n });\n this._rememberMorpher(type, morpher);\n return this;\n },\n zoom(level, point) {\n if (this._tryRetarget('zoom', level, point)) return this;\n let morpher = new Morphable(this._stepper).to(new SVGNumber(level));\n this.queue(function () {\n morpher = morpher.from(this.element().zoom());\n }, function (pos) {\n this.element().zoom(morpher.at(pos), point);\n return morpher.done();\n }, function (newLevel, newPoint) {\n point = newPoint;\n morpher.to(newLevel);\n });\n this._rememberMorpher('zoom', morpher);\n return this;\n },\n /**\n ** absolute transformations\n **/\n\n //\n // M v -----|-----(D M v = F v)------|-----> T v\n //\n // 1. define the final state (T) and decompose it (once)\n // t = [tx, ty, the, lam, sy, sx]\n // 2. on every frame: pull the current state of all previous transforms\n // (M - m can change)\n // and then write this as m = [tx0, ty0, the0, lam0, sy0, sx0]\n // 3. Find the interpolated matrix F(pos) = m + pos * (t - m)\n // - Note F(0) = M\n // - Note F(1) = T\n // 4. Now you get the delta matrix as a result: D = F * inv(M)\n\n transform(transforms, relative, affine) {\n // If we have a declarative function, we should retarget it if possible\n relative = transforms.relative || relative;\n if (this._isDeclarative && !relative && this._tryRetarget('transform', transforms)) {\n return this;\n }\n\n // Parse the parameters\n const isMatrix = Matrix.isMatrixLike(transforms);\n affine = transforms.affine != null ? transforms.affine : affine != null ? affine : !isMatrix;\n\n // Create a morpher and set its type\n const morpher = new Morphable(this._stepper).type(affine ? TransformBag : Matrix);\n let origin;\n let element;\n let current;\n let currentAngle;\n let startTransform;\n function setup() {\n // make sure element and origin is defined\n element = element || this.element();\n origin = origin || getOrigin(transforms, element);\n startTransform = new Matrix(relative ? undefined : element);\n\n // add the runner to the element so it can merge transformations\n element._addRunner(this);\n\n // Deactivate all transforms that have run so far if we are absolute\n if (!relative) {\n element._clearTransformRunnersBefore(this);\n }\n }\n function run(pos) {\n // clear all other transforms before this in case something is saved\n // on this runner. We are absolute. We dont need these!\n if (!relative) this.clearTransform();\n const {\n x,\n y\n } = new Point(origin).transform(element._currentTransform(this));\n let target = new Matrix({\n ...transforms,\n origin: [x, y]\n });\n let start = this._isDeclarative && current ? current : startTransform;\n if (affine) {\n target = target.decompose(x, y);\n start = start.decompose(x, y);\n\n // Get the current and target angle as it was set\n const rTarget = target.rotate;\n const rCurrent = start.rotate;\n\n // Figure out the shortest path to rotate directly\n const possibilities = [rTarget - 360, rTarget, rTarget + 360];\n const distances = possibilities.map(a => Math.abs(a - rCurrent));\n const shortest = Math.min(...distances);\n const index = distances.indexOf(shortest);\n target.rotate = possibilities[index];\n }\n if (relative) {\n // we have to be careful here not to overwrite the rotation\n // with the rotate method of Matrix\n if (!isMatrix) {\n target.rotate = transforms.rotate || 0;\n }\n if (this._isDeclarative && currentAngle) {\n start.rotate = currentAngle;\n }\n }\n morpher.from(start);\n morpher.to(target);\n const affineParameters = morpher.at(pos);\n currentAngle = affineParameters.rotate;\n current = new Matrix(affineParameters);\n this.addTransform(current);\n element._addRunner(this);\n return morpher.done();\n }\n function retarget(newTransforms) {\n // only get a new origin if it changed since the last call\n if ((newTransforms.origin || 'center').toString() !== (transforms.origin || 'center').toString()) {\n origin = getOrigin(newTransforms, element);\n }\n\n // overwrite the old transformations with the new ones\n transforms = {\n ...newTransforms,\n origin\n };\n }\n this.queue(setup, run, retarget, true);\n this._isDeclarative && this._rememberMorpher('transform', morpher);\n return this;\n },\n // Animatable x-axis\n x(x) {\n return this._queueNumber('x', x);\n },\n // Animatable y-axis\n y(y) {\n return this._queueNumber('y', y);\n },\n ax(x) {\n return this._queueNumber('ax', x);\n },\n ay(y) {\n return this._queueNumber('ay', y);\n },\n dx(x = 0) {\n return this._queueNumberDelta('x', x);\n },\n dy(y = 0) {\n return this._queueNumberDelta('y', y);\n },\n dmove(x, y) {\n return this.dx(x).dy(y);\n },\n _queueNumberDelta(method, to) {\n to = new SVGNumber(to);\n\n // Try to change the target if we have this method already registered\n if (this._tryRetarget(method, to)) return this;\n\n // Make a morpher and queue the animation\n const morpher = new Morphable(this._stepper).to(to);\n let from = null;\n this.queue(function () {\n from = this.element()[method]();\n morpher.from(from);\n morpher.to(from + to);\n }, function (pos) {\n this.element()[method](morpher.at(pos));\n return morpher.done();\n }, function (newTo) {\n morpher.to(from + new SVGNumber(newTo));\n });\n\n // Register the morpher so that if it is changed again, we can retarget it\n this._rememberMorpher(method, morpher);\n return this;\n },\n _queueObject(method, to) {\n // Try to change the target if we have this method already registered\n if (this._tryRetarget(method, to)) return this;\n\n // Make a morpher and queue the animation\n const morpher = new Morphable(this._stepper).to(to);\n this.queue(function () {\n morpher.from(this.element()[method]());\n }, function (pos) {\n this.element()[method](morpher.at(pos));\n return morpher.done();\n });\n\n // Register the morpher so that if it is changed again, we can retarget it\n this._rememberMorpher(method, morpher);\n return this;\n },\n _queueNumber(method, value) {\n return this._queueObject(method, new SVGNumber(value));\n },\n // Animatable center x-axis\n cx(x) {\n return this._queueNumber('cx', x);\n },\n // Animatable center y-axis\n cy(y) {\n return this._queueNumber('cy', y);\n },\n // Add animatable move\n move(x, y) {\n return this.x(x).y(y);\n },\n amove(x, y) {\n return this.ax(x).ay(y);\n },\n // Add animatable center\n center(x, y) {\n return this.cx(x).cy(y);\n },\n // Add animatable size\n size(width, height) {\n // animate bbox based size for all other elements\n let box;\n if (!width || !height) {\n box = this._element.bbox();\n }\n if (!width) {\n width = box.width / box.height * height;\n }\n if (!height) {\n height = box.height / box.width * width;\n }\n return this.width(width).height(height);\n },\n // Add animatable width\n width(width) {\n return this._queueNumber('width', width);\n },\n // Add animatable height\n height(height) {\n return this._queueNumber('height', height);\n },\n // Add animatable plot\n plot(a, b, c, d) {\n // Lines can be plotted with 4 arguments\n if (arguments.length === 4) {\n return this.plot([a, b, c, d]);\n }\n if (this._tryRetarget('plot', a)) return this;\n const morpher = new Morphable(this._stepper).type(this._element.MorphArray).to(a);\n this.queue(function () {\n morpher.from(this._element.array());\n }, function (pos) {\n this._element.plot(morpher.at(pos));\n return morpher.done();\n });\n this._rememberMorpher('plot', morpher);\n return this;\n },\n // Add leading method\n leading(value) {\n return this._queueNumber('leading', value);\n },\n // Add animatable viewbox\n viewbox(x, y, width, height) {\n return this._queueObject('viewbox', new Box(x, y, width, height));\n },\n update(o) {\n if (typeof o !== 'object') {\n return this.update({\n offset: arguments[0],\n color: arguments[1],\n opacity: arguments[2]\n });\n }\n if (o.opacity != null) this.attr('stop-opacity', o.opacity);\n if (o.color != null) this.attr('stop-color', o.color);\n if (o.offset != null) this.attr('offset', o.offset);\n return this;\n }\n});\nextend(Runner, {\n rx,\n ry,\n from,\n to\n});\nregister(Runner, 'Runner');\n\nclass Svg extends Container {\n constructor(node, attrs = node) {\n super(nodeOrNew('svg', node), attrs);\n this.namespace();\n }\n\n // Creates and returns defs element\n defs() {\n if (!this.isRoot()) return this.root().defs();\n return adopt(this.node.querySelector('defs')) || this.put(new Defs());\n }\n isRoot() {\n return !this.node.parentNode || !(this.node.parentNode instanceof globals.window.SVGElement) && this.node.parentNode.nodeName !== '#document-fragment';\n }\n\n // Add namespaces\n namespace() {\n if (!this.isRoot()) return this.root().namespace();\n return this.attr({\n xmlns: svg,\n version: '1.1'\n }).attr('xmlns:xlink', xlink, xmlns);\n }\n removeNamespace() {\n return this.attr({\n xmlns: null,\n version: null\n }).attr('xmlns:xlink', null, xmlns).attr('xmlns:svgjs', null, xmlns);\n }\n\n // Check if this is a root svg\n // If not, call root() from this element\n root() {\n if (this.isRoot()) return this;\n return super.root();\n }\n}\nregisterMethods({\n Container: {\n // Create nested svg document\n nested: wrapWithAttrCheck(function () {\n return this.put(new Svg());\n })\n }\n});\nregister(Svg, 'Svg', true);\n\nclass Symbol extends Container {\n // Initialize node\n constructor(node, attrs = node) {\n super(nodeOrNew('symbol', node), attrs);\n }\n}\nregisterMethods({\n Container: {\n symbol: wrapWithAttrCheck(function () {\n return this.put(new Symbol());\n })\n }\n});\nregister(Symbol, 'Symbol');\n\n// Create plain text node\nfunction plain(text) {\n // clear if build mode is disabled\n if (this._build === false) {\n this.clear();\n }\n\n // create text node\n this.node.appendChild(globals.document.createTextNode(text));\n return this;\n}\n\n// Get length of text element\nfunction length() {\n return this.node.getComputedTextLength();\n}\n\n// Move over x-axis\n// Text is moved by its bounding box\n// text-anchor does NOT matter\nfunction x$1(x, box = this.bbox()) {\n if (x == null) {\n return box.x;\n }\n return this.attr('x', this.attr('x') + x - box.x);\n}\n\n// Move over y-axis\nfunction y$1(y, box = this.bbox()) {\n if (y == null) {\n return box.y;\n }\n return this.attr('y', this.attr('y') + y - box.y);\n}\nfunction move$1(x, y, box = this.bbox()) {\n return this.x(x, box).y(y, box);\n}\n\n// Move center over x-axis\nfunction cx(x, box = this.bbox()) {\n if (x == null) {\n return box.cx;\n }\n return this.attr('x', this.attr('x') + x - box.cx);\n}\n\n// Move center over y-axis\nfunction cy(y, box = this.bbox()) {\n if (y == null) {\n return box.cy;\n }\n return this.attr('y', this.attr('y') + y - box.cy);\n}\nfunction center(x, y, box = this.bbox()) {\n return this.cx(x, box).cy(y, box);\n}\nfunction ax(x) {\n return this.attr('x', x);\n}\nfunction ay(y) {\n return this.attr('y', y);\n}\nfunction amove(x, y) {\n return this.ax(x).ay(y);\n}\n\n// Enable / disable build mode\nfunction build(build) {\n this._build = !!build;\n return this;\n}\n\nvar textable = {\n __proto__: null,\n amove: amove,\n ax: ax,\n ay: ay,\n build: build,\n center: center,\n cx: cx,\n cy: cy,\n length: length,\n move: move$1,\n plain: plain,\n x: x$1,\n y: y$1\n};\n\nclass Text extends Shape {\n // Initialize node\n constructor(node, attrs = node) {\n super(nodeOrNew('text', node), attrs);\n this.dom.leading = this.dom.leading ?? new SVGNumber(1.3); // store leading value for rebuilding\n this._rebuild = true; // enable automatic updating of dy values\n this._build = false; // disable build mode for adding multiple lines\n }\n\n // Set / get leading\n leading(value) {\n // act as getter\n if (value == null) {\n return this.dom.leading;\n }\n\n // act as setter\n this.dom.leading = new SVGNumber(value);\n return this.rebuild();\n }\n\n // Rebuild appearance type\n rebuild(rebuild) {\n // store new rebuild flag if given\n if (typeof rebuild === 'boolean') {\n this._rebuild = rebuild;\n }\n\n // define position of all lines\n if (this._rebuild) {\n const self = this;\n let blankLineOffset = 0;\n const leading = this.dom.leading;\n this.each(function (i) {\n if (isDescriptive(this.node)) return;\n const fontSize = globals.window.getComputedStyle(this.node).getPropertyValue('font-size');\n const dy = leading * new SVGNumber(fontSize);\n if (this.dom.newLined) {\n this.attr('x', self.attr('x'));\n if (this.text() === '\\n') {\n blankLineOffset += dy;\n } else {\n this.attr('dy', i ? dy + blankLineOffset : 0);\n blankLineOffset = 0;\n }\n }\n });\n this.fire('rebuild');\n }\n return this;\n }\n\n // overwrite method from parent to set data properly\n setData(o) {\n this.dom = o;\n this.dom.leading = new SVGNumber(o.leading || 1.3);\n return this;\n }\n writeDataToDom() {\n writeDataToDom(this, this.dom, {\n leading: 1.3\n });\n return this;\n }\n\n // Set the text content\n text(text) {\n // act as getter\n if (text === undefined) {\n const children = this.node.childNodes;\n let firstLine = 0;\n text = '';\n for (let i = 0, len = children.length; i < len; ++i) {\n // skip textPaths - they are no lines\n if (children[i].nodeName === 'textPath' || isDescriptive(children[i])) {\n if (i === 0) firstLine = i + 1;\n continue;\n }\n\n // add newline if its not the first child and newLined is set to true\n if (i !== firstLine && children[i].nodeType !== 3 && adopt(children[i]).dom.newLined === true) {\n text += '\\n';\n }\n\n // add content of this node\n text += children[i].textContent;\n }\n return text;\n }\n\n // remove existing content\n this.clear().build(true);\n if (typeof text === 'function') {\n // call block\n text.call(this, this);\n } else {\n // store text and make sure text is not blank\n text = (text + '').split('\\n');\n\n // build new lines\n for (let j = 0, jl = text.length; j < jl; j++) {\n this.newLine(text[j]);\n }\n }\n\n // disable build mode and rebuild lines\n return this.build(false).rebuild();\n }\n}\nextend(Text, textable);\nregisterMethods({\n Container: {\n // Create text element\n text: wrapWithAttrCheck(function (text = '') {\n return this.put(new Text()).text(text);\n }),\n // Create plain text element\n plain: wrapWithAttrCheck(function (text = '') {\n return this.put(new Text()).plain(text);\n })\n }\n});\nregister(Text, 'Text');\n\nclass Tspan extends Shape {\n // Initialize node\n constructor(node, attrs = node) {\n super(nodeOrNew('tspan', node), attrs);\n this._build = false; // disable build mode for adding multiple lines\n }\n\n // Shortcut dx\n dx(dx) {\n return this.attr('dx', dx);\n }\n\n // Shortcut dy\n dy(dy) {\n return this.attr('dy', dy);\n }\n\n // Create new line\n newLine() {\n // mark new line\n this.dom.newLined = true;\n\n // fetch parent\n const text = this.parent();\n\n // early return in case we are not in a text element\n if (!(text instanceof Text)) {\n return this;\n }\n const i = text.index(this);\n const fontSize = globals.window.getComputedStyle(this.node).getPropertyValue('font-size');\n const dy = text.dom.leading * new SVGNumber(fontSize);\n\n // apply new position\n return this.dy(i ? dy : 0).attr('x', text.x());\n }\n\n // Set text content\n text(text) {\n if (text == null) return this.node.textContent + (this.dom.newLined ? '\\n' : '');\n if (typeof text === 'function') {\n this.clear().build(true);\n text.call(this, this);\n this.build(false);\n } else {\n this.plain(text);\n }\n return this;\n }\n}\nextend(Tspan, textable);\nregisterMethods({\n Tspan: {\n tspan: wrapWithAttrCheck(function (text = '') {\n const tspan = new Tspan();\n\n // clear if build mode is disabled\n if (!this._build) {\n this.clear();\n }\n\n // add new tspan\n return this.put(tspan).text(text);\n })\n },\n Text: {\n newLine: function (text = '') {\n return this.tspan(text).newLine();\n }\n }\n});\nregister(Tspan, 'Tspan');\n\nclass Circle extends Shape {\n constructor(node, attrs = node) {\n super(nodeOrNew('circle', node), attrs);\n }\n radius(r) {\n return this.attr('r', r);\n }\n\n // Radius x value\n rx(rx) {\n return this.attr('r', rx);\n }\n\n // Alias radius x value\n ry(ry) {\n return this.rx(ry);\n }\n size(size) {\n return this.radius(new SVGNumber(size).divide(2));\n }\n}\nextend(Circle, {\n x: x$3,\n y: y$3,\n cx: cx$1,\n cy: cy$1,\n width: width$2,\n height: height$2\n});\nregisterMethods({\n Container: {\n // Create circle element\n circle: wrapWithAttrCheck(function (size = 0) {\n return this.put(new Circle()).size(size).move(0, 0);\n })\n }\n});\nregister(Circle, 'Circle');\n\nclass ClipPath extends Container {\n constructor(node, attrs = node) {\n super(nodeOrNew('clipPath', node), attrs);\n }\n\n // Unclip all clipped elements and remove itself\n remove() {\n // unclip all targets\n this.targets().forEach(function (el) {\n el.unclip();\n });\n\n // remove clipPath from parent\n return super.remove();\n }\n targets() {\n return baseFind('svg [clip-path*=' + this.id() + ']');\n }\n}\nregisterMethods({\n Container: {\n // Create clipping element\n clip: wrapWithAttrCheck(function () {\n return this.defs().put(new ClipPath());\n })\n },\n Element: {\n // Distribute clipPath to svg element\n clipper() {\n return this.reference('clip-path');\n },\n clipWith(element) {\n // use given clip or create a new one\n const clipper = element instanceof ClipPath ? element : this.parent().clip().add(element);\n\n // apply mask\n return this.attr('clip-path', 'url(#' + clipper.id() + ')');\n },\n // Unclip element\n unclip() {\n return this.attr('clip-path', null);\n }\n }\n});\nregister(ClipPath, 'ClipPath');\n\nclass ForeignObject extends Element {\n constructor(node, attrs = node) {\n super(nodeOrNew('foreignObject', node), attrs);\n }\n}\nregisterMethods({\n Container: {\n foreignObject: wrapWithAttrCheck(function (width, height) {\n return this.put(new ForeignObject()).size(width, height);\n })\n }\n});\nregister(ForeignObject, 'ForeignObject');\n\nfunction dmove(dx, dy) {\n this.children().forEach(child => {\n let bbox;\n\n // We have to wrap this for elements that dont have a bbox\n // e.g. title and other descriptive elements\n try {\n // Get the childs bbox\n // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1905039\n // Because bbox for nested svgs returns the contents bbox in the coordinate space of the svg itself (weird!), we cant use bbox for svgs\n // Therefore we have to use getBoundingClientRect. But THAT is broken (as explained in the bug).\n // Funnily enough the broken behavior would work for us but that breaks it in chrome\n // So we have to replicate the broken behavior of FF by just reading the attributes of the svg itself\n bbox = child.node instanceof getWindow().SVGSVGElement ? new Box(child.attr(['x', 'y', 'width', 'height'])) : child.bbox();\n } catch (e) {\n return;\n }\n\n // Get childs matrix\n const m = new Matrix(child);\n // Translate childs matrix by amount and\n // transform it back into parents space\n const matrix = m.translate(dx, dy).transform(m.inverse());\n // Calculate new x and y from old box\n const p = new Point(bbox.x, bbox.y).transform(matrix);\n // Move element\n child.move(p.x, p.y);\n });\n return this;\n}\nfunction dx(dx) {\n return this.dmove(dx, 0);\n}\nfunction dy(dy) {\n return this.dmove(0, dy);\n}\nfunction height(height, box = this.bbox()) {\n if (height == null) return box.height;\n return this.size(box.width, height, box);\n}\nfunction move(x = 0, y = 0, box = this.bbox()) {\n const dx = x - box.x;\n const dy = y - box.y;\n return this.dmove(dx, dy);\n}\nfunction size(width, height, box = this.bbox()) {\n const p = proportionalSize(this, width, height, box);\n const scaleX = p.width / box.width;\n const scaleY = p.height / box.height;\n this.children().forEach(child => {\n const o = new Point(box).transform(new Matrix(child).inverse());\n child.scale(scaleX, scaleY, o.x, o.y);\n });\n return this;\n}\nfunction width(width, box = this.bbox()) {\n if (width == null) return box.width;\n return this.size(width, box.height, box);\n}\nfunction x(x, box = this.bbox()) {\n if (x == null) return box.x;\n return this.move(x, box.y, box);\n}\nfunction y(y, box = this.bbox()) {\n if (y == null) return box.y;\n return this.move(box.x, y, box);\n}\n\nvar containerGeometry = {\n __proto__: null,\n dmove: dmove,\n dx: dx,\n dy: dy,\n height: height,\n move: move,\n size: size,\n width: width,\n x: x,\n y: y\n};\n\nclass G extends Container {\n constructor(node, attrs = node) {\n super(nodeOrNew('g', node), attrs);\n }\n}\nextend(G, containerGeometry);\nregisterMethods({\n Container: {\n // Create a group element\n group: wrapWithAttrCheck(function () {\n return this.put(new G());\n })\n }\n});\nregister(G, 'G');\n\nclass A extends Container {\n constructor(node, attrs = node) {\n super(nodeOrNew('a', node), attrs);\n }\n\n // Link target attribute\n target(target) {\n return this.attr('target', target);\n }\n\n // Link url\n to(url) {\n return this.attr('href', url, xlink);\n }\n}\nextend(A, containerGeometry);\nregisterMethods({\n Container: {\n // Create a hyperlink element\n link: wrapWithAttrCheck(function (url) {\n return this.put(new A()).to(url);\n })\n },\n Element: {\n unlink() {\n const link = this.linker();\n if (!link) return this;\n const parent = link.parent();\n if (!parent) {\n return this.remove();\n }\n const index = parent.index(link);\n parent.add(this, index);\n link.remove();\n return this;\n },\n linkTo(url) {\n // reuse old link if possible\n let link = this.linker();\n if (!link) {\n link = new A();\n this.wrap(link);\n }\n if (typeof url === 'function') {\n url.call(link, link);\n } else {\n link.to(url);\n }\n return this;\n },\n linker() {\n const link = this.parent();\n if (link && link.node.nodeName.toLowerCase() === 'a') {\n return link;\n }\n return null;\n }\n }\n});\nregister(A, 'A');\n\nclass Mask extends Container {\n // Initialize node\n constructor(node, attrs = node) {\n super(nodeOrNew('mask', node), attrs);\n }\n\n // Unmask all masked elements and remove itself\n remove() {\n // unmask all targets\n this.targets().forEach(function (el) {\n el.unmask();\n });\n\n // remove mask from parent\n return super.remove();\n }\n targets() {\n return baseFind('svg [mask*=' + this.id() + ']');\n }\n}\nregisterMethods({\n Container: {\n mask: wrapWithAttrCheck(function () {\n return this.defs().put(new Mask());\n })\n },\n Element: {\n // Distribute mask to svg element\n masker() {\n return this.reference('mask');\n },\n maskWith(element) {\n // use given mask or create a new one\n const masker = element instanceof Mask ? element : this.parent().mask().add(element);\n\n // apply mask\n return this.attr('mask', 'url(#' + masker.id() + ')');\n },\n // Unmask element\n unmask() {\n return this.attr('mask', null);\n }\n }\n});\nregister(Mask, 'Mask');\n\nclass Stop extends Element {\n constructor(node, attrs = node) {\n super(nodeOrNew('stop', node), attrs);\n }\n\n // add color stops\n update(o) {\n if (typeof o === 'number' || o instanceof SVGNumber) {\n o = {\n offset: arguments[0],\n color: arguments[1],\n opacity: arguments[2]\n };\n }\n\n // set attributes\n if (o.opacity != null) this.attr('stop-opacity', o.opacity);\n if (o.color != null) this.attr('stop-color', o.color);\n if (o.offset != null) this.attr('offset', new SVGNumber(o.offset));\n return this;\n }\n}\nregisterMethods({\n Gradient: {\n // Add a color stop\n stop: function (offset, color, opacity) {\n return this.put(new Stop()).update(offset, color, opacity);\n }\n }\n});\nregister(Stop, 'Stop');\n\nfunction cssRule(selector, rule) {\n if (!selector) return '';\n if (!rule) return selector;\n let ret = selector + '{';\n for (const i in rule) {\n ret += unCamelCase(i) + ':' + rule[i] + ';';\n }\n ret += '}';\n return ret;\n}\nclass Style extends Element {\n constructor(node, attrs = node) {\n super(nodeOrNew('style', node), attrs);\n }\n addText(w = '') {\n this.node.textContent += w;\n return this;\n }\n font(name, src, params = {}) {\n return this.rule('@font-face', {\n fontFamily: name,\n src: src,\n ...params\n });\n }\n rule(selector, obj) {\n return this.addText(cssRule(selector, obj));\n }\n}\nregisterMethods('Dom', {\n style(selector, obj) {\n return this.put(new Style()).rule(selector, obj);\n },\n fontface(name, src, params) {\n return this.put(new Style()).font(name, src, params);\n }\n});\nregister(Style, 'Style');\n\nclass TextPath extends Text {\n // Initialize node\n constructor(node, attrs = node) {\n super(nodeOrNew('textPath', node), attrs);\n }\n\n // return the array of the path track element\n array() {\n const track = this.track();\n return track ? track.array() : null;\n }\n\n // Plot path if any\n plot(d) {\n const track = this.track();\n let pathArray = null;\n if (track) {\n pathArray = track.plot(d);\n }\n return d == null ? pathArray : this;\n }\n\n // Get the path element\n track() {\n return this.reference('href');\n }\n}\nregisterMethods({\n Container: {\n textPath: wrapWithAttrCheck(function (text, path) {\n // Convert text to instance if needed\n if (!(text instanceof Text)) {\n text = this.text(text);\n }\n return text.path(path);\n })\n },\n Text: {\n // Create path for text to run on\n path: wrapWithAttrCheck(function (track, importNodes = true) {\n const textPath = new TextPath();\n\n // if track is a path, reuse it\n if (!(track instanceof Path)) {\n // create path element\n track = this.defs().path(track);\n }\n\n // link textPath to path and add content\n textPath.attr('href', '#' + track, xlink);\n\n // Transplant all nodes from text to textPath\n let node;\n if (importNodes) {\n while (node = this.node.firstChild) {\n textPath.node.appendChild(node);\n }\n }\n\n // add textPath element as child node and return textPath\n return this.put(textPath);\n }),\n // Get the textPath children\n textPath() {\n return this.findOne('textPath');\n }\n },\n Path: {\n // creates a textPath from this path\n text: wrapWithAttrCheck(function (text) {\n // Convert text to instance if needed\n if (!(text instanceof Text)) {\n text = new Text().addTo(this.parent()).text(text);\n }\n\n // Create textPath from text and path and return\n return text.path(this);\n }),\n targets() {\n return baseFind('svg textPath').filter(node => {\n return (node.attr('href') || '').includes(this.id());\n });\n\n // Does not work in IE11. Use when IE support is dropped\n // return baseFind('svg textPath[*|href*=' + this.id() + ']')\n }\n }\n});\nTextPath.prototype.MorphArray = PathArray;\nregister(TextPath, 'TextPath');\n\nclass Use extends Shape {\n constructor(node, attrs = node) {\n super(nodeOrNew('use', node), attrs);\n }\n\n // Use element as a reference\n use(element, file) {\n // Set lined element\n return this.attr('href', (file || '') + '#' + element, xlink);\n }\n}\nregisterMethods({\n Container: {\n // Create a use element\n use: wrapWithAttrCheck(function (element, file) {\n return this.put(new Use()).use(element, file);\n })\n }\n});\nregister(Use, 'Use');\n\n/* Optional Modules */\nconst SVG = makeInstance;\nextend([Svg, Symbol, Image, Pattern, Marker], getMethodsFor('viewbox'));\nextend([Line, Polyline, Polygon, Path], getMethodsFor('marker'));\nextend(Text, getMethodsFor('Text'));\nextend(Path, getMethodsFor('Path'));\nextend(Defs, getMethodsFor('Defs'));\nextend([Text, Tspan], getMethodsFor('Tspan'));\nextend([Rect, Ellipse, Gradient, Runner], getMethodsFor('radius'));\nextend(EventTarget, getMethodsFor('EventTarget'));\nextend(Dom, getMethodsFor('Dom'));\nextend(Element, getMethodsFor('Element'));\nextend(Shape, getMethodsFor('Shape'));\nextend([Container, Fragment], getMethodsFor('Container'));\nextend(Gradient, getMethodsFor('Gradient'));\nextend(Runner, getMethodsFor('Runner'));\nList.extend(getMethodNames());\nregisterMorphableType([SVGNumber, Color, Box, Matrix, SVGArray, PointArray, PathArray, Point]);\nmakeMorphable();\n\nexports.A = A;\nexports.Animator = Animator;\nexports.Array = SVGArray;\nexports.Box = Box;\nexports.Circle = Circle;\nexports.ClipPath = ClipPath;\nexports.Color = Color;\nexports.Container = Container;\nexports.Controller = Controller;\nexports.Defs = Defs;\nexports.Dom = Dom;\nexports.Ease = Ease;\nexports.Element = Element;\nexports.Ellipse = Ellipse;\nexports.EventTarget = EventTarget;\nexports.ForeignObject = ForeignObject;\nexports.Fragment = Fragment;\nexports.G = G;\nexports.Gradient = Gradient;\nexports.Image = Image;\nexports.Line = Line;\nexports.List = List;\nexports.Marker = Marker;\nexports.Mask = Mask;\nexports.Matrix = Matrix;\nexports.Morphable = Morphable;\nexports.NonMorphable = NonMorphable;\nexports.Number = SVGNumber;\nexports.ObjectBag = ObjectBag;\nexports.PID = PID;\nexports.Path = Path;\nexports.PathArray = PathArray;\nexports.Pattern = Pattern;\nexports.Point = Point;\nexports.PointArray = PointArray;\nexports.Polygon = Polygon;\nexports.Polyline = Polyline;\nexports.Queue = Queue;\nexports.Rect = Rect;\nexports.Runner = Runner;\nexports.SVG = SVG;\nexports.Shape = Shape;\nexports.Spring = Spring;\nexports.Stop = Stop;\nexports.Style = Style;\nexports.Svg = Svg;\nexports.Symbol = Symbol;\nexports.Text = Text;\nexports.TextPath = TextPath;\nexports.Timeline = Timeline;\nexports.TransformBag = TransformBag;\nexports.Tspan = Tspan;\nexports.Use = Use;\nexports.adopt = adopt;\nexports.assignNewId = assignNewId;\nexports.clearEvents = clearEvents;\nexports.create = create;\nexports.defaults = defaults;\nexports.dispatch = dispatch;\nexports.easing = easing;\nexports.eid = eid;\nexports.extend = extend;\nexports.find = baseFind;\nexports.getClass = getClass;\nexports.getEventTarget = getEventTarget;\nexports.getEvents = getEvents;\nexports.getWindow = getWindow;\nexports.makeInstance = makeInstance;\nexports.makeMorphable = makeMorphable;\nexports.mockAdopt = mockAdopt;\nexports.namespaces = namespaces;\nexports.nodeOrNew = nodeOrNew;\nexports.off = off;\nexports.on = on;\nexports.parser = parser;\nexports.regex = regex;\nexports.register = register;\nexports.registerMorphableType = registerMorphableType;\nexports.registerWindow = registerWindow;\nexports.restoreWindow = restoreWindow;\nexports.root = root;\nexports.saveWindow = saveWindow;\nexports.utils = utils;\nexports.windowEvents = windowEvents;\nexports.withWindow = withWindow;\nexports.wrapWithAttrCheck = wrapWithAttrCheck;\n//# sourceMappingURL=svg.node.cjs.map\n","import './draggable';\r\nimport './input-box';\r\nimport './node-x-btn';\r\nimport './connector';\r\nimport './comment-drag-handle';\r\nimport './comment-input';\r\nimport './connection-line';","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(8156);\n"],"names":["root","factory","exports","module","define","amd","this","__webpack_require__","moduleId","cachedModule","__webpack_module_cache__","undefined","__webpack_modules__","call","obj","name","Object","prototype","hasOwnProperty","Constants","Renderer","Representer","RepresenterNode","UserState","state","callbacks","constructor","Set","Map","setState","has","add","triggerCallbacks","removeState","delete","hasState","onStateChange","cb","set","get","push","addedOrRemoved","cbs","userState","container","visible","toolbox","document","createElement","className","workspace","_wsTop","appendChild","body","fill","nodes","clear","forEach","node","headlessNode","type","nodeEl","createNodeElement","show","textContent","labelText","applyNodeStyles","colors","primary","addEventListener","e","onNodeMouseDown","el","bgColor","style","backgroundColor","parseColor","padding","cursor","renderer","constants","c","fontFamily","FONT_FAMILY","fontSize","FONT_SIZE","color","FONT_COLOR","ghostEl","createGhostNode","moveGhost","ev","left","clientX","top","clientY","releaseGhost","removeEventListener","dropNode","remove","preventDefault","position","pointerEvents","rect","svg","getBoundingClientRect","right","bottom","x","wsX","y","wsY","screenToWorkspace","nodews","spawnAt","argName","arguments","setFieldValue","drawNode","id","display","hide","innerHTML","RendererMap","atlas","NAME","apollo","isBrowser","FontManager","loadGoogleFont","register","cls","FieldMap","unregister","Kabel","env","UIX","events","windowListeners","addWindowListener","removeWindowListener","clearWindowListeners","Themes","Classic","Dark","ContextMenu","Utils","Path","waitFrames","SVG","UID","EventEmitter","hasProp","styler","Styler","escapeHTML","unescapeHTML","Widget","CategoryColors","Connection","Coordinates","Field","DummyField","NumberField","OptConnectField","TextField","inject","injectHeadless","createHeadlessNode","InjectMsg","clearMainWorkspace","getMainWorkspace","setMainWorkspace","NodeSvg","Nodes","Widgets","WorkspaceSvg","Workspace","WorkspaceController","WASDController","nodeRendering","rendererMap","RMap","Apollo","Atlas","RendererConstants","commentRendering","CommentModel","CommentRenderer","Dropdown","defineProperty","v","UIStyles","workspaceBGColor","toolboxCategoriesBG","width","height","background","overflowY","toolboxFlyoutBG","borderRadius","boxShadow","initCommentInput","element","rawArgs","getSelectionRange","start","Math","min","cursorPos","anchorPos","end","max","hasSelection","deleteSelection","buffer","slice","measureTextWidth","text","tempText","getSvg","font","size","family","bbox","measureTextBbox","updateText","hasSel","txt","tspan","replace","attr","Array","from","childNodes","child","nodeType","setAttribute","leading","parseFloat","textBeforeStart","textBeforeEnd","highlightX","highlightWidth","highlightY","highlightH","selectionRect","parent","parentNode","insertBefore","move","editing","caretXOffset","caretY","caretH","caretLine","rectW","ceil","PADDING_X","rectH","PADDING_Y","comment","_tempInputBBox","textX","textY","startEditing","getText","length","rectBox","zoom","getWs","getZoom","clickX","cumulativeWidth","i","charWidth","skipNextClick","onKeyDown","onClickOutside","stopEditing","commit","capture","setTextNoRedraw","getWorkspace","redraw","key","shiftKey","ctrlKey","metaKey","targ","target","args","onRectDown","onTextDown","on","off","registerEvent","randBytes","len","cryptoAPI","getRandomValues","buf","Uint8Array","floor","random","uuidv4","g","globalThis","crypto","randomUUID","b","hex","toString","padStart","ulid","date","Date","now","time48","t","BigInt","Number","out","acc","bits","CROCK32","rnd","nanoid","alphabet","DEFAULT_ALPHABET","Error","mask","log2","idx","shortId","ts","_ctr","map","join","strategy","opts","s","_text","_isWorkspaceComment","_parent","svgGroup","relativeCoords","svgLine","generateUID","value","setText","res","isHeadless","clearComments","drawComments","isNodeComment","isWorkspaceComment","toJson","coords","fromJson","data","COMMENT_G_TAG","COMMENT_LINE_TAG","COMMENT_TEXT_EL","COMMENT_DRAG_EL","RENDERER_TAG_EL","encodeForSvg","ensureTspansPreserve","textEl","drawComment","_removeExistingElements","group","addClass","JSON","stringify","isws","displayEncoded","_createTextElement","_createBackgroundRect","dragHandle","_createDragHandle","_addEventer","screenPos","_computeScreenPosition","transform","_drawLineToNode","refreshCommentTransforms","getComments","_nodeDB","values","n","getComment","filter","userSelect","webkitUserSelect","msUserSelect","MozUserSelect","handleRadius","stroke","radius","back","circle","addElement","tagElement","workspaceX","workspaceY","nodePos","workspaceToScreen","ws","nodeWSPos","nodeBBox","nodeTopCenter","parentWSPos","commentRelPos","commentAbsX","commentAbsY","commentBBox","commentTopCenter","line","dasharray","clearAllComments","find","destroyByTag","_","clearCommentLines","drawAllComments","_constants","_currentNode","_nodeGroup","_nodeDraw","_ws","_drawStates","_commentDrawer","representer","constantOverrides","NODE_G_TAG","ELEMENT_TAG","CONN_LINE_TAG","CONNECTOR_TAG","LINE_X_MARK_TAG","BACKGROUND_PATTERN","overrides","init","initCommentRenderer","initRepresenter","initConstants","setConnect","pendingConnections","setConstants","assign","secondary","tertiary","restColors","getNodeBaseMeasurements","NODE_BASE_WIDTH","NODE_BASE_HEIGHT","anchor","opacity","measureTextHeight","measureRawField","textW","FIELD_RAW_BASE_WIDTH","INPUT_BOX_PADDING","FIELD_RAW_BASE_HEIGHT","measureLabel","field","label","getLabel","measureRaw","hasRaw","raw","getValue","measureCustom","isCustomEditor","m","measureMyself","getFieldMeasurementPadding","FIELD_SPACEX","measureField","parts","w","h","measureNodeDimensions","base","measureBaseAndLabel","fieldResult","measureFields","TOPBAR_HEIGHT","FIELD_SPACEY","FOOTER_HEIGHT","fields","startY","startWidth","startHeight","totalWidth","totalHeight","allFields","FIELD_MARGIN_X","FIELD_MARGIN_Y","labelW","TOPBAR_LABEL_MARGIN_X","renderNode","nodeIdOrNode","startNode","build","storeState","getNode","drawState","nodeGroup","fieldPosY","drawFieldRaw","fieldGroup","startX","getDisplayValue","FIELD_RAW_COLOR","FIELD_RAW_OUTLINE_COLOR","FIELD_RAW_OUTLINE_STROKE","INPUT_BOX_TEXT_ANCHOR","FIELD_RAW_TEXT_COLOR","rawBox","box","offsetY","drawFieldLabel","LABEL_SPACING","drawNodeXButton","measurements","btnSize","xGroup","class","weight","translateX","translateY","xButton","drawConnector","nodeBg","side","CONNECTOR_TRIANGLE","triSize","CONNECTOR_TRI_SIZE","path","roundedTri","rotatePath","tri","offsetX","CONNECTOR_RADIUS","circlePath","circ","drawNodeLabel","TOPBAR_LABEL_BOLDED","TOPBAR_LABEL_MARGIN_Y","createNodeGroup","drawNodeBase","drawNodeTopbar","getNodeColors","makeNodeDraggable","topbar","createFieldGroup","drawAllFieldsForNode","drawPreviousNextConnections","CORNER_RADIUS","bg","roundedRect","NODE_BG_COLOR","NODE_OUTLINE_COLOR","shadow","dragel","fieldsGroup","fieldCol","drawFieldForNode","fm","alignX","xUsed","drawMyself","measuredWidth","measuredHeight","rawData","cBubbleData","hasConnectable","connection","halfHeight","absY","c3","FIELD_CONN_COLOR","to","getTo","previousConnection","fromCircle","originCircle","originConn","connector","connState","onDraw","nodeMeasurements","cY","c1","resolveConnectable","getFrom","_fillOtherNodeConnectorCircle","nextConnection","c2","refreshComments","applyZoomToNode","nodeG","refreshNodeTransforms","nodeGroups","refreshConnectionLines","clearLines","drawLinesForAllNodes","tertirary","category","fillAllNodeConnectorBubbles","connPair","match","flatMap","p","toCircle","connectable","fromConn","isPrevious","conn","wsSvg","drawnCircles","fromEl","toEl","fromBBox","getBBox","toBBox","fromCTM","getScreenCTM","toCTM","endX","endY","absStartX","a","absStartY","d","f","absEndX","absEndY","pathStr","CONNECTOR_LINE_CURVED","dx","abs","sign","strokeWidth","CONNECTOR_LINE_WIDTH","toConn","mark","clearScreen","children","isBackground","hasClass","isDefs","tagName","isBgRect","classes","includes","BACKGROUND_CLASS","undoPendingConnsFor","conn0","rerenderNode","findIndex","pendingConn","splice","getRaw","isSpace","ch","SPECIAL_SPACES","indexOf","isDigit","code","isDigitStart","State","index","result","param","err","segmentStart","skipSpaces","charCodeAt","scanFlag","scanParam","zeroFirst","hasCeiling","hasDecimal","hasDot","finalizeSegment","cmd","cmdLC","toLowerCase","params","concat","paramCounts","scanSegment","cmdCode","is_arc","comma_found","need_params","isCommand","l","r","q","z","svgPath","segments","options","static","WIDGET_GLOBAL_ID","border","zIndex","html","setCoords","setHTML","reanimate","_addWidgetToDB","destroy","_delWidgetFromDB","undoStack","redoStack","isRecording","emitChange","recordHistory","undo","current","pop","prev","redo","entry","canUndo","canRedo","message","Ellipse","rx","ry","ax","epsilon","torad","PI","cos","sin","ma","J","K","D","JK","sqrt","L","l1","l2","atan","isDegenerate","WorkspaceCoords","super","theme","grid","_camera","_root","_backgroundRect","noRedraw","controller","_widgetDB","_ctxMenu","_commentDB","history","recordHistoryRecord","_didMove","moveListeners","dragState","wsTop","addTo","RClass","resolve","rendererOverrides","themeKey","Controller","controls","wasd","resolveController","initUndoRedo","_initBackground","setTheme","structuredClone","updateStyles","didMove","setDragState","currentX","currentY","isDragging","lastX","lastY","deltaX","deltaY","beginDrag","updateDrag","endDrag","fireMoveListeners","addMoveListener","listener","removeMoveListener","toggleHistory","untoggleHistory","console","error","_updateBackgroundTransform","updateTransform","cloneNode","nodeSvg","fromNode","wdgt","newWidget","getWidget","getContentSize","getSize","refresh","drawAllNodes","nodeId","workX","workY","screenX","screenY","addNode","warn","newNode","derefNode","disconnectTo","ConnectableField","disconnect","next","disconnectFrom","removeNodeById","removeNode","pan","dy","addComment","model","redrawComments","removeComment","commentOrId","json","recordBigEvent","entries","circular","deserialize","topLevel","serialize","startsWith","split","parseInt","trim","isArray","halfW","points","step","sides","angle","cx","cy","rotate","Matrix","operations","matrix","scale","translate","skewX","skewY","CMD_SPLIT_RE","PARAMS_SPLIT_RE","transformString","item","moveSpeed","doAccelerate","accelSpeed","friction","velocity","zoomSpeed","minZoom","maxZoom","isFalloff","wasdSmooth","wasdAccelerate","wasdFriction","onWheel","bind","passive","canMove","update","inputX","inputY","keysDown","_throttledFireDidMove","refreshPos","newZoom","mouseX","mouseY","wsMouse","setZoom","weights","loadedFonts","linkId","getElementById","link","rel","weightsParam","href","head","fontPromises","fonts","load","promise","Promise","all","then","handleClick","xMark","pair","midX","midY","center","editable","connectionBubble","canEditConnector","setEditable","val","canEdit","setName","Boolean","getName","setLabel","fieldVisualInfo","setValue","deep","alreadyProcessed","_deserialize","setTo","String","fldType","setFieldType","fld_type","DropdownField","_selected","_isOpen","toggle","toggleDropdown","click","getOwner","closeDropdown","openDropdown","items","option","onSelect","original","hideIfOwner","getSelected","setOptions","RendererCls","optName","list","keys","input","pattern","spacing","dotSize","defs","findOne","patternUnits","resize","scaledSpacing","scaledDot","cam","patternTransform","updateOptions","newOpts","xBtnGroup","onClick","combine","m1","m2","queue","cache","tx","ty","sx","sy","rad","tan","toArray","calc","isRelative","mouseBtns","mousePos","lastMousePos","wheelDelta","movedListeners","_lastMoveFire","_moveThrottleMs","_queuedMove","_moveTimeout","_updateInt","_setupListeners","setInterval","fireDidMove","queueMicrotask","performance","wait","setTimeout","window","button","setCamera","pos","centerOn","wsSize","stop","clearInterval","log","ApolloRenderer","ElEMENT_TAG","dogear","SHAPES","Dogear","cutW","Width","Height","drawDogEar","pathDef","PathMain","dogEar","front","drawPrimaryConnector","CONNECTOR_COLOR","textBBox","paddedWidth","styles","appendStyles","css","styleEl","removeStyles","hasStyles","kabelStyles","querySelector","contains","msg","wrn","info","proto","isNode","process","versions","isWebWorker","self","importScripts","_fieldColumn","getCommentText","setCommentText","getFieldByName","fld","getField","getFieldValue","getFieldDisplayValue","emit","INITING","removed","REMOVING","hasCategoryStyle","getCategoryName","getStyle","_appendFieldItem","jsonInit","primaryColor","secondaryColor","tertiaryColor","applyJsonArguments","FieldConstructor","appendConnection","appendNumber","appendText","appendOptLink","setCategoryName","setStyle","setColor","setLabelText","setConnection","prevOrNext","stringed","cast","other","newField","FieldCls","_serializeConnection","returned","connected","fieldNode","serialized","flat","processNode","copy","prevNode","nextNode","allNodes","explicit","fldData","setFrom","refId","maybe","ContextOptsRegistry","registerOption","opt","onHoverStart","onHoverEnd","showFor","unregisterOption","confirm","widget","classList","fn","k","scroll","blur","focus","visibilitychange","pointerlockchange","beforeunload","event","handleEvent","listeners","handler","payload","once","wrapper","wsOptions","_flyout","_contents","_categories","getOptions","contents","initCategoryToolbox","initFlyoutToolbox","applyStyles","cData","mainws","draggableStore","onMouseDown","onMouseMove","onMouseUp","ondrag","movementX","movementY","mouseWS","newX","newY","onmove","enddrag","dragTarget","frames","callback","count","requestAnimationFrame","DropdownContainer","owner","rootEl","constraint","offset","currentRemoveListener","updatePosition","setContent","groupRect","scrollX","scrollY","onclick","isVisible","getCurrent","dropdownContainer","onPointerDown","pointerWS","startRelX","startRelY","onPointerMove","onPointerUp","Eventer","elements","eventRegistry","setupFn","tags","tagList","reg","tag","destroyed","destroyFn","types","typeList","setupElement","destroyElement","Function","eventer","unit_vector_angle","ux","uy","vx","vy","dot","acos","approximate_unit_arc","theta1","delta_theta","alpha","x1","y1","x2","y2","TAU","fa","fs","phi","sin_phi","cos_phi","x1p","y1p","lambda","cc","rx_sq","ry_sq","x1p_sq","y1p_sq","radicant","cxp","cyp","v1x","v1y","v2x","v2y","get_arc_center","curve","xp","yp","NodePrototypes","default","clone","distanceTo","toObject","PADDING_BIG","PADDING_MEDIUM","PADDING_SMALL","CONNECTION_STROKE_WIDTH","CONNECTION_STROKE_COLOR_CHOICE","ZOOM_BASE","SvgPath","pstate","pathParse","__stack","transformParse","a2c","ellipse","src","sgm","__matrix","iterate","__evaluateStack","prevCmd","cmdSkipped","segment","degrees","round","contourStartDeltaX","contourStartDeltaY","toFixed","iterator","keepLazyStack","j","newSegments","replacements","needReplace","countourStartX","countourStartY","nameUC","toUpperCase","nameLC","unarc","new_segments","nextX","nextY","unshort","prevControlX","prevControlY","prevSegment","curControlX","curControlY","cState","one","two","isPrev","removeClass","connA","connB","_rowDiv","_toolbox","_makeDiv","btn","stopPropagation","setDisabled","disabled","toJSON","svgState","getConstant","moveTo","setScale","applyTransform","highlight","prevFrom","source","isolate","ApolloConstants","rectHeight","caretX","repNode","removeProperty","initListeners","renderOptions","HTMLElement","SVGSVGElement","elementFromPoint","hasAttribute","getAttribute","dta","parse","parentElement","outline","registerMethods","_name","addMethodNames","getOwnPropertyNames","methods$1","getMethodsFor","_names","names","array","block","il","radians","unCamelCase","capitalize","charAt","proportionalSize","getOrigin","o","origin","ox","originX","oy","originY","condX","condY","registerWindow","win","doc","globals","saveWindow","save","restoreWindow","getWindow","create","ns","createElementNS","makeInstance","isHTML","Base","adopter","firstChild","removeChild","nodeOrNew","Node","ownerDocument","defaultView","adopt","instance","nodeName","Fragment","asRoot","getClass","eid","did","assignNewId","extend","modules","methods","wrapWithAttrCheck","apply","componentHex","component","integer","is","object","space","hueToRgb","closeEnough","parser","cssText","documentElement","isNulledBox","getBox","getBBoxFn","retry","baseFind","query","List","querySelectorAll","getEvents","getEventHolder","windowEvents","getEventTarget","clearEvents","binding","bag","delimiter","_svgjsListenerId","listenerId","namespace","dispatch","Event","CustomEvent","detail","cancelable","dispatchEvent","noop","x$3","y$3","cx$1","cy$1","width$2","SVGNumber","divide","height$2","_element","fx","fy","makeSetterGetter","recalculate","duration","_duration","overshoot","_overshoot","pi","os","zeta","wn","segmentComplete","segmentParameters","startNewSegment","token","inNumber","finalizeNumber","pathLetter","isPathLetter","test","lastCommand","small","isSmall","inSegment","number","pointSeen","hasExponent","absolute","command","pathHandlers","p0","makeAbsolut","isArcFlag","isArc","isExponential","lastToken","registerMorphableType","morphableTypes","makeMorphable","Morphable","fromArray","arr","toConsumable","morph","stepper","context","mergeTransforms","netTransform","_transformationRunners","runners","getRunnerTransform","reduce","lmultiply","merge","_frameId","descriptiveElements","isDescriptive","writeDataToDom","defaults","cloned","valueOf","removeAttribute","utils","__proto__","xmlns","xlink","namespaces","siblings","forward","backward","before","after","insertAfter","numberAndUnit","rgb","reference","transforms","whitespace","isHex","isRgb","isBlank","isNumber","isImage","regex","toggleClass","ret","cased","getPropertyValue","setProperty","attributes","remember","memory","forget","_memory","Color","inputs","isColor","mode","grey","cmyk","_a","_b","_c","hsl","isGrey","delta","_d","getParameters","noWhitespace","exec","hexParse","substring","sixDigitHex","components","lab","xyz","lch","atan2","dToR","yL","xL","zL","ct","mx","nm","rU","gU","bU","pow","bd","toHex","_clamped","toRgb","rV","gV","bV","r255","g255","b255","rL","gL","bL","xU","yU","zU","Point","transformO","isMatrixLike","formatTransforms","flipBoth","flip","flipX","flipY","skew","isFinite","scaleX","scaleY","shear","theta","around","px","positionX","NaN","py","positionY","relative","relativeX","relativeY","matrixMultiply","aroundO","translateO","lmultiplyO","decompose","determinant","ccw","thetaRad","st","lam","equals","comp","axis","flipO","scaleO","Element","matrixify","inverse","inverseO","det","na","nb","nc","nd","ne","nf","multiply","multiplyO","rotateO","shearO","lx","skewO","ly","transformer","Box","addOffset","pageXOffset","pageYOffset","isNulled","xMin","Infinity","xMax","yMin","yMax","viewbox","level","point","clientWidth","clientHeight","zoomX","zoomY","zoomAmount","MAX_SAFE_INTEGER","each","fnOrMethodName","reserved","attrs","EventTarget","defaultPrevented","fire","timeline","ease","delay","SVGArray","toSet","convert","unit","isNaN","minus","plus","times","colorAttributes","hooks","Dom","removeNamespace","SVGElement","put","hasChildNodes","lastChild","assignNewIds","nodeClone","first","htmlOrFn","outerHTML","xml","last","matches","selector","matcher","matchesSelector","msMatchesSelector","mozMatchesSelector","webkitMatchesSelector","oMatchesSelector","putIn","removeElement","replaceChild","precision","factor","svgOrFn","outerSVG","words","wrap","xmlOrFn","outerXML","_this","well","fragment","createDocumentFragment","firstElementChild","nodeValue","curr","_val","hook","setAttributeNS","rebuild","dom","setData","dmove","parents","until","isSelector","rbox","screenCTM","inside","ctm","getCTM","isRoot","sugar","prefix","extension","mat","direction","getTotalLength","pointAt","getPointAtLength","untransform","str","kv","reverse","toParent","pCtm","toRoot","decomposed","Container","flatten","ungroup","Defs","Shape","circled","gradiented","Gradient","targets","url","gradient","Pattern","Image","img","image","PointArray","maxX","maxY","minX","minY","toLine","pointed","MorphArray","Line","plot","Marker","orient","ref","marker","easing","bezier","steps","stepPosition","jumps","beforeFlag","jumping","Stepper","done","Ease","dt","Spring","acceleration","newPosition","PID","windup","integral","_windup","P","I","M","H","V","C","S","Q","T","A","Z","mlhvqtcsaz","jl","pathDelimiters","PathArray","toAbsolute","pathParser","arrayToString","getClassForType","NonMorphable","ObjectBag","_stepper","_from","_to","_type","_context","_morphObj","at","_set","align","TransformBag","sortByKey","defaultObject","toDelete","objOrArr","Type","sort","shift","num","_array","poly","Polygon","polygon","Polyline","polyline","Rect","Queue","_first","_last","Animator","nextDraw","timeouts","immediates","timer","frame","run","_draw","timeout","time","immediate","cancelFrame","clearTimeout","cancelImmediate","nextTimeout","lastTimeout","nextFrame","lastFrame","nextImmediate","makeSchedule","runnerInfo","runner","defaultSource","Timeline","timeSource","_timeSource","terminate","active","_nextFrame","finish","getEndTimeOfTimeline","pause","getEndTime","lastRunnerInfo","getLastRunnerInfo","lastDuration","_time","endTimes","_runners","getRunnerInfoById","_lastRunnerId","_runnerIds","_paused","_continue","persist","dtOrForever","_persist","play","updateTime","yes","currentSpeed","speed","positive","schedule","when","absoluteStartTime","endTime","unschedule","seek","_speed","_lastSourceTime","immediateStep","_stepImmediate","_step","_stepFn","dtSource","dtTime","_lastStepTime","reset","runnersLeft","dtToStart","_startTime","_timeline","Runner","_queue","_isDeclarative","_history","enabled","_lastTime","_reseted","transformId","_haveReversed","_reverse","_loopsDone","_swing","_wait","_times","sanitise","swing","addTransform","animate","loop","clearTransform","clearTransformsFromQueue","isTransform","during","_prepareRunner","loops","loopDuration","loopsDone","partial","swinging","backwards","uncliped","swingForward","progress","initFn","runFn","retargetFn","initialiser","retarget","initialised","finished","running","_lastPosition","justStarted","justFinished","declarative","converged","_initialise","_run","needsIt","_rememberMorpher","method","morpher","caller","positionOrDt","allfinished","_tryRetarget","extra","FakeRunner","mergeWith","RunnerArray","ids","clearBefore","deleteCnt","edit","newRunner","getByID","lastRunner","by","_clearTransformRunnersBefore","currentRunner","_currentTransform","_addRunner","styleAttr","nameOrAttrs","newToAttrs","newKeys","differences","addedFromAttrs","oldFromAttrs","oldToAttrs","newLevel","newPoint","affine","isMatrix","currentAngle","startTransform","rTarget","rCurrent","possibilities","distances","shortest","affineParameters","newTransforms","_queueNumber","ay","_queueNumberDelta","newTo","_queueObject","amove","Svg","version","nested","Symbol","symbol","textable","_build","getComputedTextLength","plain","createTextNode","Text","_rebuild","blankLineOffset","getComputedStyle","newLined","firstLine","newLine","Tspan","Circle","ClipPath","unclip","clip","clipper","clipWith","ForeignObject","foreignObject","containerGeometry","G","unlink","linker","linkTo","Mask","unmask","masker","maskWith","Stop","Style","addText","rule","cssRule","fontface","TextPath","track","pathArray","textPath","importNodes","Use","use","file","mockAdopt","mock","withWindow","definition","enumerable","prop","toStringTag"],"sourceRoot":""}
1
+ {"version":3,"file":"kabel.js","mappings":"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","sources":["webpack://Kabel/webpack/universalModuleDefinition","webpack://Kabel/webpack/bootstrap","webpack://Kabel/./util/has-prop.ts","webpack://Kabel/./renderers/atlas/atlas.ts","webpack://Kabel/./util/user-state.ts","webpack://Kabel/./src/flyout.ts","webpack://Kabel/./src/core.ts","webpack://Kabel/./themes/default.ts","webpack://Kabel/./events/comment-input.ts","webpack://Kabel/./util/uid.ts","webpack://Kabel/./util/escape-html.ts","webpack://Kabel/./src/comment.ts","webpack://Kabel/./comment-renderer/renderer.ts","webpack://Kabel/./renderers/apollo/apollo.ts","webpack://Kabel/./renderers/renderer.ts","webpack://Kabel/./node_modules/svgpath/lib/path_parse.js","webpack://Kabel/./themes/themes.ts","webpack://Kabel/./util/unescape-html.ts","webpack://Kabel/./src/widget.ts","webpack://Kabel/./src/undo-redo.ts","webpack://Kabel/./src/inject-headless.ts","webpack://Kabel/./node_modules/svgpath/lib/ellipse.js","webpack://Kabel/./src/workspace-coords.ts","webpack://Kabel/./src/workspace-svg.ts","webpack://Kabel/./util/parse-color.ts","webpack://Kabel/./util/path.ts","webpack://Kabel/./node_modules/svgpath/lib/transform_parse.js","webpack://Kabel/./controllers/wasd.ts","webpack://Kabel/./src/fonts-manager.ts","webpack://Kabel/./events/connection-line.ts","webpack://Kabel/./src/field.ts","webpack://Kabel/./src/renderer-map.ts","webpack://Kabel/./src/grid.ts","webpack://Kabel/./events/node-x-btn.ts","webpack://Kabel/./src/colors.ts","webpack://Kabel/./node_modules/svgpath/lib/matrix.js","webpack://Kabel/./controllers/base.ts","webpack://Kabel/./renderers/apollo/renderer.ts","webpack://Kabel/./src/workspace.ts","webpack://Kabel/./util/styler.ts","webpack://Kabel/./src/inject.ts","webpack://Kabel/./src/headless-node.ts","webpack://Kabel/./util/env.ts","webpack://Kabel/./src/nodesvg.ts","webpack://Kabel/./src/ctx-menu-registry.ts","webpack://Kabel/./util/window-listeners.ts","webpack://Kabel/./util/emitter.ts","webpack://Kabel/./src/toolbox.ts","webpack://Kabel/./src/main-workspace.ts","webpack://Kabel/./events/draggable.ts","webpack://Kabel/./util/wait-anim-frames.ts","webpack://Kabel/./src/prototypes.ts","webpack://Kabel/./src/dropdown-menu.ts","webpack://Kabel/./src/widget-prototypes.ts","webpack://Kabel/./events/comment-drag-handle.ts","webpack://Kabel/./util/eventer.ts","webpack://Kabel/./node_modules/svgpath/lib/a2c.js","webpack://Kabel/./node_modules/svgpath/index.js","webpack://Kabel/./src/index.ts","webpack://Kabel/./src/coordinates.ts","webpack://Kabel/./renderers/constants.ts","webpack://Kabel/./node_modules/svgpath/lib/svgpath.js","webpack://Kabel/./src/styles.css","webpack://Kabel/./events/connector.ts","webpack://Kabel/./src/category.ts","webpack://Kabel/./renderers/representer-node.ts","webpack://Kabel/./src/connection.ts","webpack://Kabel/./renderers/apollo/constants.ts","webpack://Kabel/./events/input-box.ts","webpack://Kabel/./renderers/representer.ts","webpack://Kabel/./src/context-menu.ts","webpack://Kabel/./themes/dark.ts","webpack://Kabel/./node_modules/@svgdotjs/svg.js/dist/svg.node.cjs","webpack://Kabel/./events/events.ts","webpack://Kabel/webpack/runtime/define property getters","webpack://Kabel/webpack/runtime/hasOwnProperty shorthand","webpack://Kabel/webpack/runtime/make namespace object","webpack://Kabel/webpack/startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Kabel\"] = factory();\n\telse\n\t\troot[\"Kabel\"] = factory();\n})(this, () => {\nreturn ","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","\r\nexport default function hasProp(obj: object, name: string) {\r\n return Object.prototype.hasOwnProperty.call(obj, name)\r\n}","import RendererConstants from \"../constants\";\r\nimport Renderer from \"../renderer\";\r\nimport Representer from \"../representer\";\r\nimport { RepresenterNode } from \"../representer-node\";\r\n\r\n\r\n\r\n\r\n\r\nexport {\r\n Renderer,\r\n RendererConstants as Constants,\r\n Representer,\r\n RepresenterNode\r\n}","type StateChangeCallback = (addedOrRemoved: 0 | 1) => void;\r\n\r\nclass UserState {\r\n private state: Set<string>;\r\n private callbacks: Map<string, StateChangeCallback[]>;\r\n /**\r\n * Stores the user's current UIX state\r\n * Ex: 'typing'\r\n */\r\n constructor() {\r\n this.state = new Set();\r\n this.callbacks = new Map();\r\n }\r\n\r\n /** \r\n * Adds a state\r\n * @param name - The name of the state (ex: 'typing')\r\n */\r\n setState(name: string) {\r\n const wasPresent = this.state.has(name);\r\n if (!wasPresent) {\r\n this.state.add(name);\r\n this.triggerCallbacks(name, 1);\r\n }\r\n }\r\n\r\n /** \r\n * Removes a state\r\n * @param name - The name of the state (ex: 'typing')\r\n */\r\n removeState(name: string) {\r\n const wasPresent = this.state.has(name);\r\n if (wasPresent) {\r\n this.state.delete(name);\r\n this.triggerCallbacks(name, 0);\r\n }\r\n }\r\n\r\n /** \r\n * Checks if a state is active\r\n * @param name - The name of the state (ex: 'typing')\r\n */\r\n hasState(name: string) {\r\n return this.state.has(name);\r\n }\r\n\r\n /** \r\n * Registers a callback for state changes \r\n * @param name - Name of the state to check changes for.\r\n * @param cb - Callback to call on state change.\r\n */\r\n onStateChange(name: string, cb: StateChangeCallback) {\r\n if (!this.callbacks.has(name)) this.callbacks.set(name, []);\r\n this.callbacks.get(name)!.push(cb);\r\n }\r\n\r\n /** Internal: triggers callbacks for a state */\r\n private triggerCallbacks(name: string, addedOrRemoved: 0 | 1) {\r\n const cbs = this.callbacks.get(name);\r\n if (!cbs) return;\r\n for (const cb of cbs) cb(addedOrRemoved);\r\n }\r\n}\r\nconst userState = new UserState();\r\nexport default userState;\r\nexport {\r\n UserState\r\n};","import newHeadlessNode from \"./headless-node\";\r\nimport { TblxNodeStruct } from \"./inject\";\r\nimport Toolbox from \"./toolbox\";\r\nimport { parseColor } from \"../util/parse-color\";\r\nimport { Color } from \"./visual-types\";\r\n\r\n/**\r\n * Represents a flyout menu for a toolbox in Kabel.\r\n * Displays a list of nodes that can be dragged into a workspace.\r\n */\r\nclass Flyout {\r\n\tcontainer: HTMLDivElement;\r\n\tvisible: boolean;\r\n\ttoolbox?: Toolbox|undefined;\r\n\r\n\tconstructor(toolbox?: Toolbox) {\r\n\t\tthis.toolbox = toolbox;\r\n\r\n\t\tthis.container = document.createElement(\"div\");\r\n\t\tthis.container.className = \"KabelFlyout\";\r\n\r\n\t\tthis.visible = false;\r\n\r\n\t\tif (toolbox) {\r\n\t\t\ttoolbox.workspace._wsTop.appendChild(this.container);\r\n\t\t} else {\r\n\t\t\tdocument.body.appendChild(this.container);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Populates the flyout with a list of nodes.\r\n\t */\r\n\tfill(nodes: TblxNodeStruct[]) {\r\n\t\tthis.clear();\r\n\t\tnodes.forEach(node => {\r\n\t\t\tconst headlessNode = newHeadlessNode(node.type as string);\r\n\t\t\tif (!headlessNode) return;\r\n\r\n\t\t\tconst nodeEl = this.createNodeElement(headlessNode);\r\n\t\t\tthis.container.appendChild(nodeEl);\r\n\t\t});\r\n\r\n\t\tthis.show();\r\n\t}\r\n\r\n\t/**\r\n\t * Creates a DOM element for a node with event listeners attached.\r\n\t */\r\n\tprivate createNodeElement(headlessNode: any): HTMLDivElement {\r\n\t\tconst nodeEl = document.createElement(\"div\");\r\n\t\tnodeEl.className = \"KabelFlyoutNode\";\r\n\t\tnodeEl.textContent = headlessNode.labelText;\r\n\r\n\t\tthis.applyNodeStyles(nodeEl, headlessNode.colors.primary);\r\n\r\n\t\tnodeEl.addEventListener(\"mousedown\", e => this.onNodeMouseDown(e, headlessNode));\r\n\t\treturn nodeEl;\r\n\t}\r\n\r\n\t/**\r\n\t * Applies consistent styling to a node element.\r\n\t */\r\n\tprivate applyNodeStyles(el: HTMLElement, bgColor: Color) {\r\n\t\tel.style.backgroundColor = parseColor(bgColor);\r\n\t\tel.style.padding = \"4px 8px\";\r\n\t\tel.style.cursor = \"pointer\";\r\n\r\n\t\tif (this.toolbox?.workspace?.renderer?.constants) {\r\n\t\t\tconst c = this.toolbox.workspace.renderer.constants;\r\n\t\t\tel.style.fontFamily = c.FONT_FAMILY;\r\n\t\t\tel.style.fontSize = `${c.FONT_SIZE}px`;\r\n\t\t\tel.style.color = parseColor(c.FONT_COLOR);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handles starting a drag operation for a node.\r\n\t */\r\n\tprivate onNodeMouseDown(e: MouseEvent, headlessNode: any) {\r\n\t\tif (!this.toolbox) return;\r\n\r\n\t\tconst ghostEl = this.createGhostNode(headlessNode);\r\n\t\tdocument.body.appendChild(ghostEl);\r\n\r\n\t\tconst moveGhost = (ev: MouseEvent) => {\r\n\t\t\tghostEl.style.left = ev.clientX + 4 + \"px\";\r\n\t\t\tghostEl.style.top = ev.clientY + 4 + \"px\";\r\n\t\t};\r\n\r\n\t\tconst releaseGhost = (ev: MouseEvent) => {\r\n\t\t\tdocument.removeEventListener(\"mousemove\", moveGhost);\r\n\t\t\tdocument.removeEventListener(\"mouseup\", releaseGhost);\r\n\r\n\t\t\tthis.dropNode(ev, headlessNode);\r\n\r\n\t\t\tghostEl.remove();\r\n\t\t};\r\n\r\n\t\tdocument.addEventListener(\"mousemove\", moveGhost);\r\n\t\tdocument.addEventListener(\"mouseup\", releaseGhost);\r\n\r\n\t\te.preventDefault();\r\n\t}\r\n\r\n\t/**\r\n\t * Creates a ghost element that follows the mouse during drag.\r\n\t */\r\n\tprivate createGhostNode(headlessNode: any): HTMLDivElement {\r\n\t\tconst ghostEl = document.createElement(\"div\");\r\n\t\tghostEl.className = \"KabelGhostNode\";\r\n\t\tghostEl.textContent = headlessNode.labelText;\r\n\t\tghostEl.style.position = \"absolute\";\r\n\t\tghostEl.style.pointerEvents = \"none\";\r\n\r\n\t\tthis.applyNodeStyles(ghostEl, headlessNode.colors.primary);\r\n\t\treturn ghostEl;\r\n\t}\r\n\r\n\t/**\r\n\t * Handles dropping a node into the workspace if the mouse is over it.\r\n\t */\r\n\tprivate dropNode(ev: MouseEvent, node: TblxNodeStruct) {\r\n\t\tif (!this.toolbox) return;\r\n\r\n\t\tconst svg = this.toolbox.workspace.svg.node as SVGSVGElement;\r\n\t\tconst rect = svg.getBoundingClientRect();\r\n\r\n\t\tif (\r\n\t\t\tev.clientX >= rect.left &&\r\n\t\t\tev.clientX <= rect.right &&\r\n\t\t\tev.clientY >= rect.top &&\r\n\t\t\tev.clientY <= rect.bottom\r\n\t\t) {\r\n\t\t\tconst { x: wsX, y: wsY } = this.toolbox.workspace.screenToWorkspace(\r\n\t\t\t\tev.clientX - rect.left,\r\n\t\t\t\tev.clientY - rect.top\r\n\t\t\t);\r\n\r\n\t\t\tconst nodews = this.toolbox.workspace.spawnAt(node.type as string, wsX, wsY);\r\n\t\t\tif (nodews) {\r\n\t\t\t\tfor (let argName in node.arguments) {\r\n\t\t\t\t\tnodews.setFieldValue(argName, node.arguments[argName]);\r\n\t\t\t\t}\r\n\t\t\t\tthis.toolbox.workspace.drawNode(nodews.id);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tshow() {\r\n\t\tthis.container.style.display = \"block\";\r\n\t\tthis.visible = true;\r\n\t}\r\n\r\n\thide() {\r\n\t\tthis.container.style.display = \"none\";\r\n\t\tthis.visible = false;\r\n\t}\r\n\r\n\tclear() {\r\n\t\tthis.container.innerHTML = \"\";\r\n\t}\r\n}\r\n\r\nexport default Flyout;\r\n","import RendererConstants from '../renderers/constants'\r\nimport Renderer from '../renderers/renderer'\r\nimport CategoryColors from './colors'\r\nimport Connection, { Connectable } from './connection'\r\nimport Coordinates from './coordinates'\r\nimport Field, {\r\n FieldOptions,\r\n FieldVisualInfo,\r\n AnyFieldCls,\r\n AnyField,\r\n DummyField,\r\n FieldMap,\r\n NumberField,\r\n OptConnectField,\r\n TextField\r\n} from './field'\r\nimport inject, { InjectMsg, InjectOptions } from './inject'\r\nimport {\r\n clearMainWorkspace,\r\n getMainWorkspace,\r\n setMainWorkspace\r\n} from './main-workspace'\r\nimport NodeSvg, { NodeJson, NodeEvents, InputFieldJson } from './nodesvg'\r\nimport NodePrototypes from './prototypes'\r\nimport WorkspaceSvg from './workspace-svg'\r\nimport { NodePrototype } from './node-types'\r\nimport {\r\n Color,\r\n ColorStyle,\r\n Hex,\r\n RGBObject,\r\n RGBString,\r\n RGBTuple\r\n} from './visual-types'\r\nimport { parseColor } from '../util/parse-color'\r\nimport eventer, { Eventer } from '../util/eventer'\r\nimport * as Path from '../util/path'\r\nimport * as SVG from '@svgdotjs/svg.js'\r\nimport * as UID from '../util/uid'\r\nimport hasProp from '../util/has-prop'\r\nimport EventEmitter from '../util/emitter'\r\nimport userState from '../util/user-state'\r\nimport '../events/events'\r\nimport WorkspaceController from '../controllers/base'\r\nimport WASDController from '../controllers/wasd'\r\nimport { RMap, RendererMap } from './renderer-map'\r\nimport styler, { Styler } from '../util/styler'\r\nimport WidgetPrototypes from './widget-prototypes'\r\nimport Widget from './widget'\r\nimport ContextOptsRegistry, { ContextMenu } from './ctx-menu-registry'\r\nimport { Showable } from './context-menu'\r\nimport escapeAttr from '../util/escape-html'\r\nimport unescapeAttr from '../util/unescape-html'\r\nimport waitFrames from '../util/wait-anim-frames'\r\nimport CommentModel from './comment'\r\nimport CommentRenderer from '../comment-renderer/renderer'\r\nimport dropdownContainer from './dropdown-menu'\r\nimport Representer from '../renderers/representer'\r\nimport { RepresenterNode } from '../renderers/representer-node'\r\nimport windowListeners, { addWindowListener, clearWindowListeners, removeWindowListener } from '../util/window-listeners'\r\nimport * as FontManager from './fonts-manager';\r\nimport env from \"../util/env\";\r\nimport Workspace from './workspace'\r\nimport injectHeadless from './inject-headless'\r\nimport createHeadlessNode from './headless-node';\r\nimport * as apollo from '../renderers/apollo/apollo';\r\nimport * as atlas from '../renderers/atlas/atlas';\r\nimport KabelWSTheme from '../themes/default'\r\nimport KabelDarkTheme from '../themes/dark'\r\n/** Register default renderers. */\r\nRendererMap['default'] = atlas.Renderer;\r\nRendererMap[atlas.Renderer.NAME] = atlas.Renderer;\r\nRendererMap[apollo.Renderer.NAME] = apollo.Renderer;\r\n\r\nif (env.isBrowser) {\r\n // Use FontsManager to load default Kabel fonts.\r\n FontManager.loadGoogleFont('Fredoka');\r\n}\r\n/**\r\n * Utility method to register a field globally by name\r\n * @param name - Field identifier\r\n * @param cls - Class constructor for the field\r\n */\r\nField.register = function (name: string, cls: Function) {\r\n FieldMap[name] = cls as AnyFieldCls\r\n}\r\n\r\n/**\r\n * Utility method to unregister a field globally by name\r\n * @param name - Field identifier\r\n */\r\nField.unregister = function (name: string) {\r\n delete FieldMap[name]\r\n}\r\n\r\n/**\r\n * Central Kabel object exposing all main modules, utilities, and defaults\r\n */\r\nconst Kabel = {\r\n env, // Environment information\r\n UIX: { // User experience enhancing utilities.\r\n /** Event manager, loads events from '../events' and lets us attach them to svg.js elements to give them behavior that's seperated from the renderer. */\r\n events: eventer as Eventer,\r\n /** Font manager, used to load fonts. */\r\n FontManager,\r\n /** * State Manager, Makes things possible: E.G (the 'typing' state when you type in a input box..) * Used in controllers so you dont move when typing characters like a w s or d etc. */\r\n userState,\r\n /** Window listeners manager */\r\n windowListeners: {\r\n addWindowListener,\r\n removeWindowListener,\r\n clearWindowListeners,\r\n windowListeners\r\n }\r\n },\r\n Themes: {\r\n Classic: KabelWSTheme,\r\n Dark: KabelDarkTheme\r\n },\r\n /** Context menu manager */\r\n ContextMenu,\r\n /**\r\n * Utility methods and constants for various purposes.\r\n * @property Path - Utility methods for handling SVG paths.\r\n * @property waitFrames - Utility method to wait for a certain number of animation frames.\r\n */\r\n Utils: {\r\n Path,\r\n waitFrames,\r\n SVG, // Re-exporting svg.js for convenience\r\n parseColor,\r\n UID,\r\n EventEmitter,\r\n hasProp,\r\n styler,\r\n Styler,\r\n escapeHTML: escapeAttr,\r\n unescapeHTML: unescapeAttr\r\n },\r\n Widget,\r\n CategoryColors,\r\n Connection,\r\n Coordinates,\r\n Field,\r\n DummyField,\r\n FieldMap,\r\n NumberField,\r\n OptConnectField,\r\n TextField,\r\n inject,\r\n injectHeadless,\r\n createHeadlessNode,\r\n InjectMsg,\r\n clearMainWorkspace,\r\n getMainWorkspace,\r\n setMainWorkspace,\r\n NodeSvg,\r\n Nodes: NodePrototypes,\r\n Widgets: WidgetPrototypes,\r\n WorkspaceSvg,\r\n Workspace,\r\n WorkspaceController,\r\n WASDController,\r\n nodeRendering: {\r\n SVG: SVG, // also re-export svg.js here for easier access in renderers\r\n rendererMap: RMap,\r\n Apollo: apollo,\r\n Atlas: atlas,\r\n Renderer: Renderer,\r\n RendererConstants: RendererConstants,\r\n Representer: Representer,\r\n RepresenterNode: RepresenterNode\r\n },\r\n atlas,\r\n apollo,\r\n commentRendering: { CommentModel, CommentRenderer },\r\n Dropdown: dropdownContainer\r\n}\r\n\r\n/**\r\n * Provides a getter/setter for the main workspace\r\n * @property _mainWorkspace - Get or set the currently active workspace\r\n */\r\nObject.defineProperty(Kabel, '_mainWorkspace', {\r\n get(): WorkspaceSvg | Workspace | null {\r\n return getMainWorkspace()\r\n },\r\n set(v: WorkspaceSvg | Workspace | undefined | null | false | 0 | string) {\r\n if (\r\n v === undefined ||\r\n v === null ||\r\n v === false ||\r\n v === 0 ||\r\n typeof v === 'string'\r\n ) {\r\n return clearMainWorkspace()\r\n }\r\n return setMainWorkspace(v)\r\n }\r\n})\r\n\r\nexport default Kabel\r\n","import type {WSTheme} from '../src/workspace-svg'\r\n\r\n\r\n\r\nconst KabelWSTheme: WSTheme = {\r\n\tUIStyles: {\r\n workspaceBGColor: '#ffffff',\r\n\t\ttoolboxCategoriesBG: {\r\n\t\t\tposition: 'absolute',\r\n\t\t\tleft: '0',\r\n\t\t\ttop: '0',\r\n\t\t\twidth: '20%',\r\n\t\t\theight: '100%',\r\n\t\t\tbackground: 'rgba(240,240,240,0.9)',\r\n\t\t\toverflowY: 'auto',\r\n\t\t},\r\n\t\ttoolboxFlyoutBG: {\r\n\t\t\tbackground: 'rgba(240,240,240,0.9)', // reuse same neutral bg\r\n\t\t\toverflowY: 'auto',\r\n\t\t\tpadding: '4px', // like nodes padding\r\n\t\t\tborderRadius: '4px',\r\n\t\t\tboxShadow: '0 2px 6px rgba(0,0,0,0.15)',\r\n\t\t},\r\n\t},\r\n};\r\n\r\nexport default KabelWSTheme;","import { Element as SvgElement, Rect as SvgRect, Text as SvgText } from \"@svgdotjs/svg.js\";\r\nimport CommentModel from \"../src/comment\";\r\nimport eventer, { EventSetupFn } from \"../util/eventer\";\r\nimport userState from '../util/user-state';\r\nimport Renderer from \"../comment-renderer/renderer\"\r\n\r\ntype InitArgs = {\r\n comment: CommentModel;\r\n text: SvgText;\r\n renderer: Renderer;\r\n};\r\n\r\nfunction initCommentInput(element: SvgElement, rawArgs: any) {\r\n const args = rawArgs as InitArgs;\r\n const comment = args.comment;\r\n const txt = args.text as SvgText;\r\n const rect = element as unknown as SvgRect;\r\n const renderer = args.renderer;\r\n\r\n let editing = false;\r\n let skipNextClick = false;\r\n let buffer = comment.getText() ?? \"\";\r\n let cursorPos = buffer.length;\r\n let anchorPos = buffer.length;\r\n\r\n const PADDING_X = 4;\r\n const PADDING_Y = 4;\r\n\r\n function getSelectionRange() {\r\n const start = Math.min(cursorPos, anchorPos);\r\n const end = Math.max(cursorPos, anchorPos);\r\n return { start, end };\r\n }\r\n\r\n function hasSelection() {\r\n return cursorPos !== anchorPos;\r\n }\r\n\r\n function deleteSelection() {\r\n if (!hasSelection()) return false;\r\n const { start, end } = getSelectionRange();\r\n buffer = buffer.slice(0, start) + buffer.slice(end);\r\n cursorPos = start;\r\n anchorPos = start;\r\n return true;\r\n }\r\n\r\n function encodeForSvg(s: string) {\r\n return s.replace(/ /g, \"\\u00A0\").replace(/\\n/g, \"&#10;\");\r\n }\r\n\r\n function ensureTspansPreserve(node: Element) {\r\n Array.from(node.childNodes).forEach((child) => {\r\n if (child.nodeType === 1) (child as Element).setAttribute(\"xml:space\", \"preserve\");\r\n });\r\n }\r\n\r\n let caretLine: SvgRect | null = null;\r\n let selectionRect: SvgRect | null = null;\r\n\r\n // --- MEASURE TEXT WIDTH USING COMMENT RENDERER ---\r\n function measureTextWidth(text: string, fontSize?: number, fontFamily?: string) {\r\n // Delegate to renderer’s measureTextBbox logic\r\n const tempText = renderer.getSvg().text(text).font({ size: fontSize || 12, family: fontFamily || \"Arial\" });\r\n const bbox = renderer.measureTextBbox(tempText);\r\n tempText.remove();\r\n return bbox.width;\r\n }\r\n\r\n function updateText() {\r\n const { start, end } = getSelectionRange();\r\n const hasSel = hasSelection();\r\n\r\n // redraw main text\r\n txt.clear().tspan(encodeForSvg(buffer));\r\n txt.attr({ \"xml:space\": \"preserve\" });\r\n try { ensureTspansPreserve(txt.node as Element); } catch { }\r\n txt.leading(1.2);\r\n\r\n // --- selection highlight ---\r\n if (hasSel) {\r\n const fontSize = parseFloat(txt.attr('font-size') as string) || 14;\r\n const fontFamily = txt.attr('font-family') as string || 'Arial';\r\n\r\n const textBeforeStart = buffer.slice(0, start);\r\n const textBeforeEnd = buffer.slice(0, end);\r\n\r\n const bbox = txt.bbox();\r\n const highlightX = bbox.x + measureTextWidth(textBeforeStart, fontSize, fontFamily);\r\n const highlightWidth = Math.max(\r\n measureTextWidth(textBeforeEnd, fontSize, fontFamily) - measureTextWidth(textBeforeStart, fontSize, fontFamily),\r\n 1\r\n );\r\n const highlightY = bbox.y;\r\n const highlightH = bbox.height;\r\n\r\n if (!selectionRect) {\r\n //@ts-ignore\r\n selectionRect = rect!.parent()!.rect?.(highlightWidth, highlightH)\r\n .fill('#3390ff')\r\n .attr({ 'fill-opacity': 0.35 });\r\n selectionRect!.node.parentNode!.insertBefore(selectionRect!.node, txt.node);\r\n } else {\r\n selectionRect.size(highlightWidth, highlightH);\r\n }\r\n\r\n selectionRect!.move(highlightX, highlightY);\r\n } else {\r\n if (selectionRect) { selectionRect.remove(); selectionRect = null; }\r\n }\r\n\r\n // --- caret ---\r\n if (editing) {\r\n const fontSize = parseFloat(txt.attr('font-size') as string) || 14;\r\n const fontFamily = txt.attr('font-family') as string || 'Arial';\r\n const textBeforeCaret = buffer.slice(0, cursorPos);\r\n const caretXOffset = measureTextWidth(textBeforeCaret, fontSize, fontFamily);\r\n\r\n const bbox = txt.bbox();\r\n const caretY = bbox.y;\r\n const caretH = bbox.height;\r\n\r\n //@ts-ignore\r\n if (!caretLine) caretLine = rect.parent().rect(1, caretH).fill('#000');\r\n\r\n caretLine!.size(1, caretH).move(bbox.x + caretXOffset, caretY);\r\n } else {\r\n if (caretLine) { caretLine.remove(); caretLine = null; }\r\n }\r\n\r\n // --- resize background rect ---\r\n const bbox = txt.bbox();\r\n const handleRadius = 6;\r\n const textOffsetX = PADDING_X + handleRadius * 2 + 4;\r\n const rectW = Math.max(16, Math.ceil(bbox.width) + textOffsetX + PADDING_X);\r\n const rectH = Math.max(16, Math.ceil(bbox.height) + PADDING_Y * 2);\r\n rect.size(rectW, rectH);\r\n\r\n comment._tempInputBBox = {\r\n width: rectW,\r\n height: rectH,\r\n textX: textOffsetX,\r\n textY: PADDING_Y\r\n };\r\n }\r\n\r\n // --- editing lifecycle ---\r\n function startEditing(ev?: MouseEvent) {\r\n if (editing) return;\r\n editing = true;\r\n buffer = comment.getText() ?? \"\";\r\n cursorPos = buffer.length;\r\n anchorPos = buffer.length;\r\n\r\n userState.setState('typing');\r\n\r\n if (ev) {\r\n const rectBox = txt.node.getBoundingClientRect();\r\n //@ts-ignore\r\n const zoom = renderer.getWs().getZoom();\r\n const clickX = (ev.clientX - rectBox.left - PADDING_X) / zoom;\r\n\r\n let cumulativeWidth = 0;\r\n cursorPos = 0;\r\n for (let i = 0; i < buffer.length; i++) {\r\n const charWidth = measureTextWidth(buffer[i] as string);\r\n if (cumulativeWidth + charWidth / 2 >= clickX) break;\r\n cumulativeWidth += charWidth;\r\n cursorPos = i + 1;\r\n }\r\n }\r\n\r\n anchorPos = cursorPos;\r\n updateText();\r\n skipNextClick = true;\r\n\r\n document.addEventListener(\"keydown\", onKeyDown);\r\n document.addEventListener(\"mousedown\", onClickOutside);\r\n }\r\n\r\n function stopEditing(commit = true) {\r\n if (!editing) return;\r\n editing = false;\r\n userState.removeState(\"typing\");\r\n document.removeEventListener(\"keydown\", onKeyDown, { capture: true });\r\n document.removeEventListener(\"mousedown\", onClickOutside);\r\n\r\n if (commit) comment.setTextNoRedraw(buffer);\r\n updateText();\r\n comment.getWorkspace()?.redraw?.();\r\n }\r\n\r\n\r\n function onKeyDown(e: KeyboardEvent) {\r\n if (!editing) return;\r\n\r\n if (e.key === \"Escape\") { e.preventDefault(); stopEditing(false); return; }\r\n\r\n if (e.key === \"Enter\") {\r\n e.preventDefault();\r\n stopEditing(true);\r\n } else if (e.key === \"Backspace\") {\r\n e.preventDefault();\r\n if (hasSelection()) {\r\n deleteSelection();\r\n } else if (cursorPos > 0) {\r\n buffer = buffer.slice(0, cursorPos - 1) + buffer.slice(cursorPos);\r\n cursorPos--;\r\n anchorPos = cursorPos;\r\n }\r\n } else if (e.key === \"Delete\") {\r\n e.preventDefault();\r\n if (hasSelection()) {\r\n deleteSelection();\r\n } else if (cursorPos < buffer.length) {\r\n buffer = buffer.slice(0, cursorPos) + buffer.slice(cursorPos + 1);\r\n }\r\n }\r\n else if (e.key === \"ArrowLeft\") {\r\n e.preventDefault();\r\n if (e.shiftKey) {\r\n // extend selection left\r\n cursorPos = Math.max(0, cursorPos - 1);\r\n } else {\r\n // collapse selection and move\r\n cursorPos = Math.max(0, cursorPos - 1);\r\n anchorPos = cursorPos;\r\n }\r\n } else if (e.key === \"ArrowRight\") {\r\n e.preventDefault();\r\n if (e.shiftKey) {\r\n // extend selection right\r\n cursorPos = Math.min(buffer.length, cursorPos + 1);\r\n } else {\r\n // collapse selection and move\r\n cursorPos = Math.min(buffer.length, cursorPos + 1);\r\n anchorPos = cursorPos;\r\n }\r\n } else if (e.key === \"Home\") {\r\n e.preventDefault();\r\n if (e.shiftKey) {\r\n cursorPos = 0; // anchor unchanged\r\n } else {\r\n cursorPos = 0;\r\n anchorPos = cursorPos;\r\n }\r\n } else if (e.key === \"End\") {\r\n e.preventDefault();\r\n if (e.shiftKey) {\r\n cursorPos = buffer.length;\r\n } else {\r\n cursorPos = buffer.length;\r\n anchorPos = cursorPos;\r\n }\r\n } else if (e.key.length === 1 && !e.ctrlKey && !e.metaKey) {\r\n e.preventDefault();\r\n if (hasSelection()) deleteSelection();\r\n buffer = buffer.slice(0, cursorPos) + e.key + buffer.slice(cursorPos);\r\n cursorPos++;\r\n anchorPos = cursorPos;\r\n }\r\n\r\n updateText();\r\n comment.setTextNoRedraw(buffer);\r\n }\r\n\r\n function onClickOutside(ev: MouseEvent) {\r\n if (!editing) return;\r\n if (skipNextClick) { skipNextClick = false; return; }\r\n const targ = ev.target as Node;\r\n if (targ !== rect.node && targ !== txt.node) stopEditing(true);\r\n }\r\n\r\n const onRectDown = (ev: Event) => startEditing(ev as MouseEvent);\r\n const onTextDown = (ev: Event) => startEditing(ev as MouseEvent);\r\n\r\n rect.on(\"mousedown\", onRectDown as any);\r\n txt.on(\"mousedown\", onTextDown as any);\r\n\r\n updateText();\r\n\r\n return () => {\r\n rect.off(\"mousedown\", onRectDown as any);\r\n txt.off(\"mousedown\", onTextDown as any);\r\n document.removeEventListener(\"keydown\", onKeyDown, { capture: true });\r\n document.removeEventListener(\"mousedown\", onClickOutside);\r\n };\r\n}\r\n\r\neventer.registerEvent(\"k_commentinp\", initCommentInput as EventSetupFn);\r\nexport default initCommentInput;\r\n","// uid.ts\r\n\r\n/**\r\n * Strategy used to generate UIDs.\r\n */\r\nexport type UIDStrategy = \"uuidv4\" | \"ulid\" | \"nanoid\" | \"short\";\r\n\r\nexport interface UIDOptions {\r\n /** For \"nanoid\": length of the id (default 21) */\r\n size?: number;\r\n /** For \"nanoid\": custom alphabet (default URL-safe) */\r\n alphabet?: string;\r\n}\r\n\r\n/** Web Crypto shim (browser + Node 16+) */\r\nconst cryptoAPI: Crypto | null =\r\n (typeof globalThis !== \"undefined\" && (globalThis as any).crypto) || null;\r\n\r\n/**\r\n * Returns a Uint8Array of random bytes.\r\n * Uses Web Crypto if available; falls back to Math.random otherwise (not cryptographically secure).\r\n *\r\n * @param {number} len - Number of random bytes to generate.\r\n * @returns {Uint8Array} Random bytes array.\r\n */\r\nfunction randBytes(len: number): Uint8Array {\r\n if (cryptoAPI?.getRandomValues) {\r\n const buf = new Uint8Array(len);\r\n cryptoAPI.getRandomValues(buf);\r\n return buf;\r\n }\r\n // Last resort (very old envs). Not cryptographically strong.\r\n const buf = new Uint8Array(len);\r\n for (let i = 0; i < len; i++) buf[i] = Math.floor(Math.random() * 256);\r\n return buf;\r\n}\r\n\r\n/**\r\n * Generates an RFC4122-compliant UUID v4.\r\n * Uses `crypto.randomUUID` if available.\r\n *\r\n * @returns {string} UUID v4 string.\r\n */\r\nexport function uuidv4(): string {\r\n const g: any = globalThis as any;\r\n if (g?.crypto?.randomUUID) return g.crypto.randomUUID();\r\n\r\n const b = randBytes(16);\r\n // Per RFC: set version + variant bits\r\n // @ts-ignore\r\n b[6] = (b[6] & 0x0f) | 0x40;\r\n // @ts-ignore\r\n b[8] = (b[8] & 0x3f) | 0x80;\r\n\r\n const hex: string[] = [];\r\n for (let i = 0; i < 256; i++) hex.push(i.toString(16).padStart(2, \"0\"));\r\n\r\n return (\r\n // @ts-ignore\r\n hex[b[0]] + hex[b[1]] + hex[b[2]] + hex[b[3]] + \"-\" +\r\n // @ts-ignore\r\n hex[b[4]] + hex[b[5]] + \"-\" +\r\n // @ts-ignore\r\n hex[b[6]] + hex[b[7]] + \"-\" +\r\n // @ts-ignore\r\n hex[b[8]] + hex[b[9]] + \"-\" +\r\n // @ts-ignore\r\n hex[b[10]] + hex[b[11]] + hex[b[12]] + hex[b[13]] + hex[b[14]] + hex[b[15]]\r\n );\r\n}\r\n\r\n/** Crockford Base32 alphabet for ULID */\r\nconst CROCK32 = \"0123456789ABCDEFGHJKMNPQRSTVWXYZ\"; // no I L O U\r\n\r\n/**\r\n * Generates a 26-character ULID (time-sortable unique ID).\r\n *\r\n * @param {number} [date] - Optional timestamp in milliseconds. Defaults to `Date.now()`.\r\n * @returns {string} ULID string.\r\n */\r\nexport function ulid(date?: number): string {\r\n const time = (typeof date === \"number\" ? date : Date.now()) >>> 0; // low 32 bits\r\n const timeHi = Math.floor((typeof date === \"number\" ? date : Date.now()) / 0x100000000) >>> 0; // high 32\r\n // ULID uses 48-bit time; do base32 encode 48 bits\r\n const time48 = new Uint8Array(6);\r\n // write 48-bit big-endian\r\n let t = BigInt(typeof date === \"number\" ? date : Date.now());\r\n for (let i = 5; i >= 0; i--) {\r\n time48[i] = Number(t & 0xffn);\r\n t >>= 8n;\r\n }\r\n // first 10 chars = time\r\n let out = \"\";\r\n let acc = 0;\r\n let bits = 0;\r\n for (let i = 0; i < 6; i++) {\r\n // @ts-ignore\r\n acc = (acc << 8) | time48[i];\r\n bits += 8;\r\n while (bits >= 5) {\r\n bits -= 5;\r\n out += CROCK32[(acc >>> bits) & 31];\r\n }\r\n }\r\n if (bits > 0) out += CROCK32[(acc << (5 - bits)) & 31];\r\n out = out.slice(0, 10);\r\n\r\n // last 16 chars = randomness (80 bits)\r\n const rnd = randBytes(10);\r\n acc = 0; bits = 0;\r\n for (let i = 0; i < rnd.length; i++) {\r\n // @ts-ignore\r\n acc = (acc << 8) | rnd[i];\r\n bits += 8;\r\n while (bits >= 5) {\r\n bits -= 5;\r\n out += CROCK32[(acc >>> bits) & 31];\r\n }\r\n }\r\n if (bits > 0) out += CROCK32[(acc << (5 - bits)) & 31];\r\n\r\n return out.slice(0, 26);\r\n}\r\n\r\n/** NanoID-style: URL-safe alphabet by default, configurable length/alphabet */\r\nconst DEFAULT_ALPHABET =\r\n \"_-0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\";\r\n/**\r\n * Generates a NanoID-style string.\r\n *\r\n * @param {number} [size=21] - Length of the generated ID.\r\n * @param {string} [alphabet=DEFAULT_ALPHABET] - Alphabet to use.\r\n * @returns {string} Generated NanoID string.\r\n */\r\nexport function nanoid(size: number = 21, alphabet: string = DEFAULT_ALPHABET): string {\r\n if (size <= 0) throw new Error(\"size must be > 0\");\r\n const mask = (1 << Math.ceil(Math.log2(alphabet.length))) - 1;\r\n let id = \"\";\r\n while (id.length < size) {\r\n const bytes = randBytes(1);\r\n // @ts-ignore\r\n const idx = bytes[0] & mask;\r\n if (idx < alphabet.length) id += alphabet[idx];\r\n }\r\n return id;\r\n}\r\n\r\n/**\r\n * Generates a short, mostly-unique ID (timestamp + counter + random).\r\n * Not cryptographically strong.\r\n *\r\n * @returns {string} Short UID string.\r\n */\r\nlet _ctr = 0;\r\nexport function shortId(): string {\r\n const ts = Date.now().toString(36);\r\n _ctr = (_ctr + 1) & 0xfff; // 0..4095\r\n const c = _ctr.toString(36).padStart(3, \"0\");\r\n const r = Array.from(randBytes(3))\r\n .map(b => (b & 0x3f).toString(36).padStart(2, \"0\"))\r\n .join(\"\")\r\n .slice(0, 4);\r\n return `${ts}${c}${r}`;\r\n}\r\n\r\n/**\r\n * Generates a UID using the specified strategy.\r\n *\r\n * @param {UIDStrategy} [strategy=\"uuidv4\"] - The UID strategy to use.\r\n * @param {UIDOptions} [opts={}] - Options for the selected strategy.\r\n * @returns {string} Generated UID.\r\n */\r\nexport function generateUID(strategy: UIDStrategy = \"uuidv4\", opts: UIDOptions = {}): string {\r\n switch (strategy) {\r\n case \"uuidv4\": return uuidv4();\r\n case \"ulid\": return ulid();\r\n case \"nanoid\": return nanoid(opts.size ?? 21, opts.alphabet ?? DEFAULT_ALPHABET);\r\n case \"short\": return shortId();\r\n default: {\r\n const _exhaustive: never = strategy;\r\n return uuidv4();\r\n }\r\n }\r\n}\r\n","/**\r\n * Escapes special characters in a string to their corresponding HTML entities.\r\n *\r\n * Specifically, it replaces:\r\n * - `&` with `&amp;`\r\n * - `'` with `&apos;`\r\n * - `\"` with `&quot;`\r\n * - `<` with `&lt;`\r\n * - `>` with `&gt;`\r\n *\r\n * @param {string} s - The string to escape.\r\n * @returns {string} The escaped string with special characters replaced by HTML entities.\r\n */\r\nfunction escapeAttr(s: string): string {\r\n return s.replace(/&/g, \"&amp;\")\r\n .replace(/'/g, \"&apos;\")\r\n .replace(/\"/g, \"&quot;\")\r\n .replace(/</g, \"&lt;\")\r\n .replace(/>/g, \"&gt;\");\r\n}\r\n\r\nexport default escapeAttr;\r\n","import { G, Line } from \"@svgdotjs/svg.js\";\r\nimport NodeSvg from \"./nodesvg\";\r\nimport WorkspaceSvg from \"./workspace-svg\";\r\nimport Coordinates from \"./coordinates\";\r\nimport { generateUID } from \"../util/uid\";\r\nimport Workspace from \"./workspace\";\r\n\r\n\r\nexport interface CommentSerialized {\r\n id: string;\r\n text: string;\r\n coords: { x: number; y: number };\r\n parent: string | null; // node ID if node comment, null if workspace comment\r\n}\r\n/**\r\n * Represents a comment attached to either a NodeSvg or a WorkspaceSvg.\r\n */\r\nclass CommentModel {\r\n /** The comment text */\r\n _text: string;\r\n\r\n /** True if this comment belongs to the workspace instead of a node */\r\n _isWorkspaceComment: boolean;\r\n\r\n /** Parent NodeSvg or WorkspaceSvg to which this comment belongs */\r\n _parent: NodeSvg | WorkspaceSvg | Workspace;\r\n\r\n /** SVG group representing this comment in the DOM */\r\n svgGroup?: G | undefined;\r\n\r\n /** Coordinates relative to parent */\r\n relativeCoords: Coordinates;\r\n\r\n /** Optional SVG line connecting the comment to its node */\r\n svgLine?: Line | undefined;\r\n\r\n /** Temporary bounding box info for input handling */\r\n _tempInputBBox?: { width: number; height: number; textX: number; textY: number };\r\n\r\n /** Unique identifier for this comment */\r\n id: string;\r\n\r\n /**\r\n * Creates a new comment attached to a node or workspace.\r\n * @param parent - NodeSvg or WorkspaceSvg this comment belongs to\r\n */\r\n constructor(parent: NodeSvg | WorkspaceSvg | Workspace) {\r\n this._parent = parent;\r\n this._isWorkspaceComment = parent instanceof WorkspaceSvg;\r\n this._text = \"\";\r\n this.relativeCoords = new Coordinates(0, 0); // Coordinates relative to this._parent\r\n this.id = generateUID(\"nanoid\", {\r\n alphabet: \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0129384756!)@(#*$&%^\",\r\n });\r\n }\r\n\r\n /**\r\n * Sets the text of the comment without triggering a comment redraw.\r\n * @param value - New text content\r\n * @returns The updated text\r\n */\r\n setTextNoRedraw(value: string): string {\r\n return (this._text = value);\r\n }\r\n\r\n /**\r\n * Retrieves the current text of the comment.\r\n * @returns The comment text\r\n */\r\n getText(): string {\r\n return this._text;\r\n }\r\n\r\n /**\r\n * Sets the text of the comment and triggers a redraw of all comments in the workspace.\r\n * @param value - New text content\r\n * @returns The updated text\r\n */\r\n setText(value: string): string {\r\n const res = (this._text = value);\r\n if (this.getWorkspace().isHeadless) return res;\r\n this.getWorkspace().renderer.clearComments();\r\n this.getWorkspace().renderer.drawComments();\r\n return res;\r\n }\r\n\r\n /**\r\n * Returns true if this comment is attached to a node.\r\n */\r\n isNodeComment(): boolean {\r\n return !this._isWorkspaceComment;\r\n }\r\n\r\n /**\r\n * Returns true if this comment is attached to the workspace.\r\n */\r\n isWorkspaceComment(): boolean {\r\n return this._isWorkspaceComment;\r\n }\r\n\r\n /**\r\n * Gets the workspace that owns this comment.\r\n */\r\n getWorkspace(): WorkspaceSvg {\r\n if (this.isWorkspaceComment()) {\r\n return this._parent as WorkspaceSvg;\r\n } else {\r\n return (this._parent as NodeSvg)?.workspace as WorkspaceSvg;\r\n }\r\n }\r\n /**\r\n * Convert to JSON structure holding all important data.\r\n */\r\n toJson(): CommentSerialized {\r\n return {\r\n text: this.getText(),\r\n coords: { x: this.relativeCoords.x, y: this.relativeCoords.y },\r\n parent: this.isWorkspaceComment() ? null : (this._parent as NodeSvg).id,\r\n id: this.id\r\n }\r\n }\r\n\r\n /**\r\n * Creates a CommentModel from serialized data.\r\n * @param data - The serialized comment\r\n * @param workspace - The workspace to attach the comment to\r\n * @param nodeMap - Optional map of node IDs to NodeSvg instances\r\n */\r\n static fromJson(\r\n data: CommentSerialized,\r\n ): CommentModel {\r\n const comment = new CommentModel(null as any as WorkspaceSvg | NodeSvg);\r\n comment.id = data.id;\r\n comment.relativeCoords = new Coordinates(data.coords.x, data.coords.y);\r\n comment.setTextNoRedraw(data.text);\r\n\r\n return comment;\r\n }\r\n}\r\n\r\nexport default CommentModel;\r\nexport { CommentModel };\r\n","import Renderer from '../renderers/renderer';\r\nimport WorkspaceSvg from '../src/workspace-svg';\r\nimport NodeSvg from '../src/nodesvg';\r\nimport CommentModel from '../src/comment';\r\nimport { Element, SVG, Svg } from '@svgdotjs/svg.js';\r\nimport eventer from '../util/eventer';\r\n\r\nclass CommentRenderer {\r\n\tstatic get NAME() { return 'cr_atlas'; }\r\n\tstatic get COMMENT_G_TAG() { return 'KabelCommentGroup'; }\r\n\tstatic get COMMENT_LINE_TAG() { return 'KabelCommentLine'; }\r\n\tstatic get COMMENT_TEXT_EL() { return 'KabelCommentText'; }\r\n\tstatic get COMMENT_DRAG_EL() { return 'KabelCommentDragHandle'; }\r\n\tstatic get RENDERER_TAG_EL() { return 'KabelCommentElTag'; }\r\n\r\n\tworkspace: WorkspaceSvg;\r\n\r\n\tconstructor(workspace: WorkspaceSvg) {\r\n\t\tthis.workspace = workspace;\r\n\t}\r\n\r\n\tencodeForSvg(s: string) {\r\n\t\treturn s.replace(/ /g, \"\\u00A0\");\r\n\t}\r\n\r\n\tensureTspansPreserve(node: HTMLElement) {\r\n\t\tArray.from(node.childNodes).forEach((child) => {\r\n\t\t\tif (child.nodeType === 1) {\r\n\t\t\t\t(child as HTMLElement).setAttribute(\"xml:space\", \"preserve\");\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tmeasureTextBbox(textEl: Element) {\r\n\t\treturn textEl.bbox();\r\n\t}\r\n\r\n\tdrawComment(comment: CommentModel) {\r\n\t\tconst svg = this.getSvg();\r\n\t\tthis._removeExistingElements(comment);\r\n\r\n\t\tconst g = svg.group().addClass(CommentRenderer.COMMENT_G_TAG);\r\n\t\tg.attr({\r\n\t\t\t'comment-data': JSON.stringify({\r\n\t\t\t\tid: comment.id,\r\n\t\t\t\tisws: comment.isWorkspaceComment()\r\n\t\t\t})\r\n\t\t});\r\n\t\tcomment.svgGroup = g;\r\n\r\n\t\tconst padding = 4;\r\n\t\tconst handleRadius = 6;\r\n\t\tconst textOffsetX = padding + handleRadius * 2 + 4;\r\n\r\n\t\tconst displayEncoded = this.encodeForSvg(comment.getText());\r\n\t\tconst textEl = this._createTextElement(g, displayEncoded, textOffsetX, padding);\r\n\r\n\t\tconst bbox = this.measureTextBbox(textEl);\r\n\r\n\t\tconst rect = this._createBackgroundRect(g, bbox, padding, handleRadius);\r\n\t\tconst dragHandle = this._createDragHandle(g, bbox, padding, handleRadius);\r\n\r\n\t\tthis._addEventer(rect, dragHandle, comment, textEl);\r\n\r\n\t\tconst { screenPos, zoom } = this._computeScreenPosition(comment);\r\n\t\tg.attr({ transform: `translate(${screenPos.x}, ${screenPos.y}) scale(${zoom})` });\r\n\r\n\t\tif (comment._parent instanceof NodeSvg && comment._parent.svgGroup) {\r\n\t\t\tthis._drawLineToNode(comment, padding);\r\n\t\t}\r\n\t}\r\n\r\n\trefreshCommentTransforms() {\r\n\t\tfor (const comment of [\r\n\t\t\t...this.workspace.getComments(),\r\n\t\t\t...Array.from(this.workspace._nodeDB.values())\r\n\t\t\t\t.map(n => n.getComment())\r\n\t\t\t\t.filter(c => !!c) as CommentModel[]\r\n\t\t]) {\r\n\t\t\tif (!comment.svgGroup) continue;\r\n\r\n\t\t\tconst { screenPos, zoom } = this._computeScreenPosition(comment);\r\n\t\t\tcomment.svgGroup.attr({ transform: `translate(${screenPos.x}, ${screenPos.y}) scale(${zoom})` });\r\n\r\n\t\t\tif (comment.svgLine) {\r\n\t\t\t\tcomment.svgLine.remove();\r\n\t\t\t\tcomment.svgLine = undefined;\r\n\t\t\t}\r\n\r\n\t\t\tif (comment._parent instanceof NodeSvg) {\r\n\t\t\t\tthis._drawLineToNode(comment, 4);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tprivate _removeExistingElements(comment: CommentModel) {\r\n\t\tif (comment.svgGroup) comment.svgGroup.remove();\r\n\t\tif (comment.svgLine) comment.svgLine.remove();\r\n\t}\r\n\r\n\tprivate _createTextElement(parent: Element, text: string, x: number, y: number) {\r\n //@ts-ignore\r\n\t\tconst textEl = parent.text(text)\r\n\t\t\t.font({ family: 'Arial', size: 12 })\r\n\t\t\t.fill('#000')\r\n\t\t\t.move(x, y)\r\n\t\t\t.addClass(CommentRenderer.COMMENT_TEXT_EL);\r\n\r\n\t\ttextEl.node.style.userSelect = 'none';\r\n\t\t// @ts-ignore\r\n\t\ttextEl.node.style!.webkitUserSelect = 'none';\r\n\t\t// @ts-ignore\r\n\t\ttextEl.node.style!.msUserSelect = 'none';\r\n\t\t// @ts-ignore\r\n\t\ttextEl.node.style!.MozUserSelect = 'none';\r\n\t\treturn textEl;\r\n\t}\r\n\r\n\tprivate _createBackgroundRect(parent: Element, bbox: any, padding: number, handleRadius: number) {\r\n //@ts-ignore\r\n\t\treturn parent.rect(bbox.width + padding * 2 + handleRadius * 2 + 4, bbox.height + padding * 2)\r\n\t\t\t.fill('#ffffcc')\r\n\t\t\t.stroke({ color: '#cccc99', width: 1 })\r\n\t\t\t.radius(4)\r\n\t\t\t.back();\r\n\t}\r\n\r\n\tprivate _createDragHandle(parent: Element, bbox: any, padding: number, handleRadius: number) {\r\n //@ts-ignore\r\n\t\treturn parent.circle(handleRadius * 2)\r\n\t\t\t.fill('#adad7d')\r\n\t\t\t.move(padding, padding + (bbox.height / 2) - handleRadius)\r\n\t\t\t.addClass(CommentRenderer.COMMENT_DRAG_EL);\r\n\t}\r\n\r\n\tprivate _addEventer(rect: Element, dragHandle: Element, comment: CommentModel, textEl: Element) {\r\n\t\teventer.addElement(dragHandle, 'k_draghandle', { comment })\r\n\t\t\t.tagElement(dragHandle, CommentRenderer.RENDERER_TAG_EL);\r\n\t\teventer.addElement(rect, \"k_commentinp\", { comment, text: textEl, renderer: this })\r\n\t\t\t.tagElement(rect, CommentRenderer.RENDERER_TAG_EL);\r\n\t}\r\n\r\n\tprivate _computeScreenPosition(comment: CommentModel) {\r\n\t\tlet workspaceX = comment.relativeCoords.x;\r\n\t\tlet workspaceY = comment.relativeCoords.y;\r\n\r\n\t\tif (comment._parent instanceof NodeSvg) {\r\n\t\t\tconst nodePos = comment._parent.relativeCoords;\r\n\t\t\tworkspaceX += nodePos.x;\r\n\t\t\tworkspaceY += nodePos.y;\r\n\t\t}\r\n\r\n\t\tconst screenPos = this.workspace.workspaceToScreen(workspaceX, workspaceY);\r\n\t\tconst zoom = this.workspace.getZoom();\r\n\t\treturn { screenPos, zoom };\r\n\t}\r\n\r\n\tprivate _drawLineToNode(comment: CommentModel, padding: number) {\r\n\t\tif (!comment || !(comment._parent instanceof NodeSvg) || !comment.svgGroup) return;\r\n\t\tconst svg = this.getSvg();\r\n\t\tconst ws = this.workspace;\r\n\r\n\t\tif (comment.svgLine) comment.svgLine.remove();\r\n\r\n\t\tconst nodeWSPos = comment._parent.relativeCoords;\r\n\t\tconst nodeBBox = comment._parent.svgGroup!.bbox();\r\n\t\tconst nodeTopCenter = ws.workspaceToScreen(\r\n\t\t\tnodeWSPos.x + nodeBBox.width / 2,\r\n\t\t\tnodeWSPos.y\r\n\t\t);\r\n\r\n\t\tconst parentWSPos = comment._parent.relativeCoords;\r\n\t\tconst commentRelPos = comment.relativeCoords;\r\n\t\tconst commentAbsX = parentWSPos.x + commentRelPos.x;\r\n\t\tconst commentAbsY = parentWSPos.y + commentRelPos.y;\r\n\t\tconst commentBBox = comment.svgGroup!.bbox();\r\n\t\tconst commentTopCenter = ws.workspaceToScreen(\r\n\t\t\tcommentAbsX + (commentBBox.width + padding * 2) / 2,\r\n\t\t\tcommentAbsY\r\n\t\t);\r\n\r\n\t\tcomment.svgLine = svg.line(\r\n\t\t\tnodeTopCenter.x, nodeTopCenter.y,\r\n\t\t\tcommentTopCenter.x, commentTopCenter.y\r\n\t\t)\r\n\t\t\t.stroke({ color: '#888', width: 1, dasharray: '3,2' })\r\n\t\t\t.addClass(CommentRenderer.COMMENT_LINE_TAG)\r\n\t\t\t.back();\r\n\t}\r\n\r\n\tclearAllComments() {\r\n\t\tconst svg = this.getSvg();\r\n\t\tsvg.find(`.${CommentRenderer.COMMENT_G_TAG}`).forEach(el => el.remove());\r\n\t\tsvg.find(`.${CommentRenderer.COMMENT_LINE_TAG}`).forEach(el => el.remove());\r\n\t\teventer.destroyByTag(CommentRenderer.RENDERER_TAG_EL);\r\n\r\n\t\tfor (let [_, node] of this.workspace._nodeDB) {\r\n\t\t\tconst comment = node.getComment();\r\n\t\t\tif (comment) comment.svgGroup = undefined;\r\n\t\t}\r\n\r\n\t\tfor (const comment of this.workspace.getComments()) {\r\n\t\t\tcomment.svgGroup = undefined;\r\n\t\t}\r\n\t}\r\n\r\n\tclearCommentLines() {\r\n\t\tconst svg = this.getSvg();\r\n\t\tsvg.find(`.${CommentRenderer.COMMENT_LINE_TAG}`).forEach(el => el.remove());\r\n\t}\r\n\r\n\tdrawAllComments() {\r\n\t\tfor (const comment of this.workspace.getComments()) this.drawComment(comment);\r\n\t\tfor (let [_, node] of this.workspace._nodeDB) {\r\n\t\t\tconst comment = node.getComment();\r\n\t\t\tif (comment) this.drawComment(comment);\r\n\t\t}\r\n\t}\r\n\r\n\tgetSvg(): Svg {\r\n\t\treturn this.workspace.svg;\r\n\t}\r\n getWs(): WorkspaceSvg {\r\n return this.workspace;\r\n }\r\n}\r\n\r\nexport default CommentRenderer;\r\n","\r\nimport ApolloRenderer from \"./renderer\"\r\nimport ApolloConstants from \"./constants\"\r\nimport Representer from \"../representer\"\r\nimport { RepresenterNode } from \"../representer-node\"\r\n\r\nexport interface apolloType {\r\n Renderer: typeof ApolloRenderer;\r\n Constants: typeof ApolloConstants;\r\n Representer: typeof Representer;\r\n RepresenterNode: typeof RepresenterNode;\r\n}\r\n\r\n\r\nexport {\r\n ApolloRenderer as Renderer,\r\n ApolloConstants as Constants,\r\n // Despite apollo not extending these, we still need to re-export them for the API.\r\n Representer,\r\n RepresenterNode\r\n}","import RendererConstants from \"./constants\";\r\nimport WorkspaceSvg from '../src/workspace-svg';\r\nimport NodeSvg from '../src/nodesvg';\r\nimport * as Path from '../util/path';\r\nimport { parseColor } from \"../util/parse-color\";\r\nimport { G, Path as SvgPath, Svg, StrokeData, Element, List, Rect } from \"@svgdotjs/svg.js\";\r\nimport { Color, ColorStyle, Hex } from \"../src/visual-types\";\r\nimport Field, { AnyField, ConnectableField, DummyField, FieldRawBoxData, OptConnectField } from \"../src/field\";\r\nimport eventer from '../util/eventer';\r\nimport Connection, { Connectable } from \"../src/connection\";\r\nimport escapeAttr from '../util/escape-html';\r\nimport unescapeAttr from '../util/unescape-html';\r\nimport CommentRenderer from \"../comment-renderer/renderer\";\r\nimport { FieldVisualInfo } from \"../src/field\";\r\nimport { RepresenterNode } from \"./representer-node\";\r\nimport type Representer from \"./representer\";\r\n\r\nexport interface ConnectorToFrom {\r\n to: Connection,\r\n from: Connection,\r\n fromCircle?: SvgPath,\r\n toCircle?: SvgPath,\r\n originConn: Connection,\r\n originCircle: SvgPath\r\n}\r\nexport interface DrawState {\r\n id: string;\r\n shadow?: SvgPath;\r\n topbar?: SvgPath | null;\r\n bg?: SvgPath | null;\r\n group?: G | null;\r\n fieldCol?: G | null;\r\n fieldPosY?: number | null; // starts under topbar, goes down by field height each time one is drawn. This determines position\r\n xButton?: G;\r\n pendingConnections: ConnectorToFrom[]\r\n}\r\nexport interface NodeMeasurements {\r\n width: number;\r\n height: number;\r\n fields: { width: number; height: number }[];\r\n}\r\n\r\nclass Renderer {\r\n /**\r\n * Set of constants the renderer uses for drawing nodes.\r\n */\r\n _constants!: RendererConstants;\r\n /**\r\n * The current node being rendered.\r\n */\r\n _currentNode: NodeSvg | null;\r\n /**\r\n * The SVG group element for the current node.\r\n */\r\n _nodeGroup: G | null;\r\n /**\r\n * The current drawing state for the node.\r\n */\r\n _nodeDraw: DrawState | null;\r\n /**\r\n * The workspace this renderer is associated with.\r\n */\r\n _ws: WorkspaceSvg;\r\n /**\r\n * Array of stored draw states for rendered nodes.\r\n */\r\n _drawStates: DrawState[];\r\n /**\r\n * Comment renderer instance used for rendering comments.\r\n */\r\n _commentDrawer!: CommentRenderer;\r\n /**\r\n * Representer instance used for building node representations.\r\n */\r\n representer!: Representer;\r\n /**\r\n * Constant overrides provided during renderer instantiation.\r\n */\r\n constantOverrides: Partial<RendererConstants>;\r\n /**\r\n * Tag used for node group elements in the SVG.\r\n */\r\n static get NODE_G_TAG() {\r\n return 'AtlasNodeSVG';\r\n }\r\n /**\r\n * Tag used for renderer elements in the SVG.\r\n */\r\n static get ELEMENT_TAG() {\r\n return 'AtlasElement'\r\n }\r\n /**\r\n * Tag used for connection line elements in the SVG.\r\n */\r\n static get CONN_LINE_TAG() {\r\n return 'AtlasConnectionLine';\r\n }\r\n /**\r\n * Tag used for connector elements in the SVG.\r\n */\r\n static get CONNECTOR_TAG() {\r\n return 'AtlasConnectionBubble';\r\n }\r\n /**\r\n * Tag used for line X mark elements in the SVG.\r\n */\r\n static get LINE_X_MARK_TAG() {\r\n return 'AtlasLineXMark';\r\n }\r\n /**\r\n * Tag used for background pattern elements in the SVG. This is constant, do not modify it in subclasses.\r\n */\r\n static get BACKGROUND_PATTERN() {\r\n /** ! CONSTANT ! DO NOT CHANGE ! CONSTANT ! */\r\n return 'WorkspaceBgPattern'\r\n }\r\n /**\r\n * Name of the renderer.\r\n */\r\n static get NAME() {\r\n return 'atlas'; // default is called atlas.\r\n }\r\n /**\r\n * Constructor for the Renderer class.\r\n * @param workspace - The workspace associated with the renderer.\r\n * @param overrides - Optional constant overrides for the renderer.\r\n */\r\n constructor(workspace: WorkspaceSvg, overrides: Partial<RendererConstants> = {}) {\r\n this._ws = workspace;\r\n this._currentNode = null;\r\n this._nodeGroup = null;\r\n this._nodeDraw = null;\r\n this._drawStates = [];\r\n this.constantOverrides = overrides;\r\n this.init();\r\n }\r\n /**\r\n * Initializes the renderer by setting up the comment renderer, representer, and constants.\r\n */\r\n init() {\r\n this.initCommentRenderer();\r\n this.initRepresenter();\r\n this.initConstants();\r\n }\r\n /**\r\n * Initializes the renderer constants with any provided overrides.\r\n */\r\n initConstants() {\r\n this._constants = new RendererConstants(this.constantOverrides);\r\n }\r\n /**\r\n * Initializes the representer for the renderer.\r\n */\r\n initRepresenter() {\r\n const Representer = (require('./representer').default);\r\n this.representer = new Representer();\r\n }\r\n /**\r\n * Initializes the comment renderer for the workspace.\r\n */\r\n initCommentRenderer() {\r\n this._commentDrawer = new CommentRenderer(this.getWs());\r\n }\r\n /**\r\n * Sets the connection to be processed.\r\n * @param c - The connection to set.\r\n */\r\n setConnect(c: ConnectorToFrom) {\r\n this.state?.pendingConnections?.push?.(c);\r\n }\r\n /**\r\n * Sets the renderer constants.\r\n * @param c - Partial constants to override.\r\n * @returns The updated constants.\r\n */\r\n setConstants(c: Partial<RendererConstants> = {}) {\r\n return Object.assign(this._constants, c);\r\n }\r\n /**\r\n * Gets the renderer constants, merging with node style if applicable.\r\n */\r\n get constants(): RendererConstants {\r\n if (!this.node) return this._constants;\r\n\r\n const { primary, secondary, tertiary, ...restColors } = this.node.colors;\r\n\r\n return {\r\n ...this._constants,\r\n ...restColors\r\n };\r\n }\r\n /**\r\n * Sets the renderer constants.\r\n */\r\n set constants(c: Partial<RendererConstants>) {\r\n this.setConstants(c);\r\n }\r\n /**\r\n * Gets the current node being rendered.\r\n */\r\n get node() {\r\n return this._currentNode;\r\n }\r\n /**\r\n * Gets the SVG.js instance from the workspace.\r\n */\r\n get svg(): Svg {\r\n return this.getWs().svg; // Svg.js instance\r\n }\r\n /**\r\n * Gets the current drawing state.\r\n */\r\n get state(): null | undefined | DrawState {\r\n return this._nodeDraw;\r\n }\r\n /**\r\n * Gets the workspace associated with the renderer.\r\n * @returns The workspace instance.\r\n */\r\n getWs() {\r\n return this._ws;\r\n }\r\n // MEASURING -\r\n\r\n /**\r\n * Gets the base measurements for a node.\r\n * @returns The base width and height of the node.\r\n */\r\n getNodeBaseMeasurements() {\r\n const c = this.constants;\r\n return {\r\n width: c.NODE_BASE_WIDTH,\r\n height: c.NODE_BASE_HEIGHT\r\n }\r\n }\r\n /**\r\n * Measures the width of the given text.\r\n * @param text - The text to measure.\r\n * @param fontSize - The font size to use.\r\n * @param fontFamily - The font family to use.\r\n * @returns The width of the text.\r\n */\r\n measureTextWidth(text: string, fontSize?: number, fontFamily?: string): number {\r\n const c = this.constants;\r\n\r\n // fallback in case SVG is not ready\r\n if (!this.svg) return text.length * (fontSize ?? c.FONT_SIZE) * 0.6;\r\n\r\n const txt = this.svg.text(text)\r\n .font({\r\n family: fontFamily ?? c.FONT_FAMILY,\r\n size: fontSize ?? c.FONT_SIZE,\r\n anchor: 'start'\r\n })\r\n .opacity(0); // hide it\r\n\r\n const width = txt.bbox().width;\r\n txt.remove(); // clean up\r\n return width;\r\n }\r\n /**\r\n * Measures the height of the given text.\r\n * @param text - The text to measure.\r\n * @param fontSize - The font size to use.\r\n * @param fontFamily - The font family to use.\r\n * @returns The height of the text.\r\n */\r\n measureTextHeight(text: string, fontSize?: number, fontFamily?: string): number {\r\n const c = this.constants;\r\n\r\n // fallback in case SVG is not ready\r\n if (!this.svg) return (fontSize ?? c.FONT_SIZE);\r\n\r\n const txt = this.svg.text(text)\r\n .font({\r\n family: fontFamily ?? c.FONT_FAMILY,\r\n size: fontSize ?? c.FONT_SIZE,\r\n anchor: 'start'\r\n })\r\n .opacity(0); // hide it\r\n\r\n const height = txt.bbox().height;\r\n txt.remove(); // clean up\r\n return height;\r\n }\r\n /**\r\n * Measures the dimensions of a raw input field.\r\n * @param text - The text content of the raw field.\r\n * @returns The width and height of the raw field.\r\n */\r\n measureRawField(text: string = \"\") {\r\n const c = this.constants;\r\n const textW = this.measureTextWidth(text);\r\n const width = Math.max(c.FIELD_RAW_BASE_WIDTH, textW + c.INPUT_BOX_PADDING * 2);\r\n const height = c.FIELD_RAW_BASE_HEIGHT;\r\n return { width, height };\r\n }\r\n /**\r\n * Measures the label of a field.\r\n * @param field - The field to measure the label for.\r\n * @returns The width and height of the label.\r\n */\r\n measureLabel(field: AnyField): { width: number, height: number } {\r\n const c = this.constants;\r\n const label = field.getLabel?.();\r\n if (!label) return { width: 0, height: 0 };\r\n\r\n const width = this.measureTextWidth(label);\r\n const height = this.measureTextHeight(label);\r\n\r\n return { width, height };\r\n }\r\n /**\r\n * Measures the raw input of a field.\r\n * @param field - The field to measure the raw input for.\r\n * @returns The width and height of the raw input.\r\n */\r\n measureRaw(field: AnyField): { width: number, height: number } {\r\n if (!field.hasRaw()) return { width: 0, height: 0 };\r\n\r\n const c = this.constants;\r\n const raw = this.measureRawField(field.getValue?.() ?? \"\");\r\n return {\r\n width: raw.width,\r\n height: raw.height\r\n };\r\n }\r\n /**\r\n * Measures the custom editor of a field.\r\n * @param field - The field to measure the custom editor for.\r\n * @returns The width and height of the custom editor.\r\n */\r\n measureCustom(field: AnyField): { width: number, height: number } {\r\n if (!field.isCustomEditor()) return { width: 0, height: 0 };\r\n\r\n const c = this.constants;\r\n const m = field.measureMyself();\r\n if (!m) return { width: 0, height: 0 };\r\n\r\n let width = m.width as number;\r\n let height = m.height as number;\r\n\r\n return { width, height };\r\n }\r\n /**\r\n * Gets the padding to apply when measuring a field.\r\n * @returns The width and height padding for the field.\r\n */\r\n getFieldMeasurementPadding() {\r\n return { width: this.constants.FIELD_SPACEX, height: 0 }\r\n }\r\n /**\r\n * Measures the overall dimensions of a field.\r\n * @param field - The field to measure.\r\n * @returns The width and height of the field.\r\n */\r\n measureField(field: AnyField) {\r\n // parts of the measurement, correct order matters.\r\n const parts = [\r\n this.getFieldMeasurementPadding(),\r\n this.measureLabel(field),\r\n this.measureRaw(field),\r\n this.measureCustom(field),\r\n this.getFieldMeasurementPadding()\r\n ];\r\n\r\n let width = 0, height = 0;\r\n for (const { width: w, height: h } of parts) {\r\n width += w;\r\n height = Math.max(height, h);\r\n }\r\n\r\n return { width, height };\r\n }\r\n /**\r\n * Measures the overall dimensions of the current node.\r\n * @returns The measurements of the node including width, height, and field dimensions.\r\n */\r\n measureNodeDimensions(): NodeMeasurements | void | null {\r\n if (!this.node) return;\r\n\r\n const c = this.constants;\r\n\r\n const base = this.measureBaseAndLabel();\r\n\r\n const fieldResult = this.measureFields(\r\n c.TOPBAR_HEIGHT + c.FIELD_SPACEY,\r\n base.width,\r\n base.height\r\n );\r\n\r\n return {\r\n width: fieldResult.width,\r\n height: fieldResult.height + c.FOOTER_HEIGHT,\r\n fields: fieldResult.fields\r\n };\r\n }\r\n /**\r\n * Measures all fields of the current node.\r\n * @param startY The starting Y position for the fields.\r\n * @param startWidth The starting width of the node.\r\n * @param startHeight The starting height of the node.\r\n * @returns The width, height, and field dimensions.\r\n */\r\n measureFields(\r\n startY: number,\r\n startWidth: number,\r\n startHeight: number\r\n ): {\r\n width: number;\r\n height: number;\r\n fields: { width: number; height: number }[];\r\n } {\r\n const c = this.constants;\r\n const node = this.node!;\r\n\r\n let y = startY;\r\n let totalWidth = startWidth;\r\n let totalHeight = startHeight;\r\n const fields: { width: number; height: number }[] = [];\r\n\r\n for (const field of node.allFields()) {\r\n const m = this.measureField(field);\r\n fields.push(m);\r\n\r\n totalWidth = Math.max(\r\n totalWidth,\r\n m.width + c.FIELD_MARGIN_X * 2\r\n );\r\n\r\n const bottom = y + m.height;\r\n if (bottom + c.FIELD_MARGIN_Y > totalHeight) {\r\n totalHeight = bottom + c.FIELD_MARGIN_Y;\r\n }\r\n\r\n y += m.height + c.FIELD_MARGIN_Y;\r\n }\r\n\r\n return { width: totalWidth, height: totalHeight, fields };\r\n }\r\n /**\r\n * Measures the base dimensions of the current node including label.\r\n * @returns The width and height of the node base and label.\r\n */\r\n private measureBaseAndLabel(): { width: number; height: number } {\r\n const c = this.constants;\r\n const node = this.node!;\r\n\r\n const base = this.getNodeBaseMeasurements();\r\n let width = base.width;\r\n let height = base.height;\r\n\r\n if (node.labelText) {\r\n const labelW = this.measureTextWidth(\r\n node.labelText,\r\n c.FONT_SIZE,\r\n c.FONT_FAMILY\r\n );\r\n\r\n width = Math.max(\r\n width,\r\n labelW + c.TOPBAR_LABEL_MARGIN_X * 2\r\n );\r\n }\r\n\r\n return { width, height };\r\n }\r\n // renderNode METHOD + NODE DRAW INITING.\r\n /**\r\n * Renders the specified node by drawing it and building its representation.\r\n * @param nodeIdOrNode The node or node ID to render.\r\n * @returns Void.\r\n */\r\n renderNode(nodeIdOrNode: NodeSvg | string) {\r\n this.startNode(nodeIdOrNode);\r\n if (!this.node) return;\r\n this.drawNode();\r\n this.representer.build(this.node as NodeSvg, this, this.state as DrawState);\r\n this.storeState();\r\n }\r\n /**\r\n * Starts rendering the specified node.\r\n * @param nodeIdOrNode The node or node ID to start rendering.\r\n */\r\n startNode(nodeIdOrNode: NodeSvg | string) {\r\n const ws = this.getWs();\r\n if (nodeIdOrNode instanceof NodeSvg) {\r\n this._currentNode = nodeIdOrNode;\r\n } else {\r\n const node = ws.getNode(nodeIdOrNode);\r\n if (node instanceof NodeSvg) {\r\n this._currentNode = node;\r\n } else {\r\n this._currentNode = null;\r\n }\r\n }\r\n }\r\n // DRAW-STATE MANAGEMENT -\r\n /**\r\n * Build a draw state for the given node group and ID.\r\n * @param nodeGroup - The SVG group element for the node.\r\n * @param id - The ID of the node.\r\n * @returns - The constructed DrawState object.\r\n */\r\n drawState(nodeGroup: G, id: string): DrawState {\r\n return {\r\n id,\r\n group: nodeGroup,\r\n fieldPosY: 0,\r\n pendingConnections: []\r\n }\r\n }\r\n /**\r\n * Stores the current draw state.\r\n */\r\n storeState() {\r\n this._drawStates.push(this.state as DrawState);\r\n }\r\n // DRAWING + EVENT INITIALIZING VIA EVENTER\r\n /**\r\n * Draws a raw input field.\r\n * @param fieldGroup - The SVG group element for the field.\r\n * @param field - The field to draw.\r\n * @param startX - The starting X position for the field.\r\n * @returns The rectangle and text elements of the raw field.\r\n */\r\n drawFieldRaw(fieldGroup: G, field: AnyField, startX: number = 0) {\r\n const c = this.constants;\r\n const value = field.getDisplayValue?.() ?? \"\";\r\n const { width, height } = this.measureRawField(value);\r\n\r\n const rect = fieldGroup.rect(width, height)\r\n .fill(parseColor(c.FIELD_RAW_COLOR))\r\n .stroke({ color: parseColor(c.FIELD_RAW_OUTLINE_COLOR), width: c.FIELD_RAW_OUTLINE_STROKE })\r\n .radius(3);\r\n\r\n const txt = fieldGroup.text(value)\r\n .font({\r\n family: c.FONT_FAMILY,\r\n size: c.FONT_SIZE,\r\n anchor: c.INPUT_BOX_TEXT_ANCHOR\r\n })\r\n .fill(parseColor(c.FIELD_RAW_TEXT_COLOR));\r\n txt.node.style.userSelect = 'none';\r\n\r\n const rawBox: FieldRawBoxData = {\r\n box: rect,\r\n txt\r\n }\r\n\r\n const textBBox = txt.bbox();\r\n const offsetY = (height - textBBox.height) / 2;\r\n\r\n // move relative to startX (after label)\r\n rect.move(startX, 0);\r\n txt.move(startX + c.INPUT_BOX_PADDING, offsetY);\r\n eventer.addElement(rect, \"k_inputbox\", {\r\n field, // the field object that has .getValue() and .setValue(v)\r\n text: txt, // the svg.js Text element you drew\r\n renderer: this, // the renderer instance, must have .measureRawField and .constants\r\n startX // x-offset where the box should start (after label)\r\n }).tagElement(rect, [(this.constructor as typeof Renderer).ELEMENT_TAG, `node_${this.node!.id}`])\r\n\r\n return { rect, txt, rawBox };\r\n }\r\n\r\n /**\r\n * Draws the label of a field.\r\n * @param fieldGroup - The SVG group element for the field.\r\n * @param field - The field to draw the label for.\r\n * @param startX - The starting X position for the label.\r\n * @returns The width used by the label including spacing.\r\n */\r\n drawFieldLabel(fieldGroup: G, field: AnyField, startX: number = 0): number {\r\n const c = this.constants;\r\n const label = field.getLabel?.();\r\n if (!label) return 0;\r\n\r\n const txt = fieldGroup.text(label)\r\n .font({\r\n family: c.FONT_FAMILY,\r\n size: c.FONT_SIZE,\r\n anchor: 'start'\r\n })\r\n .fill(parseColor(c.FONT_COLOR));\r\n txt.node.style.userSelect = 'none';\r\n const bbox = txt.bbox();\r\n const offsetY = (Math.max(c.FIELD_RAW_BASE_HEIGHT, bbox.height) - bbox.height) / 2;\r\n\r\n // move label relative to startX\r\n txt.move(startX, offsetY);\r\n\r\n // return width used for next element\r\n return bbox.width + c.LABEL_SPACING;\r\n }\r\n /**\r\n * Draws the X button on the node's top bar.\r\n * @returns Void.\r\n */\r\n drawNodeXButton() {\r\n const node = this.node;\r\n const state = this._nodeDraw;\r\n if (!node || !state || !state.group) return;\r\n\r\n const c = this.constants;\r\n\r\n const measurements = this.measureNodeDimensions();\r\n const width = measurements?.width ?? c.NODE_BASE_WIDTH;\r\n\r\n const btnSize = c.TOPBAR_HEIGHT * 0.6;\r\n const padding = (c.TOPBAR_HEIGHT - btnSize) / 2;\r\n\r\n // Button group\r\n const xGroup = state.group.group().attr({ class: 'node-x-clse' });\r\n eventer.addElement(xGroup, 'k_closenode', {\r\n workspace: this.getWs(),\r\n node\r\n }).tagElement(xGroup, [(this.constructor as typeof Renderer).ELEMENT_TAG, `node_${node.id}`]);\r\n // Background\r\n xGroup.rect(btnSize, btnSize)\r\n .fill('#ffffff00')\r\n .radius(2)\r\n .move(width - btnSize - padding, padding);\r\n\r\n // X mark\r\n const txt = xGroup.text('×')\r\n .font({\r\n family: c.FONT_FAMILY,\r\n size: btnSize * 0.8,\r\n weight: 'bold',\r\n anchor: 'middle'\r\n })\r\n .fill('#fff')\r\n .attr({\r\n 'text-anchor': 'middle', // horizontal centering\r\n 'dominant-baseline': 'middle' // vertical centering\r\n });\r\n txt.node.style.userSelect = 'none';\r\n // Apply transform to center it inside the button\r\n txt.transform({\r\n translateX: width - btnSize / 2 - padding,\r\n translateY: padding + btnSize / 2\r\n });\r\n\r\n state.xButton = xGroup;\r\n }\r\n /**\r\n * Draws a connector on the specified side of the node.\r\n * @param nodeGroup - The SVG group element for the node.\r\n * @param nodeBg - The background SVG path of the node.\r\n * @param y - The Y position for the connector.\r\n * @param side - The side to draw the connector on ('left' or 'right').\r\n * @param color - The color of the connector.\r\n * @returns The SVG path of the connector or null if not drawn.\r\n */\r\n drawConnector(nodeGroup: G, nodeBg: SvgPath, y: number, side: 'left' | 'right', color: string): SvgPath | void | undefined | null {\r\n const c = this.constants;\r\n if (!nodeGroup || !nodeBg) return null;\r\n\r\n const bbox = nodeBg.bbox(); // get dimensions of the background\r\n const group = nodeGroup; // attach connector to top-level node group\r\n const x = side === 'left' ? 0 : bbox.width;\r\n\r\n if (c.CONNECTOR_TRIANGLE) {\r\n // small triangle connector\r\n const triSize = c.CONNECTOR_TRI_SIZE;\r\n let path = Path.roundedTri(triSize, triSize, 1);\r\n\r\n // flip triangle horizontally for left side\r\n if (side === 'left') path = Path.rotatePath(path, 180, triSize / 2, triSize / 2);\r\n\r\n const tri = group.path(path)\r\n .fill(parseColor(color as Hex))\r\n .stroke({ color: parseColor('#00000000'), width: 0 });\r\n tri.attr({\r\n class: (this.constructor as typeof Renderer).CONNECTOR_TAG\r\n })\r\n const offsetX = side === 'left' ? -triSize : 0;\r\n tri.transform({ translateX: x + offsetX, translateY: y - triSize / 2 });\r\n\r\n return tri;\r\n } else {\r\n // circle connector\r\n const radius = c.CONNECTOR_RADIUS;\r\n const circlePath = Path.circle(radius);\r\n\r\n const circ = group.path(circlePath)\r\n .fill(parseColor(color as Hex))\r\n .stroke({ color: parseColor('#00000000'), width: 0 })\r\n .move(x - radius, y - radius); // center circle at (x, y)\r\n circ.attr({\r\n class: (this.constructor as typeof Renderer).CONNECTOR_TAG\r\n })\r\n return circ;\r\n }\r\n }\r\n\r\n /**\r\n * Draws the label on the node's top bar.\r\n * @param nodeGroup - The SVG group element for the node.\r\n * @returns Void.\r\n */\r\n drawNodeLabel(nodeGroup: G) {\r\n const node = this.node;\r\n const c = this.constants;\r\n if (!node) return;\r\n\r\n if (node.labelText) {\r\n const txt = nodeGroup.text(node.labelText)\r\n .font({\r\n family: c.FONT_FAMILY,\r\n size: c.FONT_SIZE,\r\n anchor: 'start',\r\n weight: c.TOPBAR_LABEL_BOLDED ? '600' : 'normal'\r\n })\r\n .fill(parseColor(c.FONT_COLOR));\r\n\r\n txt.node.style.userSelect = 'none';\r\n\r\n const bbox = txt.bbox();\r\n const offsetY = (c.TOPBAR_HEIGHT - bbox.height) / 2;\r\n\r\n txt.move(c.TOPBAR_LABEL_MARGIN_X, offsetY + c.TOPBAR_LABEL_MARGIN_Y);\r\n }\r\n }\r\n\r\n /**\r\n * Draws the current node.\r\n * @returns Void.\r\n */\r\n drawNode() {\r\n if (!this.node) return;\r\n\r\n const node = this.node;\r\n const state = this.drawState(this.createNodeGroup(node), node.id);\r\n this._nodeDraw = state;\r\n\r\n const measurements = this.measureNodeDimensions();\r\n\r\n this.drawNodeBase(state, measurements as NodeMeasurements);\r\n this.drawNodeTopbar(state, this.getNodeColors(), measurements as NodeMeasurements);\r\n this.drawNodeXButton();\r\n this.drawNodeLabel(state.group!);\r\n this.makeNodeDraggable(state.group!, state.topbar!, node);\r\n\r\n this.createFieldGroup(state);\r\n this.drawAllFieldsForNode(measurements as NodeMeasurements);\r\n\r\n this.drawPreviousNextConnections(state, node, state.group!, measurements as NodeMeasurements);\r\n }\r\n /**\r\n * Creates the SVG group for the given node.\r\n * @param node - The node to create the group for.\r\n * @returns The created SVG group element.\r\n */\r\n createNodeGroup(node: NodeSvg): G {\r\n const nodeGroup = this.svg.group().attr({\r\n 'data-node-id': escapeAttr(node.id),\r\n 'class': (this.constructor as typeof Renderer).NODE_G_TAG\r\n });\r\n const screenPos = this._ws.workspaceToScreen(node.relativeCoords.x, node.relativeCoords.y);\r\n nodeGroup.attr({ transform: `translate(${screenPos.x}, ${screenPos.y})` });\r\n return nodeGroup;\r\n }\r\n /**\r\n * Draws the base and shadow of the node.\r\n * @param state - The current drawing state.\r\n * @param measurements - The measurements of the node.\r\n */\r\n drawNodeBase(state: DrawState, measurements: NodeMeasurements | null) {\r\n const c = this.constants;\r\n const width = measurements?.width ?? c.NODE_BASE_WIDTH;\r\n const height = measurements?.height ?? c.NODE_BASE_HEIGHT;\r\n const radius = c.CORNER_RADIUS;\r\n state.bg = state.group!.path(Path.roundedRect(width, height, radius))\r\n .fill(parseColor(c.NODE_BG_COLOR))\r\n .stroke({ color: parseColor(c.NODE_OUTLINE_COLOR), width: 2 } as StrokeData);\r\n state.shadow = state.group!.path(Path.roundedRect(width, height, radius))\r\n .fill('rgba(0,0,0,0.2)')\r\n .move(Number(state.bg.x()) + 5, Number(state.bg.y()) + 5)\r\n .back(); // make sure it's behind the node\r\n }\r\n /**\r\n * Draw the node's topbar\r\n * @param state - The draw state\r\n * @param colors - The colors of the node.\r\n * @param measurements - The measurement data of the node.\r\n */\r\n drawNodeTopbar(state: DrawState, colors: ColorStyle, measurements: NodeMeasurements | null) {\r\n const c = this.constants;\r\n const width = measurements?.width ?? c.NODE_BASE_WIDTH;\r\n const radius = c.CORNER_RADIUS;\r\n state.topbar = state.group!.path(Path.roundedRect(width, c.TOPBAR_HEIGHT, radius))\r\n .fill(parseColor(colors.primary))\r\n .stroke({ color: parseColor(colors.tertiary), width: 2 } as StrokeData);\r\n }\r\n /**\r\n * Make a node draggable.\r\n * @param nodeGroup - The node group to make draggable\r\n * @param dragHandle - The drag handle\r\n * @param node - The nodesvg\r\n */\r\n makeNodeDraggable(nodeGroup: G, dragHandle: SvgPath, node: NodeSvg) {\r\n eventer.addElement(nodeGroup, 'k_draggable', {\r\n dragel: dragHandle,\r\n group: nodeGroup,\r\n node,\r\n type: 2\r\n }).tagElement(nodeGroup, [(this.constructor as typeof Renderer).ELEMENT_TAG, `node_${node.id}`]);\r\n }\r\n /** Create the field group for the node */\r\n createFieldGroup(state: DrawState) {\r\n const c = this.constants;\r\n const fieldsGroup = state.group!.group();\r\n fieldsGroup.attr({ transform: `translate(0, ${c.TOPBAR_HEIGHT + c.FIELD_SPACEY})` });\r\n state.fieldCol = fieldsGroup;\r\n }\r\n /**\r\n * Draw a field on a node.\r\n * @param field - The field to draw\r\n * @param measurements - The node's measurements\r\n * @param idx - Index of the field in the fieldColumn list\r\n * @param y - the y position of the field\r\n * @returns \r\n */\r\n drawFieldForNode(field: AnyField, measurements: NodeMeasurements, idx: number, y: number) {\r\n const node = this.node;\r\n const state = this.state;\r\n const c = this.constants;\r\n if (!node || !state || !state.fieldCol) return;\r\n const fieldsGroup = state.fieldCol;\r\n const nodeGroup = state.group as G;\r\n const fm = measurements?.fields[idx];\r\n if (!fm) return;\r\n\r\n // default left alignment\r\n let alignX = c.FIELD_MARGIN_X;\r\n\r\n const fieldGroup = fieldsGroup.group();\r\n fieldGroup.attr({ transform: `translate(${alignX}, ${y})` });\r\n field.svgGroup = fieldGroup;\r\n state.fieldPosY = y;\r\n\r\n // draw label first, get its used width\r\n const xUsed = this.drawFieldLabel(fieldGroup, field);\r\n if (field.isCustomEditor()) {\r\n // field fully owns drawing\r\n field.drawMyself({\r\n measuredWidth: fm.width,\r\n measuredHeight: fm.height,\r\n xUsed,\r\n fieldGroup,\r\n nodeGroup,\r\n svg: this.svg,\r\n background: state!.bg as unknown as Rect\r\n });\r\n } else {\r\n let rawData, cBubbleData = undefined;\r\n // if raw, draw right after label\r\n if (field.hasRaw()) {\r\n const { rawBox } = this.drawFieldRaw(fieldGroup, field, xUsed);\r\n rawData = rawBox;\r\n }\r\n if (field.hasConnectable() && (field as ConnectableField)!.connection) {\r\n const halfHeight = (fm.height + (field.hasRaw() ? 0 : c.FIELD_MARGIN_Y)) / 2;\r\n const absY = c.TOPBAR_HEIGHT + c.FIELD_SPACEY + y + halfHeight;\r\n\r\n\r\n const c3 = this.drawConnector(\r\n nodeGroup,\r\n state.bg as SvgPath,\r\n absY,\r\n 'right',\r\n parseColor(c.FIELD_CONN_COLOR)\r\n );\r\n if (c3) {\r\n const c = {\r\n from: (field as ConnectableField)!.connection as Connection,\r\n to: ((field as ConnectableField)!.connection.getTo() as NodeSvg)?.previousConnection as Connection,\r\n fromCircle: c3 as SvgPath,\r\n originCircle: c3 as SvgPath,\r\n originConn: (field as ConnectableField)!.connection as Connection\r\n };\r\n cBubbleData = {\r\n connector: c3,\r\n connState: c\r\n }\r\n this.setConnect(c);\r\n eventer.addElement(c3, 'k_connectbubble', {\r\n connection: (field as ConnectableField)!.connection as Connection,\r\n field\r\n }).tagElement(c3, [(this.constructor as typeof Renderer).ELEMENT_TAG, `node_${node.id}`]);\r\n }\r\n }\r\n field.onDraw(rawData, cBubbleData);\r\n }\r\n }\r\n /**\r\n * Draw all fields on a node\r\n * @param nodeMeasurements - The node's measurements\r\n * @returns The final Y position.\r\n */\r\n drawAllFieldsForNode(nodeMeasurements: NodeMeasurements | null = null) {\r\n const node = this.node;\r\n let y = 0;\r\n const state = this.state;\r\n const c = this.constants;\r\n if (!node || !state || !state.fieldCol) return;\r\n const fieldsGroup = state.fieldCol;\r\n const nodeGroup = state.group as G;\r\n\r\n const measurements = nodeMeasurements ?? this.measureNodeDimensions();\r\n\r\n node.allFields().forEach((field, idx) => {\r\n this.drawFieldForNode(field, measurements as NodeMeasurements, idx, y);\r\n const fm = measurements?.fields[idx];\r\n if (!fm) return;\r\n y += fm.height + c.FIELD_MARGIN_Y;\r\n });\r\n\r\n state.fieldPosY = y;\r\n return y;\r\n }\r\n /**\r\n * Draw the previous and next connections of a node.\r\n * @param state - The draw-state\r\n * @param node - The node-svg\r\n * @param nodeGroup - the node's group\r\n * @param measurements - the node's measurements\r\n * @returns Void\r\n */\r\n drawPreviousNextConnections(state: DrawState, node: NodeSvg, nodeGroup: G, measurements: { width: number, height: number } | null = null) {\r\n if (!state || !node) return;\r\n if (!state.bg) return;\r\n const c = this.constants;\r\n const colors: ColorStyle = this.getNodeColors();\r\n /**\r\n * Draw connectors.\r\n */\r\n const bbox = state.bg?.bbox();\r\n const cY = (bbox?.height ?? measurements?.height) - c.FOOTER_HEIGHT;\r\n\r\n // Previous connection (left)\r\n if (node.previousConnection) {\r\n const c1 = this.drawConnector(nodeGroup, state.bg, cY, 'left', parseColor(colors.primary) as string);\r\n if (c1) {\r\n const c = ({\r\n from: node.previousConnection,\r\n to: this.resolveConnectable(node.previousConnection.getFrom(), node.previousConnection) as Connection,\r\n fromCircle: c1 as SvgPath,\r\n originConn: node.previousConnection,\r\n originCircle: c1\r\n });\r\n this.setConnect(c);\r\n eventer.addElement(c1, 'k_connectbubble', {\r\n connection: node.previousConnection,\r\n node\r\n }).tagElement(c1, [(this.constructor as typeof Renderer).ELEMENT_TAG, `node_${node.id}`]);\r\n // fill any waiting connectors from other nodes\r\n this._fillOtherNodeConnectorCircle(node.previousConnection, c1 as SvgPath, true);\r\n }\r\n }\r\n\r\n // Next connection (right)\r\n if (node.nextConnection) {\r\n const c2 = this.drawConnector(nodeGroup, state.bg, cY, 'right', parseColor(colors.primary) as string);\r\n if (c2) {\r\n const c = ({\r\n from: node.nextConnection,\r\n to: this.resolveConnectable(node.nextConnection.getTo(), node.nextConnection) as Connection,\r\n fromCircle: c2 as SvgPath,\r\n originConn: node.nextConnection,\r\n originCircle: c2\r\n });\r\n this.setConnect(c);\r\n eventer.addElement(c2, 'k_connectbubble', {\r\n connection: node.nextConnection,\r\n node\r\n }).tagElement(c2, [(this.constructor as typeof Renderer).ELEMENT_TAG, `node_${node.id}`]);\r\n // fill any waiting connectors from other nodes\r\n this._fillOtherNodeConnectorCircle(node.nextConnection, c2 as SvgPath, false);\r\n }\r\n }\r\n }\r\n // REFRESHING TRANSFORMS AND COMMENTS -\r\n /**\r\n * Refreshes the comment transforms.\r\n * @returns Void.\r\n */\r\n refreshComments() {\r\n return this._commentDrawer?.refreshCommentTransforms?.();\r\n }\r\n /**\r\n * Clears all comments from the workspace.\r\n * @returns Void.\r\n */\r\n clearComments() {\r\n return this._commentDrawer?.clearAllComments?.();\r\n }\r\n /**\r\n * Draws all comments in the workspace.\r\n * @returns Void.\r\n */\r\n drawComments() {\r\n return this._commentDrawer?.drawAllComments?.();\r\n }\r\n /**\r\n * Gets the current zoom level of the workspace.\r\n * @returns The zoom level.\r\n */\r\n getZoom() {\r\n return this._ws.getZoom() ?? 1;\r\n }\r\n /**\r\n * Applies the current zoom level to the specified node group.\r\n * @param nodeG - The SVG group element of the node.\r\n * @param node - The node to apply zoom to.\r\n */\r\n applyZoomToNode(nodeG: G, node: NodeSvg) {\r\n const zoom = this.getZoom();\r\n const { x, y } = this._ws.workspaceToScreen(node.relativeCoords.x, node.relativeCoords.y);\r\n nodeG.attr({ transform: `translate(${x}, ${y}) scale(${zoom})` });\r\n }\r\n /**\r\n * Refreshes the transforms of all nodes in the workspace.\r\n * @returns Void.\r\n */\r\n refreshNodeTransforms() {\r\n const nodeGroups = this.svg.find(`.${(this.constructor as typeof Renderer).NODE_G_TAG}`);\r\n const zoom = this.getZoom();\r\n\r\n for (let nodeG of nodeGroups) {\r\n const node = this._ws.getNode(unescapeAttr(nodeG.attr('data-node-id')));\r\n if (!node) continue;\r\n const { x, y } = this._ws.workspaceToScreen(node.relativeCoords.x, node.relativeCoords.y);\r\n nodeG.attr({ transform: `translate(${x}, ${y}) scale(${zoom})` });\r\n }\r\n\r\n this.refreshConnectionLines();\r\n this.refreshComments();\r\n }\r\n\r\n /**\r\n * Refreshes all connection lines in the workspace.\r\n * @returns Void.\r\n */\r\n refreshConnectionLines() {\r\n this.clearLines();\r\n this.drawLinesForAllNodes();\r\n }\r\n /**\r\n * Gets the colors for the current node.\r\n * @returns The color style of the node.\r\n */\r\n getNodeColors(): ColorStyle {\r\n const node: NodeSvg = this.node as NodeSvg;\r\n const colors: ColorStyle = node.colors ?? {\r\n primary: '#000',\r\n secondary: '#000',\r\n tertirary: '#000',\r\n category: ''\r\n };\r\n return colors;\r\n }\r\n // CONNECTOR BUBBLE HANDLING + CONNECTION RESOLVING -\r\n /**\r\n * Fill every node's connector bubble data with the corresponding bubble its connected to on a sibling node.\r\n */\r\n fillAllNodeConnectorBubbles() {\r\n for (const state of this._drawStates) {\r\n for (const connPair of state.pendingConnections) {\r\n const { originConn } = connPair;\r\n if (!originConn) continue;\r\n\r\n // Only try to fill missing sides with real circles from other pending connections\r\n if (!connPair.fromCircle) {\r\n const match = this._drawStates\r\n .flatMap(s => s.pendingConnections)\r\n .find(p => p.originConn === connPair.from && p.originCircle);\r\n if (match) connPair.fromCircle = match.originCircle;\r\n }\r\n\r\n if (!connPair.toCircle) {\r\n const match = this._drawStates\r\n .flatMap(s => s.pendingConnections)\r\n .find(p => p.originConn === connPair.to && p.originCircle);\r\n if (match) connPair.toCircle = match.originCircle;\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * Resolves the connectable to the appropriate connection based on the originating connection.\r\n * @param connectable - The connectable entity (NodeSvg or Field).\r\n * @param fromConn - The originating connection.\r\n * @returns \r\n */\r\n resolveConnectable(connectable: Connectable, fromConn: Connection): Connection | null | undefined {\r\n if (!connectable || !fromConn) return undefined;\r\n\r\n // If the connection is an input (previous), return the connectable's output (next) connection\r\n if (fromConn.isPrevious) {\r\n\r\n if (connectable instanceof NodeSvg) return connectable.nextConnection;\r\n // @ts-ignore\r\n if (connectable instanceof Field) return connectable.connection;\r\n }\r\n\r\n // If the connection is an output (next), return the connectable's input (previous) connection\r\n if (!fromConn.isPrevious) {\r\n if (connectable instanceof NodeSvg) return connectable.previousConnection;\r\n // @ts-ignore\r\n if (connectable instanceof Field) return connectable.connection;\r\n }\r\n }\r\n /**\r\n * Fills in the connector circle for other nodes based on the given connection.\r\n * @param conn - The connection to match.\r\n * @param circle - The SVG path of the connector circle.\r\n * @param isPrevious - Whether the connection is a previous connection.\r\n */\r\n _fillOtherNodeConnectorCircle(conn: Connection, circle: SvgPath, isPrevious: boolean) {\r\n for (const state of this._drawStates) {\r\n for (const connPair of state.pendingConnections) {\r\n // Only fill if the connection actually matches\r\n if (isPrevious) {\r\n // fill toCircle if this connPair expects 'conn' as its 'to'\r\n if (connPair.to === conn && !connPair.toCircle) {\r\n connPair.toCircle = circle;\r\n }\r\n } else {\r\n // fill fromCircle if this connPair expects 'conn' as its 'from'\r\n if (connPair.from === conn && !connPair.fromCircle) {\r\n connPair.fromCircle = circle;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n // LINE DRAWING -\r\n /**\r\n * Draw the connection lines between node's connector bubbles.\r\n */\r\n drawLinesForAllNodes() {\r\n const c = this.constants;\r\n const wsSvg = this._ws.svg;\r\n\r\n this.fillAllNodeConnectorBubbles();\r\n const drawnCircles = new Set<SvgPath>(); // store circles we've already drawn lines from/to\r\n\r\n for (const state of this._drawStates) {\r\n for (const connPair of state.pendingConnections) {\r\n const { fromCircle, toCircle } = connPair;\r\n if (connPair.from !== connPair.originConn) continue;\r\n if (!fromCircle || !toCircle) continue;\r\n\r\n // skip if either circle was already used\r\n if (drawnCircles.has(fromCircle) || drawnCircles.has(toCircle)) continue;\r\n\r\n // mark circles as used\r\n drawnCircles.add(fromCircle);\r\n drawnCircles.add(toCircle);\r\n // Get DOM elements\r\n const fromEl = fromCircle.node as SVGPathElement;\r\n const toEl = toCircle.node as SVGPathElement;\r\n\r\n // Use getBBox + getScreenCTM for absolute coordinates\r\n const fromBBox = fromEl.getBBox();\r\n const toBBox = toEl.getBBox();\r\n\r\n const fromCTM = fromEl.getScreenCTM()!;\r\n const toCTM = toEl.getScreenCTM()!;\r\n\r\n const startX = fromBBox.x + fromBBox.width / 2;\r\n const startY = fromBBox.y + fromBBox.height / 2;\r\n const endX = toBBox.x + toBBox.width / 2;\r\n const endY = toBBox.y + toBBox.height / 2;\r\n\r\n // Transform to screen coordinates\r\n const absStartX = startX * fromCTM.a + startY * fromCTM.c + fromCTM.e;\r\n const absStartY = startX * fromCTM.b + startY * fromCTM.d + fromCTM.f;\r\n const absEndX = endX * toCTM.a + endY * toCTM.c + toCTM.e;\r\n const absEndY = endX * toCTM.b + endY * toCTM.d + toCTM.f;\r\n\r\n // Draw the line\r\n let pathStr: string;\r\n if (c.CONNECTOR_LINE_CURVED) {\r\n const dx = Math.abs(absEndX - absStartX);\r\n const cp1x = absStartX + Math.sign(absEndX - absStartX) * Math.max(30, dx * 0.3);\r\n const cp2x = absEndX - Math.sign(absEndX - absStartX) * Math.max(30, dx * 0.3);\r\n pathStr = `M ${absStartX} ${absStartY} C ${cp1x} ${absStartY}, ${cp2x} ${absEndY}, ${absEndX} ${absEndY}`;\r\n } else {\r\n pathStr = `M ${absStartX} ${absStartY} L ${absEndX} ${absEndY}`;\r\n }\r\n const zoom = this._ws.getZoom();\r\n const strokeWidth = c.CONNECTOR_LINE_WIDTH * zoom;\r\n const line = wsSvg.path(pathStr)\r\n .stroke({ color: parseColor(fromCircle.fill() as Color), width: strokeWidth })\r\n .fill('none')\r\n .attr({ class: (this.constructor as typeof Renderer).CONN_LINE_TAG });\r\n\r\n eventer.addElement(line, 'k_connline', {\r\n fromConn: connPair.from,\r\n toConn: connPair.to,\r\n renderer: this\r\n }).tagElement(line, [(this.constructor as typeof Renderer).ELEMENT_TAG, (this.constructor as typeof Renderer).LINE_X_MARK_TAG]);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Clear connection lines and their X marks.\r\n */\r\n clearLines() {\r\n for (let line of this.getWs().svg.find(`.${(this.constructor as typeof Renderer).CONN_LINE_TAG}`)) {\r\n line.remove();\r\n }\r\n for (let mark of this.getWs().svg.find(`.${(this.constructor as typeof Renderer).LINE_X_MARK_TAG}`)) {\r\n mark.remove();\r\n }\r\n }\r\n /**\r\n * Clear the entire screen.\r\n */\r\n clearScreen() {\r\n // Destroy elements that were tagged (eventer system)\r\n eventer.destroyByTag((this.constructor as typeof Renderer).ELEMENT_TAG);\r\n\r\n // Remove all SVG children **except the background pattern rect**\r\n this._ws.svg.children().forEach((el) => {\r\n const isBackground = el.hasClass((this.constructor as typeof Renderer).BACKGROUND_PATTERN);\r\n const isDefs = el.node.tagName == 'defs';\r\n const isBgRect = el.classes().includes(WorkspaceSvg.BACKGROUND_CLASS);\r\n if (!isBackground && !isDefs && !isBgRect) el.remove();\r\n });\r\n\r\n // Reset internal draw state\r\n this._drawStates = [];\r\n }\r\n /**\r\n * Remove pending connections for a specific connection\r\n * @param conn - The connection\r\n */\r\n undoPendingConnsFor(conn: ConnectorToFrom) {\r\n for (let state of this._drawStates) {\r\n for (let conn0 of state.pendingConnections) {\r\n if (conn0.toCircle == conn.originCircle) {\r\n delete conn0.toCircle;\r\n }\r\n if (conn0.fromCircle == conn.originCircle) {\r\n delete conn0.fromCircle;\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * Called whenever a node must be visually rendered or rerendered.\r\n * Implementations must be idempotent.\r\n * @param node - The node to render/rerender\r\n * @returns SVG group of the node.\r\n */\r\n rerenderNode(node: NodeSvg) {\r\n // wipe old drawstate + events for this node\r\n const idx = this._drawStates.findIndex(s => s.id === node.id);\r\n if (idx !== -1) {\r\n const state = this._drawStates[idx];\r\n for (let pendingConn of state!.pendingConnections) {\r\n this.undoPendingConnsFor(pendingConn);\r\n }\r\n state!.group?.remove();\r\n eventer.destroyByTag(`node_${node.id}`);\r\n this._drawStates.splice(idx, 1);\r\n }\r\n\r\n // rebuild node\r\n this.startNode(node);\r\n this.drawNode();\r\n this.representer.build(this.node as NodeSvg, this, this.state as DrawState);\r\n this.storeState();\r\n\r\n // refresh *all* lines once the node is back in place\r\n this.refreshNodeTransforms();\r\n return (node.svg as RepresenterNode).getRaw();\r\n }\r\n\r\n}\r\n\r\nexport default Renderer;\r\n","'use strict';\n\n\nvar paramCounts = { a: 7, c: 6, h: 1, l: 2, m: 2, r: 4, q: 4, s: 4, t: 2, v: 1, z: 0 };\n\nvar SPECIAL_SPACES = [\n 0x1680, 0x180E, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006,\n 0x2007, 0x2008, 0x2009, 0x200A, 0x202F, 0x205F, 0x3000, 0xFEFF\n];\n\nfunction isSpace(ch) {\n return (ch === 0x0A) || (ch === 0x0D) || (ch === 0x2028) || (ch === 0x2029) || // Line terminators\n // White spaces\n (ch === 0x20) || (ch === 0x09) || (ch === 0x0B) || (ch === 0x0C) || (ch === 0xA0) ||\n (ch >= 0x1680 && SPECIAL_SPACES.indexOf(ch) >= 0);\n}\n\nfunction isCommand(code) {\n /*eslint-disable no-bitwise*/\n switch (code | 0x20) {\n case 0x6D/* m */:\n case 0x7A/* z */:\n case 0x6C/* l */:\n case 0x68/* h */:\n case 0x76/* v */:\n case 0x63/* c */:\n case 0x73/* s */:\n case 0x71/* q */:\n case 0x74/* t */:\n case 0x61/* a */:\n case 0x72/* r */:\n return true;\n }\n return false;\n}\n\nfunction isArc(code) {\n return (code | 0x20) === 0x61;\n}\n\nfunction isDigit(code) {\n return (code >= 48 && code <= 57); // 0..9\n}\n\nfunction isDigitStart(code) {\n return (code >= 48 && code <= 57) || /* 0..9 */\n code === 0x2B || /* + */\n code === 0x2D || /* - */\n code === 0x2E; /* . */\n}\n\n\nfunction State(path) {\n this.index = 0;\n this.path = path;\n this.max = path.length;\n this.result = [];\n this.param = 0.0;\n this.err = '';\n this.segmentStart = 0;\n this.data = [];\n}\n\nfunction skipSpaces(state) {\n while (state.index < state.max && isSpace(state.path.charCodeAt(state.index))) {\n state.index++;\n }\n}\n\n\nfunction scanFlag(state) {\n var ch = state.path.charCodeAt(state.index);\n\n if (ch === 0x30/* 0 */) {\n state.param = 0;\n state.index++;\n return;\n }\n\n if (ch === 0x31/* 1 */) {\n state.param = 1;\n state.index++;\n return;\n }\n\n state.err = 'SvgPath: arc flag can be 0 or 1 only (at pos ' + state.index + ')';\n}\n\n\nfunction scanParam(state) {\n var start = state.index,\n index = start,\n max = state.max,\n zeroFirst = false,\n hasCeiling = false,\n hasDecimal = false,\n hasDot = false,\n ch;\n\n if (index >= max) {\n state.err = 'SvgPath: missed param (at pos ' + index + ')';\n return;\n }\n ch = state.path.charCodeAt(index);\n\n if (ch === 0x2B/* + */ || ch === 0x2D/* - */) {\n index++;\n ch = (index < max) ? state.path.charCodeAt(index) : 0;\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n //\n if (!isDigit(ch) && ch !== 0x2E/* . */) {\n state.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n return;\n }\n\n if (ch !== 0x2E/* . */) {\n zeroFirst = (ch === 0x30/* 0 */);\n index++;\n\n ch = (index < max) ? state.path.charCodeAt(index) : 0;\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n state.err = 'SvgPath: numbers started with `0` such as `09` are illegal (at pos ' + start + ')';\n return;\n }\n }\n\n while (index < max && isDigit(state.path.charCodeAt(index))) {\n index++;\n hasCeiling = true;\n }\n ch = (index < max) ? state.path.charCodeAt(index) : 0;\n }\n\n if (ch === 0x2E/* . */) {\n hasDot = true;\n index++;\n while (isDigit(state.path.charCodeAt(index))) {\n index++;\n hasDecimal = true;\n }\n ch = (index < max) ? state.path.charCodeAt(index) : 0;\n }\n\n if (ch === 0x65/* e */ || ch === 0x45/* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n state.err = 'SvgPath: invalid float exponent (at pos ' + index + ')';\n return;\n }\n\n index++;\n\n ch = (index < max) ? state.path.charCodeAt(index) : 0;\n if (ch === 0x2B/* + */ || ch === 0x2D/* - */) {\n index++;\n }\n if (index < max && isDigit(state.path.charCodeAt(index))) {\n while (index < max && isDigit(state.path.charCodeAt(index))) {\n index++;\n }\n } else {\n state.err = 'SvgPath: invalid float exponent (at pos ' + index + ')';\n return;\n }\n }\n\n state.index = index;\n state.param = parseFloat(state.path.slice(start, index)) + 0.0;\n}\n\n\nfunction finalizeSegment(state) {\n var cmd, cmdLC;\n\n // Process duplicated commands (without comand name)\n\n // This logic is shamelessly borrowed from Raphael\n // https://github.com/DmitryBaranovskiy/raphael/\n //\n cmd = state.path[state.segmentStart];\n cmdLC = cmd.toLowerCase();\n\n var params = state.data;\n\n if (cmdLC === 'm' && params.length > 2) {\n state.result.push([ cmd, params[0], params[1] ]);\n params = params.slice(2);\n cmdLC = 'l';\n cmd = (cmd === 'm') ? 'l' : 'L';\n }\n\n if (cmdLC === 'r') {\n state.result.push([ cmd ].concat(params));\n } else {\n\n while (params.length >= paramCounts[cmdLC]) {\n state.result.push([ cmd ].concat(params.splice(0, paramCounts[cmdLC])));\n if (!paramCounts[cmdLC]) {\n break;\n }\n }\n }\n}\n\n\nfunction scanSegment(state) {\n var max = state.max,\n cmdCode, is_arc, comma_found, need_params, i;\n\n state.segmentStart = state.index;\n cmdCode = state.path.charCodeAt(state.index);\n is_arc = isArc(cmdCode);\n\n if (!isCommand(cmdCode)) {\n state.err = 'SvgPath: bad command ' + state.path[state.index] + ' (at pos ' + state.index + ')';\n return;\n }\n\n need_params = paramCounts[state.path[state.index].toLowerCase()];\n\n state.index++;\n skipSpaces(state);\n\n state.data = [];\n\n if (!need_params) {\n // Z\n finalizeSegment(state);\n return;\n }\n\n comma_found = false;\n\n for (;;) {\n for (i = need_params; i > 0; i--) {\n if (is_arc && (i === 3 || i === 4)) scanFlag(state);\n else scanParam(state);\n\n if (state.err.length) {\n finalizeSegment(state);\n return;\n }\n state.data.push(state.param);\n\n skipSpaces(state);\n comma_found = false;\n\n if (state.index < max && state.path.charCodeAt(state.index) === 0x2C/* , */) {\n state.index++;\n skipSpaces(state);\n comma_found = true;\n }\n }\n\n // after ',' param is mandatory\n if (comma_found) {\n continue;\n }\n\n if (state.index >= state.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(state.path.charCodeAt(state.index))) {\n break;\n }\n }\n\n finalizeSegment(state);\n}\n\n\n/* Returns array of segments:\n *\n * [\n * [ command, coord1, coord2, ... ]\n * ]\n */\nmodule.exports = function pathParse(svgPath) {\n var state = new State(svgPath);\n var max = state.max;\n\n skipSpaces(state);\n\n while (state.index < max && !state.err.length) {\n scanSegment(state);\n }\n\n if (state.result.length) {\n if ('mM'.indexOf(state.result[0][0]) < 0) {\n state.err = 'SvgPath: string should start with `M` or `m`';\n state.result = [];\n } else {\n state.result[0][0] = 'M';\n }\n }\n\n return {\n err: state.err,\n segments: state.result\n };\n};\n","import KabelWSTheme from './default';\r\nimport KabelDarkTheme from './dark';\r\n\r\nconst Themes = {\r\n Classic: KabelWSTheme,\r\n Dark: KabelDarkTheme\r\n}\r\n\r\nexport default Themes;","/**\r\n * Converts HTML-escaped characters in a string back to their literal form.\r\n *\r\n * Specifically, it replaces:\r\n * - `&lt;` with `<`\r\n * - `&gt;` with `>`\r\n * - `&quot;` with `\"`\r\n * - `&apos;` with `'`\r\n * - `&amp;` with `&`\r\n *\r\n * @param {string} s - The string containing HTML-escaped characters.\r\n * @returns {string} The unescaped string with HTML entities replaced by their literal characters.\r\n */\r\nfunction unescapeAttr(s: string): string {\r\n\treturn s.replace(/&lt;/g, \"<\")\r\n\t\t\t.replace(/&gt;/g, \">\")\r\n\t\t\t.replace(/&quot;/g, '\"')\r\n\t\t\t.replace(/&apos;/g, \"'\")\r\n\t\t\t.replace(/&amp;/g, \"&\");\r\n}\r\n\r\nexport default unescapeAttr;\r\n","import WorkspaceSvg from \"./workspace-svg\";\r\nimport Coordinates from \"./coordinates\";\r\nimport { generateUID } from \"../util/uid\";\r\nimport Workspace from \"./workspace\";\r\n\r\nexport interface WidgetOptions {\r\n /**\r\n * Widget class to instantiate for the widget, by default it uses Kabel's\r\n */\r\n cls?: typeof Widget;\r\n /**\r\n * Coordinates to spawn the widget at.\r\n */\r\n coords?: Coordinates; // where to position the widget\r\n /**\r\n * Width of the widget\r\n */\r\n width?: number; // optional width\r\n /**\r\n * Height of the widget.\r\n */\r\n height?: number; // optional height\r\n /**\r\n * Class to give the widget's html container.\r\n */\r\n className?: string; // optional CSS class\r\n /**\r\n * Widget inner HTML default content.\r\n */\r\n html?: string; // inner HTML\r\n /**\r\n * Widget name\r\n */\r\n name: string;\r\n /**\r\n * Sets up a new widget of this type\r\n * @param this - This context of the function points to widget.\r\n * @param widget - The widget this function is called on.\r\n * @param html - The html container of the widget.\r\n * @returns - Void.\r\n */\r\n init?: (this: WidgetOptions, widget: Widget, html: HTMLElement) => void;\r\n}\r\nclass Widget {\r\n workspace: WorkspaceSvg|Workspace;\r\n container: HTMLDivElement;\r\n coords: Coordinates;\r\n width: number;\r\n height: number;\r\n visible: boolean;\r\n name: string;\r\n id: string;\r\n options: WidgetOptions;\r\n static WIDGET_GLOBAL_ID = 0;\r\n constructor(workspace: WorkspaceSvg|Workspace, options: WidgetOptions = { name: `Untitled(${Widget.WIDGET_GLOBAL_ID++})` }) {\r\n this.workspace = workspace;\r\n this.coords = options.coords ?? new Coordinates(0, 0);\r\n this.width = options.width ?? 200;\r\n this.height = options.height ?? 100;\r\n this.visible = false;\r\n this.name = options.name;\r\n this.id = generateUID('nanoid', { alphabet: 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0129384756!)@(#*$&%^' });\r\n this.options = options;\r\n this.container = document.createElement(\"div\");\r\n this.container.className = options.className ?? \"KabelWidget\";\r\n this.container.style.position = \"absolute\";\r\n this.container.style.left = `${this.coords.x}px`;\r\n this.container.style.top = `${this.coords.y}px`;\r\n this.container.style.width = `${this.width}px`;\r\n this.container.style.height = `${this.height}px`;\r\n this.container.style.background = \"rgba(255,255,255,0.9)\";\r\n this.container.style.border = \"1px solid #aaa\";\r\n this.container.style.borderRadius = \"4px\";\r\n this.container.style.boxShadow = \"0 2px 6px rgba(0,0,0,0.2)\";\r\n this.container.style.pointerEvents = \"auto\";\r\n this.container.style.zIndex = \"1000\"; // overlays nodes\r\n\r\n if (options.html) this.container.innerHTML = options.html;\r\n\r\n if (!this.workspace.isHeadless) (this.workspace as WorkspaceSvg)._wsTop.appendChild(this.container);\r\n this.hide();\r\n if (typeof options.init !== 'undefined' && options.init) {\r\n options.init(this, this.container);\r\n }\r\n }\r\n\r\n // Show the widget\r\n show() {\r\n this.container.style.display = \"block\";\r\n this.visible = true;\r\n }\r\n\r\n // Hide the widget\r\n hide() {\r\n this.container.style.display = \"none\";\r\n this.visible = false;\r\n }\r\n\r\n // Move the widget to new coords\r\n setCoords(coords: Coordinates) {\r\n this.coords = coords;\r\n this.container.style.left = `${coords.x}px`;\r\n this.container.style.top = `${coords.y}px`;\r\n }\r\n\r\n // Update the HTML content\r\n setHTML(html: string) {\r\n this.container.innerHTML = html;\r\n }\r\n // Bring widget back from the dead after a .destroy call\r\n reanimate() {\r\n this.container = document.createElement(\"div\");\r\n this.container.className = this.options.className ?? \"KabelWidget\";\r\n this.container.style.position = \"absolute\";\r\n this.container.style.left = `${this.coords.x}px`;\r\n this.container.style.top = `${this.coords.y}px`;\r\n this.container.style.width = `${this.width}px`;\r\n this.container.style.height = `${this.height}px`;\r\n this.container.style.background = \"rgba(255,255,255,0.9)\";\r\n this.container.style.border = \"1px solid #aaa\";\r\n this.container.style.borderRadius = \"4px\";\r\n this.container.style.boxShadow = \"0 2px 6px rgba(0,0,0,0.2)\";\r\n this.container.style.pointerEvents = \"auto\";\r\n this.container.style.zIndex = \"1000\"; // overlays nodes\r\n \r\n if (this.options.html) this.container.innerHTML = this.options.html;\r\n if (this.workspace.isHeadless) return;\r\n\r\n (this.workspace as WorkspaceSvg)._wsTop.appendChild(this.container);\r\n this.workspace._addWidgetToDB(this);\r\n }\r\n // Destroy widget & cleanup.\r\n destroy() {\r\n this.container.remove();\r\n this.workspace._delWidgetFromDB(this);\r\n }\r\n}\r\n\r\nexport default Widget;\r\n","import WorkspaceSvg from \"./workspace-svg\";\r\n\r\ninterface HistoryEntry {\r\n\tstate: any; // serialized workspace or diff\r\n}\r\n\r\nexport default class UndoRedoHistory {\r\n\tprivate ws: WorkspaceSvg;\r\n\tprivate undoStack: HistoryEntry[] = [];\r\n\tprivate redoStack: HistoryEntry[] = [];\r\n\tprivate isRecording: boolean = true;\r\n\r\n\tconstructor(ws: WorkspaceSvg) {\r\n\t\tthis.ws = ws;\r\n\t}\r\n\r\n\temitChange() {\r\n\t\tif (!this.isRecording) return;\r\n\t\tif (!this.ws.recordHistory) return;\r\n\r\n\t\tconst state = this.ws.toJson ? this.ws.toJson(true) : {};\r\n\t\tthis.undoStack.push({ state });\r\n\t\tthis.redoStack.length = 0;\r\n\r\n\t\t//console.log(\"[emitChange] pushed state. undoStack size:\", this.undoStack.length, \"redoStack cleared\");\r\n\t}\r\n\r\n\tundo() {\r\n\t\t//console.log(\"[undo] called. undoStack size:\", this.undoStack.length, \"redoStack size:\", this.redoStack.length);\r\n\r\n\t\tif (this.undoStack.length <= 1) {\r\n\t\t\t//console.log(\"[undo] nothing to undo.\");\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst current = this.undoStack.pop();\r\n\t\t//console.log(\"[undo] popped current state:\", current);\r\n\r\n\t\tconst prev = this.undoStack[this.undoStack.length - 1];\r\n\t\t//console.log(\"[undo] previous state to restore:\", prev);\r\n\r\n\t\tif (!prev) {\r\n\t\t\t//console.log(\"[undo] no previous state found.\");\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.isRecording = false;\r\n\t\tthis.ws.fromJson?.(prev.state);\r\n\t\tthis.isRecording = true;\r\n\r\n\t\tthis.redoStack.push(current as HistoryEntry);\r\n\t\t//console.log(\"[undo] state restored. undoStack size now:\", this.undoStack.length, \"redoStack size now:\", this.redoStack.length);\r\n\t}\r\n\r\n\tredo() {\r\n\t\t//console.log(\"[redo] called. undoStack size:\", this.undoStack.length, \"redoStack size:\", this.redoStack.length);\r\n\r\n\t\tconst entry = this.redoStack.pop();\r\n\t\tif (!entry) {\r\n\t\t\t//console.log(\"[redo] nothing to redo.\");\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t//console.log(\"[redo] popping state from redoStack:\", entry);\r\n\r\n\t\tthis.isRecording = false;\r\n\t\tthis.ws.fromJson?.(entry.state);\r\n\t\tthis.isRecording = true;\r\n\r\n\t\tthis.undoStack.push(entry);\r\n\t\t//console.log(\"[redo] state restored. undoStack size now:\", this.undoStack.length, \"redoStack size now:\", this.redoStack.length);\r\n\t}\r\n\r\n\tclear() {\r\n\t\tthis.undoStack = [];\r\n\t\tthis.redoStack = [];\r\n\t\t//console.log(\"[clear] undo and redo stacks cleared\");\r\n\t}\r\n\r\n\tcanUndo() {\r\n\t\treturn this.undoStack.length > 1;\r\n\t}\r\n\r\n\tcanRedo() {\r\n\t\treturn this.redoStack.length > 0;\r\n\t}\r\n}\r\n","import { InjectMsg } from \"./inject\";\r\nimport { setMainWorkspace } from \"./main-workspace\";\r\nimport Workspace from \"./workspace\";\r\n\r\n\r\n\r\n\r\nfunction injectHeadless() : Workspace | undefined {\r\n try {\r\n const ws = new Workspace();\r\n setMainWorkspace(ws);\r\n return ws;\r\n } catch (e) {\r\n new InjectMsg(`Failed to initialize workspace: ${(e as Error).message}`).err();\r\n }\r\n}\r\n\r\nexport default injectHeadless;","'use strict';\n\n/* eslint-disable space-infix-ops */\n\n// The precision used to consider an ellipse as a circle\n//\nvar epsilon = 0.0000000001;\n\n// To convert degree in radians\n//\nvar torad = Math.PI / 180;\n\n// Class constructor :\n// an ellipse centred at 0 with radii rx,ry and x - axis - angle ax.\n//\nfunction Ellipse(rx, ry, ax) {\n if (!(this instanceof Ellipse)) { return new Ellipse(rx, ry, ax); }\n this.rx = rx;\n this.ry = ry;\n this.ax = ax;\n}\n\n// Apply a linear transform m to the ellipse\n// m is an array representing a matrix :\n// - -\n// | m[0] m[2] |\n// | m[1] m[3] |\n// - -\n//\nEllipse.prototype.transform = function (m) {\n // We consider the current ellipse as image of the unit circle\n // by first scale(rx,ry) and then rotate(ax) ...\n // So we apply ma = m x rotate(ax) x scale(rx,ry) to the unit circle.\n var c = Math.cos(this.ax * torad), s = Math.sin(this.ax * torad);\n var ma = [\n this.rx * (m[0]*c + m[2]*s),\n this.rx * (m[1]*c + m[3]*s),\n this.ry * (-m[0]*s + m[2]*c),\n this.ry * (-m[1]*s + m[3]*c)\n ];\n\n // ma * transpose(ma) = [ J L ]\n // [ L K ]\n // L is calculated later (if the image is not a circle)\n var J = ma[0]*ma[0] + ma[2]*ma[2],\n K = ma[1]*ma[1] + ma[3]*ma[3];\n\n // the discriminant of the characteristic polynomial of ma * transpose(ma)\n var D = ((ma[0]-ma[3])*(ma[0]-ma[3]) + (ma[2]+ma[1])*(ma[2]+ma[1])) *\n ((ma[0]+ma[3])*(ma[0]+ma[3]) + (ma[2]-ma[1])*(ma[2]-ma[1]));\n\n // the \"mean eigenvalue\"\n var JK = (J + K) / 2;\n\n // check if the image is (almost) a circle\n if (D < epsilon * JK) {\n // if it is\n this.rx = this.ry = Math.sqrt(JK);\n this.ax = 0;\n return this;\n }\n\n // if it is not a circle\n var L = ma[0]*ma[1] + ma[2]*ma[3];\n\n D = Math.sqrt(D);\n\n // {l1,l2} = the two eigen values of ma * transpose(ma)\n var l1 = JK + D/2,\n l2 = JK - D/2;\n // the x - axis - rotation angle is the argument of the l1 - eigenvector\n /*eslint-disable indent*/\n this.ax = (Math.abs(L) < epsilon && Math.abs(l1 - K) < epsilon) ?\n 90\n :\n Math.atan(Math.abs(L) > Math.abs(l1 - K) ?\n (l1 - J) / L\n :\n L / (l1 - K)\n ) * 180 / Math.PI;\n /*eslint-enable indent*/\n\n // if ax > 0 => rx = sqrt(l1), ry = sqrt(l2), else exchange axes and ax += 90\n if (this.ax >= 0) {\n // if ax in [0,90]\n this.rx = Math.sqrt(l1);\n this.ry = Math.sqrt(l2);\n } else {\n // if ax in ]-90,0[ => exchange axes\n this.ax += 90;\n this.rx = Math.sqrt(l2);\n this.ry = Math.sqrt(l1);\n }\n\n return this;\n};\n\n// Check if the ellipse is (almost) degenerate, i.e. rx = 0 or ry = 0\n//\nEllipse.prototype.isDegenerate = function () {\n return (this.rx < epsilon * this.ry || this.ry < epsilon * this.rx);\n};\n\nmodule.exports = Ellipse;\n","import Coordinates from \"./coordinates\";\r\n\r\n\r\n\r\n/**\r\n * A class that represents Workspace Camera Coords.\r\n * May be used in the future, right now its a no-op Coords wrapper.\r\n */\r\nclass WorkspaceCoords extends Coordinates {\r\n constructor(x = 0, y = 0) {\r\n super(x, y);\r\n }\r\n}\r\nexport default WorkspaceCoords;","import Coordinates from \"./coordinates\";\r\nimport NodeSvg from \"./nodesvg\";\r\nimport { Svg, SVG, Pattern, Rect } from '@svgdotjs/svg.js';\r\nimport Renderer from '../renderers/renderer';\r\nimport { InjectOptions } from \"./inject\";\r\nimport WorkspaceCoords from \"./workspace-coords\";\r\nimport WorkspaceController from '../controllers/base';\r\nimport WASDController from '../controllers/wasd';\r\nimport { RMap } from \"./renderer-map\";\r\nimport Toolbox from \"./toolbox\";\r\nimport NodePrototypes from \"./prototypes\";\r\nimport newHeadlessNode from \"./headless-node\";\r\nimport Widget from \"./widget\";\r\nimport WidgetPrototypes from \"./widget-prototypes\";\r\nimport ContextMenuHTML from \"./context-menu\";\r\nimport CommentModel from \"./comment\";\r\nimport Field, { ConnectableField } from \"./field\";\r\nimport waitFrames from \"../util/wait-anim-frames\";\r\nimport { addWindowListener } from \"../util/window-listeners\";\r\nimport Grid from \"./grid\";\r\nimport UndoRedoHistory from \"./undo-redo\";\r\nimport hasProp from \"../util/has-prop\";\r\nimport Workspace from \"./workspace\";\r\nimport Themes from '../themes/themes';\r\nimport { Color } from \"./visual-types\";\r\nimport { parseColor } from \"../util/parse-color\";\r\n\r\nexport interface IDragState {\r\n isDragging: boolean;\r\n startX: number;\r\n startY: number;\r\n lastX: number;\r\n lastY: number;\r\n deltaX: number;\r\n deltaY: number;\r\n offsetX: number;\r\n offsetY: number;\r\n node: NodeSvg | null;\r\n}\r\n\r\nfunction resolveController(options: InjectOptions): typeof WorkspaceController {\r\n if (options?.controls) {\r\n if (options?.controls.wasd) {\r\n return WASDController;\r\n }\r\n }\r\n return WorkspaceController;\r\n}\r\n\r\nexport interface WSTheme {\r\n UIStyles?: {\r\n workspaceBGColor?: Color;\r\n toolboxCategoriesBG?: Partial<CSSStyleDeclaration>;\r\n toolboxFlyoutBG?: Partial<CSSStyleDeclaration>;\r\n }\r\n}\r\ntype ThemeKeys = keyof typeof Themes; // \"Classic\" | \"Dark\"\r\n/** \r\n * Represents the visual workspace containing nodes and connections.\r\n * Handles rendering, panning, and coordinate transformations.\r\n */\r\nclass WorkspaceSvg extends Workspace {\r\n static get BACKGROUND_CLASS() {\r\n return 'WorkspaceBackgroundRect';\r\n }\r\n /**\r\n * Theme of the workspace\r\n */\r\n theme!: WSTheme;\r\n /**\r\n * Workspace background pattern items.\r\n */\r\n grid?: Grid;\r\n /** Top-left offset of the workspace viewport */\r\n _camera: WorkspaceCoords;\r\n\r\n /** Node storage by unique ID */\r\n _nodeDB: Map<string, NodeSvg>;\r\n\r\n /** Root HTML container for the workspace */\r\n _root: HTMLElement;\r\n\r\n /** Top-level wrapper for the SVG */\r\n _wsTop: HTMLElement;\r\n\r\n /** SVG.js instance for rendering */\r\n svg: Svg;\r\n /** The background element */\r\n _backgroundRect!: Rect;\r\n /** Renderer instance for drawing nodes and connections */\r\n renderer: Renderer;\r\n\r\n /** Options for workspace behavior and rendering overrides */\r\n options: InjectOptions;\r\n\r\n /** Flag to temporarily prevent redraws */\r\n noRedraw: boolean;\r\n /**\r\n * A class instance that moves the camera based on user interactions.\r\n */\r\n controller: WorkspaceController;\r\n /**\r\n * Toolbox for the workspace.\r\n */\r\n toolbox?: Toolbox;\r\n /**\r\n * A list of widgets active in this workspace\r\n */\r\n _widgetDB: Map<string, Widget>\r\n\r\n /**\r\n * A manager for the context menu widget\r\n */\r\n _ctxMenu: ContextMenuHTML\r\n /**\r\n * A list of comments for this workspace.\r\n */\r\n _commentDB: Set<CommentModel>;\r\n /**\r\n * Undo/redo history\r\n */\r\n history: UndoRedoHistory;\r\n /**\r\n * Whether to record undo/redo history or not\r\n */\r\n recordHistory: boolean = true;\r\n /**\r\n * Stack of old recordHistory values for toggleHistory\r\n */\r\n recordHistoryRecord: boolean[];\r\n /**\r\n * Internal flag to indicate if the camera has moved this frame.\r\n */\r\n _didMove: boolean = false;\r\n /**\r\n * Listeners to call when the workspace moves.\r\n */\r\n moveListeners: (() => void)[];\r\n /** Current drag state for node dragging */\r\n dragState: IDragState | null = null;\r\n /**\r\n * Creates a new WorkspaceSvg instance.\r\n * @param root - The root HTML element containing the workspace.\r\n * @param wsTop - The top-level wrapper element for the SVG.\r\n * @param options - Configuration and renderer override options.\r\n */\r\n constructor(root: HTMLElement, wsTop: HTMLElement, options: InjectOptions) {\r\n super();\r\n this.isHeadless = false;\r\n wsTop.style.width = '100%';\r\n wsTop.style.height = '100%';\r\n\r\n this._root = root;\r\n this._wsTop = wsTop;\r\n this.svg = SVG().addTo(this._wsTop).size('100%', '100%');\r\n this.options = options;\r\n let RClass: typeof Renderer = RMap.resolve(options.renderer);\r\n this.renderer = new RClass(this, this.options.rendererOverrides || {});\r\n\r\n const themeKey = (typeof options.theme === 'string' && options.theme in Themes)\r\n ? options.theme as ThemeKeys\r\n : 'Classic';\r\n\r\n const theme = (typeof options.theme === 'object' && options.theme)\r\n ? options.theme\r\n : Themes[themeKey];\r\n\r\n if (this.options.toolbox) {\r\n this.toolbox = new Toolbox(this);\r\n }\r\n\r\n this._camera = new WorkspaceCoords(0, 0);\r\n this._nodeDB = new Map();\r\n this.noRedraw = false;\r\n this.controller = new (options.Controller ?? resolveController(options))(this);\r\n this._widgetDB = new Map();\r\n this._ctxMenu = new ContextMenuHTML(this);\r\n this._commentDB = new Set();\r\n this.history = new UndoRedoHistory(this);\r\n this.recordHistoryRecord = [];\r\n this.moveListeners = [];\r\n if (options.initUndoRedo !== false) {\r\n this.history.emitChange();\r\n }\r\n this.theme = {}; //placeholder\r\n this._initBackground();\r\n\r\n this.setTheme(theme); // set theme to user-defined theme.\r\n }\r\n setTheme(theme: WSTheme) {\r\n try {\r\n this.theme = structuredClone(theme);\r\n } catch {\r\n this.theme = Object.assign({}, theme);\r\n }\r\n // Clone theme so you can mutate ws.theme seperate from Kabels.Themes[ThemeName]\r\n if (this.toolbox) this.toolbox.updateStyles(this.theme);\r\n if (this.theme.UIStyles) {\r\n this._backgroundRect.fill(parseColor(this.theme.UIStyles.workspaceBGColor || '#fffffff'))\r\n }\r\n }\r\n /**\r\n * Getter and setter for whether we moved or not this frame.\r\n */\r\n get didMove() { return this._didMove; }\r\n set didMove(value: boolean) {\r\n this._didMove = value;\r\n if (value) {\r\n waitFrames(1, () => { this._didMove = false; });\r\n }\r\n }\r\n /**\r\n * Sets the drag state of the workspace.\r\n * @param params - Drag state parameters.\r\n * @returns Void.\r\n */\r\n setDragState(params: {\r\n node: NodeSvg | null;\r\n startX: number;\r\n startY: number;\r\n currentX: number;\r\n currentY: number;\r\n offsetX?: number;\r\n offsetY?: number;\r\n }) {\r\n if (!params.node) {\r\n this.dragState = null;\r\n return;\r\n }\r\n\r\n const {\r\n node,\r\n startX,\r\n startY,\r\n currentX,\r\n currentY,\r\n offsetX = 0,\r\n offsetY = 0\r\n } = params;\r\n\r\n this.dragState = {\r\n isDragging: true,\r\n node,\r\n startX,\r\n startY,\r\n offsetX,\r\n offsetY,\r\n lastX: currentX,\r\n lastY: currentY,\r\n deltaX: currentX - startX,\r\n deltaY: currentY - startY\r\n };\r\n }\r\n beginDrag(node: NodeSvg, startX: number, startY: number, offsetX: number = 0, offsetY: number = 0) {\r\n this.dragState = {\r\n isDragging: true,\r\n node,\r\n startX,\r\n startY,\r\n offsetX,\r\n offsetY,\r\n lastX: startX,\r\n lastY: startY,\r\n deltaX: 0,\r\n deltaY: 0\r\n };\r\n }\r\n /**\r\n * Updates the current drag position.\r\n * @param currentX - Current X position.\r\n * @param currentY - Current Y position.\r\n * @returns Void.\r\n */\r\n updateDrag(currentX: number, currentY: number) {\r\n if (!this.dragState || !this.dragState.node) return;\r\n\r\n this.dragState.lastX = currentX;\r\n this.dragState.lastY = currentY;\r\n this.dragState.deltaX = currentX - this.dragState.startX;\r\n this.dragState.deltaY = currentY - this.dragState.startY;\r\n }\r\n endDrag() {\r\n // Set drag state.isDragging to false instead of clearing.\r\n if (this.dragState) this.dragState.isDragging = false;\r\n }\r\n\r\n\r\n /**\r\n * Fires all move listeners registered to this workspace.\r\n */\r\n fireMoveListeners() {\r\n this.moveListeners.forEach(e => e());\r\n }\r\n /**\r\n * Adds a move listener to the workspace.\r\n * @param listener - The listener function to add.\r\n * @returns A function to remove the added listener.\r\n */\r\n addMoveListener(listener: () => void): () => void {\r\n this.moveListeners.push(listener);\r\n return () => {\r\n this.removeMoveListener(listener);\r\n }\r\n }\r\n /**\r\n * Removes a move listener from the workspace.\r\n * @param listener - The listener function to remove.\r\n */\r\n removeMoveListener(listener: () => void) {\r\n this.moveListeners = this.moveListeners.filter(e => e != listener);\r\n }\r\n /**\r\n * Emits a change event for the workspace, triggering\r\n * undo/redo history tracking.\r\n */\r\n emitChange() {\r\n this.history.emitChange();\r\n }\r\n\r\n /**\r\n * Temporarily sets the workspace's history recording state.\r\n * Pushes the previous state onto a stack for later restoration.\r\n * \r\n * @param {boolean} value - Whether history recording should be enabled.\r\n */\r\n toggleHistory(value: boolean) {\r\n this.recordHistoryRecord.push(this.recordHistory);\r\n this.recordHistory = value;\r\n }\r\n\r\n /**\r\n * Restores the previous history recording state from the stack.\r\n * Use after a temporary toggle to revert to the previous state.\r\n */\r\n untoggleHistory() {\r\n if (this.recordHistoryRecord.length == 0 || this.recordHistoryRecord.length < 0) return;\r\n this.recordHistory = this.recordHistoryRecord.pop() as boolean;\r\n }\r\n\r\n /**\r\n * Sets the background grid up based on user selected options.\r\n */\r\n _initBackground() {\r\n try {\r\n this._backgroundRect = this.svg.rect(this.svg.width(), this.svg.height())\r\n .fill(parseColor(this.theme.UIStyles?.workspaceBGColor || '#ffffff'))\r\n .addClass(WorkspaceSvg.BACKGROUND_CLASS)\r\n .addTo(this.svg);\r\n\r\n // ensure it has a parent\r\n this.svg.add(this._backgroundRect);\r\n\r\n // now you can safely move it to the back\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n if (this.options.grid) {\r\n this.grid = new Grid(this, this.svg, this.options.grid);\r\n }\r\n this._backgroundRect?.back();\r\n }\r\n /**\r\n * Updates the transform of the background grid\r\n */\r\n _updateBackgroundTransform() {\r\n this.grid?.updateTransform?.();\r\n try {\r\n this._backgroundRect.back();\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n }\r\n\r\n /**\r\n * Get the current zoom factor of the workspace.\r\n * @returns - The zoom factor\r\n */\r\n getZoom() {\r\n return this.controller.getZoom();\r\n }\r\n /**\r\n * Refresh comments.\r\n */\r\n refreshComments() {\r\n this.renderer.refreshComments();\r\n }\r\n /**\r\n * Get all comments\r\n * @returns {CommentModel[]}\r\n */\r\n getComments() {\r\n return Array.from(this._commentDB);\r\n }\r\n /**\r\n * Duplicate node data from one to another\r\n * @param nodeSvg - The node\r\n */\r\n cloneNode(nodeSvg: NodeSvg) {\r\n const n = new NodeSvg(nodeSvg.prototype, this);\r\n n.init();\r\n n.fromNode(nodeSvg);\r\n this.redraw();\r\n }\r\n /**\r\n * Internal: Add widget to DB\r\n * @param wdgt - The widget\r\n */\r\n _addWidgetToDB(wdgt: Widget) {\r\n this._widgetDB.set(wdgt.id, wdgt);\r\n }\r\n /**\r\n * Internal: Delete a widget from DB.\r\n * @param wdgt - Widget to delete\r\n */\r\n _delWidgetFromDB(wdgt: Widget) {\r\n this._widgetDB.delete(wdgt.id);\r\n }\r\n /**\r\n * Create a new widget of type.\r\n * @param type - The prototype\r\n * @returns {Widget|void}\r\n */\r\n newWidget(type: string): void | Widget {\r\n const opts = WidgetPrototypes[type];\r\n if (!opts) return;\r\n if (opts.cls) {\r\n const wdgt = new (opts.cls)(this, opts);\r\n this._addWidgetToDB(wdgt);\r\n return wdgt;\r\n }\r\n const wdgt = new Widget(this, opts);\r\n this._addWidgetToDB(wdgt);\r\n return wdgt;\r\n }\r\n /**\r\n * Get a widget\r\n * @param id - Identifier\r\n * @returns {Widget|undefined} - A widget\r\n */\r\n getWidget(id: string): Widget | undefined {\r\n if (this._widgetDB.has(id)) return this._widgetDB.get(id);\r\n return undefined;\r\n }\r\n /**\r\n * Returns the current width and height of the workspace's svg content size in pixels.\r\n * Useful for camera positioning.\r\n */\r\n getContentSize(): { width: number; height: number } {\r\n const bbox = this.svg.bbox();\r\n return { width: bbox.width, height: bbox.height };\r\n }\r\n /**\r\n * Returns the current width and height of the workspace in pixels.\r\n * Useful for camera centering, zoom calculations, and viewport sizing.\r\n */\r\n getSize(): { width: number; height: number } {\r\n const rect = this._wsTop.getBoundingClientRect();\r\n return { width: rect.width, height: rect.height };\r\n }\r\n\r\n /**\r\n * Updates all connection lines & node screen positions without a full redraw.\r\n * Used when nodes are dragged or the camera moves.\r\n */\r\n refresh() {\r\n this.renderer.refreshNodeTransforms();\r\n this._updateBackgroundTransform();\r\n }\r\n\r\n /** Draws all nodes in the workspace. Very heavy. */\r\n drawAllNodes() {\r\n for (let [nodeId, _] of this._nodeDB) {\r\n this.drawNode(nodeId);\r\n }\r\n }\r\n\r\n /** Redraws the entire workspace unless noRedraw is set. */\r\n redraw() {\r\n if (this.noRedraw) return;\r\n this.renderer.clearScreen();\r\n this.drawAllNodes();\r\n this.refresh();\r\n this.renderer.clearComments();\r\n this.renderer.drawComments();\r\n }\r\n\r\n /**\r\n * Converts workspace coordinates to screen (SVG) coordinates.\r\n * @param x - X position in workspace coordinates.\r\n * @param y - Y position in workspace coordinates.\r\n * @returns Screen coordinates as a Coordinates instance.\r\n */\r\n workspaceToScreen(workX: number, workY: number) {\r\n const zoom = this.getZoom();\r\n // _camera represents the top-left of the visible viewport in workspace coords\r\n const x = (workX - this._camera.x) * zoom;\r\n const y = (workY - this._camera.y) * zoom;\r\n return { x, y };\r\n }\r\n\r\n /**\r\n * Converts screen (SVG) coordinates to workspace coordinates.\r\n * @param x - X position in screen coordinates.\r\n * @param y - Y position in screen coordinates.\r\n * @returns Workspace coordinates as a Coordinates instance.\r\n */\r\n screenToWorkspace(screenX: number, screenY: number) {\r\n const zoom = this.getZoom();\r\n const workX = screenX / zoom + this._camera.x;\r\n const workY = screenY / zoom + this._camera.y;\r\n return { x: workX, y: workY };\r\n }\r\n\r\n /**\r\n * Draws a node by its ID.\r\n * @param id - The ID of the node to render.\r\n * @returns The rendered node.\r\n */\r\n drawNode(id: string) {\r\n return this.renderer.rerenderNode(this._nodeDB.get(id) as NodeSvg);\r\n }\r\n\r\n /**\r\n * Adds a node to the workspace.\r\n * @param node - The node instance to add.\r\n * @param nodeId - Optional custom ID to use instead of node.id.\r\n */\r\n addNode(node: NodeSvg, nodeId?: string) {\r\n let id = nodeId || node.id;\r\n if (this._nodeDB.has(id)) {\r\n console.warn(`Node with id ${id} already exists, overwriting.`);\r\n }\r\n if (node.workspace !== this) {\r\n node.workspace = this;\r\n }\r\n this._nodeDB.set(id, node);\r\n this.drawNode(id);\r\n this.history.emitChange();\r\n\r\n }\r\n\r\n /**\r\n * Create a new node of *type*.\r\n * @param type - The node's prototype name.\r\n */\r\n newNode(type: keyof typeof NodePrototypes, add: boolean = true): NodeSvg | undefined {\r\n if (!NodePrototypes[type]) return;\r\n const node = newHeadlessNode(type as string);\r\n if (!node) return;\r\n if (add) this.addNode(node);\r\n return node;\r\n }\r\n /**\r\n * Spawns a node at x, y of prototype type\r\n * @param type - The node prototype name\r\n * @param x - X position\r\n * @param y - Y position\r\n * @returns {Node} - The new node\r\n */\r\n spawnAt(type: keyof typeof NodePrototypes, x: number, y: number): NodeSvg | undefined {\r\n const node = this.newNode(type, false);\r\n if (!node) return;\r\n node.relativeCoords.set(x, y);\r\n this.addNode(node);\r\n this.drawNode(node.id);\r\n return node;\r\n }\r\n /**\r\n * Dereference a node from all of its connected neighbors\r\n */\r\n derefNode(node: NodeSvg) {\r\n // Disconnect from previous node or field\r\n const prev = node.previousConnection?.getFrom?.();\r\n if (prev instanceof NodeSvg) {\r\n prev.nextConnection?.disconnectTo();\r\n } else if (prev instanceof ConnectableField && prev.hasConnectable()) {\r\n prev.disconnect();\r\n }\r\n\r\n // Disconnect from next node\r\n const next = node.nextConnection?.getTo?.();\r\n if (next instanceof NodeSvg) {\r\n next.previousConnection?.disconnectFrom();\r\n }\r\n\r\n // Disconnect all fields\r\n for (let field of node.allFields()) {\r\n if ((field as ConnectableField).hasConnectable?.()) {\r\n (field as ConnectableField).disconnect();\r\n }\r\n }\r\n }\r\n /**\r\n * Removes a node by its ID.\r\n * @param id - The ID of the node to remove.\r\n */\r\n removeNodeById(id: string) {\r\n const node = this._nodeDB.get(id);\r\n if (!node) return;\r\n\r\n this.derefNode(node);\r\n this._nodeDB.delete(id);\r\n this.redraw();\r\n this.history.emitChange();\r\n\r\n }\r\n\r\n\r\n /**\r\n * Removes a node by its instance.\r\n * @param node - The node instance to remove.\r\n */\r\n removeNode(node: NodeSvg) {\r\n if (!node) return;\r\n this.removeNodeById(node.id);\r\n }\r\n\r\n /**\r\n * Retrieves a node by its ID.\r\n * @param id - The ID of the node.\r\n * @returns The NodeSvg instance or undefined if not found.\r\n */\r\n getNode(id: string | NodeSvg): NodeSvg | undefined {\r\n if (id instanceof NodeSvg) return id;\r\n return this._nodeDB.get(id);\r\n }\r\n\r\n /**\r\n * Pans the camera by the given delta values.\r\n * @param dx - Change in X direction.\r\n * @param dy - Change in Y direction.\r\n */\r\n pan(dx: number, dy: number) {\r\n this.controller.pan(dx, dy);\r\n }\r\n /**\r\n * Comment methods\r\n */\r\n\r\n /**\r\n * Adds a comment, returns the model.\r\n */\r\n addComment() {\r\n const model = new CommentModel(this);\r\n this._commentDB.add(model);\r\n this.redrawComments();\r\n return model;\r\n }\r\n /**\r\n * Gets a comment by id\r\n * @param id - The comment id.\r\n */\r\n getComment(id: string) {\r\n return Array.from(this._commentDB).find(e => e.id === id);\r\n }\r\n /**\r\n * Remove a comment by its instance or id.\r\n * @param commentOrId - The comment instance or its id.\r\n */\r\n removeComment(commentOrId: CommentModel | string) {\r\n let comment: CommentModel | undefined;\r\n\r\n if (typeof commentOrId === \"string\") {\r\n comment = this.getComment(commentOrId);\r\n } else {\r\n comment = commentOrId;\r\n }\r\n\r\n if (!comment) return false;\r\n\r\n this._commentDB.delete(comment);\r\n this.redrawComments();\r\n return true;\r\n }\r\n /**\r\n * Redraw all comments in this workspace.\r\n */\r\n redrawComments() {\r\n this.renderer.clearComments();\r\n this.renderer.drawComments();\r\n }\r\n /**\r\n * Deserialize this workspace from json data.\r\n * @param json - Serialized workspace\r\n */\r\n fromJson(json: { nodes: any[]; circular: boolean }, recordBigEvent: boolean = false) {\r\n this.toggleHistory(false); // disable recording\r\n\r\n for (let [_, node] of this._nodeDB.entries()) {\r\n this.removeNode(node);\r\n }\r\n if (json.circular) {\r\n for (let node of json.nodes) {\r\n NodeSvg.deserialize(node, this);\r\n }\r\n } else {\r\n for (let node of json.nodes) {\r\n NodeSvg.fromJson(node, this);\r\n }\r\n }\r\n\r\n this.untoggleHistory(); // restore previous history state\r\n\r\n // only emit a single snapshot if we were told to treat it as a user-level event\r\n if (recordBigEvent && this.recordHistory) {\r\n this.history.emitChange();\r\n }\r\n }\r\n\r\n /**\r\n * Serialize this workspace, optionally using circular references.\r\n */\r\n toJson(circular: boolean) {\r\n const nodes = [];\r\n if (circular) {\r\n for (let [id, node] of this._nodeDB) {\r\n if (node.topLevel) {\r\n nodes.push(node.serialize());\r\n }\r\n }\r\n } else {\r\n for (let [id, node] of this._nodeDB) {\r\n if (node.topLevel) {\r\n nodes.push(node.toJson());\r\n }\r\n }\r\n }\r\n\r\n return {\r\n circular,\r\n nodes\r\n }\r\n }\r\n}\r\n\r\nexport default WorkspaceSvg;\r\n","// color-utils.ts\r\nimport type { Color, Hex } from '../src/visual-types';\r\n\r\n/**\r\n * Parse any Color type into a hex string \"#RRGGBB\"\r\n */\r\nexport function parseColor(color: Color): Hex {\r\n\tif (typeof color === 'string') {\r\n\t\tif (color.startsWith('#')) {\r\n\t\t\t// Already a hex string, normalize to full #RRGGBB\r\n\t\t\tlet hex = color.slice(1);\r\n\t\t\tif (hex.length === 3) hex = hex.split('').map(c => c + c).join('');\r\n\t\t\treturn `#${hex}`;\r\n\t\t} else {\r\n\t\t\t// RGB string \"r, g, b\"\r\n\t\t\tconst parts = color.split(',').map(s => parseInt(s.trim(), 10));\r\n\t\t\tif (parts.length !== 3) throw new Error(`Invalid RGB string: ${color}`);\r\n\t\t\tconst [r, g, b] = parts;\r\n if ((!r && r!== 0) || (!g && g!== 0) || (!b && b !== 0)) {\r\n console.warn(\r\n \"Invalid RGB tuple\"\r\n );\r\n return \"#000\";\r\n }\r\n\t\t\treturn `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b\r\n\t\t\t\t.toString(16)\r\n\t\t\t\t.padStart(2, '0')}`;\r\n\t\t}\r\n\t} else if (Array.isArray(color)) {\r\n\t\t// RGBTuple [r,g,b]\r\n\t\tconst [r, g, b] = color;\r\n\t\treturn `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b\r\n\t\t\t.toString(16)\r\n\t\t\t.padStart(2, '0')}`;\r\n\t} else {\r\n\t\t// RGBObject {r,g,b}\r\n\t\tconst { r, g, b } = color;\r\n\t\treturn `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b\r\n\t\t\t.toString(16)\r\n\t\t\t.padStart(2, '0')}`;\r\n\t}\r\n}\r\n","// path.ts\r\n/**\r\n * Utility functions to generate SVG path strings or translate them.\r\n */\r\n\r\n/** Rounded rectangle */\r\nexport function roundedRect(width: number, height: number, radius: number): string {\r\n\tradius = Math.min(radius, width / 2, height / 2);\r\n\treturn `\r\n\t\tM${radius},0\r\n\t\tH${width - radius}\r\n\t\tA${radius},${radius} 0 0 1 ${width},${radius}\r\n\t\tV${height - radius}\r\n\t\tA${radius},${radius} 0 0 1 ${width - radius},${height}\r\n\t\tH${radius}\r\n\t\tA${radius},${radius} 0 0 1 0,${height - radius}\r\n\t\tV${radius}\r\n\t\tA${radius},${radius} 0 0 1 ${radius},0\r\n\t\tZ\r\n\t`.replace(/\\s+/g, ' ').trim();\r\n}\r\n\r\n/** Rounded triangle pointing up */\r\nexport function roundedTri(width: number, height: number, radius: number): string {\r\n\tconst halfW = width / 2;\r\n\tradius = Math.min(radius, halfW, height / 2);\r\n\treturn `\r\n\t\tM${halfW},0\r\n\t\tL${width - radius},${height - radius}\r\n\t\tA${radius},${radius} 0 0 1 ${width - radius*2},${height}\r\n\t\tL${radius*2},${height}\r\n\t\tA${radius},${radius} 0 0 1 ${radius},${height - radius}\r\n\t\tZ\r\n\t`.replace(/\\s+/g, ' ').trim();\r\n}\r\n\r\n/** Circle */\r\nexport function circle(radius: number): string {\r\n\treturn `\r\n\t\tM${radius},0\r\n\t\tA${radius},${radius} 0 1,0 ${-radius},0\r\n\t\tA${radius},${radius} 0 1,0 ${radius},0\r\n\t\tZ\r\n\t`.replace(/\\s+/g, ' ').trim();\r\n}\r\n\r\n/** Ellipse */\r\nexport function ellipse(rx: number, ry: number): string {\r\n\treturn `\r\n\t\tM${rx},0\r\n\t\tA${rx},${ry} 0 1,0 ${-rx},0\r\n\t\tA${rx},${ry} 0 1,0 ${rx},0\r\n\t\tZ\r\n\t`.replace(/\\s+/g, ' ').trim();\r\n}\r\n\r\n/** Star with n points */\r\nexport function star(radius: number, points: number = 5): string {\r\n\tif (points < 2) throw new Error('Star must have at least 2 points');\r\n\tlet path = '';\r\n\tconst step = (Math.PI * 2) / (points * 2);\r\n\tfor (let i = 0; i < points * 2; i++) {\r\n\t\tconst r = i % 2 === 0 ? radius : radius / 2;\r\n\t\tconst x = r * Math.sin(i * step);\r\n\t\tconst y = -r * Math.cos(i * step);\r\n\t\tpath += i === 0 ? `M${x},${y}` : ` L${x},${y}`;\r\n\t}\r\n\tpath += ' Z';\r\n\treturn path;\r\n}\r\n\r\n/** Regular polygon (triangle, pentagon, hexagon, etc) */\r\nexport function polygon(radius: number, sides: number = 3): string {\r\n\tif (sides < 3) throw new Error('Polygon must have at least 3 sides');\r\n\tlet path = '';\r\n\tconst step = (Math.PI * 2) / sides;\r\n\tfor (let i = 0; i < sides; i++) {\r\n\t\tconst x = radius * Math.cos(i * step - Math.PI / 2);\r\n\t\tconst y = radius * Math.sin(i * step - Math.PI / 2);\r\n\t\tpath += i === 0 ? `M${x},${y}` : ` L${x},${y}`;\r\n\t}\r\n\tpath += ' Z';\r\n\treturn path;\r\n}\r\nimport SvgPath from 'svgpath';\r\n\r\n/**\r\n * Rotate an SVG path string around a given point\r\n * @param path - SVG path string\r\n * @param angle - rotation angle in degrees\r\n * @param cx - x-coordinate of rotation center (default 0)\r\n * @param cy - y-coordinate of rotation center (default 0)\r\n * @returns new rotated SVG path string\r\n */\r\nexport function rotatePath(path: string, angle: number, cx = 0, cy = 0): string {\r\n\treturn new SvgPath(path)\r\n\t\t.rotate(angle, cx, cy)\r\n\t\t.toString();\r\n}\r\n","'use strict';\n\n\nvar Matrix = require('./matrix');\n\nvar operations = {\n matrix: true,\n scale: true,\n rotate: true,\n translate: true,\n skewX: true,\n skewY: true\n};\n\nvar CMD_SPLIT_RE = /\\s*(matrix|translate|scale|rotate|skewX|skewY)\\s*\\(\\s*(.+?)\\s*\\)[\\s,]*/;\nvar PARAMS_SPLIT_RE = /[\\s,]+/;\n\n\nmodule.exports = function transformParse(transformString) {\n var matrix = new Matrix();\n var cmd, params;\n\n // Split value into ['', 'translate', '10 50', '', 'scale', '2', '', 'rotate', '-45', '']\n transformString.split(CMD_SPLIT_RE).forEach(function (item) {\n\n // Skip empty elements\n if (!item.length) { return; }\n\n // remember operation\n if (typeof operations[item] !== 'undefined') {\n cmd = item;\n return;\n }\n\n // extract params & att operation to matrix\n params = item.split(PARAMS_SPLIT_RE).map(function (i) {\n return +i || 0;\n });\n\n // If params count is not correct - ignore command\n switch (cmd) {\n case 'matrix':\n if (params.length === 6) {\n matrix.matrix(params);\n }\n return;\n\n case 'scale':\n if (params.length === 1) {\n matrix.scale(params[0], params[0]);\n } else if (params.length === 2) {\n matrix.scale(params[0], params[1]);\n }\n return;\n\n case 'rotate':\n if (params.length === 1) {\n matrix.rotate(params[0], 0, 0);\n } else if (params.length === 3) {\n matrix.rotate(params[0], params[1], params[2]);\n }\n return;\n\n case 'translate':\n if (params.length === 1) {\n matrix.translate(params[0], 0);\n } else if (params.length === 2) {\n matrix.translate(params[0], params[1]);\n }\n return;\n\n case 'skewX':\n if (params.length === 1) {\n matrix.skewX(params[0]);\n }\n return;\n\n case 'skewY':\n if (params.length === 1) {\n matrix.skewY(params[0]);\n }\n return;\n }\n });\n\n return matrix;\n};\n","import WorkspaceController from './base';\r\nimport WorkspaceSvg from '../src/workspace-svg';\r\nimport userState from '../util/user-state';\r\n\r\ninterface Vec2 { x: number; y: number; }\r\n\r\nexport default class WASDController extends WorkspaceController {\r\n moveSpeed: number;\r\n doAccelerate?: boolean;\r\n accelSpeed: number;\r\n friction: number;\r\n velocity: Vec2;\r\n zoom: number = 1;\r\n zoomSpeed: number;\r\n minZoom: number;\r\n maxZoom: number;\r\n isFalloff: boolean;\r\n constructor(workspace: WorkspaceSvg, moveSpeed?: number) {\r\n super(workspace);\r\n this.moveSpeed = workspace.options.moveSpeed || moveSpeed || 5;\r\n\r\n this.doAccelerate = workspace.options?.controls?.wasdSmooth ?? false;\r\n this.accelSpeed = workspace.options?.controls?.wasdAccelerate ?? 0.2;\r\n this.friction = workspace.options?.controls?.wasdFriction ?? 0.85;\r\n\r\n this.velocity = { x: 0, y: 0 };\r\n this.isFalloff = false;\r\n\r\n // Zoom settings\r\n this.zoomSpeed = workspace.options?.controls?.zoomSpeed ?? 0.1;\r\n this.minZoom = workspace.options?.controls?.minZoom ?? 0.1;\r\n this.maxZoom = workspace.options?.controls?.maxZoom ?? 4;\r\n this.zoom = 1;\r\n // Bind wheel for zoom\r\n workspace._wsTop.addEventListener('wheel', this.onWheel.bind(this), { passive: false });\r\n }\r\n\r\n canMove() {\r\n return !userState.hasState('typing');\r\n }\r\n\r\n update() {\r\n super.update();\r\n if (!this.canMove()) return;\r\n\r\n let inputX = 0;\r\n let inputY = 0;\r\n\r\n if (this.keysDown.has('w') || this.keysDown.has('ArrowUp')) inputY -= 1;\r\n if (this.keysDown.has('s') || this.keysDown.has('ArrowDown')) inputY += 1;\r\n if (this.keysDown.has('a') || this.keysDown.has('ArrowLeft')) inputX -= 1;\r\n if (this.keysDown.has('d') || this.keysDown.has('ArrowRight')) inputX += 1;\r\n\r\n if (this.doAccelerate) {\r\n // Accelerate velocity towards input direction\r\n this.velocity.x += inputX * this.accelSpeed;\r\n this.velocity.y += inputY * this.accelSpeed;\r\n\r\n // Apply friction\r\n this.velocity.x *= this.friction;\r\n this.velocity.y *= this.friction;\r\n if (inputX == 0 && inputY == 0) {\r\n this.isFalloff = true;\r\n } else {\r\n this.isFalloff = false;\r\n }\r\n // Only pan if velocity is noticeable\r\n if (Math.abs(this.velocity.x) > 0.01 || Math.abs(this.velocity.y) > 0.01) {\r\n this.pan(this.velocity.x, this.velocity.y);\r\n }\r\n } else {\r\n // Instant movement\r\n const dx = inputX * this.moveSpeed;\r\n const dy = inputY * this.moveSpeed;\r\n if (dx !== 0 || dy !== 0) this.pan(dx, dy);\r\n }\r\n }\r\n pan(dx: number, dy: number) {\r\n const x = this.workspace._camera.x, y = this.workspace._camera.y;\r\n this.workspace._camera.x += dx;\r\n this.workspace._camera.y += dy;\r\n if (x == this.workspace._camera.x && y == this.workspace._camera.y) {\r\n return;\r\n }\r\n if (!this.isFalloff) {\r\n this._throttledFireDidMove();\r\n this.workspace.didMove = true;\r\n this.workspace.fireMoveListeners();\r\n this.refreshPos();\r\n }\r\n this.refreshPos();\r\n }\r\n /**\r\n * Handles wheel events for zooming.\r\n * Zooms around the mouse position for intuitive zooming.\r\n */\r\n onWheel(e: WheelEvent) {\r\n e.preventDefault();\r\n\r\n const oldZoom = this.getZoom();\r\n let delta = -e.deltaY * this.zoomSpeed * 0.01; // normalize wheel\r\n let newZoom = oldZoom * (1 + delta);\r\n\r\n // Clamp zoom\r\n newZoom = Math.max(this.minZoom, Math.min(this.maxZoom, newZoom));\r\n\r\n // Zoom around cursor\r\n const mouseX = e.clientX;\r\n const mouseY = e.clientY;\r\n\r\n const wsMouse = this.workspace.screenToWorkspace(mouseX, mouseY);\r\n\r\n // Apply new zoom\r\n this.setZoom(newZoom);\r\n\r\n // Adjust camera so the point under cursor stays stable\r\n this.workspace._camera.x = wsMouse.x - mouseX / newZoom;\r\n this.workspace._camera.y = wsMouse.y - mouseY / newZoom;\r\n\r\n this.workspace.refresh();\r\n }\r\n\r\n /** Returns current zoom level */\r\n getZoom() {\r\n return this.zoom;\r\n }\r\n\r\n /** Sets zoom directly */\r\n setZoom(zoom: number) {\r\n this.zoom = zoom;\r\n }\r\n}\r\n","\r\n\r\n// fonts-manager.ts\r\n\r\nconst loadedFonts: Record<string, Promise<void>> = {};\r\n\r\n/**\r\n * Load a Google Font by name and optional weights.\r\n * Returns a promise that resolves when the font is available.\r\n */\r\nexport function loadGoogleFont(\r\n\tname: string,\r\n\tweights: number[] = [400, 700]\r\n): Promise<void> {\r\n\tif (loadedFonts[name]) return loadedFonts[name]; // already loading/loaded\r\n\r\n\tconst linkId = `gf-${name.replace(/\\s+/g, '-')}`;\r\n\tif (!document.getElementById(linkId)) {\r\n\t\tconst link = document.createElement('link');\r\n\t\tlink.id = linkId;\r\n\t\tlink.rel = 'stylesheet';\r\n\t\tconst weightsParam = weights.join(';');\r\n\t\tlink.href = `https://fonts.googleapis.com/css2?family=${name.replace(\r\n\t\t\t/\\s+/g,\r\n\t\t\t'+'\r\n\t\t)}:wght@${weightsParam}&display=swap`;\r\n\t\tdocument.head.appendChild(link);\r\n\t}\r\n\r\n\t// wait for all requested weights to be loaded\r\n\tconst fontPromises = weights.map((w) =>\r\n\t\tdocument.fonts.load(`${w} 1em ${name}`)\r\n\t);\r\n\r\n\tconst promise = Promise.all(fontPromises).then(() => undefined);\r\n\tloadedFonts[name] = promise;\r\n\treturn promise;\r\n}\r\n","import { Element, Svg } from '@svgdotjs/svg.js';\r\nimport NodeSvg from '../src/nodesvg';\r\nimport eventer from '../util/eventer';\r\nimport type { EventSetupFn } from '../util/eventer';\r\nimport WorkspaceSvg from '../src/workspace-svg';\r\nimport userState from '../util/user-state';\r\nimport Renderer, { ConnectorToFrom, DrawState } from '../renderers/renderer';\r\n\r\n\r\n\r\nfunction initConnectionLine(element: Element, args: Record<string, any>): () => void {\r\n // click destroys the line\r\n const handleClick = () => {\r\n args.fromConn.disconnectTo();\r\n args.toConn.disconnectFrom();\r\n element.remove();\r\n xMark.remove();\r\n const remove: ConnectorToFrom[] = [];\r\n for (let state of args.renderer._drawStates as DrawState[]) {\r\n for (let pair of state.pendingConnections) {\r\n if (pair.from == args.fromConn && pair.to == args.toConn) {\r\n remove.push(pair);\r\n }\r\n if (pair.from = args.toConn && pair.to == args.fromConn) {\r\n remove.push(pair);\r\n }\r\n }\r\n state.pendingConnections = state.pendingConnections.filter(e => !remove.includes(e));\r\n }\r\n };\r\n\r\n // create X element\r\n const bbox = element.bbox();\r\n const midX = bbox.x + bbox.width / 2;\r\n const midY = bbox.y + bbox.height / 2;\r\n const xMark = (element.parent()! as Svg).text('X').font({\r\n family: 'Fredoka, sans-serif',\r\n size: 46,\r\n weight: '700',\r\n anchor: 'middle',\r\n leading: '1em'\r\n })\r\n .addClass((args.renderer.constructor as typeof Renderer).LINE_X_MARK_TAG)\r\n .center(midX, midY)\r\n .fill('#fff') // white fill\r\n .stroke({ color: '#000', width: 2 }) // black outline\r\n .hide();\r\n\r\n xMark.on('click', handleClick)\r\n xMark.node.style.userSelect = 'none';\r\n // show X on hover\r\n element.on('mouseover', () => xMark.show());\r\n element.on('mouseout', () => xMark.hide());\r\n\r\n // attach click event\r\n element.on('click', handleClick);\r\n\r\n // cleanup function\r\n return () => {\r\n element.off('click', handleClick);\r\n element.off('mouseover');\r\n element.off('mouseout');\r\n xMark.off('click', handleClick);\r\n xMark.remove();\r\n };\r\n}\r\n// ok\r\neventer.registerEvent('k_connline', initConnectionLine as EventSetupFn);\r\n","import Connection, { Connectable } from \"./connection\";\r\nimport { G, Path, Rect, Svg, SVG, Text } from '@svgdotjs/svg.js';\r\nimport NodeSvg from \"./nodesvg\";\r\nimport { ConnectorToFrom } from \"../renderers/renderer\";\r\nimport dropdownContainer, { DropdownOptions } from \"./dropdown-menu\";\r\nimport WorkspaceSvg from \"./workspace-svg\";\r\n/**\r\n * Options used to initialize a Field.\r\n */\r\nexport interface FieldOptions { /** Name of the field */\r\n name: string;\r\n /** Human-readable label for the field */\r\n label: string;\r\n /** Key used to identify the field type in FieldTypesMap */\r\n type: string;\r\n /** Field value (optional) */\r\n value?: any;\r\n /** Only used by OptConnectField to determine internal value type */\r\n fld_type?: \"number\" | \"string\";\r\n [key: string]: any;\r\n};\r\n\r\nexport interface FieldVisualInfo {\r\n measuredWidth: number; // The width approximated by the field itself.\r\n measuredHeight: number; // The height approximated by the field itself.\r\n background: Rect; // The node's background element.\r\n svg: Svg; // The workspace's SVG.js svg\r\n nodeGroup: G; // Group for the node\r\n fieldGroup: G; // A group containing the label & input.\r\n xUsed: number; // The amount of x space used up by the label.\r\n}\r\nexport interface FieldRawBoxData {\r\n box: Rect;\r\n txt: Text;\r\n}\r\nexport interface FieldConnectionData {\r\n connector: Path;\r\n connState: ConnectorToFrom\r\n}\r\n/**\r\n * Base class for all fields.\r\n * @template T The type of the value stored in the field\r\n */\r\nclass Field<T = any> {\r\n label: string;\r\n name: string;\r\n type: string;\r\n node?: NodeSvg;\r\n editable: boolean;\r\n svgGroup?: G;\r\n protected value: T | null;\r\n static register(name: string, cls: Function) { };\r\n static unregister(name: string) { };\r\n constructor() {\r\n this.label = '';\r\n this.name = '';\r\n this.type = '';\r\n this.value = null;\r\n this.editable = true;\r\n }\r\n onDraw(rawBox?: FieldRawBoxData, connectionBubble?: FieldConnectionData) {\r\n\r\n }\r\n canEditConnector() {\r\n return false;\r\n }\r\n /**\r\n * Set whether or not you can edit this field.\r\n * @param val - The value to set to.\r\n */\r\n setEditable(val: boolean) {\r\n this.editable = val;\r\n if (this.node) {\r\n this.node?.workspace?.renderer?.rerenderNode?.(this.node)\r\n }\r\n }\r\n /**\r\n * Ask whether or not we can edit this field.\r\n */\r\n canEdit() {\r\n return this.editable;\r\n }\r\n /**\r\n * Set field name to something else.\r\n * @param name string\r\n * @returns the new name.\r\n */\r\n setName(name: string) {\r\n return this.name = name;\r\n }\r\n /**\r\n * Initialize the field from JSON options.\r\n * @param json FieldOptions object\r\n */\r\n fromJson(json: FieldOptions, workspace?: WorkspaceSvg) {\r\n if (json.name !== undefined) this.name = json.name;\r\n if (json.label !== undefined) this.label = json.label;\r\n if (json.type !== undefined) this.type = json.type;\r\n if (json.value !== undefined) this.value = json.value;\r\n if (json.editable) this.setEditable(Boolean(json.editable));\r\n }\r\n\r\n /** @returns The field's name/key */\r\n getName(): string {\r\n return this.name;\r\n }\r\n\r\n /** @returns The human-readable label */\r\n getLabel(): string {\r\n return this.label;\r\n }\r\n\r\n /**\r\n * Set the human-readable label\r\n * @param label New label\r\n * @returns The updated label\r\n */\r\n setLabel(label: string): string {\r\n return this.label = label;\r\n }\r\n\r\n /** @returns Whether this field is a raw value field (text/number) */\r\n hasRaw(): boolean {\r\n return true;\r\n }\r\n\r\n /** @returns Whether this field supports connections */\r\n hasConnectable(): boolean {\r\n return false;\r\n }\r\n /** @returns Whether we have a custom editor/input look */\r\n isCustomEditor(): boolean {\r\n return false;\r\n }\r\n /**\r\n * Make the input's custom look.\r\n * @param fieldVisualInfo - The visual info of the field, mutate this if needed.\r\n */\r\n drawMyself(fieldVisualInfo: FieldVisualInfo) {\r\n return;\r\n }\r\n /** Return width & height of your field's custom editor */\r\n measureMyself() {\r\n return { width: null, height: null }; // if either is null then the renderer measures for us (meaning we have a connection or other type of raw field.)\r\n }\r\n /** @returns The stored value */\r\n getValue(): T | null {\r\n return this.value;\r\n }\r\n\r\n /**\r\n * Set the stored value\r\n * @param val New value\r\n */\r\n setValue(val: T) {\r\n this.value = val;\r\n }\r\n\r\n /** @returns The value as it should be displayed (can differ from internal value) */\r\n getDisplayValue(): T | null {\r\n return this.getValue();\r\n }\r\n toJson(deep: boolean, alreadyProcessed: { [key: string]: any }): FieldOptions {\r\n return {\r\n name: this.name,\r\n label: this.label,\r\n type: this.type,\r\n value: this.getValue()\r\n };\r\n }\r\n}\r\n/**\r\n * Used when you want just a label with no actual value. Any value related methods are no-op.\r\n */\r\nexport class DummyField {\r\n label: string;\r\n name: string;\r\n type: string;\r\n node?: NodeSvg;\r\n editable: boolean;\r\n svgGroup?: G;\r\n\r\n constructor() {\r\n this.label = '';\r\n this.name = '';\r\n this.type = '';\r\n this.editable = false;\r\n }\r\n onDraw(rawBox?: FieldRawBoxData, connectionBubble?: FieldConnectionData) {\r\n\r\n }\r\n canEditConnector() {\r\n return false;\r\n }\r\n /**\r\n * Set whether or not you can edit this field.\r\n * @param val - The value to set to.\r\n */\r\n setEditable(val: boolean) {\r\n this.editable = val;\r\n if (this.node) {\r\n this.node?.workspace?.renderer?.rerenderNode?.(this.node)\r\n }\r\n }\r\n /**\r\n * Ask whether or not we can edit this field.\r\n */\r\n canEdit() {\r\n return this.editable;\r\n }\r\n /**\r\n * Set field name to something else.\r\n * @param name string\r\n * @returns the new name.\r\n */\r\n setName(name: string) {\r\n return this.name = name;\r\n }\r\n /**\r\n * Initialize the field from JSON options.\r\n * @param json FieldOptions object\r\n */\r\n fromJson(json: FieldOptions) {\r\n if (json.name !== undefined) this.name = json.name;\r\n if (json.label !== undefined) this.label = json.label;\r\n if (json.type !== undefined) this.type = json.type;\r\n }\r\n /** @returns Whether this field is a raw value field (text/number) */\r\n hasRaw(): boolean {\r\n return false;\r\n }\r\n\r\n /** @returns Whether this field supports connections */\r\n hasConnectable(): boolean {\r\n return false;\r\n }\r\n /** @returns The field's name/key */\r\n getName(): string {\r\n return this.name;\r\n }\r\n\r\n /** @returns The human-readable label */\r\n getLabel(): string {\r\n return this.label;\r\n }\r\n /**\r\n * Set the human-readable label\r\n * @param label New label\r\n * @returns The updated label\r\n */\r\n setLabel(label: string): string {\r\n return this.label = label;\r\n }\r\n /** @returns Whether we have a custom editor/input look */\r\n isCustomEditor(): boolean {\r\n return false;\r\n }\r\n /**\r\n * Make the input's custom look.\r\n * @param fieldVisualInfo - The visual info of the field, mutate this if needed.\r\n */\r\n drawMyself(fieldVisualInfo: FieldVisualInfo) {\r\n return;\r\n }\r\n /** Return width & height of your field's custom editor */\r\n measureMyself() {\r\n return { width: 0, height: 0 }; // if either is null then the renderer measures for us (meaning we have a connection or other type of raw field.)\r\n }\r\n /**\r\n * Dummy fields have no value.\r\n * @returns {null}\r\n */\r\n getValue() {\r\n return null;\r\n }\r\n /**\r\n * No-op for dummy fields\r\n */\r\n setValue(_: any) { }\r\n /** @returns The value as it should be displayed (can differ from internal value) */\r\n getDisplayValue() {\r\n return this.getValue();\r\n }\r\n toJson(deep: boolean, alreadyProcessed: { [key: string]: any }): FieldOptions {\r\n return {\r\n name: this.name,\r\n label: this.label,\r\n type: this.type,\r\n value: this.getValue()\r\n };\r\n }\r\n}\r\n/**\r\n * Base class for fields that can be connected to other fields.\r\n * @template T The type of the value stored in the field\r\n */\r\nexport class ConnectableField<T = any> extends Field<T> {\r\n connection: Connection;\r\n\r\n constructor() {\r\n super();\r\n this.connection = new Connection(this, null);\r\n this.value = null as T;\r\n }\r\n hasConnectable(): boolean {\r\n return true;\r\n }\r\n\r\n hasRaw(): boolean {\r\n return false;\r\n }\r\n\r\n /** Disconnect this field from any connected Connectable */\r\n disconnect() {\r\n const to = this.connection.to;\r\n if (to instanceof NodeSvg && to?.previousConnection?.from) {\r\n to.previousConnection.from = null;\r\n this.connection.to = null;\r\n }\r\n }\r\n fromJson(json: FieldOptions, workspace?: WorkspaceSvg) {\r\n super.fromJson(json);\r\n\r\n // If the value is a serialized node, rebuild it\r\n if (json.value && typeof json.value === \"object\" && json.value.id) {\r\n this.value = NodeSvg._deserialize(json.value, {}, workspace) as any;\r\n this.connection.setTo(this.value as Connectable);\r\n } else if (json.value instanceof NodeSvg) {\r\n this.value = json.value as any;\r\n this.connection.setTo(this.value as Connectable);\r\n } else {\r\n this.value = json.value;\r\n }\r\n\r\n return this;\r\n }\r\n toJson(deep: boolean, alreadyProcessed: { [key: string]: any }): FieldOptions {\r\n let val: any = this.getValue();\r\n // If it's connected to a node, store it's serialized form.\r\n if (val instanceof NodeSvg) val = { node: alreadyProcessed[val.id] ? (deep ? alreadyProcessed[val.id] : val.id) : val.serialize(alreadyProcessed) };\r\n\r\n return {\r\n ...super.toJson(true, alreadyProcessed),\r\n value: val\r\n };\r\n }\r\n}\r\n\r\n/** Field storing a numeric value */\r\nexport class NumberField extends Field<number> {\r\n constructor() {\r\n super();\r\n }\r\n\r\n fromJson(json: FieldOptions) {\r\n super.fromJson(json);\r\n if (json.value !== undefined) this.setValue(Number(json.value));\r\n }\r\n setValue(val: number) {\r\n this.value = Number(val);\r\n }\r\n}\r\n\r\n/** Field storing a string value */\r\nexport class TextField extends Field<string> {\r\n constructor() {\r\n super();\r\n }\r\n fromJson(json: FieldOptions) {\r\n super.fromJson(json);\r\n if (json.value !== undefined) this.setValue(String(json.value));\r\n }\r\n setValue(val: string) {\r\n this.value = String(val);\r\n }\r\n}\r\n\r\n/**\r\n * Optional connectable field.\r\n * Can store either a number or string depending on fld_type.\r\n */\r\nexport class OptConnectField extends ConnectableField<number | string | NodeSvg> {\r\n fldType: \"number\" | \"string\";\r\n\r\n constructor() {\r\n super();\r\n this.fldType = \"string\";\r\n }\r\n canEditConnector(): boolean {\r\n return true;\r\n }\r\n canEdit() {\r\n if (this.getValue() instanceof NodeSvg) {\r\n return false;\r\n }\r\n return this.editable;\r\n }\r\n getValue(): string | number | NodeSvg | null {\r\n if (this.connection && this.connection.getTo()) {\r\n return this.connection.getTo() as NodeSvg;\r\n } else {\r\n return this.value;\r\n }\r\n }\r\n hasRaw() {\r\n return true;\r\n }\r\n hasConnectable() {\r\n return true;\r\n }\r\n /**\r\n * Set field type.\r\n * @param type \"number\"|\"string\"\r\n */\r\n setFieldType(type: \"number\" | \"string\") {\r\n this.fldType = type;\r\n }\r\n /**\r\n * Initialize from JSON, respecting fld_type\r\n * @param json FieldOptions\r\n */\r\n fromJson(json: FieldOptions, workspace?: WorkspaceSvg) {\r\n super.fromJson(json, workspace);\r\n this.fldType = json.fld_type || \"string\";\r\n if (this.value != null && typeof this.value === this.fldType) {\r\n this.setValue(this.value as number | string);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Set the value, converting to number or string depending on fld_type\r\n * @param val The new value\r\n */\r\n setValue(val: number | string) {\r\n if (this.fldType === \"number\") this.value = Number(val);\r\n else this.value = String(val);\r\n }\r\n\r\n /**\r\n * @returns Display value for UI purposes (never null)\r\n */\r\n getDisplayValue(): string {\r\n if (this.value == null) return this.fldType === \"number\" ? \"0\" : \"\";\r\n if (this.getValue() instanceof NodeSvg) return '[NODE]'; // If theres a connection\r\n return String(this.value);\r\n }\r\n toJson(deep: boolean, alreadyProcessed: { [key: string]: any }): FieldOptions {\r\n let val: any = this.getValue();\r\n // If it's connected to a node, store it's serialized form.\r\n if (val instanceof NodeSvg) val = { node: deep ? val.serialize(alreadyProcessed) : val.id };\r\n\r\n return {\r\n ...super.toJson(true, alreadyProcessed),\r\n fld_type: this.fldType,\r\n value: val\r\n };\r\n }\r\n}\r\nexport type DropdownItem = { text: string, value: string } | string\r\nexport class DropdownField extends Field<string> {\r\n options: DropdownItem[] | null;\r\n _selected: DropdownItem | null;\r\n _isOpen: boolean;\r\n\r\n constructor() {\r\n super();\r\n this.options = null;\r\n this._selected = null;\r\n this._isOpen = false;\r\n }\r\n\r\n onDraw(rawBox?: FieldRawBoxData) {\r\n if (!rawBox || !this.options) return;\r\n\r\n const { box, txt } = rawBox;\r\n const toggle = () => this.toggleDropdown(rawBox);\r\n box.click(toggle);\r\n txt.click(toggle);\r\n }\r\n\r\n private toggleDropdown(rawBox: FieldRawBoxData) {\r\n if (dropdownContainer.getOwner() === this) {\r\n this.closeDropdown();\r\n } else {\r\n this.openDropdown(rawBox);\r\n }\r\n rawBox.txt.text(this.getDisplayValue());\r\n }\r\n\r\n private openDropdown(rawBox: FieldRawBoxData) {\r\n if (!this.options) return;\r\n\r\n const items = this.options.map(option => ({\r\n label: typeof option === 'string' ? option : option.text,\r\n value: typeof option === 'string' ? option : option.value\r\n }));\r\n\r\n dropdownContainer.show(this, {\r\n items,\r\n width: rawBox.box.bbox().width * 2,\r\n onSelect: (value: string) => {\r\n if (!this.options) return;\r\n const original = this.options.find(\r\n e => e === value || (typeof e !== 'string' && e.value === value)\r\n );\r\n if (original) {\r\n this._selected = original;\r\n this.setValue(value);\r\n this.closeDropdown();\r\n this?.node?.workspace?.emitChange?.();\r\n this?.node?.workspace?.renderer?.rerenderNode?.(this.node);\r\n }\r\n }\r\n } as DropdownOptions);\r\n }\r\n\r\n private closeDropdown() {\r\n dropdownContainer.hideIfOwner(this);\r\n }\r\n\r\n canEdit() {\r\n return false;\r\n }\r\n\r\n getSelected() {\r\n return this._selected;\r\n }\r\n fromJson(json: FieldOptions) {\r\n super.fromJson(json);\r\n this.options = json.options as DropdownItem[] || null;\r\n this._selected = this.options?.[0] ?? null;\r\n if (this._selected) this.setValue(typeof this._selected === 'string' ? this._selected : this._selected.value);\r\n }\r\n\r\n /**\r\n * Display value of dropdowns.\r\n * @returns - Display value\r\n */\r\n getDisplayValue(): string {\r\n const text = typeof this._selected === 'string' ? this._selected : this._selected?.text || '';\r\n const arrow = dropdownContainer.getOwner() == this ? '▲' : '▼'; // toggles open/closed\r\n return text + ' ' + arrow;\r\n }\r\n\r\n /**\r\n * Set options on this dropdown\r\n * @param options - List of options\r\n */\r\n setOptions(options: DropdownItem[]) {\r\n this.options = options;\r\n this._selected = this.options?.[0] ?? null;\r\n if (this._selected) this.setValue(\r\n typeof this._selected === 'string' ? this._selected : this._selected.value\r\n );\r\n }\r\n /**\r\n * \r\n * @param deep - Whether to recursive it.\r\n * @param alreadyProcessed - Map of already serialized nodes.\r\n * @returns - Json of this field.\r\n */\r\n toJson(deep: boolean, alreadyProcessed: { [key: string]: any }): FieldOptions {\r\n return { ...super.toJson(deep, alreadyProcessed), options: this.options };\r\n }\r\n}\r\n\r\n/**\r\n * Any field instance type\r\n */\r\nexport type AnyField = Field | OptConnectField | NumberField | TextField | DummyField | ConnectableField;\r\n/**\r\n * Any field class type\r\n */\r\nexport type AnyFieldCls = typeof Field | typeof OptConnectField | typeof ConnectableField | typeof NumberField | typeof TextField | typeof DummyField;\r\nexport const FieldMap: {\r\n field_both: typeof OptConnectField;\r\n field_string: typeof TextField;\r\n field_num: typeof NumberField;\r\n field_dummy: typeof DummyField;\r\n field_str: typeof TextField;\r\n connection: typeof ConnectableField;\r\n [key: string]: AnyFieldCls;\r\n} = {\r\n 'field_both': OptConnectField,\r\n 'field_string': TextField,\r\n 'field_num': NumberField,\r\n 'field_dummy': DummyField,\r\n 'field_str': TextField,\r\n 'connection': ConnectableField,\r\n 'dropdown': DropdownField\r\n}\r\n\r\n\r\nexport default Field;\r\n","import type RendererType from \"../renderers/renderer\";\r\nimport Renderer from \"../renderers/renderer\";\r\n/**\r\n * Interface for the renderer map.\r\n * Maps a string key (renderer name) to a renderer class.\r\n */\r\ninterface RendererMapInterface {\r\n [key: string]: typeof RendererType;\r\n}\r\n\r\n// Top-level renderer map storage\r\nconst RendererMap: RendererMapInterface = {};\r\n\r\n/**\r\n * Class for managing registered renderer classes.\r\n * Provides methods to register, delete, get, list, and resolve renderers.\r\n */\r\nclass RMap {\r\n /**\r\n * Registers a renderer class under a given name.\r\n * @param RendererCls The renderer class to register\r\n * @param optName Optional name to register under. Defaults to `RendererCls.NAME`\r\n */\r\n static register(RendererCls: typeof RendererType, optName?: string) {\r\n const name = optName ?? RendererCls.NAME;\r\n RendererMap[name] = RendererCls;\r\n }\r\n\r\n /**\r\n * Deletes a renderer from the map by name.\r\n * Cannot delete the \"default\" renderer.\r\n * @param name The name of the renderer to delete\r\n * @returns `true` if deleted, `false` otherwise\r\n */\r\n static delete(name: string) {\r\n if (name === 'default') return false;\r\n if (RendererMap[name]) {\r\n delete RendererMap[name];\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Retrieves a renderer class by name.\r\n * Returns the default renderer if the name is not found.\r\n * @param name The name of the renderer to get\r\n * @returns The renderer class\r\n */\r\n static get(name: string): typeof RendererType {\r\n const Renderer = require(\"../renderers/renderer\").default as typeof RendererType;\r\n return RendererMap[name] ?? RendererMap['default'] ?? Renderer;\r\n }\r\n\r\n /**\r\n * Lists all registered renderer names.\r\n * @returns Array of registered renderer names\r\n */\r\n static list() {\r\n return Object.keys(RendererMap);\r\n }\r\n\r\n /**\r\n * Resolves input into a renderer class.\r\n * - If `input` is undefined, returns the default renderer\r\n * - If `input` is a string, returns the renderer with that name\r\n * - If `input` is a class, returns the class itself\r\n * @param input Optional renderer name or class\r\n * @returns Renderer class\r\n */\r\n static resolve(input?: string | typeof RendererType): typeof RendererType {\r\n const Renderer = require(\"../renderers/renderer\").default as typeof RendererType;\r\n\r\n if (!input) return RendererMap['default'] ?? Renderer;\r\n\r\n if (typeof input === 'string') return RMap.get(input);\r\n\r\n if (typeof input === 'function') return input as typeof RendererType;\r\n\r\n return RendererMap['default'] ?? Renderer;\r\n }\r\n}\r\n\r\n// Default renderers registered in core.ts\r\n\r\nexport { RMap, RendererMap };\r\n","import { Svg, Pattern, Rect } from \"@svgdotjs/svg.js\";\r\nimport WorkspaceSvg from \"./workspace-svg\";\r\nimport { addWindowListener } from \"../util/window-listeners\";\r\n\r\n/**\r\n * Options for configuring the workspace grid.\r\n * @typedef {Object} GridOptions\r\n * @property {\"dotted\"|\"celled\"} [type=\"dotted\"] - The type of grid to render.\r\n * @property {number} [spacing=40] - The spacing between grid dots or cells.\r\n * @property {number} [dotSize=2] - The radius of the dots (only for dotted type).\r\n * @property {number} [strokeWidth=2] - Stroke width of the cells (only for celled type).\r\n * @property {string} [color=\"#bebebeff\"] - Color of the grid.\r\n */\r\nexport interface GridOptions {\r\n type?: \"dotted\" | \"celled\";\r\n spacing?: number;\r\n dotSize?: number;\r\n strokeWidth?: number;\r\n color?: string;\r\n}\r\n\r\n/**\r\n * Handles drawing and managing a workspace background grid.\r\n */\r\nexport default class Grid {\r\n private ws: WorkspaceSvg;\r\n private svg: Svg;\r\n private pattern?: Pattern;\r\n private rect?: Rect;\r\n\r\n /** Cached + normalized grid values */\r\n private grid: Required<GridOptions>;\r\n\r\n /**\r\n * Creates a new Grid instance and attaches it to the given workspace SVG.\r\n * @param {WorkspaceSvg} ws - The workspace this grid belongs to.\r\n * @param {Svg} svg - The SVG element to draw the grid into.\r\n * @param {GridOptions} opts - Initial options for the grid.\r\n */\r\n constructor(ws: WorkspaceSvg, svg: Svg, opts: GridOptions) {\r\n this.ws = ws;\r\n this.svg = svg;\r\n\r\n this.grid = {\r\n type: opts.type ?? \"dotted\",\r\n spacing: opts.spacing ?? 40,\r\n dotSize: opts.dotSize ?? 2,\r\n strokeWidth: opts.strokeWidth ?? 2,\r\n color: opts.color ?? \"#bebebeff\",\r\n };\r\n\r\n this.init();\r\n }\r\n\r\n /**\r\n * Initializes the grid pattern, background rect, and attaches resize listener.\r\n * @private\r\n */\r\n private init() {\r\n if (this.rect) {\r\n this.rect.remove();\r\n }\r\n const { type, spacing, dotSize, strokeWidth, color } = this.grid;\r\n\r\n let defs = this.svg.findOne(\"defs\");\r\n if (!defs) defs = this.svg.defs();\r\n\r\n this.pattern = this.svg.pattern(spacing, spacing, (add) => {\r\n if (type === \"dotted\") {\r\n add\r\n .circle(dotSize * 2)\r\n .fill(color)\r\n .move(spacing / 2 - dotSize, spacing / 2 - dotSize);\r\n } else {\r\n add.rect(spacing, spacing).stroke({ color, width: strokeWidth }).fill(\"none\");\r\n }\r\n });\r\n this.pattern.attr({ patternUnits: \"userSpaceOnUse\" });\r\n defs.add(this.pattern);\r\n\r\n const { width, height } = this.ws.getSize();\r\n this.rect = this.svg\r\n .rect(width, height)\r\n .fill(this.pattern)\r\n .back()\r\n .addClass(\"WorkspaceBgPattern\");\r\n\r\n addWindowListener(\"resize\", () => this.resize());\r\n }\r\n\r\n /**\r\n * Resizes the grid background rect to fit the workspace size.\r\n */\r\n resize() {\r\n if (!this.rect) return;\r\n const { width, height } = this.ws.getSize();\r\n this.rect.size(width, height).back();\r\n this.ws._backgroundRect.back();\r\n }\r\n\r\n /**\r\n * Updates the grid pattern transform according to zoom and camera position.\r\n * Scales the dots/cells to match zoom and repositions them based on camera.\r\n */\r\n updateTransform() {\r\n if (!this.pattern || !this.rect) return;\r\n const { type, spacing, dotSize, strokeWidth, color } = this.grid;\r\n\r\n const zoom = this.ws.getZoom();\r\n const scaledSpacing = spacing * zoom;\r\n\r\n this.pattern.attr({ width: scaledSpacing, height: scaledSpacing });\r\n this.pattern.clear();\r\n\r\n if (type === \"dotted\") {\r\n const scaledDot = Math.max(dotSize * zoom, 0.5);\r\n this.pattern\r\n .circle(scaledDot * 2)\r\n .fill(color)\r\n .move(scaledSpacing / 2 - scaledDot, scaledSpacing / 2 - scaledDot);\r\n } else {\r\n this.pattern\r\n .rect(scaledSpacing, scaledSpacing)\r\n .stroke({ color, width: strokeWidth * zoom })\r\n .fill(\"none\");\r\n }\r\n\r\n const cam = this.ws._camera;\r\n this.pattern.attr({\r\n patternTransform: `translate(${-cam.x * zoom % scaledSpacing}, ${-cam.y * zoom % scaledSpacing})`,\r\n });\r\n\r\n this.resize();\r\n this.ws._backgroundRect.back();\r\n }\r\n\r\n /**\r\n * Updates internal grid options from the workspace configuration.\r\n */\r\n updateOptions() {\r\n const opts = this.ws.options!.grid;\r\n this.grid = {\r\n type: opts!.type ?? \"dotted\",\r\n spacing: opts!.spacing ?? 40,\r\n dotSize: opts!.dotSize ?? 2,\r\n strokeWidth: opts!.strokeWidth ?? 2,\r\n color: opts!.color ?? \"#bebebeff\",\r\n };\r\n this.init();\r\n }\r\n\r\n /**\r\n * Dynamically sets new grid options and rebuilds the grid pattern.\r\n * @param {Partial<GridOptions>} newOpts - New options to apply.\r\n */\r\n setOptions(newOpts: Partial<GridOptions>) {\r\n Object.assign(this.grid, newOpts);\r\n this.rect?.remove?.();\r\n this.pattern?.remove?.();\r\n this.init(); // rebuild\r\n }\r\n}\r\n","import { Element, G } from '@svgdotjs/svg.js';\r\nimport NodeSvg from '../src/nodesvg';\r\nimport eventer, { EventSetupFn } from '../util/eventer';\r\nimport WorkspaceSvg from '../src/workspace-svg';\r\n\r\nfunction initXButton(element: Element, args: Record<string, any>): () => void {\r\n\tconst xBtnGroup = element as G;\r\n\tconst ws: WorkspaceSvg = args.workspace;\r\n\r\n\t// click handler\r\n\tconst onClick = () => {\r\n\t\tws.removeNode(args.node);\r\n\t};\r\n\r\n\t// attach\r\n\txBtnGroup.on('click', onClick);\r\n\r\n\t// return cleanup function\r\n\treturn () => {\r\n\t\txBtnGroup.off('click', onClick);\r\n\t};\r\n}\r\n\r\n// register as Kabel event\r\neventer.registerEvent('k_closenode', initXButton as EventSetupFn);\r\n","import { Color, ColorStyle } from \"./visual-types\";\r\n\r\n/**\r\n * Stores color styles for node categories.\r\n * \r\n * Each key is a category name, and the value is a ColorStyle object\r\n * containing colors like primary, secondary, and tertiary.\r\n * \r\n * Example:\r\n * ```ts\r\n * CategoryColors[\"logic\"] = {\r\n * primary: \"#FF0000\",\r\n * secondary: \"#00FF00\",\r\n * tertiary: \"#0000FF\"\r\n * };\r\n * ```\r\n */\r\nconst CategoryColors: { [key: string]: ColorStyle } = {};\r\n\r\nexport default CategoryColors;\r\n","'use strict';\n\n// combine 2 matrixes\n// m1, m2 - [a, b, c, d, e, g]\n//\nfunction combine(m1, m2) {\n return [\n m1[0] * m2[0] + m1[2] * m2[1],\n m1[1] * m2[0] + m1[3] * m2[1],\n m1[0] * m2[2] + m1[2] * m2[3],\n m1[1] * m2[2] + m1[3] * m2[3],\n m1[0] * m2[4] + m1[2] * m2[5] + m1[4],\n m1[1] * m2[4] + m1[3] * m2[5] + m1[5]\n ];\n}\n\n\nfunction Matrix() {\n if (!(this instanceof Matrix)) { return new Matrix(); }\n this.queue = []; // list of matrixes to apply\n this.cache = null; // combined matrix cache\n}\n\n\nMatrix.prototype.matrix = function (m) {\n if (m[0] === 1 && m[1] === 0 && m[2] === 0 && m[3] === 1 && m[4] === 0 && m[5] === 0) {\n return this;\n }\n this.cache = null;\n this.queue.push(m);\n return this;\n};\n\n\nMatrix.prototype.translate = function (tx, ty) {\n if (tx !== 0 || ty !== 0) {\n this.cache = null;\n this.queue.push([ 1, 0, 0, 1, tx, ty ]);\n }\n return this;\n};\n\n\nMatrix.prototype.scale = function (sx, sy) {\n if (sx !== 1 || sy !== 1) {\n this.cache = null;\n this.queue.push([ sx, 0, 0, sy, 0, 0 ]);\n }\n return this;\n};\n\n\nMatrix.prototype.rotate = function (angle, rx, ry) {\n var rad, cos, sin;\n\n if (angle !== 0) {\n this.translate(rx, ry);\n\n rad = angle * Math.PI / 180;\n cos = Math.cos(rad);\n sin = Math.sin(rad);\n\n this.queue.push([ cos, sin, -sin, cos, 0, 0 ]);\n this.cache = null;\n\n this.translate(-rx, -ry);\n }\n return this;\n};\n\n\nMatrix.prototype.skewX = function (angle) {\n if (angle !== 0) {\n this.cache = null;\n this.queue.push([ 1, 0, Math.tan(angle * Math.PI / 180), 1, 0, 0 ]);\n }\n return this;\n};\n\n\nMatrix.prototype.skewY = function (angle) {\n if (angle !== 0) {\n this.cache = null;\n this.queue.push([ 1, Math.tan(angle * Math.PI / 180), 0, 1, 0, 0 ]);\n }\n return this;\n};\n\n\n// Flatten queue\n//\nMatrix.prototype.toArray = function () {\n if (this.cache) {\n return this.cache;\n }\n\n if (!this.queue.length) {\n this.cache = [ 1, 0, 0, 1, 0, 0 ];\n return this.cache;\n }\n\n this.cache = this.queue[0];\n\n if (this.queue.length === 1) {\n return this.cache;\n }\n\n for (var i = 1; i < this.queue.length; i++) {\n this.cache = combine(this.cache, this.queue[i]);\n }\n\n return this.cache;\n};\n\n\n// Apply list of matrixes to (x,y) point.\n// If `isRelative` set, `translate` component of matrix will be skipped\n//\nMatrix.prototype.calc = function (x, y, isRelative) {\n var m;\n\n // Don't change point on empty transforms queue\n if (!this.queue.length) { return [ x, y ]; }\n\n // Calculate final matrix, if not exists\n //\n // NB. if you deside to apply transforms to point one-by-one,\n // they should be taken in reverse order\n\n if (!this.cache) {\n this.cache = this.toArray();\n }\n\n m = this.cache;\n\n // Apply matrix to point\n return [\n x * m[0] + y * m[2] + (isRelative ? 0 : m[4]),\n x * m[1] + y * m[3] + (isRelative ? 0 : m[5])\n ];\n};\n\n\nmodule.exports = Matrix;\n","import WorkspaceSvg from '../src/workspace-svg';\r\nimport userState from '../util/user-state';\r\n\r\ninterface Vec2 { x: number; y: number; }\r\n\r\nexport default class WorkspaceController {\r\n workspace: WorkspaceSvg;\r\n\r\n keysDown: Set<string>;\r\n mouseBtns: Set<number>;\r\n mousePos: Vec2;\r\n lastMousePos: Vec2;\r\n isDragging: boolean;\r\n\r\n wheelDelta: number;\r\n movedListeners: (() => void)[];\r\n _lastMoveFire = 0;\r\n _moveThrottleMs = 100; // bump this to whatever doesn't lag you\r\n _queuedMove = false;\r\n _moveTimeout: any = null;\r\n _updateInt: any;\r\n\r\n constructor(workspace: WorkspaceSvg) {\r\n this.workspace = workspace;\r\n\r\n this.keysDown = new Set();\r\n this.mouseBtns = new Set();\r\n this.mousePos = { x: 0, y: 0 };\r\n this.lastMousePos = { x: 0, y: 0 };\r\n this.isDragging = false;\r\n this.wheelDelta = 0;\r\n this.movedListeners = [];\r\n\r\n this._setupListeners();\r\n\r\n this._updateInt = setInterval(() => this.update(), 16);\r\n }\r\n addMoveListener(cb: () => void) {\r\n this.movedListeners.push(cb);\r\n }\r\n\r\n removeMoveListener(cb: () => void) {\r\n const i = this.movedListeners.indexOf(cb);\r\n if (i !== -1) this.movedListeners.splice(i, 1);\r\n }\r\n\r\n fireDidMove() {\r\n if (typeof queueMicrotask !== 'undefined') {\r\n queueMicrotask(() => {\r\n for (let cb of this.movedListeners) {\r\n try { cb(); } catch (e) { console.error(e); }\r\n }\r\n });\r\n } else {\r\n Promise.resolve().then(() => {\r\n for (let cb of this.movedListeners) {\r\n try { cb(); } catch (e) { console.error(e); }\r\n }\r\n });\r\n }\r\n }\r\n\r\n _throttledFireDidMove() {\r\n const now = performance.now();\r\n\r\n // enough time passed → fire instantly\r\n if (now - this._lastMoveFire >= this._moveThrottleMs) {\r\n this._lastMoveFire = now;\r\n this.fireDidMove();\r\n return;\r\n }\r\n\r\n // otherwise queue ONE fire\r\n if (!this._queuedMove) {\r\n this._queuedMove = true;\r\n const wait = this._moveThrottleMs - (now - this._lastMoveFire);\r\n\r\n this._moveTimeout = setTimeout(() => {\r\n this._queuedMove = false;\r\n this._lastMoveFire = performance.now();\r\n this.fireDidMove();\r\n }, wait);\r\n }\r\n }\r\n getZoom() {\r\n return 1;\r\n }\r\n canMove() {\r\n return true;\r\n }\r\n private _setupListeners() {\r\n window.addEventListener('keydown', e => this.keysDown.add(e.key));\r\n window.addEventListener('keyup', e => this.keysDown.delete(e.key));\r\n\r\n window.addEventListener('mousedown', e => this.mouseBtns.add(e.button));\r\n window.addEventListener('mouseup', e => this.mouseBtns.delete(e.button));\r\n\r\n window.addEventListener('mousemove', e => {\r\n this.lastMousePos = { ...this.mousePos };\r\n this.mousePos = { x: e.clientX, y: e.clientY };\r\n });\r\n\r\n window.addEventListener('wheel', e => {\r\n this.wheelDelta = e.deltaY;\r\n });\r\n\r\n window.addEventListener('mousedown', e => {\r\n if (e.button === 0) this.isDragging = true;\r\n });\r\n window.addEventListener('mouseup', e => {\r\n if (e.button === 0) this.isDragging = false;\r\n });\r\n }\r\n\r\n update() {\r\n // Can handle keyboard shortcuts or auto-pan here\r\n }\r\n\r\n // --- Camera methods ---\r\n pan(dx: number, dy: number) {\r\n const x = this.workspace._camera.x, y = this.workspace._camera.y;\r\n this.workspace._camera.x += dx;\r\n this.workspace._camera.y += dy;\r\n if (x == this.workspace._camera.x && y == this.workspace._camera.y) {\r\n return;\r\n }\r\n this._throttledFireDidMove();\r\n this.workspace.didMove = true;\r\n this.workspace.fireMoveListeners();\r\n this.refreshPos();\r\n }\r\n\r\n setCamera(pos: Vec2) {\r\n const x = this.workspace._camera.x, y = this.workspace._camera.y;\r\n this.workspace._camera.x = pos.x;\r\n this.workspace._camera.y = pos.y;\r\n if (x == this.workspace._camera.x && y == this.workspace._camera.y) {\r\n return;\r\n }\r\n this._throttledFireDidMove();\r\n this.workspace.didMove = true;\r\n this.workspace.fireMoveListeners();\r\n this.refreshPos();\r\n }\r\n\r\n centerOn(pos: Vec2) {\r\n const wsSize = this.workspace.getSize?.() ?? { width: 0, height: 0 };\r\n this.setCamera({\r\n x: pos.x - wsSize.width / 2,\r\n y: pos.y - wsSize.height / 2\r\n });\r\n }\r\n\r\n\r\n\r\n // --- Coordinate conversion ---\r\n screenToWorkspace(x: number, y: number): Vec2 {\r\n const cam = this.workspace._camera;\r\n return {\r\n x: x + cam.x,\r\n y: y + cam.y\r\n };\r\n }\r\n\r\n workspaceToScreen(x: number, y: number): Vec2 {\r\n const cam = this.workspace._camera;\r\n return {\r\n x: (x - cam.x),\r\n y: (y - cam.y)\r\n };\r\n }\r\n\r\n // --- Refresh ---\r\n refreshPos() {\r\n this.workspace.refresh?.();\r\n }\r\n\r\n redraw() {\r\n this.workspace.redraw?.();\r\n }\r\n\r\n // --- Cleanup ---\r\n stop() {\r\n clearInterval(this._updateInt);\r\n }\r\n}\r\n","\r\nimport { Path as SvgPath, StrokeData, G } from \"@svgdotjs/svg.js\";\r\nimport * as Path from '../../util/path'\r\nimport { ColorStyle, Hex } from \"../../src/visual-types\";\r\nimport WorkspaceSvg from \"../../src/workspace-svg\";\r\nimport Renderer, { DrawState, NodeMeasurements } from \"../renderer\"; // Saying the value of \"Renderer\" is undefined when it's clearly defined and theres no circular refs.\r\nimport ApolloConstants from \"./constants\";\r\nimport { parseColor } from \"../../util/parse-color\";\r\nimport eventer from \"../../util/eventer\";\r\nimport NodeSvg from \"../../src/nodesvg\";\r\nimport Connection from \"../../src/connection\";\r\nimport { AnyField, FieldRawBoxData } from \"../../src/field\";\r\nconsole.log(Renderer);\r\n\r\nfunction darkenColor(hex: string, amount: number = 0.2): string {\r\n // Remove # if present\r\n hex = hex.replace(/^#/, \"\");\r\n\r\n // Parse r, g, b\r\n const r = parseInt(hex.substring(0, 2), 16);\r\n const g = parseInt(hex.substring(2, 4), 16);\r\n const b = parseInt(hex.substring(4, 6), 16);\r\n\r\n // Darken each channel\r\n const newR = Math.max(0, Math.floor(r * (1 - amount)));\r\n const newG = Math.max(0, Math.floor(g * (1 - amount)));\r\n const newB = Math.max(0, Math.floor(b * (1 - amount)));\r\n\r\n // Convert back to hex and pad with 0s\r\n const toHex = (c: number) => c.toString(16).padStart(2, \"0\");\r\n\r\n return `#${toHex(newR)}${toHex(newG)}${toHex(newB)}`;\r\n}\r\n\r\n\r\n\r\n\r\n/**\r\n * ApolloRenderer\r\n * \r\n * Custom renderer extending the base `Renderer` for a visual programming workspace.\r\n * This renderer provides a distinct node style:\r\n * - Node background uses the primary color entirely\r\n * - Topbar is hidden (but still present for dragging)\r\n * - Bottom-right dog-ear decoration\r\n * - Previous connection at the top, next connection at the bottom\r\n */\r\nclass ApolloRenderer extends Renderer {\r\n declare _constants: ApolloConstants;\r\n\r\n static get NAME() {\r\n return 'apollo';\r\n }\r\n static get ElEMENT_TAG() {\r\n return 'ApolloElement';\r\n }\r\n /**\r\n * Constructor\r\n * @param workspace - The WorkspaceSvg instance\r\n * @param overrides - Partial constant overrides for ApolloConstants\r\n */\r\n constructor(workspace: WorkspaceSvg, overrides: Partial<ApolloConstants>) {\r\n super(workspace, overrides);\r\n }\r\n\r\n /** \r\n * Typed getter for renderer constants\r\n */\r\n get constants(): ApolloConstants {\r\n return super.constants as ApolloConstants;\r\n }\r\n\r\n /** Initialize constants using Apollo-specific overrides */\r\n initConstants() {\r\n this._constants = new ApolloConstants(this.constantOverrides);\r\n }\r\n\r\n /**\r\n * Draws the node's topbar.\r\n * Overridden to hide the topbar visually while retaining its group for dragging.\r\n * @param state - Current draw state\r\n * @param colors - Node colors\r\n * @param measurements - Node dimensions\r\n */\r\n drawNodeTopbar(state: DrawState, colors: ColorStyle, measurements: NodeMeasurements | null) {\r\n const c = this.constants;\r\n const width = measurements?.width ?? c.NODE_BASE_WIDTH;\r\n const radius = c.CORNER_RADIUS;\r\n\r\n state.topbar = state.group!.path(Path.roundedRect(width, c.TOPBAR_HEIGHT, radius))\r\n .fill('transparent');\r\n }\r\n\r\n /**\r\n * Draws the node background with rounded corners and bottom-right dog-ear cut.\r\n * Also creates a shadow.\r\n * @param state - Current draw state\r\n * @param measurements - Node dimensions\r\n */\r\n drawNodeBase(state: DrawState, measurements: NodeMeasurements | null) {\r\n const c = this.constants;\r\n const width = measurements?.width ?? c.NODE_BASE_WIDTH;\r\n const height = measurements?.height ?? c.NODE_BASE_HEIGHT;\r\n const r = c.CORNER_RADIUS;\r\n\r\n const dogear = this.constants.SHAPES.Dogear;\r\n const cutW = dogear?.Width ?? 0;\r\n const cutH = dogear?.Height ?? 0;\r\n\r\n // Rounded rect with bottom-right cut\r\n const roundedRect = `M${r},0 H${width - r} Q${width},0 ${width},${r} V${height - cutH} L${width - cutW},${height} H${r} Q0,${height} 0,${height - r} V${r} Q0,0 ${r},0 Z`;\r\n\r\n const colors = this.getNodeColors();\r\n const primary = parseColor(colors.primary) as string;\r\n const stroke = parseColor(colors.secondary) as string;\r\n\r\n // Node background\r\n state.bg = state.group!.path(roundedRect)\r\n .fill(primary)\r\n .stroke({ color: stroke, width: 2 });\r\n\r\n // Dog-ear decoration\r\n this.drawDogEar(state, state.group as G, width, height, colors);\r\n\r\n // Node shadow\r\n state.shadow = state.group!.path(roundedRect)\r\n .fill('rgba(0,0,0,0.2)')\r\n .stroke('none')\r\n .attr({ 'pointer-events': 'none' })\r\n .move(Number(state.bg.x()) + 5, Number(state.bg.y()) + 5)\r\n .back();\r\n }\r\n\r\n /**\r\n * Draws a dog-ear decoration at the node's bottom-right corner\r\n * @param state - Current draw state\r\n * @param nodeG - Node's SVG group\r\n * @param w - Node width\r\n * @param h - Node height\r\n * @param colors - Node colors\r\n */\r\n drawDogEar(state: DrawState, nodeG: G, w: number, h: number, colors: ColorStyle) {\r\n const pathDef = this.constants.SHAPES.Dogear?.PathMain;\r\n if (!pathDef) return;\r\n\r\n const dogEar = nodeG.path(pathDef)\r\n .fill(parseColor(colors.secondary) as string)\r\n .stroke({ color: parseColor(colors.tertiary) as string, width: 1 } as StrokeData);\r\n\r\n const offsetX = w - this.constants.SHAPES.Dogear!.Width;\r\n const offsetY = h - this.constants.SHAPES.Dogear!.Height;\r\n dogEar.move(offsetX, offsetY);\r\n dogEar.front();\r\n }\r\n\r\n /**\r\n * Draws previous and next connections for the node.\r\n * Previous connection is on top, next is on bottom.\r\n * @param state - Draw state\r\n * @param node - NodeSvg instance\r\n * @param nodeGroup - Node's SVG group\r\n * @param measurements - Node dimensions\r\n */\r\n drawPreviousNextConnections(state: DrawState, node: NodeSvg, nodeGroup: G, measurements: { width: number, height: number } | null = null) {\r\n if (!state || !node || !state.bg) return;\r\n\r\n const c = this.constants;\r\n const colors: ColorStyle = this.getNodeColors();\r\n const bbox = state.bg.bbox();\r\n\r\n // Top connector (previous)\r\n if (node.previousConnection) {\r\n const c1 = this.drawPrimaryConnector(nodeGroup, state.bg, 'top', parseColor(this._constants.CONNECTOR_COLOR) as string);\r\n if (c1) {\r\n const conn = {\r\n from: node.previousConnection,\r\n to: this.resolveConnectable(node.previousConnection.getFrom(), node.previousConnection) as Connection,\r\n fromCircle: c1 as SvgPath,\r\n originConn: node.previousConnection,\r\n originCircle: c1\r\n };\r\n this.setConnect(conn);\r\n eventer.addElement(c1, 'k_connectbubble', { connection: node.previousConnection, node })\r\n .tagElement(c1, [(this.constructor as typeof Renderer).ELEMENT_TAG, `node_${node.id}`]);\r\n this._fillOtherNodeConnectorCircle(node.previousConnection, c1 as SvgPath, true);\r\n }\r\n }\r\n\r\n // Bottom connector (next)\r\n if (node.nextConnection) {\r\n const c2 = this.drawPrimaryConnector(nodeGroup, state.bg, 'bottom', parseColor(this._constants.CONNECTOR_COLOR) as string);\r\n if (c2) {\r\n const conn = {\r\n from: node.nextConnection,\r\n to: this.resolveConnectable(node.nextConnection.getTo(), node.nextConnection) as Connection,\r\n fromCircle: c2 as SvgPath,\r\n originConn: node.nextConnection,\r\n originCircle: c2\r\n };\r\n this.setConnect(conn);\r\n eventer.addElement(c2, 'k_connectbubble', { connection: node.nextConnection, node })\r\n .tagElement(c2, [(this.constructor as typeof Renderer).ELEMENT_TAG, `node_${node.id}`]);\r\n this._fillOtherNodeConnectorCircle(node.nextConnection, c2 as SvgPath, false);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Draws a primary connector (triangle or circle) on either the top or bottom edge.\r\n * @param nodeGroup - Node's SVG group\r\n * @param nodeBg - Node background path\r\n * @param side - 'top' or 'bottom'\r\n * @param color - Connector color\r\n * @returns SvgPath of the connector\r\n */\r\n drawPrimaryConnector(nodeGroup: G, nodeBg: SvgPath, side: 'top' | 'bottom', color: string): SvgPath | void {\r\n const c = this.constants;\r\n if (!nodeGroup || !nodeBg) return;\r\n\r\n const bbox = nodeBg.bbox();\r\n const triSize = c.CONNECTOR_TRI_SIZE;\r\n const radius = c.CONNECTOR_RADIUS;\r\n const x = bbox.width / 2;\r\n let y: number;\r\n let element: SvgPath;\r\n\r\n if (c.CONNECTOR_TRIANGLE) {\r\n let path = Path.roundedTri(triSize, triSize, 1);\r\n if (side === 'top') y = -triSize;\r\n else { y = bbox.height; path = Path.rotatePath(path, 180, triSize / 2, triSize / 2); }\r\n\r\n element = nodeGroup.path(path)\r\n .fill(parseColor(color as Hex))\r\n .stroke({ color: parseColor('#00000000'), width: 0 })\r\n .transform({ translateX: x - triSize / 2, translateY: y });\r\n } else {\r\n const circlePath = Path.circle(radius);\r\n y = side === 'top' ? 0 : bbox.height;\r\n\r\n element = nodeGroup.path(circlePath)\r\n .fill(parseColor(color as Hex))\r\n .stroke({ color: parseColor('#00000000'), width: 0 })\r\n .move(x - radius, y - radius);\r\n }\r\n\r\n element.attr({ class: (this.constructor as typeof Renderer).CONNECTOR_TAG });\r\n return element;\r\n }\r\n /**\r\n * Draws a raw input field.\r\n * @param fieldGroup - The SVG group element for the field.\r\n * @param field - The field to draw.\r\n * @param startX - The starting X position for the field.\r\n * @returns The rectangle and text elements of the raw field.\r\n */\r\n drawFieldRaw(fieldGroup: G, field: AnyField, startX: number = 0) {\r\n const c = this.constants;\r\n const value = field.getDisplayValue?.() ?? \"\";\r\n const { width, height } = this.measureRawField(value);\r\n\r\n // Draw the rectangle\r\n const rect = fieldGroup.rect(width, height)\r\n .fill(parseColor(c.FIELD_RAW_COLOR))\r\n .stroke({ color: parseColor(c.FIELD_RAW_OUTLINE_COLOR), width: c.FIELD_RAW_OUTLINE_STROKE })\r\n .radius(20);\r\n\r\n // Draw the text\r\n const txt = fieldGroup.text(value)\r\n .font({\r\n family: c.FONT_FAMILY,\r\n size: c.FONT_SIZE,\r\n anchor: 'start'\r\n })\r\n .fill(parseColor(c.FIELD_RAW_TEXT_COLOR));\r\n txt.node.style.userSelect = 'none';\r\n\r\n const rawBox: FieldRawBoxData = { box: rect, txt };\r\n\r\n // Measure text dimensions\r\n const textBBox = txt.bbox();\r\n\r\n // Vertical centering\r\n const offsetY = (height - textBBox.height) / 2;\r\n\r\n // Horizontal centering with padding\r\n const paddedWidth = width - 2 * c.INPUT_BOX_PADDING;\r\n const offsetX = startX + c.INPUT_BOX_PADDING + Math.max(0, (paddedWidth - textBBox.width) / 2);\r\n\r\n // Move elements\r\n rect.move(startX, 0);\r\n txt.move(offsetX, offsetY);\r\n\r\n // Add event listener\r\n eventer.addElement(rect, \"k_inputbox\", {\r\n field,\r\n text: txt,\r\n renderer: this,\r\n startX\r\n }).tagElement(rect, [(this.constructor as typeof Renderer).ELEMENT_TAG, `node_${this.node!.id}`]);\r\n\r\n return { rect, txt, rawBox };\r\n }\r\n\r\n /**\r\n * Draws the full node (base, topbar, fields, connectors, label, etc.)\r\n */\r\n drawNode() {\r\n if (!this.node) return;\r\n\r\n const colors = this.getNodeColors();\r\n const node = this.node;\r\n const state = this.drawState(this.createNodeGroup(node), node.id);\r\n this._nodeDraw = state;\r\n\r\n const measurements = this.measureNodeDimensions();\r\n if (!measurements) return;\r\n\r\n this.drawNodeBase(state, measurements as NodeMeasurements);\r\n this.drawNodeTopbar(state, colors, measurements as NodeMeasurements);\r\n this.drawNodeXButton();\r\n this.drawNodeLabel(state.group!);\r\n this.makeNodeDraggable(state.group!, state.topbar!, node);\r\n\r\n this.createFieldGroup(state);\r\n this.drawAllFieldsForNode(measurements as NodeMeasurements);\r\n this.drawPreviousNextConnections(state, node, state.group!, measurements as NodeMeasurements);\r\n }\r\n}\r\n\r\n\r\nexport default ApolloRenderer;","import NodePrototypes from \"./prototypes\";\r\nimport newHeadlessNode from \"./headless-node\";\r\nimport Widget from \"./widget\";\r\nimport WidgetPrototypes from \"./widget-prototypes\";\r\nimport CommentModel from \"./comment\";\r\nimport UndoRedoHistory from \"./undo-redo\";\r\nimport { ConnectableField } from \"./field\";\r\n\r\n/**\r\n * Headless workspace that holds nodes, widgets, and comments without any rendering or camera.\r\n */\r\nclass Workspace {\r\n\t_nodeDB: Map<string, any>; // Node storage\r\n\t_widgetDB: Map<string, Widget>;\r\n\t_commentDB: Set<CommentModel>;\r\n isHeadless: boolean = true;\r\n\tconstructor() {\r\n\t\tthis._nodeDB = new Map();\r\n\t\tthis._widgetDB = new Map();\r\n\t\tthis._commentDB = new Set();\r\n\t}\r\n\r\n\t/** Node management */\r\n\taddNode(node: any, nodeId?: string) {\r\n\t\tconst id = nodeId || node.id;\r\n\t\tif (this._nodeDB.has(id)) {\r\n\t\t\tconsole.warn(`Node with id ${id} already exists, overwriting.`);\r\n\t\t}\r\n\t\tif (node.workspace !== this) node.workspace = this;\r\n\t\tthis._nodeDB.set(id, node);\r\n\t}\r\n\r\n\tnewNode(type: keyof typeof NodePrototypes, add: boolean = true) {\r\n\t\tif (!NodePrototypes[type]) return;\r\n\t\tconst node = newHeadlessNode(type as string);\r\n\t\tif (!node) return;\r\n\t\tif (add) this.addNode(node);\r\n\t\treturn node;\r\n\t}\r\n\r\n\tspawnAt(type: keyof typeof NodePrototypes, x: number, y: number) {\r\n\t\tconst node = this.newNode(type, false);\r\n\t\tif (!node) return;\r\n\t\tnode.relativeCoords.set(x, y);\r\n\t\tthis.addNode(node);\r\n\t\treturn node;\r\n\t}\r\n\r\n\tgetNode(id: string | any) {\r\n\t\tif (id instanceof Object && id.id) return id;\r\n\t\treturn this._nodeDB.get(id);\r\n\t}\r\n\r\n\tremoveNodeById(id: string) {\r\n\t\tconst node = this._nodeDB.get(id);\r\n\t\tif (!node) return;\r\n\t\tthis.derefNode(node);\r\n\t\tthis._nodeDB.delete(id);\r\n\t}\r\n\r\n\tremoveNode(node: any) {\r\n\t\tif (!node) return;\r\n\t\tthis.removeNodeById(node.id);\r\n\t}\r\n\r\n\tderefNode(node: any) {\r\n\t\tconst prev = node.previousConnection?.getFrom?.();\r\n\t\tif (prev?.nextConnection) prev.nextConnection.disconnectTo?.();\r\n\t\tconst next = node.nextConnection?.getTo?.();\r\n\t\tif (next?.previousConnection) next.previousConnection.disconnectFrom?.();\r\n\r\n\t\tfor (let field of node.allFields()) {\r\n\t\t\tif ((field as ConnectableField).hasConnectable?.()) {\r\n\t\t\t\t(field as ConnectableField).disconnect();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/** Widget management */\r\n\tnewWidget(type: string): Widget | void {\r\n\t\tconst opts = WidgetPrototypes[type];\r\n\t\tif (!opts) return;\r\n\t\tconst wdgt = opts.cls ? new opts.cls(this, opts) : new Widget(this, opts);\r\n\t\tthis._widgetDB.set(wdgt.id, wdgt);\r\n\t\treturn wdgt;\r\n\t}\r\n\r\n\tgetWidget(id: string): Widget | undefined {\r\n\t\treturn this._widgetDB.get(id);\r\n\t}\r\n\r\n\t/** Comment management */\r\n\taddComment() {\r\n\t\tconst model = new CommentModel(this);\r\n\t\tthis._commentDB.add(model);\r\n\t\treturn model;\r\n\t}\r\n\r\n\tgetComment(id: string) {\r\n\t\treturn Array.from(this._commentDB).find(e => e.id === id);\r\n\t}\r\n\r\n\tremoveComment(commentOrId: CommentModel | string) {\r\n\t\tlet comment: CommentModel | undefined;\r\n\t\tif (typeof commentOrId === \"string\") comment = this.getComment(commentOrId);\r\n\t\telse comment = commentOrId;\r\n\t\tif (!comment) return false;\r\n\t\tthis._commentDB.delete(comment);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tgetComments() {\r\n\t\treturn Array.from(this._commentDB);\r\n\t}\r\n\r\n /**\r\n * Internal: Add widget to DB\r\n * @param wdgt - The widget\r\n */\r\n _addWidgetToDB(wdgt: Widget) {\r\n this._widgetDB.set(wdgt.id, wdgt);\r\n }\r\n /**\r\n * Internal: Delete a widget from DB.\r\n * @param wdgt - Widget to delete\r\n */\r\n _delWidgetFromDB(wdgt: Widget) {\r\n this._widgetDB.delete(wdgt.id);\r\n }\r\n \r\n\t/** Serialization */\r\n\tfromJson(json: { nodes: any[]; circular: boolean }, recordBigEvent: boolean = false) {\r\n\t\tfor (let [, node] of this._nodeDB.entries()) this.removeNode(node);\r\n\r\n\t\tif (json.circular) {\r\n\t\t\tfor (let node of json.nodes) {\r\n\t\t\t\t(node.constructor as any).deserialize(node, this);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tfor (let node of json.nodes) {\r\n\t\t\t\t(node.constructor as any).fromJson(node, this);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\ttoJson(circular: boolean) {\r\n\t\tconst nodes = [];\r\n\t\tfor (let [, node] of this._nodeDB) {\r\n\t\t\tif (node.topLevel) nodes.push(circular ? node.serialize() : node.toJson());\r\n\t\t}\r\n\t\treturn { circular, nodes };\r\n\t}\r\n}\r\n\r\nexport default Workspace;\r\n","class Styler {\r\n\tprivate styles: Map<string, HTMLStyleElement>;\r\n\r\n\tconstructor() {\r\n\t\tthis.styles = new Map();\r\n\t}\r\n\r\n\tappendStyles(id: string, css: string): void {\r\n\t\tif (this.styles.has(id)) return; // Do not append if id exists\r\n\r\n\t\tconst styleEl = document.createElement('style');\r\n\t\tstyleEl.id = id;\r\n\t\tstyleEl.textContent = css;\r\n\t\tdocument.head.appendChild(styleEl);\r\n\t\tthis.styles.set(id, styleEl);\r\n\t}\r\n\r\n\tremoveStyles(id: string): void {\r\n\t\tconst styleEl = this.styles.get(id);\r\n\t\tif (!styleEl) return;\r\n\r\n\t\tstyleEl.remove();\r\n\t\tthis.styles.delete(id);\r\n\t}\r\n\r\n\tupdateStyles(id: string, css: string): void {\r\n\t\tconst styleEl = this.styles.get(id);\r\n\t\tif (!styleEl) return;\r\n\r\n\t\tstyleEl.textContent = css;\r\n\t}\r\n\r\n\thasStyles(id: string): boolean {\r\n\t\treturn this.styles.has(id);\r\n\t}\r\n}\r\nexport {\r\n Styler\r\n}\r\nconst styler = new Styler();\r\nexport default styler;","import WorkspaceController from \"../controllers/base\";\r\nimport Renderer from \"../renderers/renderer\";\r\nimport { clearMainWorkspace, getMainWorkspace, setMainWorkspace } from \"./main-workspace\";\r\nimport WorkspaceSvg, { WSTheme } from \"./workspace-svg\";\r\nimport NodePrototypes from \"./prototypes\"; // Object\r\nimport { FieldOptions } from \"./field\";\r\nimport { Color, Hex } from \"./visual-types\";\r\nimport styler from '../util/styler';\r\n// @ts-ignore\r\nimport _kabelStyles from './styles.css';\r\nimport env from \"../util/env\";\r\n\r\nconst kabelStyles: string = _kabelStyles;\r\n\r\n/**\r\n * Represents a field in a toolbox node.\r\n * Can contain any extra properties as needed by the field type.\r\n */\r\nexport interface TblxFieldStruct {\r\n /** Field value */\r\n value: any;\r\n\r\n /** Additional field-specific properties */\r\n [key: string]: any;\r\n}\r\n\r\n/**\r\n * Represents a node in a toolbox.\r\n */\r\nexport interface TblxNodeStruct {\r\n /** Node type (matches NodePrototypes key or arbitrary string) */\r\n type: keyof typeof NodePrototypes | string;\r\n\r\n /** Map of field names to field data */\r\n arguments: {\r\n [key: string]: TblxFieldStruct;\r\n };\r\n}\r\n\r\n/**\r\n * Represents a category in the toolbox, which contains multiple nodes.\r\n */\r\nexport interface TblxCategoryStruct {\r\n /** Category name */\r\n name: string;\r\n\r\n /** Category color */\r\n color: Color;\r\n\r\n /** Nodes contained in this category */\r\n contents: TblxNodeStruct[];\r\n}\r\n\r\n/**\r\n * Discriminated union type representing possible toolbox structures.\r\n * Can be a flyout (list of nodes) or a categorized toolbox.\r\n */\r\nexport type TblxObjStruct =\r\n | {\r\n /** Flyout toolbox type */\r\n type: 'flyout';\r\n contents: TblxNodeStruct[];\r\n }\r\n | {\r\n /** Categorized toolbox type */\r\n type?: 'category';\r\n contents: TblxCategoryStruct[];\r\n }\r\n | {\r\n /** When type is omitted, defaults to categories */\r\n type?: undefined;\r\n contents: TblxCategoryStruct[];\r\n };\r\nexport interface GridOptions {\r\n /**\r\n * The grid's type.\r\n * 'celled' - The grid is celled.\r\n * 'dotted' - The grid is dotted.\r\n */\r\n\ttype: 'celled' | 'dotted';\r\n /**\r\n * Spacing, optional. Default is 40.\r\n */\r\n\tspacing?: number;\r\n /**\r\n * Dot size for 'dotted' grid type.\r\n */\r\n\tdotSize?: number;\r\n /**\r\n * stroke width for 'celled' grid type.\r\n */\r\n\tstrokeWidth?: number;\r\n /**\r\n * Option color for any grid type. Color is #bebebeff by default.\r\n */\r\n color?: Hex\r\n}\r\n/**\r\n * Options used when injecting a new workspace.\r\n */\r\nexport interface InjectOptions {\r\n /** Optional renderer overrides */\r\n rendererOverrides?: { [key: string]: any };\r\n /** Theme for the workspace */\r\n theme?: string|WSTheme;\r\n /** Optional custom controller class */\r\n Controller?: typeof WorkspaceController;\r\n /** Init the workspace's undo state for you, or not. */\r\n initUndoRedo?: boolean;\r\n /** Optional controls configuration */\r\n controls?: {\r\n zoomSpeed?: number;\r\n minZoom?: number;\r\n maxZoom?: number;\r\n wasd?: boolean;\r\n wasdSmooth?: boolean;\r\n wasdAccelerate?: number;\r\n wasdFriction?: number;\r\n };\r\n\r\n /** Optional toolbox structure */\r\n toolbox?: TblxObjStruct;\r\n\r\n /** Optional movement speed of the workspace */\r\n moveSpeed?: number;\r\n\r\n /** Optional renderer: name string or class */\r\n renderer?: string | typeof Renderer;\r\n /**\r\n * Optional grid settings.\r\n */\r\n grid?: GridOptions;\r\n}\r\n\r\n/**\r\n * Utility class for logging injection messages in a structured way.\r\n */\r\nexport class InjectMsg {\r\n /** Message content */\r\n msg: string;\r\n\r\n /**\r\n * Creates a new InjectMsg instance.\r\n * @param msg - Message text\r\n */\r\n constructor(msg: string) {\r\n this.msg = msg;\r\n }\r\n\r\n /** Log as error */\r\n err() {\r\n console.error(`Failed to inject workspace: ${this.msg}`);\r\n }\r\n\r\n /** Log as warning */\r\n wrn() {\r\n console.warn(`Inject warning: ${this.msg}`);\r\n }\r\n\r\n /** Log as info */\r\n info() {\r\n console.info(`Inject info: ${this.msg}`);\r\n }\r\n}\r\n\r\n/**\r\n * Injects a new Kabel workspace into the document.\r\n * Appends the workspace container to the given element (or element ID) and\r\n * sets it as the main workspace.\r\n *\r\n * @param element - HTMLElement or string ID to attach the workspace to\r\n * @param options - Optional InjectOptions to configure the workspace\r\n * @returns The newly created WorkspaceSvg instance, or undefined if injection failed\r\n */\r\nexport default function inject(\r\n element: HTMLElement | string,\r\n options: InjectOptions = {}\r\n): WorkspaceSvg | undefined {\r\n if (!env.isBrowser) {\r\n new InjectMsg(`Cannot inject workspace-svg in non-browser environment (use Kabel.injectHeadless).`).err();\r\n return;\r\n }\r\n // Apply global Kabel styles\r\n styler.appendStyles('KabelStyles', kabelStyles);\r\n\r\n const root =\r\n typeof element === 'string'\r\n ? document.querySelector(`#${element}`) as HTMLElement\r\n : element as HTMLElement;\r\n\r\n if (!root) {\r\n new InjectMsg(`Document does not contain root element (Check element ID).`).err();\r\n return;\r\n }\r\n\r\n if (!document.contains(root)) {\r\n new InjectMsg(`Document does not contain root element.`).err();\r\n return;\r\n }\r\n\r\n // Create workspace wrapper element\r\n const wsTop = document.createElement('div');\r\n wsTop.className = `KabelWorkspaceWrapper`;\r\n root.appendChild(wsTop);\r\n\r\n // Initialize workspace\r\n const ws = new WorkspaceSvg(root, wsTop, options);\r\n\r\n // Set as the main workspace globally\r\n setMainWorkspace(ws);\r\n\r\n return ws;\r\n}\r\n","import { NodePrototype } from \"./node-types\";\r\nimport NodeSvg from \"./nodesvg\";\r\nimport NodePrototypes from \"./prototypes\";\r\n\r\n/**\r\n * Creates a new headless NodeSvg instance without attaching it to a workspace.\r\n * This is useful for programmatic node generation, testing, or serialization.\r\n *\r\n * @param type - The type of node to create. Must exist in NodePrototypes.\r\n * @returns The initialized NodeSvg instance, or `undefined` if the prototype does not exist.\r\n */\r\nfunction newHeadlessNode(type: string): NodeSvg | undefined {\r\n const proto: NodePrototype = NodePrototypes[type as string] as NodePrototype;\r\n\r\n // Return undefined if prototype not found\r\n if (!proto) return;\r\n\r\n // Create a new node instance\r\n const node = new NodeSvg(proto);\r\n\r\n // Initialize the node (calls prototype init, sets defaults)\r\n node.init();\r\n\r\n return node;\r\n}\r\n\r\nexport default newHeadlessNode;\r\n","const isNode = typeof process !== 'undefined' && !!process.versions?.node;\r\nconst isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';\r\nconst isWebWorker = typeof self !== 'undefined' && typeof self.importScripts === 'function';\r\n\r\nconst env: {\r\n isBrowser: boolean;\r\n isNode: boolean;\r\n isWebWorker: boolean;\r\n} = { isNode, isBrowser, isWebWorker };\r\n\r\nexport default env;","import Connection, { Connectable } from \"./connection\";\r\nimport { NodePrototype } from \"./node-types\";\r\nimport { ColorStyle, Color } from './visual-types';\r\nimport hasProp from '../util/has-prop';\r\nimport Field, { AnyField, AnyFieldCls, DummyField, FieldMap, FieldOptions } from \"./field\";\r\nimport CategoryColors from \"./colors\";\r\nimport Coordinates from \"./coordinates\";\r\nimport { generateUID } from \"../util/uid\";\r\nimport EventEmitter from '../util/emitter';\r\nimport { G } from \"@svgdotjs/svg.js\";\r\nimport WorkspaceSvg from \"./workspace-svg\";\r\nimport RendererConstants from \"../renderers/constants\";\r\nimport CommentModel, { CommentSerialized } from \"./comment\";\r\nimport { RepresenterNode } from '../renderers/representer-node';\r\nimport NodePrototypes from \"./prototypes\";\r\n/**\r\n * Represents the JSON structure used to initialize a field on a node.\r\n * Each field has a type, label, and name. Additional properties can be included for field-specific configuration.\r\n */\r\nexport interface InputFieldJson {\r\n /** Human-readable label for the field, shown on the node UI */\r\n label: string;\r\n\r\n /** Field type identifier, corresponding to a field constructor in FieldMap */\r\n type: string;\r\n\r\n /** Unique field name within the node */\r\n name: string;\r\n\r\n /**\r\n * Optional additional properties for field initialization.\r\n * Can include type-specific options like min/max for number fields,\r\n * default values, dropdown options, etc.\r\n */\r\n [key: string]: any;\r\n}\r\n\r\n/**\r\n * Represents a JSON structure for initializing a NodeSvg instance.\r\n * Includes colors, connections, label, fields, category, and type information.\r\n */\r\nexport interface NodeJson {\r\n /** Primary color of the node (e.g., top bar, main connections) */\r\n primaryColor?: Color | undefined;\r\n\r\n /** Secondary color of the node (e.g., field backgrounds) */\r\n secondaryColor?: Color | undefined;\r\n\r\n /** Tertiary color of the node (e.g., outlines) */\r\n tertiaryColor?: Color | undefined;\r\n\r\n /**\r\n * Optional previous connection data.\r\n * Presence triggers creation of a previous connection when initializing NodeSvg.\r\n */\r\n previousConnection?: any | undefined;\r\n\r\n /**\r\n * Optional next connection data.\r\n * Presence triggers creation of a next connection when initializing NodeSvg.\r\n */\r\n nextConnection?: any | undefined;\r\n\r\n /** Optional node label text to display */\r\n labelText?: string | undefined;\r\n\r\n /** Array of field definitions (InputFieldJson) to attach to this node */\r\n arguments?: InputFieldJson[] | undefined;\r\n\r\n /** Optional category name for color theming */\r\n category?: string | undefined;\r\n\r\n /** Node type identifier, used to look up the NodePrototype */\r\n type: string;\r\n}\r\n\r\n/**\r\n * Represents a fully serialized node including its fields, colors, coordinates, connections, and optional comment.\r\n * Used for saving or transferring node data.\r\n */\r\nexport interface SerializedNode {\r\n /** Node type string */\r\n type: string;\r\n\r\n /** Unique node ID */\r\n id: string;\r\n\r\n /** Display label of the node */\r\n label: string;\r\n\r\n /** Node colors including primary, secondary, tertiary, and category */\r\n colors: ColorStyle;\r\n\r\n /** Coordinates of the node relative to its workspace */\r\n relativeCoords: { x: number; y: number };\r\n\r\n /** Optional comment text attached to the node */\r\n comment?: CommentSerialized | undefined;\r\n\r\n /** Array of serialized fields, may contain any field-specific structure */\r\n fields?: any[] | undefined;\r\n\r\n /**\r\n * Serialized representation of the previous connection.\r\n * If `field` is true, the connection originates from a field rather than a node.\r\n */\r\n previousConnection?: { field?: boolean | undefined; node?: SerializedNode | undefined } | undefined;\r\n\r\n /**\r\n * Serialized representation of the next connection.\r\n * If `field` is true, the connection originates from a field rather than a node.\r\n */\r\n nextConnection?: { field?: boolean | undefined; node?: SerializedNode | undefined } | undefined;\r\n}\r\n\r\n/**\r\n * NodeStyle represents the styling configuration of a node.\r\n * Includes ColorStyle properties plus optional renderer-specific constants and arbitrary additional fields.\r\n */\r\nexport type NodeStyle = ColorStyle &\r\n{\r\n /** Optional renderer-specific constants from RendererConstants */\r\n [key in keyof RendererConstants]?: RendererConstants[key];\r\n} &\r\n{\r\n /** Any additional style properties supported by extensions or custom renderers */\r\n [key: string]: any;\r\n};\r\n\r\n/**\r\n * Events emitted by NodeSvg instances.\r\n * Consumers can listen to these events to react to node lifecycle changes.\r\n */\r\nexport interface NodeEvents {\r\n /** Triggered before the node is removed from the workspace */\r\n \"REMOVING\": null;\r\n\r\n /** Triggered immediately after node initialization */\r\n \"INITING\": null;\r\n\r\n /** Triggered while the node is being dragged */\r\n \"NODE_DRAG\": null;\r\n}\r\n\r\n/**\r\n * Represents a node in the workspace.\r\n * Handles connections, fields, colors, serialization, and events.\r\n */\r\nclass NodeSvg extends EventEmitter<NodeEvents> {\r\n /** The previous connection for this node (null if none) */\r\n previousConnection: Connection | null;\r\n /** The next connection for this node (null if none) */\r\n nextConnection: Connection | null;\r\n /** Node type string, usually derived from prototype */\r\n type: string | null;\r\n /** Prototype object providing behavior for this node */\r\n prototype: NodePrototype | null;\r\n /** Node color style object */\r\n colors: NodeStyle; // Node's color scheme\r\n /** Displayed label text for this node */\r\n labelText: string; // Displayed node label\r\n /** Set of fields attached to this node */\r\n _fieldColumn: Set<AnyField>; // Stores attached fields\r\n /** Node coordinates relative to workspace */\r\n relativeCoords: Coordinates;\r\n /** Unique node ID */\r\n id: string;\r\n /** SVG representation of this node */\r\n svg?: RepresenterNode | object | null = null;\r\n /** Workspace this node belongs to */\r\n workspace: WorkspaceSvg | null = null;\r\n /** Optional comment attached to this node */\r\n comment: CommentModel | null\r\n /** Event key: \"REMOVING\" */\r\n static REMOVING: keyof NodeEvents = \"REMOVING\";\r\n\r\n /** Event key: \"INITING\" */\r\n static INITING: keyof NodeEvents = \"INITING\";\r\n /**\r\n * Creates a NodeSvg instance.\r\n * @param prototype Optional NodePrototype to associate with this node.\r\n * @param workspace Optional WorkspaceSvg this node belongs to.\r\n * @param svgGroup Optional SVG group to attach node visuals.\r\n */\r\n constructor(prototype: NodePrototype | null, workspace?: WorkspaceSvg, svgGroup?: G) {\r\n super();\r\n this.type = null;\r\n this.comment = null;\r\n this.prototype = prototype;\r\n this.colors = {\r\n primary: '#000000', // Topbar & connection color\r\n secondary: '#000000', // Field & dropdown backgrounds\r\n tertiary: '#000000', // Outline color\r\n category: '' // Node category name (optional)\r\n };\r\n this.previousConnection = new Connection(null, this, true); //1st arg is from, 2nd is to, third is if this conn is prev\r\n this.nextConnection = new Connection(this, null, false); //1st arg is from, 2nd is to, third is if this conn is prev\r\n this.labelText = '';\r\n this._fieldColumn = new Set();\r\n this.relativeCoords = new Coordinates(0, 0);\r\n this.id = generateUID('nanoid', { alphabet: 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0129384756!)@(#*$&%^' });\r\n if (workspace) {\r\n this.workspace = workspace;\r\n }\r\n if (svgGroup) {\r\n this.svg = new RepresenterNode(this, {\r\n id: this.id,\r\n pendingConnections: [],\r\n group: svgGroup\r\n }, workspace!.renderer)\r\n }\r\n }\r\n /** Returns true if this node has no previous connection (i.e., top-level node) */\r\n get topLevel() {\r\n return !(this.previousConnection?.getFrom());\r\n }\r\n /** Returns the raw SVG group element if present */\r\n get svgGroup() {\r\n return (this.svg as RepresenterNode)?.getRaw?.();\r\n }\r\n /** Returns the text of the node's comment, if any */\r\n getCommentText() {\r\n return this.comment?.getText?.();\r\n }\r\n /** Returns the CommentModel instance for this node, if any */\r\n getComment() {\r\n return this.comment;\r\n }\r\n /** Adds a new comment to this node if none exists */\r\n addComment() {\r\n if (!this.comment) {\r\n this.comment = new CommentModel(this);\r\n return;\r\n }\r\n console.warn('Comment already exists.')\r\n }\r\n /** Sets the text for the node's comment, creating one if needed */\r\n setCommentText(text: string) {\r\n if (!this.comment) {\r\n this.comment = new CommentModel(this);\r\n }\r\n this.comment.setText(text);\r\n }\r\n /** Removes the comment from the node and triggers workspace redraw */\r\n removeComment() {\r\n this.comment = null;\r\n this.workspace?.redrawComments?.();\r\n }\r\n /** Returns an array of all fields attached to this node */\r\n allFields() {\r\n return Array.from(this._fieldColumn);\r\n }\r\n /** Retrieves a field by name from this node */\r\n getFieldByName(name: string): AnyField | null | undefined {\r\n let field: AnyField | null | undefined = this.allFields().find(fld => fld.getName() === name);\r\n\r\n return field;\r\n }\r\n /** Alias for getFieldByName */\r\n getField(name: string): AnyField | null | undefined {\r\n return this.getFieldByName(name);\r\n }\r\n /** Retrieves the current value of a field by name */\r\n getFieldValue(name: string): any | undefined {\r\n const fld: AnyField | null | undefined = this.getFieldByName(name);\r\n if (fld) {\r\n return fld.getValue();\r\n }\r\n return undefined;\r\n }\r\n /** Retrieves the display value of a field by name */\r\n getFieldDisplayValue(name: string): any | undefined {\r\n const fld: AnyField | null | undefined = this.getFieldByName(name);\r\n if (fld) {\r\n return fld.getDisplayValue();\r\n }\r\n return undefined;\r\n }\r\n /** Sets the value of a field by name */\r\n setFieldValue(name: string, value: any) {\r\n const fld: AnyField | null | undefined = this.getFieldByName(name);\r\n if (fld) {\r\n fld.setValue(value as never); // I don't like using the \"as\" statement here, but it's necessary to satisfy TypeScript.\r\n }\r\n return fld;\r\n }\r\n\r\n /**\r\n * Initiates the node, calling prototype methods.\r\n */\r\n init() {\r\n this.emit(NodeSvg.INITING, null);\r\n if (this.prototype) {\r\n if (this.prototype.init) this.prototype.init.call(this, this.prototype, this);\r\n if (this.workspace) {\r\n this.workspace.addNode(this)\r\n }\r\n if (this.prototype.removed) {\r\n this.on(NodeSvg.REMOVING, () => {\r\n this.prototype?.removed.call(this, this.prototype, this);\r\n })\r\n }\r\n } else {\r\n console.warn(`Node with id ${this.id} is missing a prototype.`)\r\n }\r\n }\r\n /** Returns whether this node has a category style applied */\r\n hasCategoryStyle() {\r\n return !!this.colors?.category && this.colors?.category?.length > 0;\r\n }\r\n\r\n /** Returns the category name or null if none */\r\n getCategoryName() {\r\n return this.colors?.category || null;\r\n }\r\n\r\n /** Returns the node's current ColorStyle */\r\n getStyle() {\r\n return this.colors;\r\n }\r\n\r\n /** Internal helper: attach a field to this node */\r\n _appendFieldItem(field: AnyField) {\r\n if (!field) console.warn(\"Falsey field passed to _appendFieldItem.\");\r\n this._fieldColumn.add(field);\r\n }\r\n\r\n /** Initialize node from a NodeJson object */\r\n jsonInit(json: NodeJson) {\r\n if (json.primaryColor) this.colors.primary = json.primaryColor;\r\n if (json.secondaryColor) this.colors.secondary = json.secondaryColor;\r\n if (json.tertiaryColor) this.colors.tertiary = json.tertiaryColor;\r\n\r\n // Apply category colors if defined\r\n if (json.category && CategoryColors[json.category]) {\r\n const style: ColorStyle = CategoryColors[json.category] as ColorStyle;\r\n Object.assign(this.colors, { category: json.category }, style);\r\n }\r\n\r\n this.previousConnection = hasProp(json, 'previousConnection') ? new Connection(null, this, true) : null;\r\n this.nextConnection = hasProp(json, 'nextConnection') ? new Connection(this, null, false) : null;\r\n\r\n if (json.labelText) this.labelText = json.labelText;\r\n if (json.arguments) this.applyJsonArguments(json.arguments);\r\n if (json.type) {\r\n this.type = json.type;\r\n }\r\n }\r\n\r\n /* JAVASCRIPT API */\r\n\r\n /** Apply field definitions from a JSON-like array without full NodeJson */\r\n applyJsonArguments(args: InputFieldJson[]) {\r\n for (let field of args) {\r\n if (!field.type || !field.name) {\r\n console.warn(`Invalid argument definition at: ${args.indexOf(field)}.`);\r\n continue;\r\n }\r\n\r\n const FieldConstructor: AnyFieldCls | undefined = FieldMap[field.type] as AnyFieldCls | undefined;\r\n if (!FieldConstructor) {\r\n console.warn(`Missing field constructor for ${field.type}!`);\r\n continue;\r\n }\r\n\r\n const fld: AnyField = new FieldConstructor();\r\n fld.fromJson(field); // initialize field\r\n fld.node = this;\r\n this._appendFieldItem(fld);\r\n }\r\n return this;\r\n }\r\n /** Appends a connection field to this node */\r\n appendConnection(name: string): Field {\r\n const fld = new (FieldMap['connection'])();\r\n this._appendFieldItem(fld);\r\n fld.setName(name);\r\n fld.node = this;\r\n return fld;\r\n }\r\n /** Appends a numeric input field to this node */\r\n appendNumber(name: string): Field {\r\n const fld = new (FieldMap['field_num'])();\r\n this._appendFieldItem(fld);\r\n fld.setName(name);\r\n fld.node = this;\r\n return fld;\r\n }\r\n /** Appends a text input field to this node */\r\n appendText(name: string): Field {\r\n const fld = new (FieldMap['field_str'])();\r\n this._appendFieldItem(fld);\r\n fld.setName(name);\r\n fld.node = this;\r\n return fld;\r\n }\r\n\r\n /** Appends a field that can hold a connection or raw value */\r\n appendOptLink(name: string): Field {\r\n const fld = new (FieldMap['field_both'])();\r\n this._appendFieldItem(fld);\r\n fld.setName(name);\r\n fld.node = this;\r\n return fld;\r\n }\r\n /** Sets the category name for the node */\r\n setCategoryName(name: string) {\r\n this.colors.category = name;\r\n return this;\r\n }\r\n /** Applies a ColorStyle to the node */\r\n setStyle(style: ColorStyle) {\r\n // apply properties from style into this.colors\r\n Object.assign(this.colors, style);\r\n return this;\r\n }\r\n\r\n /** Sets primary, secondary, and tertiary colors for the node */\r\n setColor(primary: Color, secondary: Color, tertiary: Color) {\r\n this.setStyle({ primary, secondary, tertiary });\r\n return this;\r\n }\r\n /** Sets the label text for the node */\r\n setLabelText(text: string) {\r\n this.labelText = text;\r\n return this;\r\n }\r\n\r\n /** Add or replace a previous/next connection based on argument */\r\n setConnection(prevOrNext: string | number | boolean) {\r\n const stringed = String(prevOrNext).toLowerCase();\r\n const cast = stringed == '0' ? 0 : (stringed == '1' ? 1 : (stringed == 'true' ? 1 : (stringed == 'false' ? 0 : 3)));\r\n\r\n if (cast === 0) {\r\n this.previousConnection = new Connection(null, this, true);\r\n } else if (cast === 1) {\r\n this.nextConnection = new Connection(this, null, false);\r\n } else {\r\n console.warn('Invalid prevOrNext argument for NodeSvg.setConnection');\r\n }\r\n return this;\r\n }\r\n /** Copies another NodeSvg into this node */\r\n fromNode(other: NodeSvg) {\r\n if (!other) return;\r\n\r\n // Copy primitive props\r\n this.type = other.type;\r\n this.labelText = other.labelText;\r\n this.relativeCoords = new Coordinates(other.relativeCoords.x, other.relativeCoords.y);\r\n\r\n // Copy colors\r\n this.colors = { ...other.colors };\r\n\r\n // Copy connections\r\n this.previousConnection = other.previousConnection\r\n ? new Connection(null, this, true)\r\n : null;\r\n this.nextConnection = other.nextConnection\r\n ? new Connection(this, null, false)\r\n : null;\r\n\r\n // Copy fields\r\n this._fieldColumn.clear();\r\n for (let field of other._fieldColumn) {\r\n const FieldCls = field.constructor as AnyFieldCls;\r\n const newField = (new FieldCls()) as any;\r\n\r\n // Copy basic properties\r\n newField.setName(field.getName());\r\n if ('getValue' in field && 'setValue' in newField) {\r\n newField.setValue(field.getValue());\r\n }\r\n if ('getLabel' in field && 'setLabel' in newField) {\r\n newField.setLabel(field.getLabel())\r\n }\r\n this._appendFieldItem(newField);\r\n }\r\n\r\n // Copy workspace reference\r\n this.workspace = other.workspace;\r\n\r\n // Copy prototype reference\r\n this.prototype = other.prototype;\r\n\r\n\r\n return this;\r\n }\r\n /** Serializes a Connection object, handling fields and nested nodes */\r\n _serializeConnection(\r\n c: Connection,\r\n alreadyProcessed: { [key: string]: SerializedNode }\r\n ): { field?: boolean | undefined; node?: SerializedNode | undefined } {\r\n const returned: { field?: boolean; node?: SerializedNode } = {};\r\n let connected: NodeSvg | AnyField | null = c.isPrevious ? c.getFrom() : c.getTo();\r\n\r\n if (!connected) return returned;\r\n\r\n if (connected instanceof NodeSvg) {\r\n // Avoid serializing the same node twice\r\n if (alreadyProcessed[connected.id]) {\r\n return { node: alreadyProcessed[connected.id] };\r\n }\r\n returned.node = connected.serialize(alreadyProcessed);\r\n } else {\r\n // Field serialization\r\n const fld = connected as AnyField;\r\n // If the field has a node, we serialize the node first\r\n let fieldNode: SerializedNode | undefined;\r\n if (fld.node) {\r\n if (alreadyProcessed[fld.node.id]) {\r\n fieldNode = alreadyProcessed[fld.node.id];\r\n } else {\r\n fieldNode = fld.node.serialize(alreadyProcessed);\r\n }\r\n }\r\n returned.field = true;\r\n if (fieldNode) returned.node = fieldNode;\r\n }\r\n\r\n return returned;\r\n }\r\n\r\n /**\r\n * Serialize a node, this includes circular references. use toJson to avoid those.\r\n * @param alreadyProcessed - Internal.\r\n * @returns \r\n */\r\n serialize(alreadyProcessed: { [key: string]: SerializedNode } = {}): SerializedNode {\r\n if (alreadyProcessed[this.id]) {\r\n return alreadyProcessed[this.id] as SerializedNode;\r\n }\r\n\r\n // Put a placeholder in map *before* serializing connections\r\n const serialized: SerializedNode = {\r\n id: this.id,\r\n type: this.type || '',\r\n colors: { primary: this.colors.primary, secondary: this.colors.secondary, tertiary: this.colors.tertiary, category: this.colors.category } as ColorStyle,\r\n label: this.labelText,\r\n previousConnection: undefined,\r\n nextConnection: undefined,\r\n relativeCoords: { x: this.relativeCoords.x, y: this.relativeCoords.y },\r\n comment: this.comment?.toJson?.(),\r\n fields: [], // fill after placeholder\r\n };\r\n alreadyProcessed[this.id] = serialized;\r\n\r\n // Now safely fill in the heavy parts\r\n serialized.fields = this.allFields().map(fld =>\r\n fld.toJson\r\n ? fld.toJson(true, alreadyProcessed)\r\n : {\r\n name: fld.getName(),\r\n type: fld.constructor.name,\r\n value: fld.getValue ? fld.getValue() : undefined,\r\n }\r\n );\r\n\r\n serialized.previousConnection = this.previousConnection\r\n ? this._serializeConnection(this.previousConnection, alreadyProcessed)\r\n : undefined;\r\n\r\n serialized.nextConnection = this.nextConnection\r\n ? this._serializeConnection(this.nextConnection, alreadyProcessed)\r\n : undefined;\r\n\r\n return serialized;\r\n }\r\n\r\n /**\r\n * Return a flattened version of the serialized node structure, which is non-circular.\r\n * Any node reference inside connections or fields is replaced by its ID.\r\n */\r\n toJson(): {\r\n [id: string]: Omit<SerializedNode, 'previousConnection' | 'nextConnection'> & {\r\n previousConnection?: { field?: FieldOptions; node?: string };\r\n nextConnection?: { field?: FieldOptions; node?: string };\r\n }\r\n } {\r\n const serialized = this.serialize();\r\n const flat: { [id: string]: any } = {};\r\n\r\n const processNode = (node: SerializedNode) => {\r\n if (flat[node.id]) return;\r\n\r\n const copy: any = {\r\n ...node,\r\n previousConnection: node.previousConnection ? { ...node.previousConnection } : undefined,\r\n nextConnection: node.nextConnection ? { ...node.nextConnection } : undefined,\r\n };\r\n\r\n flat[node.id] = copy;\r\n\r\n // Handle connections\r\n if (copy.previousConnection?.node) {\r\n const prevNode = copy.previousConnection.node;\r\n copy.previousConnection.node = prevNode.id;\r\n processNode(prevNode);\r\n }\r\n if (copy.nextConnection?.node) {\r\n const nextNode = copy.nextConnection.node;\r\n copy.nextConnection.node = nextNode.id;\r\n processNode(nextNode);\r\n }\r\n\r\n // Handle fields recursively\r\n if (Array.isArray(copy.fields)) {\r\n for (let fld of copy.fields) {\r\n if (fld.node) {\r\n processNode(fld.node);\r\n fld.node = fld.node.id;\r\n }\r\n for (let key in fld) {\r\n if (fld[key]?.node) {\r\n processNode(fld[key]?.node);\r\n fld[key].node = fld[key].node.id;\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n processNode(serialized);\r\n return flat;\r\n }\r\n\r\n /**\r\n * Reconstruct a NodeSvg from a SerializedNode structure (handles circular references)\r\n */\r\n static _deserialize(\r\n data: SerializedNode,\r\n allNodes: { [id: string]: NodeSvg } = {},\r\n workspace?: WorkspaceSvg\r\n ): NodeSvg {\r\n // If already created, return the existing instance\r\n if (allNodes[data.id]) return allNodes[data.id] as NodeSvg;\r\n\r\n if (workspace && workspace.getNode(data.id)) {\r\n workspace.removeNodeById(data.id); // remove old node which had the same id.\r\n }\r\n // Create a new node with minimal prototype info (can be patched later)\r\n const node = new NodeSvg(NodePrototypes[data.type] as NodePrototype, workspace);\r\n node.id = data.id;\r\n node.init();\r\n node.type = data.type;\r\n node.relativeCoords.set(data.relativeCoords.x, data.relativeCoords.y);\r\n node.labelText = data.label || '';\r\n if (data.comment && workspace) {\r\n node.comment = CommentModel.fromJson(data.comment as CommentSerialized);\r\n node.comment._parent = node;\r\n node.comment._isWorkspaceComment = false;\r\n }\r\n // IMPORTANT: restore colors from serialized data (if present)\r\n if (data.colors) {\r\n // Start with category colors if a category is present and known\r\n if (data.colors.category && CategoryColors[data.colors.category]) {\r\n const style: ColorStyle = CategoryColors[data.colors.category] as ColorStyle;\r\n Object.assign(node.colors, style, { category: data.colors.category });\r\n }\r\n // Then override with explicit serialized colors (primary/secondary/tertiary)\r\n // This preserves explicit color values even when a category was saved\r\n const explicit: Partial<ColorStyle> = {};\r\n if (data.colors.primary) explicit.primary = data.colors.primary;\r\n if (data.colors.secondary) explicit.secondary = data.colors.secondary;\r\n if (data.colors.tertiary) explicit.tertiary = data.colors.tertiary;\r\n if (data.colors.category) explicit.category = data.colors.category;\r\n node.setStyle(explicit as ColorStyle);\r\n }\r\n // Register placeholder before deserializing connections to handle circular refs\r\n allNodes[node.id] = node;\r\n\r\n // Deserialize fields\r\n if (Array.isArray(data.fields)) {\r\n node._fieldColumn = new Set();\r\n for (let fldData of data.fields) {\r\n const FieldConstructor = FieldMap[fldData.type];\r\n if (!FieldConstructor) continue;\r\n\r\n const fld: AnyField = new FieldConstructor();\r\n fld.fromJson(fldData, workspace); // ONLY fldData and workspace\r\n fld.node = node;\r\n node._appendFieldItem(fld);\r\n }\r\n }\r\n\r\n // Deserialize previous/next connections\r\n if (data.previousConnection?.node) {\r\n node.previousConnection = new Connection(null, node, true);\r\n node.previousConnection.setFrom(NodeSvg._deserialize(data.previousConnection.node, allNodes, workspace));\r\n }\r\n\r\n if (data.nextConnection?.node) {\r\n node.nextConnection = new Connection(node, null, false);\r\n node.nextConnection.setTo(NodeSvg._deserialize(data.nextConnection.node, allNodes, workspace));\r\n } else {\r\n workspace?.redraw(); // redraw if we reached the end.\r\n }\r\n\r\n return node;\r\n }\r\n /** Public: Deserialize a SerializedNode or plain object into a NodeSvg attached to a workspace */\r\n static deserialize(json: SerializedNode | any, workspace: WorkspaceSvg) {\r\n return this._deserialize(json as SerializedNode, {}, workspace);\r\n }\r\n /** Reconstructs nodes from a flattened JSON structure into a NodeSvg tree */\r\n static fromJson(flat: Record<string, any>, workspace: WorkspaceSvg): any {\r\n const nodes: Record<string, any> = {};\r\n // shallow clone so we can safely mutate\r\n for (const id in flat) {\r\n nodes[id] = { ...flat[id] };\r\n }\r\n\r\n // rebuild references\r\n for (const id in nodes) {\r\n const node = nodes[id];\r\n\r\n // fix connection refs\r\n if (node.previousConnection?.node) {\r\n const refId = node.previousConnection.node as string;\r\n node.previousConnection = {\r\n ...node.previousConnection,\r\n node: nodes[refId],\r\n };\r\n }\r\n if (node.nextConnection?.node) {\r\n const refId = node.nextConnection.node as string;\r\n node.nextConnection = {\r\n ...node.nextConnection,\r\n node: nodes[refId],\r\n };\r\n }\r\n\r\n // fix fields\r\n if (Array.isArray(node.fields)) {\r\n for (const fld of node.fields) {\r\n if (typeof fld.node === 'string')\r\n fld.node = nodes[fld.node];\r\n\r\n for (const key in fld) {\r\n const maybe = fld[key];\r\n if (maybe?.node && typeof maybe.node === 'string')\r\n maybe.node = nodes[maybe.node];\r\n }\r\n }\r\n }\r\n }\r\n\r\n // the root is just the one w/ no previousConnection\r\n const root = Object.values(nodes).find(n => !n.previousConnection?.node) ?? null;\r\n return this._deserialize(root, {}, workspace);\r\n }\r\n\r\n\r\n}\r\n\r\nexport default NodeSvg;\r\n","import CommentModel from \"./comment\";\r\nimport { ContextMenuOpts, Showable } from \"./context-menu\";\r\nimport NodeSvg from \"./nodesvg\";\r\nimport WorkspaceSvg from \"./workspace-svg\";\r\n\r\n/** Registry for all context menu options */\r\nconst ContextOptsRegistry: ContextMenuOpts[] = [];\r\n\r\n/**\r\n * Global context menu manager\r\n */\r\nconst ContextMenu = {\r\n /**\r\n * Register a new context menu option\r\n * @param id - Unique identifier for the option\r\n * @param option - Configuration for the context menu item\r\n */\r\n registerOption(id: string, option: Omit<ContextMenuOpts, 'id'>) {\r\n const opt = {\r\n id,\r\n click: option.click,\r\n label: option.label,\r\n onHoverStart: option.onHoverStart || (() => { }),\r\n onHoverEnd: option.onHoverEnd || (() => { }),\r\n showFor: option.showFor || 'any'\r\n };\r\n ContextOptsRegistry.push(opt);\r\n },\r\n\r\n /**\r\n * Unregister an existing context menu option by ID\r\n * @param id - ID of the option to remove\r\n */\r\n unregisterOption(id: string) {\r\n const index = ContextOptsRegistry.findIndex(opt => opt.id === id);\r\n if (index >= 0) ContextOptsRegistry.splice(index, 1);\r\n }\r\n};\r\n\r\n// ----- Default options -----\r\n\r\nContextMenu.registerOption('k_delete', {\r\n showFor: 'node',\r\n label: 'Delete',\r\n click: (t) => {\r\n const target = t as NodeSvg;\r\n if (!target.workspace) return;\r\n target.workspace.removeNode(target);\r\n }\r\n});\r\n\r\nContextMenu.registerOption('k_deleteall', {\r\n showFor: 'ws',\r\n label: 'Delete all',\r\n click: (t) => {\r\n const target = t as WorkspaceSvg;\r\n const isSure = window.confirm(`Are you sure you want to delete ${Array.from(target._nodeDB.keys()).length} nodes?`);\r\n if (!isSure) return;\r\n for (let [id, _] of target._nodeDB) {\r\n target.removeNodeById(id);\r\n }\r\n }\r\n});\r\n\r\nContextMenu.registerOption('k_addcomment', {\r\n showFor: ['ws', 'node'],\r\n label: 'Add Comment',\r\n click: (t) => {\r\n const target = t;\r\n if (target instanceof NodeSvg) {\r\n target.addComment();\r\n target.setCommentText('Comment!');\r\n } else if (target instanceof WorkspaceSvg) {\r\n const model = target.addComment();\r\n const pos = target.screenToWorkspace(target._ctxMenu.widget.coords.x, target._ctxMenu.widget.coords.y);\r\n model.relativeCoords.set(pos.x, pos.y);\r\n model.setText('Comment!');\r\n }\r\n }\r\n});\r\nContextMenu.registerOption('k_undo', {\r\n showFor: ['ws', 'node', 'comment'],\r\n label: 'Undo',\r\n click: (t) => {\r\n if (t instanceof NodeSvg) {\r\n t.workspace?.history?.undo();\r\n } else if (t instanceof CommentModel) {\r\n t.getWorkspace()?.history?.undo();\r\n } else if (t instanceof WorkspaceSvg) {\r\n t.history.undo();\r\n }\r\n },\r\n onDraw(el, ws, opt) {\r\n console.log('onDrawCalled');\r\n if (!ws.history.canUndo()) {\r\n (el as HTMLElement).classList.add('disabled')\r\n }\r\n }\r\n})\r\nContextMenu.registerOption('k_redo', {\r\n showFor: ['ws', 'node', 'comment'],\r\n label: 'Redo',\r\n click: (t) => {\r\n if (t instanceof NodeSvg) {\r\n t.workspace?.history?.redo();\r\n } else if (t instanceof CommentModel) {\r\n t.getWorkspace()?.history?.redo();\r\n } else if (t instanceof WorkspaceSvg) {\r\n t.history.redo();\r\n }\r\n },\r\n onDraw(el, ws, opt) {\r\n console.log('onDrawCalled');\r\n if (!ws.history.canRedo()) {\r\n (el as HTMLElement).classList.add('disabled')\r\n }\r\n }\r\n})\r\nContextMenu.registerOption('k_deletecomment', {\r\n showFor: 'comment',\r\n label: 'Delete Comment',\r\n click: (t) => {\r\n const target = t as CommentModel;\r\n if (target.isNodeComment() && target._parent instanceof NodeSvg) {\r\n target._parent.removeComment();\r\n } else {\r\n target.getWorkspace().removeComment(target);\r\n }\r\n }\r\n});\r\n\r\nContextMenu.registerOption('k_duplicate', {\r\n showFor: 'node',\r\n label: 'Duplicate',\r\n click: t => {\r\n const node = t as NodeSvg;\r\n if (!node.workspace) return;\r\n node.workspace.cloneNode(node);\r\n }\r\n});\r\n\r\nexport { ContextMenu };\r\nexport default ContextOptsRegistry;\r\n","type WindowEventKeys =\r\n\t| 'resize'\r\n\t| 'scroll'\r\n\t| 'blur'\r\n\t| 'focus'\r\n\t| 'visibilitychange'\r\n\t| 'pointerlockchange'\r\n\t| 'beforeunload';\r\n\r\ntype WindowListenersMap = Record<WindowEventKeys, Array<(event: Event) => void>>;\r\n\r\nconst windowListeners: WindowListenersMap = {\r\n\tresize: [],\r\n\tscroll: [],\r\n\tblur: [],\r\n\tfocus: [],\r\n\tvisibilitychange: [],\r\n\tpointerlockchange: [],\r\n\tbeforeunload: [],\r\n};\r\n\r\nfunction handleEvent(type: WindowEventKeys, event: Event) {\r\n\tconst list = windowListeners[type];\r\n\tif (!list.length) return;\r\n\tfor (const fn of list) {\r\n\t\ttry {\r\n\t\t\tfn(event);\r\n\t\t} catch (err) {\r\n\t\t\tconsole.error(`[Kabel] Error in window listener for '${type}':`, err);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n// auto attach\r\n(Object.keys(windowListeners) as WindowEventKeys[]).forEach((type) => {\r\n\twindow.addEventListener(type, (e) => handleEvent(type, e));\r\n});\r\n\r\nexport function addWindowListener(\r\n\ttype: WindowEventKeys,\r\n\tfn: (event: Event) => void\r\n) {\r\n\twindowListeners[type].push(fn);\r\n}\r\n\r\nexport function removeWindowListener(\r\n\ttype: WindowEventKeys,\r\n\tfn: (event: Event) => void\r\n) {\r\n\tconst list = windowListeners[type];\r\n\tconst i = list.indexOf(fn);\r\n\tif (i !== -1) list.splice(i, 1);\r\n}\r\n\r\nexport function clearWindowListeners(type?: WindowEventKeys) {\r\n\tif (type) windowListeners[type].length = 0;\r\n\telse (Object.keys(windowListeners) as WindowEventKeys[]).forEach((k) => {\r\n\t\twindowListeners[k].length = 0;\r\n\t});\r\n}\r\n\r\nexport default windowListeners;\r\n","type EventHandler<T = any> = (payload: T) => void;\r\n\r\nclass EventEmitter<Events extends Record<string, any>> {\r\n\tprivate listeners: { [K in keyof Events]?: EventHandler<Events[K]>[] } = {};\r\n\r\n\ton<K extends keyof Events>(event: K, handler: EventHandler<Events[K]>) {\r\n\t\tif (!this.listeners[event]) this.listeners[event] = [];\r\n\t\tthis.listeners[event]!.push(handler);\r\n\t\treturn this;\r\n\t}\r\n\r\n\toff<K extends keyof Events>(event: K, handler: EventHandler<Events[K]>) {\r\n\t\tif (!this.listeners[event]) return this;\r\n\t\tthis.listeners[event] = this.listeners[event]!.filter(h => h !== handler);\r\n\t\treturn this;\r\n\t}\r\n\r\n\temit<K extends keyof Events>(event: K, payload: Events[K]) {\r\n\t\tif (!this.listeners[event]) return false;\r\n\t\tthis.listeners[event]!.forEach(handler => handler(payload));\r\n\t\treturn true;\r\n\t}\r\n\r\n\tonce<K extends keyof Events>(event: K, handler: EventHandler<Events[K]>) {\r\n\t\tconst wrapper = (payload: Events[K]) => {\r\n\t\t\thandler(payload);\r\n\t\t\tthis.off(event, wrapper);\r\n\t\t};\r\n\t\tthis.on(event, wrapper);\r\n\t\treturn this;\r\n\t}\r\n}\r\nexport default EventEmitter;","import Flyout from \"./flyout\";\r\nimport { InjectOptions, TblxCategoryStruct, TblxNodeStruct } from \"./inject\";\r\nimport WorkspaceSvg, { WSTheme } from \"./workspace-svg\";\r\nimport Category from \"./category\";\r\n\r\n/**\r\n * Represents the toolbox in a Kabel workspace.\r\n * The toolbox can be either a flyout or a category-based toolbox.\r\n */\r\nclass Toolbox {\r\n /** Toolbox type: 1 = category toolbox, 2 = flyout toolbox */\r\n type: 1 | 2;\r\n\r\n /** Reference to the workspace this toolbox belongs to */\r\n workspace: WorkspaceSvg;\r\n\r\n /** Workspace options for initialization */\r\n wsOptions: InjectOptions;\r\n\r\n /** Flyout instance for node display */\r\n _flyout: Flyout;\r\n\r\n /** Contents of the toolbox (nodes or categories) */\r\n _contents: TblxNodeStruct[] | TblxCategoryStruct[];\r\n\r\n /** DOM container element for the toolbox */\r\n container: HTMLDivElement;\r\n\r\n /** List of categories (if using a category toolbox) */\r\n _categories: Category[] = [];\r\n\r\n /**\r\n * Creates a new Toolbox instance attached to a workspace.\r\n * @param workspace The workspace instance to attach this toolbox to\r\n */\r\n constructor(workspace: WorkspaceSvg) {\r\n this.workspace = workspace;\r\n this.wsOptions = this.getOptions();\r\n this.type = this.wsOptions.toolbox?.type == \"flyout\" ? 2 : 1;\r\n this._contents = this.wsOptions.toolbox?.contents ?? [];\r\n\r\n // Pass toolbox reference to flyout\r\n this._flyout = new Flyout(this);\r\n\r\n // Create container element\r\n this.container = document.createElement(\"div\");\r\n this.container.className = \"KabelToolbox\";\r\n this.container.style.position = \"absolute\";\r\n this.container.style.left = \"0\";\r\n this.container.style.top = \"0\";\r\n this.container.style.width = \"20%\";\r\n this.container.style.height = \"100%\";\r\n this.container.style.background = \"rgba(240,240,240,0.9)\";\r\n this.container.style.overflowY = \"auto\";\r\n\r\n // Append to workspace top layer\r\n workspace._wsTop.appendChild(this.container);\r\n\r\n // Initialize toolbox depending on type\r\n if (this.type === 1) this.initCategoryToolbox();\r\n if (this.type === 2) this.initFlyoutToolbox();\r\n }\r\n /**\r\n * Applies a WSTheme to the toolbox and flyout elements.\r\n * @param theme The workspace theme to apply\r\n */\r\n updateStyles(theme: WSTheme) {\r\n if (!theme?.UIStyles) return;\r\n\r\n const { toolboxCategoriesBG, toolboxFlyoutBG } = theme.UIStyles;\r\n\r\n const applyStyles = (el: HTMLElement, styles?: Partial<CSSStyleDeclaration>) => {\r\n if (!styles) return;\r\n\r\n for (const key in styles) {\r\n const k = key as keyof CSSStyleDeclaration;\r\n const v = styles[k];\r\n // Only assign if value exists\r\n if (v !== undefined) {\r\n // cast to any to avoid TS errors\r\n (el.style as any)[k] = v;\r\n }\r\n }\r\n };\r\n\r\n if (this.type === 1) applyStyles(this.container, toolboxCategoriesBG);\r\n if (this._flyout?.container) applyStyles(this._flyout.container, toolboxFlyoutBG);\r\n }\r\n\r\n\r\n /**\r\n * Retrieves the workspace options.\r\n * @returns The workspace's InjectOptions\r\n */\r\n getOptions() {\r\n return this.workspace.options;\r\n }\r\n\r\n /**\r\n * Initializes a category-based toolbox.\r\n * Converts the toolbox contents into Category instances and attaches them.\r\n */\r\n initCategoryToolbox() {\r\n const categories = this._contents as TblxCategoryStruct[];\r\n categories.forEach(cData => {\r\n const category = new Category(this, cData);\r\n this._categories.push(category);\r\n });\r\n\r\n // Hide flyout when workspace is clicked\r\n this.workspace.svg.on(\"click\", () => this._flyout.hide());\r\n }\r\n\r\n /**\r\n * Initializes a flyout toolbox.\r\n * Fills the flyout with the node definitions from the toolbox contents.\r\n */\r\n initFlyoutToolbox() {\r\n this.container.style.display = \"none\";\r\n const nodes = this._contents as TblxNodeStruct[];\r\n this._flyout.fill(nodes);\r\n }\r\n}\r\n\r\nexport default Toolbox;\r\n","import Workspace from \"./workspace\";\r\nimport WorkspaceSvg from \"./workspace-svg\";\r\n\r\n/**\r\n * Holds a reference to the main WorkspaceSvg instance.\r\n * Mimics Blockly's getMainWorkspace API for Kabel.\r\n */\r\nlet mainws: WorkspaceSvg | Workspace | null = null;\r\n\r\n/**\r\n * Returns the current main workspace instance.\r\n * \r\n * @returns The main WorkspaceSvg or null if none is set.\r\n */\r\nfunction getMainWorkspace(): WorkspaceSvg | Workspace | null {\r\n return mainws;\r\n}\r\n\r\n/**\r\n * Sets the main workspace reference.\r\n * Calling this updates the global \"main workspace\" for Kabel.\r\n * \r\n * @param ws - The WorkspaceSvg instance to set as main, or null to clear.\r\n * @returns The workspace that was set.\r\n */\r\nfunction setMainWorkspace(ws: WorkspaceSvg | Workspace | null) {\r\n return (mainws = ws);\r\n}\r\n\r\n/**\r\n * Clears the main workspace reference.\r\n * After calling, getMainWorkspace() will return null.\r\n * \r\n * @returns Always returns null.\r\n */\r\nfunction clearMainWorkspace() {\r\n return (mainws = null);\r\n}\r\n\r\nexport {\r\n getMainWorkspace,\r\n setMainWorkspace,\r\n clearMainWorkspace\r\n};\r\n\r\n/**\r\n * Note:\r\n * This mimics the Blockly.getMainWorkspace API.\r\n * When you inject a new workspace in Kabel, calling setMainWorkspace\r\n * sets the global main workspace reference, so you can easily retrieve it later.\r\n */\r\n","import { Element, G } from '@svgdotjs/svg.js';\r\nimport NodeSvg from '../src/nodesvg';\r\nimport eventer from '../util/eventer';\r\nimport type { EventSetupFn } from '../util/eventer';\r\nimport WorkspaceSvg from '../src/workspace-svg';\r\nimport userState from '../util/user-state';\r\n\r\nconst draggableStore: Record<string, { x: number, y: number }> = {};\r\n\r\nfunction initDraggable(element: Element, args: Record<string, any>): () => void {\r\n let isDragging = false;\r\n let offsetX = 0;\r\n let offsetY = 0;\r\n\r\n // fallback to element itself if no drag handle is given\r\n const dragTarget: Element = args.dragel ?? element;\r\n\r\n // Restore position if previously stored (type 3)\r\n if (args.type === 3 && args.id && draggableStore[args.id]) {\r\n const pos = draggableStore[args.id];\r\n if (pos) element.move(pos.x, pos.y);\r\n }\r\n\r\n function onMouseDown(e: MouseEvent) {\r\n if (args.type === 2 && args.node) {\r\n const ws : WorkspaceSvg = args.node.workspace;\r\n if (!ws) return;\r\n\r\n const start = ws.screenToWorkspace(e.clientX, e.clientY);\r\n const nodePos = args.node.relativeCoords;\r\n\r\n offsetX = start.x - nodePos.x;\r\n offsetY = start.y - nodePos.y;\r\n ws.beginDrag(args.node, start.x, start.y);\r\n (args.group as G).front();\r\n \r\n } else {\r\n const bbox = element.bbox();\r\n offsetX = e.clientX - bbox.x;\r\n offsetY = e.clientY - bbox.y;\r\n }\r\n\r\n isDragging = false;\r\n\r\n // Mark user as dragging\r\n userState.setState('dragging');\r\n\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp);\r\n\r\n if (args.type === 1 && args.ondrag) args.ondrag(e);\r\n }\r\n\r\n\r\n function onMouseMove(e: MouseEvent) {\r\n if (!isDragging) {\r\n const dx = e.movementX || 0;\r\n const dy = e.movementY || 0;\r\n if (Math.abs(dx) > 2 || Math.abs(dy) > 2) isDragging = true;\r\n }\r\n if (!isDragging) return;\r\n\r\n if (args.type === 2 && args.node && args.node instanceof NodeSvg) {\r\n const ws: WorkspaceSvg = args.node.workspace as WorkspaceSvg;\r\n if (!ws) return;\r\n\r\n // Compute new workspace coordinates\r\n const mouseWS = ws.screenToWorkspace(e.clientX, e.clientY);\r\n const newX = mouseWS.x - offsetX;\r\n const newY = mouseWS.y - offsetY;\r\n args.node.relativeCoords.set(newX, newY);\r\n ws.updateDrag(newX, newY);\r\n ws.refresh();\r\n // Move node visually\r\n const screenPos = ws.workspaceToScreen(newX, newY);\r\n element.attr({ transform: `translate(${screenPos.x}, ${screenPos.y}) scale(${ws.getZoom()})` });\r\n \r\n args.node.emit('NODE_DRAG', null);\r\n } else if (args.type === 1 && args.onmove) {\r\n const newX = e.clientX - offsetX;\r\n const newY = e.clientY - offsetY;\r\n element.move(newX, newY);\r\n args.onmove({ x: newX, y: newY });\r\n } else if (args.type === 3 && args.id) {\r\n const newX = e.clientX - offsetX;\r\n const newY = e.clientY - offsetY;\r\n element.move(newX, newY);\r\n draggableStore[args.id] = { x: newX, y: newY };\r\n }\r\n }\r\n\r\n function onMouseUp(e: MouseEvent) {\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n\r\n // Remove dragging state\r\n userState.removeState('dragging');\r\n\r\n if (args.type === 1 && args.enddrag) args.enddrag(e);\r\n if (args.type === 2 && args.node && args.node instanceof NodeSvg) {\r\n const ws: WorkspaceSvg = args.node.workspace as WorkspaceSvg;\r\n if (!ws) return;\r\n ws.emitChange();\r\n ws.endDrag();\r\n }\r\n isDragging = false;\r\n }\r\n\r\n dragTarget.node.addEventListener('mousedown', onMouseDown);\r\n\r\n // cleanup\r\n return () => {\r\n dragTarget.node.removeEventListener('mousedown', onMouseDown);\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n };\r\n}\r\n\r\neventer.registerEvent('k_draggable', initDraggable as EventSetupFn);\r\n","/**\r\n * Delays execution of a callback by a specified number of animation frames.\r\n *\r\n * Uses `requestAnimationFrame` to count frames, then calls the provided callback.\r\n *\r\n * @param {number} frames - The number of animation frames to wait before executing the callback.\r\n * @param {() => void} callback - The function to execute after the specified frames have passed.\r\n */\r\nfunction waitFrames(frames: number, callback: () => void): void {\r\n\tlet count = 0;\r\n\r\n\tfunction step() {\r\n\t\tcount++;\r\n\t\tif (count >= frames) {\r\n\t\t\tcallback();\r\n\t\t} else {\r\n\t\t\trequestAnimationFrame(step);\r\n\t\t}\r\n\t}\r\n\r\n\trequestAnimationFrame(step);\r\n}\r\n\r\nexport default waitFrames;\r\n","import { NodePrototype } from \"./node-types\";\r\n\r\n/**\r\n * A registry of all node prototypes by name.\r\n * Maps a string key (node type name) to a NodePrototype object\r\n */\r\nconst NodePrototypes: { [key: string]: NodePrototype } = {};\r\n\r\nexport default NodePrototypes;\r\n","import { G } from \"@svgdotjs/svg.js\";\r\nimport Field, { AnyField } from \"./field\";\r\nimport NodeSvg from \"./nodesvg\";\r\n\r\n/**\r\n * Allowed owner types for the dropdown container.\r\n * Can be either a NodeSvg or a Field.\r\n */\r\nexport type AllowedOwner = NodeSvg | AnyField;\r\n\r\n/**\r\n * Get absolute position of an HTMLElement relative to the document.\r\n * @param el - The HTML element to measure.\r\n * @returns The bounding box with scroll offset.\r\n */\r\nfunction getAbsolutePosition(el: HTMLElement) {\r\n const rect = el.getBoundingClientRect();\r\n return {\r\n x: rect.left + window.scrollX,\r\n y: rect.top + window.scrollY,\r\n width: rect.width,\r\n height: rect.height,\r\n };\r\n}\r\n\r\n/**\r\n * Options for creating a dropdown menu.\r\n */\r\nexport interface DropdownOptions {\r\n /** List of items to display in the dropdown */\r\n items: { label: string; value: string }[];\r\n /** Callback when an item is selected */\r\n onSelect?: (value: string, item: { label: string; value: string }) => void;\r\n /** Optional fixed width of the dropdown */\r\n width?: number;\r\n}\r\n\r\n/**\r\n * Dropdown container for NodeSvg or Field elements.\r\n * Supports singleton behavior (only one dropdown visible at a time).\r\n */\r\nclass DropdownContainer {\r\n private static current: DropdownContainer | null = null;\r\n private owner: AllowedOwner | null = null;\r\n private rootEl: HTMLDivElement;\r\n private options: DropdownOptions | null = null;\r\n private constraint: { x: number; y: number; width: number; height: number };\r\n private offset: { dx: number; dy: number };\r\n private currentRemoveListener: (() => void) | null = null;\r\n /**\r\n * Creates the dropdown container and attaches it to the DOM.\r\n */\r\n constructor() {\r\n this.rootEl = document.createElement(\"div\");\r\n this.rootEl.className = \"KabelDropdownMenu\";\r\n this.rootEl.style.position = \"absolute\";\r\n this.rootEl.style.display = \"none\";\r\n document.body.appendChild(this.rootEl);\r\n\r\n this.constraint = { x: 0, y: 0, width: 0, height: 0 };\r\n this.offset = { dx: 0, dy: 0 };\r\n }\r\n\r\n /**\r\n * Move the dropdown by an offset.\r\n * @param dx - horizontal offset\r\n * @param dy - vertical offset\r\n */\r\n move(dx: number, dy: number) {\r\n this.offset.dx = dx;\r\n this.offset.dy = dy;\r\n this.updatePosition();\r\n }\r\n\r\n /**\r\n * Update the dropdown position based on constraint and offset.\r\n */\r\n private updatePosition() {\r\n const { x, y, height } = this.constraint;\r\n const { dx, dy } = this.offset;\r\n this.rootEl.style.left = `${x + dx}px`;\r\n this.rootEl.style.top = `${y + height + dy}px`; // anchored below\r\n }\r\n\r\n /**\r\n * Set inner HTML content of the dropdown.\r\n * @param html - HTML string\r\n */\r\n setContent(html: string) {\r\n this.rootEl.innerHTML = html;\r\n }\r\n\r\n /**\r\n * Append an element as a child to the dropdown.\r\n * @param element - Element to append\r\n * @returns The appended element\r\n */\r\n appendChild(element: Element) {\r\n this.rootEl.appendChild(element);\r\n return element;\r\n }\r\n\r\n /**\r\n * Show the dropdown for a given owner.\r\n * @param owner - NodeSvg or Field that owns this dropdown\r\n * @param options - Dropdown configuration options\r\n */\r\n show(owner: AllowedOwner, options: DropdownOptions) {\r\n if (!owner.svgGroup) return;\r\n this.hide(); // close existing dropdown first\r\n this.owner = owner;\r\n if (options) this.options = options;\r\n if (this.currentRemoveListener) this.currentRemoveListener();\r\n this.currentRemoveListener = null;\r\n const groupRect = owner.svgGroup.node.getBoundingClientRect();\r\n this.constraint = {\r\n x: groupRect.left + window.scrollX,\r\n y: groupRect.top + window.scrollY,\r\n width: groupRect.width,\r\n height: groupRect.height,\r\n };\r\n\r\n this.offset = { dx: 0, dy: 0 };\r\n\r\n this.rootEl.innerHTML = \"\";\r\n if (options.width) this.rootEl.style.width = `${options.width}px`;\r\n this.rootEl.style.display = \"block\";\r\n\r\n // Render items\r\n if (options.items) {\r\n options.items.forEach((item) => {\r\n const el = document.createElement(\"div\");\r\n el.className = \"KabelDropdownItem\";\r\n el.textContent = item.label;\r\n el.onclick = () => {\r\n options.onSelect?.(item.value, item);\r\n this.hide();\r\n };\r\n this.rootEl.appendChild(el);\r\n });\r\n }\r\n if (owner instanceof NodeSvg) {\r\n // Add a move listener to the node's workspace.\r\n const ws = owner.workspace;\r\n let remove = ws?.addMoveListener(() => {\r\n if (this.owner !== owner) {\r\n remove!(); // disconnect when owner changes.\r\n return;\r\n }\r\n this.hideIfOwner(owner)\r\n });\r\n this.currentRemoveListener = remove as () => void;\r\n }\r\n if (owner instanceof Field) {\r\n // Add a move listener to the field's workspace.\r\n const ws = owner.node!.workspace;\r\n let remove = ws?.addMoveListener(() => {\r\n if (this.owner !== owner) {\r\n console.log(\"Disconnecting..\");\r\n remove!(); // disconnect when owner changes.\r\n return;\r\n }\r\n console.log(\"Hiding..\");\r\n this.hide();\r\n });\r\n this.currentRemoveListener = remove as () => void;\r\n }\r\n this.updatePosition();\r\n DropdownContainer.current = this;\r\n }\r\n\r\n /**\r\n * Hide this dropdown.\r\n */\r\n hide() {\r\n if (DropdownContainer.current !== this) return;\r\n this.rootEl.style.display = \"none\";\r\n this.rootEl.innerHTML = \"\";\r\n this.owner = null;\r\n this.options = null;\r\n DropdownContainer.current = null;\r\n if (this.currentRemoveListener) this.currentRemoveListener();\r\n this.currentRemoveListener = null;\r\n }\r\n\r\n /**\r\n * Hide this dropdown if the given owner currently owns it.\r\n * @param owner - The owner to check\r\n */\r\n hideIfOwner(owner: AllowedOwner) {\r\n if (this.owner === owner) {\r\n this.hide();\r\n }\r\n }\r\n\r\n /** @returns True if the dropdown is currently visible */\r\n isVisible(): boolean {\r\n return DropdownContainer.current === this;\r\n }\r\n\r\n /** @returns The current owner of the dropdown, or null if none */\r\n getOwner(): AllowedOwner | null {\r\n return this.owner;\r\n }\r\n\r\n /** @returns The currently visible dropdown container singleton */\r\n static getCurrent(): DropdownContainer | null {\r\n return DropdownContainer.current;\r\n }\r\n}\r\n\r\n// Singleton export\r\nconst dropdownContainer = new DropdownContainer();\r\nexport default dropdownContainer;\r\nexport { DropdownContainer };\r\n","import { WidgetOptions } from \"./widget\";\r\n\r\n/**\r\n * A list of prototypes for widgets.\r\n */\r\nexport interface WidgetPrototypeList {\r\n [key: string]: WidgetOptions\r\n}\r\n\r\nconst WidgetPrototypes: WidgetPrototypeList = {};\r\nexport default WidgetPrototypes;","import { Element } from '@svgdotjs/svg.js';\r\nimport NodeSvg from '../src/nodesvg';\r\nimport eventer from '../util/eventer';\r\nimport type { EventSetupFn } from '../util/eventer';\r\nimport WorkspaceSvg from '../src/workspace-svg';\r\nimport userState from '../util/user-state';\r\nimport CommentModel from '../src/comment';\r\n\r\n/** The drag handle for comments */\r\nfunction initDraggable(element: Element, args: Record<string, any>): () => void {\r\n const comment = args.comment as CommentModel;\r\n if (!comment) return () => { };\r\n\r\n let startX = 0;\r\n let startY = 0;\r\n let startRelX = 0;\r\n let startRelY = 0;\r\n\r\n function onPointerDown(ev: PointerEvent) {\r\n ev.preventDefault();\r\n\r\n const ws = comment.getWorkspace();\r\n const rel = comment.relativeCoords;\r\n\r\n // Capture offset from pointer to comment in workspace coords\r\n const pointerWS = ws.screenToWorkspace(ev.clientX, ev.clientY);\r\n startRelX = rel.x - pointerWS.x;\r\n startRelY = rel.y - pointerWS.y;\r\n\r\n document.addEventListener('pointermove', onPointerMove);\r\n document.addEventListener('pointerup', onPointerUp);\r\n }\r\n\r\n function onPointerMove(ev: PointerEvent) {\r\n const ws = comment.getWorkspace();\r\n\r\n // Map pointer to workspace\r\n const pointerWS = ws.screenToWorkspace(ev.clientX, ev.clientY);\r\n\r\n // Add initial offset\r\n comment.relativeCoords.set(pointerWS.x + startRelX, pointerWS.y + startRelY);\r\n\r\n ws.refreshComments();\r\n }\r\n\r\n\r\n\r\n function onPointerUp() {\r\n document.removeEventListener('pointermove', onPointerMove);\r\n document.removeEventListener('pointerup', onPointerUp);\r\n }\r\n\r\n element.node.addEventListener('pointerdown', onPointerDown);\r\n\r\n // Cleanup function\r\n return () => {\r\n element.node.removeEventListener('pointerdown', onPointerDown);\r\n };\r\n}\r\n\r\neventer.registerEvent('k_draghandle', initDraggable as EventSetupFn);\r\n","import { Svg, Rect, Circle, G, Path, Element } from '@svgdotjs/svg.js';\r\n\r\nexport type EventType = string;\r\nexport type EventArgs = Record<string, any>;\r\nexport type EventSetupFn = (el: Element, args?: EventArgs) => (() => void) | void;\r\n\r\nexport interface RegisteredEl {\r\n tags: string[],\r\n el: Element;\r\n type: EventType;\r\n args?: EventArgs | undefined; // allow undefined explicitly\r\n destroyFn?: (() => void) | undefined; // allow undefined explicitly\r\n}\r\n\r\n/**\r\n * Used by the Kabel renderer to tag svg.js elements as interactable with the kabel system.\r\n */\r\nclass Eventer {\r\n private elements: RegisteredEl[] = [];\r\n private eventRegistry: Map<EventType, EventSetupFn> = new Map();\r\n\r\n // Register an event type with a setup function\r\n registerEvent(type: EventType, setupFn: EventSetupFn) {\r\n this.eventRegistry.set(type, setupFn);\r\n return this; // allow chaining\r\n }\r\n tagElement(el: Element, tags?: string[] | string) {\r\n if (!tags) return this;\r\n const tagList = Array.isArray(tags) ? tags : [tags];\r\n\r\n // Find the registered elements for this el\r\n for (const reg of this.elements) {\r\n if (reg.el === el) {\r\n for (const t of tagList) {\r\n if (!reg.tags.includes(t)) reg.tags.push(t);\r\n }\r\n }\r\n }\r\n return this;\r\n }\r\n\r\n destroyByTag(tag: string) {\r\n let destroyed = false;\r\n this.elements = this.elements.filter(reg => {\r\n if (reg.tags.includes(tag)) {\r\n if (reg.destroyFn) {\r\n reg.destroyFn();\r\n destroyed = true;\r\n }\r\n return false; // remove this element\r\n }\r\n return true; // keep element\r\n });\r\n return destroyed ? 1 : 0;\r\n }\r\n\r\n // addElement\r\n addElement(el: Element, types: EventType | EventType[], args?: EventArgs) {\r\n const typeList = Array.isArray(types) ? types : [types];\r\n for (const type of typeList) {\r\n const destroyFn = this.setupElement(el, type, args) as (() => void) | undefined;\r\n this.elements.push({\r\n tags: [],\r\n el,\r\n type,\r\n args,\r\n destroyFn\r\n });\r\n }\r\n return this;\r\n }\r\n\r\n // refresh\r\n refresh() {\r\n for (const reg of this.elements) {\r\n if (reg.destroyFn) reg.destroyFn();\r\n reg.destroyFn = this.setupElement(reg.el, reg.type, reg.args) as (() => void) | undefined;\r\n }\r\n }\r\n\r\n\r\n // Destroy event(s) for an element\r\n destroyElement(el: Element, type?: EventType) {\r\n let destroyed = false;\r\n for (const reg of this.elements) {\r\n if (reg.el === el && (!type || reg.type === type)) {\r\n if (reg.destroyFn) {\r\n reg.destroyFn();\r\n destroyed = true;\r\n }\r\n // Remove from elements array\r\n this.elements = this.elements.filter(r => r !== reg);\r\n }\r\n }\r\n return destroyed ? 1 : 0;\r\n }\r\n\r\n private setupElement(el: Element, type: EventType, args?: EventArgs): (() => void) | undefined {\r\n const setupFn = this.eventRegistry.get(type);\r\n if (!setupFn) return;\r\n const destroyFn = setupFn(el, args);\r\n return destroyFn instanceof Function ? destroyFn : undefined;\r\n }\r\n}\r\n\r\nconst eventer = new Eventer();\r\nexport default eventer;\r\nexport { Eventer };\r\n","// Convert an arc to a sequence of cubic bézier curves\n//\n'use strict';\n\n\nvar TAU = Math.PI * 2;\n\n\n/* eslint-disable space-infix-ops */\n\n// Calculate an angle between two unit vectors\n//\n// Since we measure angle between radii of circular arcs,\n// we can use simplified math (without length normalization)\n//\nfunction unit_vector_angle(ux, uy, vx, vy) {\n var sign = (ux * vy - uy * vx < 0) ? -1 : 1;\n var dot = ux * vx + uy * vy;\n\n // Add this to work with arbitrary vectors:\n // dot /= Math.sqrt(ux * ux + uy * uy) * Math.sqrt(vx * vx + vy * vy);\n\n // rounding errors, e.g. -1.0000000000000002 can screw up this\n if (dot > 1.0) { dot = 1.0; }\n if (dot < -1.0) { dot = -1.0; }\n\n return sign * Math.acos(dot);\n}\n\n\n// Convert from endpoint to center parameterization,\n// see http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n//\n// Return [cx, cy, theta1, delta_theta]\n//\nfunction get_arc_center(x1, y1, x2, y2, fa, fs, rx, ry, sin_phi, cos_phi) {\n // Step 1.\n //\n // Moving an ellipse so origin will be the middlepoint between our two\n // points. After that, rotate it to line up ellipse axes with coordinate\n // axes.\n //\n var x1p = cos_phi*(x1-x2)/2 + sin_phi*(y1-y2)/2;\n var y1p = -sin_phi*(x1-x2)/2 + cos_phi*(y1-y2)/2;\n\n var rx_sq = rx * rx;\n var ry_sq = ry * ry;\n var x1p_sq = x1p * x1p;\n var y1p_sq = y1p * y1p;\n\n // Step 2.\n //\n // Compute coordinates of the centre of this ellipse (cx', cy')\n // in the new coordinate system.\n //\n var radicant = (rx_sq * ry_sq) - (rx_sq * y1p_sq) - (ry_sq * x1p_sq);\n\n if (radicant < 0) {\n // due to rounding errors it might be e.g. -1.3877787807814457e-17\n radicant = 0;\n }\n\n radicant /= (rx_sq * y1p_sq) + (ry_sq * x1p_sq);\n radicant = Math.sqrt(radicant) * (fa === fs ? -1 : 1);\n\n var cxp = radicant * rx/ry * y1p;\n var cyp = radicant * -ry/rx * x1p;\n\n // Step 3.\n //\n // Transform back to get centre coordinates (cx, cy) in the original\n // coordinate system.\n //\n var cx = cos_phi*cxp - sin_phi*cyp + (x1+x2)/2;\n var cy = sin_phi*cxp + cos_phi*cyp + (y1+y2)/2;\n\n // Step 4.\n //\n // Compute angles (theta1, delta_theta).\n //\n var v1x = (x1p - cxp) / rx;\n var v1y = (y1p - cyp) / ry;\n var v2x = (-x1p - cxp) / rx;\n var v2y = (-y1p - cyp) / ry;\n\n var theta1 = unit_vector_angle(1, 0, v1x, v1y);\n var delta_theta = unit_vector_angle(v1x, v1y, v2x, v2y);\n\n if (fs === 0 && delta_theta > 0) {\n delta_theta -= TAU;\n }\n if (fs === 1 && delta_theta < 0) {\n delta_theta += TAU;\n }\n\n return [ cx, cy, theta1, delta_theta ];\n}\n\n//\n// Approximate one unit arc segment with bézier curves,\n// see http://math.stackexchange.com/questions/873224\n//\nfunction approximate_unit_arc(theta1, delta_theta) {\n var alpha = 4/3 * Math.tan(delta_theta/4);\n\n var x1 = Math.cos(theta1);\n var y1 = Math.sin(theta1);\n var x2 = Math.cos(theta1 + delta_theta);\n var y2 = Math.sin(theta1 + delta_theta);\n\n return [ x1, y1, x1 - y1*alpha, y1 + x1*alpha, x2 + y2*alpha, y2 - x2*alpha, x2, y2 ];\n}\n\nmodule.exports = function a2c(x1, y1, x2, y2, fa, fs, rx, ry, phi) {\n var sin_phi = Math.sin(phi * TAU / 360);\n var cos_phi = Math.cos(phi * TAU / 360);\n\n // Make sure radii are valid\n //\n var x1p = cos_phi*(x1-x2)/2 + sin_phi*(y1-y2)/2;\n var y1p = -sin_phi*(x1-x2)/2 + cos_phi*(y1-y2)/2;\n\n if (x1p === 0 && y1p === 0) {\n // we're asked to draw line to itself\n return [];\n }\n\n if (rx === 0 || ry === 0) {\n // one of the radii is zero\n return [];\n }\n\n\n // Compensate out-of-range radii\n //\n rx = Math.abs(rx);\n ry = Math.abs(ry);\n\n var lambda = (x1p * x1p) / (rx * rx) + (y1p * y1p) / (ry * ry);\n if (lambda > 1) {\n rx *= Math.sqrt(lambda);\n ry *= Math.sqrt(lambda);\n }\n\n\n // Get center parameters (cx, cy, theta1, delta_theta)\n //\n var cc = get_arc_center(x1, y1, x2, y2, fa, fs, rx, ry, sin_phi, cos_phi);\n\n var result = [];\n var theta1 = cc[2];\n var delta_theta = cc[3];\n\n // Split an arc to multiple segments, so each segment\n // will be less than τ/4 (= 90°)\n //\n var segments = Math.max(Math.ceil(Math.abs(delta_theta) / (TAU / 4)), 1);\n delta_theta /= segments;\n\n for (var i = 0; i < segments; i++) {\n result.push(approximate_unit_arc(theta1, delta_theta));\n theta1 += delta_theta;\n }\n\n // We have a bezier approximation of a unit circle,\n // now need to transform back to the original ellipse\n //\n return result.map(function (curve) {\n for (var i = 0; i < curve.length; i += 2) {\n var x = curve[i + 0];\n var y = curve[i + 1];\n\n // scale\n x *= rx;\n y *= ry;\n\n // rotate\n var xp = cos_phi*x - sin_phi*y;\n var yp = sin_phi*x + cos_phi*y;\n\n // translate\n curve[i + 0] = xp + cc[0];\n curve[i + 1] = yp + cc[1];\n }\n\n return curve;\n });\n};\n","'use strict';\n\nmodule.exports = require('./lib/svgpath');\n","/**\r\n * Kabel Core Export Module\r\n * ------------------------\r\n * Aggregates all core Kabel modules, types, utilities, and components,\r\n * and exports them under a single namespace.\r\n */\r\n\r\nimport RendererConstants from \"../renderers/constants\";\r\nimport Renderer, { DrawState, ConnectorToFrom } from \"../renderers/renderer\";\r\nimport CategoryColors from \"./colors\";\r\nimport Connection, { Connectable } from \"./connection\";\r\nimport Coordinates from \"./coordinates\";\r\nimport Field, { \r\n FieldOptions, FieldVisualInfo, AnyFieldCls, AnyField, DummyField, \r\n FieldMap, NumberField, OptConnectField, TextField, ConnectableField, \r\n FieldRawBoxData, FieldConnectionData \r\n} from \"./field\";\r\nimport inject, { \r\n InjectMsg, InjectOptions, TblxCategoryStruct, TblxObjStruct, \r\n TblxFieldStruct, TblxNodeStruct, GridOptions\r\n} from \"./inject\";\r\nimport { clearMainWorkspace, getMainWorkspace, setMainWorkspace } from \"./main-workspace\";\r\nimport NodeSvg, { NodeJson, NodeEvents, InputFieldJson, SerializedNode } from \"./nodesvg\";\r\nimport NodePrototypes from \"./prototypes\";\r\nimport WorkspaceSvg from \"./workspace-svg\";\r\nimport WorkspaceCoords from \"./workspace-coords\";\r\nimport { NodePrototype } from \"./node-types\";\r\nimport { Color, ColorStyle, Hex, RGBObject, RGBString, RGBTuple } from \"./visual-types\";\r\nimport { parseColor } from \"../util/parse-color\";\r\nimport eventer, { Eventer, EventSetupFn, EventArgs, RegisteredEl } from \"../util/eventer\";\r\nimport hasProp from \"../util/has-prop\";\r\nimport EventEmitter from \"../util/emitter\";\r\nimport * as Path from \"../util/path\";\r\nimport * as SVG from \"@svgdotjs/svg.js\";\r\nimport * as UID from \"../util/uid\";\r\n\r\nimport K from \"./core\";\r\nimport Widget, { WidgetOptions } from \"./widget\";\r\nimport { WidgetPrototypeList } from \"./widget-prototypes\";\r\nimport Showable, { KabelInterface, KabelCommentRendering, KabelNodeRendering, KabelUIX, KabelUtils } from \"./types\";\r\n\r\n//@ts-ignore\r\nconst Kabel: KabelInterface = K;\r\nexport default Kabel;\r\n\r\n// Core types and utilities\r\nexport {\r\n KabelInterface,\r\n TblxCategoryStruct,\r\n TblxNodeStruct,\r\n TblxFieldStruct,\r\n TblxObjStruct,\r\n RendererConstants,\r\n Renderer,\r\n CategoryColors,\r\n Connection,\r\n Coordinates,\r\n Field,\r\n DummyField,\r\n FieldMap,\r\n NumberField,\r\n OptConnectField,\r\n TextField,\r\n FieldOptions,\r\n FieldVisualInfo,\r\n AnyFieldCls,\r\n AnyField,\r\n ConnectableField,\r\n FieldRawBoxData,\r\n FieldConnectionData,\r\n inject,\r\n InjectMsg,\r\n InjectOptions,\r\n clearMainWorkspace,\r\n getMainWorkspace,\r\n setMainWorkspace,\r\n NodeSvg,\r\n NodePrototypes,\r\n WorkspaceSvg,\r\n WorkspaceCoords,\r\n NodePrototype,\r\n Color, ColorStyle, Hex, RGBObject, RGBString, RGBTuple,\r\n NodeJson, NodeEvents, InputFieldJson,\r\n SerializedNode,\r\n Eventer,\r\n EventSetupFn,\r\n EventArgs,\r\n Connectable,\r\n DrawState,\r\n ConnectorToFrom,\r\n WidgetOptions,\r\n WidgetPrototypeList,\r\n KabelCommentRendering,\r\n KabelNodeRendering,\r\n KabelUIX,\r\n KabelUtils,\r\n Showable,\r\n RegisteredEl,\r\n GridOptions\r\n};\r\n\r\n// Core classes used by public API\r\nexport { default as CommentModel } from './comment';\r\n\r\nexport { default as Toolbox } from './toolbox';\r\nexport { default as ContextMenuHTML } from './context-menu';\r\nexport { default as Widget } from './widget';\r\nexport { DropdownContainer } from './dropdown-menu';\r\nexport { RepresenterNode } from '../renderers/representer-node';\r\nexport { default as CommentRenderer } from '../comment-renderer/renderer';\r\nexport { default as Representer } from '../renderers/representer';\r\n\r\n// Controllers\r\nexport { default as WorkspaceController } from '../controllers/base';\r\nexport { default as WASDController } from '../controllers/wasd';\r\n","/**\r\n * Represents a 2D coordinate in space.\r\n */\r\nclass Coordinates {\r\n\t/** X position */\r\n\tx: number;\r\n\t/** Y position */\r\n\ty: number;\r\n\r\n\t/**\r\n\t * Creates a new Coordinates instance\r\n\t * @param x - The x value (default 0)\r\n\t * @param y - The y value (default 0)\r\n\t */\r\n\tconstructor(x: number = 0, y: number = 0) {\r\n\t\tthis.x = x;\r\n\t\tthis.y = y;\r\n\t}\r\n\r\n\t/**\r\n\t * Set the coordinates to new values\r\n\t * @param x - The new x value\r\n\t * @param y - The new y value\r\n\t */\r\n\tset(x: number, y: number) {\r\n\t\tthis.x = x;\r\n\t\tthis.y = y;\r\n\t}\r\n\r\n\t/**\r\n\t * Returns a copy of this coordinate\r\n\t * @returns A new Coordinates instance with the same x and y\r\n\t */\r\n\tclone(): Coordinates {\r\n\t\treturn new Coordinates(this.x, this.y);\r\n\t}\r\n\r\n\t/**\r\n\t * Calculate the Euclidean distance to another coordinate\r\n\t * @param other - The target coordinate\r\n\t * @returns The distance as a number\r\n\t */\r\n\tdistanceTo(other: Coordinates): number {\r\n\t\tconst dx = this.x - other.x;\r\n\t\tconst dy = this.y - other.y;\r\n\t\treturn Math.sqrt(dx * dx + dy * dy);\r\n\t}\r\n\r\n\t/**\r\n\t * Convert the coordinate to a string representation\r\n\t * @returns A string like \"(x, y)\"\r\n\t */\r\n\ttoString(): string {\r\n\t\treturn `(${this.x}, ${this.y})`;\r\n\t}\r\n\r\n\t/**\r\n\t * Convert the coordinate to an array [x, y]\r\n\t * @returns Tuple of numbers [x, y]\r\n\t */\r\n\ttoArray(): [number, number] {\r\n\t\treturn [this.x, this.y];\r\n\t}\r\n\r\n\t/**\r\n\t * Convert the coordinate to an object { x, y }\r\n\t * @returns Object with x and y properties\r\n\t */\r\n\ttoObject(): { x: number; y: number } {\r\n\t\treturn { x: this.x, y: this.y };\r\n\t}\r\n}\r\n\r\nexport default Coordinates;\r\n","import { Color, Hex } from \"../src/visual-types\";\r\n\r\nclass RendererConstants {\r\n CORNER_RADIUS!: number;\r\n NODE_BASE_WIDTH!: number;\r\n NODE_BASE_HEIGHT!: number;\r\n TOPBAR_HEIGHT!: number;\r\n FOOTER_HEIGHT!: number;\r\n PADDING_BIG!: number;\r\n PADDING_MEDIUM!: number;\r\n PADDING_SMALL!: number;\r\n FIELD_SPACEY!: number;\r\n FIELD_SPACEX!: number;\r\n FIELD_RAW_BASE_WIDTH!: number;\r\n FIELD_RAW_BASE_HEIGHT!: number;\r\n INPUT_BOX_PADDING!: number;\r\n INPUT_BOX_TEXT_ANCHOR!: 'start' | 'middle';\r\n LABEL_SPACING!: number;\r\n\r\n FIELD_RAW_COLOR: Color = '#2b2d36ff';\r\n FIELD_RAW_TEXT_COLOR: Color = '#e0e2e8ff';\r\n FIELD_RAW_OUTLINE_COLOR: Color = '#1f2027ff';\r\n FIELD_RAW_OUTLINE_STROKE!: number;\r\n FIELD_CONN_COLOR: Color = '#0c7cccff'\r\n NODE_BG_COLOR: Color = '#2c2d3aff';\r\n NODE_OUTLINE_COLOR: Color = '#1d1e25ff';\r\n CONNECTOR_TRIANGLE!: boolean;\r\n CONNECTION_STROKE_WIDTH!: number;\r\n CONNECTION_STROKE_COLOR_CHOICE!: number;\r\n CONNECTOR_TRI_SIZE!: number;\r\n CONNECTOR_RADIUS!: number;\r\n FONT_FAMILY: string =\r\n '\"Inter\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif';\r\n FONT_SIZE!: number;\r\n FONT_COLOR: Color = '#e0e2e8ff';\r\n\r\n FIELD_MARGIN_X!: number;\r\n FIELD_MARGIN_Y!: number;\r\n TOPBAR_LABEL_MARGIN_X!: number;\r\n TOPBAR_LABEL_MARGIN_Y!: number;\r\n TOPBAR_LABEL_BOLDED!: boolean;\r\n CONNECTOR_LINE_WIDTH: number = 6;\r\n CONNECTOR_LINE_CURVED: boolean = true;\r\n ZOOM_BASE: number = 1; // default scale factor for workspace\r\n\r\n SHAPES: {\r\n [key: string]: {\r\n PathMain: string;\r\n Width: number;\r\n Height: number;\r\n }\r\n } = {}\r\n constructor(overrides: Partial<RendererConstants> = {}) {\r\n this.CONNECTOR_TRI_SIZE = 8;\r\n this.CONNECTOR_RADIUS = 10;\r\n this.CORNER_RADIUS = 6;\r\n this.NODE_BASE_WIDTH = 200;\r\n this.NODE_BASE_HEIGHT = 240;\r\n\r\n this.TOPBAR_HEIGHT = 50;\r\n this.FOOTER_HEIGHT = 25;\r\n this.PADDING_BIG = 16;\r\n this.PADDING_MEDIUM = 8;\r\n this.PADDING_SMALL = 4;\r\n this.FIELD_RAW_BASE_WIDTH = 80;\r\n this.FIELD_RAW_BASE_HEIGHT = 42;\r\n this.INPUT_BOX_PADDING = 6;\r\n this.LABEL_SPACING = 5;\r\n this.INPUT_BOX_TEXT_ANCHOR = 'middle';\r\n this.CONNECTOR_TRIANGLE = false;\r\n this.CONNECTION_STROKE_WIDTH = 2;\r\n this.CONNECTION_STROKE_COLOR_CHOICE = 1;\r\n this.FIELD_RAW_OUTLINE_STROKE = 2;\r\n this.FIELD_SPACEY = 20;\r\n this.FIELD_SPACEX = 20;\r\n this.FONT_SIZE = 20;\r\n this.TOPBAR_LABEL_BOLDED = true;\r\n this.FIELD_MARGIN_X = 16;\r\n this.FIELD_MARGIN_Y = 16;\r\n this.TOPBAR_LABEL_MARGIN_X = 12;\r\n this.TOPBAR_LABEL_MARGIN_Y = 0;\r\n\r\n Object.assign(this, overrides);\r\n }\r\n}\r\n\r\nexport default RendererConstants;\r\n","// SVG Path transformations library\n//\n// Usage:\n//\n// SvgPath('...')\n// .translate(-150, -100)\n// .scale(0.5)\n// .translate(-150, -100)\n// .toFixed(1)\n// .toString()\n//\n\n'use strict';\n\n\nvar pathParse = require('./path_parse');\nvar transformParse = require('./transform_parse');\nvar matrix = require('./matrix');\nvar a2c = require('./a2c');\nvar ellipse = require('./ellipse');\n\n\n// Class constructor\n//\nfunction SvgPath(path) {\n if (!(this instanceof SvgPath)) { return new SvgPath(path); }\n\n var pstate = pathParse(path);\n\n // Array of path segments.\n // Each segment is array [command, param1, param2, ...]\n this.segments = pstate.segments;\n\n // Error message on parse error.\n this.err = pstate.err;\n\n // Transforms stack for lazy evaluation\n this.__stack = [];\n}\n\nSvgPath.from = function (src) {\n if (typeof src === 'string') return new SvgPath(src);\n\n if (src instanceof SvgPath) {\n // Create empty object\n var s = new SvgPath('');\n\n // Clone properies\n s.err = src.err;\n s.segments = src.segments.map(function (sgm) { return sgm.slice(); });\n s.__stack = src.__stack.map(function (m) {\n return matrix().matrix(m.toArray());\n });\n\n return s;\n }\n\n throw new Error('SvgPath.from: invalid param type ' + src);\n};\n\n\nSvgPath.prototype.__matrix = function (m) {\n var self = this, i;\n\n // Quick leave for empty matrix\n if (!m.queue.length) { return; }\n\n this.iterate(function (s, index, x, y) {\n var p, result, name, isRelative;\n\n switch (s[0]) {\n\n // Process 'assymetric' commands separately\n case 'v':\n p = m.calc(0, s[1], true);\n result = (p[0] === 0) ? [ 'v', p[1] ] : [ 'l', p[0], p[1] ];\n break;\n\n case 'V':\n p = m.calc(x, s[1], false);\n result = (p[0] === m.calc(x, y, false)[0]) ? [ 'V', p[1] ] : [ 'L', p[0], p[1] ];\n break;\n\n case 'h':\n p = m.calc(s[1], 0, true);\n result = (p[1] === 0) ? [ 'h', p[0] ] : [ 'l', p[0], p[1] ];\n break;\n\n case 'H':\n p = m.calc(s[1], y, false);\n result = (p[1] === m.calc(x, y, false)[1]) ? [ 'H', p[0] ] : [ 'L', p[0], p[1] ];\n break;\n\n case 'a':\n case 'A':\n // ARC is: ['A', rx, ry, x-axis-rotation, large-arc-flag, sweep-flag, x, y]\n\n // Drop segment if arc is empty (end point === start point)\n /*if ((s[0] === 'A' && s[6] === x && s[7] === y) ||\n (s[0] === 'a' && s[6] === 0 && s[7] === 0)) {\n return [];\n }*/\n\n // Transform rx, ry and the x-axis-rotation\n var ma = m.toArray();\n var e = ellipse(s[1], s[2], s[3]).transform(ma);\n\n // flip sweep-flag if matrix is not orientation-preserving\n if (ma[0] * ma[3] - ma[1] * ma[2] < 0) {\n s[5] = s[5] ? '0' : '1';\n }\n\n // Transform end point as usual (without translation for relative notation)\n p = m.calc(s[6], s[7], s[0] === 'a');\n\n // Empty arcs can be ignored by renderer, but should not be dropped\n // to avoid collisions with `S A S` and so on. Replace with empty line.\n if ((s[0] === 'A' && s[6] === x && s[7] === y) ||\n (s[0] === 'a' && s[6] === 0 && s[7] === 0)) {\n result = [ s[0] === 'a' ? 'l' : 'L', p[0], p[1] ];\n break;\n }\n\n // if the resulting ellipse is (almost) a segment ...\n if (e.isDegenerate()) {\n // replace the arc by a line\n result = [ s[0] === 'a' ? 'l' : 'L', p[0], p[1] ];\n } else {\n // if it is a real ellipse\n // s[0], s[4] and s[5] are not modified\n result = [ s[0], e.rx, e.ry, e.ax, s[4], s[5], p[0], p[1] ];\n }\n\n break;\n\n case 'm':\n // Edge case. The very first `m` should be processed as absolute, if happens.\n // Make sense for coord shift transforms.\n isRelative = index > 0;\n\n p = m.calc(s[1], s[2], isRelative);\n result = [ 'm', p[0], p[1] ];\n break;\n\n default:\n name = s[0];\n result = [ name ];\n isRelative = (name.toLowerCase() === name);\n\n // Apply transformations to the segment\n for (i = 1; i < s.length; i += 2) {\n p = m.calc(s[i], s[i + 1], isRelative);\n result.push(p[0], p[1]);\n }\n }\n\n self.segments[index] = result;\n }, true);\n};\n\n\n// Apply stacked commands\n//\nSvgPath.prototype.__evaluateStack = function () {\n var m, i;\n\n if (!this.__stack.length) { return; }\n\n if (this.__stack.length === 1) {\n this.__matrix(this.__stack[0]);\n this.__stack = [];\n return;\n }\n\n m = matrix();\n i = this.__stack.length;\n\n while (--i >= 0) {\n m.matrix(this.__stack[i].toArray());\n }\n\n this.__matrix(m);\n this.__stack = [];\n};\n\n\n// Convert processed SVG Path back to string\n//\nSvgPath.prototype.toString = function () {\n var result = '', prevCmd = '', cmdSkipped = false;\n\n this.__evaluateStack();\n\n for (var i = 0, len = this.segments.length; i < len; i++) {\n var segment = this.segments[i];\n var cmd = segment[0];\n\n // Command not repeating => store\n if (cmd !== prevCmd || cmd === 'm' || cmd === 'M') {\n // workaround for FontForge SVG importing bug, keep space between \"z m\".\n if (cmd === 'm' && prevCmd === 'z') result += ' ';\n result += cmd;\n\n cmdSkipped = false;\n } else {\n cmdSkipped = true;\n }\n\n // Store segment params\n for (var pos = 1; pos < segment.length; pos++) {\n var val = segment[pos];\n // Space can be skipped\n // 1. After command (always)\n // 2. For negative value (with '-' at start)\n if (pos === 1) {\n if (cmdSkipped && val >= 0) result += ' ';\n } else if (val >= 0) result += ' ';\n\n result += val;\n }\n\n prevCmd = cmd;\n }\n\n return result;\n};\n\n\n// Translate path to (x [, y])\n//\nSvgPath.prototype.translate = function (x, y) {\n this.__stack.push(matrix().translate(x, y || 0));\n return this;\n};\n\n\n// Scale path to (sx [, sy])\n// sy = sx if not defined\n//\nSvgPath.prototype.scale = function (sx, sy) {\n this.__stack.push(matrix().scale(sx, (!sy && (sy !== 0)) ? sx : sy));\n return this;\n};\n\n\n// Rotate path around point (sx [, sy])\n// sy = sx if not defined\n//\nSvgPath.prototype.rotate = function (angle, rx, ry) {\n this.__stack.push(matrix().rotate(angle, rx || 0, ry || 0));\n return this;\n};\n\n\n// Skew path along the X axis by `degrees` angle\n//\nSvgPath.prototype.skewX = function (degrees) {\n this.__stack.push(matrix().skewX(degrees));\n return this;\n};\n\n\n// Skew path along the Y axis by `degrees` angle\n//\nSvgPath.prototype.skewY = function (degrees) {\n this.__stack.push(matrix().skewY(degrees));\n return this;\n};\n\n\n// Apply matrix transform (array of 6 elements)\n//\nSvgPath.prototype.matrix = function (m) {\n this.__stack.push(matrix().matrix(m));\n return this;\n};\n\n\n// Transform path according to \"transform\" attr of SVG spec\n//\nSvgPath.prototype.transform = function (transformString) {\n if (!transformString.trim()) {\n return this;\n }\n this.__stack.push(transformParse(transformString));\n return this;\n};\n\n\n// Round coords with given decimal precition.\n// 0 by default (to integers)\n//\nSvgPath.prototype.round = function (d) {\n var contourStartDeltaX = 0, contourStartDeltaY = 0, deltaX = 0, deltaY = 0, l;\n\n d = d || 0;\n\n this.__evaluateStack();\n\n this.segments.forEach(function (s) {\n var isRelative = (s[0].toLowerCase() === s[0]);\n\n switch (s[0]) {\n case 'H':\n case 'h':\n if (isRelative) { s[1] += deltaX; }\n deltaX = s[1] - s[1].toFixed(d);\n s[1] = +s[1].toFixed(d);\n return;\n\n case 'V':\n case 'v':\n if (isRelative) { s[1] += deltaY; }\n deltaY = s[1] - s[1].toFixed(d);\n s[1] = +s[1].toFixed(d);\n return;\n\n case 'Z':\n case 'z':\n deltaX = contourStartDeltaX;\n deltaY = contourStartDeltaY;\n return;\n\n case 'M':\n case 'm':\n if (isRelative) {\n s[1] += deltaX;\n s[2] += deltaY;\n }\n\n deltaX = s[1] - s[1].toFixed(d);\n deltaY = s[2] - s[2].toFixed(d);\n\n contourStartDeltaX = deltaX;\n contourStartDeltaY = deltaY;\n\n s[1] = +s[1].toFixed(d);\n s[2] = +s[2].toFixed(d);\n return;\n\n case 'A':\n case 'a':\n // [cmd, rx, ry, x-axis-rotation, large-arc-flag, sweep-flag, x, y]\n if (isRelative) {\n s[6] += deltaX;\n s[7] += deltaY;\n }\n\n deltaX = s[6] - s[6].toFixed(d);\n deltaY = s[7] - s[7].toFixed(d);\n\n s[1] = +s[1].toFixed(d);\n s[2] = +s[2].toFixed(d);\n s[3] = +s[3].toFixed(d + 2); // better precision for rotation\n s[6] = +s[6].toFixed(d);\n s[7] = +s[7].toFixed(d);\n return;\n\n default:\n // a c l q s t\n l = s.length;\n\n if (isRelative) {\n s[l - 2] += deltaX;\n s[l - 1] += deltaY;\n }\n\n deltaX = s[l - 2] - s[l - 2].toFixed(d);\n deltaY = s[l - 1] - s[l - 1].toFixed(d);\n\n s.forEach(function (val, i) {\n if (!i) { return; }\n s[i] = +s[i].toFixed(d);\n });\n return;\n }\n });\n\n return this;\n};\n\n\n// Apply iterator function to all segments. If function returns result,\n// current segment will be replaced to array of returned segments.\n// If empty array is returned, current regment will be deleted.\n//\nSvgPath.prototype.iterate = function (iterator, keepLazyStack) {\n var segments = this.segments,\n replacements = {},\n needReplace = false,\n lastX = 0,\n lastY = 0,\n countourStartX = 0,\n countourStartY = 0;\n var i, j, newSegments;\n\n if (!keepLazyStack) {\n this.__evaluateStack();\n }\n\n segments.forEach(function (s, index) {\n\n var res = iterator(s, index, lastX, lastY);\n\n if (Array.isArray(res)) {\n replacements[index] = res;\n needReplace = true;\n }\n\n var isRelative = (s[0] === s[0].toLowerCase());\n\n // calculate absolute X and Y\n switch (s[0]) {\n case 'm':\n case 'M':\n lastX = s[1] + (isRelative ? lastX : 0);\n lastY = s[2] + (isRelative ? lastY : 0);\n countourStartX = lastX;\n countourStartY = lastY;\n return;\n\n case 'h':\n case 'H':\n lastX = s[1] + (isRelative ? lastX : 0);\n return;\n\n case 'v':\n case 'V':\n lastY = s[1] + (isRelative ? lastY : 0);\n return;\n\n case 'z':\n case 'Z':\n // That make sence for multiple contours\n lastX = countourStartX;\n lastY = countourStartY;\n return;\n\n default:\n lastX = s[s.length - 2] + (isRelative ? lastX : 0);\n lastY = s[s.length - 1] + (isRelative ? lastY : 0);\n }\n });\n\n // Replace segments if iterator return results\n\n if (!needReplace) { return this; }\n\n newSegments = [];\n\n for (i = 0; i < segments.length; i++) {\n if (typeof replacements[i] !== 'undefined') {\n for (j = 0; j < replacements[i].length; j++) {\n newSegments.push(replacements[i][j]);\n }\n } else {\n newSegments.push(segments[i]);\n }\n }\n\n this.segments = newSegments;\n\n return this;\n};\n\n\n// Converts segments from relative to absolute\n//\nSvgPath.prototype.abs = function () {\n\n this.iterate(function (s, index, x, y) {\n var name = s[0],\n nameUC = name.toUpperCase(),\n i;\n\n // Skip absolute commands\n if (name === nameUC) { return; }\n\n s[0] = nameUC;\n\n switch (name) {\n case 'v':\n // v has shifted coords parity\n s[1] += y;\n return;\n\n case 'a':\n // ARC is: ['A', rx, ry, x-axis-rotation, large-arc-flag, sweep-flag, x, y]\n // touch x, y only\n s[6] += x;\n s[7] += y;\n return;\n\n default:\n for (i = 1; i < s.length; i++) {\n s[i] += i % 2 ? x : y; // odd values are X, even - Y\n }\n }\n }, true);\n\n return this;\n};\n\n\n// Converts segments from absolute to relative\n//\nSvgPath.prototype.rel = function () {\n\n this.iterate(function (s, index, x, y) {\n var name = s[0],\n nameLC = name.toLowerCase(),\n i;\n\n // Skip relative commands\n if (name === nameLC) { return; }\n\n // Don't touch the first M to avoid potential confusions.\n if (index === 0 && name === 'M') { return; }\n\n s[0] = nameLC;\n\n switch (name) {\n case 'V':\n // V has shifted coords parity\n s[1] -= y;\n return;\n\n case 'A':\n // ARC is: ['A', rx, ry, x-axis-rotation, large-arc-flag, sweep-flag, x, y]\n // touch x, y only\n s[6] -= x;\n s[7] -= y;\n return;\n\n default:\n for (i = 1; i < s.length; i++) {\n s[i] -= i % 2 ? x : y; // odd values are X, even - Y\n }\n }\n }, true);\n\n return this;\n};\n\n\n// Converts arcs to cubic bézier curves\n//\nSvgPath.prototype.unarc = function () {\n this.iterate(function (s, index, x, y) {\n var new_segments, nextX, nextY, result = [], name = s[0];\n\n // Skip anything except arcs\n if (name !== 'A' && name !== 'a') { return null; }\n\n if (name === 'a') {\n // convert relative arc coordinates to absolute\n nextX = x + s[6];\n nextY = y + s[7];\n } else {\n nextX = s[6];\n nextY = s[7];\n }\n\n new_segments = a2c(x, y, nextX, nextY, s[4], s[5], s[1], s[2], s[3]);\n\n // Degenerated arcs can be ignored by renderer, but should not be dropped\n // to avoid collisions with `S A S` and so on. Replace with empty line.\n if (new_segments.length === 0) {\n return [ [ s[0] === 'a' ? 'l' : 'L', s[6], s[7] ] ];\n }\n\n new_segments.forEach(function (s) {\n result.push([ 'C', s[2], s[3], s[4], s[5], s[6], s[7] ]);\n });\n\n return result;\n });\n\n return this;\n};\n\n\n// Converts smooth curves (with missed control point) to generic curves\n//\nSvgPath.prototype.unshort = function () {\n var segments = this.segments;\n var prevControlX, prevControlY, prevSegment;\n var curControlX, curControlY;\n\n // TODO: add lazy evaluation flag when relative commands supported\n\n this.iterate(function (s, idx, x, y) {\n var name = s[0], nameUC = name.toUpperCase(), isRelative;\n\n // First command MUST be M|m, it's safe to skip.\n // Protect from access to [-1] for sure.\n if (!idx) { return; }\n\n if (nameUC === 'T') { // quadratic curve\n isRelative = (name === 't');\n\n prevSegment = segments[idx - 1];\n\n if (prevSegment[0] === 'Q') {\n prevControlX = prevSegment[1] - x;\n prevControlY = prevSegment[2] - y;\n } else if (prevSegment[0] === 'q') {\n prevControlX = prevSegment[1] - prevSegment[3];\n prevControlY = prevSegment[2] - prevSegment[4];\n } else {\n prevControlX = 0;\n prevControlY = 0;\n }\n\n curControlX = -prevControlX;\n curControlY = -prevControlY;\n\n if (!isRelative) {\n curControlX += x;\n curControlY += y;\n }\n\n segments[idx] = [\n isRelative ? 'q' : 'Q',\n curControlX, curControlY,\n s[1], s[2]\n ];\n\n } else if (nameUC === 'S') { // cubic curve\n isRelative = (name === 's');\n\n prevSegment = segments[idx - 1];\n\n if (prevSegment[0] === 'C') {\n prevControlX = prevSegment[3] - x;\n prevControlY = prevSegment[4] - y;\n } else if (prevSegment[0] === 'c') {\n prevControlX = prevSegment[3] - prevSegment[5];\n prevControlY = prevSegment[4] - prevSegment[6];\n } else {\n prevControlX = 0;\n prevControlY = 0;\n }\n\n curControlX = -prevControlX;\n curControlY = -prevControlY;\n\n if (!isRelative) {\n curControlX += x;\n curControlY += y;\n }\n\n segments[idx] = [\n isRelative ? 'c' : 'C',\n curControlX, curControlY,\n s[1], s[2], s[3], s[4]\n ];\n }\n });\n\n return this;\n};\n\n\nmodule.exports = SvgPath;\n","export default \"/* Workspace wrapper: horizontal layout */\\r\\n.KabelWorkspaceWrapper {\\r\\n display: flex;\\r\\n flex-direction: row;\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n background: #f0f0f0;\\r\\n /* light gray background */\\r\\n overflow: hidden;\\r\\n position: relative;\\r\\n}\\r\\n\\r\\n/* Toolbox panel (left) */\\r\\n.KabelToolbox {\\r\\n width: 12%;\\r\\n min-width: 150px;\\r\\n height: 100%;\\r\\n background: rgba(240, 240, 240, 0.95);\\r\\n border-right: 1px solid #ccc;\\r\\n box-sizing: border-box;\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n padding: 8px;\\r\\n overflow-y: auto;\\r\\n}\\r\\n\\r\\n/* Context menu container */\\r\\n.KabelContextMenu {\\r\\n position: absolute;\\r\\n background: #1e1e2f;\\r\\n color: #000000;\\r\\n border-radius: 6px;\\r\\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.35);\\r\\n padding: 4px 0;\\r\\n font-family: 'Segoe UI', sans-serif;\\r\\n font-size: 14px;\\r\\n min-width: 160px;\\r\\n z-index: 9999;\\r\\n user-select: none;\\r\\n overflow: visible;\\r\\n height: auto;\\r\\n transition: opacity 0.15s ease, transform 0.15s ease;\\r\\n opacity: 0;\\r\\n transform: scale(0.95);\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n}\\r\\n\\r\\n/* Show state */\\r\\n.KabelContextMenu.show {\\r\\n opacity: 1;\\r\\n transform: scale(1);\\r\\n}\\r\\n\\r\\n/* Individual option */\\r\\n.KabelContextOption {\\r\\n padding: 8px 16px;\\r\\n cursor: pointer;\\r\\n transition: background 0.15s ease, color 0.15s ease;\\r\\n}\\r\\n.KabelContextOption:hover {\\r\\n background: #b0adb0;\\r\\n color: #fff;\\r\\n}\\r\\n.KabelContextOption.disabled {\\r\\n\\topacity: 0.35;\\r\\n\\tcursor: not-allowed;\\r\\n\\tcolor: #777; /* dim it so it's obviously off */\\r\\n\\tbackground: transparent;\\r\\n\\tpointer-events: none;\\r\\n}\\r\\n\\r\\n/* make sure hover never triggers visually */\\r\\n.KabelContextOption.disabled:hover {\\r\\n\\tbackground: transparent;\\r\\n\\tcolor: #777;\\r\\n}\\r\\n\\r\\n/* Optional: active click effect */\\r\\n.KabelContextOption:active {\\r\\n background: #fff;\\r\\n color: #000;\\r\\n}\\r\\n\\r\\n/* Scrollbar if too many options */\\r\\n.KabelContextMenu::-webkit-scrollbar {\\r\\n width: 6px;\\r\\n}\\r\\n\\r\\n.KabelContextMenu::-webkit-scrollbar-thumb {\\r\\n background: rgba(255, 255, 255, 0.2);\\r\\n border-radius: 3px;\\r\\n}\\r\\n\\r\\n/* Category buttons */\\r\\n\\r\\n.KabelCategoryRow {\\r\\n background: #fff;\\r\\n border: 1px solid #ccc;\\r\\n padding: 4px 8px;\\r\\n margin-bottom: 4px;\\r\\n border-radius: 4px;\\r\\n height: 5%;\\r\\n padding: 6px;\\r\\n cursor: pointer;\\r\\n text-align: left;\\r\\n transition: background 0.2s, color 0.2s;\\r\\n}\\r\\n\\r\\n.KabelToolbox button:hover {\\r\\n background: #e6e6e6;\\r\\n color: #333;\\r\\n}\\r\\n\\r\\n.KabelConnectionBubbleHighlight {\\r\\n stroke: yellow !important;\\r\\n stroke-width: 6px !important;\\r\\n stroke-linejoin: round;\\r\\n stroke-linecap: round;\\r\\n filter: drop-shadow(0 0 6px rgba(255, 255, 0, 0.9));\\r\\n}\\r\\n\\r\\n.KabelConnectionBubbleHighlightWrong {\\r\\n stroke: rgb(255, 0, 0) !important;\\r\\n stroke-width: 6px !important;\\r\\n stroke-linejoin: round;\\r\\n stroke-linecap: round;\\r\\n filter: drop-shadow(0 0 6px rgba(255, 0, 0, 0.9));\\r\\n}\\r\\n\\r\\n/* Container */\\r\\n.KabelDropdownMenu {\\r\\n position: absolute;\\r\\n display: none;\\r\\n background: #1e1e1e;\\r\\n color: #f0f0f0;\\r\\n font-family: sans-serif;\\r\\n font-size: 14px;\\r\\n border: 1px solid #333;\\r\\n border-radius: 6px;\\r\\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25);\\r\\n padding: 4px 0;\\r\\n z-index: 9999;\\r\\n user-select: none;\\r\\n animation: fadeIn 0.15s ease-out;\\r\\n}\\r\\n\\r\\n/* Dropdown items */\\r\\n.KabelDropdownItem {\\r\\n padding: 6px 12px;\\r\\n cursor: pointer;\\r\\n transition: background 0.15s;\\r\\n}\\r\\n\\r\\n/* Hover + focus states */\\r\\n.KabelDropdownItem:hover,\\r\\n.KabelDropdownItem:focus {\\r\\n background: #2d2d2d;\\r\\n}\\r\\n\\r\\n/* Active (clicked) state */\\r\\n.KabelDropdownItem:active {\\r\\n background: #3a3a3a;\\r\\n}\\r\\n\\r\\n/* Optional: highlight selected value */\\r\\n.KabelDropdownItem.selected {\\r\\n background: #444;\\r\\n font-weight: 600;\\r\\n}\\r\\n\\r\\n/* Smooth open effect */\\r\\n@keyframes fadeIn {\\r\\n from {\\r\\n opacity: 0;\\r\\n transform: translateY(-3px);\\r\\n }\\r\\n\\r\\n to {\\r\\n opacity: 1;\\r\\n transform: translateY(0);\\r\\n }\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\n/* Flyout panel (right) */\\r\\n.KabelFlyout {\\r\\n width: 20%;\\r\\n height: 100%;\\r\\n background: rgba(255, 255, 255, 0.95);\\r\\n border-left: 1px solid #ccc;\\r\\n box-sizing: border-box;\\r\\n overflow-y: auto;\\r\\n position: relative;\\r\\n /* for absolute positioning of nodes inside */\\r\\n display: none;\\r\\n /* hidden by default */\\r\\n padding: 8px;\\r\\n}\\r\\n\\r\\n/* Flyout nodes */\\r\\n.KabelFlyoutNode {\\r\\n padding: 6px 10px;\\r\\n margin-bottom: 4px;\\r\\n border-radius: 4px;\\r\\n cursor: pointer;\\r\\n user-select: none;\\r\\n transition: background 0.2s;\\r\\n}\\r\\n\\r\\n.KabelFlyoutNode:hover {\\r\\n background: #e0e0e0;\\r\\n}\\r\\n\\r\\n/* SVG workspace area */\\r\\n.KabelWorkspaceWrapper svg {\\r\\n flex: 1;\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n background: #fff;\\r\\n /* white canvas background */\\r\\n display: block;\\r\\n}\";","import { Element } from '@svgdotjs/svg.js';\r\nimport Connection, { Connectable } from '../src/connection';\r\nimport eventer, { EventArgs } from '../util/eventer';\r\nimport userState from '../util/user-state';\r\nimport Field, { AnyField } from '../src/field';\r\nimport NodeSvg from '../src/nodesvg';\r\nimport waitFrames from '../util/wait-anim-frames';\r\nimport WorkspaceSvg from '../src/workspace-svg';\r\ninterface ConnectionV {\r\n conn: Connection,\r\n el: Element,\r\n args?: EventArgs\r\n}\r\ninterface ConnectionState {\r\n one: null | ConnectionV,\r\n two: null | ConnectionV\r\n}\r\n\r\n\r\nconst cState: ConnectionState = {\r\n one: null,\r\n two: null\r\n}\r\n\r\n\r\nfunction initConnector(el: Element, args?: EventArgs) {\r\n args = args as {\r\n connection: Connection,\r\n node?: NodeSvg,\r\n field?: AnyField\r\n };\r\n if (args.field && !args.field?.canEditConnector) { // If editing isnt allowed, close the event early.\r\n return; \r\n }\r\n el.on('click', () => {\r\n const isPrev = args.connection.isPrevious;\r\n\r\n // First click → must NOT be previous\r\n if (!cState.one) {\r\n if (isPrev) {\r\n el.addClass('KabelConnectionBubbleHighlightWrong');\r\n waitFrames(10, () => {\r\n el.removeClass('KabelConnectionBubbleHighlightWrong');\r\n })\r\n return;\r\n }\r\n cState.one = { conn: args.connection, el, args };\r\n el.addClass('KabelConnectionBubbleHighlight');\r\n userState.setState('connecting')\r\n return;\r\n }\r\n\r\n // Second click → must be previous\r\n if (!cState.two && (args?.node !== cState.one?.args?.node)) {\r\n if (!isPrev) {\r\n el.addClass('KabelConnectionBubbleHighlightWrong');\r\n waitFrames(10, () => {\r\n el.removeClass('KabelConnectionBubbleHighlightWrong');\r\n })\r\n return;\r\n }\r\n if (cState.one.conn === args.connection) return; // ignore clicking the same again\r\n cState.two = { conn: args.connection, el, args };\r\n el.addClass('KabelConnectionBubbleHighlight');\r\n }\r\n\r\n // Both are filled → attempt to connect\r\n if (cState.one && cState.two) {\r\n if (cState.two.args?.node == cState.one.args?.node || cState.two.args?.node === cState.one?.args?.field?.node) {\r\n cState.one.el.addClass('KabelConnectionBubbleHighlightWrong');\r\n cState.two.el.addClass('KabelConnectionBubbleHighlightWrong');\r\n waitFrames(10, () => {\r\n if (!cState) return;\r\n if (!cState.one || !cState.two) return;\r\n cState.one.el.removeClass('KabelConnectionBubbleHighlightWrong');\r\n cState.two.el.removeClass('KabelConnectionBubbleHighlightWrong');\r\n cState.one = null;\r\n cState.two = null;\r\n })\r\n userState.removeState('connecting');\r\n return;\r\n }\r\n const { conn: connA } = cState.one;\r\n const { conn: connB } = cState.two;\r\n\r\n connA.disconnectTo();\r\n connB.disconnectFrom();\r\n\r\n connA.to = cState.two.args?.node;\r\n connB.from = cState.one.args?.node || cState.one.args?.field;\r\n\r\n waitFrames(2, () => {\r\n if (cState.one?.args?.node) {\r\n cState.one.args.node.workspace?.redraw();\r\n (cState.one.args.node.workspace as WorkspaceSvg).emitChange();\r\n } else if (cState.two?.args?.node) {\r\n cState.two.args.node.workspace?.redraw();\r\n (cState!.two!.args.node!.workspace as WorkspaceSvg).emitChange();\r\n\r\n }\r\n \r\n \r\n cState.one = null;\r\n cState.two = null;\r\n userState.removeState('connecting');\r\n\r\n });\r\n }\r\n });\r\n return () => {\r\n el.off('click'); // removes the click listener\r\n };\r\n\r\n}\r\n\r\neventer.registerEvent('k_connectbubble', initConnector);\r\n","import { parseColor } from \"../util/parse-color\";\r\nimport { TblxCategoryStruct, TblxNodeStruct } from \"./inject\";\r\nimport Toolbox from \"./toolbox\";\r\nimport { Color } from \"./visual-types\";\r\n\r\n/**\r\n * Represents a category in the toolbox, containing nodes and a label.\r\n */\r\nclass Category {\r\n\t/** Display label for the category */\r\n\tlabel: string;\r\n\t/** Category color */\r\n\tcolor: Color;\r\n\t/** Nodes contained in this category */\r\n\tcontents: TblxNodeStruct[];\r\n\t/** HTML button element representing this category row */\r\n\t_rowDiv!: HTMLButtonElement;\r\n\t/** Reference to parent toolbox */\r\n\t_toolbox: Toolbox;\r\n\r\n\t/**\r\n\t * @param toolbox The parent Toolbox instance\r\n\t * @param cData Category data (label, color, nodes)\r\n\t */\r\n\tconstructor(toolbox: Toolbox, cData: TblxCategoryStruct) {\r\n\t\tthis.label = cData.name;\r\n\t\tthis.color = cData.color;\r\n\t\tthis.contents = cData.contents;\r\n\t\tthis._toolbox = toolbox;\r\n\t\tthis._makeDiv();\r\n\t}\r\n\r\n\t/** Creates the category button in the UI and attaches click events */\r\n\t_makeDiv() {\r\n\t\tconst btn = document.createElement(\"button\");\r\n\t\tbtn.textContent = this.label;\r\n\t\tbtn.className = \"KabelCategoryRow\";\r\n\t\tbtn.style.backgroundColor = parseColor(this.color);\r\n\t\tbtn.style.color = parseColor('#ffffff');\r\n\t\tthis._rowDiv = btn;\r\n\r\n\t\tbtn.addEventListener(\"click\", e => {\r\n\t\t\te.stopPropagation();\r\n\t\t\tthis._toolbox._flyout.clear();\r\n\t\t\tthis._toolbox._flyout.fill(this.contents);\r\n\t\t\tthis._toolbox._flyout.show();\r\n\t\t});\r\n\r\n\t\tthis._toolbox.container.appendChild(btn);\r\n\t}\r\n\r\n\t/**\r\n\t * Refreshes the category UI with new data\r\n\t * @param cData Partial data to update (name, color, contents)\r\n\t */\r\n\trefresh(cData: Partial<TblxCategoryStruct>) {\r\n\t\tif (cData.name !== undefined) {\r\n\t\t\tthis.label = cData.name;\r\n\t\t\tthis._rowDiv.textContent = this.label;\r\n\t\t}\r\n\t\tif (cData.color !== undefined) {\r\n\t\t\tthis.color = cData.color;\r\n\t\t\tthis._rowDiv.style.backgroundColor = parseColor(this.color);\r\n\t\t}\r\n\t\tif (cData.contents !== undefined) {\r\n\t\t\tthis.contents = cData.contents;\r\n\t\t}\r\n\t}\r\n\r\n\t/** Remove category row from the toolbox */\r\n\tdestroy() {\r\n\t\tthis._rowDiv.remove();\r\n\t\tthis._toolbox = null as unknown as Toolbox;\r\n\t}\r\n\r\n\t/** Hide this category from the UI */\r\n\thide() {\r\n\t\tthis._rowDiv.style.display = \"none\";\r\n\t}\r\n\r\n\t/** Show this category in the UI */\r\n\tshow() {\r\n\t\tthis._rowDiv.style.display = \"\";\r\n\t}\r\n\r\n\t/**\r\n\t * Enable or disable interaction with this category\r\n\t * @param disabled True to disable, false to enable\r\n\t */\r\n\tsetDisabled(disabled: boolean) {\r\n\t\tthis._rowDiv.disabled = disabled;\r\n\t}\r\n\r\n\t/**\r\n\t * Returns a plain object representation of this category\r\n\t * @returns JSON-compatible category object\r\n\t */\r\n\ttoJSON(): TblxCategoryStruct {\r\n\t\treturn {\r\n\t\t\tname: this.label,\r\n\t\t\tcolor: this.color,\r\n\t\t\tcontents: this.contents,\r\n\t\t};\r\n\t}\r\n}\r\n\r\nexport default Category;\r\n","import NodeSvg from '../src/nodesvg';\r\nimport WorkspaceSvg from '../src/workspace-svg';\r\nimport { Element } from '@svgdotjs/svg.js';\r\nimport Renderer, { DrawState } from './renderer';\r\nimport RendererConstants from './constants';\r\nimport { parseColor } from '../util/parse-color';\r\nimport {Color} from '../src/visual-types';\r\n\r\nexport class RepresenterNode {\r\n\tnode: NodeSvg;\r\n\tstate: DrawState;\r\n renderer: Renderer;\r\n\tconstructor(node: NodeSvg, svgState: DrawState, renderer: Renderer) {\r\n this.renderer = renderer;\r\n\t\tthis.node = node;\r\n\t\tthis.state = svgState;\r\n\r\n\t\t// Attach this wrapper to the node for external access\r\n\t\tnode.svg = this;\r\n\t}\r\n getConstant(name: keyof RendererConstants) {\r\n return this.renderer._constants[name];\r\n }\r\n\t/** Move node visually without changing its relativeCoords */\r\n\tmoveTo(x: number, y: number) {\r\n\t\tthis.state.group!.move(x, y);\r\n\t}\r\n\r\n\t/** Scale node visually */\r\n\tsetScale(scale: number) {\r\n\t\tthis.state.group!.scale(scale);\r\n\t}\r\n\r\n\t/** Apply raw transform string */\r\n\tapplyTransform(transform: string) {\r\n\t\tthis.state.group!.attr({ transform });\r\n\t}\r\n\r\n\t/** Access the raw SVG group */\r\n\tgetRaw() {\r\n\t\treturn this.state.group;\r\n\t}\r\n\r\n\t/** Optional: highlight node */\r\n\thighlight(color = '#ff0') {\r\n if (!color || color.length == 0 || typeof color !== 'string') {\r\n this.highlight(parseColor(this.getConstant('NODE_OUTLINE_COLOR') as Color) as string);\r\n return;\r\n }\r\n\t\tthis.state.bg!.stroke({ color, width: 2 });\r\n\t}\r\n}\r\n","import Field, { ConnectableField } from \"./field\";\r\nimport NodeSvg from \"./nodesvg\";\r\n\r\n/**\r\n * A node or field that can participate in a connection.\r\n */\r\nexport type Connectable = NodeSvg | null | Field;\r\n\r\n/**\r\n * Represents a connection between two connectable objects.\r\n */\r\nclass Connection {\r\n\t/** The source of the connection */\r\n\tfrom: Connectable;\r\n\t/** The target of the connection */\r\n\tto: Connectable;\r\n\t/** Whether this connection represents a previous connection (affects rendering/logic) */\r\n\tisPrevious: boolean;\r\n\r\n\t/**\r\n\t * Creates a new Connection.\r\n\t * @param from - The source NodeSvg or Field\r\n\t * @param to - The target NodeSvg or Field\r\n\t * @param isPrevious - True if this connection is a previous connection\r\n\t */\r\n\tconstructor(from: Connectable, to: Connectable, isPrevious: boolean = false) {\r\n\t\tthis.from = from;\r\n\t\tthis.to = to;\r\n\t\tthis.isPrevious = isPrevious;\r\n\t}\r\n\r\n\t/** Returns the target of the connection */\r\n\tgetTo(): Connectable {\r\n\t\treturn this.to;\r\n\t}\r\n\r\n\t/** Returns the source of the connection */\r\n\tgetFrom(): Connectable {\r\n\t\treturn this.from;\r\n\t}\r\n\r\n\t/**\r\n\t * Disconnects this connection from its target.\r\n\t * Safely handles NodeSvg chains and ConnectableFields.\r\n\t */\r\n\tdisconnectTo() {\r\n\t\tif (!this.to) return;\r\n\r\n\t\tif (this.to instanceof NodeSvg && this.to.previousConnection) {\r\n\t\t\tconst prevConn = this.to.previousConnection;\r\n\t\t\tconst prevFrom = prevConn.from;\r\n\r\n\t\t\t// Disconnect NodeSvg chain\r\n\t\t\tif (prevFrom instanceof NodeSvg && prevFrom.nextConnection?.to) {\r\n\t\t\t\tprevFrom.nextConnection.to = null;\r\n\t\t\t}\r\n\r\n\t\t\t// Disconnect Field chain\r\n\t\t\tif (prevFrom instanceof Field && prevFrom.hasConnectable?.()) {\r\n\t\t\t\t(prevFrom as ConnectableField).disconnect();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.to = null;\r\n\t}\r\n\r\n\t/**\r\n\t * Disconnects this connection from its source.\r\n\t * Safely handles NodeSvg chains and ConnectableFields.\r\n\t */\r\n\tdisconnectFrom() {\r\n\t\tif (!this.from) return;\r\n\r\n\t\tif (this.from instanceof NodeSvg && this.from.nextConnection) {\r\n\t\t\tconst next = this.from.nextConnection;\r\n\r\n\t\t\tif (next.to instanceof NodeSvg && next.to.previousConnection?.from) {\r\n\t\t\t\tnext.to.previousConnection.from = null;\r\n\t\t\t} else if (next.to instanceof Field && next.to.hasConnectable()) {\r\n\t\t\t\t(next.to as ConnectableField).disconnect();\r\n\t\t\t}\r\n\r\n\t\t\tnext.to = null;\r\n\t\t} else if (this.from instanceof Field && this.from.hasConnectable()) {\r\n\t\t\t(this.from as ConnectableField).disconnect();\r\n\t\t}\r\n\r\n\t\tthis.from = null;\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the target of this connection (used during deserialization)\r\n\t * @param target - New connection target\r\n\t */\r\n\tsetTo(target: Connectable) {\r\n\t\tthis.to = target;\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the source of this connection (used during deserialization)\r\n\t * @param source - New connection source\r\n\t */\r\n\tsetFrom(source: Connectable) {\r\n\t\tthis.from = source;\r\n\t}\r\n\r\n\t/** Completely isolates this connection, clearing both ends */\r\n\tisolate() {\r\n\t\tthis.from = null as any;\r\n\t\tthis.to = null as any;\r\n\t}\r\n}\r\n\r\nexport default Connection;\r\n","import { Color } from \"../../src/visual-types\";\r\nimport RendererConstants from \"../constants\";\r\n\r\n// Define the new Dogear shape\r\ntype DogearShape = {\r\n PathMain: string;\r\n Width: number;\r\n Height: number;\r\n};\r\n\r\n// Extend the original SHAPES type\r\ntype ApolloShapes = RendererConstants['SHAPES'] & {\r\n Dogear?: DogearShape;\r\n};\r\n\r\nclass ApolloConstants extends RendererConstants {\r\n SHAPES: ApolloShapes = {};\r\n CONNECTOR_COLOR: Color = '#9912e8ff'\r\n FIELD_RAW_COLOR: Color = '#343745ff';\r\n FIELD_RAW_TEXT_COLOR: Color = '#cfd4e4ff';\r\n FIELD_RAW_OUTLINE_COLOR: Color = '#202128ff';\r\n constructor(overrides: Partial<ApolloConstants>) {\r\n super(overrides);\r\n this.CONNECTOR_LINE_WIDTH = 2.5;\r\n this.CORNER_RADIUS = 10;\r\n this.FOOTER_HEIGHT = 25;\r\n this.CONNECTOR_LINE_WIDTH = 7;\r\n this.init();\r\n }\r\n\r\n init() {\r\n this.SHAPES.Dogear = {\r\n PathMain: `M -1 1 Q -1 21 0 30 L 26 0 Q 2 -1 0 0 Z`,\r\n Width: 26,\r\n Height: 30\r\n };\r\n }\r\n}\r\n\r\nexport default ApolloConstants;\r\n","import { Element, Rect, Text } from \"@svgdotjs/svg.js\";\r\nimport eventer, { EventSetupFn } from \"../util/eventer\";\r\nimport userState from '../util/user-state';\r\nimport { Renderer } from \"../src\";\r\n\r\nfunction initInputBox(element: Element, args: Record<string, any>) {\r\n let editing = false;\r\n let skipNextClick = false;\r\n let buffer = args.field.getDisplayValue?.() ?? \"\";\r\n let cursorPos = buffer.length;\r\n let anchorPos = buffer.length;\r\n const txt: Text = args.text;\r\n const rect: Rect = element as Rect;\r\n const renderer = args.renderer as Renderer;\r\n const PADDING_X = 4;\r\n const PADDING_Y = 4;\r\n let caretLine: Rect | null = null;\r\n let selectionRect: Rect | null = null;\r\n // @ts-ignore\r\n txt!.style('user-select', 'none');\r\n // @ts-ignore\r\n rect!.style('user-select', 'none');\r\n\r\n // Helper: measure width of text using renderer or fallback\r\n function measureTextWidth(text: string) {\r\n\r\n if (renderer.measureTextWidth) return renderer.measureTextWidth(text);\r\n return text.length * 8; // rough fallback\r\n }\r\n\r\n function getSelectionRange() {\r\n const start = Math.min(cursorPos, anchorPos);\r\n const end = Math.max(cursorPos, anchorPos);\r\n return { start, end };\r\n }\r\n\r\n function hasSelection() {\r\n return cursorPos !== anchorPos;\r\n }\r\n\r\n function deleteSelection() {\r\n if (!hasSelection()) return false;\r\n const { start, end } = getSelectionRange();\r\n buffer = buffer.slice(0, start) + buffer.slice(end);\r\n cursorPos = start;\r\n anchorPos = start;\r\n return true;\r\n }\r\n\r\n function updateText() {\r\n // redraw main text\r\n txt.text(buffer);\r\n\r\n const { start, end } = getSelectionRange();\r\n const { width: totalWidth } = renderer.measureRawField(buffer);\r\n const { height: rectHeight } = rect.bbox(); // actual rect height\r\n\r\n const textBBox = txt.bbox();\r\n const offsetY = (rectHeight - textBBox.height) / 2; // center vertically\r\n\r\n // --- selection highlight ---\r\n if (hasSelection()) {\r\n const textBeforeStart = buffer.slice(0, start);\r\n const textBeforeEnd = buffer.slice(0, end);\r\n const highlightX = args.startX + PADDING_X + measureTextWidth(textBeforeStart);\r\n const highlightWidth = Math.max(measureTextWidth(textBeforeEnd) - measureTextWidth(textBeforeStart), 1);\r\n const highlightY = offsetY; // use offsetY for vertical alignment\r\n\r\n if (!selectionRect) {\r\n // @ts-ignore\r\n selectionRect = rect.parent()!.rect(highlightWidth, textBBox.height)\r\n .fill('#3390ff')\r\n .attr({ 'fill-opacity': 0.35 });\r\n selectionRect!.node.parentNode!.insertBefore(selectionRect!.node, txt.node);\r\n } else {\r\n selectionRect.size(highlightWidth, textBBox.height);\r\n }\r\n\r\n selectionRect!.move(highlightX, highlightY);\r\n } else {\r\n if (selectionRect) { selectionRect.remove(); selectionRect = null; }\r\n }\r\n\r\n // --- caret ---\r\n if (editing) {\r\n const zoom = renderer.getWs().getZoom(); // workspace zoom\r\n const caretX = (args.startX + PADDING_X + measureTextWidth(buffer.slice(0, cursorPos))); // scale pos\r\n const caretH = textBBox.height;\r\n // @ts-ignore\r\n if (!caretLine) caretLine = rect.parent()!.rect(1, caretH).fill(renderer.constants.FIELD_RAW_TEXT_COLOR);\r\n caretLine!.size(1, caretH).move(caretX, offsetY);\r\n } else {\r\n if (caretLine) { caretLine.remove(); caretLine = null; }\r\n }\r\n\r\n // --- background rect ---\r\n rect.size(Math.max(16, totalWidth + PADDING_X * 2), Math.max(rectHeight, textBBox.height + PADDING_Y * 2));\r\n txt.move(args.startX + PADDING_X, offsetY);\r\n }\r\n\r\n\r\n function onKeyDown(e: KeyboardEvent) {\r\n if (!args.field.canEdit()) { // If editing isnt allowed, close the event early.\r\n if (editing) stopEditing();\r\n return;\r\n }\r\n if (!editing) return;\r\n\r\n if (e.key === \"Escape\") { e.preventDefault(); stopEditing(); return; }\r\n if (e.key === \"Enter\") { e.preventDefault(); stopEditing(); return; }\r\n\r\n if (e.key === \"Backspace\") {\r\n if (!deleteSelection() && cursorPos > 0) {\r\n buffer = buffer.slice(0, cursorPos - 1) + buffer.slice(cursorPos);\r\n cursorPos--;\r\n anchorPos = cursorPos;\r\n }\r\n } else if (e.key === \"Delete\") {\r\n if (!deleteSelection() && cursorPos < buffer.length) {\r\n buffer = buffer.slice(0, cursorPos) + buffer.slice(cursorPos + 1);\r\n }\r\n } else if (e.key === \"ArrowLeft\") {\r\n if (e.shiftKey) cursorPos = Math.max(0, cursorPos - 1);\r\n else { cursorPos = Math.max(0, cursorPos - 1); anchorPos = cursorPos; }\r\n } else if (e.key === \"ArrowRight\") {\r\n if (e.shiftKey) cursorPos = Math.min(buffer.length, cursorPos + 1);\r\n else { cursorPos = Math.min(buffer.length, cursorPos + 1); anchorPos = cursorPos; }\r\n } else if (e.key === \"Home\") {\r\n if (!e.shiftKey) anchorPos = 0;\r\n cursorPos = 0;\r\n } else if (e.key === \"End\") {\r\n if (!e.shiftKey) anchorPos = buffer.length;\r\n cursorPos = buffer.length;\r\n } else if (e.key.length === 1 && !e.ctrlKey && !e.metaKey) {\r\n if (hasSelection()) deleteSelection();\r\n buffer = buffer.slice(0, cursorPos) + e.key + buffer.slice(cursorPos);\r\n cursorPos++;\r\n anchorPos = cursorPos;\r\n } else return;\r\n\r\n e.preventDefault();\r\n updateText();\r\n args.field.setValue(buffer);\r\n }\r\n\r\n function onClickOutside(ev: MouseEvent) {\r\n if (!editing) return;\r\n if (skipNextClick) { skipNextClick = false; return; }\r\n const target = ev.target as Node;\r\n if (target !== rect.node && target !== txt.node) stopEditing();\r\n }\r\n\r\n function startEditing(ev?: MouseEvent) {\r\n if (!args.field.canEdit()) { // If editing isnt allowed, close the event early.\r\n if (editing) stopEditing();\r\n return;\r\n }\r\n if (editing) return;\r\n editing = true;\r\n buffer = args.field.getValue?.() ?? \"\";\r\n cursorPos = buffer.length;\r\n anchorPos = buffer.length;\r\n\r\n userState.setState('typing');\r\n\r\n if (ev) {\r\n const rectBox = rect.node.getBoundingClientRect();\r\n const zoom = renderer.getWs().getZoom(); // workspace zoom\r\n const clickX = (ev.clientX - rectBox.left - PADDING_X) / zoom;\r\n\r\n let cumulativeWidth = 0;\r\n cursorPos = 0;\r\n for (let i = 0; i < buffer.length; i++) {\r\n const charWidth = measureTextWidth(buffer[i]); // scale widths\r\n if (cumulativeWidth + charWidth / 2 >= clickX) break;\r\n cumulativeWidth += charWidth;\r\n cursorPos = i + 1;\r\n }\r\n }\r\n\r\n anchorPos = cursorPos;\r\n updateText();\r\n skipNextClick = true;\r\n\r\n document.addEventListener(\"keydown\", onKeyDown);\r\n document.addEventListener(\"mousedown\", onClickOutside);\r\n }\r\n\r\n function stopEditing() {\r\n editing = false;\r\n userState.removeState('typing');\r\n document.removeEventListener(\"keydown\", onKeyDown);\r\n document.removeEventListener(\"mousedown\", onClickOutside);\r\n args.field.setValue(buffer);\r\n updateText();\r\n renderer.getWs().redraw();\r\n renderer.getWs().emitChange();\r\n }\r\n\r\n rect.on(\"mousedown\", (ev: Event) => startEditing(ev as MouseEvent));\r\n txt.on(\"mousedown\", (ev: Event) => startEditing(ev as MouseEvent));\r\n\r\n updateText();\r\n\r\n return () => {\r\n rect.off(\"mousedown\", startEditing as EventListener);\r\n txt.off(\"mousedown\", startEditing as EventListener);\r\n document.removeEventListener(\"keydown\", onKeyDown);\r\n document.removeEventListener(\"mousedown\", onClickOutside);\r\n };\r\n}\r\n\r\neventer.registerEvent(\"k_inputbox\", initInputBox as EventSetupFn);\r\n","import NodeSvg from '../src/nodesvg';\r\nimport Renderer, { DrawState } from './renderer';\r\nimport { RepresenterNode } from './representer-node';\r\n\r\nexport default class Representer {\r\n\tnodes: Map<string, RepresenterNode> = new Map();\r\n\r\n\t/** Build a representer node for a drawn node */\r\n\tbuild(node: NodeSvg, renderer: Renderer, state: DrawState) {\r\n\t\tif (!node) return;\r\n\t\tconst repNode = new RepresenterNode(node, state, renderer);\r\n\t\tthis.nodes.set(node.id, repNode);\r\n\t\treturn repNode;\r\n\t}\r\n\r\n\t/** Get a representer node by node id */\r\n\tget(nodeId: string): RepresenterNode | undefined {\r\n\t\treturn this.nodes.get(nodeId);\r\n\t}\r\n\r\n\t/** Remove a node from the representer */\r\n\tremove(nodeId: string) {\r\n\t\tthis.nodes.delete(nodeId);\r\n\t}\r\n}\r\n","import WorkspaceController from \"../controllers/base\";\r\nimport unescapeAttr from \"../util/unescape-html\";\r\nimport CommentModel from \"./comment\";\r\nimport Coordinates from \"./coordinates\";\r\nimport ContextOptsRegistry from \"./ctx-menu-registry\";\r\nimport NodeSvg from \"./nodesvg\";\r\nimport Widget from \"./widget\";\r\nimport WorkspaceSvg from \"./workspace-svg\";\r\n/**\r\n * A list of types that a context menu item can show for.\r\n */\r\nexport type Showable = 'node' | 'ws' | 'html' | 'comment' | 'any';\r\n\r\n/**\r\n * Describes a context menu option.\r\n */\r\nexport interface ContextMenuOpts {\r\n /** Function executed when the option is clicked */\r\n click: (target: NodeSvg | WorkspaceSvg | CommentModel | HTMLElement) => void;\r\n /** Optional hover start callback */\r\n onHoverStart?: () => void;\r\n /** Optional hover end callback */\r\n onHoverEnd?: () => void;\r\n /** Specifies which target types this option should appear for */\r\n showFor?: Showable | Showable[];\r\n /** Specifies extra logic for drawing */\r\n onDraw?: (optEl: Node, ws: WorkspaceSvg, opt: ContextMenuOpts) => void;\r\n /** Text label for the menu option */\r\n label: string;\r\n /** Unique ID for the option */\r\n id: string;\r\n}\r\n\r\n/**\r\n * HTML context menu rendered on workspace right-click.\r\n */\r\nclass ContextMenuHTML {\r\n /**\r\n * The workspace.\r\n */\r\n workspace: WorkspaceSvg;\r\n /**\r\n * The workspace's controller\r\n */\r\n controller: WorkspaceController;\r\n /**\r\n * The widget in the workspace to display the menu on.\r\n */\r\n widget: Widget;\r\n /**\r\n * Options for the context menu.\r\n */\r\n options: ContextMenuOpts[];\r\n\r\n /**\r\n * Create a new context menu for a workspace.\r\n * @param workspace - Workspace to attach the context menu to\r\n */\r\n constructor(workspace: WorkspaceSvg) {\r\n this.workspace = workspace;\r\n this.controller = this.workspace.controller;\r\n this.widget = new Widget(this.workspace, {\r\n coords: new Coordinates(0, 0),\r\n name: 'k_contextmenu',\r\n className: 'KabelContextMenu'\r\n });\r\n\r\n // Override show/hide methods to manipulate CSS\r\n this.widget.show = () => {\r\n this.widget.container.classList.add('show');\r\n this.widget.container.style.display = 'flex';\r\n this.widget.visible = true;\r\n };\r\n this.widget.hide = () => {\r\n this.widget.container.classList.remove('show');\r\n this.widget.container.style.display = 'none';\r\n this.widget.visible = false;\r\n };\r\n this.widget.container.style.removeProperty('height');\r\n this.widget.container.style.removeProperty('width');\r\n\r\n this.widget.hide();\r\n this.options = ContextOptsRegistry;\r\n this.initListeners();\r\n }\r\n\r\n /**\r\n * Renders context menu options for a given target.\r\n * @param target - The object the context menu is for\r\n */\r\n renderOptions(target: NodeSvg | WorkspaceSvg | HTMLElement | CommentModel | null) {\r\n this.widget.container.innerHTML = '';\r\n\r\n const filteredOptions = this.options.filter(opt => {\r\n if (!target) return false;\r\n const showFor = Array.isArray(opt.showFor) ? opt.showFor : [opt.showFor];\r\n if (showFor.includes('any')) return true;\r\n if (target instanceof NodeSvg && showFor.includes('node')) return true;\r\n if (target instanceof WorkspaceSvg && showFor.includes('ws')) return true;\r\n if (target instanceof HTMLElement && !(target instanceof SVGSVGElement) && showFor.includes('html')) return true;\r\n if (target instanceof CommentModel && showFor.includes('comment')) return true;\r\n return false;\r\n });\r\n\r\n filteredOptions.forEach((opt, i) => {\r\n const el = document.createElement('div');\r\n el.className = 'KabelContextOption';\r\n el.textContent = opt.label || 'Option ' + i;\r\n\r\n el.addEventListener('click', () => {\r\n if (target) opt.click(target);\r\n this.hide();\r\n });\r\n if (opt.onDraw) opt.onDraw(el, this.workspace, opt);\r\n if (opt.onHoverStart) el.addEventListener('mouseenter', () => opt.onHoverStart?.());\r\n if (opt.onHoverEnd) el.addEventListener('mouseleave', () => opt.onHoverEnd?.());\r\n\r\n this.widget.container.appendChild(el);\r\n });\r\n }\r\n\r\n /**\r\n * Initializes event listeners for showing/hiding the menu.\r\n */\r\n initListeners() {\r\n if (this.controller) {\r\n this.controller.addMoveListener(() => {\r\n if (this.widget.visible) this.hide();\r\n })\r\n }\r\n this.workspace.svg.node.addEventListener('contextmenu', e => {\r\n e.preventDefault();\r\n const mouseX = e.clientX;\r\n const mouseY = e.clientY;\r\n\r\n this.widget.setCoords(new Coordinates(mouseX, mouseY));\r\n this.renderOptions(this.target);\r\n this.widget.show();\r\n });\r\n\r\n document.addEventListener('mousedown', e => {\r\n if (!this.widget.container.contains(e.target as Node)) {\r\n this.hide();\r\n }\r\n });\r\n }\r\n\r\n /** Hides the context menu */\r\n hide() {\r\n this.widget.hide();\r\n }\r\n\r\n /** Returns the current mouse position in workspace coordinates */\r\n get mousePos(): { x: number, y: number } {\r\n return this.controller.mousePos;\r\n }\r\n\r\n /**\r\n * Returns the target element under the mouse for context menu.\r\n */\r\n get target(): NodeSvg | WorkspaceSvg | HTMLElement | CommentModel | null {\r\n let el = document.elementFromPoint(this.mousePos.x, this.mousePos.y) as HTMLElement | null;\r\n if (!el) return null;\r\n if ((el as unknown as SVGSVGElement) === this.workspace.svg.node) return this.workspace;\r\n\r\n if (el && el.classList?.contains?.('WorkspaceBgPattern')) return this.workspace;\r\n\r\n while (el && el !== document.body) {\r\n if (el.tagName.toLowerCase() === 'g' && el.hasAttribute('data-node-id')) {\r\n const nodeId = unescapeAttr(el.getAttribute('data-node-id') as string);\r\n const node = this.workspace.getNode(nodeId);\r\n if (node) return node;\r\n }\r\n if (el.tagName.toLowerCase() === 'g' && el.hasAttribute('comment-data')) {\r\n const dta = JSON.parse(el.getAttribute('comment-data') as string);\r\n if (!dta.id && !dta.isws) continue;\r\n if (dta.isws) {\r\n for (let comment of this.workspace._commentDB) {\r\n if (comment.id === dta.id) return comment;\r\n }\r\n } else {\r\n for (let [_, node] of this.workspace._nodeDB) {\r\n if (node.comment && node.comment.id == dta.id) return node.comment;\r\n }\r\n }\r\n }\r\n el = el.parentElement;\r\n }\r\n\r\n return document.elementFromPoint(this.mousePos.x, this.mousePos.y) as HTMLElement | null;\r\n }\r\n}\r\n\r\nexport default ContextMenuHTML;\r\n","import type { WSTheme } from '../src/workspace-svg';\r\n\r\nconst KabelDarkTheme: WSTheme = {\r\n\tUIStyles: {\r\n\t\tworkspaceBGColor: '#121412ff',\r\n\t\ttoolboxCategoriesBG: {\r\n\t\t\tposition: 'absolute',\r\n\t\t\tleft: '0',\r\n\t\t\ttop: '0',\r\n\t\t\twidth: '20%',\r\n\t\t\theight: '100%',\r\n\t\t\tbackground: '#1b1b1b',\r\n\t\t\tcolor: '#e0e0e0',\r\n\t\t\toverflowY: 'auto',\r\n\t\t\tborder: 'none',\r\n\t\t\toutline: 'none',\r\n\t\t},\r\n\t\ttoolboxFlyoutBG: {\r\n\t\t\tbackground: '#1e1e1e',\r\n\t\t\tcolor: '#e0e0e0',\r\n\t\t\toverflowY: 'auto',\r\n\t\t\tpadding: '4px', \r\n\t\t\tborderRadius: '4px',\r\n\t\t\tboxShadow: '0 2px 6px rgba(0,0,0,0.5)',\r\n\t\t\tborder: 'none',\r\n\t\t\toutline: 'none',\r\n\t\t},\r\n\t},\r\n};\r\n\r\nexport default KabelDarkTheme;\r\n","/*!\n* @svgdotjs/svg.js - A lightweight library for manipulating and animating SVG.\n* @version 3.2.4\n* https://svgjs.dev/\n*\n* @copyright Wout Fierens <wout@mick-wout.com>\n* @license MIT\n*\n* BUILT: Thu Jun 27 2024 12:00:16 GMT+0200 (Central European Summer Time)\n*/;\n'use strict';\n\nconst methods$1 = {};\nconst names = [];\nfunction registerMethods(name, m) {\n if (Array.isArray(name)) {\n for (const _name of name) {\n registerMethods(_name, m);\n }\n return;\n }\n if (typeof name === 'object') {\n for (const _name in name) {\n registerMethods(_name, name[_name]);\n }\n return;\n }\n addMethodNames(Object.getOwnPropertyNames(m));\n methods$1[name] = Object.assign(methods$1[name] || {}, m);\n}\nfunction getMethodsFor(name) {\n return methods$1[name] || {};\n}\nfunction getMethodNames() {\n return [...new Set(names)];\n}\nfunction addMethodNames(_names) {\n names.push(..._names);\n}\n\n// Map function\nfunction map(array, block) {\n let i;\n const il = array.length;\n const result = [];\n for (i = 0; i < il; i++) {\n result.push(block(array[i]));\n }\n return result;\n}\n\n// Filter function\nfunction filter(array, block) {\n let i;\n const il = array.length;\n const result = [];\n for (i = 0; i < il; i++) {\n if (block(array[i])) {\n result.push(array[i]);\n }\n }\n return result;\n}\n\n// Degrees to radians\nfunction radians(d) {\n return d % 360 * Math.PI / 180;\n}\n\n// Radians to degrees\nfunction degrees(r) {\n return r * 180 / Math.PI % 360;\n}\n\n// Convert camel cased string to dash separated\nfunction unCamelCase(s) {\n return s.replace(/([A-Z])/g, function (m, g) {\n return '-' + g.toLowerCase();\n });\n}\n\n// Capitalize first letter of a string\nfunction capitalize(s) {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\n// Calculate proportional width and height values when necessary\nfunction proportionalSize(element, width, height, box) {\n if (width == null || height == null) {\n box = box || element.bbox();\n if (width == null) {\n width = box.width / box.height * height;\n } else if (height == null) {\n height = box.height / box.width * width;\n }\n }\n return {\n width: width,\n height: height\n };\n}\n\n/**\n * This function adds support for string origins.\n * It searches for an origin in o.origin o.ox and o.originX.\n * This way, origin: {x: 'center', y: 50} can be passed as well as ox: 'center', oy: 50\n **/\nfunction getOrigin(o, element) {\n const origin = o.origin;\n // First check if origin is in ox or originX\n let ox = o.ox != null ? o.ox : o.originX != null ? o.originX : 'center';\n let oy = o.oy != null ? o.oy : o.originY != null ? o.originY : 'center';\n\n // Then check if origin was used and overwrite in that case\n if (origin != null) {\n [ox, oy] = Array.isArray(origin) ? origin : typeof origin === 'object' ? [origin.x, origin.y] : [origin, origin];\n }\n\n // Make sure to only call bbox when actually needed\n const condX = typeof ox === 'string';\n const condY = typeof oy === 'string';\n if (condX || condY) {\n const {\n height,\n width,\n x,\n y\n } = element.bbox();\n\n // And only overwrite if string was passed for this specific axis\n if (condX) {\n ox = ox.includes('left') ? x : ox.includes('right') ? x + width : x + width / 2;\n }\n if (condY) {\n oy = oy.includes('top') ? y : oy.includes('bottom') ? y + height : y + height / 2;\n }\n }\n\n // Return the origin as it is if it wasn't a string\n return [ox, oy];\n}\nconst descriptiveElements = new Set(['desc', 'metadata', 'title']);\nconst isDescriptive = element => descriptiveElements.has(element.nodeName);\nconst writeDataToDom = (element, data, defaults = {}) => {\n const cloned = {\n ...data\n };\n for (const key in cloned) {\n if (cloned[key].valueOf() === defaults[key]) {\n delete cloned[key];\n }\n }\n if (Object.keys(cloned).length) {\n element.node.setAttribute('data-svgjs', JSON.stringify(cloned)); // see #428\n } else {\n element.node.removeAttribute('data-svgjs');\n element.node.removeAttribute('svgjs:data');\n }\n};\n\nvar utils = {\n __proto__: null,\n capitalize: capitalize,\n degrees: degrees,\n filter: filter,\n getOrigin: getOrigin,\n isDescriptive: isDescriptive,\n map: map,\n proportionalSize: proportionalSize,\n radians: radians,\n unCamelCase: unCamelCase,\n writeDataToDom: writeDataToDom\n};\n\n// Default namespaces\nconst svg = 'http://www.w3.org/2000/svg';\nconst html = 'http://www.w3.org/1999/xhtml';\nconst xmlns = 'http://www.w3.org/2000/xmlns/';\nconst xlink = 'http://www.w3.org/1999/xlink';\n\nvar namespaces = {\n __proto__: null,\n html: html,\n svg: svg,\n xlink: xlink,\n xmlns: xmlns\n};\n\nconst globals = {\n window: typeof window === 'undefined' ? null : window,\n document: typeof document === 'undefined' ? null : document\n};\nfunction registerWindow(win = null, doc = null) {\n globals.window = win;\n globals.document = doc;\n}\nconst save = {};\nfunction saveWindow() {\n save.window = globals.window;\n save.document = globals.document;\n}\nfunction restoreWindow() {\n globals.window = save.window;\n globals.document = save.document;\n}\nfunction withWindow(win, fn) {\n saveWindow();\n registerWindow(win, win.document);\n fn(win, win.document);\n restoreWindow();\n}\nfunction getWindow() {\n return globals.window;\n}\n\nclass Base {\n // constructor (node/*, {extensions = []} */) {\n // // this.tags = []\n // //\n // // for (let extension of extensions) {\n // // extension.setup.call(this, node)\n // // this.tags.push(extension.name)\n // // }\n // }\n}\n\nconst elements = {};\nconst root = '___SYMBOL___ROOT___';\n\n// Method for element creation\nfunction create(name, ns = svg) {\n // create element\n return globals.document.createElementNS(ns, name);\n}\nfunction makeInstance(element, isHTML = false) {\n if (element instanceof Base) return element;\n if (typeof element === 'object') {\n return adopter(element);\n }\n if (element == null) {\n return new elements[root]();\n }\n if (typeof element === 'string' && element.charAt(0) !== '<') {\n return adopter(globals.document.querySelector(element));\n }\n\n // Make sure, that HTML elements are created with the correct namespace\n const wrapper = isHTML ? globals.document.createElement('div') : create('svg');\n wrapper.innerHTML = element;\n\n // We can use firstChild here because we know,\n // that the first char is < and thus an element\n element = adopter(wrapper.firstChild);\n\n // make sure, that element doesn't have its wrapper attached\n wrapper.removeChild(wrapper.firstChild);\n return element;\n}\nfunction nodeOrNew(name, node) {\n return node && (node instanceof globals.window.Node || node.ownerDocument && node instanceof node.ownerDocument.defaultView.Node) ? node : create(name);\n}\n\n// Adopt existing svg elements\nfunction adopt(node) {\n // check for presence of node\n if (!node) return null;\n\n // make sure a node isn't already adopted\n if (node.instance instanceof Base) return node.instance;\n if (node.nodeName === '#document-fragment') {\n return new elements.Fragment(node);\n }\n\n // initialize variables\n let className = capitalize(node.nodeName || 'Dom');\n\n // Make sure that gradients are adopted correctly\n if (className === 'LinearGradient' || className === 'RadialGradient') {\n className = 'Gradient';\n\n // Fallback to Dom if element is not known\n } else if (!elements[className]) {\n className = 'Dom';\n }\n return new elements[className](node);\n}\nlet adopter = adopt;\nfunction mockAdopt(mock = adopt) {\n adopter = mock;\n}\nfunction register(element, name = element.name, asRoot = false) {\n elements[name] = element;\n if (asRoot) elements[root] = element;\n addMethodNames(Object.getOwnPropertyNames(element.prototype));\n return element;\n}\nfunction getClass(name) {\n return elements[name];\n}\n\n// Element id sequence\nlet did = 1000;\n\n// Get next named element id\nfunction eid(name) {\n return 'Svgjs' + capitalize(name) + did++;\n}\n\n// Deep new id assignment\nfunction assignNewId(node) {\n // do the same for SVG child nodes as well\n for (let i = node.children.length - 1; i >= 0; i--) {\n assignNewId(node.children[i]);\n }\n if (node.id) {\n node.id = eid(node.nodeName);\n return node;\n }\n return node;\n}\n\n// Method for extending objects\nfunction extend(modules, methods) {\n let key, i;\n modules = Array.isArray(modules) ? modules : [modules];\n for (i = modules.length - 1; i >= 0; i--) {\n for (key in methods) {\n modules[i].prototype[key] = methods[key];\n }\n }\n}\nfunction wrapWithAttrCheck(fn) {\n return function (...args) {\n const o = args[args.length - 1];\n if (o && o.constructor === Object && !(o instanceof Array)) {\n return fn.apply(this, args.slice(0, -1)).attr(o);\n } else {\n return fn.apply(this, args);\n }\n };\n}\n\n// Get all siblings, including myself\nfunction siblings() {\n return this.parent().children();\n}\n\n// Get the current position siblings\nfunction position() {\n return this.parent().index(this);\n}\n\n// Get the next element (will return null if there is none)\nfunction next() {\n return this.siblings()[this.position() + 1];\n}\n\n// Get the next element (will return null if there is none)\nfunction prev() {\n return this.siblings()[this.position() - 1];\n}\n\n// Send given element one step forward\nfunction forward() {\n const i = this.position();\n const p = this.parent();\n\n // move node one step forward\n p.add(this.remove(), i + 1);\n return this;\n}\n\n// Send given element one step backward\nfunction backward() {\n const i = this.position();\n const p = this.parent();\n p.add(this.remove(), i ? i - 1 : 0);\n return this;\n}\n\n// Send given element all the way to the front\nfunction front() {\n const p = this.parent();\n\n // Move node forward\n p.add(this.remove());\n return this;\n}\n\n// Send given element all the way to the back\nfunction back() {\n const p = this.parent();\n\n // Move node back\n p.add(this.remove(), 0);\n return this;\n}\n\n// Inserts a given element before the targeted element\nfunction before(element) {\n element = makeInstance(element);\n element.remove();\n const i = this.position();\n this.parent().add(element, i);\n return this;\n}\n\n// Inserts a given element after the targeted element\nfunction after(element) {\n element = makeInstance(element);\n element.remove();\n const i = this.position();\n this.parent().add(element, i + 1);\n return this;\n}\nfunction insertBefore(element) {\n element = makeInstance(element);\n element.before(this);\n return this;\n}\nfunction insertAfter(element) {\n element = makeInstance(element);\n element.after(this);\n return this;\n}\nregisterMethods('Dom', {\n siblings,\n position,\n next,\n prev,\n forward,\n backward,\n front,\n back,\n before,\n after,\n insertBefore,\n insertAfter\n});\n\n// Parse unit value\nconst numberAndUnit = /^([+-]?(\\d+(\\.\\d*)?|\\.\\d+)(e[+-]?\\d+)?)([a-z%]*)$/i;\n\n// Parse hex value\nconst hex = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i;\n\n// Parse rgb value\nconst rgb = /rgb\\((\\d+),(\\d+),(\\d+)\\)/;\n\n// Parse reference id\nconst reference = /(#[a-z_][a-z0-9\\-_]*)/i;\n\n// splits a transformation chain\nconst transforms = /\\)\\s*,?\\s*/;\n\n// Whitespace\nconst whitespace = /\\s/g;\n\n// Test hex value\nconst isHex = /^#[a-f0-9]{3}$|^#[a-f0-9]{6}$/i;\n\n// Test rgb value\nconst isRgb = /^rgb\\(/;\n\n// Test for blank string\nconst isBlank = /^(\\s+)?$/;\n\n// Test for numeric string\nconst isNumber = /^[+-]?(\\d+(\\.\\d*)?|\\.\\d+)(e[+-]?\\d+)?$/i;\n\n// Test for image url\nconst isImage = /\\.(jpg|jpeg|png|gif|svg)(\\?[^=]+.*)?/i;\n\n// split at whitespace and comma\nconst delimiter = /[\\s,]+/;\n\n// Test for path letter\nconst isPathLetter = /[MLHVCSQTAZ]/i;\n\nvar regex = {\n __proto__: null,\n delimiter: delimiter,\n hex: hex,\n isBlank: isBlank,\n isHex: isHex,\n isImage: isImage,\n isNumber: isNumber,\n isPathLetter: isPathLetter,\n isRgb: isRgb,\n numberAndUnit: numberAndUnit,\n reference: reference,\n rgb: rgb,\n transforms: transforms,\n whitespace: whitespace\n};\n\n// Return array of classes on the node\nfunction classes() {\n const attr = this.attr('class');\n return attr == null ? [] : attr.trim().split(delimiter);\n}\n\n// Return true if class exists on the node, false otherwise\nfunction hasClass(name) {\n return this.classes().indexOf(name) !== -1;\n}\n\n// Add class to the node\nfunction addClass(name) {\n if (!this.hasClass(name)) {\n const array = this.classes();\n array.push(name);\n this.attr('class', array.join(' '));\n }\n return this;\n}\n\n// Remove class from the node\nfunction removeClass(name) {\n if (this.hasClass(name)) {\n this.attr('class', this.classes().filter(function (c) {\n return c !== name;\n }).join(' '));\n }\n return this;\n}\n\n// Toggle the presence of a class on the node\nfunction toggleClass(name) {\n return this.hasClass(name) ? this.removeClass(name) : this.addClass(name);\n}\nregisterMethods('Dom', {\n classes,\n hasClass,\n addClass,\n removeClass,\n toggleClass\n});\n\n// Dynamic style generator\nfunction css(style, val) {\n const ret = {};\n if (arguments.length === 0) {\n // get full style as object\n this.node.style.cssText.split(/\\s*;\\s*/).filter(function (el) {\n return !!el.length;\n }).forEach(function (el) {\n const t = el.split(/\\s*:\\s*/);\n ret[t[0]] = t[1];\n });\n return ret;\n }\n if (arguments.length < 2) {\n // get style properties as array\n if (Array.isArray(style)) {\n for (const name of style) {\n const cased = name;\n ret[name] = this.node.style.getPropertyValue(cased);\n }\n return ret;\n }\n\n // get style for property\n if (typeof style === 'string') {\n return this.node.style.getPropertyValue(style);\n }\n\n // set styles in object\n if (typeof style === 'object') {\n for (const name in style) {\n // set empty string if null/undefined/'' was given\n this.node.style.setProperty(name, style[name] == null || isBlank.test(style[name]) ? '' : style[name]);\n }\n }\n }\n\n // set style for property\n if (arguments.length === 2) {\n this.node.style.setProperty(style, val == null || isBlank.test(val) ? '' : val);\n }\n return this;\n}\n\n// Show element\nfunction show() {\n return this.css('display', '');\n}\n\n// Hide element\nfunction hide() {\n return this.css('display', 'none');\n}\n\n// Is element visible?\nfunction visible() {\n return this.css('display') !== 'none';\n}\nregisterMethods('Dom', {\n css,\n show,\n hide,\n visible\n});\n\n// Store data values on svg nodes\nfunction data(a, v, r) {\n if (a == null) {\n // get an object of attributes\n return this.data(map(filter(this.node.attributes, el => el.nodeName.indexOf('data-') === 0), el => el.nodeName.slice(5)));\n } else if (a instanceof Array) {\n const data = {};\n for (const key of a) {\n data[key] = this.data(key);\n }\n return data;\n } else if (typeof a === 'object') {\n for (v in a) {\n this.data(v, a[v]);\n }\n } else if (arguments.length < 2) {\n try {\n return JSON.parse(this.attr('data-' + a));\n } catch (e) {\n return this.attr('data-' + a);\n }\n } else {\n this.attr('data-' + a, v === null ? null : r === true || typeof v === 'string' || typeof v === 'number' ? v : JSON.stringify(v));\n }\n return this;\n}\nregisterMethods('Dom', {\n data\n});\n\n// Remember arbitrary data\nfunction remember(k, v) {\n // remember every item in an object individually\n if (typeof arguments[0] === 'object') {\n for (const key in k) {\n this.remember(key, k[key]);\n }\n } else if (arguments.length === 1) {\n // retrieve memory\n return this.memory()[k];\n } else {\n // store memory\n this.memory()[k] = v;\n }\n return this;\n}\n\n// Erase a given memory\nfunction forget() {\n if (arguments.length === 0) {\n this._memory = {};\n } else {\n for (let i = arguments.length - 1; i >= 0; i--) {\n delete this.memory()[arguments[i]];\n }\n }\n return this;\n}\n\n// This triggers creation of a new hidden class which is not performant\n// However, this function is not rarely used so it will not happen frequently\n// Return local memory object\nfunction memory() {\n return this._memory = this._memory || {};\n}\nregisterMethods('Dom', {\n remember,\n forget,\n memory\n});\n\nfunction sixDigitHex(hex) {\n return hex.length === 4 ? ['#', hex.substring(1, 2), hex.substring(1, 2), hex.substring(2, 3), hex.substring(2, 3), hex.substring(3, 4), hex.substring(3, 4)].join('') : hex;\n}\nfunction componentHex(component) {\n const integer = Math.round(component);\n const bounded = Math.max(0, Math.min(255, integer));\n const hex = bounded.toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n}\nfunction is(object, space) {\n for (let i = space.length; i--;) {\n if (object[space[i]] == null) {\n return false;\n }\n }\n return true;\n}\nfunction getParameters(a, b) {\n const params = is(a, 'rgb') ? {\n _a: a.r,\n _b: a.g,\n _c: a.b,\n _d: 0,\n space: 'rgb'\n } : is(a, 'xyz') ? {\n _a: a.x,\n _b: a.y,\n _c: a.z,\n _d: 0,\n space: 'xyz'\n } : is(a, 'hsl') ? {\n _a: a.h,\n _b: a.s,\n _c: a.l,\n _d: 0,\n space: 'hsl'\n } : is(a, 'lab') ? {\n _a: a.l,\n _b: a.a,\n _c: a.b,\n _d: 0,\n space: 'lab'\n } : is(a, 'lch') ? {\n _a: a.l,\n _b: a.c,\n _c: a.h,\n _d: 0,\n space: 'lch'\n } : is(a, 'cmyk') ? {\n _a: a.c,\n _b: a.m,\n _c: a.y,\n _d: a.k,\n space: 'cmyk'\n } : {\n _a: 0,\n _b: 0,\n _c: 0,\n space: 'rgb'\n };\n params.space = b || params.space;\n return params;\n}\nfunction cieSpace(space) {\n if (space === 'lab' || space === 'xyz' || space === 'lch') {\n return true;\n } else {\n return false;\n }\n}\nfunction hueToRgb(p, q, t) {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n}\nclass Color {\n constructor(...inputs) {\n this.init(...inputs);\n }\n\n // Test if given value is a color\n static isColor(color) {\n return color && (color instanceof Color || this.isRgb(color) || this.test(color));\n }\n\n // Test if given value is an rgb object\n static isRgb(color) {\n return color && typeof color.r === 'number' && typeof color.g === 'number' && typeof color.b === 'number';\n }\n\n /*\n Generating random colors\n */\n static random(mode = 'vibrant', t) {\n // Get the math modules\n const {\n random,\n round,\n sin,\n PI: pi\n } = Math;\n\n // Run the correct generator\n if (mode === 'vibrant') {\n const l = (81 - 57) * random() + 57;\n const c = (83 - 45) * random() + 45;\n const h = 360 * random();\n const color = new Color(l, c, h, 'lch');\n return color;\n } else if (mode === 'sine') {\n t = t == null ? random() : t;\n const r = round(80 * sin(2 * pi * t / 0.5 + 0.01) + 150);\n const g = round(50 * sin(2 * pi * t / 0.5 + 4.6) + 200);\n const b = round(100 * sin(2 * pi * t / 0.5 + 2.3) + 150);\n const color = new Color(r, g, b);\n return color;\n } else if (mode === 'pastel') {\n const l = (94 - 86) * random() + 86;\n const c = (26 - 9) * random() + 9;\n const h = 360 * random();\n const color = new Color(l, c, h, 'lch');\n return color;\n } else if (mode === 'dark') {\n const l = 10 + 10 * random();\n const c = (125 - 75) * random() + 86;\n const h = 360 * random();\n const color = new Color(l, c, h, 'lch');\n return color;\n } else if (mode === 'rgb') {\n const r = 255 * random();\n const g = 255 * random();\n const b = 255 * random();\n const color = new Color(r, g, b);\n return color;\n } else if (mode === 'lab') {\n const l = 100 * random();\n const a = 256 * random() - 128;\n const b = 256 * random() - 128;\n const color = new Color(l, a, b, 'lab');\n return color;\n } else if (mode === 'grey') {\n const grey = 255 * random();\n const color = new Color(grey, grey, grey);\n return color;\n } else {\n throw new Error('Unsupported random color mode');\n }\n }\n\n // Test if given value is a color string\n static test(color) {\n return typeof color === 'string' && (isHex.test(color) || isRgb.test(color));\n }\n cmyk() {\n // Get the rgb values for the current color\n const {\n _a,\n _b,\n _c\n } = this.rgb();\n const [r, g, b] = [_a, _b, _c].map(v => v / 255);\n\n // Get the cmyk values in an unbounded format\n const k = Math.min(1 - r, 1 - g, 1 - b);\n if (k === 1) {\n // Catch the black case\n return new Color(0, 0, 0, 1, 'cmyk');\n }\n const c = (1 - r - k) / (1 - k);\n const m = (1 - g - k) / (1 - k);\n const y = (1 - b - k) / (1 - k);\n\n // Construct the new color\n const color = new Color(c, m, y, k, 'cmyk');\n return color;\n }\n hsl() {\n // Get the rgb values\n const {\n _a,\n _b,\n _c\n } = this.rgb();\n const [r, g, b] = [_a, _b, _c].map(v => v / 255);\n\n // Find the maximum and minimum values to get the lightness\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n\n // If the r, g, v values are identical then we are grey\n const isGrey = max === min;\n\n // Calculate the hue and saturation\n const delta = max - min;\n const s = isGrey ? 0 : l > 0.5 ? delta / (2 - max - min) : delta / (max + min);\n const h = isGrey ? 0 : max === r ? ((g - b) / delta + (g < b ? 6 : 0)) / 6 : max === g ? ((b - r) / delta + 2) / 6 : max === b ? ((r - g) / delta + 4) / 6 : 0;\n\n // Construct and return the new color\n const color = new Color(360 * h, 100 * s, 100 * l, 'hsl');\n return color;\n }\n init(a = 0, b = 0, c = 0, d = 0, space = 'rgb') {\n // This catches the case when a falsy value is passed like ''\n a = !a ? 0 : a;\n\n // Reset all values in case the init function is rerun with new color space\n if (this.space) {\n for (const component in this.space) {\n delete this[this.space[component]];\n }\n }\n if (typeof a === 'number') {\n // Allow for the case that we don't need d...\n space = typeof d === 'string' ? d : space;\n d = typeof d === 'string' ? 0 : d;\n\n // Assign the values straight to the color\n Object.assign(this, {\n _a: a,\n _b: b,\n _c: c,\n _d: d,\n space\n });\n // If the user gave us an array, make the color from it\n } else if (a instanceof Array) {\n this.space = b || (typeof a[3] === 'string' ? a[3] : a[4]) || 'rgb';\n Object.assign(this, {\n _a: a[0],\n _b: a[1],\n _c: a[2],\n _d: a[3] || 0\n });\n } else if (a instanceof Object) {\n // Set the object up and assign its values directly\n const values = getParameters(a, b);\n Object.assign(this, values);\n } else if (typeof a === 'string') {\n if (isRgb.test(a)) {\n const noWhitespace = a.replace(whitespace, '');\n const [_a, _b, _c] = rgb.exec(noWhitespace).slice(1, 4).map(v => parseInt(v));\n Object.assign(this, {\n _a,\n _b,\n _c,\n _d: 0,\n space: 'rgb'\n });\n } else if (isHex.test(a)) {\n const hexParse = v => parseInt(v, 16);\n const [, _a, _b, _c] = hex.exec(sixDigitHex(a)).map(hexParse);\n Object.assign(this, {\n _a,\n _b,\n _c,\n _d: 0,\n space: 'rgb'\n });\n } else throw Error(\"Unsupported string format, can't construct Color\");\n }\n\n // Now add the components as a convenience\n const {\n _a,\n _b,\n _c,\n _d\n } = this;\n const components = this.space === 'rgb' ? {\n r: _a,\n g: _b,\n b: _c\n } : this.space === 'xyz' ? {\n x: _a,\n y: _b,\n z: _c\n } : this.space === 'hsl' ? {\n h: _a,\n s: _b,\n l: _c\n } : this.space === 'lab' ? {\n l: _a,\n a: _b,\n b: _c\n } : this.space === 'lch' ? {\n l: _a,\n c: _b,\n h: _c\n } : this.space === 'cmyk' ? {\n c: _a,\n m: _b,\n y: _c,\n k: _d\n } : {};\n Object.assign(this, components);\n }\n lab() {\n // Get the xyz color\n const {\n x,\n y,\n z\n } = this.xyz();\n\n // Get the lab components\n const l = 116 * y - 16;\n const a = 500 * (x - y);\n const b = 200 * (y - z);\n\n // Construct and return a new color\n const color = new Color(l, a, b, 'lab');\n return color;\n }\n lch() {\n // Get the lab color directly\n const {\n l,\n a,\n b\n } = this.lab();\n\n // Get the chromaticity and the hue using polar coordinates\n const c = Math.sqrt(a ** 2 + b ** 2);\n let h = 180 * Math.atan2(b, a) / Math.PI;\n if (h < 0) {\n h *= -1;\n h = 360 - h;\n }\n\n // Make a new color and return it\n const color = new Color(l, c, h, 'lch');\n return color;\n }\n /*\n Conversion Methods\n */\n\n rgb() {\n if (this.space === 'rgb') {\n return this;\n } else if (cieSpace(this.space)) {\n // Convert to the xyz color space\n let {\n x,\n y,\n z\n } = this;\n if (this.space === 'lab' || this.space === 'lch') {\n // Get the values in the lab space\n let {\n l,\n a,\n b\n } = this;\n if (this.space === 'lch') {\n const {\n c,\n h\n } = this;\n const dToR = Math.PI / 180;\n a = c * Math.cos(dToR * h);\n b = c * Math.sin(dToR * h);\n }\n\n // Undo the nonlinear function\n const yL = (l + 16) / 116;\n const xL = a / 500 + yL;\n const zL = yL - b / 200;\n\n // Get the xyz values\n const ct = 16 / 116;\n const mx = 0.008856;\n const nm = 7.787;\n x = 0.95047 * (xL ** 3 > mx ? xL ** 3 : (xL - ct) / nm);\n y = 1.0 * (yL ** 3 > mx ? yL ** 3 : (yL - ct) / nm);\n z = 1.08883 * (zL ** 3 > mx ? zL ** 3 : (zL - ct) / nm);\n }\n\n // Convert xyz to unbounded rgb values\n const rU = x * 3.2406 + y * -1.5372 + z * -0.4986;\n const gU = x * -0.9689 + y * 1.8758 + z * 0.0415;\n const bU = x * 0.0557 + y * -0.204 + z * 1.057;\n\n // Convert the values to true rgb values\n const pow = Math.pow;\n const bd = 0.0031308;\n const r = rU > bd ? 1.055 * pow(rU, 1 / 2.4) - 0.055 : 12.92 * rU;\n const g = gU > bd ? 1.055 * pow(gU, 1 / 2.4) - 0.055 : 12.92 * gU;\n const b = bU > bd ? 1.055 * pow(bU, 1 / 2.4) - 0.055 : 12.92 * bU;\n\n // Make and return the color\n const color = new Color(255 * r, 255 * g, 255 * b);\n return color;\n } else if (this.space === 'hsl') {\n // https://bgrins.github.io/TinyColor/docs/tinycolor.html\n // Get the current hsl values\n let {\n h,\n s,\n l\n } = this;\n h /= 360;\n s /= 100;\n l /= 100;\n\n // If we are grey, then just make the color directly\n if (s === 0) {\n l *= 255;\n const color = new Color(l, l, l);\n return color;\n }\n\n // TODO I have no idea what this does :D If you figure it out, tell me!\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n\n // Get the rgb values\n const r = 255 * hueToRgb(p, q, h + 1 / 3);\n const g = 255 * hueToRgb(p, q, h);\n const b = 255 * hueToRgb(p, q, h - 1 / 3);\n\n // Make a new color\n const color = new Color(r, g, b);\n return color;\n } else if (this.space === 'cmyk') {\n // https://gist.github.com/felipesabino/5066336\n // Get the normalised cmyk values\n const {\n c,\n m,\n y,\n k\n } = this;\n\n // Get the rgb values\n const r = 255 * (1 - Math.min(1, c * (1 - k) + k));\n const g = 255 * (1 - Math.min(1, m * (1 - k) + k));\n const b = 255 * (1 - Math.min(1, y * (1 - k) + k));\n\n // Form the color and return it\n const color = new Color(r, g, b);\n return color;\n } else {\n return this;\n }\n }\n toArray() {\n const {\n _a,\n _b,\n _c,\n _d,\n space\n } = this;\n return [_a, _b, _c, _d, space];\n }\n toHex() {\n const [r, g, b] = this._clamped().map(componentHex);\n return `#${r}${g}${b}`;\n }\n toRgb() {\n const [rV, gV, bV] = this._clamped();\n const string = `rgb(${rV},${gV},${bV})`;\n return string;\n }\n toString() {\n return this.toHex();\n }\n xyz() {\n // Normalise the red, green and blue values\n const {\n _a: r255,\n _b: g255,\n _c: b255\n } = this.rgb();\n const [r, g, b] = [r255, g255, b255].map(v => v / 255);\n\n // Convert to the lab rgb space\n const rL = r > 0.04045 ? Math.pow((r + 0.055) / 1.055, 2.4) : r / 12.92;\n const gL = g > 0.04045 ? Math.pow((g + 0.055) / 1.055, 2.4) : g / 12.92;\n const bL = b > 0.04045 ? Math.pow((b + 0.055) / 1.055, 2.4) : b / 12.92;\n\n // Convert to the xyz color space without bounding the values\n const xU = (rL * 0.4124 + gL * 0.3576 + bL * 0.1805) / 0.95047;\n const yU = (rL * 0.2126 + gL * 0.7152 + bL * 0.0722) / 1.0;\n const zU = (rL * 0.0193 + gL * 0.1192 + bL * 0.9505) / 1.08883;\n\n // Get the proper xyz values by applying the bounding\n const x = xU > 0.008856 ? Math.pow(xU, 1 / 3) : 7.787 * xU + 16 / 116;\n const y = yU > 0.008856 ? Math.pow(yU, 1 / 3) : 7.787 * yU + 16 / 116;\n const z = zU > 0.008856 ? Math.pow(zU, 1 / 3) : 7.787 * zU + 16 / 116;\n\n // Make and return the color\n const color = new Color(x, y, z, 'xyz');\n return color;\n }\n\n /*\n Input and Output methods\n */\n\n _clamped() {\n const {\n _a,\n _b,\n _c\n } = this.rgb();\n const {\n max,\n min,\n round\n } = Math;\n const format = v => max(0, min(round(v), 255));\n return [_a, _b, _c].map(format);\n }\n\n /*\n Constructing colors\n */\n}\n\nclass Point {\n // Initialize\n constructor(...args) {\n this.init(...args);\n }\n\n // Clone point\n clone() {\n return new Point(this);\n }\n init(x, y) {\n const base = {\n x: 0,\n y: 0\n };\n\n // ensure source as object\n const source = Array.isArray(x) ? {\n x: x[0],\n y: x[1]\n } : typeof x === 'object' ? {\n x: x.x,\n y: x.y\n } : {\n x: x,\n y: y\n };\n\n // merge source\n this.x = source.x == null ? base.x : source.x;\n this.y = source.y == null ? base.y : source.y;\n return this;\n }\n toArray() {\n return [this.x, this.y];\n }\n transform(m) {\n return this.clone().transformO(m);\n }\n\n // Transform point with matrix\n transformO(m) {\n if (!Matrix.isMatrixLike(m)) {\n m = new Matrix(m);\n }\n const {\n x,\n y\n } = this;\n\n // Perform the matrix multiplication\n this.x = m.a * x + m.c * y + m.e;\n this.y = m.b * x + m.d * y + m.f;\n return this;\n }\n}\nfunction point(x, y) {\n return new Point(x, y).transformO(this.screenCTM().inverseO());\n}\n\nfunction closeEnough(a, b, threshold) {\n return Math.abs(b - a) < (1e-6);\n}\nclass Matrix {\n constructor(...args) {\n this.init(...args);\n }\n static formatTransforms(o) {\n // Get all of the parameters required to form the matrix\n const flipBoth = o.flip === 'both' || o.flip === true;\n const flipX = o.flip && (flipBoth || o.flip === 'x') ? -1 : 1;\n const flipY = o.flip && (flipBoth || o.flip === 'y') ? -1 : 1;\n const skewX = o.skew && o.skew.length ? o.skew[0] : isFinite(o.skew) ? o.skew : isFinite(o.skewX) ? o.skewX : 0;\n const skewY = o.skew && o.skew.length ? o.skew[1] : isFinite(o.skew) ? o.skew : isFinite(o.skewY) ? o.skewY : 0;\n const scaleX = o.scale && o.scale.length ? o.scale[0] * flipX : isFinite(o.scale) ? o.scale * flipX : isFinite(o.scaleX) ? o.scaleX * flipX : flipX;\n const scaleY = o.scale && o.scale.length ? o.scale[1] * flipY : isFinite(o.scale) ? o.scale * flipY : isFinite(o.scaleY) ? o.scaleY * flipY : flipY;\n const shear = o.shear || 0;\n const theta = o.rotate || o.theta || 0;\n const origin = new Point(o.origin || o.around || o.ox || o.originX, o.oy || o.originY);\n const ox = origin.x;\n const oy = origin.y;\n // We need Point to be invalid if nothing was passed because we cannot default to 0 here. That is why NaN\n const position = new Point(o.position || o.px || o.positionX || NaN, o.py || o.positionY || NaN);\n const px = position.x;\n const py = position.y;\n const translate = new Point(o.translate || o.tx || o.translateX, o.ty || o.translateY);\n const tx = translate.x;\n const ty = translate.y;\n const relative = new Point(o.relative || o.rx || o.relativeX, o.ry || o.relativeY);\n const rx = relative.x;\n const ry = relative.y;\n\n // Populate all of the values\n return {\n scaleX,\n scaleY,\n skewX,\n skewY,\n shear,\n theta,\n rx,\n ry,\n tx,\n ty,\n ox,\n oy,\n px,\n py\n };\n }\n static fromArray(a) {\n return {\n a: a[0],\n b: a[1],\n c: a[2],\n d: a[3],\n e: a[4],\n f: a[5]\n };\n }\n static isMatrixLike(o) {\n return o.a != null || o.b != null || o.c != null || o.d != null || o.e != null || o.f != null;\n }\n\n // left matrix, right matrix, target matrix which is overwritten\n static matrixMultiply(l, r, o) {\n // Work out the product directly\n const a = l.a * r.a + l.c * r.b;\n const b = l.b * r.a + l.d * r.b;\n const c = l.a * r.c + l.c * r.d;\n const d = l.b * r.c + l.d * r.d;\n const e = l.e + l.a * r.e + l.c * r.f;\n const f = l.f + l.b * r.e + l.d * r.f;\n\n // make sure to use local variables because l/r and o could be the same\n o.a = a;\n o.b = b;\n o.c = c;\n o.d = d;\n o.e = e;\n o.f = f;\n return o;\n }\n around(cx, cy, matrix) {\n return this.clone().aroundO(cx, cy, matrix);\n }\n\n // Transform around a center point\n aroundO(cx, cy, matrix) {\n const dx = cx || 0;\n const dy = cy || 0;\n return this.translateO(-dx, -dy).lmultiplyO(matrix).translateO(dx, dy);\n }\n\n // Clones this matrix\n clone() {\n return new Matrix(this);\n }\n\n // Decomposes this matrix into its affine parameters\n decompose(cx = 0, cy = 0) {\n // Get the parameters from the matrix\n const a = this.a;\n const b = this.b;\n const c = this.c;\n const d = this.d;\n const e = this.e;\n const f = this.f;\n\n // Figure out if the winding direction is clockwise or counterclockwise\n const determinant = a * d - b * c;\n const ccw = determinant > 0 ? 1 : -1;\n\n // Since we only shear in x, we can use the x basis to get the x scale\n // and the rotation of the resulting matrix\n const sx = ccw * Math.sqrt(a * a + b * b);\n const thetaRad = Math.atan2(ccw * b, ccw * a);\n const theta = 180 / Math.PI * thetaRad;\n const ct = Math.cos(thetaRad);\n const st = Math.sin(thetaRad);\n\n // We can then solve the y basis vector simultaneously to get the other\n // two affine parameters directly from these parameters\n const lam = (a * c + b * d) / determinant;\n const sy = c * sx / (lam * a - b) || d * sx / (lam * b + a);\n\n // Use the translations\n const tx = e - cx + cx * ct * sx + cy * (lam * ct * sx - st * sy);\n const ty = f - cy + cx * st * sx + cy * (lam * st * sx + ct * sy);\n\n // Construct the decomposition and return it\n return {\n // Return the affine parameters\n scaleX: sx,\n scaleY: sy,\n shear: lam,\n rotate: theta,\n translateX: tx,\n translateY: ty,\n originX: cx,\n originY: cy,\n // Return the matrix parameters\n a: this.a,\n b: this.b,\n c: this.c,\n d: this.d,\n e: this.e,\n f: this.f\n };\n }\n\n // Check if two matrices are equal\n equals(other) {\n if (other === this) return true;\n const comp = new Matrix(other);\n return closeEnough(this.a, comp.a) && closeEnough(this.b, comp.b) && closeEnough(this.c, comp.c) && closeEnough(this.d, comp.d) && closeEnough(this.e, comp.e) && closeEnough(this.f, comp.f);\n }\n\n // Flip matrix on x or y, at a given offset\n flip(axis, around) {\n return this.clone().flipO(axis, around);\n }\n flipO(axis, around) {\n return axis === 'x' ? this.scaleO(-1, 1, around, 0) : axis === 'y' ? this.scaleO(1, -1, 0, around) : this.scaleO(-1, -1, axis, around || axis); // Define an x, y flip point\n }\n\n // Initialize\n init(source) {\n const base = Matrix.fromArray([1, 0, 0, 1, 0, 0]);\n\n // ensure source as object\n source = source instanceof Element ? source.matrixify() : typeof source === 'string' ? Matrix.fromArray(source.split(delimiter).map(parseFloat)) : Array.isArray(source) ? Matrix.fromArray(source) : typeof source === 'object' && Matrix.isMatrixLike(source) ? source : typeof source === 'object' ? new Matrix().transform(source) : arguments.length === 6 ? Matrix.fromArray([].slice.call(arguments)) : base;\n\n // Merge the source matrix with the base matrix\n this.a = source.a != null ? source.a : base.a;\n this.b = source.b != null ? source.b : base.b;\n this.c = source.c != null ? source.c : base.c;\n this.d = source.d != null ? source.d : base.d;\n this.e = source.e != null ? source.e : base.e;\n this.f = source.f != null ? source.f : base.f;\n return this;\n }\n inverse() {\n return this.clone().inverseO();\n }\n\n // Inverses matrix\n inverseO() {\n // Get the current parameters out of the matrix\n const a = this.a;\n const b = this.b;\n const c = this.c;\n const d = this.d;\n const e = this.e;\n const f = this.f;\n\n // Invert the 2x2 matrix in the top left\n const det = a * d - b * c;\n if (!det) throw new Error('Cannot invert ' + this);\n\n // Calculate the top 2x2 matrix\n const na = d / det;\n const nb = -b / det;\n const nc = -c / det;\n const nd = a / det;\n\n // Apply the inverted matrix to the top right\n const ne = -(na * e + nc * f);\n const nf = -(nb * e + nd * f);\n\n // Construct the inverted matrix\n this.a = na;\n this.b = nb;\n this.c = nc;\n this.d = nd;\n this.e = ne;\n this.f = nf;\n return this;\n }\n lmultiply(matrix) {\n return this.clone().lmultiplyO(matrix);\n }\n lmultiplyO(matrix) {\n const r = this;\n const l = matrix instanceof Matrix ? matrix : new Matrix(matrix);\n return Matrix.matrixMultiply(l, r, this);\n }\n\n // Left multiplies by the given matrix\n multiply(matrix) {\n return this.clone().multiplyO(matrix);\n }\n multiplyO(matrix) {\n // Get the matrices\n const l = this;\n const r = matrix instanceof Matrix ? matrix : new Matrix(matrix);\n return Matrix.matrixMultiply(l, r, this);\n }\n\n // Rotate matrix\n rotate(r, cx, cy) {\n return this.clone().rotateO(r, cx, cy);\n }\n rotateO(r, cx = 0, cy = 0) {\n // Convert degrees to radians\n r = radians(r);\n const cos = Math.cos(r);\n const sin = Math.sin(r);\n const {\n a,\n b,\n c,\n d,\n e,\n f\n } = this;\n this.a = a * cos - b * sin;\n this.b = b * cos + a * sin;\n this.c = c * cos - d * sin;\n this.d = d * cos + c * sin;\n this.e = e * cos - f * sin + cy * sin - cx * cos + cx;\n this.f = f * cos + e * sin - cx * sin - cy * cos + cy;\n return this;\n }\n\n // Scale matrix\n scale() {\n return this.clone().scaleO(...arguments);\n }\n scaleO(x, y = x, cx = 0, cy = 0) {\n // Support uniform scaling\n if (arguments.length === 3) {\n cy = cx;\n cx = y;\n y = x;\n }\n const {\n a,\n b,\n c,\n d,\n e,\n f\n } = this;\n this.a = a * x;\n this.b = b * y;\n this.c = c * x;\n this.d = d * y;\n this.e = e * x - cx * x + cx;\n this.f = f * y - cy * y + cy;\n return this;\n }\n\n // Shear matrix\n shear(a, cx, cy) {\n return this.clone().shearO(a, cx, cy);\n }\n\n // eslint-disable-next-line no-unused-vars\n shearO(lx, cx = 0, cy = 0) {\n const {\n a,\n b,\n c,\n d,\n e,\n f\n } = this;\n this.a = a + b * lx;\n this.c = c + d * lx;\n this.e = e + f * lx - cy * lx;\n return this;\n }\n\n // Skew Matrix\n skew() {\n return this.clone().skewO(...arguments);\n }\n skewO(x, y = x, cx = 0, cy = 0) {\n // support uniformal skew\n if (arguments.length === 3) {\n cy = cx;\n cx = y;\n y = x;\n }\n\n // Convert degrees to radians\n x = radians(x);\n y = radians(y);\n const lx = Math.tan(x);\n const ly = Math.tan(y);\n const {\n a,\n b,\n c,\n d,\n e,\n f\n } = this;\n this.a = a + b * lx;\n this.b = b + a * ly;\n this.c = c + d * lx;\n this.d = d + c * ly;\n this.e = e + f * lx - cy * lx;\n this.f = f + e * ly - cx * ly;\n return this;\n }\n\n // SkewX\n skewX(x, cx, cy) {\n return this.skew(x, 0, cx, cy);\n }\n\n // SkewY\n skewY(y, cx, cy) {\n return this.skew(0, y, cx, cy);\n }\n toArray() {\n return [this.a, this.b, this.c, this.d, this.e, this.f];\n }\n\n // Convert matrix to string\n toString() {\n return 'matrix(' + this.a + ',' + this.b + ',' + this.c + ',' + this.d + ',' + this.e + ',' + this.f + ')';\n }\n\n // Transform a matrix into another matrix by manipulating the space\n transform(o) {\n // Check if o is a matrix and then left multiply it directly\n if (Matrix.isMatrixLike(o)) {\n const matrix = new Matrix(o);\n return matrix.multiplyO(this);\n }\n\n // Get the proposed transformations and the current transformations\n const t = Matrix.formatTransforms(o);\n const current = this;\n const {\n x: ox,\n y: oy\n } = new Point(t.ox, t.oy).transform(current);\n\n // Construct the resulting matrix\n const transformer = new Matrix().translateO(t.rx, t.ry).lmultiplyO(current).translateO(-ox, -oy).scaleO(t.scaleX, t.scaleY).skewO(t.skewX, t.skewY).shearO(t.shear).rotateO(t.theta).translateO(ox, oy);\n\n // If we want the origin at a particular place, we force it there\n if (isFinite(t.px) || isFinite(t.py)) {\n const origin = new Point(ox, oy).transform(transformer);\n // TODO: Replace t.px with isFinite(t.px)\n // Doesn't work because t.px is also 0 if it wasn't passed\n const dx = isFinite(t.px) ? t.px - origin.x : 0;\n const dy = isFinite(t.py) ? t.py - origin.y : 0;\n transformer.translateO(dx, dy);\n }\n\n // Translate now after positioning\n transformer.translateO(t.tx, t.ty);\n return transformer;\n }\n\n // Translate matrix\n translate(x, y) {\n return this.clone().translateO(x, y);\n }\n translateO(x, y) {\n this.e += x || 0;\n this.f += y || 0;\n return this;\n }\n valueOf() {\n return {\n a: this.a,\n b: this.b,\n c: this.c,\n d: this.d,\n e: this.e,\n f: this.f\n };\n }\n}\nfunction ctm() {\n return new Matrix(this.node.getCTM());\n}\nfunction screenCTM() {\n try {\n /* https://bugzilla.mozilla.org/show_bug.cgi?id=1344537\n This is needed because FF does not return the transformation matrix\n for the inner coordinate system when getScreenCTM() is called on nested svgs.\n However all other Browsers do that */\n if (typeof this.isRoot === 'function' && !this.isRoot()) {\n const rect = this.rect(1, 1);\n const m = rect.node.getScreenCTM();\n rect.remove();\n return new Matrix(m);\n }\n return new Matrix(this.node.getScreenCTM());\n } catch (e) {\n console.warn(`Cannot get CTM from SVG node ${this.node.nodeName}. Is the element rendered?`);\n return new Matrix();\n }\n}\nregister(Matrix, 'Matrix');\n\nfunction parser() {\n // Reuse cached element if possible\n if (!parser.nodes) {\n const svg = makeInstance().size(2, 0);\n svg.node.style.cssText = ['opacity: 0', 'position: absolute', 'left: -100%', 'top: -100%', 'overflow: hidden'].join(';');\n svg.attr('focusable', 'false');\n svg.attr('aria-hidden', 'true');\n const path = svg.path().node;\n parser.nodes = {\n svg,\n path\n };\n }\n if (!parser.nodes.svg.node.parentNode) {\n const b = globals.document.body || globals.document.documentElement;\n parser.nodes.svg.addTo(b);\n }\n return parser.nodes;\n}\n\nfunction isNulledBox(box) {\n return !box.width && !box.height && !box.x && !box.y;\n}\nfunction domContains(node) {\n return node === globals.document || (globals.document.documentElement.contains || function (node) {\n // This is IE - it does not support contains() for top-level SVGs\n while (node.parentNode) {\n node = node.parentNode;\n }\n return node === globals.document;\n }).call(globals.document.documentElement, node);\n}\nclass Box {\n constructor(...args) {\n this.init(...args);\n }\n addOffset() {\n // offset by window scroll position, because getBoundingClientRect changes when window is scrolled\n this.x += globals.window.pageXOffset;\n this.y += globals.window.pageYOffset;\n return new Box(this);\n }\n init(source) {\n const base = [0, 0, 0, 0];\n source = typeof source === 'string' ? source.split(delimiter).map(parseFloat) : Array.isArray(source) ? source : typeof source === 'object' ? [source.left != null ? source.left : source.x, source.top != null ? source.top : source.y, source.width, source.height] : arguments.length === 4 ? [].slice.call(arguments) : base;\n this.x = source[0] || 0;\n this.y = source[1] || 0;\n this.width = this.w = source[2] || 0;\n this.height = this.h = source[3] || 0;\n\n // Add more bounding box properties\n this.x2 = this.x + this.w;\n this.y2 = this.y + this.h;\n this.cx = this.x + this.w / 2;\n this.cy = this.y + this.h / 2;\n return this;\n }\n isNulled() {\n return isNulledBox(this);\n }\n\n // Merge rect box with another, return a new instance\n merge(box) {\n const x = Math.min(this.x, box.x);\n const y = Math.min(this.y, box.y);\n const width = Math.max(this.x + this.width, box.x + box.width) - x;\n const height = Math.max(this.y + this.height, box.y + box.height) - y;\n return new Box(x, y, width, height);\n }\n toArray() {\n return [this.x, this.y, this.width, this.height];\n }\n toString() {\n return this.x + ' ' + this.y + ' ' + this.width + ' ' + this.height;\n }\n transform(m) {\n if (!(m instanceof Matrix)) {\n m = new Matrix(m);\n }\n let xMin = Infinity;\n let xMax = -Infinity;\n let yMin = Infinity;\n let yMax = -Infinity;\n const pts = [new Point(this.x, this.y), new Point(this.x2, this.y), new Point(this.x, this.y2), new Point(this.x2, this.y2)];\n pts.forEach(function (p) {\n p = p.transform(m);\n xMin = Math.min(xMin, p.x);\n xMax = Math.max(xMax, p.x);\n yMin = Math.min(yMin, p.y);\n yMax = Math.max(yMax, p.y);\n });\n return new Box(xMin, yMin, xMax - xMin, yMax - yMin);\n }\n}\nfunction getBox(el, getBBoxFn, retry) {\n let box;\n try {\n // Try to get the box with the provided function\n box = getBBoxFn(el.node);\n\n // If the box is worthless and not even in the dom, retry\n // by throwing an error here...\n if (isNulledBox(box) && !domContains(el.node)) {\n throw new Error('Element not in the dom');\n }\n } catch (e) {\n // ... and calling the retry handler here\n box = retry(el);\n }\n return box;\n}\nfunction bbox() {\n // Function to get bbox is getBBox()\n const getBBox = node => node.getBBox();\n\n // Take all measures so that a stupid browser renders the element\n // so we can get the bbox from it when we try again\n const retry = el => {\n try {\n const clone = el.clone().addTo(parser().svg).show();\n const box = clone.node.getBBox();\n clone.remove();\n return box;\n } catch (e) {\n // We give up...\n throw new Error(`Getting bbox of element \"${el.node.nodeName}\" is not possible: ${e.toString()}`);\n }\n };\n const box = getBox(this, getBBox, retry);\n const bbox = new Box(box);\n return bbox;\n}\nfunction rbox(el) {\n const getRBox = node => node.getBoundingClientRect();\n const retry = el => {\n // There is no point in trying tricks here because if we insert the element into the dom ourselves\n // it obviously will be at the wrong position\n throw new Error(`Getting rbox of element \"${el.node.nodeName}\" is not possible`);\n };\n const box = getBox(this, getRBox, retry);\n const rbox = new Box(box);\n\n // If an element was passed, we want the bbox in the coordinate system of that element\n if (el) {\n return rbox.transform(el.screenCTM().inverseO());\n }\n\n // Else we want it in absolute screen coordinates\n // Therefore we need to add the scrollOffset\n return rbox.addOffset();\n}\n\n// Checks whether the given point is inside the bounding box\nfunction inside(x, y) {\n const box = this.bbox();\n return x > box.x && y > box.y && x < box.x + box.width && y < box.y + box.height;\n}\nregisterMethods({\n viewbox: {\n viewbox(x, y, width, height) {\n // act as getter\n if (x == null) return new Box(this.attr('viewBox'));\n\n // act as setter\n return this.attr('viewBox', new Box(x, y, width, height));\n },\n zoom(level, point) {\n // Its best to rely on the attributes here and here is why:\n // clientXYZ: Doesn't work on non-root svgs because they dont have a CSSBox (silly!)\n // getBoundingClientRect: Doesn't work because Chrome just ignores width and height of nested svgs completely\n // that means, their clientRect is always as big as the content.\n // Furthermore this size is incorrect if the element is further transformed by its parents\n // computedStyle: Only returns meaningful values if css was used with px. We dont go this route here!\n // getBBox: returns the bounding box of its content - that doesn't help!\n let {\n width,\n height\n } = this.attr(['width', 'height']);\n\n // Width and height is a string when a number with a unit is present which we can't use\n // So we try clientXYZ\n if (!width && !height || typeof width === 'string' || typeof height === 'string') {\n width = this.node.clientWidth;\n height = this.node.clientHeight;\n }\n\n // Giving up...\n if (!width || !height) {\n throw new Error('Impossible to get absolute width and height. Please provide an absolute width and height attribute on the zooming element');\n }\n const v = this.viewbox();\n const zoomX = width / v.width;\n const zoomY = height / v.height;\n const zoom = Math.min(zoomX, zoomY);\n if (level == null) {\n return zoom;\n }\n let zoomAmount = zoom / level;\n\n // Set the zoomAmount to the highest value which is safe to process and recover from\n // The * 100 is a bit of wiggle room for the matrix transformation\n if (zoomAmount === Infinity) zoomAmount = Number.MAX_SAFE_INTEGER / 100;\n point = point || new Point(width / 2 / zoomX + v.x, height / 2 / zoomY + v.y);\n const box = new Box(v).transform(new Matrix({\n scale: zoomAmount,\n origin: point\n }));\n return this.viewbox(box);\n }\n }\n});\nregister(Box, 'Box');\n\n// import { subClassArray } from './ArrayPolyfill.js'\n\nclass List extends Array {\n constructor(arr = [], ...args) {\n super(arr, ...args);\n if (typeof arr === 'number') return this;\n this.length = 0;\n this.push(...arr);\n }\n}\nextend([List], {\n each(fnOrMethodName, ...args) {\n if (typeof fnOrMethodName === 'function') {\n return this.map((el, i, arr) => {\n return fnOrMethodName.call(el, el, i, arr);\n });\n } else {\n return this.map(el => {\n return el[fnOrMethodName](...args);\n });\n }\n },\n toArray() {\n return Array.prototype.concat.apply([], this);\n }\n});\nconst reserved = ['toArray', 'constructor', 'each'];\nList.extend = function (methods) {\n methods = methods.reduce((obj, name) => {\n // Don't overwrite own methods\n if (reserved.includes(name)) return obj;\n\n // Don't add private methods\n if (name[0] === '_') return obj;\n\n // Allow access to original Array methods through a prefix\n if (name in Array.prototype) {\n obj['$' + name] = Array.prototype[name];\n }\n\n // Relay every call to each()\n obj[name] = function (...attrs) {\n return this.each(name, ...attrs);\n };\n return obj;\n }, {});\n extend([List], methods);\n};\n\nfunction baseFind(query, parent) {\n return new List(map((parent || globals.document).querySelectorAll(query), function (node) {\n return adopt(node);\n }));\n}\n\n// Scoped find method\nfunction find(query) {\n return baseFind(query, this.node);\n}\nfunction findOne(query) {\n return adopt(this.node.querySelector(query));\n}\n\nlet listenerId = 0;\nconst windowEvents = {};\nfunction getEvents(instance) {\n let n = instance.getEventHolder();\n\n // We dont want to save events in global space\n if (n === globals.window) n = windowEvents;\n if (!n.events) n.events = {};\n return n.events;\n}\nfunction getEventTarget(instance) {\n return instance.getEventTarget();\n}\nfunction clearEvents(instance) {\n let n = instance.getEventHolder();\n if (n === globals.window) n = windowEvents;\n if (n.events) n.events = {};\n}\n\n// Add event binder in the SVG namespace\nfunction on(node, events, listener, binding, options) {\n const l = listener.bind(binding || node);\n const instance = makeInstance(node);\n const bag = getEvents(instance);\n const n = getEventTarget(instance);\n\n // events can be an array of events or a string of events\n events = Array.isArray(events) ? events : events.split(delimiter);\n\n // add id to listener\n if (!listener._svgjsListenerId) {\n listener._svgjsListenerId = ++listenerId;\n }\n events.forEach(function (event) {\n const ev = event.split('.')[0];\n const ns = event.split('.')[1] || '*';\n\n // ensure valid object\n bag[ev] = bag[ev] || {};\n bag[ev][ns] = bag[ev][ns] || {};\n\n // reference listener\n bag[ev][ns][listener._svgjsListenerId] = l;\n\n // add listener\n n.addEventListener(ev, l, options || false);\n });\n}\n\n// Add event unbinder in the SVG namespace\nfunction off(node, events, listener, options) {\n const instance = makeInstance(node);\n const bag = getEvents(instance);\n const n = getEventTarget(instance);\n\n // listener can be a function or a number\n if (typeof listener === 'function') {\n listener = listener._svgjsListenerId;\n if (!listener) return;\n }\n\n // events can be an array of events or a string or undefined\n events = Array.isArray(events) ? events : (events || '').split(delimiter);\n events.forEach(function (event) {\n const ev = event && event.split('.')[0];\n const ns = event && event.split('.')[1];\n let namespace, l;\n if (listener) {\n // remove listener reference\n if (bag[ev] && bag[ev][ns || '*']) {\n // removeListener\n n.removeEventListener(ev, bag[ev][ns || '*'][listener], options || false);\n delete bag[ev][ns || '*'][listener];\n }\n } else if (ev && ns) {\n // remove all listeners for a namespaced event\n if (bag[ev] && bag[ev][ns]) {\n for (l in bag[ev][ns]) {\n off(n, [ev, ns].join('.'), l);\n }\n delete bag[ev][ns];\n }\n } else if (ns) {\n // remove all listeners for a specific namespace\n for (event in bag) {\n for (namespace in bag[event]) {\n if (ns === namespace) {\n off(n, [event, ns].join('.'));\n }\n }\n }\n } else if (ev) {\n // remove all listeners for the event\n if (bag[ev]) {\n for (namespace in bag[ev]) {\n off(n, [ev, namespace].join('.'));\n }\n delete bag[ev];\n }\n } else {\n // remove all listeners on a given node\n for (event in bag) {\n off(n, event);\n }\n clearEvents(instance);\n }\n });\n}\nfunction dispatch(node, event, data, options) {\n const n = getEventTarget(node);\n\n // Dispatch event\n if (event instanceof globals.window.Event) {\n n.dispatchEvent(event);\n } else {\n event = new globals.window.CustomEvent(event, {\n detail: data,\n cancelable: true,\n ...options\n });\n n.dispatchEvent(event);\n }\n return event;\n}\n\nclass EventTarget extends Base {\n addEventListener() {}\n dispatch(event, data, options) {\n return dispatch(this, event, data, options);\n }\n dispatchEvent(event) {\n const bag = this.getEventHolder().events;\n if (!bag) return true;\n const events = bag[event.type];\n for (const i in events) {\n for (const j in events[i]) {\n events[i][j](event);\n }\n }\n return !event.defaultPrevented;\n }\n\n // Fire given event\n fire(event, data, options) {\n this.dispatch(event, data, options);\n return this;\n }\n getEventHolder() {\n return this;\n }\n getEventTarget() {\n return this;\n }\n\n // Unbind event from listener\n off(event, listener, options) {\n off(this, event, listener, options);\n return this;\n }\n\n // Bind given event to listener\n on(event, listener, binding, options) {\n on(this, event, listener, binding, options);\n return this;\n }\n removeEventListener() {}\n}\nregister(EventTarget, 'EventTarget');\n\nfunction noop() {}\n\n// Default animation values\nconst timeline = {\n duration: 400,\n ease: '>',\n delay: 0\n};\n\n// Default attribute values\nconst attrs = {\n // fill and stroke\n 'fill-opacity': 1,\n 'stroke-opacity': 1,\n 'stroke-width': 0,\n 'stroke-linejoin': 'miter',\n 'stroke-linecap': 'butt',\n fill: '#000000',\n stroke: '#000000',\n opacity: 1,\n // position\n x: 0,\n y: 0,\n cx: 0,\n cy: 0,\n // size\n width: 0,\n height: 0,\n // radius\n r: 0,\n rx: 0,\n ry: 0,\n // gradient\n offset: 0,\n 'stop-opacity': 1,\n 'stop-color': '#000000',\n // text\n 'text-anchor': 'start'\n};\n\nvar defaults = {\n __proto__: null,\n attrs: attrs,\n noop: noop,\n timeline: timeline\n};\n\nclass SVGArray extends Array {\n constructor(...args) {\n super(...args);\n this.init(...args);\n }\n clone() {\n return new this.constructor(this);\n }\n init(arr) {\n // This catches the case, that native map tries to create an array with new Array(1)\n if (typeof arr === 'number') return this;\n this.length = 0;\n this.push(...this.parse(arr));\n return this;\n }\n\n // Parse whitespace separated string\n parse(array = []) {\n // If already is an array, no need to parse it\n if (array instanceof Array) return array;\n return array.trim().split(delimiter).map(parseFloat);\n }\n toArray() {\n return Array.prototype.concat.apply([], this);\n }\n toSet() {\n return new Set(this);\n }\n toString() {\n return this.join(' ');\n }\n\n // Flattens the array if needed\n valueOf() {\n const ret = [];\n ret.push(...this);\n return ret;\n }\n}\n\n// Module for unit conversions\nclass SVGNumber {\n // Initialize\n constructor(...args) {\n this.init(...args);\n }\n convert(unit) {\n return new SVGNumber(this.value, unit);\n }\n\n // Divide number\n divide(number) {\n number = new SVGNumber(number);\n return new SVGNumber(this / number, this.unit || number.unit);\n }\n init(value, unit) {\n unit = Array.isArray(value) ? value[1] : unit;\n value = Array.isArray(value) ? value[0] : value;\n\n // initialize defaults\n this.value = 0;\n this.unit = unit || '';\n\n // parse value\n if (typeof value === 'number') {\n // ensure a valid numeric value\n this.value = isNaN(value) ? 0 : !isFinite(value) ? value < 0 ? -3.4e38 : +3.4e38 : value;\n } else if (typeof value === 'string') {\n unit = value.match(numberAndUnit);\n if (unit) {\n // make value numeric\n this.value = parseFloat(unit[1]);\n\n // normalize\n if (unit[5] === '%') {\n this.value /= 100;\n } else if (unit[5] === 's') {\n this.value *= 1000;\n }\n\n // store unit\n this.unit = unit[5];\n }\n } else {\n if (value instanceof SVGNumber) {\n this.value = value.valueOf();\n this.unit = value.unit;\n }\n }\n return this;\n }\n\n // Subtract number\n minus(number) {\n number = new SVGNumber(number);\n return new SVGNumber(this - number, this.unit || number.unit);\n }\n\n // Add number\n plus(number) {\n number = new SVGNumber(number);\n return new SVGNumber(this + number, this.unit || number.unit);\n }\n\n // Multiply number\n times(number) {\n number = new SVGNumber(number);\n return new SVGNumber(this * number, this.unit || number.unit);\n }\n toArray() {\n return [this.value, this.unit];\n }\n toJSON() {\n return this.toString();\n }\n toString() {\n return (this.unit === '%' ? ~~(this.value * 1e8) / 1e6 : this.unit === 's' ? this.value / 1e3 : this.value) + this.unit;\n }\n valueOf() {\n return this.value;\n }\n}\n\nconst colorAttributes = new Set(['fill', 'stroke', 'color', 'bgcolor', 'stop-color', 'flood-color', 'lighting-color']);\nconst hooks = [];\nfunction registerAttrHook(fn) {\n hooks.push(fn);\n}\n\n// Set svg element attribute\nfunction attr(attr, val, ns) {\n // act as full getter\n if (attr == null) {\n // get an object of attributes\n attr = {};\n val = this.node.attributes;\n for (const node of val) {\n attr[node.nodeName] = isNumber.test(node.nodeValue) ? parseFloat(node.nodeValue) : node.nodeValue;\n }\n return attr;\n } else if (attr instanceof Array) {\n // loop through array and get all values\n return attr.reduce((last, curr) => {\n last[curr] = this.attr(curr);\n return last;\n }, {});\n } else if (typeof attr === 'object' && attr.constructor === Object) {\n // apply every attribute individually if an object is passed\n for (val in attr) this.attr(val, attr[val]);\n } else if (val === null) {\n // remove value\n this.node.removeAttribute(attr);\n } else if (val == null) {\n // act as a getter if the first and only argument is not an object\n val = this.node.getAttribute(attr);\n return val == null ? attrs[attr] : isNumber.test(val) ? parseFloat(val) : val;\n } else {\n // Loop through hooks and execute them to convert value\n val = hooks.reduce((_val, hook) => {\n return hook(attr, _val, this);\n }, val);\n\n // ensure correct numeric values (also accepts NaN and Infinity)\n if (typeof val === 'number') {\n val = new SVGNumber(val);\n } else if (colorAttributes.has(attr) && Color.isColor(val)) {\n // ensure full hex color\n val = new Color(val);\n } else if (val.constructor === Array) {\n // Check for plain arrays and parse array values\n val = new SVGArray(val);\n }\n\n // if the passed attribute is leading...\n if (attr === 'leading') {\n // ... call the leading method instead\n if (this.leading) {\n this.leading(val);\n }\n } else {\n // set given attribute on node\n typeof ns === 'string' ? this.node.setAttributeNS(ns, attr, val.toString()) : this.node.setAttribute(attr, val.toString());\n }\n\n // rebuild if required\n if (this.rebuild && (attr === 'font-size' || attr === 'x')) {\n this.rebuild();\n }\n }\n return this;\n}\n\nclass Dom extends EventTarget {\n constructor(node, attrs) {\n super();\n this.node = node;\n this.type = node.nodeName;\n if (attrs && node !== attrs) {\n this.attr(attrs);\n }\n }\n\n // Add given element at a position\n add(element, i) {\n element = makeInstance(element);\n\n // If non-root svg nodes are added we have to remove their namespaces\n if (element.removeNamespace && this.node instanceof globals.window.SVGElement) {\n element.removeNamespace();\n }\n if (i == null) {\n this.node.appendChild(element.node);\n } else if (element.node !== this.node.childNodes[i]) {\n this.node.insertBefore(element.node, this.node.childNodes[i]);\n }\n return this;\n }\n\n // Add element to given container and return self\n addTo(parent, i) {\n return makeInstance(parent).put(this, i);\n }\n\n // Returns all child elements\n children() {\n return new List(map(this.node.children, function (node) {\n return adopt(node);\n }));\n }\n\n // Remove all elements in this container\n clear() {\n // remove children\n while (this.node.hasChildNodes()) {\n this.node.removeChild(this.node.lastChild);\n }\n return this;\n }\n\n // Clone element\n clone(deep = true, assignNewIds = true) {\n // write dom data to the dom so the clone can pickup the data\n this.writeDataToDom();\n\n // clone element\n let nodeClone = this.node.cloneNode(deep);\n if (assignNewIds) {\n // assign new id\n nodeClone = assignNewId(nodeClone);\n }\n return new this.constructor(nodeClone);\n }\n\n // Iterates over all children and invokes a given block\n each(block, deep) {\n const children = this.children();\n let i, il;\n for (i = 0, il = children.length; i < il; i++) {\n block.apply(children[i], [i, children]);\n if (deep) {\n children[i].each(block, deep);\n }\n }\n return this;\n }\n element(nodeName, attrs) {\n return this.put(new Dom(create(nodeName), attrs));\n }\n\n // Get first child\n first() {\n return adopt(this.node.firstChild);\n }\n\n // Get a element at the given index\n get(i) {\n return adopt(this.node.childNodes[i]);\n }\n getEventHolder() {\n return this.node;\n }\n getEventTarget() {\n return this.node;\n }\n\n // Checks if the given element is a child\n has(element) {\n return this.index(element) >= 0;\n }\n html(htmlOrFn, outerHTML) {\n return this.xml(htmlOrFn, outerHTML, html);\n }\n\n // Get / set id\n id(id) {\n // generate new id if no id set\n if (typeof id === 'undefined' && !this.node.id) {\n this.node.id = eid(this.type);\n }\n\n // don't set directly with this.node.id to make `null` work correctly\n return this.attr('id', id);\n }\n\n // Gets index of given element\n index(element) {\n return [].slice.call(this.node.childNodes).indexOf(element.node);\n }\n\n // Get the last child\n last() {\n return adopt(this.node.lastChild);\n }\n\n // matches the element vs a css selector\n matches(selector) {\n const el = this.node;\n const matcher = el.matches || el.matchesSelector || el.msMatchesSelector || el.mozMatchesSelector || el.webkitMatchesSelector || el.oMatchesSelector || null;\n return matcher && matcher.call(el, selector);\n }\n\n // Returns the parent element instance\n parent(type) {\n let parent = this;\n\n // check for parent\n if (!parent.node.parentNode) return null;\n\n // get parent element\n parent = adopt(parent.node.parentNode);\n if (!type) return parent;\n\n // loop through ancestors if type is given\n do {\n if (typeof type === 'string' ? parent.matches(type) : parent instanceof type) return parent;\n } while (parent = adopt(parent.node.parentNode));\n return parent;\n }\n\n // Basically does the same as `add()` but returns the added element instead\n put(element, i) {\n element = makeInstance(element);\n this.add(element, i);\n return element;\n }\n\n // Add element to given container and return container\n putIn(parent, i) {\n return makeInstance(parent).add(this, i);\n }\n\n // Remove element\n remove() {\n if (this.parent()) {\n this.parent().removeElement(this);\n }\n return this;\n }\n\n // Remove a given child\n removeElement(element) {\n this.node.removeChild(element.node);\n return this;\n }\n\n // Replace this with element\n replace(element) {\n element = makeInstance(element);\n if (this.node.parentNode) {\n this.node.parentNode.replaceChild(element.node, this.node);\n }\n return element;\n }\n round(precision = 2, map = null) {\n const factor = 10 ** precision;\n const attrs = this.attr(map);\n for (const i in attrs) {\n if (typeof attrs[i] === 'number') {\n attrs[i] = Math.round(attrs[i] * factor) / factor;\n }\n }\n this.attr(attrs);\n return this;\n }\n\n // Import / Export raw svg\n svg(svgOrFn, outerSVG) {\n return this.xml(svgOrFn, outerSVG, svg);\n }\n\n // Return id on string conversion\n toString() {\n return this.id();\n }\n words(text) {\n // This is faster than removing all children and adding a new one\n this.node.textContent = text;\n return this;\n }\n wrap(node) {\n const parent = this.parent();\n if (!parent) {\n return this.addTo(node);\n }\n const position = parent.index(this);\n return parent.put(node, position).put(this);\n }\n\n // write svgjs data to the dom\n writeDataToDom() {\n // dump variables recursively\n this.each(function () {\n this.writeDataToDom();\n });\n return this;\n }\n\n // Import / Export raw svg\n xml(xmlOrFn, outerXML, ns) {\n if (typeof xmlOrFn === 'boolean') {\n ns = outerXML;\n outerXML = xmlOrFn;\n xmlOrFn = null;\n }\n\n // act as getter if no svg string is given\n if (xmlOrFn == null || typeof xmlOrFn === 'function') {\n // The default for exports is, that the outerNode is included\n outerXML = outerXML == null ? true : outerXML;\n\n // write svgjs data to the dom\n this.writeDataToDom();\n let current = this;\n\n // An export modifier was passed\n if (xmlOrFn != null) {\n current = adopt(current.node.cloneNode(true));\n\n // If the user wants outerHTML we need to process this node, too\n if (outerXML) {\n const result = xmlOrFn(current);\n current = result || current;\n\n // The user does not want this node? Well, then he gets nothing\n if (result === false) return '';\n }\n\n // Deep loop through all children and apply modifier\n current.each(function () {\n const result = xmlOrFn(this);\n const _this = result || this;\n\n // If modifier returns false, discard node\n if (result === false) {\n this.remove();\n\n // If modifier returns new node, use it\n } else if (result && this !== _this) {\n this.replace(_this);\n }\n }, true);\n }\n\n // Return outer or inner content\n return outerXML ? current.node.outerHTML : current.node.innerHTML;\n }\n\n // Act as setter if we got a string\n\n // The default for import is, that the current node is not replaced\n outerXML = outerXML == null ? false : outerXML;\n\n // Create temporary holder\n const well = create('wrapper', ns);\n const fragment = globals.document.createDocumentFragment();\n\n // Dump raw svg\n well.innerHTML = xmlOrFn;\n\n // Transplant nodes into the fragment\n for (let len = well.children.length; len--;) {\n fragment.appendChild(well.firstElementChild);\n }\n const parent = this.parent();\n\n // Add the whole fragment at once\n return outerXML ? this.replace(fragment) && parent : this.add(fragment);\n }\n}\nextend(Dom, {\n attr,\n find,\n findOne\n});\nregister(Dom, 'Dom');\n\nclass Element extends Dom {\n constructor(node, attrs) {\n super(node, attrs);\n\n // initialize data object\n this.dom = {};\n\n // create circular reference\n this.node.instance = this;\n if (node.hasAttribute('data-svgjs') || node.hasAttribute('svgjs:data')) {\n // pull svgjs data from the dom (getAttributeNS doesn't work in html5)\n this.setData(JSON.parse(node.getAttribute('data-svgjs')) ?? JSON.parse(node.getAttribute('svgjs:data')) ?? {});\n }\n }\n\n // Move element by its center\n center(x, y) {\n return this.cx(x).cy(y);\n }\n\n // Move by center over x-axis\n cx(x) {\n return x == null ? this.x() + this.width() / 2 : this.x(x - this.width() / 2);\n }\n\n // Move by center over y-axis\n cy(y) {\n return y == null ? this.y() + this.height() / 2 : this.y(y - this.height() / 2);\n }\n\n // Get defs\n defs() {\n const root = this.root();\n return root && root.defs();\n }\n\n // Relative move over x and y axes\n dmove(x, y) {\n return this.dx(x).dy(y);\n }\n\n // Relative move over x axis\n dx(x = 0) {\n return this.x(new SVGNumber(x).plus(this.x()));\n }\n\n // Relative move over y axis\n dy(y = 0) {\n return this.y(new SVGNumber(y).plus(this.y()));\n }\n getEventHolder() {\n return this;\n }\n\n // Set height of element\n height(height) {\n return this.attr('height', height);\n }\n\n // Move element to given x and y values\n move(x, y) {\n return this.x(x).y(y);\n }\n\n // return array of all ancestors of given type up to the root svg\n parents(until = this.root()) {\n const isSelector = typeof until === 'string';\n if (!isSelector) {\n until = makeInstance(until);\n }\n const parents = new List();\n let parent = this;\n while ((parent = parent.parent()) && parent.node !== globals.document && parent.nodeName !== '#document-fragment') {\n parents.push(parent);\n if (!isSelector && parent.node === until.node) {\n break;\n }\n if (isSelector && parent.matches(until)) {\n break;\n }\n if (parent.node === this.root().node) {\n // We worked our way to the root and didn't match `until`\n return null;\n }\n }\n return parents;\n }\n\n // Get referenced element form attribute value\n reference(attr) {\n attr = this.attr(attr);\n if (!attr) return null;\n const m = (attr + '').match(reference);\n return m ? makeInstance(m[1]) : null;\n }\n\n // Get parent document\n root() {\n const p = this.parent(getClass(root));\n return p && p.root();\n }\n\n // set given data to the elements data property\n setData(o) {\n this.dom = o;\n return this;\n }\n\n // Set element size to given width and height\n size(width, height) {\n const p = proportionalSize(this, width, height);\n return this.width(new SVGNumber(p.width)).height(new SVGNumber(p.height));\n }\n\n // Set width of element\n width(width) {\n return this.attr('width', width);\n }\n\n // write svgjs data to the dom\n writeDataToDom() {\n writeDataToDom(this, this.dom);\n return super.writeDataToDom();\n }\n\n // Move over x-axis\n x(x) {\n return this.attr('x', x);\n }\n\n // Move over y-axis\n y(y) {\n return this.attr('y', y);\n }\n}\nextend(Element, {\n bbox,\n rbox,\n inside,\n point,\n ctm,\n screenCTM\n});\nregister(Element, 'Element');\n\n// Define list of available attributes for stroke and fill\nconst sugar = {\n stroke: ['color', 'width', 'opacity', 'linecap', 'linejoin', 'miterlimit', 'dasharray', 'dashoffset'],\n fill: ['color', 'opacity', 'rule'],\n prefix: function (t, a) {\n return a === 'color' ? t : t + '-' + a;\n }\n}\n\n// Add sugar for fill and stroke\n;\n['fill', 'stroke'].forEach(function (m) {\n const extension = {};\n let i;\n extension[m] = function (o) {\n if (typeof o === 'undefined') {\n return this.attr(m);\n }\n if (typeof o === 'string' || o instanceof Color || Color.isRgb(o) || o instanceof Element) {\n this.attr(m, o);\n } else {\n // set all attributes from sugar.fill and sugar.stroke list\n for (i = sugar[m].length - 1; i >= 0; i--) {\n if (o[sugar[m][i]] != null) {\n this.attr(sugar.prefix(m, sugar[m][i]), o[sugar[m][i]]);\n }\n }\n }\n return this;\n };\n registerMethods(['Element', 'Runner'], extension);\n});\nregisterMethods(['Element', 'Runner'], {\n // Let the user set the matrix directly\n matrix: function (mat, b, c, d, e, f) {\n // Act as a getter\n if (mat == null) {\n return new Matrix(this);\n }\n\n // Act as a setter, the user can pass a matrix or a set of numbers\n return this.attr('transform', new Matrix(mat, b, c, d, e, f));\n },\n // Map rotation to transform\n rotate: function (angle, cx, cy) {\n return this.transform({\n rotate: angle,\n ox: cx,\n oy: cy\n }, true);\n },\n // Map skew to transform\n skew: function (x, y, cx, cy) {\n return arguments.length === 1 || arguments.length === 3 ? this.transform({\n skew: x,\n ox: y,\n oy: cx\n }, true) : this.transform({\n skew: [x, y],\n ox: cx,\n oy: cy\n }, true);\n },\n shear: function (lam, cx, cy) {\n return this.transform({\n shear: lam,\n ox: cx,\n oy: cy\n }, true);\n },\n // Map scale to transform\n scale: function (x, y, cx, cy) {\n return arguments.length === 1 || arguments.length === 3 ? this.transform({\n scale: x,\n ox: y,\n oy: cx\n }, true) : this.transform({\n scale: [x, y],\n ox: cx,\n oy: cy\n }, true);\n },\n // Map translate to transform\n translate: function (x, y) {\n return this.transform({\n translate: [x, y]\n }, true);\n },\n // Map relative translations to transform\n relative: function (x, y) {\n return this.transform({\n relative: [x, y]\n }, true);\n },\n // Map flip to transform\n flip: function (direction = 'both', origin = 'center') {\n if ('xybothtrue'.indexOf(direction) === -1) {\n origin = direction;\n direction = 'both';\n }\n return this.transform({\n flip: direction,\n origin: origin\n }, true);\n },\n // Opacity\n opacity: function (value) {\n return this.attr('opacity', value);\n }\n});\nregisterMethods('radius', {\n // Add x and y radius\n radius: function (x, y = x) {\n const type = (this._element || this).type;\n return type === 'radialGradient' ? this.attr('r', new SVGNumber(x)) : this.rx(x).ry(y);\n }\n});\nregisterMethods('Path', {\n // Get path length\n length: function () {\n return this.node.getTotalLength();\n },\n // Get point at length\n pointAt: function (length) {\n return new Point(this.node.getPointAtLength(length));\n }\n});\nregisterMethods(['Element', 'Runner'], {\n // Set font\n font: function (a, v) {\n if (typeof a === 'object') {\n for (v in a) this.font(v, a[v]);\n return this;\n }\n return a === 'leading' ? this.leading(v) : a === 'anchor' ? this.attr('text-anchor', v) : a === 'size' || a === 'family' || a === 'weight' || a === 'stretch' || a === 'variant' || a === 'style' ? this.attr('font-' + a, v) : this.attr(a, v);\n }\n});\n\n// Add events to elements\nconst methods = ['click', 'dblclick', 'mousedown', 'mouseup', 'mouseover', 'mouseout', 'mousemove', 'mouseenter', 'mouseleave', 'touchstart', 'touchmove', 'touchleave', 'touchend', 'touchcancel', 'contextmenu', 'wheel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel'].reduce(function (last, event) {\n // add event to Element\n const fn = function (f) {\n if (f === null) {\n this.off(event);\n } else {\n this.on(event, f);\n }\n return this;\n };\n last[event] = fn;\n return last;\n}, {});\nregisterMethods('Element', methods);\n\n// Reset all transformations\nfunction untransform() {\n return this.attr('transform', null);\n}\n\n// merge the whole transformation chain into one matrix and returns it\nfunction matrixify() {\n const matrix = (this.attr('transform') || ''\n // split transformations\n ).split(transforms).slice(0, -1).map(function (str) {\n // generate key => value pairs\n const kv = str.trim().split('(');\n return [kv[0], kv[1].split(delimiter).map(function (str) {\n return parseFloat(str);\n })];\n }).reverse()\n // merge every transformation into one matrix\n .reduce(function (matrix, transform) {\n if (transform[0] === 'matrix') {\n return matrix.lmultiply(Matrix.fromArray(transform[1]));\n }\n return matrix[transform[0]].apply(matrix, transform[1]);\n }, new Matrix());\n return matrix;\n}\n\n// add an element to another parent without changing the visual representation on the screen\nfunction toParent(parent, i) {\n if (this === parent) return this;\n if (isDescriptive(this.node)) return this.addTo(parent, i);\n const ctm = this.screenCTM();\n const pCtm = parent.screenCTM().inverse();\n this.addTo(parent, i).untransform().transform(pCtm.multiply(ctm));\n return this;\n}\n\n// same as above with parent equals root-svg\nfunction toRoot(i) {\n return this.toParent(this.root(), i);\n}\n\n// Add transformations\nfunction transform(o, relative) {\n // Act as a getter if no object was passed\n if (o == null || typeof o === 'string') {\n const decomposed = new Matrix(this).decompose();\n return o == null ? decomposed : decomposed[o];\n }\n if (!Matrix.isMatrixLike(o)) {\n // Set the origin according to the defined transform\n o = {\n ...o,\n origin: getOrigin(o, this)\n };\n }\n\n // The user can pass a boolean, an Element or an Matrix or nothing\n const cleanRelative = relative === true ? this : relative || false;\n const result = new Matrix(cleanRelative).transform(o);\n return this.attr('transform', result);\n}\nregisterMethods('Element', {\n untransform,\n matrixify,\n toParent,\n toRoot,\n transform\n});\n\nclass Container extends Element {\n flatten() {\n this.each(function () {\n if (this instanceof Container) {\n return this.flatten().ungroup();\n }\n });\n return this;\n }\n ungroup(parent = this.parent(), index = parent.index(this)) {\n // when parent != this, we want append all elements to the end\n index = index === -1 ? parent.children().length : index;\n this.each(function (i, children) {\n // reverse each\n return children[children.length - i - 1].toParent(parent, index);\n });\n return this.remove();\n }\n}\nregister(Container, 'Container');\n\nclass Defs extends Container {\n constructor(node, attrs = node) {\n super(nodeOrNew('defs', node), attrs);\n }\n flatten() {\n return this;\n }\n ungroup() {\n return this;\n }\n}\nregister(Defs, 'Defs');\n\nclass Shape extends Element {}\nregister(Shape, 'Shape');\n\n// Radius x value\nfunction rx(rx) {\n return this.attr('rx', rx);\n}\n\n// Radius y value\nfunction ry(ry) {\n return this.attr('ry', ry);\n}\n\n// Move over x-axis\nfunction x$3(x) {\n return x == null ? this.cx() - this.rx() : this.cx(x + this.rx());\n}\n\n// Move over y-axis\nfunction y$3(y) {\n return y == null ? this.cy() - this.ry() : this.cy(y + this.ry());\n}\n\n// Move by center over x-axis\nfunction cx$1(x) {\n return this.attr('cx', x);\n}\n\n// Move by center over y-axis\nfunction cy$1(y) {\n return this.attr('cy', y);\n}\n\n// Set width of element\nfunction width$2(width) {\n return width == null ? this.rx() * 2 : this.rx(new SVGNumber(width).divide(2));\n}\n\n// Set height of element\nfunction height$2(height) {\n return height == null ? this.ry() * 2 : this.ry(new SVGNumber(height).divide(2));\n}\n\nvar circled = {\n __proto__: null,\n cx: cx$1,\n cy: cy$1,\n height: height$2,\n rx: rx,\n ry: ry,\n width: width$2,\n x: x$3,\n y: y$3\n};\n\nclass Ellipse extends Shape {\n constructor(node, attrs = node) {\n super(nodeOrNew('ellipse', node), attrs);\n }\n size(width, height) {\n const p = proportionalSize(this, width, height);\n return this.rx(new SVGNumber(p.width).divide(2)).ry(new SVGNumber(p.height).divide(2));\n }\n}\nextend(Ellipse, circled);\nregisterMethods('Container', {\n // Create an ellipse\n ellipse: wrapWithAttrCheck(function (width = 0, height = width) {\n return this.put(new Ellipse()).size(width, height).move(0, 0);\n })\n});\nregister(Ellipse, 'Ellipse');\n\nclass Fragment extends Dom {\n constructor(node = globals.document.createDocumentFragment()) {\n super(node);\n }\n\n // Import / Export raw xml\n xml(xmlOrFn, outerXML, ns) {\n if (typeof xmlOrFn === 'boolean') {\n ns = outerXML;\n outerXML = xmlOrFn;\n xmlOrFn = null;\n }\n\n // because this is a fragment we have to put all elements into a wrapper first\n // before we can get the innerXML from it\n if (xmlOrFn == null || typeof xmlOrFn === 'function') {\n const wrapper = new Dom(create('wrapper', ns));\n wrapper.add(this.node.cloneNode(true));\n return wrapper.xml(false, ns);\n }\n\n // Act as setter if we got a string\n return super.xml(xmlOrFn, false, ns);\n }\n}\nregister(Fragment, 'Fragment');\n\nfunction from(x, y) {\n return (this._element || this).type === 'radialGradient' ? this.attr({\n fx: new SVGNumber(x),\n fy: new SVGNumber(y)\n }) : this.attr({\n x1: new SVGNumber(x),\n y1: new SVGNumber(y)\n });\n}\nfunction to(x, y) {\n return (this._element || this).type === 'radialGradient' ? this.attr({\n cx: new SVGNumber(x),\n cy: new SVGNumber(y)\n }) : this.attr({\n x2: new SVGNumber(x),\n y2: new SVGNumber(y)\n });\n}\n\nvar gradiented = {\n __proto__: null,\n from: from,\n to: to\n};\n\nclass Gradient extends Container {\n constructor(type, attrs) {\n super(nodeOrNew(type + 'Gradient', typeof type === 'string' ? null : type), attrs);\n }\n\n // custom attr to handle transform\n attr(a, b, c) {\n if (a === 'transform') a = 'gradientTransform';\n return super.attr(a, b, c);\n }\n bbox() {\n return new Box();\n }\n targets() {\n return baseFind('svg [fill*=' + this.id() + ']');\n }\n\n // Alias string conversion to fill\n toString() {\n return this.url();\n }\n\n // Update gradient\n update(block) {\n // remove all stops\n this.clear();\n\n // invoke passed block\n if (typeof block === 'function') {\n block.call(this, this);\n }\n return this;\n }\n\n // Return the fill id\n url() {\n return 'url(#' + this.id() + ')';\n }\n}\nextend(Gradient, gradiented);\nregisterMethods({\n Container: {\n // Create gradient element in defs\n gradient(...args) {\n return this.defs().gradient(...args);\n }\n },\n // define gradient\n Defs: {\n gradient: wrapWithAttrCheck(function (type, block) {\n return this.put(new Gradient(type)).update(block);\n })\n }\n});\nregister(Gradient, 'Gradient');\n\nclass Pattern extends Container {\n // Initialize node\n constructor(node, attrs = node) {\n super(nodeOrNew('pattern', node), attrs);\n }\n\n // custom attr to handle transform\n attr(a, b, c) {\n if (a === 'transform') a = 'patternTransform';\n return super.attr(a, b, c);\n }\n bbox() {\n return new Box();\n }\n targets() {\n return baseFind('svg [fill*=' + this.id() + ']');\n }\n\n // Alias string conversion to fill\n toString() {\n return this.url();\n }\n\n // Update pattern by rebuilding\n update(block) {\n // remove content\n this.clear();\n\n // invoke passed block\n if (typeof block === 'function') {\n block.call(this, this);\n }\n return this;\n }\n\n // Return the fill id\n url() {\n return 'url(#' + this.id() + ')';\n }\n}\nregisterMethods({\n Container: {\n // Create pattern element in defs\n pattern(...args) {\n return this.defs().pattern(...args);\n }\n },\n Defs: {\n pattern: wrapWithAttrCheck(function (width, height, block) {\n return this.put(new Pattern()).update(block).attr({\n x: 0,\n y: 0,\n width: width,\n height: height,\n patternUnits: 'userSpaceOnUse'\n });\n })\n }\n});\nregister(Pattern, 'Pattern');\n\nclass Image extends Shape {\n constructor(node, attrs = node) {\n super(nodeOrNew('image', node), attrs);\n }\n\n // (re)load image\n load(url, callback) {\n if (!url) return this;\n const img = new globals.window.Image();\n on(img, 'load', function (e) {\n const p = this.parent(Pattern);\n\n // ensure image size\n if (this.width() === 0 && this.height() === 0) {\n this.size(img.width, img.height);\n }\n if (p instanceof Pattern) {\n // ensure pattern size if not set\n if (p.width() === 0 && p.height() === 0) {\n p.size(this.width(), this.height());\n }\n }\n if (typeof callback === 'function') {\n callback.call(this, e);\n }\n }, this);\n on(img, 'load error', function () {\n // dont forget to unbind memory leaking events\n off(img);\n });\n return this.attr('href', img.src = url, xlink);\n }\n}\nregisterAttrHook(function (attr, val, _this) {\n // convert image fill and stroke to patterns\n if (attr === 'fill' || attr === 'stroke') {\n if (isImage.test(val)) {\n val = _this.root().defs().image(val);\n }\n }\n if (val instanceof Image) {\n val = _this.root().defs().pattern(0, 0, pattern => {\n pattern.add(val);\n });\n }\n return val;\n});\nregisterMethods({\n Container: {\n // create image element, load image and set its size\n image: wrapWithAttrCheck(function (source, callback) {\n return this.put(new Image()).size(0, 0).load(source, callback);\n })\n }\n});\nregister(Image, 'Image');\n\nclass PointArray extends SVGArray {\n // Get bounding box of points\n bbox() {\n let maxX = -Infinity;\n let maxY = -Infinity;\n let minX = Infinity;\n let minY = Infinity;\n this.forEach(function (el) {\n maxX = Math.max(el[0], maxX);\n maxY = Math.max(el[1], maxY);\n minX = Math.min(el[0], minX);\n minY = Math.min(el[1], minY);\n });\n return new Box(minX, minY, maxX - minX, maxY - minY);\n }\n\n // Move point string\n move(x, y) {\n const box = this.bbox();\n\n // get relative offset\n x -= box.x;\n y -= box.y;\n\n // move every point\n if (!isNaN(x) && !isNaN(y)) {\n for (let i = this.length - 1; i >= 0; i--) {\n this[i] = [this[i][0] + x, this[i][1] + y];\n }\n }\n return this;\n }\n\n // Parse point string and flat array\n parse(array = [0, 0]) {\n const points = [];\n\n // if it is an array, we flatten it and therefore clone it to 1 depths\n if (array instanceof Array) {\n array = Array.prototype.concat.apply([], array);\n } else {\n // Else, it is considered as a string\n // parse points\n array = array.trim().split(delimiter).map(parseFloat);\n }\n\n // validate points - https://svgwg.org/svg2-draft/shapes.html#DataTypePoints\n // Odd number of coordinates is an error. In such cases, drop the last odd coordinate.\n if (array.length % 2 !== 0) array.pop();\n\n // wrap points in two-tuples\n for (let i = 0, len = array.length; i < len; i = i + 2) {\n points.push([array[i], array[i + 1]]);\n }\n return points;\n }\n\n // Resize poly string\n size(width, height) {\n let i;\n const box = this.bbox();\n\n // recalculate position of all points according to new size\n for (i = this.length - 1; i >= 0; i--) {\n if (box.width) this[i][0] = (this[i][0] - box.x) * width / box.width + box.x;\n if (box.height) this[i][1] = (this[i][1] - box.y) * height / box.height + box.y;\n }\n return this;\n }\n\n // Convert array to line object\n toLine() {\n return {\n x1: this[0][0],\n y1: this[0][1],\n x2: this[1][0],\n y2: this[1][1]\n };\n }\n\n // Convert array to string\n toString() {\n const array = [];\n // convert to a poly point string\n for (let i = 0, il = this.length; i < il; i++) {\n array.push(this[i].join(','));\n }\n return array.join(' ');\n }\n transform(m) {\n return this.clone().transformO(m);\n }\n\n // transform points with matrix (similar to Point.transform)\n transformO(m) {\n if (!Matrix.isMatrixLike(m)) {\n m = new Matrix(m);\n }\n for (let i = this.length; i--;) {\n // Perform the matrix multiplication\n const [x, y] = this[i];\n this[i][0] = m.a * x + m.c * y + m.e;\n this[i][1] = m.b * x + m.d * y + m.f;\n }\n return this;\n }\n}\n\nconst MorphArray = PointArray;\n\n// Move by left top corner over x-axis\nfunction x$2(x) {\n return x == null ? this.bbox().x : this.move(x, this.bbox().y);\n}\n\n// Move by left top corner over y-axis\nfunction y$2(y) {\n return y == null ? this.bbox().y : this.move(this.bbox().x, y);\n}\n\n// Set width of element\nfunction width$1(width) {\n const b = this.bbox();\n return width == null ? b.width : this.size(width, b.height);\n}\n\n// Set height of element\nfunction height$1(height) {\n const b = this.bbox();\n return height == null ? b.height : this.size(b.width, height);\n}\n\nvar pointed = {\n __proto__: null,\n MorphArray: MorphArray,\n height: height$1,\n width: width$1,\n x: x$2,\n y: y$2\n};\n\nclass Line extends Shape {\n // Initialize node\n constructor(node, attrs = node) {\n super(nodeOrNew('line', node), attrs);\n }\n\n // Get array\n array() {\n return new PointArray([[this.attr('x1'), this.attr('y1')], [this.attr('x2'), this.attr('y2')]]);\n }\n\n // Move by left top corner\n move(x, y) {\n return this.attr(this.array().move(x, y).toLine());\n }\n\n // Overwrite native plot() method\n plot(x1, y1, x2, y2) {\n if (x1 == null) {\n return this.array();\n } else if (typeof y1 !== 'undefined') {\n x1 = {\n x1,\n y1,\n x2,\n y2\n };\n } else {\n x1 = new PointArray(x1).toLine();\n }\n return this.attr(x1);\n }\n\n // Set element size to given width and height\n size(width, height) {\n const p = proportionalSize(this, width, height);\n return this.attr(this.array().size(p.width, p.height).toLine());\n }\n}\nextend(Line, pointed);\nregisterMethods({\n Container: {\n // Create a line element\n line: wrapWithAttrCheck(function (...args) {\n // make sure plot is called as a setter\n // x1 is not necessarily a number, it can also be an array, a string and a PointArray\n return Line.prototype.plot.apply(this.put(new Line()), args[0] != null ? args : [0, 0, 0, 0]);\n })\n }\n});\nregister(Line, 'Line');\n\nclass Marker extends Container {\n // Initialize node\n constructor(node, attrs = node) {\n super(nodeOrNew('marker', node), attrs);\n }\n\n // Set height of element\n height(height) {\n return this.attr('markerHeight', height);\n }\n orient(orient) {\n return this.attr('orient', orient);\n }\n\n // Set marker refX and refY\n ref(x, y) {\n return this.attr('refX', x).attr('refY', y);\n }\n\n // Return the fill id\n toString() {\n return 'url(#' + this.id() + ')';\n }\n\n // Update marker\n update(block) {\n // remove all content\n this.clear();\n\n // invoke passed block\n if (typeof block === 'function') {\n block.call(this, this);\n }\n return this;\n }\n\n // Set width of element\n width(width) {\n return this.attr('markerWidth', width);\n }\n}\nregisterMethods({\n Container: {\n marker(...args) {\n // Create marker element in defs\n return this.defs().marker(...args);\n }\n },\n Defs: {\n // Create marker\n marker: wrapWithAttrCheck(function (width, height, block) {\n // Set default viewbox to match the width and height, set ref to cx and cy and set orient to auto\n return this.put(new Marker()).size(width, height).ref(width / 2, height / 2).viewbox(0, 0, width, height).attr('orient', 'auto').update(block);\n })\n },\n marker: {\n // Create and attach markers\n marker(marker, width, height, block) {\n let attr = ['marker'];\n\n // Build attribute name\n if (marker !== 'all') attr.push(marker);\n attr = attr.join('-');\n\n // Set marker attribute\n marker = arguments[1] instanceof Marker ? arguments[1] : this.defs().marker(width, height, block);\n return this.attr(attr, marker);\n }\n }\n});\nregister(Marker, 'Marker');\n\n/***\nBase Class\n==========\nThe base stepper class that will be\n***/\n\nfunction makeSetterGetter(k, f) {\n return function (v) {\n if (v == null) return this[k];\n this[k] = v;\n if (f) f.call(this);\n return this;\n };\n}\nconst easing = {\n '-': function (pos) {\n return pos;\n },\n '<>': function (pos) {\n return -Math.cos(pos * Math.PI) / 2 + 0.5;\n },\n '>': function (pos) {\n return Math.sin(pos * Math.PI / 2);\n },\n '<': function (pos) {\n return -Math.cos(pos * Math.PI / 2) + 1;\n },\n bezier: function (x1, y1, x2, y2) {\n // see https://www.w3.org/TR/css-easing-1/#cubic-bezier-algo\n return function (t) {\n if (t < 0) {\n if (x1 > 0) {\n return y1 / x1 * t;\n } else if (x2 > 0) {\n return y2 / x2 * t;\n } else {\n return 0;\n }\n } else if (t > 1) {\n if (x2 < 1) {\n return (1 - y2) / (1 - x2) * t + (y2 - x2) / (1 - x2);\n } else if (x1 < 1) {\n return (1 - y1) / (1 - x1) * t + (y1 - x1) / (1 - x1);\n } else {\n return 1;\n }\n } else {\n return 3 * t * (1 - t) ** 2 * y1 + 3 * t ** 2 * (1 - t) * y2 + t ** 3;\n }\n };\n },\n // see https://www.w3.org/TR/css-easing-1/#step-timing-function-algo\n steps: function (steps, stepPosition = 'end') {\n // deal with \"jump-\" prefix\n stepPosition = stepPosition.split('-').reverse()[0];\n let jumps = steps;\n if (stepPosition === 'none') {\n --jumps;\n } else if (stepPosition === 'both') {\n ++jumps;\n }\n\n // The beforeFlag is essentially useless\n return (t, beforeFlag = false) => {\n // Step is called currentStep in referenced url\n let step = Math.floor(t * steps);\n const jumping = t * step % 1 === 0;\n if (stepPosition === 'start' || stepPosition === 'both') {\n ++step;\n }\n if (beforeFlag && jumping) {\n --step;\n }\n if (t >= 0 && step < 0) {\n step = 0;\n }\n if (t <= 1 && step > jumps) {\n step = jumps;\n }\n return step / jumps;\n };\n }\n};\nclass Stepper {\n done() {\n return false;\n }\n}\n\n/***\nEasing Functions\n================\n***/\n\nclass Ease extends Stepper {\n constructor(fn = timeline.ease) {\n super();\n this.ease = easing[fn] || fn;\n }\n step(from, to, pos) {\n if (typeof from !== 'number') {\n return pos < 1 ? from : to;\n }\n return from + (to - from) * this.ease(pos);\n }\n}\n\n/***\nController Types\n================\n***/\n\nclass Controller extends Stepper {\n constructor(fn) {\n super();\n this.stepper = fn;\n }\n done(c) {\n return c.done;\n }\n step(current, target, dt, c) {\n return this.stepper(current, target, dt, c);\n }\n}\nfunction recalculate() {\n // Apply the default parameters\n const duration = (this._duration || 500) / 1000;\n const overshoot = this._overshoot || 0;\n\n // Calculate the PID natural response\n const eps = 1e-10;\n const pi = Math.PI;\n const os = Math.log(overshoot / 100 + eps);\n const zeta = -os / Math.sqrt(pi * pi + os * os);\n const wn = 3.9 / (zeta * duration);\n\n // Calculate the Spring values\n this.d = 2 * zeta * wn;\n this.k = wn * wn;\n}\nclass Spring extends Controller {\n constructor(duration = 500, overshoot = 0) {\n super();\n this.duration(duration).overshoot(overshoot);\n }\n step(current, target, dt, c) {\n if (typeof current === 'string') return current;\n c.done = dt === Infinity;\n if (dt === Infinity) return target;\n if (dt === 0) return current;\n if (dt > 100) dt = 16;\n dt /= 1000;\n\n // Get the previous velocity\n const velocity = c.velocity || 0;\n\n // Apply the control to get the new position and store it\n const acceleration = -this.d * velocity - this.k * (current - target);\n const newPosition = current + velocity * dt + acceleration * dt * dt / 2;\n\n // Store the velocity\n c.velocity = velocity + acceleration * dt;\n\n // Figure out if we have converged, and if so, pass the value\n c.done = Math.abs(target - newPosition) + Math.abs(velocity) < 0.002;\n return c.done ? target : newPosition;\n }\n}\nextend(Spring, {\n duration: makeSetterGetter('_duration', recalculate),\n overshoot: makeSetterGetter('_overshoot', recalculate)\n});\nclass PID extends Controller {\n constructor(p = 0.1, i = 0.01, d = 0, windup = 1000) {\n super();\n this.p(p).i(i).d(d).windup(windup);\n }\n step(current, target, dt, c) {\n if (typeof current === 'string') return current;\n c.done = dt === Infinity;\n if (dt === Infinity) return target;\n if (dt === 0) return current;\n const p = target - current;\n let i = (c.integral || 0) + p * dt;\n const d = (p - (c.error || 0)) / dt;\n const windup = this._windup;\n\n // antiwindup\n if (windup !== false) {\n i = Math.max(-windup, Math.min(i, windup));\n }\n c.error = p;\n c.integral = i;\n c.done = Math.abs(p) < 0.001;\n return c.done ? target : current + (this.P * p + this.I * i + this.D * d);\n }\n}\nextend(PID, {\n windup: makeSetterGetter('_windup'),\n p: makeSetterGetter('P'),\n i: makeSetterGetter('I'),\n d: makeSetterGetter('D')\n});\n\nconst segmentParameters = {\n M: 2,\n L: 2,\n H: 1,\n V: 1,\n C: 6,\n S: 4,\n Q: 4,\n T: 2,\n A: 7,\n Z: 0\n};\nconst pathHandlers = {\n M: function (c, p, p0) {\n p.x = p0.x = c[0];\n p.y = p0.y = c[1];\n return ['M', p.x, p.y];\n },\n L: function (c, p) {\n p.x = c[0];\n p.y = c[1];\n return ['L', c[0], c[1]];\n },\n H: function (c, p) {\n p.x = c[0];\n return ['H', c[0]];\n },\n V: function (c, p) {\n p.y = c[0];\n return ['V', c[0]];\n },\n C: function (c, p) {\n p.x = c[4];\n p.y = c[5];\n return ['C', c[0], c[1], c[2], c[3], c[4], c[5]];\n },\n S: function (c, p) {\n p.x = c[2];\n p.y = c[3];\n return ['S', c[0], c[1], c[2], c[3]];\n },\n Q: function (c, p) {\n p.x = c[2];\n p.y = c[3];\n return ['Q', c[0], c[1], c[2], c[3]];\n },\n T: function (c, p) {\n p.x = c[0];\n p.y = c[1];\n return ['T', c[0], c[1]];\n },\n Z: function (c, p, p0) {\n p.x = p0.x;\n p.y = p0.y;\n return ['Z'];\n },\n A: function (c, p) {\n p.x = c[5];\n p.y = c[6];\n return ['A', c[0], c[1], c[2], c[3], c[4], c[5], c[6]];\n }\n};\nconst mlhvqtcsaz = 'mlhvqtcsaz'.split('');\nfor (let i = 0, il = mlhvqtcsaz.length; i < il; ++i) {\n pathHandlers[mlhvqtcsaz[i]] = function (i) {\n return function (c, p, p0) {\n if (i === 'H') c[0] = c[0] + p.x;else if (i === 'V') c[0] = c[0] + p.y;else if (i === 'A') {\n c[5] = c[5] + p.x;\n c[6] = c[6] + p.y;\n } else {\n for (let j = 0, jl = c.length; j < jl; ++j) {\n c[j] = c[j] + (j % 2 ? p.y : p.x);\n }\n }\n return pathHandlers[i](c, p, p0);\n };\n }(mlhvqtcsaz[i].toUpperCase());\n}\nfunction makeAbsolut(parser) {\n const command = parser.segment[0];\n return pathHandlers[command](parser.segment.slice(1), parser.p, parser.p0);\n}\nfunction segmentComplete(parser) {\n return parser.segment.length && parser.segment.length - 1 === segmentParameters[parser.segment[0].toUpperCase()];\n}\nfunction startNewSegment(parser, token) {\n parser.inNumber && finalizeNumber(parser, false);\n const pathLetter = isPathLetter.test(token);\n if (pathLetter) {\n parser.segment = [token];\n } else {\n const lastCommand = parser.lastCommand;\n const small = lastCommand.toLowerCase();\n const isSmall = lastCommand === small;\n parser.segment = [small === 'm' ? isSmall ? 'l' : 'L' : lastCommand];\n }\n parser.inSegment = true;\n parser.lastCommand = parser.segment[0];\n return pathLetter;\n}\nfunction finalizeNumber(parser, inNumber) {\n if (!parser.inNumber) throw new Error('Parser Error');\n parser.number && parser.segment.push(parseFloat(parser.number));\n parser.inNumber = inNumber;\n parser.number = '';\n parser.pointSeen = false;\n parser.hasExponent = false;\n if (segmentComplete(parser)) {\n finalizeSegment(parser);\n }\n}\nfunction finalizeSegment(parser) {\n parser.inSegment = false;\n if (parser.absolute) {\n parser.segment = makeAbsolut(parser);\n }\n parser.segments.push(parser.segment);\n}\nfunction isArcFlag(parser) {\n if (!parser.segment.length) return false;\n const isArc = parser.segment[0].toUpperCase() === 'A';\n const length = parser.segment.length;\n return isArc && (length === 4 || length === 5);\n}\nfunction isExponential(parser) {\n return parser.lastToken.toUpperCase() === 'E';\n}\nconst pathDelimiters = new Set([' ', ',', '\\t', '\\n', '\\r', '\\f']);\nfunction pathParser(d, toAbsolute = true) {\n let index = 0;\n let token = '';\n const parser = {\n segment: [],\n inNumber: false,\n number: '',\n lastToken: '',\n inSegment: false,\n segments: [],\n pointSeen: false,\n hasExponent: false,\n absolute: toAbsolute,\n p0: new Point(),\n p: new Point()\n };\n while (parser.lastToken = token, token = d.charAt(index++)) {\n if (!parser.inSegment) {\n if (startNewSegment(parser, token)) {\n continue;\n }\n }\n if (token === '.') {\n if (parser.pointSeen || parser.hasExponent) {\n finalizeNumber(parser, false);\n --index;\n continue;\n }\n parser.inNumber = true;\n parser.pointSeen = true;\n parser.number += token;\n continue;\n }\n if (!isNaN(parseInt(token))) {\n if (parser.number === '0' || isArcFlag(parser)) {\n parser.inNumber = true;\n parser.number = token;\n finalizeNumber(parser, true);\n continue;\n }\n parser.inNumber = true;\n parser.number += token;\n continue;\n }\n if (pathDelimiters.has(token)) {\n if (parser.inNumber) {\n finalizeNumber(parser, false);\n }\n continue;\n }\n if (token === '-' || token === '+') {\n if (parser.inNumber && !isExponential(parser)) {\n finalizeNumber(parser, false);\n --index;\n continue;\n }\n parser.number += token;\n parser.inNumber = true;\n continue;\n }\n if (token.toUpperCase() === 'E') {\n parser.number += token;\n parser.hasExponent = true;\n continue;\n }\n if (isPathLetter.test(token)) {\n if (parser.inNumber) {\n finalizeNumber(parser, false);\n } else if (!segmentComplete(parser)) {\n throw new Error('parser Error');\n } else {\n finalizeSegment(parser);\n }\n --index;\n }\n }\n if (parser.inNumber) {\n finalizeNumber(parser, false);\n }\n if (parser.inSegment && segmentComplete(parser)) {\n finalizeSegment(parser);\n }\n return parser.segments;\n}\n\nfunction arrayToString(a) {\n let s = '';\n for (let i = 0, il = a.length; i < il; i++) {\n s += a[i][0];\n if (a[i][1] != null) {\n s += a[i][1];\n if (a[i][2] != null) {\n s += ' ';\n s += a[i][2];\n if (a[i][3] != null) {\n s += ' ';\n s += a[i][3];\n s += ' ';\n s += a[i][4];\n if (a[i][5] != null) {\n s += ' ';\n s += a[i][5];\n s += ' ';\n s += a[i][6];\n if (a[i][7] != null) {\n s += ' ';\n s += a[i][7];\n }\n }\n }\n }\n }\n }\n return s + ' ';\n}\nclass PathArray extends SVGArray {\n // Get bounding box of path\n bbox() {\n parser().path.setAttribute('d', this.toString());\n return new Box(parser.nodes.path.getBBox());\n }\n\n // Move path string\n move(x, y) {\n // get bounding box of current situation\n const box = this.bbox();\n\n // get relative offset\n x -= box.x;\n y -= box.y;\n if (!isNaN(x) && !isNaN(y)) {\n // move every point\n for (let l, i = this.length - 1; i >= 0; i--) {\n l = this[i][0];\n if (l === 'M' || l === 'L' || l === 'T') {\n this[i][1] += x;\n this[i][2] += y;\n } else if (l === 'H') {\n this[i][1] += x;\n } else if (l === 'V') {\n this[i][1] += y;\n } else if (l === 'C' || l === 'S' || l === 'Q') {\n this[i][1] += x;\n this[i][2] += y;\n this[i][3] += x;\n this[i][4] += y;\n if (l === 'C') {\n this[i][5] += x;\n this[i][6] += y;\n }\n } else if (l === 'A') {\n this[i][6] += x;\n this[i][7] += y;\n }\n }\n }\n return this;\n }\n\n // Absolutize and parse path to array\n parse(d = 'M0 0') {\n if (Array.isArray(d)) {\n d = Array.prototype.concat.apply([], d).toString();\n }\n return pathParser(d);\n }\n\n // Resize path string\n size(width, height) {\n // get bounding box of current situation\n const box = this.bbox();\n let i, l;\n\n // If the box width or height is 0 then we ignore\n // transformations on the respective axis\n box.width = box.width === 0 ? 1 : box.width;\n box.height = box.height === 0 ? 1 : box.height;\n\n // recalculate position of all points according to new size\n for (i = this.length - 1; i >= 0; i--) {\n l = this[i][0];\n if (l === 'M' || l === 'L' || l === 'T') {\n this[i][1] = (this[i][1] - box.x) * width / box.width + box.x;\n this[i][2] = (this[i][2] - box.y) * height / box.height + box.y;\n } else if (l === 'H') {\n this[i][1] = (this[i][1] - box.x) * width / box.width + box.x;\n } else if (l === 'V') {\n this[i][1] = (this[i][1] - box.y) * height / box.height + box.y;\n } else if (l === 'C' || l === 'S' || l === 'Q') {\n this[i][1] = (this[i][1] - box.x) * width / box.width + box.x;\n this[i][2] = (this[i][2] - box.y) * height / box.height + box.y;\n this[i][3] = (this[i][3] - box.x) * width / box.width + box.x;\n this[i][4] = (this[i][4] - box.y) * height / box.height + box.y;\n if (l === 'C') {\n this[i][5] = (this[i][5] - box.x) * width / box.width + box.x;\n this[i][6] = (this[i][6] - box.y) * height / box.height + box.y;\n }\n } else if (l === 'A') {\n // resize radii\n this[i][1] = this[i][1] * width / box.width;\n this[i][2] = this[i][2] * height / box.height;\n\n // move position values\n this[i][6] = (this[i][6] - box.x) * width / box.width + box.x;\n this[i][7] = (this[i][7] - box.y) * height / box.height + box.y;\n }\n }\n return this;\n }\n\n // Convert array to string\n toString() {\n return arrayToString(this);\n }\n}\n\nconst getClassForType = value => {\n const type = typeof value;\n if (type === 'number') {\n return SVGNumber;\n } else if (type === 'string') {\n if (Color.isColor(value)) {\n return Color;\n } else if (delimiter.test(value)) {\n return isPathLetter.test(value) ? PathArray : SVGArray;\n } else if (numberAndUnit.test(value)) {\n return SVGNumber;\n } else {\n return NonMorphable;\n }\n } else if (morphableTypes.indexOf(value.constructor) > -1) {\n return value.constructor;\n } else if (Array.isArray(value)) {\n return SVGArray;\n } else if (type === 'object') {\n return ObjectBag;\n } else {\n return NonMorphable;\n }\n};\nclass Morphable {\n constructor(stepper) {\n this._stepper = stepper || new Ease('-');\n this._from = null;\n this._to = null;\n this._type = null;\n this._context = null;\n this._morphObj = null;\n }\n at(pos) {\n return this._morphObj.morph(this._from, this._to, pos, this._stepper, this._context);\n }\n done() {\n const complete = this._context.map(this._stepper.done).reduce(function (last, curr) {\n return last && curr;\n }, true);\n return complete;\n }\n from(val) {\n if (val == null) {\n return this._from;\n }\n this._from = this._set(val);\n return this;\n }\n stepper(stepper) {\n if (stepper == null) return this._stepper;\n this._stepper = stepper;\n return this;\n }\n to(val) {\n if (val == null) {\n return this._to;\n }\n this._to = this._set(val);\n return this;\n }\n type(type) {\n // getter\n if (type == null) {\n return this._type;\n }\n\n // setter\n this._type = type;\n return this;\n }\n _set(value) {\n if (!this._type) {\n this.type(getClassForType(value));\n }\n let result = new this._type(value);\n if (this._type === Color) {\n result = this._to ? result[this._to[4]]() : this._from ? result[this._from[4]]() : result;\n }\n if (this._type === ObjectBag) {\n result = this._to ? result.align(this._to) : this._from ? result.align(this._from) : result;\n }\n result = result.toConsumable();\n this._morphObj = this._morphObj || new this._type();\n this._context = this._context || Array.apply(null, Array(result.length)).map(Object).map(function (o) {\n o.done = true;\n return o;\n });\n return result;\n }\n}\nclass NonMorphable {\n constructor(...args) {\n this.init(...args);\n }\n init(val) {\n val = Array.isArray(val) ? val[0] : val;\n this.value = val;\n return this;\n }\n toArray() {\n return [this.value];\n }\n valueOf() {\n return this.value;\n }\n}\nclass TransformBag {\n constructor(...args) {\n this.init(...args);\n }\n init(obj) {\n if (Array.isArray(obj)) {\n obj = {\n scaleX: obj[0],\n scaleY: obj[1],\n shear: obj[2],\n rotate: obj[3],\n translateX: obj[4],\n translateY: obj[5],\n originX: obj[6],\n originY: obj[7]\n };\n }\n Object.assign(this, TransformBag.defaults, obj);\n return this;\n }\n toArray() {\n const v = this;\n return [v.scaleX, v.scaleY, v.shear, v.rotate, v.translateX, v.translateY, v.originX, v.originY];\n }\n}\nTransformBag.defaults = {\n scaleX: 1,\n scaleY: 1,\n shear: 0,\n rotate: 0,\n translateX: 0,\n translateY: 0,\n originX: 0,\n originY: 0\n};\nconst sortByKey = (a, b) => {\n return a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0;\n};\nclass ObjectBag {\n constructor(...args) {\n this.init(...args);\n }\n align(other) {\n const values = this.values;\n for (let i = 0, il = values.length; i < il; ++i) {\n // If the type is the same we only need to check if the color is in the correct format\n if (values[i + 1] === other[i + 1]) {\n if (values[i + 1] === Color && other[i + 7] !== values[i + 7]) {\n const space = other[i + 7];\n const color = new Color(this.values.splice(i + 3, 5))[space]().toArray();\n this.values.splice(i + 3, 0, ...color);\n }\n i += values[i + 2] + 2;\n continue;\n }\n if (!other[i + 1]) {\n return this;\n }\n\n // The types differ, so we overwrite the new type with the old one\n // And initialize it with the types default (e.g. black for color or 0 for number)\n const defaultObject = new other[i + 1]().toArray();\n\n // Than we fix the values array\n const toDelete = values[i + 2] + 3;\n values.splice(i, toDelete, other[i], other[i + 1], other[i + 2], ...defaultObject);\n i += values[i + 2] + 2;\n }\n return this;\n }\n init(objOrArr) {\n this.values = [];\n if (Array.isArray(objOrArr)) {\n this.values = objOrArr.slice();\n return;\n }\n objOrArr = objOrArr || {};\n const entries = [];\n for (const i in objOrArr) {\n const Type = getClassForType(objOrArr[i]);\n const val = new Type(objOrArr[i]).toArray();\n entries.push([i, Type, val.length, ...val]);\n }\n entries.sort(sortByKey);\n this.values = entries.reduce((last, curr) => last.concat(curr), []);\n return this;\n }\n toArray() {\n return this.values;\n }\n valueOf() {\n const obj = {};\n const arr = this.values;\n\n // for (var i = 0, len = arr.length; i < len; i += 2) {\n while (arr.length) {\n const key = arr.shift();\n const Type = arr.shift();\n const num = arr.shift();\n const values = arr.splice(0, num);\n obj[key] = new Type(values); // .valueOf()\n }\n return obj;\n }\n}\nconst morphableTypes = [NonMorphable, TransformBag, ObjectBag];\nfunction registerMorphableType(type = []) {\n morphableTypes.push(...[].concat(type));\n}\nfunction makeMorphable() {\n extend(morphableTypes, {\n to(val) {\n return new Morphable().type(this.constructor).from(this.toArray()) // this.valueOf())\n .to(val);\n },\n fromArray(arr) {\n this.init(arr);\n return this;\n },\n toConsumable() {\n return this.toArray();\n },\n morph(from, to, pos, stepper, context) {\n const mapper = function (i, index) {\n return stepper.step(i, to[index], pos, context[index], context);\n };\n return this.fromArray(from.map(mapper));\n }\n });\n}\n\nclass Path extends Shape {\n // Initialize node\n constructor(node, attrs = node) {\n super(nodeOrNew('path', node), attrs);\n }\n\n // Get array\n array() {\n return this._array || (this._array = new PathArray(this.attr('d')));\n }\n\n // Clear array cache\n clear() {\n delete this._array;\n return this;\n }\n\n // Set height of element\n height(height) {\n return height == null ? this.bbox().height : this.size(this.bbox().width, height);\n }\n\n // Move by left top corner\n move(x, y) {\n return this.attr('d', this.array().move(x, y));\n }\n\n // Plot new path\n plot(d) {\n return d == null ? this.array() : this.clear().attr('d', typeof d === 'string' ? d : this._array = new PathArray(d));\n }\n\n // Set element size to given width and height\n size(width, height) {\n const p = proportionalSize(this, width, height);\n return this.attr('d', this.array().size(p.width, p.height));\n }\n\n // Set width of element\n width(width) {\n return width == null ? this.bbox().width : this.size(width, this.bbox().height);\n }\n\n // Move by left top corner over x-axis\n x(x) {\n return x == null ? this.bbox().x : this.move(x, this.bbox().y);\n }\n\n // Move by left top corner over y-axis\n y(y) {\n return y == null ? this.bbox().y : this.move(this.bbox().x, y);\n }\n}\n\n// Define morphable array\nPath.prototype.MorphArray = PathArray;\n\n// Add parent method\nregisterMethods({\n Container: {\n // Create a wrapped path element\n path: wrapWithAttrCheck(function (d) {\n // make sure plot is called as a setter\n return this.put(new Path()).plot(d || new PathArray());\n })\n }\n});\nregister(Path, 'Path');\n\n// Get array\nfunction array() {\n return this._array || (this._array = new PointArray(this.attr('points')));\n}\n\n// Clear array cache\nfunction clear() {\n delete this._array;\n return this;\n}\n\n// Move by left top corner\nfunction move$2(x, y) {\n return this.attr('points', this.array().move(x, y));\n}\n\n// Plot new path\nfunction plot(p) {\n return p == null ? this.array() : this.clear().attr('points', typeof p === 'string' ? p : this._array = new PointArray(p));\n}\n\n// Set element size to given width and height\nfunction size$1(width, height) {\n const p = proportionalSize(this, width, height);\n return this.attr('points', this.array().size(p.width, p.height));\n}\n\nvar poly = {\n __proto__: null,\n array: array,\n clear: clear,\n move: move$2,\n plot: plot,\n size: size$1\n};\n\nclass Polygon extends Shape {\n // Initialize node\n constructor(node, attrs = node) {\n super(nodeOrNew('polygon', node), attrs);\n }\n}\nregisterMethods({\n Container: {\n // Create a wrapped polygon element\n polygon: wrapWithAttrCheck(function (p) {\n // make sure plot is called as a setter\n return this.put(new Polygon()).plot(p || new PointArray());\n })\n }\n});\nextend(Polygon, pointed);\nextend(Polygon, poly);\nregister(Polygon, 'Polygon');\n\nclass Polyline extends Shape {\n // Initialize node\n constructor(node, attrs = node) {\n super(nodeOrNew('polyline', node), attrs);\n }\n}\nregisterMethods({\n Container: {\n // Create a wrapped polygon element\n polyline: wrapWithAttrCheck(function (p) {\n // make sure plot is called as a setter\n return this.put(new Polyline()).plot(p || new PointArray());\n })\n }\n});\nextend(Polyline, pointed);\nextend(Polyline, poly);\nregister(Polyline, 'Polyline');\n\nclass Rect extends Shape {\n // Initialize node\n constructor(node, attrs = node) {\n super(nodeOrNew('rect', node), attrs);\n }\n}\nextend(Rect, {\n rx,\n ry\n});\nregisterMethods({\n Container: {\n // Create a rect element\n rect: wrapWithAttrCheck(function (width, height) {\n return this.put(new Rect()).size(width, height);\n })\n }\n});\nregister(Rect, 'Rect');\n\nclass Queue {\n constructor() {\n this._first = null;\n this._last = null;\n }\n\n // Shows us the first item in the list\n first() {\n return this._first && this._first.value;\n }\n\n // Shows us the last item in the list\n last() {\n return this._last && this._last.value;\n }\n push(value) {\n // An item stores an id and the provided value\n const item = typeof value.next !== 'undefined' ? value : {\n value: value,\n next: null,\n prev: null\n };\n\n // Deal with the queue being empty or populated\n if (this._last) {\n item.prev = this._last;\n this._last.next = item;\n this._last = item;\n } else {\n this._last = item;\n this._first = item;\n }\n\n // Return the current item\n return item;\n }\n\n // Removes the item that was returned from the push\n remove(item) {\n // Relink the previous item\n if (item.prev) item.prev.next = item.next;\n if (item.next) item.next.prev = item.prev;\n if (item === this._last) this._last = item.prev;\n if (item === this._first) this._first = item.next;\n\n // Invalidate item\n item.prev = null;\n item.next = null;\n }\n shift() {\n // Check if we have a value\n const remove = this._first;\n if (!remove) return null;\n\n // If we do, remove it and relink things\n this._first = remove.next;\n if (this._first) this._first.prev = null;\n this._last = this._first ? this._last : null;\n return remove.value;\n }\n}\n\nconst Animator = {\n nextDraw: null,\n frames: new Queue(),\n timeouts: new Queue(),\n immediates: new Queue(),\n timer: () => globals.window.performance || globals.window.Date,\n transforms: [],\n frame(fn) {\n // Store the node\n const node = Animator.frames.push({\n run: fn\n });\n\n // Request an animation frame if we don't have one\n if (Animator.nextDraw === null) {\n Animator.nextDraw = globals.window.requestAnimationFrame(Animator._draw);\n }\n\n // Return the node so we can remove it easily\n return node;\n },\n timeout(fn, delay) {\n delay = delay || 0;\n\n // Work out when the event should fire\n const time = Animator.timer().now() + delay;\n\n // Add the timeout to the end of the queue\n const node = Animator.timeouts.push({\n run: fn,\n time: time\n });\n\n // Request another animation frame if we need one\n if (Animator.nextDraw === null) {\n Animator.nextDraw = globals.window.requestAnimationFrame(Animator._draw);\n }\n return node;\n },\n immediate(fn) {\n // Add the immediate fn to the end of the queue\n const node = Animator.immediates.push(fn);\n // Request another animation frame if we need one\n if (Animator.nextDraw === null) {\n Animator.nextDraw = globals.window.requestAnimationFrame(Animator._draw);\n }\n return node;\n },\n cancelFrame(node) {\n node != null && Animator.frames.remove(node);\n },\n clearTimeout(node) {\n node != null && Animator.timeouts.remove(node);\n },\n cancelImmediate(node) {\n node != null && Animator.immediates.remove(node);\n },\n _draw(now) {\n // Run all the timeouts we can run, if they are not ready yet, add them\n // to the end of the queue immediately! (bad timeouts!!! [sarcasm])\n let nextTimeout = null;\n const lastTimeout = Animator.timeouts.last();\n while (nextTimeout = Animator.timeouts.shift()) {\n // Run the timeout if its time, or push it to the end\n if (now >= nextTimeout.time) {\n nextTimeout.run();\n } else {\n Animator.timeouts.push(nextTimeout);\n }\n\n // If we hit the last item, we should stop shifting out more items\n if (nextTimeout === lastTimeout) break;\n }\n\n // Run all of the animation frames\n let nextFrame = null;\n const lastFrame = Animator.frames.last();\n while (nextFrame !== lastFrame && (nextFrame = Animator.frames.shift())) {\n nextFrame.run(now);\n }\n let nextImmediate = null;\n while (nextImmediate = Animator.immediates.shift()) {\n nextImmediate();\n }\n\n // If we have remaining timeouts or frames, draw until we don't anymore\n Animator.nextDraw = Animator.timeouts.first() || Animator.frames.first() ? globals.window.requestAnimationFrame(Animator._draw) : null;\n }\n};\n\nconst makeSchedule = function (runnerInfo) {\n const start = runnerInfo.start;\n const duration = runnerInfo.runner.duration();\n const end = start + duration;\n return {\n start: start,\n duration: duration,\n end: end,\n runner: runnerInfo.runner\n };\n};\nconst defaultSource = function () {\n const w = globals.window;\n return (w.performance || w.Date).now();\n};\nclass Timeline extends EventTarget {\n // Construct a new timeline on the given element\n constructor(timeSource = defaultSource) {\n super();\n this._timeSource = timeSource;\n\n // terminate resets all variables to their initial state\n this.terminate();\n }\n active() {\n return !!this._nextFrame;\n }\n finish() {\n // Go to end and pause\n this.time(this.getEndTimeOfTimeline() + 1);\n return this.pause();\n }\n\n // Calculates the end of the timeline\n getEndTime() {\n const lastRunnerInfo = this.getLastRunnerInfo();\n const lastDuration = lastRunnerInfo ? lastRunnerInfo.runner.duration() : 0;\n const lastStartTime = lastRunnerInfo ? lastRunnerInfo.start : this._time;\n return lastStartTime + lastDuration;\n }\n getEndTimeOfTimeline() {\n const endTimes = this._runners.map(i => i.start + i.runner.duration());\n return Math.max(0, ...endTimes);\n }\n getLastRunnerInfo() {\n return this.getRunnerInfoById(this._lastRunnerId);\n }\n getRunnerInfoById(id) {\n return this._runners[this._runnerIds.indexOf(id)] || null;\n }\n pause() {\n this._paused = true;\n return this._continue();\n }\n persist(dtOrForever) {\n if (dtOrForever == null) return this._persist;\n this._persist = dtOrForever;\n return this;\n }\n play() {\n // Now make sure we are not paused and continue the animation\n this._paused = false;\n return this.updateTime()._continue();\n }\n reverse(yes) {\n const currentSpeed = this.speed();\n if (yes == null) return this.speed(-currentSpeed);\n const positive = Math.abs(currentSpeed);\n return this.speed(yes ? -positive : positive);\n }\n\n // schedules a runner on the timeline\n schedule(runner, delay, when) {\n if (runner == null) {\n return this._runners.map(makeSchedule);\n }\n\n // The start time for the next animation can either be given explicitly,\n // derived from the current timeline time or it can be relative to the\n // last start time to chain animations directly\n\n let absoluteStartTime = 0;\n const endTime = this.getEndTime();\n delay = delay || 0;\n\n // Work out when to start the animation\n if (when == null || when === 'last' || when === 'after') {\n // Take the last time and increment\n absoluteStartTime = endTime;\n } else if (when === 'absolute' || when === 'start') {\n absoluteStartTime = delay;\n delay = 0;\n } else if (when === 'now') {\n absoluteStartTime = this._time;\n } else if (when === 'relative') {\n const runnerInfo = this.getRunnerInfoById(runner.id);\n if (runnerInfo) {\n absoluteStartTime = runnerInfo.start + delay;\n delay = 0;\n }\n } else if (when === 'with-last') {\n const lastRunnerInfo = this.getLastRunnerInfo();\n const lastStartTime = lastRunnerInfo ? lastRunnerInfo.start : this._time;\n absoluteStartTime = lastStartTime;\n } else {\n throw new Error('Invalid value for the \"when\" parameter');\n }\n\n // Manage runner\n runner.unschedule();\n runner.timeline(this);\n const persist = runner.persist();\n const runnerInfo = {\n persist: persist === null ? this._persist : persist,\n start: absoluteStartTime + delay,\n runner\n };\n this._lastRunnerId = runner.id;\n this._runners.push(runnerInfo);\n this._runners.sort((a, b) => a.start - b.start);\n this._runnerIds = this._runners.map(info => info.runner.id);\n this.updateTime()._continue();\n return this;\n }\n seek(dt) {\n return this.time(this._time + dt);\n }\n source(fn) {\n if (fn == null) return this._timeSource;\n this._timeSource = fn;\n return this;\n }\n speed(speed) {\n if (speed == null) return this._speed;\n this._speed = speed;\n return this;\n }\n stop() {\n // Go to start and pause\n this.time(0);\n return this.pause();\n }\n time(time) {\n if (time == null) return this._time;\n this._time = time;\n return this._continue(true);\n }\n\n // Remove the runner from this timeline\n unschedule(runner) {\n const index = this._runnerIds.indexOf(runner.id);\n if (index < 0) return this;\n this._runners.splice(index, 1);\n this._runnerIds.splice(index, 1);\n runner.timeline(null);\n return this;\n }\n\n // Makes sure, that after pausing the time doesn't jump\n updateTime() {\n if (!this.active()) {\n this._lastSourceTime = this._timeSource();\n }\n return this;\n }\n\n // Checks if we are running and continues the animation\n _continue(immediateStep = false) {\n Animator.cancelFrame(this._nextFrame);\n this._nextFrame = null;\n if (immediateStep) return this._stepImmediate();\n if (this._paused) return this;\n this._nextFrame = Animator.frame(this._step);\n return this;\n }\n _stepFn(immediateStep = false) {\n // Get the time delta from the last time and update the time\n const time = this._timeSource();\n let dtSource = time - this._lastSourceTime;\n if (immediateStep) dtSource = 0;\n const dtTime = this._speed * dtSource + (this._time - this._lastStepTime);\n this._lastSourceTime = time;\n\n // Only update the time if we use the timeSource.\n // Otherwise use the current time\n if (!immediateStep) {\n // Update the time\n this._time += dtTime;\n this._time = this._time < 0 ? 0 : this._time;\n }\n this._lastStepTime = this._time;\n this.fire('time', this._time);\n\n // This is for the case that the timeline was seeked so that the time\n // is now before the startTime of the runner. That is why we need to set\n // the runner to position 0\n\n // FIXME:\n // However, resetting in insertion order leads to bugs. Considering the case,\n // where 2 runners change the same attribute but in different times,\n // resetting both of them will lead to the case where the later defined\n // runner always wins the reset even if the other runner started earlier\n // and therefore should win the attribute battle\n // this can be solved by resetting them backwards\n for (let k = this._runners.length; k--;) {\n // Get and run the current runner and ignore it if its inactive\n const runnerInfo = this._runners[k];\n const runner = runnerInfo.runner;\n\n // Make sure that we give the actual difference\n // between runner start time and now\n const dtToStart = this._time - runnerInfo.start;\n\n // Dont run runner if not started yet\n // and try to reset it\n if (dtToStart <= 0) {\n runner.reset();\n }\n }\n\n // Run all of the runners directly\n let runnersLeft = false;\n for (let i = 0, len = this._runners.length; i < len; i++) {\n // Get and run the current runner and ignore it if its inactive\n const runnerInfo = this._runners[i];\n const runner = runnerInfo.runner;\n let dt = dtTime;\n\n // Make sure that we give the actual difference\n // between runner start time and now\n const dtToStart = this._time - runnerInfo.start;\n\n // Dont run runner if not started yet\n if (dtToStart <= 0) {\n runnersLeft = true;\n continue;\n } else if (dtToStart < dt) {\n // Adjust dt to make sure that animation is on point\n dt = dtToStart;\n }\n if (!runner.active()) continue;\n\n // If this runner is still going, signal that we need another animation\n // frame, otherwise, remove the completed runner\n const finished = runner.step(dt).done;\n if (!finished) {\n runnersLeft = true;\n // continue\n } else if (runnerInfo.persist !== true) {\n // runner is finished. And runner might get removed\n const endTime = runner.duration() - runner.time() + this._time;\n if (endTime + runnerInfo.persist < this._time) {\n // Delete runner and correct index\n runner.unschedule();\n --i;\n --len;\n }\n }\n }\n\n // Basically: we continue when there are runners right from us in time\n // when -->, and when runners are left from us when <--\n if (runnersLeft && !(this._speed < 0 && this._time === 0) || this._runnerIds.length && this._speed < 0 && this._time > 0) {\n this._continue();\n } else {\n this.pause();\n this.fire('finished');\n }\n return this;\n }\n terminate() {\n // cleanup memory\n\n // Store the timing variables\n this._startTime = 0;\n this._speed = 1.0;\n\n // Determines how long a runner is hold in memory. Can be a dt or true/false\n this._persist = 0;\n\n // Keep track of the running animations and their starting parameters\n this._nextFrame = null;\n this._paused = true;\n this._runners = [];\n this._runnerIds = [];\n this._lastRunnerId = -1;\n this._time = 0;\n this._lastSourceTime = 0;\n this._lastStepTime = 0;\n\n // Make sure that step is always called in class context\n this._step = this._stepFn.bind(this, false);\n this._stepImmediate = this._stepFn.bind(this, true);\n }\n}\nregisterMethods({\n Element: {\n timeline: function (timeline) {\n if (timeline == null) {\n this._timeline = this._timeline || new Timeline();\n return this._timeline;\n } else {\n this._timeline = timeline;\n return this;\n }\n }\n }\n});\n\nclass Runner extends EventTarget {\n constructor(options) {\n super();\n\n // Store a unique id on the runner, so that we can identify it later\n this.id = Runner.id++;\n\n // Ensure a default value\n options = options == null ? timeline.duration : options;\n\n // Ensure that we get a controller\n options = typeof options === 'function' ? new Controller(options) : options;\n\n // Declare all of the variables\n this._element = null;\n this._timeline = null;\n this.done = false;\n this._queue = [];\n\n // Work out the stepper and the duration\n this._duration = typeof options === 'number' && options;\n this._isDeclarative = options instanceof Controller;\n this._stepper = this._isDeclarative ? options : new Ease();\n\n // We copy the current values from the timeline because they can change\n this._history = {};\n\n // Store the state of the runner\n this.enabled = true;\n this._time = 0;\n this._lastTime = 0;\n\n // At creation, the runner is in reset state\n this._reseted = true;\n\n // Save transforms applied to this runner\n this.transforms = new Matrix();\n this.transformId = 1;\n\n // Looping variables\n this._haveReversed = false;\n this._reverse = false;\n this._loopsDone = 0;\n this._swing = false;\n this._wait = 0;\n this._times = 1;\n this._frameId = null;\n\n // Stores how long a runner is stored after being done\n this._persist = this._isDeclarative ? true : null;\n }\n static sanitise(duration, delay, when) {\n // Initialise the default parameters\n let times = 1;\n let swing = false;\n let wait = 0;\n duration = duration ?? timeline.duration;\n delay = delay ?? timeline.delay;\n when = when || 'last';\n\n // If we have an object, unpack the values\n if (typeof duration === 'object' && !(duration instanceof Stepper)) {\n delay = duration.delay ?? delay;\n when = duration.when ?? when;\n swing = duration.swing || swing;\n times = duration.times ?? times;\n wait = duration.wait ?? wait;\n duration = duration.duration ?? timeline.duration;\n }\n return {\n duration: duration,\n delay: delay,\n swing: swing,\n times: times,\n wait: wait,\n when: when\n };\n }\n active(enabled) {\n if (enabled == null) return this.enabled;\n this.enabled = enabled;\n return this;\n }\n\n /*\n Private Methods\n ===============\n Methods that shouldn't be used externally\n */\n addTransform(transform) {\n this.transforms.lmultiplyO(transform);\n return this;\n }\n after(fn) {\n return this.on('finished', fn);\n }\n animate(duration, delay, when) {\n const o = Runner.sanitise(duration, delay, when);\n const runner = new Runner(o.duration);\n if (this._timeline) runner.timeline(this._timeline);\n if (this._element) runner.element(this._element);\n return runner.loop(o).schedule(o.delay, o.when);\n }\n clearTransform() {\n this.transforms = new Matrix();\n return this;\n }\n\n // TODO: Keep track of all transformations so that deletion is faster\n clearTransformsFromQueue() {\n if (!this.done || !this._timeline || !this._timeline._runnerIds.includes(this.id)) {\n this._queue = this._queue.filter(item => {\n return !item.isTransform;\n });\n }\n }\n delay(delay) {\n return this.animate(0, delay);\n }\n duration() {\n return this._times * (this._wait + this._duration) - this._wait;\n }\n during(fn) {\n return this.queue(null, fn);\n }\n ease(fn) {\n this._stepper = new Ease(fn);\n return this;\n }\n /*\n Runner Definitions\n ==================\n These methods help us define the runtime behaviour of the Runner or they\n help us make new runners from the current runner\n */\n\n element(element) {\n if (element == null) return this._element;\n this._element = element;\n element._prepareRunner();\n return this;\n }\n finish() {\n return this.step(Infinity);\n }\n loop(times, swing, wait) {\n // Deal with the user passing in an object\n if (typeof times === 'object') {\n swing = times.swing;\n wait = times.wait;\n times = times.times;\n }\n\n // Sanitise the values and store them\n this._times = times || Infinity;\n this._swing = swing || false;\n this._wait = wait || 0;\n\n // Allow true to be passed\n if (this._times === true) {\n this._times = Infinity;\n }\n return this;\n }\n loops(p) {\n const loopDuration = this._duration + this._wait;\n if (p == null) {\n const loopsDone = Math.floor(this._time / loopDuration);\n const relativeTime = this._time - loopsDone * loopDuration;\n const position = relativeTime / this._duration;\n return Math.min(loopsDone + position, this._times);\n }\n const whole = Math.floor(p);\n const partial = p % 1;\n const time = loopDuration * whole + this._duration * partial;\n return this.time(time);\n }\n persist(dtOrForever) {\n if (dtOrForever == null) return this._persist;\n this._persist = dtOrForever;\n return this;\n }\n position(p) {\n // Get all of the variables we need\n const x = this._time;\n const d = this._duration;\n const w = this._wait;\n const t = this._times;\n const s = this._swing;\n const r = this._reverse;\n let position;\n if (p == null) {\n /*\n This function converts a time to a position in the range [0, 1]\n The full explanation can be found in this desmos demonstration\n https://www.desmos.com/calculator/u4fbavgche\n The logic is slightly simplified here because we can use booleans\n */\n\n // Figure out the value without thinking about the start or end time\n const f = function (x) {\n const swinging = s * Math.floor(x % (2 * (w + d)) / (w + d));\n const backwards = swinging && !r || !swinging && r;\n const uncliped = Math.pow(-1, backwards) * (x % (w + d)) / d + backwards;\n const clipped = Math.max(Math.min(uncliped, 1), 0);\n return clipped;\n };\n\n // Figure out the value by incorporating the start time\n const endTime = t * (w + d) - w;\n position = x <= 0 ? Math.round(f(1e-5)) : x < endTime ? f(x) : Math.round(f(endTime - 1e-5));\n return position;\n }\n\n // Work out the loops done and add the position to the loops done\n const loopsDone = Math.floor(this.loops());\n const swingForward = s && loopsDone % 2 === 0;\n const forwards = swingForward && !r || r && swingForward;\n position = loopsDone + (forwards ? p : 1 - p);\n return this.loops(position);\n }\n progress(p) {\n if (p == null) {\n return Math.min(1, this._time / this.duration());\n }\n return this.time(p * this.duration());\n }\n\n /*\n Basic Functionality\n ===================\n These methods allow us to attach basic functions to the runner directly\n */\n queue(initFn, runFn, retargetFn, isTransform) {\n this._queue.push({\n initialiser: initFn || noop,\n runner: runFn || noop,\n retarget: retargetFn,\n isTransform: isTransform,\n initialised: false,\n finished: false\n });\n const timeline = this.timeline();\n timeline && this.timeline()._continue();\n return this;\n }\n reset() {\n if (this._reseted) return this;\n this.time(0);\n this._reseted = true;\n return this;\n }\n reverse(reverse) {\n this._reverse = reverse == null ? !this._reverse : reverse;\n return this;\n }\n schedule(timeline, delay, when) {\n // The user doesn't need to pass a timeline if we already have one\n if (!(timeline instanceof Timeline)) {\n when = delay;\n delay = timeline;\n timeline = this.timeline();\n }\n\n // If there is no timeline, yell at the user...\n if (!timeline) {\n throw Error('Runner cannot be scheduled without timeline');\n }\n\n // Schedule the runner on the timeline provided\n timeline.schedule(this, delay, when);\n return this;\n }\n step(dt) {\n // If we are inactive, this stepper just gets skipped\n if (!this.enabled) return this;\n\n // Update the time and get the new position\n dt = dt == null ? 16 : dt;\n this._time += dt;\n const position = this.position();\n\n // Figure out if we need to run the stepper in this frame\n const running = this._lastPosition !== position && this._time >= 0;\n this._lastPosition = position;\n\n // Figure out if we just started\n const duration = this.duration();\n const justStarted = this._lastTime <= 0 && this._time > 0;\n const justFinished = this._lastTime < duration && this._time >= duration;\n this._lastTime = this._time;\n if (justStarted) {\n this.fire('start', this);\n }\n\n // Work out if the runner is finished set the done flag here so animations\n // know, that they are running in the last step (this is good for\n // transformations which can be merged)\n const declarative = this._isDeclarative;\n this.done = !declarative && !justFinished && this._time >= duration;\n\n // Runner is running. So its not in reset state anymore\n this._reseted = false;\n let converged = false;\n // Call initialise and the run function\n if (running || declarative) {\n this._initialise(running);\n\n // clear the transforms on this runner so they dont get added again and again\n this.transforms = new Matrix();\n converged = this._run(declarative ? dt : position);\n this.fire('step', this);\n }\n // correct the done flag here\n // declarative animations itself know when they converged\n this.done = this.done || converged && declarative;\n if (justFinished) {\n this.fire('finished', this);\n }\n return this;\n }\n\n /*\n Runner animation methods\n ========================\n Control how the animation plays\n */\n time(time) {\n if (time == null) {\n return this._time;\n }\n const dt = time - this._time;\n this.step(dt);\n return this;\n }\n timeline(timeline) {\n // check explicitly for undefined so we can set the timeline to null\n if (typeof timeline === 'undefined') return this._timeline;\n this._timeline = timeline;\n return this;\n }\n unschedule() {\n const timeline = this.timeline();\n timeline && timeline.unschedule(this);\n return this;\n }\n\n // Run each initialise function in the runner if required\n _initialise(running) {\n // If we aren't running, we shouldn't initialise when not declarative\n if (!running && !this._isDeclarative) return;\n\n // Loop through all of the initialisers\n for (let i = 0, len = this._queue.length; i < len; ++i) {\n // Get the current initialiser\n const current = this._queue[i];\n\n // Determine whether we need to initialise\n const needsIt = this._isDeclarative || !current.initialised && running;\n running = !current.finished;\n\n // Call the initialiser if we need to\n if (needsIt && running) {\n current.initialiser.call(this);\n current.initialised = true;\n }\n }\n }\n\n // Save a morpher to the morpher list so that we can retarget it later\n _rememberMorpher(method, morpher) {\n this._history[method] = {\n morpher: morpher,\n caller: this._queue[this._queue.length - 1]\n };\n\n // We have to resume the timeline in case a controller\n // is already done without being ever run\n // This can happen when e.g. this is done:\n // anim = el.animate(new SVG.Spring)\n // and later\n // anim.move(...)\n if (this._isDeclarative) {\n const timeline = this.timeline();\n timeline && timeline.play();\n }\n }\n\n // Try to set the target for a morpher if the morpher exists, otherwise\n // Run each run function for the position or dt given\n _run(positionOrDt) {\n // Run all of the _queue directly\n let allfinished = true;\n for (let i = 0, len = this._queue.length; i < len; ++i) {\n // Get the current function to run\n const current = this._queue[i];\n\n // Run the function if its not finished, we keep track of the finished\n // flag for the sake of declarative _queue\n const converged = current.runner.call(this, positionOrDt);\n current.finished = current.finished || converged === true;\n allfinished = allfinished && current.finished;\n }\n\n // We report when all of the constructors are finished\n return allfinished;\n }\n\n // do nothing and return false\n _tryRetarget(method, target, extra) {\n if (this._history[method]) {\n // if the last method wasn't even initialised, throw it away\n if (!this._history[method].caller.initialised) {\n const index = this._queue.indexOf(this._history[method].caller);\n this._queue.splice(index, 1);\n return false;\n }\n\n // for the case of transformations, we use the special retarget function\n // which has access to the outer scope\n if (this._history[method].caller.retarget) {\n this._history[method].caller.retarget.call(this, target, extra);\n // for everything else a simple morpher change is sufficient\n } else {\n this._history[method].morpher.to(target);\n }\n this._history[method].caller.finished = false;\n const timeline = this.timeline();\n timeline && timeline.play();\n return true;\n }\n return false;\n }\n}\nRunner.id = 0;\nclass FakeRunner {\n constructor(transforms = new Matrix(), id = -1, done = true) {\n this.transforms = transforms;\n this.id = id;\n this.done = done;\n }\n clearTransformsFromQueue() {}\n}\nextend([Runner, FakeRunner], {\n mergeWith(runner) {\n return new FakeRunner(runner.transforms.lmultiply(this.transforms), runner.id);\n }\n});\n\n// FakeRunner.emptyRunner = new FakeRunner()\n\nconst lmultiply = (last, curr) => last.lmultiplyO(curr);\nconst getRunnerTransform = runner => runner.transforms;\nfunction mergeTransforms() {\n // Find the matrix to apply to the element and apply it\n const runners = this._transformationRunners.runners;\n const netTransform = runners.map(getRunnerTransform).reduce(lmultiply, new Matrix());\n this.transform(netTransform);\n this._transformationRunners.merge();\n if (this._transformationRunners.length() === 1) {\n this._frameId = null;\n }\n}\nclass RunnerArray {\n constructor() {\n this.runners = [];\n this.ids = [];\n }\n add(runner) {\n if (this.runners.includes(runner)) return;\n const id = runner.id + 1;\n this.runners.push(runner);\n this.ids.push(id);\n return this;\n }\n clearBefore(id) {\n const deleteCnt = this.ids.indexOf(id + 1) || 1;\n this.ids.splice(0, deleteCnt, 0);\n this.runners.splice(0, deleteCnt, new FakeRunner()).forEach(r => r.clearTransformsFromQueue());\n return this;\n }\n edit(id, newRunner) {\n const index = this.ids.indexOf(id + 1);\n this.ids.splice(index, 1, id + 1);\n this.runners.splice(index, 1, newRunner);\n return this;\n }\n getByID(id) {\n return this.runners[this.ids.indexOf(id + 1)];\n }\n length() {\n return this.ids.length;\n }\n merge() {\n let lastRunner = null;\n for (let i = 0; i < this.runners.length; ++i) {\n const runner = this.runners[i];\n const condition = lastRunner && runner.done && lastRunner.done && (\n // don't merge runner when persisted on timeline\n !runner._timeline || !runner._timeline._runnerIds.includes(runner.id)) && (!lastRunner._timeline || !lastRunner._timeline._runnerIds.includes(lastRunner.id));\n if (condition) {\n // the +1 happens in the function\n this.remove(runner.id);\n const newRunner = runner.mergeWith(lastRunner);\n this.edit(lastRunner.id, newRunner);\n lastRunner = newRunner;\n --i;\n } else {\n lastRunner = runner;\n }\n }\n return this;\n }\n remove(id) {\n const index = this.ids.indexOf(id + 1);\n this.ids.splice(index, 1);\n this.runners.splice(index, 1);\n return this;\n }\n}\nregisterMethods({\n Element: {\n animate(duration, delay, when) {\n const o = Runner.sanitise(duration, delay, when);\n const timeline = this.timeline();\n return new Runner(o.duration).loop(o).element(this).timeline(timeline.play()).schedule(o.delay, o.when);\n },\n delay(by, when) {\n return this.animate(0, by, when);\n },\n // this function searches for all runners on the element and deletes the ones\n // which run before the current one. This is because absolute transformations\n // overwrite anything anyway so there is no need to waste time computing\n // other runners\n _clearTransformRunnersBefore(currentRunner) {\n this._transformationRunners.clearBefore(currentRunner.id);\n },\n _currentTransform(current) {\n return this._transformationRunners.runners\n // we need the equal sign here to make sure, that also transformations\n // on the same runner which execute before the current transformation are\n // taken into account\n .filter(runner => runner.id <= current.id).map(getRunnerTransform).reduce(lmultiply, new Matrix());\n },\n _addRunner(runner) {\n this._transformationRunners.add(runner);\n\n // Make sure that the runner merge is executed at the very end of\n // all Animator functions. That is why we use immediate here to execute\n // the merge right after all frames are run\n Animator.cancelImmediate(this._frameId);\n this._frameId = Animator.immediate(mergeTransforms.bind(this));\n },\n _prepareRunner() {\n if (this._frameId == null) {\n this._transformationRunners = new RunnerArray().add(new FakeRunner(new Matrix(this)));\n }\n }\n }\n});\n\n// Will output the elements from array A that are not in the array B\nconst difference = (a, b) => a.filter(x => !b.includes(x));\nextend(Runner, {\n attr(a, v) {\n return this.styleAttr('attr', a, v);\n },\n // Add animatable styles\n css(s, v) {\n return this.styleAttr('css', s, v);\n },\n styleAttr(type, nameOrAttrs, val) {\n if (typeof nameOrAttrs === 'string') {\n return this.styleAttr(type, {\n [nameOrAttrs]: val\n });\n }\n let attrs = nameOrAttrs;\n if (this._tryRetarget(type, attrs)) return this;\n let morpher = new Morphable(this._stepper).to(attrs);\n let keys = Object.keys(attrs);\n this.queue(function () {\n morpher = morpher.from(this.element()[type](keys));\n }, function (pos) {\n this.element()[type](morpher.at(pos).valueOf());\n return morpher.done();\n }, function (newToAttrs) {\n // Check if any new keys were added\n const newKeys = Object.keys(newToAttrs);\n const differences = difference(newKeys, keys);\n\n // If their are new keys, initialize them and add them to morpher\n if (differences.length) {\n // Get the values\n const addedFromAttrs = this.element()[type](differences);\n\n // Get the already initialized values\n const oldFromAttrs = new ObjectBag(morpher.from()).valueOf();\n\n // Merge old and new\n Object.assign(oldFromAttrs, addedFromAttrs);\n morpher.from(oldFromAttrs);\n }\n\n // Get the object from the morpher\n const oldToAttrs = new ObjectBag(morpher.to()).valueOf();\n\n // Merge in new attributes\n Object.assign(oldToAttrs, newToAttrs);\n\n // Change morpher target\n morpher.to(oldToAttrs);\n\n // Make sure that we save the work we did so we don't need it to do again\n keys = newKeys;\n attrs = newToAttrs;\n });\n this._rememberMorpher(type, morpher);\n return this;\n },\n zoom(level, point) {\n if (this._tryRetarget('zoom', level, point)) return this;\n let morpher = new Morphable(this._stepper).to(new SVGNumber(level));\n this.queue(function () {\n morpher = morpher.from(this.element().zoom());\n }, function (pos) {\n this.element().zoom(morpher.at(pos), point);\n return morpher.done();\n }, function (newLevel, newPoint) {\n point = newPoint;\n morpher.to(newLevel);\n });\n this._rememberMorpher('zoom', morpher);\n return this;\n },\n /**\n ** absolute transformations\n **/\n\n //\n // M v -----|-----(D M v = F v)------|-----> T v\n //\n // 1. define the final state (T) and decompose it (once)\n // t = [tx, ty, the, lam, sy, sx]\n // 2. on every frame: pull the current state of all previous transforms\n // (M - m can change)\n // and then write this as m = [tx0, ty0, the0, lam0, sy0, sx0]\n // 3. Find the interpolated matrix F(pos) = m + pos * (t - m)\n // - Note F(0) = M\n // - Note F(1) = T\n // 4. Now you get the delta matrix as a result: D = F * inv(M)\n\n transform(transforms, relative, affine) {\n // If we have a declarative function, we should retarget it if possible\n relative = transforms.relative || relative;\n if (this._isDeclarative && !relative && this._tryRetarget('transform', transforms)) {\n return this;\n }\n\n // Parse the parameters\n const isMatrix = Matrix.isMatrixLike(transforms);\n affine = transforms.affine != null ? transforms.affine : affine != null ? affine : !isMatrix;\n\n // Create a morpher and set its type\n const morpher = new Morphable(this._stepper).type(affine ? TransformBag : Matrix);\n let origin;\n let element;\n let current;\n let currentAngle;\n let startTransform;\n function setup() {\n // make sure element and origin is defined\n element = element || this.element();\n origin = origin || getOrigin(transforms, element);\n startTransform = new Matrix(relative ? undefined : element);\n\n // add the runner to the element so it can merge transformations\n element._addRunner(this);\n\n // Deactivate all transforms that have run so far if we are absolute\n if (!relative) {\n element._clearTransformRunnersBefore(this);\n }\n }\n function run(pos) {\n // clear all other transforms before this in case something is saved\n // on this runner. We are absolute. We dont need these!\n if (!relative) this.clearTransform();\n const {\n x,\n y\n } = new Point(origin).transform(element._currentTransform(this));\n let target = new Matrix({\n ...transforms,\n origin: [x, y]\n });\n let start = this._isDeclarative && current ? current : startTransform;\n if (affine) {\n target = target.decompose(x, y);\n start = start.decompose(x, y);\n\n // Get the current and target angle as it was set\n const rTarget = target.rotate;\n const rCurrent = start.rotate;\n\n // Figure out the shortest path to rotate directly\n const possibilities = [rTarget - 360, rTarget, rTarget + 360];\n const distances = possibilities.map(a => Math.abs(a - rCurrent));\n const shortest = Math.min(...distances);\n const index = distances.indexOf(shortest);\n target.rotate = possibilities[index];\n }\n if (relative) {\n // we have to be careful here not to overwrite the rotation\n // with the rotate method of Matrix\n if (!isMatrix) {\n target.rotate = transforms.rotate || 0;\n }\n if (this._isDeclarative && currentAngle) {\n start.rotate = currentAngle;\n }\n }\n morpher.from(start);\n morpher.to(target);\n const affineParameters = morpher.at(pos);\n currentAngle = affineParameters.rotate;\n current = new Matrix(affineParameters);\n this.addTransform(current);\n element._addRunner(this);\n return morpher.done();\n }\n function retarget(newTransforms) {\n // only get a new origin if it changed since the last call\n if ((newTransforms.origin || 'center').toString() !== (transforms.origin || 'center').toString()) {\n origin = getOrigin(newTransforms, element);\n }\n\n // overwrite the old transformations with the new ones\n transforms = {\n ...newTransforms,\n origin\n };\n }\n this.queue(setup, run, retarget, true);\n this._isDeclarative && this._rememberMorpher('transform', morpher);\n return this;\n },\n // Animatable x-axis\n x(x) {\n return this._queueNumber('x', x);\n },\n // Animatable y-axis\n y(y) {\n return this._queueNumber('y', y);\n },\n ax(x) {\n return this._queueNumber('ax', x);\n },\n ay(y) {\n return this._queueNumber('ay', y);\n },\n dx(x = 0) {\n return this._queueNumberDelta('x', x);\n },\n dy(y = 0) {\n return this._queueNumberDelta('y', y);\n },\n dmove(x, y) {\n return this.dx(x).dy(y);\n },\n _queueNumberDelta(method, to) {\n to = new SVGNumber(to);\n\n // Try to change the target if we have this method already registered\n if (this._tryRetarget(method, to)) return this;\n\n // Make a morpher and queue the animation\n const morpher = new Morphable(this._stepper).to(to);\n let from = null;\n this.queue(function () {\n from = this.element()[method]();\n morpher.from(from);\n morpher.to(from + to);\n }, function (pos) {\n this.element()[method](morpher.at(pos));\n return morpher.done();\n }, function (newTo) {\n morpher.to(from + new SVGNumber(newTo));\n });\n\n // Register the morpher so that if it is changed again, we can retarget it\n this._rememberMorpher(method, morpher);\n return this;\n },\n _queueObject(method, to) {\n // Try to change the target if we have this method already registered\n if (this._tryRetarget(method, to)) return this;\n\n // Make a morpher and queue the animation\n const morpher = new Morphable(this._stepper).to(to);\n this.queue(function () {\n morpher.from(this.element()[method]());\n }, function (pos) {\n this.element()[method](morpher.at(pos));\n return morpher.done();\n });\n\n // Register the morpher so that if it is changed again, we can retarget it\n this._rememberMorpher(method, morpher);\n return this;\n },\n _queueNumber(method, value) {\n return this._queueObject(method, new SVGNumber(value));\n },\n // Animatable center x-axis\n cx(x) {\n return this._queueNumber('cx', x);\n },\n // Animatable center y-axis\n cy(y) {\n return this._queueNumber('cy', y);\n },\n // Add animatable move\n move(x, y) {\n return this.x(x).y(y);\n },\n amove(x, y) {\n return this.ax(x).ay(y);\n },\n // Add animatable center\n center(x, y) {\n return this.cx(x).cy(y);\n },\n // Add animatable size\n size(width, height) {\n // animate bbox based size for all other elements\n let box;\n if (!width || !height) {\n box = this._element.bbox();\n }\n if (!width) {\n width = box.width / box.height * height;\n }\n if (!height) {\n height = box.height / box.width * width;\n }\n return this.width(width).height(height);\n },\n // Add animatable width\n width(width) {\n return this._queueNumber('width', width);\n },\n // Add animatable height\n height(height) {\n return this._queueNumber('height', height);\n },\n // Add animatable plot\n plot(a, b, c, d) {\n // Lines can be plotted with 4 arguments\n if (arguments.length === 4) {\n return this.plot([a, b, c, d]);\n }\n if (this._tryRetarget('plot', a)) return this;\n const morpher = new Morphable(this._stepper).type(this._element.MorphArray).to(a);\n this.queue(function () {\n morpher.from(this._element.array());\n }, function (pos) {\n this._element.plot(morpher.at(pos));\n return morpher.done();\n });\n this._rememberMorpher('plot', morpher);\n return this;\n },\n // Add leading method\n leading(value) {\n return this._queueNumber('leading', value);\n },\n // Add animatable viewbox\n viewbox(x, y, width, height) {\n return this._queueObject('viewbox', new Box(x, y, width, height));\n },\n update(o) {\n if (typeof o !== 'object') {\n return this.update({\n offset: arguments[0],\n color: arguments[1],\n opacity: arguments[2]\n });\n }\n if (o.opacity != null) this.attr('stop-opacity', o.opacity);\n if (o.color != null) this.attr('stop-color', o.color);\n if (o.offset != null) this.attr('offset', o.offset);\n return this;\n }\n});\nextend(Runner, {\n rx,\n ry,\n from,\n to\n});\nregister(Runner, 'Runner');\n\nclass Svg extends Container {\n constructor(node, attrs = node) {\n super(nodeOrNew('svg', node), attrs);\n this.namespace();\n }\n\n // Creates and returns defs element\n defs() {\n if (!this.isRoot()) return this.root().defs();\n return adopt(this.node.querySelector('defs')) || this.put(new Defs());\n }\n isRoot() {\n return !this.node.parentNode || !(this.node.parentNode instanceof globals.window.SVGElement) && this.node.parentNode.nodeName !== '#document-fragment';\n }\n\n // Add namespaces\n namespace() {\n if (!this.isRoot()) return this.root().namespace();\n return this.attr({\n xmlns: svg,\n version: '1.1'\n }).attr('xmlns:xlink', xlink, xmlns);\n }\n removeNamespace() {\n return this.attr({\n xmlns: null,\n version: null\n }).attr('xmlns:xlink', null, xmlns).attr('xmlns:svgjs', null, xmlns);\n }\n\n // Check if this is a root svg\n // If not, call root() from this element\n root() {\n if (this.isRoot()) return this;\n return super.root();\n }\n}\nregisterMethods({\n Container: {\n // Create nested svg document\n nested: wrapWithAttrCheck(function () {\n return this.put(new Svg());\n })\n }\n});\nregister(Svg, 'Svg', true);\n\nclass Symbol extends Container {\n // Initialize node\n constructor(node, attrs = node) {\n super(nodeOrNew('symbol', node), attrs);\n }\n}\nregisterMethods({\n Container: {\n symbol: wrapWithAttrCheck(function () {\n return this.put(new Symbol());\n })\n }\n});\nregister(Symbol, 'Symbol');\n\n// Create plain text node\nfunction plain(text) {\n // clear if build mode is disabled\n if (this._build === false) {\n this.clear();\n }\n\n // create text node\n this.node.appendChild(globals.document.createTextNode(text));\n return this;\n}\n\n// Get length of text element\nfunction length() {\n return this.node.getComputedTextLength();\n}\n\n// Move over x-axis\n// Text is moved by its bounding box\n// text-anchor does NOT matter\nfunction x$1(x, box = this.bbox()) {\n if (x == null) {\n return box.x;\n }\n return this.attr('x', this.attr('x') + x - box.x);\n}\n\n// Move over y-axis\nfunction y$1(y, box = this.bbox()) {\n if (y == null) {\n return box.y;\n }\n return this.attr('y', this.attr('y') + y - box.y);\n}\nfunction move$1(x, y, box = this.bbox()) {\n return this.x(x, box).y(y, box);\n}\n\n// Move center over x-axis\nfunction cx(x, box = this.bbox()) {\n if (x == null) {\n return box.cx;\n }\n return this.attr('x', this.attr('x') + x - box.cx);\n}\n\n// Move center over y-axis\nfunction cy(y, box = this.bbox()) {\n if (y == null) {\n return box.cy;\n }\n return this.attr('y', this.attr('y') + y - box.cy);\n}\nfunction center(x, y, box = this.bbox()) {\n return this.cx(x, box).cy(y, box);\n}\nfunction ax(x) {\n return this.attr('x', x);\n}\nfunction ay(y) {\n return this.attr('y', y);\n}\nfunction amove(x, y) {\n return this.ax(x).ay(y);\n}\n\n// Enable / disable build mode\nfunction build(build) {\n this._build = !!build;\n return this;\n}\n\nvar textable = {\n __proto__: null,\n amove: amove,\n ax: ax,\n ay: ay,\n build: build,\n center: center,\n cx: cx,\n cy: cy,\n length: length,\n move: move$1,\n plain: plain,\n x: x$1,\n y: y$1\n};\n\nclass Text extends Shape {\n // Initialize node\n constructor(node, attrs = node) {\n super(nodeOrNew('text', node), attrs);\n this.dom.leading = this.dom.leading ?? new SVGNumber(1.3); // store leading value for rebuilding\n this._rebuild = true; // enable automatic updating of dy values\n this._build = false; // disable build mode for adding multiple lines\n }\n\n // Set / get leading\n leading(value) {\n // act as getter\n if (value == null) {\n return this.dom.leading;\n }\n\n // act as setter\n this.dom.leading = new SVGNumber(value);\n return this.rebuild();\n }\n\n // Rebuild appearance type\n rebuild(rebuild) {\n // store new rebuild flag if given\n if (typeof rebuild === 'boolean') {\n this._rebuild = rebuild;\n }\n\n // define position of all lines\n if (this._rebuild) {\n const self = this;\n let blankLineOffset = 0;\n const leading = this.dom.leading;\n this.each(function (i) {\n if (isDescriptive(this.node)) return;\n const fontSize = globals.window.getComputedStyle(this.node).getPropertyValue('font-size');\n const dy = leading * new SVGNumber(fontSize);\n if (this.dom.newLined) {\n this.attr('x', self.attr('x'));\n if (this.text() === '\\n') {\n blankLineOffset += dy;\n } else {\n this.attr('dy', i ? dy + blankLineOffset : 0);\n blankLineOffset = 0;\n }\n }\n });\n this.fire('rebuild');\n }\n return this;\n }\n\n // overwrite method from parent to set data properly\n setData(o) {\n this.dom = o;\n this.dom.leading = new SVGNumber(o.leading || 1.3);\n return this;\n }\n writeDataToDom() {\n writeDataToDom(this, this.dom, {\n leading: 1.3\n });\n return this;\n }\n\n // Set the text content\n text(text) {\n // act as getter\n if (text === undefined) {\n const children = this.node.childNodes;\n let firstLine = 0;\n text = '';\n for (let i = 0, len = children.length; i < len; ++i) {\n // skip textPaths - they are no lines\n if (children[i].nodeName === 'textPath' || isDescriptive(children[i])) {\n if (i === 0) firstLine = i + 1;\n continue;\n }\n\n // add newline if its not the first child and newLined is set to true\n if (i !== firstLine && children[i].nodeType !== 3 && adopt(children[i]).dom.newLined === true) {\n text += '\\n';\n }\n\n // add content of this node\n text += children[i].textContent;\n }\n return text;\n }\n\n // remove existing content\n this.clear().build(true);\n if (typeof text === 'function') {\n // call block\n text.call(this, this);\n } else {\n // store text and make sure text is not blank\n text = (text + '').split('\\n');\n\n // build new lines\n for (let j = 0, jl = text.length; j < jl; j++) {\n this.newLine(text[j]);\n }\n }\n\n // disable build mode and rebuild lines\n return this.build(false).rebuild();\n }\n}\nextend(Text, textable);\nregisterMethods({\n Container: {\n // Create text element\n text: wrapWithAttrCheck(function (text = '') {\n return this.put(new Text()).text(text);\n }),\n // Create plain text element\n plain: wrapWithAttrCheck(function (text = '') {\n return this.put(new Text()).plain(text);\n })\n }\n});\nregister(Text, 'Text');\n\nclass Tspan extends Shape {\n // Initialize node\n constructor(node, attrs = node) {\n super(nodeOrNew('tspan', node), attrs);\n this._build = false; // disable build mode for adding multiple lines\n }\n\n // Shortcut dx\n dx(dx) {\n return this.attr('dx', dx);\n }\n\n // Shortcut dy\n dy(dy) {\n return this.attr('dy', dy);\n }\n\n // Create new line\n newLine() {\n // mark new line\n this.dom.newLined = true;\n\n // fetch parent\n const text = this.parent();\n\n // early return in case we are not in a text element\n if (!(text instanceof Text)) {\n return this;\n }\n const i = text.index(this);\n const fontSize = globals.window.getComputedStyle(this.node).getPropertyValue('font-size');\n const dy = text.dom.leading * new SVGNumber(fontSize);\n\n // apply new position\n return this.dy(i ? dy : 0).attr('x', text.x());\n }\n\n // Set text content\n text(text) {\n if (text == null) return this.node.textContent + (this.dom.newLined ? '\\n' : '');\n if (typeof text === 'function') {\n this.clear().build(true);\n text.call(this, this);\n this.build(false);\n } else {\n this.plain(text);\n }\n return this;\n }\n}\nextend(Tspan, textable);\nregisterMethods({\n Tspan: {\n tspan: wrapWithAttrCheck(function (text = '') {\n const tspan = new Tspan();\n\n // clear if build mode is disabled\n if (!this._build) {\n this.clear();\n }\n\n // add new tspan\n return this.put(tspan).text(text);\n })\n },\n Text: {\n newLine: function (text = '') {\n return this.tspan(text).newLine();\n }\n }\n});\nregister(Tspan, 'Tspan');\n\nclass Circle extends Shape {\n constructor(node, attrs = node) {\n super(nodeOrNew('circle', node), attrs);\n }\n radius(r) {\n return this.attr('r', r);\n }\n\n // Radius x value\n rx(rx) {\n return this.attr('r', rx);\n }\n\n // Alias radius x value\n ry(ry) {\n return this.rx(ry);\n }\n size(size) {\n return this.radius(new SVGNumber(size).divide(2));\n }\n}\nextend(Circle, {\n x: x$3,\n y: y$3,\n cx: cx$1,\n cy: cy$1,\n width: width$2,\n height: height$2\n});\nregisterMethods({\n Container: {\n // Create circle element\n circle: wrapWithAttrCheck(function (size = 0) {\n return this.put(new Circle()).size(size).move(0, 0);\n })\n }\n});\nregister(Circle, 'Circle');\n\nclass ClipPath extends Container {\n constructor(node, attrs = node) {\n super(nodeOrNew('clipPath', node), attrs);\n }\n\n // Unclip all clipped elements and remove itself\n remove() {\n // unclip all targets\n this.targets().forEach(function (el) {\n el.unclip();\n });\n\n // remove clipPath from parent\n return super.remove();\n }\n targets() {\n return baseFind('svg [clip-path*=' + this.id() + ']');\n }\n}\nregisterMethods({\n Container: {\n // Create clipping element\n clip: wrapWithAttrCheck(function () {\n return this.defs().put(new ClipPath());\n })\n },\n Element: {\n // Distribute clipPath to svg element\n clipper() {\n return this.reference('clip-path');\n },\n clipWith(element) {\n // use given clip or create a new one\n const clipper = element instanceof ClipPath ? element : this.parent().clip().add(element);\n\n // apply mask\n return this.attr('clip-path', 'url(#' + clipper.id() + ')');\n },\n // Unclip element\n unclip() {\n return this.attr('clip-path', null);\n }\n }\n});\nregister(ClipPath, 'ClipPath');\n\nclass ForeignObject extends Element {\n constructor(node, attrs = node) {\n super(nodeOrNew('foreignObject', node), attrs);\n }\n}\nregisterMethods({\n Container: {\n foreignObject: wrapWithAttrCheck(function (width, height) {\n return this.put(new ForeignObject()).size(width, height);\n })\n }\n});\nregister(ForeignObject, 'ForeignObject');\n\nfunction dmove(dx, dy) {\n this.children().forEach(child => {\n let bbox;\n\n // We have to wrap this for elements that dont have a bbox\n // e.g. title and other descriptive elements\n try {\n // Get the childs bbox\n // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1905039\n // Because bbox for nested svgs returns the contents bbox in the coordinate space of the svg itself (weird!), we cant use bbox for svgs\n // Therefore we have to use getBoundingClientRect. But THAT is broken (as explained in the bug).\n // Funnily enough the broken behavior would work for us but that breaks it in chrome\n // So we have to replicate the broken behavior of FF by just reading the attributes of the svg itself\n bbox = child.node instanceof getWindow().SVGSVGElement ? new Box(child.attr(['x', 'y', 'width', 'height'])) : child.bbox();\n } catch (e) {\n return;\n }\n\n // Get childs matrix\n const m = new Matrix(child);\n // Translate childs matrix by amount and\n // transform it back into parents space\n const matrix = m.translate(dx, dy).transform(m.inverse());\n // Calculate new x and y from old box\n const p = new Point(bbox.x, bbox.y).transform(matrix);\n // Move element\n child.move(p.x, p.y);\n });\n return this;\n}\nfunction dx(dx) {\n return this.dmove(dx, 0);\n}\nfunction dy(dy) {\n return this.dmove(0, dy);\n}\nfunction height(height, box = this.bbox()) {\n if (height == null) return box.height;\n return this.size(box.width, height, box);\n}\nfunction move(x = 0, y = 0, box = this.bbox()) {\n const dx = x - box.x;\n const dy = y - box.y;\n return this.dmove(dx, dy);\n}\nfunction size(width, height, box = this.bbox()) {\n const p = proportionalSize(this, width, height, box);\n const scaleX = p.width / box.width;\n const scaleY = p.height / box.height;\n this.children().forEach(child => {\n const o = new Point(box).transform(new Matrix(child).inverse());\n child.scale(scaleX, scaleY, o.x, o.y);\n });\n return this;\n}\nfunction width(width, box = this.bbox()) {\n if (width == null) return box.width;\n return this.size(width, box.height, box);\n}\nfunction x(x, box = this.bbox()) {\n if (x == null) return box.x;\n return this.move(x, box.y, box);\n}\nfunction y(y, box = this.bbox()) {\n if (y == null) return box.y;\n return this.move(box.x, y, box);\n}\n\nvar containerGeometry = {\n __proto__: null,\n dmove: dmove,\n dx: dx,\n dy: dy,\n height: height,\n move: move,\n size: size,\n width: width,\n x: x,\n y: y\n};\n\nclass G extends Container {\n constructor(node, attrs = node) {\n super(nodeOrNew('g', node), attrs);\n }\n}\nextend(G, containerGeometry);\nregisterMethods({\n Container: {\n // Create a group element\n group: wrapWithAttrCheck(function () {\n return this.put(new G());\n })\n }\n});\nregister(G, 'G');\n\nclass A extends Container {\n constructor(node, attrs = node) {\n super(nodeOrNew('a', node), attrs);\n }\n\n // Link target attribute\n target(target) {\n return this.attr('target', target);\n }\n\n // Link url\n to(url) {\n return this.attr('href', url, xlink);\n }\n}\nextend(A, containerGeometry);\nregisterMethods({\n Container: {\n // Create a hyperlink element\n link: wrapWithAttrCheck(function (url) {\n return this.put(new A()).to(url);\n })\n },\n Element: {\n unlink() {\n const link = this.linker();\n if (!link) return this;\n const parent = link.parent();\n if (!parent) {\n return this.remove();\n }\n const index = parent.index(link);\n parent.add(this, index);\n link.remove();\n return this;\n },\n linkTo(url) {\n // reuse old link if possible\n let link = this.linker();\n if (!link) {\n link = new A();\n this.wrap(link);\n }\n if (typeof url === 'function') {\n url.call(link, link);\n } else {\n link.to(url);\n }\n return this;\n },\n linker() {\n const link = this.parent();\n if (link && link.node.nodeName.toLowerCase() === 'a') {\n return link;\n }\n return null;\n }\n }\n});\nregister(A, 'A');\n\nclass Mask extends Container {\n // Initialize node\n constructor(node, attrs = node) {\n super(nodeOrNew('mask', node), attrs);\n }\n\n // Unmask all masked elements and remove itself\n remove() {\n // unmask all targets\n this.targets().forEach(function (el) {\n el.unmask();\n });\n\n // remove mask from parent\n return super.remove();\n }\n targets() {\n return baseFind('svg [mask*=' + this.id() + ']');\n }\n}\nregisterMethods({\n Container: {\n mask: wrapWithAttrCheck(function () {\n return this.defs().put(new Mask());\n })\n },\n Element: {\n // Distribute mask to svg element\n masker() {\n return this.reference('mask');\n },\n maskWith(element) {\n // use given mask or create a new one\n const masker = element instanceof Mask ? element : this.parent().mask().add(element);\n\n // apply mask\n return this.attr('mask', 'url(#' + masker.id() + ')');\n },\n // Unmask element\n unmask() {\n return this.attr('mask', null);\n }\n }\n});\nregister(Mask, 'Mask');\n\nclass Stop extends Element {\n constructor(node, attrs = node) {\n super(nodeOrNew('stop', node), attrs);\n }\n\n // add color stops\n update(o) {\n if (typeof o === 'number' || o instanceof SVGNumber) {\n o = {\n offset: arguments[0],\n color: arguments[1],\n opacity: arguments[2]\n };\n }\n\n // set attributes\n if (o.opacity != null) this.attr('stop-opacity', o.opacity);\n if (o.color != null) this.attr('stop-color', o.color);\n if (o.offset != null) this.attr('offset', new SVGNumber(o.offset));\n return this;\n }\n}\nregisterMethods({\n Gradient: {\n // Add a color stop\n stop: function (offset, color, opacity) {\n return this.put(new Stop()).update(offset, color, opacity);\n }\n }\n});\nregister(Stop, 'Stop');\n\nfunction cssRule(selector, rule) {\n if (!selector) return '';\n if (!rule) return selector;\n let ret = selector + '{';\n for (const i in rule) {\n ret += unCamelCase(i) + ':' + rule[i] + ';';\n }\n ret += '}';\n return ret;\n}\nclass Style extends Element {\n constructor(node, attrs = node) {\n super(nodeOrNew('style', node), attrs);\n }\n addText(w = '') {\n this.node.textContent += w;\n return this;\n }\n font(name, src, params = {}) {\n return this.rule('@font-face', {\n fontFamily: name,\n src: src,\n ...params\n });\n }\n rule(selector, obj) {\n return this.addText(cssRule(selector, obj));\n }\n}\nregisterMethods('Dom', {\n style(selector, obj) {\n return this.put(new Style()).rule(selector, obj);\n },\n fontface(name, src, params) {\n return this.put(new Style()).font(name, src, params);\n }\n});\nregister(Style, 'Style');\n\nclass TextPath extends Text {\n // Initialize node\n constructor(node, attrs = node) {\n super(nodeOrNew('textPath', node), attrs);\n }\n\n // return the array of the path track element\n array() {\n const track = this.track();\n return track ? track.array() : null;\n }\n\n // Plot path if any\n plot(d) {\n const track = this.track();\n let pathArray = null;\n if (track) {\n pathArray = track.plot(d);\n }\n return d == null ? pathArray : this;\n }\n\n // Get the path element\n track() {\n return this.reference('href');\n }\n}\nregisterMethods({\n Container: {\n textPath: wrapWithAttrCheck(function (text, path) {\n // Convert text to instance if needed\n if (!(text instanceof Text)) {\n text = this.text(text);\n }\n return text.path(path);\n })\n },\n Text: {\n // Create path for text to run on\n path: wrapWithAttrCheck(function (track, importNodes = true) {\n const textPath = new TextPath();\n\n // if track is a path, reuse it\n if (!(track instanceof Path)) {\n // create path element\n track = this.defs().path(track);\n }\n\n // link textPath to path and add content\n textPath.attr('href', '#' + track, xlink);\n\n // Transplant all nodes from text to textPath\n let node;\n if (importNodes) {\n while (node = this.node.firstChild) {\n textPath.node.appendChild(node);\n }\n }\n\n // add textPath element as child node and return textPath\n return this.put(textPath);\n }),\n // Get the textPath children\n textPath() {\n return this.findOne('textPath');\n }\n },\n Path: {\n // creates a textPath from this path\n text: wrapWithAttrCheck(function (text) {\n // Convert text to instance if needed\n if (!(text instanceof Text)) {\n text = new Text().addTo(this.parent()).text(text);\n }\n\n // Create textPath from text and path and return\n return text.path(this);\n }),\n targets() {\n return baseFind('svg textPath').filter(node => {\n return (node.attr('href') || '').includes(this.id());\n });\n\n // Does not work in IE11. Use when IE support is dropped\n // return baseFind('svg textPath[*|href*=' + this.id() + ']')\n }\n }\n});\nTextPath.prototype.MorphArray = PathArray;\nregister(TextPath, 'TextPath');\n\nclass Use extends Shape {\n constructor(node, attrs = node) {\n super(nodeOrNew('use', node), attrs);\n }\n\n // Use element as a reference\n use(element, file) {\n // Set lined element\n return this.attr('href', (file || '') + '#' + element, xlink);\n }\n}\nregisterMethods({\n Container: {\n // Create a use element\n use: wrapWithAttrCheck(function (element, file) {\n return this.put(new Use()).use(element, file);\n })\n }\n});\nregister(Use, 'Use');\n\n/* Optional Modules */\nconst SVG = makeInstance;\nextend([Svg, Symbol, Image, Pattern, Marker], getMethodsFor('viewbox'));\nextend([Line, Polyline, Polygon, Path], getMethodsFor('marker'));\nextend(Text, getMethodsFor('Text'));\nextend(Path, getMethodsFor('Path'));\nextend(Defs, getMethodsFor('Defs'));\nextend([Text, Tspan], getMethodsFor('Tspan'));\nextend([Rect, Ellipse, Gradient, Runner], getMethodsFor('radius'));\nextend(EventTarget, getMethodsFor('EventTarget'));\nextend(Dom, getMethodsFor('Dom'));\nextend(Element, getMethodsFor('Element'));\nextend(Shape, getMethodsFor('Shape'));\nextend([Container, Fragment], getMethodsFor('Container'));\nextend(Gradient, getMethodsFor('Gradient'));\nextend(Runner, getMethodsFor('Runner'));\nList.extend(getMethodNames());\nregisterMorphableType([SVGNumber, Color, Box, Matrix, SVGArray, PointArray, PathArray, Point]);\nmakeMorphable();\n\nexports.A = A;\nexports.Animator = Animator;\nexports.Array = SVGArray;\nexports.Box = Box;\nexports.Circle = Circle;\nexports.ClipPath = ClipPath;\nexports.Color = Color;\nexports.Container = Container;\nexports.Controller = Controller;\nexports.Defs = Defs;\nexports.Dom = Dom;\nexports.Ease = Ease;\nexports.Element = Element;\nexports.Ellipse = Ellipse;\nexports.EventTarget = EventTarget;\nexports.ForeignObject = ForeignObject;\nexports.Fragment = Fragment;\nexports.G = G;\nexports.Gradient = Gradient;\nexports.Image = Image;\nexports.Line = Line;\nexports.List = List;\nexports.Marker = Marker;\nexports.Mask = Mask;\nexports.Matrix = Matrix;\nexports.Morphable = Morphable;\nexports.NonMorphable = NonMorphable;\nexports.Number = SVGNumber;\nexports.ObjectBag = ObjectBag;\nexports.PID = PID;\nexports.Path = Path;\nexports.PathArray = PathArray;\nexports.Pattern = Pattern;\nexports.Point = Point;\nexports.PointArray = PointArray;\nexports.Polygon = Polygon;\nexports.Polyline = Polyline;\nexports.Queue = Queue;\nexports.Rect = Rect;\nexports.Runner = Runner;\nexports.SVG = SVG;\nexports.Shape = Shape;\nexports.Spring = Spring;\nexports.Stop = Stop;\nexports.Style = Style;\nexports.Svg = Svg;\nexports.Symbol = Symbol;\nexports.Text = Text;\nexports.TextPath = TextPath;\nexports.Timeline = Timeline;\nexports.TransformBag = TransformBag;\nexports.Tspan = Tspan;\nexports.Use = Use;\nexports.adopt = adopt;\nexports.assignNewId = assignNewId;\nexports.clearEvents = clearEvents;\nexports.create = create;\nexports.defaults = defaults;\nexports.dispatch = dispatch;\nexports.easing = easing;\nexports.eid = eid;\nexports.extend = extend;\nexports.find = baseFind;\nexports.getClass = getClass;\nexports.getEventTarget = getEventTarget;\nexports.getEvents = getEvents;\nexports.getWindow = getWindow;\nexports.makeInstance = makeInstance;\nexports.makeMorphable = makeMorphable;\nexports.mockAdopt = mockAdopt;\nexports.namespaces = namespaces;\nexports.nodeOrNew = nodeOrNew;\nexports.off = off;\nexports.on = on;\nexports.parser = parser;\nexports.regex = regex;\nexports.register = register;\nexports.registerMorphableType = registerMorphableType;\nexports.registerWindow = registerWindow;\nexports.restoreWindow = restoreWindow;\nexports.root = root;\nexports.saveWindow = saveWindow;\nexports.utils = utils;\nexports.windowEvents = windowEvents;\nexports.withWindow = withWindow;\nexports.wrapWithAttrCheck = wrapWithAttrCheck;\n//# sourceMappingURL=svg.node.cjs.map\n","import './draggable';\r\nimport './input-box';\r\nimport './node-x-btn';\r\nimport './connector';\r\nimport './comment-drag-handle';\r\nimport './comment-input';\r\nimport './connection-line';","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(8156);\n"],"names":["root","factory","exports","module","define","amd","this","__webpack_require__","moduleId","cachedModule","__webpack_module_cache__","undefined","__webpack_modules__","call","obj","name","Object","prototype","hasOwnProperty","Constants","Renderer","Representer","RepresenterNode","UserState","state","callbacks","constructor","Set","Map","setState","has","add","triggerCallbacks","removeState","delete","hasState","onStateChange","cb","set","get","push","addedOrRemoved","cbs","userState","container","visible","toolbox","document","createElement","className","workspace","_wsTop","appendChild","body","fill","nodes","clear","forEach","node","headlessNode","type","nodeEl","createNodeElement","show","textContent","labelText","applyNodeStyles","colors","primary","addEventListener","e","onNodeMouseDown","el","bgColor","style","backgroundColor","parseColor","padding","cursor","renderer","constants","c","fontFamily","FONT_FAMILY","fontSize","FONT_SIZE","color","FONT_COLOR","ghostEl","createGhostNode","moveGhost","ev","left","clientX","top","clientY","releaseGhost","removeEventListener","dropNode","remove","preventDefault","position","pointerEvents","rect","svg","getBoundingClientRect","right","bottom","x","wsX","y","wsY","screenToWorkspace","nodews","spawnAt","argName","arguments","setFieldValue","drawNode","id","display","hide","innerHTML","RendererMap","atlas","NAME","apollo","isBrowser","FontManager","loadGoogleFont","register","cls","FieldMap","unregister","Kabel","env","UIX","events","windowListeners","addWindowListener","removeWindowListener","clearWindowListeners","Themes","Classic","Dark","ContextMenu","Utils","Path","waitFrames","SVG","UID","EventEmitter","hasProp","styler","Styler","escapeHTML","unescapeHTML","Widget","CategoryColors","Connection","Coordinates","Field","DummyField","NumberField","OptConnectField","TextField","inject","injectHeadless","createHeadlessNode","InjectMsg","clearMainWorkspace","getMainWorkspace","setMainWorkspace","NodeSvg","Nodes","Widgets","WorkspaceSvg","Workspace","WorkspaceController","WASDController","nodeRendering","rendererMap","RMap","Apollo","Atlas","RendererConstants","commentRendering","CommentModel","CommentRenderer","Dropdown","defineProperty","v","UIStyles","workspaceBGColor","toolboxCategoriesBG","width","height","background","overflowY","toolboxFlyoutBG","borderRadius","boxShadow","initCommentInput","element","rawArgs","getSelectionRange","start","Math","min","cursorPos","anchorPos","end","max","hasSelection","deleteSelection","buffer","slice","measureTextWidth","text","tempText","getSvg","font","size","family","bbox","measureTextBbox","updateText","hasSel","txt","tspan","replace","attr","Array","from","childNodes","child","nodeType","setAttribute","leading","parseFloat","textBeforeStart","textBeforeEnd","highlightX","highlightWidth","highlightY","highlightH","selectionRect","parent","parentNode","insertBefore","move","editing","caretXOffset","caretY","caretH","caretLine","rectW","ceil","PADDING_X","rectH","PADDING_Y","comment","_tempInputBBox","textX","textY","startEditing","getText","length","rectBox","zoom","getWs","getZoom","clickX","cumulativeWidth","i","charWidth","skipNextClick","onKeyDown","onClickOutside","stopEditing","commit","capture","setTextNoRedraw","getWorkspace","redraw","key","shiftKey","ctrlKey","metaKey","targ","target","args","onRectDown","onTextDown","on","off","registerEvent","randBytes","len","cryptoAPI","getRandomValues","buf","Uint8Array","floor","random","uuidv4","g","globalThis","crypto","randomUUID","b","hex","toString","padStart","ulid","date","Date","now","time48","t","BigInt","Number","out","acc","bits","CROCK32","rnd","nanoid","alphabet","DEFAULT_ALPHABET","Error","mask","log2","idx","shortId","ts","_ctr","map","join","strategy","opts","s","_text","_isWorkspaceComment","_parent","svgGroup","relativeCoords","svgLine","generateUID","value","setText","res","isHeadless","clearComments","drawComments","isNodeComment","isWorkspaceComment","toJson","coords","fromJson","data","COMMENT_G_TAG","COMMENT_LINE_TAG","COMMENT_TEXT_EL","COMMENT_DRAG_EL","RENDERER_TAG_EL","encodeForSvg","ensureTspansPreserve","textEl","drawComment","_removeExistingElements","group","addClass","JSON","stringify","isws","displayEncoded","_createTextElement","_createBackgroundRect","dragHandle","_createDragHandle","_addEventer","screenPos","_computeScreenPosition","transform","_drawLineToNode","refreshCommentTransforms","getComments","_nodeDB","values","n","getComment","filter","userSelect","webkitUserSelect","msUserSelect","MozUserSelect","handleRadius","stroke","radius","back","circle","addElement","tagElement","workspaceX","workspaceY","nodePos","workspaceToScreen","ws","nodeWSPos","nodeBBox","nodeTopCenter","parentWSPos","commentRelPos","commentAbsX","commentAbsY","commentBBox","commentTopCenter","line","dasharray","clearAllComments","find","destroyByTag","_","clearCommentLines","drawAllComments","_constants","_currentNode","_nodeGroup","_nodeDraw","_ws","_drawStates","_commentDrawer","representer","constantOverrides","NODE_G_TAG","ELEMENT_TAG","CONN_LINE_TAG","CONNECTOR_TAG","LINE_X_MARK_TAG","BACKGROUND_PATTERN","overrides","init","initCommentRenderer","initRepresenter","initConstants","setConnect","pendingConnections","setConstants","assign","secondary","tertiary","restColors","getNodeBaseMeasurements","NODE_BASE_WIDTH","NODE_BASE_HEIGHT","anchor","opacity","measureTextHeight","measureRawField","textW","FIELD_RAW_BASE_WIDTH","INPUT_BOX_PADDING","FIELD_RAW_BASE_HEIGHT","measureLabel","field","label","getLabel","measureRaw","hasRaw","raw","getValue","measureCustom","isCustomEditor","m","measureMyself","getFieldMeasurementPadding","FIELD_SPACEX","measureField","parts","w","h","measureNodeDimensions","base","measureBaseAndLabel","fieldResult","measureFields","TOPBAR_HEIGHT","FIELD_SPACEY","FOOTER_HEIGHT","fields","startY","startWidth","startHeight","totalWidth","totalHeight","allFields","FIELD_MARGIN_X","FIELD_MARGIN_Y","labelW","TOPBAR_LABEL_MARGIN_X","renderNode","nodeIdOrNode","startNode","build","storeState","getNode","drawState","nodeGroup","fieldPosY","drawFieldRaw","fieldGroup","startX","getDisplayValue","FIELD_RAW_COLOR","FIELD_RAW_OUTLINE_COLOR","FIELD_RAW_OUTLINE_STROKE","INPUT_BOX_TEXT_ANCHOR","FIELD_RAW_TEXT_COLOR","rawBox","box","offsetY","drawFieldLabel","LABEL_SPACING","drawNodeXButton","measurements","btnSize","xGroup","class","weight","translateX","translateY","xButton","drawConnector","nodeBg","side","CONNECTOR_TRIANGLE","triSize","CONNECTOR_TRI_SIZE","path","roundedTri","rotatePath","tri","offsetX","CONNECTOR_RADIUS","circlePath","circ","drawNodeLabel","TOPBAR_LABEL_BOLDED","TOPBAR_LABEL_MARGIN_Y","createNodeGroup","drawNodeBase","drawNodeTopbar","getNodeColors","makeNodeDraggable","topbar","createFieldGroup","drawAllFieldsForNode","drawPreviousNextConnections","CORNER_RADIUS","bg","roundedRect","NODE_BG_COLOR","NODE_OUTLINE_COLOR","shadow","dragel","fieldsGroup","fieldCol","drawFieldForNode","fm","alignX","xUsed","drawMyself","measuredWidth","measuredHeight","rawData","cBubbleData","hasConnectable","connection","halfHeight","absY","c3","FIELD_CONN_COLOR","to","getTo","previousConnection","fromCircle","originCircle","originConn","connector","connState","onDraw","nodeMeasurements","cY","c1","resolveConnectable","getFrom","_fillOtherNodeConnectorCircle","nextConnection","c2","refreshComments","applyZoomToNode","nodeG","refreshNodeTransforms","nodeGroups","refreshConnectionLines","clearLines","drawLinesForAllNodes","tertirary","category","fillAllNodeConnectorBubbles","connPair","match","flatMap","p","toCircle","connectable","fromConn","isPrevious","conn","wsSvg","drawnCircles","fromEl","toEl","fromBBox","getBBox","toBBox","fromCTM","getScreenCTM","toCTM","endX","endY","absStartX","a","absStartY","d","f","absEndX","absEndY","pathStr","CONNECTOR_LINE_CURVED","dx","abs","sign","strokeWidth","CONNECTOR_LINE_WIDTH","toConn","mark","clearScreen","children","isBackground","hasClass","isDefs","tagName","isBgRect","classes","includes","BACKGROUND_CLASS","undoPendingConnsFor","conn0","rerenderNode","findIndex","pendingConn","splice","getRaw","isSpace","ch","SPECIAL_SPACES","indexOf","isDigit","code","isDigitStart","State","index","result","param","err","segmentStart","skipSpaces","charCodeAt","scanFlag","scanParam","zeroFirst","hasCeiling","hasDecimal","hasDot","finalizeSegment","cmd","cmdLC","toLowerCase","params","concat","paramCounts","scanSegment","cmdCode","is_arc","comma_found","need_params","isCommand","l","r","q","z","svgPath","segments","options","static","WIDGET_GLOBAL_ID","border","zIndex","html","setCoords","setHTML","reanimate","_addWidgetToDB","destroy","_delWidgetFromDB","undoStack","redoStack","isRecording","emitChange","recordHistory","undo","current","pop","prev","redo","entry","canUndo","canRedo","message","Ellipse","rx","ry","ax","epsilon","torad","PI","cos","sin","ma","J","K","D","JK","sqrt","L","l1","l2","atan","isDegenerate","WorkspaceCoords","super","theme","grid","_camera","_root","_backgroundRect","noRedraw","controller","_widgetDB","_ctxMenu","_commentDB","history","recordHistoryRecord","_didMove","moveListeners","dragState","wsTop","addTo","RClass","resolve","rendererOverrides","themeKey","Controller","controls","wasd","resolveController","initUndoRedo","_initBackground","setTheme","structuredClone","updateStyles","didMove","setDragState","currentX","currentY","isDragging","lastX","lastY","deltaX","deltaY","beginDrag","updateDrag","endDrag","fireMoveListeners","addMoveListener","listener","removeMoveListener","toggleHistory","untoggleHistory","console","error","_updateBackgroundTransform","updateTransform","cloneNode","nodeSvg","fromNode","wdgt","newWidget","getWidget","getContentSize","getSize","refresh","drawAllNodes","nodeId","workX","workY","screenX","screenY","addNode","warn","newNode","derefNode","disconnectTo","ConnectableField","disconnect","next","disconnectFrom","removeNodeById","removeNode","pan","dy","addComment","model","redrawComments","removeComment","commentOrId","json","recordBigEvent","entries","circular","deserialize","topLevel","serialize","startsWith","split","parseInt","trim","isArray","halfW","points","step","sides","angle","cx","cy","rotate","Matrix","operations","matrix","scale","translate","skewX","skewY","CMD_SPLIT_RE","PARAMS_SPLIT_RE","transformString","item","moveSpeed","doAccelerate","accelSpeed","friction","velocity","zoomSpeed","minZoom","maxZoom","isFalloff","wasdSmooth","wasdAccelerate","wasdFriction","onWheel","bind","passive","canMove","update","inputX","inputY","keysDown","_throttledFireDidMove","refreshPos","newZoom","mouseX","mouseY","wsMouse","setZoom","weights","loadedFonts","linkId","getElementById","link","rel","weightsParam","href","head","fontPromises","fonts","load","promise","Promise","all","then","handleClick","xMark","pair","midX","midY","center","editable","connectionBubble","canEditConnector","setEditable","val","canEdit","setName","Boolean","getName","setLabel","fieldVisualInfo","setValue","deep","alreadyProcessed","_deserialize","setTo","String","fldType","setFieldType","fld_type","DropdownField","_selected","_isOpen","toggle","toggleDropdown","click","getOwner","closeDropdown","openDropdown","items","option","onSelect","original","hideIfOwner","getSelected","setOptions","RendererCls","optName","list","keys","input","pattern","spacing","dotSize","defs","findOne","patternUnits","resize","scaledSpacing","scaledDot","cam","patternTransform","updateOptions","newOpts","xBtnGroup","onClick","combine","m1","m2","queue","cache","tx","ty","sx","sy","rad","tan","toArray","calc","isRelative","mouseBtns","mousePos","lastMousePos","wheelDelta","movedListeners","_lastMoveFire","_moveThrottleMs","_queuedMove","_moveTimeout","_updateInt","_setupListeners","setInterval","fireDidMove","queueMicrotask","performance","wait","setTimeout","window","button","setCamera","pos","centerOn","wsSize","stop","clearInterval","log","ApolloRenderer","ElEMENT_TAG","dogear","SHAPES","Dogear","cutW","Width","Height","drawDogEar","pathDef","PathMain","dogEar","front","drawPrimaryConnector","CONNECTOR_COLOR","textBBox","paddedWidth","styles","appendStyles","css","styleEl","removeStyles","hasStyles","kabelStyles","querySelector","contains","msg","wrn","info","proto","isNode","process","versions","isWebWorker","self","importScripts","_fieldColumn","getCommentText","setCommentText","getFieldByName","fld","getField","getFieldValue","getFieldDisplayValue","emit","INITING","removed","REMOVING","hasCategoryStyle","getCategoryName","getStyle","_appendFieldItem","jsonInit","primaryColor","secondaryColor","tertiaryColor","applyJsonArguments","FieldConstructor","appendConnection","appendNumber","appendText","appendOptLink","setCategoryName","setStyle","setColor","setLabelText","setConnection","prevOrNext","stringed","cast","other","newField","FieldCls","_serializeConnection","returned","connected","fieldNode","serialized","flat","processNode","copy","prevNode","nextNode","allNodes","explicit","fldData","setFrom","refId","maybe","ContextOptsRegistry","registerOption","opt","onHoverStart","onHoverEnd","showFor","unregisterOption","confirm","widget","classList","fn","k","scroll","blur","focus","visibilitychange","pointerlockchange","beforeunload","event","handleEvent","listeners","handler","payload","once","wrapper","wsOptions","_flyout","_contents","_categories","getOptions","contents","initCategoryToolbox","initFlyoutToolbox","applyStyles","cData","mainws","draggableStore","onMouseDown","onMouseMove","onMouseUp","ondrag","movementX","movementY","mouseWS","newX","newY","onmove","enddrag","dragTarget","frames","callback","count","requestAnimationFrame","DropdownContainer","owner","rootEl","constraint","offset","currentRemoveListener","updatePosition","setContent","groupRect","scrollX","scrollY","onclick","isVisible","getCurrent","dropdownContainer","onPointerDown","pointerWS","startRelX","startRelY","onPointerMove","onPointerUp","Eventer","elements","eventRegistry","setupFn","tags","tagList","reg","tag","destroyed","destroyFn","types","typeList","setupElement","destroyElement","Function","eventer","unit_vector_angle","ux","uy","vx","vy","dot","acos","approximate_unit_arc","theta1","delta_theta","alpha","x1","y1","x2","y2","TAU","fa","fs","phi","sin_phi","cos_phi","x1p","y1p","lambda","cc","rx_sq","ry_sq","x1p_sq","y1p_sq","radicant","cxp","cyp","v1x","v1y","v2x","v2y","get_arc_center","curve","xp","yp","NodePrototypes","default","clone","distanceTo","toObject","PADDING_BIG","PADDING_MEDIUM","PADDING_SMALL","CONNECTION_STROKE_WIDTH","CONNECTION_STROKE_COLOR_CHOICE","ZOOM_BASE","SvgPath","pstate","pathParse","__stack","transformParse","a2c","ellipse","src","sgm","__matrix","iterate","__evaluateStack","prevCmd","cmdSkipped","segment","degrees","round","contourStartDeltaX","contourStartDeltaY","toFixed","iterator","keepLazyStack","j","newSegments","replacements","needReplace","countourStartX","countourStartY","nameUC","toUpperCase","nameLC","unarc","new_segments","nextX","nextY","unshort","prevControlX","prevControlY","prevSegment","curControlX","curControlY","cState","one","two","isPrev","removeClass","connA","connB","_rowDiv","_toolbox","_makeDiv","btn","stopPropagation","setDisabled","disabled","toJSON","svgState","getConstant","moveTo","setScale","applyTransform","highlight","prevFrom","source","isolate","ApolloConstants","rectHeight","caretX","repNode","removeProperty","initListeners","renderOptions","HTMLElement","SVGSVGElement","elementFromPoint","hasAttribute","getAttribute","dta","parse","parentElement","outline","registerMethods","_name","addMethodNames","getOwnPropertyNames","methods$1","getMethodsFor","_names","names","array","block","il","radians","unCamelCase","capitalize","charAt","proportionalSize","getOrigin","o","origin","ox","originX","oy","originY","condX","condY","registerWindow","win","doc","globals","saveWindow","save","restoreWindow","getWindow","create","ns","createElementNS","makeInstance","isHTML","Base","adopter","firstChild","removeChild","nodeOrNew","Node","ownerDocument","defaultView","adopt","instance","nodeName","Fragment","asRoot","getClass","eid","did","assignNewId","extend","modules","methods","wrapWithAttrCheck","apply","componentHex","component","integer","is","object","space","hueToRgb","closeEnough","parser","cssText","documentElement","isNulledBox","getBox","getBBoxFn","retry","baseFind","query","List","querySelectorAll","getEvents","getEventHolder","windowEvents","getEventTarget","clearEvents","binding","bag","delimiter","_svgjsListenerId","listenerId","namespace","dispatch","Event","CustomEvent","detail","cancelable","dispatchEvent","noop","x$3","y$3","cx$1","cy$1","width$2","SVGNumber","divide","height$2","_element","fx","fy","makeSetterGetter","recalculate","duration","_duration","overshoot","_overshoot","pi","os","zeta","wn","segmentComplete","segmentParameters","startNewSegment","token","inNumber","finalizeNumber","pathLetter","isPathLetter","test","lastCommand","small","isSmall","inSegment","number","pointSeen","hasExponent","absolute","command","pathHandlers","p0","makeAbsolut","isArcFlag","isArc","isExponential","lastToken","registerMorphableType","morphableTypes","makeMorphable","Morphable","fromArray","arr","toConsumable","morph","stepper","context","mergeTransforms","netTransform","_transformationRunners","runners","getRunnerTransform","reduce","lmultiply","merge","_frameId","descriptiveElements","isDescriptive","writeDataToDom","defaults","cloned","valueOf","removeAttribute","utils","__proto__","xmlns","xlink","namespaces","siblings","forward","backward","before","after","insertAfter","numberAndUnit","rgb","reference","transforms","whitespace","isHex","isRgb","isBlank","isNumber","isImage","regex","toggleClass","ret","cased","getPropertyValue","setProperty","attributes","remember","memory","forget","_memory","Color","inputs","isColor","mode","grey","cmyk","_a","_b","_c","hsl","isGrey","delta","_d","getParameters","noWhitespace","exec","hexParse","substring","sixDigitHex","components","lab","xyz","lch","atan2","dToR","yL","xL","zL","ct","mx","nm","rU","gU","bU","pow","bd","toHex","_clamped","toRgb","rV","gV","bV","r255","g255","b255","rL","gL","bL","xU","yU","zU","Point","transformO","isMatrixLike","formatTransforms","flipBoth","flip","flipX","flipY","skew","isFinite","scaleX","scaleY","shear","theta","around","px","positionX","NaN","py","positionY","relative","relativeX","relativeY","matrixMultiply","aroundO","translateO","lmultiplyO","decompose","determinant","ccw","thetaRad","st","lam","equals","comp","axis","flipO","scaleO","Element","matrixify","inverse","inverseO","det","na","nb","nc","nd","ne","nf","multiply","multiplyO","rotateO","shearO","lx","skewO","ly","transformer","Box","addOffset","pageXOffset","pageYOffset","isNulled","xMin","Infinity","xMax","yMin","yMax","viewbox","level","point","clientWidth","clientHeight","zoomX","zoomY","zoomAmount","MAX_SAFE_INTEGER","each","fnOrMethodName","reserved","attrs","EventTarget","defaultPrevented","fire","timeline","ease","delay","SVGArray","toSet","convert","unit","isNaN","minus","plus","times","colorAttributes","hooks","Dom","removeNamespace","SVGElement","put","hasChildNodes","lastChild","assignNewIds","nodeClone","first","htmlOrFn","outerHTML","xml","last","matches","selector","matcher","matchesSelector","msMatchesSelector","mozMatchesSelector","webkitMatchesSelector","oMatchesSelector","putIn","removeElement","replaceChild","precision","factor","svgOrFn","outerSVG","words","wrap","xmlOrFn","outerXML","_this","well","fragment","createDocumentFragment","firstElementChild","nodeValue","curr","_val","hook","setAttributeNS","rebuild","dom","setData","dmove","parents","until","isSelector","rbox","screenCTM","inside","ctm","getCTM","isRoot","sugar","prefix","extension","mat","direction","getTotalLength","pointAt","getPointAtLength","untransform","str","kv","reverse","toParent","pCtm","toRoot","decomposed","Container","flatten","ungroup","Defs","Shape","circled","gradiented","Gradient","targets","url","gradient","Pattern","Image","img","image","PointArray","maxX","maxY","minX","minY","toLine","pointed","MorphArray","Line","plot","Marker","orient","ref","marker","easing","bezier","steps","stepPosition","jumps","beforeFlag","jumping","Stepper","done","Ease","dt","Spring","acceleration","newPosition","PID","windup","integral","_windup","P","I","M","H","V","C","S","Q","T","A","Z","mlhvqtcsaz","jl","pathDelimiters","PathArray","toAbsolute","pathParser","arrayToString","getClassForType","NonMorphable","ObjectBag","_stepper","_from","_to","_type","_context","_morphObj","at","_set","align","TransformBag","sortByKey","defaultObject","toDelete","objOrArr","Type","sort","shift","num","_array","poly","Polygon","polygon","Polyline","polyline","Rect","Queue","_first","_last","Animator","nextDraw","timeouts","immediates","timer","frame","run","_draw","timeout","time","immediate","cancelFrame","clearTimeout","cancelImmediate","nextTimeout","lastTimeout","nextFrame","lastFrame","nextImmediate","makeSchedule","runnerInfo","runner","defaultSource","Timeline","timeSource","_timeSource","terminate","active","_nextFrame","finish","getEndTimeOfTimeline","pause","getEndTime","lastRunnerInfo","getLastRunnerInfo","lastDuration","_time","endTimes","_runners","getRunnerInfoById","_lastRunnerId","_runnerIds","_paused","_continue","persist","dtOrForever","_persist","play","updateTime","yes","currentSpeed","speed","positive","schedule","when","absoluteStartTime","endTime","unschedule","seek","_speed","_lastSourceTime","immediateStep","_stepImmediate","_step","_stepFn","dtSource","dtTime","_lastStepTime","reset","runnersLeft","dtToStart","_startTime","_timeline","Runner","_queue","_isDeclarative","_history","enabled","_lastTime","_reseted","transformId","_haveReversed","_reverse","_loopsDone","_swing","_wait","_times","sanitise","swing","addTransform","animate","loop","clearTransform","clearTransformsFromQueue","isTransform","during","_prepareRunner","loops","loopDuration","loopsDone","partial","swinging","backwards","uncliped","swingForward","progress","initFn","runFn","retargetFn","initialiser","retarget","initialised","finished","running","_lastPosition","justStarted","justFinished","declarative","converged","_initialise","_run","needsIt","_rememberMorpher","method","morpher","caller","positionOrDt","allfinished","_tryRetarget","extra","FakeRunner","mergeWith","RunnerArray","ids","clearBefore","deleteCnt","edit","newRunner","getByID","lastRunner","by","_clearTransformRunnersBefore","currentRunner","_currentTransform","_addRunner","styleAttr","nameOrAttrs","newToAttrs","newKeys","differences","addedFromAttrs","oldFromAttrs","oldToAttrs","newLevel","newPoint","affine","isMatrix","currentAngle","startTransform","rTarget","rCurrent","possibilities","distances","shortest","affineParameters","newTransforms","_queueNumber","ay","_queueNumberDelta","newTo","_queueObject","amove","Svg","version","nested","Symbol","symbol","textable","_build","getComputedTextLength","plain","createTextNode","Text","_rebuild","blankLineOffset","getComputedStyle","newLined","firstLine","newLine","Tspan","Circle","ClipPath","unclip","clip","clipper","clipWith","ForeignObject","foreignObject","containerGeometry","G","unlink","linker","linkTo","Mask","unmask","masker","maskWith","Stop","Style","addText","rule","cssRule","fontface","TextPath","track","pathArray","textPath","importNodes","Use","use","file","mockAdopt","mock","withWindow","definition","enumerable","prop","toStringTag"],"sourceRoot":""}