@celldl/editor 0.20260212.0 → 0.20260217.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -0
- package/dist/CellDLEditor-ZFePDCI0.js +13851 -0
- package/dist/CellDLEditor-ZFePDCI0.js.map +1 -0
- package/dist/CellDLEditor.css +1 -1
- package/dist/CellDLEditor.es.js +6 -5
- package/dist/app/src/App.vue.d.ts +2 -0
- package/dist/app/src/common/common.d.ts +8 -0
- package/dist/app/src/common/constants.d.ts +5 -0
- package/dist/app/src/common/electron.d.ts +5 -0
- package/dist/app/src/common/electronApi.d.ts +8 -0
- package/dist/app/src/common/settings.d.ts +18 -0
- package/dist/app/src/common/version.d.ts +7 -0
- package/dist/app/src/common/vueCommon.d.ts +9 -0
- package/dist/app/src/main.d.ts +1 -0
- package/dist/{vendor-DFPLRrnP.js → index--lsZkhLY.js} +24316 -30274
- package/dist/index--lsZkhLY.js.map +1 -0
- package/dist/index.d.ts +54 -16
- package/dist/{index-DtCZg5ZV.js → oxigraph-Dx4bu2IN.js} +221 -843
- package/dist/oxigraph-Dx4bu2IN.js.map +1 -0
- package/dist/package.json.d.ts +106 -0
- package/dist/src/CellDL/SVGElements/boundedelement.d.ts +21 -0
- package/dist/src/CellDL/SVGElements/index.d.ts +66 -0
- package/dist/src/CellDL/SVGElements/linearpath.d.ts +11 -0
- package/dist/src/CellDL/SVGElements/pathelement.d.ts +53 -0
- package/dist/src/CellDL/SVGElements/rectilinearpath.d.ts +50 -0
- package/dist/src/CellDL/SVGElements/svgconnection.d.ts +22 -0
- package/dist/src/CellDL/celldlObjects/index.d.ts +151 -0
- package/dist/src/CellDL/components/index.d.ts +39 -0
- package/dist/src/CellDL/components/properties.d.ts +61 -0
- package/dist/src/CellDL/connections/index.d.ts +35 -0
- package/dist/src/CellDL/connections/pathmaker.d.ts +38 -0
- package/dist/src/CellDL/diagram/index.d.ts +45 -0
- package/dist/src/CellDL/editor/alerts.d.ts +27 -0
- package/dist/src/CellDL/editor/editguides.d.ts +31 -0
- package/dist/src/CellDL/editor/editorframe.d.ts +13 -0
- package/dist/src/CellDL/editor/index.d.ts +40 -0
- package/dist/src/CellDL/editor/panzoom.d.ts +30 -0
- package/dist/src/CellDL/editor/selectionbox.d.ts +17 -0
- package/dist/src/CellDL/editor/undoredo.d.ts +46 -0
- package/dist/src/CellDL/geometry/controls.d.ts +53 -0
- package/dist/src/CellDL/geometry/index.d.ts +92 -0
- package/dist/src/CellDL/geometry/intersections.d.ts +6 -0
- package/dist/src/CellDL/geometry/pathutils.d.ts +12 -0
- package/dist/src/CellDL/geometry/spatialindex.d.ts +22 -0
- package/dist/src/CellDL/geometry/transforms.d.ts +21 -0
- package/dist/src/CellDL/geometry/units.d.ts +23 -0
- package/dist/src/CellDL/utils.d.ts +6 -0
- package/dist/src/assets/oxigraph/web.d.ts +279 -0
- package/dist/src/common/EditorTypes.d.ts +39 -0
- package/dist/src/common/common.d.ts +7 -0
- package/dist/src/common/constants.d.ts +5 -0
- package/dist/src/common/points.d.ts +57 -0
- package/dist/src/common/styling.d.ts +36 -0
- package/dist/src/common/svgUtils.d.ts +48 -0
- package/dist/src/common/themeCssVariables.d.ts +9 -0
- package/dist/src/common/types.d.ts +23 -0
- package/dist/src/common/vueCommon.d.ts +9 -0
- package/dist/src/components/CellDLEditor.vue.d.ts +19 -0
- package/dist/src/components/WrappedEditor.vue.d.ts +19 -0
- package/dist/src/components/panels/FillStyle.vue.d.ts +20 -0
- package/dist/src/components/panels/PathStyle.vue.d.ts +20 -0
- package/dist/src/components/panels/PropertiesPanel.vue.d.ts +21 -0
- package/dist/src/components/popovers/ComponentPopover.vue.d.ts +19 -0
- package/dist/src/components/popovers/ConnectionStylePopover.vue.d.ts +19 -0
- package/dist/src/components/toolbar/EditorToolbar.vue.d.ts +23 -0
- package/dist/src/components/toolbar/ToolButton.vue.d.ts +26 -0
- package/dist/src/components/toolbar/ToolPanel.vue.d.ts +2 -0
- package/dist/src/components/toolbar/ToolPopover.vue.d.ts +3 -0
- package/dist/src/components/widgets/InputWidget.vue.d.ts +34 -0
- package/dist/src/libopencor/locUIJsonApi.d.ts +54 -0
- package/dist/src/mathjax/index.d.ts +2 -0
- package/dist/src/metadata/index.d.ts +50 -0
- package/dist/src/metadata/namespaces.d.ts +46 -0
- package/dist/src/metadata/oxigraphStore.d.ts +61 -0
- package/dist/src/metadata/oximock.d.ts +36 -0
- package/dist/src/metadata/store.d.ts +23 -0
- package/dist/src/plugins/bondgraph/definitions.d.ts +6 -0
- package/dist/src/plugins/bondgraph/index.d.ts +40 -0
- package/dist/src/plugins/bondgraph/utils.d.ts +27 -0
- package/dist/src/plugins/index.d.ts +75 -0
- package/dist/vite.config.d.ts +3 -0
- package/dist/vite.lib.config.d.ts +3 -0
- package/package.json +4 -3
- package/dist/CellDLEditor-CRG_Fjg2.js +0 -7262
- package/dist/CellDLEditor-CRG_Fjg2.js.map +0 -1
- package/dist/index-DtCZg5ZV.js.map +0 -1
- package/dist/vendor-DFPLRrnP.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CellDLEditor-CRG_Fjg2.js","sources":["../src/common/vueCommon.ts","../src/metadata/namespaces.ts","../src/metadata/store.ts","../src/metadata/oxigraphStore.ts","../src/metadata/index.ts","../src/CellDL/connections/index.ts","../src/CellDL/connections/pathmaker.ts","../src/CellDL/editor/editorframe.ts","../src/CellDL/editor/panzoom.ts","../src/CellDL/geometry/index.ts","../src/CellDL/geometry/controls.ts","../src/CellDL/editor/selectionbox.ts","../src/CellDL/editor/undoredo.ts","../src/CellDL/editor/index.ts","../src/CellDL/editor/alerts.ts","../src/CellDL/geometry/transforms.ts","../src/CellDL/SVGElements/index.ts","../src/CellDL/SVGElements/boundedelement.ts","../src/CellDL/SVGElements/pathelement.ts","../src/CellDL/SVGElements/linearpath.ts","../src/CellDL/SVGElements/rectilinearpath.ts","../src/CellDL/SVGElements/svgconnection.ts","../src/CellDL/celldlObjects/index.ts","../src/plugins/index.ts","../src/CellDL/components/properties.ts","../src/CellDL/geometry/intersections.ts","../src/CellDL/geometry/spatialindex.ts","../src/CellDL/geometry/pathutils.ts","../src/CellDL/diagram/index.ts","../src/common/themeCssVariables.ts","../src/components/toolbar/ToolButton.vue","../src/components/toolbar/EditorToolbar.vue","../src/CellDL/components/index.ts","../src/components/toolbar/ToolPopover.vue","../src/components/popovers/ComponentPopover.vue","../src/components/popovers/ConnectionStylePopover.vue","../src/components/toolbar/ToolPanel.vue","../src/components/widgets/InputWidget.vue","../src/components/panels/FillStyle.vue","../src/components/panels/PathStyle.vue","../src/components/panels/PropertiesPanel.vue","../src/assets/bg-rdf/ontology.ttl?raw","../src/assets/bg-rdf/templates/chemical.ttl?raw","../src/assets/bg-rdf/templates/electrical.ttl?raw","../src/assets/bg-rdf/templates/hydraulic.ttl?raw","../src/assets/bg-rdf/templates/mechanical.ttl?raw","../src/plugins/bondgraph/definitions.ts","../src/plugins/bondgraph/index.ts","../src/components/CellDLEditor.vue"],"sourcesContent":["// From https://github.com/agarny/webapp/blob/main/src/renderer/src/common/vueCommon.ts\n\nimport * as vueusecore from '@vueuse/core';\n\nimport * as vue from 'vue';\n\nimport type { Theme } from '../../index.ts';\n\n// A constant to know the UID of the active instance of OpenCOR.\n\nexport const activeInstanceUid = vueusecore.createGlobalState(() => vue.ref<string | null>(null));\n\n// Theme composable to know whether OpenCOR uses light mode, dark mode, or system mode.\n\nexport const useTheme = vueusecore.createGlobalState(() => {\n const prefersColorScheme = window.matchMedia('(prefers-color-scheme: light)');\n const isLightMode = vue.ref(prefersColorScheme.matches);\n const isDarkMode = vue.ref(!prefersColorScheme.matches);\n const _theme = vue.ref<Theme>('system');\n\n function updateLightAndDarkModes(prefersColorScheme: MediaQueryList | MediaQueryListEvent) {\n isLightMode.value = prefersColorScheme.matches;\n isDarkMode.value = !prefersColorScheme.matches;\n }\n\n function updateDocumentClasses() {\n document.documentElement.classList.toggle('celldl-dark-mode', isDarkMode.value);\n }\n\n prefersColorScheme.addEventListener('change', (event) => {\n if (_theme.value === 'system') {\n updateLightAndDarkModes(event);\n updateDocumentClasses();\n }\n });\n\n function theme(): Theme {\n return _theme.value;\n }\n\n function setTheme(newTheme: Theme | undefined) {\n _theme.value = newTheme ?? 'system';\n\n if (_theme.value === 'light') {\n isLightMode.value = true;\n isDarkMode.value = false;\n } else if (_theme.value === 'dark') {\n isLightMode.value = false;\n isDarkMode.value = true;\n } else {\n updateLightAndDarkModes(prefersColorScheme);\n }\n\n updateDocumentClasses();\n }\n\n function useLightMode(): boolean {\n return isLightMode.value;\n }\n\n function useDarkMode(): boolean {\n return isDarkMode.value;\n }\n\n return {\n theme,\n setTheme,\n useLightMode,\n useDarkMode\n };\n});\n","/******************************************************************************\n\nCellDL Editor\n\nCopyright (c) 2022 - 2025 David Brooks\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n******************************************************************************/\n\nimport { isNamedNode, namedNode, type NamedNode } from './rdfstore'\n\nimport { SVG_URI } from '@renderer/common/svgUtils'\n\n//==============================================================================\n\nexport const CELLDL_URI = 'http://celldl.org/ontologies/celldl#'\n\nexport const BG_URI = 'https://bg-rdf.org/ontologies/bondgraph#'\nexport const BGF_URI = 'https://bg-rdf.org/ontologies/bondgraph-framework#'\nexport const CDT_URI = 'https://w3id.org/cdt/'\n\nexport const TPL_URI = 'https://bg-rdf.org/templates/'\n\nexport const DCT_URI = 'http://purl.org/dc/terms/'\nexport const OWL_URI = 'http://www.w3.org/2002/07/owl#'\nexport const RDF_URI = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'\nexport const RDFS_URI = 'http://www.w3.org/2000/01/rdf-schema#'\nexport const XSD_URI = 'http://www.w3.org/2001/XMLSchema#'\n\n//==============================================================================\n\nexport const CELLDL_DECLARATIONS = {\n celldl: CELLDL_URI,\n\n // These should come from BG plugin\n bg: BG_URI,\n bgf: BGF_URI,\n cdt: CDT_URI,\n tpl: TPL_URI\n}\n\nexport const WEB_DECLARATIONS = {\n dcterms: DCT_URI,\n owl: OWL_URI,\n rdf: RDF_URI,\n rdfs: RDFS_URI,\n svg: `${SVG_URI}/`,\n xsd: XSD_URI\n}\n\nconst declaredNamespaces = Object.assign({}, CELLDL_DECLARATIONS, WEB_DECLARATIONS)\n\nexport const SPARQL_PREFIXES = Object.entries(declaredNamespaces).map(\n (prefixUri) => `PREFIX ${prefixUri[0]}: <${prefixUri[1]}>`).join('\\n')\n\n//==============================================================================\n\nexport type NamespaceType = (_: string) => NamedNode\n\nexport class Namespace {\n #nsuri: string\n\n constructor(nsuri: string) {\n this.#nsuri = nsuri\n }\n\n uri(ln: string): NamedNode {\n return namedNode(this.#nsuri + (ln || ''))\n }\n}\n\n//==============================================================================\n\nexport const CELLDL = new Namespace(CELLDL_URI)\n\nexport const BG = new Namespace(BG_URI)\nexport const BGF = new Namespace(BGF_URI)\nexport const CDT = new Namespace(CDT_URI)\nexport const TPL = new Namespace(TPL_URI)\n\nexport const DCT = new Namespace(DCT_URI)\nexport const OWL = new Namespace(OWL_URI)\nexport const RDF = new Namespace(RDF_URI)\nexport const RDFS = new Namespace(RDFS_URI)\nexport const XSD = new Namespace(XSD_URI)\n\n//==============================================================================\n\nexport function curieSuffix(NS: Namespace, term: string | NamedNode): string {\n const curie: string = isNamedNode(term) ? (<NamedNode>term).uri : <string>term\n const fullUri = expandCurie(curie)\n const nsUri = NS.uri('').uri\n if (fullUri.startsWith(nsUri)) {\n return fullUri.slice(nsUri.length)\n }\n return curie\n}\n\n//==============================================================================\n\nexport function getCurie(term: string | NamedNode): string {\n const fullUri: string = isNamedNode(term) ? (<NamedNode>term).uri : <string>term\n for (const [prefix, nsUri] of Object.entries(declaredNamespaces)) {\n if (fullUri.startsWith(nsUri)) {\n return `${prefix}:${fullUri.slice(nsUri.length)}`\n }\n }\n return fullUri\n}\n\n//==============================================================================\n\nconst declaredNamespacesMap = new Map(Object.entries(declaredNamespaces))\n\nexport function expandCurie(curie: string): string {\n const parts = curie.split(':')\n // @ts-expect-error: `parts[0]` is defined\n if (parts.length > 1 && declaredNamespacesMap.has(parts[0])) {\n // @ts-expect-error: `parts[0]` is defined\n return `${declaredNamespacesMap.get(parts[0])}${parts.slice(1).join(':')}`\n }\n return curie\n}\n\n//==============================================================================\n//==============================================================================\n","/******************************************************************************\n\nCellDL Editor\n\nCopyright (c) 2022 - 2025 David Brooks\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n******************************************************************************/\n\nimport {\n blankNode,\n isBlankNode,\n isLiteral,\n isNamedNode,\n MetadataPropertiesMap,\n type MetadataPropertyValue,\n type ContentType,\n type NamedNode,\n type Statement\n} from './index'\n\nimport type { SubjectType, PredicateType, ObjectType } from './index'\n\n//==============================================================================\n\nimport { RDF } from './namespaces'\n\n//==============================================================================\n\nexport interface PredicateValue {\n predicate: PredicateType\n object: ObjectType\n}\n\n//==============================================================================\n\nexport abstract class BaseStore {\n\n abstract add(s: SubjectType, p: PredicateType, o: ObjectType, g: NamedNode | null): Statement\n\n abstract contains(\n s: SubjectType | null,\n p: PredicateType | null,\n o: ObjectType | null,\n g: NamedNode | null\n ): boolean\n\n abstract load(baseIri: string|null, rdf: string, contentType: ContentType, graph: NamedNode|null): void\n\n abstract removeStatements(\n s: SubjectType | null,\n p: PredicateType | null,\n o: ObjectType | null,\n g: NamedNode | null\n ): void\n\n abstract serialise(\n baseIri: string,\n contentType: ContentType,\n namespaces: Record<string, string>,\n graph: NamedNode | null\n ): Promise<string>\n\n abstract query(sparql: string, all_graphs: boolean): Map<string, unknown>[]\n\n abstract statements(graph: NamedNode | null): Statement[]\n\n abstract statementsMatching(\n s: SubjectType | null,\n p: PredicateType | null,\n o: ObjectType | null,\n g: NamedNode | null\n ): Statement[]\n\n abstract subjectsOfType(parentType: NamedNode): [SubjectType, NamedNode][]\n\n abstract update(sparql: string): void\n\n addMetadataPropertiesForSubject(subject: SubjectType, properties: MetadataPropertiesMap): Statement[] {\n const statements: Statement[] = []\n for (const [predicate, value] of properties.predicateValues()) {\n statements.push(...this.#addMetadataProperties(subject, predicate, value))\n }\n return statements\n }\n\n #addMetadataProperties(subject: SubjectType, predicate: PredicateType, value: MetadataPropertyValue): Statement[] {\n const statements: Statement[] = []\n if (isLiteral(value) || isNamedNode(value)) {\n // @ts-expect-error: value is a Literal or NamedNode\n statements.push(this.add(subject, predicate, value))\n } else if (value instanceof MetadataPropertiesMap) {\n const node = blankNode()\n statements.push(this.add(subject, predicate, node, null))\n statements.push(...this.addMetadataPropertiesForSubject(node, value))\n } else if (Array.isArray(value) && value.length > 0) {\n const node = blankNode()\n statements.push(this.add(subject, predicate, node, null))\n this.#addListAsCollection(node, value) // ??\n } else if (value instanceof Set) {\n for (const v of value.values()) {\n statements.push(...this.#addMetadataProperties(subject, predicate, v))\n }\n }\n return statements\n }\n\n addStatementList(statements: Statement[]) {\n statements.forEach((s) => {\n this.add(s.subject, s.predicate, s.object, null)\n })\n }\n\n metadataFromPredicates(predicateValues: PredicateValue[]): MetadataPropertiesMap {\n const metadata = new MetadataPropertiesMap()\n for (const predicateValue of predicateValues) {\n const value = this.#metadataValue(predicateValue.object)\n if (value) {\n metadata.setProperty(predicateValue.predicate, value, true)\n }\n }\n return metadata\n }\n\n metadataPropertiesForSubject(subject: SubjectType): MetadataPropertiesMap {\n const predicateValues = this.statementsMatching(subject, null, null, null) as PredicateValue[]\n return this.metadataFromPredicates(predicateValues)\n }\n\n removeStatementList(statements: Statement[]) {\n statements.forEach((s) => {\n this.removeStatements(s.subject, s.predicate, s.object, null)\n })\n }\n\n #metadataValue(value: ObjectType): MetadataPropertyValue | null {\n if (isLiteral(value) || isNamedNode(value)) {\n // @ts-expect-error: `value` is a Literal or NamedNode\n return value\n } else if (isBlankNode(value)) {\n // @ts-expect-error: value is a BlankNode\n if (this.contains(value, RDF.uri('rest'), null)) {\n // @ts-expect-error: `value` is a BlankNode\n return this.#listFromCollection(value)\n } else {\n // @ts-expect-error: `value` is a BlankNode\n return this.metadataPropertiesForSubject(value)\n }\n }\n return null\n }\n\n #listFromCollection(subject: SubjectType): MetadataPropertyValue[] {\n // Based on https://github.com/ontola/rdfdev-js/blob/master/packages/collections/src/list.ts\n const result: MetadataPropertyValue[] = []\n const nodes = [subject.value]\n let next = subject\n while (next && !next.equals(RDF.uri('nil'))) {\n const headItem = this.statementsMatching(next, RDF.uri('first'), null, null)\n if (headItem.length !== 1 || headItem[0] === undefined) break\n const value = this.#metadataValue(headItem[0].object)\n if (!value) break\n result.push(value)\n const nextItem = this.statementsMatching(next, RDF.uri('rest'), null, null)\n if (nextItem.length !== 1 || nextItem[0] === undefined) break\n next = nextItem[0].object as NamedNode\n if (nodes.includes(next.value)) {\n break\n }\n nodes.push(next.value)\n }\n return result\n }\n\n #addListAsCollection(subject: SubjectType, values: MetadataPropertyValue[]): Statement[] {\n const statements: Statement[] = []\n let current = subject\n values.forEach((value, index) => {\n statements.push(...this.#addMetadataProperties(current, RDF.uri('first'), value))\n if (index < values.length - 1) {\n const next = blankNode()\n statements.push(this.add(current, RDF.uri('rest'), next, null))\n current = next\n }\n })\n statements.push(this.add(current, RDF.uri('rest'), RDF.uri('nil'), null))\n return statements\n }\n}\n\n//==============================================================================\n//==============================================================================\n","/******************************************************************************\n\nCellDL Editor\n\nCopyright (c) 2022 - 2025 David Brooks\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n******************************************************************************/\n\nimport type * as $oxigraph from '@oxigraph/web'\n\nimport { write as prettyTurtle } from '@jeswr/pretty-turtle'\n\n//==============================================================================\n\nimport { WEB_DECLARATIONS } from './namespaces'\n\n//==============================================================================\n\ntype Quad = $oxigraph.Quad\n\ntype Variable = $oxigraph.Variable\n\n//==============================================================================\n\nexport type Term = $oxigraph.Term\n\n//==============================================================================\n\nexport type BlankNode = $oxigraph.BlankNode\n\nexport function blankNode(value: string|undefined=undefined) {\n return globalThis.oxigraph.blankNode(value)\n}\n\nexport function isBlankNode(term: unknown): boolean {\n // @ts-expect-error: term is of unknown type\n return !!term.termType && term.termType === 'BlankNode'\n}\n\n//==============================================================================\n\nexport type Literal = $oxigraph.Literal\n\nexport function literal(value: string|number|boolean, datatype: NamedNode|undefined=undefined) {\n return globalThis.oxigraph.literal(value, datatype)\n}\n\nexport function isLiteral(term: unknown): boolean {\n // @ts-expect-error: term is of unknown type\n return !!term.termType && term.termType === 'Literal'\n}\n\n//==============================================================================\n\nexport interface NamedNode extends $oxigraph.NamedNode {\n uri: string\n id: () => string\n}\n\nfunction makeNamedNode(term: Term): NamedNode | Term {\n if (isNamedNode(term)) {\n (term as NamedNode).uri = term.value;\n (term as NamedNode).id = () => {\n let parts = term.value.split('#')\n if (parts.length < 2) {\n parts = term.value.split('/')\n }\n // biome-ignore lint/style/noNonNullAssertion: parts is not empty\n return parts.length > 1 ? parts.at(-1)! : ''\n }\n return term as NamedNode\n }\n return term\n}\n\nexport function namedNode(value: string): NamedNode {\n return makeNamedNode(globalThis.oxigraph.namedNode(value)) as NamedNode\n}\n\nexport function isNamedNode(term: unknown): boolean {\n // @ts-expect-error: term is of unknown type\n return !!term.termType && term.termType === 'NamedNode'\n}\n\n//==============================================================================\n\nexport type SubjectType = BlankNode | NamedNode | Quad | Variable\nexport type PredicateType = NamedNode | Variable\nexport type ObjectType = BlankNode | Literal | NamedNode | Quad | Variable\n\nexport interface Statement extends Quad {\n subject: SubjectType\n predicate: PredicateType\n object: ObjectType\n}\n\nfunction makeStatement(quad: Quad): Statement {\n return {\n graph: makeNamedNode(quad.graph),\n object: makeNamedNode(quad.object),\n predicate: makeNamedNode(quad.predicate),\n subject: makeNamedNode(quad.subject),\n termType: quad.termType,\n value: quad.value\n } as Statement\n}\n\n//==============================================================================\n\nexport type ContentType = string\n\nexport const TurtleContentType: ContentType = 'text/turtle'\n\n//==============================================================================\n//==============================================================================\n\nimport { BaseStore } from './store'\n\n//==============================================================================\n\nexport class RdfStore extends BaseStore {\n #rdfStore: $oxigraph.Store\n\n constructor() {\n super()\n this.#rdfStore = new globalThis.oxigraph.Store()\n }\n\n statements(graph: NamedNode | null = null): Statement[] {\n return this.statementsMatching(null, null, null, graph)\n }\n\n add(s: SubjectType, p: PredicateType, o: ObjectType, g: NamedNode | null = null): Statement {\n const statement = globalThis.oxigraph.quad(s, p, o, g || globalThis.oxigraph.defaultGraph())\n this.#rdfStore.add(statement)\n return makeStatement(statement)\n }\n\n contains(\n s: SubjectType | null = null,\n p: PredicateType | null = null,\n o: ObjectType | null = null,\n g: NamedNode | null = null\n ): boolean {\n return this.#rdfStore.match(s, p, o, g || globalThis.oxigraph.defaultGraph()).length > 0\n }\n\n load(baseIri: string|null=null, rdf: string, contentType: ContentType=TurtleContentType, graph: NamedNode|null=null) {\n try {\n this.#rdfStore.load(rdf, {\n format: contentType,\n base_iri: baseIri || undefined,\n to_graph_name: graph || globalThis.oxigraph.defaultGraph()\n })\n } catch (error) {\n throw new Error(`Error parsing RDF: ${(<Error>error).message}`)\n }\n }\n\n removeStatements(\n s: SubjectType | null = null,\n p: PredicateType | null = null,\n o: ObjectType | null = null,\n g: NamedNode | null = null\n ) {\n const statements = this.#rdfStore.match(s, p, o, g || globalThis.oxigraph.defaultGraph())\n for (const statement of statements) {\n this.#rdfStore.delete(statement)\n }\n }\n\n async serialise(\n baseIri: string,\n contentType: ContentType = TurtleContentType,\n namespaces: Record<string, string> = {},\n graph: NamedNode | null = null\n ): Promise<string> {\n if (contentType === TurtleContentType) {\n const quads = this.#rdfStore.match(null, null, null, graph || globalThis.oxigraph.defaultGraph())\n const turtle = await prettyTurtle(quads, {\n format: 'text/turtle',\n prefixes: Object.assign({ '': `${baseIri}#` }, WEB_DECLARATIONS, namespaces),\n baseIri: baseIri,\n explicitBaseIRI: true,\n compact: false,\n ordered: true\n })\n return turtle.replaceAll(baseIri, '')\n } else {\n return this.#rdfStore.dump({\n format: contentType,\n from_graph_name: graph || globalThis.oxigraph.defaultGraph()\n })\n }\n }\n\n query(sparql: string, all_graphs: boolean = false): Map<string, Term>[] {\n try {\n const results = this.#rdfStore.query(sparql, {\n use_default_graph_as_union: all_graphs\n }) as Map<string, Term>[]\n for (const result of results) {\n for (const term of result.values()) {\n makeNamedNode(term)\n }\n }\n return results\n } catch (error) {\n console.log(`Error parsing SPARQL query: ${(<Error>error).message} ${sparql}`)\n let inLib = true\n for (const location of (<Error>error).stack!.split('\\n')) {\n if (inLib) {\n inLib = location.indexOf('RdfStore.query') < 0\n } else {\n console.log(location)\n }\n }\n }\n return []\n }\n\n statementsMatching(\n s: SubjectType | null = null,\n p: PredicateType | null = null,\n o: ObjectType | null = null,\n g: NamedNode | null = null\n ): Statement[] {\n const statements: Quad[] = this.#rdfStore.match(s, p, o, g || globalThis.oxigraph.defaultGraph())\n return statements.map((s) => makeStatement(s))\n }\n\n subjectsOfType(parentType: NamedNode): [SubjectType, NamedNode][] {\n return this.query(\n `PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\nPREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n\nSELECT DISTINCT ?s ?t WHERE {\n ?s rdf:type/rdfs:subClassOf* <${parentType.uri}> .\n ?s rdf:type ?t .\n } ORDER BY ?s`,\n true\n ).map((r) => [r.get('s') as SubjectType,\n r.get('t') as NamedNode])\n }\n\n update(sparql: string): void {\n try {\n this.#rdfStore.update(sparql)\n } catch (error) {\n console.log(`Error parsing SPARQL update: ${(<Error>error).message} ${sparql}`)\n let inLib = true\n for (const location of (<Error>error).stack!.split('\\n')) {\n if (inLib) {\n inLib = location.indexOf('RdfStore.update') < 0\n } else {\n console.log(location)\n }\n }\n }\n }\n}\n\n//==============================================================================\n//==============================================================================\n","/******************************************************************************\n\nCellDL Editor\n\nCopyright (c) 2022 - 2025 David Brooks\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n******************************************************************************/\n\nexport {\n blankNode,\n isBlankNode,\n literal,\n isLiteral,\n namedNode,\n isNamedNode,\n TurtleContentType,\n RdfStore\n} from './rdfstore.ts'\n\nexport type {\n BlankNode,\n Literal,\n NamedNode,\n Statement,\n SubjectType,\n PredicateType,\n ObjectType,\n ContentType,\n Term\n} from './rdfstore.ts'\n\nexport type { PredicateValue } from './store.ts'\n\nexport * from './namespaces.ts'\n\n//==============================================================================\n\nimport { type Literal, isLiteral, type NamedNode, namedNode, isNamedNode } from './rdfstore'\n\nimport type { PredicateType } from './rdfstore'\n\nimport { RDF } from './namespaces'\n\n//==============================================================================\n\n/**\n * The type of the ``object`` of a ``predicate``\n */\nexport type MetadataPropertyValue = Literal | NamedNode | MetadataCollection\nexport type MetadataCollection = MetadataPropertyValue[] | Set<MetadataPropertyValue> | MetadataPropertiesMap\n\n/**\n * A ``<predicate, object>`` pair\n */\nexport type MetadataProperty = [NamedNode, MetadataPropertyValue]\n\n//==============================================================================\n\nexport function fragment(uri: NamedNode|string): string {\n // @ts-expect-error: uri is a NamedNode\n const uriString = isNamedNode(uri) ? uri.value : uri\n const parts = uriString.split('#')\n return parts.at(-1)\n}\n\n//==============================================================================\n\n/**\n * An associative map with ``object`` values for a subject's ``predicate`` properties.\n *\n * We extend ``Map`` to add a ``copy()`` method.\n */\nexport class MetadataPropertiesMap extends Map<string, MetadataPropertyValue> {\n #rdfTypes: Set<string> = new Set()\n\n static fromProperties(properties: MetadataProperty[]): MetadataPropertiesMap {\n return properties.reduce((metadata, prop) => {\n metadata.setProperty(prop[0], prop[1])\n return metadata\n }, new MetadataPropertiesMap())\n }\n\n get rdfTypes() {\n return this.#rdfTypes\n }\n\n copy(): MetadataPropertiesMap {\n const metadata = new MetadataPropertiesMap()\n for (const [key, value] of this.entries()) {\n metadata.set(key, this.#copyValue(value))\n }\n metadata.#rdfTypes = new Set(this.#rdfTypes.values())\n return metadata\n }\n\n #copyValue(value: MetadataPropertyValue): MetadataPropertyValue {\n if (isLiteral(value) || isNamedNode(value)) {\n return value\n } else if (value instanceof MetadataPropertiesMap) {\n return value.copy()\n } else if (Array.isArray(value)) {\n return value.map((v) => this.#copyValue(v)) as MetadataPropertyValue\n } else {\n // @ts-expect-error: `value` is not a Literal nor NamedNode\n return new Set([...value.values()].map((v) => this.#copyValue(v))) as MetadataPropertyValue\n }\n }\n\n getProperty(predicate: PredicateType): MetadataPropertyValue | null {\n return this.get(predicate.value) || null\n }\n\n getPropertyAsArray(predicate: PredicateType): MetadataPropertyValue[] {\n const value = this.getProperty(predicate)\n if (!value) return []\n if (isLiteral(value) || isNamedNode(value) || value instanceof MetadataPropertiesMap) {\n return [value]\n } else if (Array.isArray(value)) {\n return value\n } else {\n // @ts-expect-error: `value` is a set`\n return [...value.values()]\n }\n }\n\n isA(type: NamedNode): boolean {\n return this.#rdfTypes.has(type.uri)\n }\n\n *predicateValues(): IterableIterator<[NamedNode, MetadataPropertyValue]> {\n for (const [p, value] of super.entries()) {\n yield [namedNode(p), value]\n }\n }\n\n setProperty(predicate: PredicateType, value: MetadataPropertyValue, multiValued = false) {\n if (predicate.equals(RDF.uri('type')) && isNamedNode(value)) {\n // @ts-expect-error: `value` is a NamedNode\n this.#rdfTypes.add(value.uri)\n }\n // @ts-expect-error: `predicate` is a NamedNode\n const property = predicate.uri\n if (multiValued && this.has(property)) {\n const values = this.get(property)\n if (values instanceof Set) {\n let inSet = false\n if (isLiteral(value) || isNamedNode(value)) {\n for (const v of values) {\n // @ts-expect-error: `value` is a Literal or NamedNode\n if (value.equals(v)) {\n inSet = true\n break\n }\n }\n }\n if (!inSet) {\n values.add(value)\n }\n } else if (values) {\n // @ts-expect-error: `values` is a Literal or NamedNode\n if (!(isLiteral(values) || isNamedNode(values)) || !values.equals(value)) {\n this.set(property, new Set<MetadataPropertyValue>([values, value]))\n }\n } else {\n this.set(property, new Set<MetadataPropertyValue>([value]))\n }\n } else {\n this.set(property, value)\n }\n }\n}\n\n//==============================================================================\n","/******************************************************************************\n\nCellDL Editor\n\nCopyright (c) 2022 - 2025 David Brooks\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n******************************************************************************/\n\nexport enum ConnectionStyle {\n Linear = 'linear',\n Rectilinear = 'rectilinear'\n}\n\nexport interface ConnectionStyleDefinition {\n id: ConnectionStyle\n icon: string\n name: string\n}\n\n//==============================================================================\n\nexport const DEFAULT_CONNECTION_STYLE_DEFINITION = {\n id: ConnectionStyle.Rectilinear,\n name: 'Rectilinear',\n icon: 'ci-rectilinear-connection'\n}\n\nexport const DEFAULT_CONNECTION_STYLE = DEFAULT_CONNECTION_STYLE_DEFINITION.id\n\nexport const CONNECTION_STYLE_DEFINITIONS: ConnectionStyleDefinition[] = [\n {\n id: ConnectionStyle.Linear,\n name: 'Linear',\n icon: 'ci-linear-connection'\n },\n DEFAULT_CONNECTION_STYLE_DEFINITION\n]\n\n//==============================================================================\n//==============================================================================\n","/******************************************************************************\n\nCellDL Editor\n\nCopyright (c) 2022 - 2025 David Brooks\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n******************************************************************************/\n\nimport { Point, type PointLike, PointMath } from '@renderer/common/points'\nimport { CONNECTION_COLOUR, CONNECTION_WIDTH } from '@renderer/common/styling'\nimport { svgPath, svgPathDescription, SVG_URI } from '@renderer/common/svgUtils'\nimport { CELLDL, RDF } from '@renderer/metadata/index'\nimport { MetadataPropertiesMap } from '@renderer/metadata/index'\nimport { componentLibraryPlugin, type connectionStatus } from '@renderer/plugins/index'\n\nimport { type CellDLConnectedObject, CellDLConnection, type CellDLObject } from '@editor/celldlObjects/index'\nimport { alert } from '@editor/editor/alerts'\nimport type { CellDLDiagram } from '@editor/diagram/index'\nimport type { EditorFrame } from '@editor/editor/editorframe'\nimport type { CellDLSVGElement } from '@editor/SVGElements/index'\nimport { round } from '@editor/utils'\n\nimport { ConnectionStyle } from './index'\n\n//==============================================================================\n\n// We keep just behind the pointer to make sure it is not over the drawn\n// SVG path and so don't see pointer over events on components\n\nconst TIP_MARGIN = 1 // pixels\n\n//==============================================================================\n\nclass PathPoint {\n constructor(\n readonly point: Point,\n readonly celldlObject: CellDLConnectedObject | null = null\n ) {}\n\n static fromValue(x: number, y: number): PathPoint {\n return new PathPoint(new Point(x, y))\n }\n\n get x() {\n return this.point.x\n }\n\n get y() {\n return this.point.y\n }\n\n objectContainsPoint(point: PointLike) {\n return this.celldlObject?.containsPoint(point)\n }\n}\n\n//==============================================================================\n\nclass PathEdge {\n #svgPath: SVGPathElement | null\n\n constructor(\n readonly source: PathNode,\n readonly target: PathNode,\n svgPath: SVGPathElement\n ) {\n this.#svgPath = svgPath\n }\n\n get svgPath() {\n return this.#svgPath\n }\n\n clearSvgPath() {\n this.#svgPath = null\n }\n}\n\n//==============================================================================\n\nexport class PathNode {\n constructor(readonly object: CellDLConnectedObject) {}\n\n get celldlSvgElement() {\n return this.object.celldlSvgElement\n }\n\n get id() {\n return this.object.id\n }\n\n get uri() {\n return this.object.uri\n }\n\n canConnect(_node: PathNode): boolean {\n // Check if objects are allowed to be connected\n return true\n // return libraryManager.objectMethods(this.object).canConnect(node.object)\n }\n}\n\n//==============================================================================\n\n/**\n * A ``PathMaker`` is used to create a ``celldl:Connection``.\n *\n * A connection begins with a start object; has a geometric shape, specified by an\n * SVG path; possibly passes through intermediate objects (conduits); and finishes\n * with an end object.\n *\n * An object may have constraints to determine whether and how it can be connected\n * to a path.\n */\nexport class PathMaker {\n #currentSvgPath: SVGPathElement | null = null\n #edges: PathEdge[] = []\n #editorFrame: EditorFrame\n #lastNode: PathNode\n #lastNodeElement: CellDLSVGElement\n #pointBeforeNode: Point | null = null\n #nodes: PathNode[] = []\n #objectIds: string[] = []\n #pathPoints: PathPoint[] = []\n #rectilinearDirn: string = ''\n #startObject: CellDLObject\n #style: string\n\n constructor(editorFrame: EditorFrame, startNode: PathNode, style: string = 'rectilinear') {\n this.#editorFrame = editorFrame\n this.#nodes.push(startNode)\n this.#objectIds.push(startNode.id)\n this.#lastNode = startNode\n // biome-ignore lint/style/noNonNullAssertion: node has an SVG element\n this.#lastNodeElement = startNode.celldlSvgElement!\n this.#startObject = startNode.object\n this.#style = style\n }\n\n get currentSvgPath() {\n return this.#currentSvgPath\n }\n\n get empty() {\n return this.#edges.length === 0 && this.#currentSvgPath === null\n }\n\n static #checkMaxConnections(celldlObject: CellDLConnectedObject): boolean {\n if (celldlObject.numConnections < celldlObject.maxConnections) {\n return true\n }\n alert.tooltip('Component has maximum number of connections')\n return false\n }\n\n static validStartObject(celldlObject: CellDLObject): PathNode | null {\n if (celldlObject.isConnectable && !celldlObject.isConduit) {\n if (PathMaker.#checkMaxConnections(<CellDLConnectedObject>celldlObject)) {\n return new PathNode(<CellDLConnectedObject>celldlObject)\n }\n } else if (!celldlObject.isConnection) {\n alert.tooltip('Component cannot start a path')\n }\n return null\n }\n\n static startPartialPath(point: PointLike, celldlDiagram: CellDLDiagram): PathNode {\n const connector = celldlDiagram.createUnconnectedPort(point)\n return new PathNode(connector)\n }\n\n close() {\n this.#removeSvgPath()\n }\n\n validPathNode(celldlObject: CellDLObject): PathNode | null {\n if (!celldlObject.isConnectable) {\n if (!celldlObject.isConnection) {\n alert.tooltip('Component does not allow connections')\n }\n return null\n } else if (this.#currentSvgPath === null) {\n return null\n } else if (celldlObject.id === this.#startObject.id) {\n if (this.#nodes.length < 2) {\n alert.tooltip('Path cannot directly loop to start component')\n return null\n }\n } else if (this.#objectIds.includes(celldlObject.id)) {\n alert.tooltip('Component is already on the path')\n return null\n }\n // Check with plugins that (source --> object) would be valid.\n const connectionStatus = componentLibraryPlugin.checkConnectionValid(this.#startObject, celldlObject)\n if (connectionStatus?.alert) {\n alert.tooltip(connectionStatus.alert)\n return null\n }\n if (!PathMaker.#checkMaxConnections(<CellDLConnectedObject>celldlObject)) {\n return null\n }\n const pathNode = new PathNode(<CellDLConnectedObject>celldlObject)\n if (pathNode.canConnect(this.#lastNode)) {\n return pathNode\n }\n return null\n }\n\n addIntermediate(node: PathNode, shiftKey: boolean = false) {\n // We assume that ``node`` is a ``validPathNode()``\n this.#addNode(node, this.#style === ConnectionStyle.Rectilinear || shiftKey)\n }\n\n #constrainAngle(\n startPoint: PointLike,\n point: PointLike,\n rectilinear: boolean,\n noTipMargin: boolean = false\n ): Point {\n if (this.#pointBeforeNode !== null) {\n const slope = PointMath.subtract(startPoint, this.#pointBeforeNode)\n const slopeLength = Math.sqrt(slope.x * slope.x + slope.y * slope.y)\n const delta = PointMath.subtract(point, this.#pointBeforeNode)\n const lengthScale = (Math.sqrt(delta.x * delta.x + delta.y * delta.y) - TIP_MARGIN) / slopeLength\n return new Point(slope.x * lengthScale, slope.y * lengthScale).add(this.#pointBeforeNode)\n } else if (rectilinear) {\n const delta = PointMath.subtract(point, startPoint)\n if (round(delta.x) === 0 && round(delta.y) === 0) {\n return Point.fromPoint(startPoint)\n } else {\n if (this.#rectilinearDirn.length === 0 || !['H', 'V'].includes(this.#rectilinearDirn.slice(0, 1))) {\n let theta = (180 * Math.atan2(-delta.y, delta.x)) / Math.PI\n if (theta < 0) theta += 360\n theta = 90 * Math.round(theta / 90)\n this.#rectilinearDirn = [0, 180, 360].includes(theta) ? 'h' : 'v'\n } else if (this.#rectilinearDirn.length > 1) {\n if (\n (this.#rectilinearDirn.toUpperCase().startsWith('H') &&\n ((this.#rectilinearDirn.slice(1, 2) === '+' && point.x < startPoint.x) ||\n (this.#rectilinearDirn.slice(1, 2) === '-' && point.x > startPoint.x))) ||\n (this.#rectilinearDirn.toUpperCase().startsWith('V') &&\n ((this.#rectilinearDirn.slice(1, 2) === '+' && point.y < startPoint.y) ||\n (this.#rectilinearDirn.slice(1, 2) === '-' && point.y > startPoint.y)))\n ) {\n return Point.fromPoint(startPoint)\n }\n }\n if (this.#rectilinearDirn.toUpperCase().startsWith('H')) {\n const margin =\n noTipMargin || Math.abs(delta.x) <= TIP_MARGIN ? 0 : delta.x > 0 ? TIP_MARGIN : -TIP_MARGIN\n return new Point(point.x - margin, startPoint.y)\n } else {\n const margin =\n noTipMargin || Math.abs(delta.y) <= TIP_MARGIN ? 0 : delta.y > 0 ? TIP_MARGIN : -TIP_MARGIN\n return new Point(startPoint.x, point.y - margin)\n }\n }\n }\n const delta = PointMath.subtract(point, startPoint)\n const length = Math.sqrt(delta.x * delta.x + delta.y * delta.y)\n const lengthScale = (length - TIP_MARGIN) / length\n return new Point(delta.x * lengthScale, delta.y * lengthScale).add(startPoint)\n }\n\n #splitPath(startPoint: PointLike, endPoint: PointLike): PathPoint[] {\n // Check is start and end points are aligned with the path's\n // direction and, if not, add an offset.\n const delta = PointMath.subtract(endPoint, startPoint)\n if (round(delta.x) === 0 || round(delta.y) === 0) {\n return []\n } else if (\n this.#rectilinearDirn.toUpperCase().startsWith('H') ||\n (this.#rectilinearDirn === '' && Math.abs(delta.x) >= Math.abs(delta.y))\n ) {\n const midX = (startPoint.x + endPoint.x) / 2\n return [PathPoint.fromValue(midX, startPoint.y), PathPoint.fromValue(midX, endPoint.y)]\n } else {\n const midY = (startPoint.y + endPoint.y) / 2\n return [PathPoint.fromValue(startPoint.x, midY), PathPoint.fromValue(endPoint.x, midY)]\n }\n }\n\n #setFirstPoints(currentObject: CellDLConnectedObject, finishing: boolean = false, rectilinear: boolean) {\n // Called when no path points have been set\n // biome-ignore lint/style/noNonNullAssertion: object has an SVG element\n const objectCentroid = currentObject.celldlSvgElement!.centroid\n let firstPoint = this.#lastNodeElement.boundaryIntersections(objectCentroid)[0]\n if (firstPoint) {\n // biome-ignore lint/style/noNonNullAssertion: object has an SVG element\n let currentPoint = currentObject.celldlSvgElement!.boundaryIntersections(firstPoint)[0]\n let midPoints: PathPoint[] = []\n if (rectilinear) {\n if (this.#rectilinearDirn.length) {\n this.#rectilinearDirn = this.#rectilinearDirn.slice(0, 1).toLowerCase()\n }\n const endFromStart = this.#constrainAngle(this.#lastNodeElement.centroid, objectCentroid, true, true)\n // Add mid-points if start and end objects aren't aligned\n const startFromEnd = this.#constrainAngle(objectCentroid, this.#lastNodeElement.centroid, true, true)\n firstPoint = this.#lastNodeElement.boundaryIntersections(endFromStart)[0]\n if (firstPoint) {\n // biome-ignore lint/style/noNonNullAssertion: object has an SVG element\n if (currentObject.celldlSvgElement!.containsPoint(endFromStart)) {\n midPoints = this.#splitPath(endFromStart, startFromEnd)\n // biome-ignore lint/style/noNonNullAssertion: object has an SVG element\n currentPoint = currentObject.celldlSvgElement!.boundaryIntersections(startFromEnd)[0]\n } else {\n // Start and end objects are separate enough to just need a corner point to change path direction\n midPoints = [new PathPoint(endFromStart)]\n // biome-ignore lint/style/noNonNullAssertion: object has an SVG element\n currentPoint = currentObject.celldlSvgElement!.boundaryIntersections(endFromStart)[0]\n }\n }\n }\n if (firstPoint && currentPoint) {\n this.#pathPoints = [new PathPoint(firstPoint, this.#lastNode.object), ...midPoints]\n this.#pathPoints.push(new PathPoint(finishing ? currentPoint : objectCentroid, currentObject))\n }\n }\n }\n\n #addPoint(point: PointLike, rectilinear: boolean): Point {\n let end = Point.fromPoint(point)\n // biome-ignore lint/style/noNonNullAssertion: pathPoints array has elements\n const lastPathPoint = this.#pathPoints.at(-1)!\n const lastPoint = lastPathPoint.point\n if (this.#rectilinearDirn.toUpperCase().startsWith('H') && lastPoint.x === point.x) {\n end = new Point(lastPoint.x, point.y)\n this.#rectilinearDirn = 'V'\n } else if (this.#rectilinearDirn.toUpperCase().startsWith('V') && lastPoint.y === point.y) {\n end = new Point(point.x, lastPoint.y)\n this.#rectilinearDirn = 'H'\n } else {\n point = this.#constrainAngle(lastPoint, point, rectilinear)\n this.#pathPoints.push(PathPoint.fromValue(point.x, point.y))\n }\n return end\n }\n\n #changeDirection() {\n this.#rectilinearDirn = this.#rectilinearDirn.toUpperCase().startsWith('H') ? 'V' : 'H'\n }\n\n addPoint(point: PointLike, shiftKey: boolean = false) {\n let addedPoints = false\n const end = Point.fromPoint(point)\n const rectilinear = this.#style === ConnectionStyle.Rectilinear || shiftKey\n if (this.#pathPoints.length === 0) {\n const newPoint = this.#constrainAngle(this.#lastNodeElement.centroid, point, rectilinear)\n const firstPoint = this.#lastNodeElement.boundaryIntersections(newPoint)[0]\n if (firstPoint !== null) {\n this.#pathPoints = [new PathPoint(firstPoint), new PathPoint(newPoint)]\n addedPoints = true\n }\n } else {\n // biome-ignore lint/style/noNonNullAssertion: pathPoints array has elements\n const lastPathPoint = this.#pathPoints.at(-1)!\n if (!lastPathPoint.objectContainsPoint(point)) {\n this.#addPoint(point, rectilinear)\n addedPoints = true\n }\n }\n if (addedPoints) {\n this.#pointBeforeNode = null\n this.#changeDirection()\n }\n this.drawTo(end, shiftKey)\n }\n\n drawTo(point: PointLike, shiftKey: boolean = false) {\n const rectilinear = this.#style === ConnectionStyle.Rectilinear || shiftKey\n if (this.#pathPoints.length === 0) {\n point = this.#constrainAngle(this.#lastNodeElement.centroid, point, rectilinear)\n const firstPoint = this.#lastNodeElement.boundaryIntersections(point)[0]\n if (firstPoint !== null) {\n this.#setCurrentSvgPath([new PathPoint(firstPoint), PathPoint.fromValue(point.x, point.y)])\n } else {\n this.#setCurrentSvgPath([])\n }\n } else {\n // biome-ignore lint/style/noNonNullAssertion: pathPoints array has elements\n const lastPathPoint = this.#pathPoints.at(-1)!\n const lastPoint = lastPathPoint.point\n if (\n !(\n (this.#rectilinearDirn.toUpperCase() === 'H' && lastPoint.x === point.x) ||\n (this.#rectilinearDirn.toUpperCase() === 'V' && lastPoint.y === point.y)\n )\n ) {\n point = this.#constrainAngle(lastPoint, point, rectilinear)\n }\n this.#setCurrentSvgPath([...this.#pathPoints, PathPoint.fromValue(point.x, point.y)])\n }\n }\n\n #addNode(node: PathNode, rectilinear: boolean): boolean {\n const object = node.object\n\n if (this.#pathPoints.length === 0) {\n // If rectilinear will add points to align path\n this.#setFirstPoints(object, true, rectilinear)\n } else {\n // biome-ignore lint/style/noNonNullAssertion: object has an SVG element\n const centroid = object.celldlSvgElement!.centroid\n // biome-ignore lint/style/noNonNullAssertion: pathPoints array has elements\n const prevPathPoint = this.#pathPoints.at(-1)!\n let prevPoint = prevPathPoint.point\n if (rectilinear) {\n // Adjust previous point to align with endObject\n let nextPoint = this.#constrainAngle(prevPoint, centroid, rectilinear, true)\n // biome-ignore lint/style/noNonNullAssertion: object has an SVG element\n if (object.celldlSvgElement!.containsPoint(nextPoint)) {\n nextPoint = this.#constrainAngle(centroid, prevPoint, rectilinear, true)\n this.#changeDirection()\n this.#pathPoints.splice(-1, 1, new PathPoint(nextPoint))\n } else {\n this.#pathPoints.push(new PathPoint(nextPoint))\n }\n prevPoint = nextPoint\n }\n // biome-ignore lint/style/noNonNullAssertion: object has an SVG element\n const lastPoint = object.celldlSvgElement!.boundaryIntersections(prevPoint)[0]\n if (lastPoint) {\n // no lastPoint if centroid, but dirn set...\n this.#pathPoints.push(new PathPoint(lastPoint))\n }\n }\n\n this.#setCurrentSvgPath(this.#pathPoints)\n if (this.#currentSvgPath === null) {\n return false\n }\n this.#edges.push(new PathEdge(this.#lastNode, node, this.#currentSvgPath))\n this.#nodes.push(node)\n this.#objectIds.push(node.id)\n this.#lastNode = node\n // biome-ignore lint/style/noNonNullAssertion: node has an SVG element\n this.#lastNodeElement = node.celldlSvgElement!\n\n const lastPoints = this.#pathPoints.slice(-2)\n if (rectilinear) {\n const delta = PointMath.subtract(lastPoints[1]!.point, lastPoints[0]!.point)\n if (Math.abs(delta.x) > Math.abs(delta.y)) {\n this.#rectilinearDirn = `H${delta.x > 0 ? '+' : '-'}`\n } else {\n this.#rectilinearDirn = `V${delta.y > 0 ? '+' : '-'}`\n }\n } else if (this.#style === ConnectionStyle.Linear) {\n this.#pointBeforeNode = Point.fromPoint(lastPoints[0]!.point)\n }\n this.#pathPoints = []\n this.#currentSvgPath = null\n\n return true\n }\n\n // We assume that ``endComponent`` is a ``validPathNode()``\n finishPath(endNode: PathNode, celldlDiagram: CellDLDiagram, shiftKey: boolean = false) {\n // Add the last point to the path\n if (!this.#addNode(endNode, this.#style === ConnectionStyle.Rectilinear || shiftKey)) {\n return\n }\n\n // The last path segment has an arrowhead\n // biome-ignore lint/style/noNonNullAssertion: edge has an SVG path\n this.#edges[this.#edges.length - 1]!.svgPath!.classList.add('arrow')\n\n // When multiple edges we return a SVG group containing the paths\n let svgElement: SVGGraphicsElement\n if (this.#edges.length === 1) {\n // biome-ignore lint/style/noNonNullAssertion: edge has an SVG path\n svgElement = this.#edges[0]!.svgPath!\n } else {\n svgElement = document.createElementNS(SVG_URI, 'g') as SVGGraphicsElement\n this.#edges.forEach((edge) => {\n edge.svgPath?.classList.add('parent-id')\n })\n this.#edges.forEach((edge) => {\n // biome-ignore lint/style/noNonNullAssertion: edge has an SVG path\n svgElement.appendChild(edge.svgPath!)\n })\n }\n svgElement.classList.add(this.#style)\n\n // Create a new connection between start and end objects\n const metadataProperties = MetadataPropertiesMap.fromProperties([\n [RDF.uri('type'), CELLDL.uri('Connection')], // shouldn't CellDLClass imply this??\n [CELLDL.uri('hasSource'), this.#startObject.uri],\n [CELLDL.uri('hasTarget'), endNode.uri],\n [CELLDL.uri('hasIntermediate'), this.#nodes.slice(1, -1).map((c) => c.uri)]\n ])\n // need to unregister redo handler...\n celldlDiagram.addNewConnection(svgElement, {\n CellDLClass: CellDLConnection,\n metadataProperties\n })\n }\n\n finishPartialPath(celldlDiagram: CellDLDiagram, shiftKey: boolean = false) {\n // Terminate the partly drawn path at an interface port\n if (this.#style === ConnectionStyle.Rectilinear || shiftKey) {\n // Need to undo change of direction etc from click seen before double click...\n this.#pathPoints = this.#pathPoints.slice(0, -1)\n this.#setCurrentSvgPath(this.#pathPoints)\n }\n const lastPointIndex = this.#pathPoints.length - 1\n const connector = celldlDiagram.createUnconnectedPort(this.#pathPoints[lastPointIndex]!.point)\n if (connector) {\n // biome-ignore lint/style/noNonNullAssertion: connector has an SVG element\n const pathEnd = connector.celldlSvgElement!.boundaryIntersections(\n this.#pathPoints[lastPointIndex - 1]!.point\n )[0]\n if (pathEnd) {\n this.#pathPoints[lastPointIndex] = new PathPoint(pathEnd)\n }\n }\n this.finishPath(new PathNode(connector), celldlDiagram)\n }\n\n #removeSvgPath() {\n for (const edge of this.#edges) {\n if (edge.svgPath) {\n this.#editorFrame.removeElement(edge.svgPath)\n edge.clearSvgPath()\n }\n }\n this.#removeCurrentSvgPath()\n }\n\n #removeCurrentSvgPath() {\n if (this.#currentSvgPath) {\n this.#editorFrame.removeElement(this.#currentSvgPath)\n this.#currentSvgPath = null\n }\n }\n\n #setCurrentSvgPath(pathPoints: PathPoint[]) {\n const points = pathPoints.map((p) => p.point)\n if (points.length <= 1) {\n this.#removeCurrentSvgPath()\n } else if (this.#currentSvgPath === null) {\n this.#currentSvgPath = <SVGPathElement>(\n this.#editorFrame.addElementAsString(\n svgPath(points, {\n class: `celldl-Connection bondgraph ${this.#style}`,\n stroke: CONNECTION_COLOUR,\n 'stroke-width': String(CONNECTION_WIDTH)\n })\n )\n )\n } else {\n this.#currentSvgPath.setAttribute('d', svgPathDescription(points))\n }\n }\n}\n\n//==============================================================================\n","/******************************************************************************\n\nCellDL Editor\n\nCopyright (c) 2022 - 2025 David Brooks\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n******************************************************************************/\n\nimport { type PointLike, PointMath } from '@renderer/common/points'\nimport type { ObjectTemplate } from '@editor/components/index'\nimport { SVG_URI } from '@renderer/common/svgUtils'\n\n//==============================================================================\n\nexport const EDITOR_FRAME_ID = 'celldl-editor-selection-frame'\n\n//==============================================================================\n\nexport class EditorFrame {\n #frameGroupElement: SVGGElement\n\n constructor(svgDiagram: SVGSVGElement) {\n let editorFrameGroup = svgDiagram.getElementById(EDITOR_FRAME_ID) as SVGGraphicsElement\n if (editorFrameGroup === null) {\n // Create a new group at the end of our SVG\n svgDiagram.insertAdjacentHTML('beforeend', `<g id=\"${EDITOR_FRAME_ID}\"/>`)\n editorFrameGroup = svgDiagram.getElementById(EDITOR_FRAME_ID) as SVGGraphicsElement\n }\n this.#frameGroupElement = editorFrameGroup\n\n // Remove any children that might be present\n this.clear()\n }\n\n get svgGroup() {\n return this.#frameGroupElement\n }\n\n addElementAsString(element: string): SVGGraphicsElement | null {\n if (this.#frameGroupElement) {\n this.#frameGroupElement.insertAdjacentHTML('beforeend', element)\n return this.#frameGroupElement.lastChild as SVGGraphicsElement\n }\n return null\n }\n\n addSvgElement(template: ObjectTemplate, topLeft: PointLike): SVGGElement {\n const svgElement: SVGGElement = document.createElementNS(SVG_URI, 'g')\n svgElement.setAttribute('style', 'visibility: hidden')\n if (template.image) {\n svgElement.insertAdjacentHTML('beforeend', `<image href=\"${template.image}\">`)\n } else if (template.svg) {\n svgElement.insertAdjacentHTML('beforeend', template.svg)\n }\n this.#frameGroupElement.append(svgElement)\n const bbox = svgElement.getBBox()\n const translation = PointMath.subtract(topLeft, bbox)\n svgElement.setAttribute('transform', `translate(${translation.x}, ${translation.y})`)\n svgElement.removeAttribute('style')\n return svgElement\n }\n\n clear() {\n while (this.#frameGroupElement?.hasChildNodes()) {\n const child = this.#frameGroupElement.lastChild\n if (child !== null) {\n this.#frameGroupElement.removeChild(child)\n }\n }\n }\n\n contains(feature: SVGGraphicsElement) {\n return this.#frameGroupElement.contains(feature)\n }\n\n removeElement(element: SVGGraphicsElement | null) {\n if (element && this.#frameGroupElement.contains(element)) {\n this.#frameGroupElement.removeChild(element)\n }\n }\n}\n\n//==============================================================================\n","/******************************************************************************\n\nCellDL Editor\n\nCopyright (c) 2022 - 2025 David Brooks\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n******************************************************************************/\n\nimport type { Extent } from '@editor/geometry'\n\nimport { getViewbox } from '@renderer/common/svgUtils'\nimport { Point } from '@renderer/common/points'\n\nimport { editGuides } from './editguides'\n\n//==============================================================================\n\nexport default class PanZoom {\n #panning: boolean = false\n #pointerDownPosition: Point = new Point()\n\n #svgDiagram: SVGSVGElement | null = null\n #containerId: string\n #containerOrigin: Point = new Point()\n #containerSize: Point = new Point()\n #resizeObserver: ResizeObserver\n\n #minScale: number = 0.125\n #scale: number = 1\n #maxScale: number = 32\n #step: number = 0.05\n\n constructor(container: HTMLElement) {\n // options\n container.addEventListener('wheel', this.#wheelEvent.bind(this), { passive: true })\n this.#containerId = container.id\n this.#containerOrigin = new Point(\n container.offsetLeft + container.clientLeft,\n container.offsetTop + container.clientTop\n )\n this.#containerSize = new Point(container.clientWidth, container.clientHeight)\n this.#resizeObserver = new ResizeObserver(this.#resizeObservation.bind(this))\n this.#resizeObserver.observe(container)\n }\n\n get panning() {\n return this.#panning\n }\n\n get scale() {\n return this.#scale\n }\n\n #currentViewbox(): Extent {\n return getViewbox(this.#svgDiagram!)\n }\n\n #setViewbox(viewbox: Extent) {\n editGuides.viewboxUpdated(viewbox)\n this.#svgDiagram!.setAttribute('viewBox', viewbox.map((n) => String(n)).join(' '))\n }\n\n enable(svgDiagram: SVGSVGElement) {\n // Scale large diagrams down to fit container\n let viewbox = getViewbox(svgDiagram)\n if (viewbox[2] * this.#containerSize.y >= viewbox[3] * this.#containerSize.x) {\n // Too wide, so scale width\n this.#scale = this.#containerSize.x / viewbox[2]\n viewbox[1] -= (this.#containerSize.y / this.#scale - viewbox[3]) / 2\n viewbox[3] = this.#containerSize.y / this.#scale\n } else {\n // Too high, so scale height\n this.#scale = this.#containerSize.y / viewbox[3]\n viewbox[0] -= (this.#containerSize.x / this.#scale - viewbox[2]) / 2\n viewbox[2] = this.#containerSize.x / this.#scale\n }\n if (this.#minScale > this.#scale) {\n this.#minScale = this.#scale\n }\n\n // Otherwise centre small diagrams that don't require scaling down\n if (this.#scale >= 1) {\n this.#scale = 1\n viewbox = getViewbox(svgDiagram)\n const delta = this.#containerSize.subtract({ x: viewbox[2], y: viewbox[3] })\n viewbox[0] -= delta.x / 2\n viewbox[1] -= delta.y / 2\n viewbox[2] = this.#containerSize.x\n viewbox[3] = this.#containerSize.y\n }\n\n this.#svgDiagram = svgDiagram\n this.#setViewbox(viewbox)\n this.#panning = false\n }\n\n disable() {\n this.#svgDiagram = null\n this.#panning = false\n this.#scale = 1.0\n }\n\n pointerDown(event: PointerEvent) {\n this.#panning = true\n this.#pointerDownPosition = Point.fromPoint(event)\n }\n\n pointerMove(event: PointerEvent): boolean {\n if (this.#svgDiagram && this.#panning) {\n const delta = this.#pointerDownPosition.subtract(event).scalarScale(1.0 / this.#scale)\n if (!delta.isZero()) {\n const viewbox = this.#currentViewbox()\n viewbox[0] += delta.x\n viewbox[1] += delta.y\n this.#setViewbox(viewbox)\n this.#pointerDownPosition = Point.fromPoint(event)\n return true\n }\n }\n return false\n }\n\n pointerUp(_event: PointerEvent) {\n this.#panning = false\n }\n\n #resizeObservation(entries: ResizeObserverEntry[]) {\n if (this.#svgDiagram) {\n for (const entry of entries) {\n if (entry.target.id === this.#containerId) {\n const containerSize = new Point(entry.contentRect.width, entry.contentRect.height)\n const viewbox = this.#currentViewbox()\n const delta = containerSize.subtract(this.#containerSize)\n if (Math.abs(delta.x * viewbox[3]) >= Math.abs(delta.y * viewbox[2])) {\n this.#scale = containerSize.x / viewbox[2]\n viewbox[1] -= (this.#containerSize.y / this.#scale - viewbox[3]) / 2\n viewbox[3] = containerSize.y / this.#scale\n } else {\n this.#scale = containerSize.y / viewbox[3]\n viewbox[0] -= (this.#containerSize.x / this.#scale - viewbox[2]) / 2\n viewbox[2] = containerSize.x / this.#scale\n }\n this.#containerSize = containerSize\n this.#setViewbox(viewbox)\n }\n }\n }\n }\n\n #wheelEvent(event: WheelEvent) {\n if (this.#svgDiagram) {\n // Normalise in case shift modifier is used on macOS\n const delta = event.deltaY === 0 && event.deltaX ? event.deltaX : event.deltaY\n const wheel = delta < 0 ? 1 : -1\n const toScale = this.#scale * Math.exp((wheel * this.#step) / 3)\n this.#scale = Math.min(Math.max(toScale, this.#minScale), this.#maxScale)\n const viewSize = this.#containerSize.scalarScale(1.0 / this.#scale)\n const viewbox = this.#currentViewbox()\n viewbox[0] +=\n ((viewbox[2] - viewSize.x) * (event.clientX - this.#containerOrigin.x)) / this.#containerSize.x\n viewbox[1] +=\n ((viewbox[3] - viewSize.y) * (event.clientY - this.#containerOrigin.y)) / this.#containerSize.y\n viewbox[2] = viewSize.x\n viewbox[3] = viewSize.y\n this.#setViewbox(viewbox)\n }\n }\n}\n\n//==============================================================================\n","/******************************************************************************\n\nCellDL Editor\n\nCopyright (c) 2022 - 2025 David Brooks\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n******************************************************************************/\n\nimport { editGuides } from '@editor/editor/editguides'\nimport type { GridAlignOptions } from '@editor/editor/editguides'\nimport type { Transform } from '@editor/geometry/transforms'\nimport { round } from '@editor/utils'\n\nimport { Point, type PointLike, PointMath } from '@renderer/common/points'\n\n//==============================================================================\n\nexport type PointMoveOptions = GridAlignOptions & {\n noOffset?: boolean\n}\n\n//==============================================================================\n\n/**\n * [left, top, width, height]\n */\nexport type Extent = [number, number, number, number]\n\n//==============================================================================\n\nexport class Bounds {\n #left: number\n #right: number\n #top: number\n #bottom: number\n\n constructor(left: number, top: number, right: number, bottom: number) {\n // Ensure bounds are in ``normal`` order\n ;[this.#left, this.#right] = left <= right ? [left, right] : [right, left]\n ;[this.#top, this.#bottom] = top <= bottom ? [top, bottom] : [bottom, top]\n }\n\n get left() {\n return this.#left\n }\n\n get right() {\n return this.#right\n }\n\n get top() {\n return this.#top\n }\n\n get bottom() {\n return this.#bottom\n }\n\n static fromPoints(pt0: PointLike, pt1: PointLike): Bounds {\n return new Bounds(pt0.x, pt0.y, pt1.x, pt1.y)\n }\n\n static fromSvg(svgElement: SVGGraphicsElement, globalTransform: Transform | null = null): Bounds {\n const bbox = svgElement.getBBox()\n let topLeft = new Point(bbox.x, bbox.y)\n let bottomRight = new Point(bbox.x + bbox.width, bbox.y + bbox.height)\n if (globalTransform) {\n topLeft = globalTransform.transformPoint(topLeft)\n bottomRight = globalTransform.transformPoint(bottomRight)\n }\n const bounds = new Bounds(topLeft.x, topLeft.y, bottomRight.x, bottomRight.y)\n return bounds\n }\n\n get height(): number {\n return this.#bottom - this.#top\n }\n\n get topLeft(): Point {\n return new Point(this.#left, this.#top)\n }\n\n get width(): number {\n return this.#right - this.#left\n }\n\n asArray(): [number, number, number, number] {\n return [this.#left, this.#top, this.#right, this.#bottom]\n }\n\n asPoints(): [Point, Point] {\n return [new Point(this.#left, this.#top), new Point(this.#right, this.#bottom)]\n }\n\n equal(bounds: Bounds, epsilon = 0.0001): boolean {\n // Assume bounds are normalised\n return (\n Math.abs(this.#left - bounds.#left) < epsilon &&\n Math.abs(this.#top - bounds.#top) < epsilon &&\n Math.abs(this.#right - bounds.#right) < epsilon &&\n Math.abs(this.#bottom - bounds.#bottom) < epsilon\n )\n }\n\n expand(margin: number): Bounds {\n return new Bounds(this.#left - margin, this.#top - margin, this.#right + margin, this.#bottom + margin)\n }\n\n inContainer(container: Bounds): boolean {\n return (\n this.#left >= container.#left &&\n this.#top <= container.#top &&\n this.#top >= container.#top &&\n this.#bottom <= container.#bottom\n )\n }\n}\n\n//==============================================================================\n\ninterface NumericRange {\n minimum: number\n maximum: number\n}\n\n//==============================================================================\n\nclass IdGenerator {\n static #instance: IdGenerator | null = null\n #nextId: number = 0\n\n private constructor() {\n if (IdGenerator.#instance) {\n throw new Error('Use `IdGenerator.instance` instead of `new`')\n }\n IdGenerator.#instance = this\n }\n\n static get instance() {\n return IdGenerator.#instance ?? (IdGenerator.#instance = new IdGenerator())\n }\n\n get nextId() {\n return (this.#nextId += 1)\n }\n}\n\nconst idGenerator = IdGenerator.instance\n\nfunction nextId(prefix: string = ''): string {\n return `${prefix}:${idGenerator.nextId}`\n}\n\n//==============================================================================\n\nexport class RestrictedValue implements NumericRange {\n #dirty: boolean = false\n #value: number = 0\n #minimum: number | RestrictedValue = -Infinity\n #maximum: number | RestrictedValue = Infinity\n readonly id: string\n\n constructor(\n value: number = 0,\n rangeStart: number | RestrictedValue = -Infinity,\n rangeEnd: number | RestrictedValue = Infinity\n ) {\n this.#value = value\n if (this.#getValue(rangeStart) <= this.#getValue(rangeEnd)) {\n this.#minimum = rangeStart\n this.#maximum = rangeEnd\n } else {\n this.#minimum = rangeEnd\n this.#maximum = rangeStart\n }\n this.id = nextId('V')\n }\n\n clean() {\n this.#dirty = false\n }\n get dirty() {\n return this.#dirty\n }\n\n get fixed() {\n return this.minimum === this.maximum\n }\n\n get minimum() {\n return this.#getValue(this.#minimum)\n }\n\n get maximum() {\n return this.#getValue(this.#maximum)\n }\n\n get value() {\n return this.#value\n }\n set value(value: number) {\n if (this.#value != value) {\n if (value < this.minimum) {\n value = this.minimum\n } else if (value > this.maximum) {\n value = this.maximum\n }\n if (this.#value != value) {\n this.#value = value\n this.#dirty = true\n }\n }\n }\n\n #getValue(value: number | RestrictedValue): number {\n return typeof value === 'number' ? value : value.value\n }\n\n copy(): RestrictedValue {\n return new RestrictedValue(this.#value, this.#minimum, this.#maximum)\n }\n\n adjustValue(delta: number) {\n this.#minimum = this.minimum + delta\n this.#maximum = this.maximum + delta\n this.#value += delta\n }\n\n narrowRange(minimum: number | RestrictedValue, maximum: number | RestrictedValue) {\n let minValue = minimum\n let maxValue = maximum\n if (this.#getValue(minValue) > this.#getValue(maxValue)) {\n minValue = maximum\n maxValue = minimum\n }\n if (this.#getValue(minValue) > this.minimum) {\n this.#minimum = minValue\n }\n if (this.#getValue(maxValue) < this.maximum) {\n this.#maximum = maxValue\n }\n }\n\n reassignMaximum(maximum: number | RestrictedValue) {\n this.#maximum = maximum\n }\n\n reassignMinimum(minimum: number | RestrictedValue) {\n this.#minimum = minimum\n }\n\n reassignValue(value: number) {\n this.#value = value\n }\n\n toString() {\n //========\n return `${this.id}: [${round(this.minimum)}, ${round(this.#value)}, ${round(this.maximum)}]`\n }\n}\n\n//==============================================================================\n\nexport class FixedValue extends RestrictedValue {\n constructor(value: number) {\n super(value, value, value)\n }\n\n get fixed() {\n return true\n }\n\n copy(): FixedValue {\n return new FixedValue(this.value)\n }\n\n narrowRange(_minimum: number, _maximum: number) {}\n\n reassignValue(value: number) {\n super.reassignValue(value)\n super.reassignMinimum(value)\n super.reassignMaximum(value)\n }\n}\n\n//==============================================================================\n\nexport class ComputedValue extends RestrictedValue {\n #value: () => number\n\n constructor(\n value: () => number,\n minimum: number | RestrictedValue = -Infinity,\n maximum: number | RestrictedValue = Infinity\n ) {\n super(value(), minimum, maximum)\n this.#value = value\n }\n\n get dirty() {\n return true // Always recompute\n }\n\n get value() {\n super.value = this.#value()\n return super.value\n }\n set value(_: number) {}\n}\n\n//==============================================================================\n\nexport class RestrictedPoint {\n #moveOffset: Point = new Point()\n #xValue: RestrictedValue\n #yValue: RestrictedValue\n\n constructor(xValue: RestrictedValue, yValue: RestrictedValue) {\n this.#xValue = xValue\n this.#yValue = yValue\n }\n\n static fromPoint(point: PointLike): RestrictedPoint {\n return new RestrictedPoint(new RestrictedValue(point.x), new RestrictedValue(point.y))\n }\n\n get dirty() {\n return this.#xValue.dirty || this.#yValue.dirty\n }\n\n get fixed() {\n return this.#xValue.fixed && this.#yValue.fixed\n }\n\n get point(): Point {\n return new Point(this.#xValue.value, this.#yValue.value)\n }\n set point(point: PointLike) {\n this.#xValue.value = point.x\n this.#yValue.value = point.y\n }\n\n get x() {\n return this.#xValue.value\n }\n get y() {\n return this.#yValue.value\n }\n\n get xValue() {\n return this.#xValue\n }\n set xValue(value: RestrictedValue) {\n this.#xValue = value\n }\n\n get yValue() {\n return this.#yValue\n }\n set yValue(value: RestrictedValue) {\n this.#yValue = value\n }\n\n clean() {\n this.#xValue.clean()\n this.#yValue.clean()\n }\n\n adjustValue(delta: PointLike) {\n this.xValue.adjustValue(delta.x)\n this.yValue.adjustValue(delta.y)\n }\n\n copy(): RestrictedPoint {\n return new RestrictedPoint(this.#xValue, this.#yValue)\n }\n\n move(point: PointLike, options: PointMoveOptions = {}) {\n const newPoint = options.noOffset ? point : this.offsetPoint(point)\n this.point = editGuides.gridAlign(newPoint, options)\n }\n\n offsetPoint(point: PointLike): Point {\n return this.#moveOffset!.add(point)\n }\n\n reassignValue(point: PointLike) {\n this.xValue.reassignValue(point.x)\n this.yValue.reassignValue(point.y)\n }\n\n startMove(point: PointLike) {\n // we need to know offset of pointer from centre (or topleft) of object\n this.#moveOffset = Point.fromPoint(PointMath.subtract(this.point, point))\n }\n\n toString(): string {\n return `RP: (${round(this.x)}, ${round(this.y)})`\n }\n}\n\n//==============================================================================\n\nexport class FixedPoint extends RestrictedPoint {\n constructor(xValue: FixedValue, yValue: FixedValue) {\n super(xValue, yValue)\n }\n}\n\n//==============================================================================\n","/******************************************************************************\n\nCellDL Editor\n\nCopyright (c) 2022 - 2025 David Brooks\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n******************************************************************************/\n\nimport type { CellDLConnection, CellDLObject } from '@editor/celldlObjects/index'\nimport type { EditorFrame } from '@editor/editor/editorframe'\nimport { editGuides } from '@editor/editor/editguides'\nimport type { BoundedElement } from '@editor/SVGElements/boundedelement'\n\nimport { svgCircle, svgRect } from '@renderer/common/svgUtils'\n\nimport { Point, type PointLike, PointMath } from '@renderer/common/points'\nimport type { StringProperties } from '@renderer/common/types'\n\n//==============================================================================\n\nimport { FixedPoint, FixedValue, RestrictedPoint, RestrictedValue } from './index.ts'\n\n//==============================================================================\n\nconst CONTROL_POINT_RADIUS = 4\n\ntype GRIPPER_STYLES = 'gripper-h' | 'gripper-v'\n\nconst GRIPPER_OFFSETS = {\n 'gripper-h': { x: (3 * CONTROL_POINT_RADIUS) / 2, y: CONTROL_POINT_RADIUS / 4 },\n 'gripper-v': { x: CONTROL_POINT_RADIUS / 4, y: (3 * CONTROL_POINT_RADIUS) / 2 }\n}\n\n//==============================================================================\n\nexport class ControlPoint extends RestrictedPoint {\n #celldlObject: CellDLObject | null = null\n #clickHandler: (e: MouseEvent) => void\n #style: string = ''\n #svgElement: SVGGraphicsElement | null = null\n\n constructor(\n xValue: RestrictedValue,\n yValue: RestrictedValue,\n celldlObject: CellDLObject | null = null\n ) {\n super(xValue, yValue)\n this.#celldlObject = celldlObject\n this.#clickHandler = this.#pointerClickEvent.bind(this)\n }\n\n get celldlObject() {\n return this.#celldlObject\n }\n\n get fixed() {\n return this.xValue.fixed && this.yValue.fixed\n }\n\n get isConduit() {\n return this.celldlObject !== null && this.celldlObject.isConduit\n }\n\n static fromPoint(point: PointLike): ControlPoint {\n return new ControlPoint(new RestrictedValue(point.x), new RestrictedValue(point.y))\n }\n\n static fromValue(x: number, y: number): ControlPoint {\n return new ControlPoint(new RestrictedValue(x), new RestrictedValue(y))\n }\n\n colinear(p1: ControlPoint, p2: ControlPoint): boolean {\n return PointMath.colinear(this, p1, p2)\n }\n\n copy(): ControlPoint {\n return new ControlPoint(this.xValue, this.yValue, this.celldlObject)\n }\n\n createSvgElement(editorFrame: EditorFrame, style: string = '', connection: CellDLConnection|null=null): SVGGraphicsElement {\n this.#celldlObject = connection\n let svg = ''\n if (style in GRIPPER_OFFSETS) {\n const offsets = GRIPPER_OFFSETS[style as GRIPPER_STYLES]\n svg = svgRect(this.point.subtract(offsets), this.point.add(offsets))\n } else if (style === 'fixed') {\n svg = svgCircle(this.point, CONTROL_POINT_RADIUS, { class: 'fixed' })\n } else {\n svg = svgCircle(this.point, CONTROL_POINT_RADIUS)\n }\n if (this.#svgElement) {\n this.#svgElement.remove()\n }\n this.#style = style\n this.#svgElement = editorFrame.addElementAsString(svg) as SVGGraphicsElement\n this.#svgElement.classList.add('control-point', 'active')\n this.#svgElement.addEventListener('click', this.#clickHandler)\n return this.#svgElement\n }\n\n #pointerClickEvent(event: MouseEvent) {\n if (this.#celldlObject) {\n event.stopPropagation()\n document.dispatchEvent(\n new CustomEvent('select-object', {\n detail: {\n event: event,\n clickedObject: this.#celldlObject\n }\n })\n )\n }\n }\n\n removeSvgElement() {\n if (this.#svgElement) {\n this.#svgElement.removeEventListener('click', this.#clickHandler)\n this.#svgElement.remove()\n this.#svgElement = null\n }\n }\n\n reassignPosition(position: PointLike) {\n this.xValue.reassignValue(position.x)\n this.yValue.reassignValue(position.y)\n }\n\n redraw() {\n if (this.dirty && this.#svgElement) {\n const point = this.point\n if (this.#style in GRIPPER_OFFSETS) {\n const offsets = GRIPPER_OFFSETS[this.#style as GRIPPER_STYLES]\n this.#svgElement.setAttribute('x', `${point.x - offsets.x}`)\n this.#svgElement.setAttribute('y', `${point.y - offsets.y}`)\n } else {\n this.#svgElement.setAttribute('cx', `${point.x}`)\n this.#svgElement.setAttribute('cy', `${point.y}`)\n }\n return true\n }\n return false\n }\n\n toString(): string {\n return `CP${this.celldlObject ? ` ${this.celldlObject.id}` : ''}: (${this.xValue.toString()}, ${this.yValue.toString()})`\n }\n}\n\n//==============================================================================\n\nexport class FixedControlPoint extends ControlPoint {\n constructor(\n xValue: FixedValue,\n yValue: FixedValue,\n readonly celldlObject: CellDLObject | null = null\n ) {\n super(xValue, yValue, celldlObject)\n }\n\n copy(): FixedControlPoint {\n return new FixedControlPoint(this.xValue, this.yValue, this.celldlObject)\n }\n\n toString(): string {\n return `FP${this.celldlObject ? ` ${this.celldlObject.id}` : ''}: (${this.xValue.toString()}, ${this.yValue.toString()})`\n }\n}\n\n//==============================================================================\n\nexport class ControlRect {\n #gridAligned: boolean = true\n #topLeft!: RestrictedPoint\n #bottomRight!: RestrictedPoint\n #size!: Point\n #centroid!: RestrictedPoint\n #centroidOffset!: Point\n #moveOffset: Point = new Point()\n #svgElement: SVGRectElement | null = null\n\n constructor(corner_0: RestrictedPoint, corner_1: RestrictedPoint, centroidOffset: Point | null = null) {\n this.setCornerPositions(corner_0, corner_1)\n this.setCentroidOffset(centroidOffset || new Point(0.5, 0.5))\n }\n\n set gridAligned(align: boolean) {\n this.#gridAligned = align\n }\n\n get centroid() {\n return this.#centroid\n }\n\n get dirty() {\n return this.#topLeft.dirty || this.#bottomRight.dirty\n }\n\n get fixed() {\n return this.#topLeft.fixed && this.#bottomRight.fixed\n }\n\n get svgElement() {\n return this.#svgElement\n }\n\n get topLeftPoint() {\n return this.#topLeft.point\n }\n\n clean() {\n this.#topLeft.clean()\n this.#bottomRight.clean()\n }\n\n copy(): ControlRect {\n return new ControlRect(this.#topLeft, this.#bottomRight, this.#centroidOffset)\n }\n\n setCornerPositions(corner_0: RestrictedPoint, corner_1: RestrictedPoint) {\n let x0 = corner_0.xValue,\n y0 = corner_0.yValue\n let x1 = corner_1.xValue,\n y1 = corner_1.yValue\n if (x0.value > x1.value) {\n x0 = corner_1.xValue\n x1 = corner_0.xValue\n }\n if (y0.value > y1.value) {\n y0 = corner_1.yValue\n y1 = corner_0.yValue\n }\n this.#topLeft = new RestrictedPoint(x0, y0)\n this.#bottomRight = new RestrictedPoint(x1, y1)\n this.#size = PointMath.subtract(this.#bottomRight.point, this.#topLeft.point)\n }\n\n setCentroidOffset(centroidOffset: Point) {\n this.#centroidOffset = centroidOffset\n this.#centroid = RestrictedPoint.fromPoint(this.#size.scale(this.#centroidOffset).add(this.#topLeft.point))\n }\n\n startMove(point: PointLike) {\n // we need to know offset of pointer from centre of object\n this.#moveOffset = Point.fromPoint(PointMath.subtract(this.#centroid, point))\n }\n\n move(point: PointLike) {\n const position = this.#moveOffset!.add(point)\n this.reposition(this.#gridAligned ? editGuides.gridAlign(position) : position)\n }\n\n /**\n * Reposition the rectangle.\n *\n * @param centroid - The new position of the rectangle's centroid.\n */\n reposition(centroid: PointLike) {\n this.#centroid.point = centroid // this will check limits\n this.#topLeft.point = this.#centroid.point.subtract(this.#size.scale(this.#centroidOffset))\n this.#bottomRight.point = PointMath.add(this.#topLeft.point, this.#size)\n }\n\n svg(attributes: StringProperties = {}) {\n return svgRect(this.#topLeft.point, this.#bottomRight.point, attributes)\n }\n}\n\n//==============================================================================\n\nexport class FixedControlRect extends ControlRect {\n constructor(bounds: [number, number, number, number]) {\n super(\n new FixedPoint(new FixedValue(bounds[0]), new FixedValue(bounds[1])),\n new FixedPoint(new FixedValue(bounds[2]), new FixedValue(bounds[3]))\n )\n }\n}\n\n//==============================================================================\n\n/*\nclass ControlLine\n{\n #start: ControlPoint\n #end: ControlPoint\n\n constructor(start: ControlPoint, end: ControlPoint)\n {\n this.#start = start\n this.#end = end\n }\n\n get start()\n {\n return this.#start\n }\n\n get end()\n {\n return this.#end\n }\n}\n\nclass HorizontalLine extends ControlLine\n{\n constructor(start: ControlPoint, end: ControlPoint)\n {\n if (start.y.value !== end.y.value) {\n throw new Error(\"Line segment isn't horizontal\")\n }\n super(start, end)\n }\n}\n\nclass VerticalLine extends ControlLine\n{\n constructor(start: ControlPoint, end: ControlPoint)\n {\n if (start.x.value !== end.x.value) {\n throw new Error(\"Line segment isn't vertical\")\n }\n super(start, end)\n }\n}\n\n*/\n\n// a sequence of horiz/vert lines\n// a sequence of restricted points\n\n//==============================================================================\n\n/*\n *\n * (0, 0)--------........p1..........\n * p0 |\n * |\n * |\n * |\n * |\n * |\n * |\n * .....(1, 1)........--------(2, 1)\n * p2 p3\n *\n\nconst x0 = new FixedValue(0.0)\nconst y0 = new FixedValue(0.0)\n\nconst x1 = new RestrictedValue(1.0, 0.8, 1.3)\nconst y1 = new FixedValue(1.0)\n\nconst x2 = new FixedValue(2.0)\n\nconst p0 = new FixedPoint(x0, y0)\nconst p1 = new RestrictedPoint(x1, y0) // (x1, p0.y)\nconst p2 = new RestrictedPoint(x1, y1) // (p1.x, y1)\nconst p3 = new FixedPoint(x2, y1)\n\nconst l0 = new HorizontalLine(p0, p1)\nconst l1 = new VerticalLine(p1, p2)\nconst l2 = new HorizontalLine(p2, p3)\n\n */\n","/******************************************************************************\n\nCellDL Editor\n\nCopyright (c) 2022 - 2025 David Brooks\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n******************************************************************************/\n\nimport type { CellDLConnectedObject, CellDLObject } from '@editor/celldlObjects'\nimport { svgRect } from '@renderer/common/svgUtils'\nimport { Point } from '@renderer/common/points'\nimport { Bounds, ComputedValue, RestrictedValue } from '@editor/geometry'\nimport { ControlPoint } from '@editor/geometry/controls'\n\nimport { type CellDLEditor, CONTEXT_MENU, getElementId } from '.'\nimport { editGuides } from './editguides'\nimport { type EditorFrame, EDITOR_FRAME_ID } from './editorframe'\n\n//==============================================================================\n\nconst SELECTION_BOX_ID = 'editor-selection-box'\n\n//==============================================================================\n\nexport class SelectionBox {\n #bottomRight: ControlPoint\n #controlPoints: ControlPoint[] = []\n #drawing: boolean = false\n #editor: CellDLEditor\n #editorFrame: EditorFrame\n #movePoint: ControlPoint | null = null\n #panStart: Point | null = null\n #panTopLeft: Point | null = null\n #selectedObjects: Map<string, CellDLObject> = new Map()\n #selectionRect: SVGRectElement | null = null\n #size: Point\n #startPoint: Point\n #topLeft: ControlPoint\n #xMin: RestrictedValue | null = null\n #xMax: RestrictedValue | null = null\n #yMin: RestrictedValue | null = null\n #yMax: RestrictedValue | null = null\n\n constructor(editor: CellDLEditor, startPoint: DOMPoint) {\n this.#editor = editor\n this.#editorFrame = editor.editorFrame!\n this.#startPoint = Point.fromPoint(editGuides.gridAlign(startPoint))\n this.#topLeft = ControlPoint.fromPoint(this.#startPoint)\n this.#bottomRight = ControlPoint.fromPoint(this.#startPoint)\n this.#size = new Point(0, 0)\n this.#drawing = true\n }\n\n get bounds(): Bounds {\n return Bounds.fromPoints(this.#topLeft, this.#bottomRight)\n }\n\n get count() {\n return [...this.#selectedObjects.keys()].length\n }\n\n get selectedObjects() {\n return [...this.#selectedObjects.values()]\n }\n\n #drawTo(domPoint: DOMPoint) {\n const point = editGuides.gridAlign(domPoint)\n this.#topLeft = ControlPoint.fromPoint({\n x: Math.min(this.#startPoint.x, point.x),\n y: Math.min(this.#startPoint.y, point.y)\n })\n this.#bottomRight = ControlPoint.fromPoint({\n x: Math.max(this.#startPoint.x, point.x),\n y: Math.max(this.#startPoint.y, point.y)\n })\n this.#updateSelectionRect()\n }\n\n #updateSelectionRect(resized = true) {\n if (resized) {\n this.#size = new Point(this.#bottomRight.x - this.#topLeft.x, this.#bottomRight.y - this.#topLeft.y)\n }\n if (this.#selectionRect) {\n this.#selectionRect.setAttribute('x', `${this.#topLeft.x}`)\n this.#selectionRect.setAttribute('y', `${this.#topLeft.y}`)\n if (resized) {\n this.#selectionRect.setAttribute('width', `${this.#size.x}`)\n this.#selectionRect.setAttribute('height', `${this.#size.y}`)\n }\n } else {\n this.#selectionRect = <SVGRectElement>(\n this.#editorFrame.addElementAsString(\n svgRect(this.#topLeft, this.#bottomRight, { class: 'selection-rect' })\n )\n )\n this.#selectionRect.id = SELECTION_BOX_ID\n }\n this.#setSelectedObjects()\n }\n\n pointInside(point: DOMPoint): boolean {\n return (\n this.#topLeft.x < point.x &&\n point.x < this.#bottomRight.x &&\n this.#topLeft.y < point.y &&\n point.y < this.#bottomRight.y\n )\n }\n\n makeCompartment() {\n if (this.count) {\n this.#editor.celldlDiagram!.createCompartment(Bounds.fromPoints(this.#topLeft, this.#bottomRight), [\n ...this.#selectedObjects.values()\n ])\n }\n }\n\n pointerEvent(event, point: DOMPoint): boolean {\n if (this.#drawing) {\n if (event.type === 'pointermove') {\n this.#drawTo(point)\n } else if (event.type === 'pointerup') {\n this.#drawing = false\n // Allow new SelectionBox to be moved and resized\n this.drawControlHandles()\n }\n return true\n } else if (this.#movePoint || this.#panStart) {\n if (event.type === 'pointermove') {\n if (this.#movePoint !== null) {\n this.#movePoint.point = editGuides.gridAlign(point)\n } else if (this.#panStart !== null) {\n const delta = this.#panStart.subtract(point)\n this.#topLeft.point = editGuides.gridAlign(this.#panTopLeft!.subtract(delta))\n this.#bottomRight.point = this.#topLeft.point.add(this.#size)\n }\n this.#updateSelectionRect(this.#movePoint !== null)\n this.#redrawControlHandles()\n } else if (event.type === 'pointerup') {\n this.#movePoint = null\n this.#panStart = null\n }\n return true\n } else {\n const element = event.target as SVGGraphicsElement\n const currentId = getElementId(element)\n if (currentId === SELECTION_BOX_ID && element.parentElement?.id === EDITOR_FRAME_ID) {\n const currentIndex = element.dataset.controlIndex ? +element.dataset.controlIndex : -1\n if (event.type === 'pointerdown') {\n if (currentIndex >= 0) {\n const controlPoint = this.#controlPoints[currentIndex]\n this.#movePoint = controlPoint\n this.#panStart = null\n } else {\n this.#movePoint = null\n this.#panStart = Point.fromPoint(point)\n this.#panTopLeft = Point.fromPoint(this.#topLeft.point)\n }\n }\n return true\n }\n }\n return false\n }\n\n close() {\n this.#updateContextMenu(false)\n if (this.#selectionRect) {\n this.#unsetSelectedObjects()\n this.clearControlHandles()\n this.#editorFrame.removeElement(this.#selectionRect)\n this.#selectionRect = null\n }\n }\n\n clearControlHandles() {\n for (const controlPoint of this.#controlPoints) {\n controlPoint.removeSvgElement()\n }\n this.#controlPoints = []\n }\n\n drawControlHandles() {\n if (!this.#selectionRect) {\n return\n }\n this.#xMin = new RestrictedValue(this.#topLeft.x)\n this.#xMax = new RestrictedValue(this.#bottomRight.x)\n this.#xMin.reassignMaximum(this.#xMax)\n this.#xMax.reassignMinimum(this.#xMin)\n const xMid = new ComputedValue((() => (this.#xMin!.value + this.#xMax!.value) / 2).bind(this))\n\n this.#yMin = new RestrictedValue(this.#topLeft.y)\n this.#yMax = new RestrictedValue(this.#bottomRight.y)\n this.#yMin.reassignMaximum(this.#yMax)\n this.#yMax.reassignMinimum(this.#yMin)\n const yMid = new ComputedValue((() => (this.#yMin!.value + this.#yMax!.value) / 2).bind(this))\n\n this.#controlPoints = [\n new ControlPoint(this.#xMin, this.#yMin),\n new ControlPoint(xMid, this.#yMin),\n new ControlPoint(this.#xMax, this.#yMin),\n new ControlPoint(this.#xMax, yMid),\n new ControlPoint(this.#xMax, this.#yMax),\n new ControlPoint(xMid, this.#yMax),\n new ControlPoint(this.#xMin, this.#yMax),\n new ControlPoint(this.#xMin, yMid)\n ]\n this.#topLeft = this.#controlPoints[0]\n this.#bottomRight = this.#controlPoints[4]\n let index = 0\n const styles = ['', 'gripper-h', '', 'gripper-v', '', 'gripper-h', '', 'gripper-v']\n const cursors = ['move', 'ns-resize', 'move', 'ew-resize', 'move', 'ns-resize', 'move', 'ew-resize']\n for (const controlPoint of this.#controlPoints) {\n const svgElement = controlPoint.createSvgElement(this.#editorFrame, styles[index])\n svgElement.style.setProperty('cursor', cursors[index])\n svgElement.dataset.parentId = this.#selectionRect.id\n svgElement.dataset.controlIndex = `${index}`\n index += 1\n }\n this.#movePoint = null\n this.#selectionRect.style.setProperty('cursor', 'grab')\n this.#updateContextMenu(this.count > 0)\n }\n\n #redrawControlHandles() {\n for (const controlPoint of this.#controlPoints) {\n controlPoint.redraw()\n }\n this.#updateContextMenu(this.count > 0)\n }\n\n #setSelectedObjects() {\n const selectedItems = this.#editor\n .celldlDiagram!.objectsContainedIn(this.bounds)\n .filter((c) => c.exact)\n .map((c) => c.object)\n const fullSelection = [...selectedItems]\n for (const component of selectedItems) {\n if (component.isConnectable) {\n fullSelection.push(...(<CellDLConnectedObject>component).connections.values())\n }\n }\n const selectedObjects: Map<string, CellDLObject> = new Map()\n for (const object of fullSelection) {\n if (!selectedObjects.has(object.id)) {\n if (!this.#selectedObjects.has(object.id)) {\n object.select(true)\n }\n selectedObjects.set(object.id, object)\n }\n }\n for (const [id, object] of this.#selectedObjects.entries()) {\n if (!selectedObjects.has(id)) {\n object.select(false)\n }\n }\n this.#selectedObjects = selectedObjects\n }\n\n #unsetSelectedObjects() {\n for (const object of this.#selectedObjects.values()) {\n object.select(false)\n }\n }\n\n #updateContextMenu(enabled: boolean) {\n this.#editor.enableContextMenuItem(CONTEXT_MENU.DELETE, enabled)\n this.#editor.enableContextMenuItem(CONTEXT_MENU.GROUP_OBJECTS, enabled)\n }\n\n updateSelectedObjects() {\n this.#setSelectedObjects()\n }\n}\n\n//==============================================================================\n","/******************************************************************************\n\nCellDL Editor\n\nCopyright (c) 2022 - 2025 David Brooks\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n******************************************************************************/\n\nimport type { CellDLDiagram } from '@editor/diagram/index'\nimport type { CellDLObject } from '@editor/celldlObjects/index'\nimport { Point, type PointLike } from '@renderer/common/points'\nimport type { Statement } from '@renderer/metadata/index'\n\nimport { notifyChanges } from './index'\n\n//==============================================================================\n\nenum Action {\n DELETE = 1,\n INSERT = 2,\n MOVE = 3\n}\n\n//==============================================================================\n\nenum MovePosition {\n LAST = 1,\n CURRENT = 2\n}\n\n//==============================================================================\n\nclass MoveDetails {\n controlIndex: number = 0\n currentPosition: Point | null = null\n lastPosition: Point | null = null\n}\n\n//==============================================================================\n\nexport type UndoMovePosition = [number, Point | null] | null\n\n//==============================================================================\n\nclass ObjectDetails {\n #svgElement: SVGGraphicsElement | null = null\n #object: CellDLObject\n #parentId: string = ''\n #priorSiblingId: string = ''\n\n constructor(object: CellDLObject) {\n this.#object = object\n this.#svgElement = object.svgElement\n if (this.#svgElement) {\n this.#parentId = this.#svgElement.parentElement?.id || ''\n this.#priorSiblingId = this.#svgElement.previousElementSibling?.id || ''\n }\n }\n\n get object() {\n return this.#object\n }\n\n insertSvg(svgDiagram: SVGSVGElement) {\n if (this.#svgElement) {\n const parent = this.#parentId ? svgDiagram.getElementById(this.#parentId) : null\n const priorSibling = this.#priorSiblingId ? svgDiagram.getElementById(this.#priorSiblingId) : null\n if (priorSibling) {\n priorSibling.insertAdjacentElement('afterend', this.#svgElement)\n } else if (parent) {\n parent.prepend(this.#svgElement)\n }\n }\n }\n}\n\n//==============================================================================\n\nexport class EditorUndoAction {\n #knowledge: Statement[] = []\n #moveDetails: MoveDetails = new MoveDetails()\n #objectDetails: ObjectDetails[] = []\n\n constructor(\n readonly action: Action,\n readonly position: Point | null = null\n ) {}\n\n get knowledge(): Statement[] {\n return this.#knowledge\n }\n\n get objectDetails() {\n return this.#objectDetails\n }\n\n addKnowledge(statements: Statement[]) {\n this.#knowledge.push(...statements)\n }\n\n addObjectDetails(object: CellDLObject) {\n this.#objectDetails.push(new ObjectDetails(object))\n }\n\n moveDetails(position: MovePosition): UndoMovePosition {\n if (this.#moveDetails) {\n return position === MovePosition.LAST\n ? [this.#moveDetails.controlIndex, this.#moveDetails.lastPosition]\n : [this.#moveDetails.controlIndex, this.#moveDetails.currentPosition]\n }\n return null\n }\n\n startMove(controlIndex: number, position: PointLike) {\n this.#moveDetails.controlIndex = controlIndex\n this.#moveDetails.lastPosition = Point.fromPoint(position)\n }\n\n endMove(controlIndex: number, position: PointLike) {\n if (controlIndex === this.#moveDetails.controlIndex) {\n this.#moveDetails.currentPosition = Point.fromPoint(position)\n } else {\n console.warn('Move has ended on a different control point...')\n }\n notifyChanges()\n }\n}\n\n//==============================================================================\n\nclass UndoRedo {\n static #instance: UndoRedo | null = null\n\n #redoStack: EditorUndoAction[] = []\n #undoStack: EditorUndoAction[] = []\n\n private constructor() {\n if (UndoRedo.#instance) {\n throw new Error('Use UndoRedo.instance instead of `new`')\n }\n UndoRedo.#instance = this\n }\n\n static get instance() {\n if (!UndoRedo.#instance) {\n UndoRedo.#instance = new UndoRedo()\n }\n return UndoRedo.#instance\n }\n\n clean() {\n this.#redoStack = []\n this.#undoStack = []\n window.electronAPI?.sendEditorAction('CLEAN')\n }\n\n #clearRedoStack() {\n if (this.#redoStack.length) {\n this.#redoStack = []\n window.electronAPI?.sendEditorAction('REDONE')\n }\n }\n\n #popRedoStack(): EditorUndoAction | null {\n if (this.#redoStack.length) {\n const editorAction = this.#redoStack.pop()!\n if (this.#redoStack.length === 0) {\n window.electronAPI?.sendEditorAction('REDONE')\n }\n return editorAction\n }\n return null\n }\n\n #pushRedoStack(redoAction: EditorUndoAction) {\n this.#redoStack.push(redoAction)\n if (this.#redoStack.length === 1) {\n window.electronAPI?.sendEditorAction('REDO')\n }\n }\n\n #popUndoStack(): EditorUndoAction | null {\n if (this.#undoStack.length) {\n const editorAction = this.#undoStack.pop()!\n if (this.#undoStack.length === 0) {\n window.electronAPI?.sendEditorAction('CLEAN')\n }\n return editorAction\n }\n return null\n }\n\n #pushUndoStack(undoAction: EditorUndoAction, reDoing: boolean): EditorUndoAction {\n this.#undoStack.push(undoAction)\n if (!reDoing) {\n this.#clearRedoStack() // Can no longer redo once there are new items\n }\n return undoAction\n }\n\n #newUndoAction(action: Action, position: Point | null = null): EditorUndoAction {\n return this.#pushUndoStack(new EditorUndoAction(action, position), false)\n }\n\n redo(diagram: CellDLDiagram) {\n const editorAction = this.#popRedoStack()\n if (editorAction) {\n this.#pushUndoStack(editorAction, true)\n if (editorAction.action === Action.DELETE) {\n diagram.insertDeletedObject(editorAction)\n } else if (editorAction.action === Action.INSERT) {\n diagram.deleteInsertedObject(editorAction)\n } else if (editorAction.action === Action.MOVE) {\n editorAction.objectDetails[0]?.object.undoControlMove(editorAction.moveDetails(MovePosition.CURRENT))\n }\n }\n }\n\n undo(diagram: CellDLDiagram) {\n const editorAction = this.#popUndoStack()\n if (editorAction) {\n this.#pushRedoStack(editorAction)\n if (editorAction.action === Action.DELETE) {\n diagram.deleteInsertedObject(editorAction)\n } else if (editorAction.action === Action.INSERT) {\n diagram.insertDeletedObject(editorAction)\n } else if (editorAction.action === Action.MOVE) {\n editorAction.objectDetails[0]?.object.undoControlMove(editorAction.moveDetails(MovePosition.LAST))\n }\n }\n }\n\n undoDeleteAction(): EditorUndoAction {\n return this.#newUndoAction(Action.INSERT)\n }\n\n undoInsertAction(): EditorUndoAction {\n return this.#newUndoAction(Action.DELETE)\n }\n\n undoMoveAction(): EditorUndoAction {\n return this.#newUndoAction(Action.MOVE)\n }\n}\n\n//==============================================================================\n\nexport const undoRedo = UndoRedo.instance\n\n//==============================================================================\n","/******************************************************************************\n\nCellDL Editor\n\nCopyright (c) 2022 - 2025 David Brooks\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n******************************************************************************/\n/** biome-ignore-all lint/style/noNonNullAssertion: <explanation> */\n\nimport * as vue from 'vue'\nimport { useTippy } from \"vue-tippy\"\n\nimport '@renderer/assets/svgContent.css'\n\nimport type { CellDLObject } from '@editor/celldlObjects/index'\nimport { PathMaker, type PathNode } from '@editor/connections/pathmaker'\nimport type { TemplateEventDetails } from '@editor/components/index'\nimport { ObjectPropertiesPanel } from '@editor/components/properties'\nimport type { CellDLDiagram } from '@editor/diagram/index'\nimport { componentLibraryPlugin } from '@renderer/plugins/index'\nimport { round } from '@editor/utils'\n\nimport { type PointLike, PointMath } from '@renderer/common/points'\nimport type { StringProperties } from '@renderer/common/types'\n\n//==============================================================================\n\nimport { EditorFrame } from '@editor/editor/editorframe'\nimport { editGuides, EDITOR_GRID_CLASS } from '@editor/editor/editguides'\nimport PanZoom from '@editor/editor/panzoom'\nimport { SelectionBox } from '@editor/editor/selectionbox'\nimport { undoRedo } from '@editor/editor/undoredo'\n\n//==============================================================================\n\n/**** WIP\nconst SVG_CLOSE_DISTANCE = 2 // Pointer is close to object in SVG coords\n // c.f. stroke-width (for connections)??\nWIP ****/\n\n//==============================================================================\n\nconst MAX_POINTER_CLICK_TIME = 200 // milliseconds\n\n//==============================================================================\n\n// Lookup tables for tracking tool bar state\n\nexport enum EDITOR_TOOL_IDS {\n SelectTool = 'select-tool',\n DrawConnectionTool = 'draw-connection-tool',\n AddComponentTool = 'add-component-tool'\n}\n\nexport const DEFAULT_EDITOR_TOOL_ID = EDITOR_TOOL_IDS.SelectTool\n\nenum EDITOR_STATE {\n Selecting = 'SELECTING',\n DrawPath = 'DRAW-PATH',\n AddComponent = 'ADD-COMPONENT'\n}\n\nconst TOOL_TO_STATE: Map<EDITOR_TOOL_IDS, EDITOR_STATE> = new Map([\n [EDITOR_TOOL_IDS.SelectTool, EDITOR_STATE.Selecting],\n [EDITOR_TOOL_IDS.DrawConnectionTool, EDITOR_STATE.DrawPath],\n [EDITOR_TOOL_IDS.AddComponentTool, EDITOR_STATE.AddComponent]\n])\n\nconst DEFAULT_EDITOR_STATE = TOOL_TO_STATE.get(DEFAULT_EDITOR_TOOL_ID)!\n\n//==============================================================================\n\nexport enum PANEL_IDS {\n PropertyPanel = 'property-panel'\n}\n\n//==============================================================================\n\nexport enum CONTEXT_MENU {\n DELETE = 'menu-delete',\n EDIT_GROUP = 'menu-edit-group',\n INFO = 'menu-info',\n GROUP_OBJECTS = 'menu-group',\n UNGROUP_OBJECTS = 'menu-ungroup'\n}\n//==============================================================================\n\nexport function notifyChanges() {\n document.dispatchEvent(new CustomEvent('file-edited'))\n}\n\n//==============================================================================\n\nexport function getElementId(element: SVGGraphicsElement): string {\n return element.dataset.parentId\n ? element.dataset.parentId\n : element.classList.contains('parent-id')\n ? element.parentElement?.id || ''\n : element.id\n}\n\n//==============================================================================\n\nconst SVG_PANEL_ID = 'svg-panel'\n\nexport class CellDLEditor {\n static instance: CellDLEditor | null = null\n\n #container: HTMLElement | null = null\n #statusMsg: HTMLElement | null = null\n #statusPos: HTMLElement | null = null\n #statusStyle: string = ''\n\n #celldlDiagram: CellDLDiagram | null = null\n #svgDiagram: SVGSVGElement | null = null\n #editorFrame: EditorFrame | null = null\n\n #panning: boolean = false\n #panzoom: PanZoom | null = null\n #pointerMoved: boolean = false\n #pointerPosition: DOMPoint | null = null\n #moving: boolean = false\n #moved: boolean = false\n\n #editorState: EDITOR_STATE = DEFAULT_EDITOR_STATE\n #activeObject: CellDLObject | null = null\n #dirty: boolean = false\n\n #dragging: boolean = false\n #haveFocus: boolean = true\n\n #pathMaker: PathMaker | null = null\n #nextPathNode: PathNode | null = null\n\n// #contextMenu: ContextMenu\n\n #currentTemplateDetails: TemplateEventDetails | null = null\n #drawConnectionSettings: StringProperties = {}\n\n #selectedObject: CellDLObject | null = null\n #selectionBox: SelectionBox | null = null\n #newSelectionBox: boolean = false\n\n #pointerDownTime: number = 0\n\n #openPanelId: PANEL_IDS | null = null\n #propertiesPanel: ObjectPropertiesPanel = new ObjectPropertiesPanel()\n\n #tooltip: vue.Ref|undefined\n #tooltipElement: HTMLElement|undefined\n #tooltipStyle: string = ''\n\n constructor() {\n CellDLEditor.instance = this\n\n /**\n this.#contextMenu = this.getElementById('context-menu') as ContextMenu\n this.status = 'new editor'\n**/\n // Add a handler for events from toolbar buttons\n document.addEventListener('toolbar-event', this.#toolBarEvent.bind(this))\n document.addEventListener('component-selected', this.#componentTemplateSelectedEvent.bind(this))\n document.addEventListener('component-drag', this.#componentTemplateDragEvent.bind(this))\n\n // Add handler for events from panels\n document.addEventListener('panel-event', this.#panelEvent.bind(this))\n document.addEventListener('style-event', this.#styleEvent.bind(this))\n\n // Handle click events on control points\n document.addEventListener('select-object', this.#objectClickEvent.bind(this))\n }\n\n mount(svgContainer: HTMLElement) {\n this.#container = svgContainer\n this.#statusMsg = document.getElementById('status-msg')\n this.#statusPos = document.getElementById('status-pos')\n\n // Create a panzoom handler\n this.#panzoom = new PanZoom(this.#container)\n\n // Set up event handlers\n this.#container.addEventListener('click', this.#pointerClickEvent.bind(this))\n this.#container.addEventListener('dblclick', this.#pointerDoubleClickEvent.bind(this))\n\n this.#container.addEventListener('pointerover', this.#pointerOverEvent.bind(this))\n this.#container.addEventListener('pointerout', this.#pointerOutEvent.bind(this))\n\n this.#container.addEventListener('pointerdown', this.#pointerDownEvent.bind(this))\n this.#container.addEventListener('pointermove', this.#pointerMoveEvent.bind(this))\n this.#container.addEventListener('pointerup', this.#pointerUpEvent.bind(this))\n\n // Editor content focus handlers\n document.addEventListener('focusin', this.#focusEvent.bind(this))\n document.addEventListener('focusout', this.#focusEvent.bind(this))\n\n // Keyboard handlers\n window.addEventListener('keydown', this.#keyDownEvent.bind(this))\n window.addEventListener('keyup', this.#keyUpEvent.bind(this))\n\n // Add handlers for dropping components on the canvas\n this.#container.addEventListener('dragover', this.#appDragOverEvent.bind(this))\n this.#container.addEventListener('drop', this.#appDropEvent.bind(this))\n\n // Create a tooltip\n\n const { tippy } = useTippy(this.#container, {\n content: '',\n animation: 'none',\n duration: [0, 0],\n showOnCreate: false,\n hideOnClick: false,\n trigger: 'manual',\n arrow: true,\n followCursor: true\n })\n if (tippy.value) {\n this.#tooltip = tippy\n this.#tooltipElement = this.#tooltip.value.popper\n }\n/**\n\n // Handle context menu events\n this.#container.addEventListener('contextmenu', (event) => {\n const element = event.target as SVGGraphicsElement\n const clickedObject = this.#celldlDiagram!.objectById(getElementId(element))\n if (clickedObject && clickedObject === this.#activeObject) {\n this.#setSelectedObject(clickedObject)\n }\n this.#contextMenu.open(event.clientX, event.clientY)\n })\n\n this.#contextMenu.setListener((event: Event) => {\n const targetId = 'target' in event && event.target && 'id' in event.target ? event.target.id : null\n if (targetId === CONTEXT_MENU.DELETE) {\n this.#deleteSelectedObjects()\n } else if (targetId === CONTEXT_MENU.INFO) {\n this.#showSelectedObjectInfo()\n } else if (targetId === CONTEXT_MENU.GROUP_OBJECTS) {\n if (this.#selectionBox) {\n this.#selectionBox.makeCompartment()\n this.#closeSelectionBox()\n }\n }\n this.#contextMenu.close()\n })\n**/\n }\n\n get celldlDiagram() {\n return this.#celldlDiagram\n }\n\n get dirty() {\n return this.#dirty\n }\n\n get editorFrame() {\n return this.#editorFrame\n }\n\n get status(): string {\n return this.#statusMsg ? this.#statusMsg.innerText : ''\n }\n set status(text: string) {\n this.showMessage(text)\n }\n\n get windowSize(): [number, number] {\n if (this.#container) {\n return [this.#container.clientWidth, this.#container.clientHeight]\n }\n return [0, 0]\n }\n\n setDirty() {\n if (!this.#dirty) {\n this.#dirty = true\n }\n }\n\n markClean() {\n if (this.#dirty) {\n this.#dirty = false\n }\n }\n\n async editDiagram(celldlDiagram: CellDLDiagram) {\n if (this.#celldlDiagram !== null) {\n this.closeDiagram()\n }\n this.#celldlDiagram = celldlDiagram\n this.#svgDiagram = celldlDiagram.svgDiagram\n\n // Make sure we have a group in which to put selection related objects\n // This MUST remain as the last group in the diagram when new layer groups are added...\n this.#editorFrame = new EditorFrame(this.#svgDiagram!)\n\n // Note the selection group's element so that it's not saved\n celldlDiagram.addEditorElement(this.#editorFrame.svgGroup!)\n\n // Initialise alignment guides and grid\n editGuides.newDiagram(celldlDiagram, true)\n\n // Show the diagram in the editor's window\n if (this.#container) {\n this.#container.appendChild(this.#svgDiagram!)\n }\n\n // Allow for the diagram to render\n await vue.nextTick()\n\n // Rewriting metadata during diagram finishSetup might dirty\n this.markClean()\n undoRedo.clean()\n\n // Finish setting up the diagram as we now have SVG elements\n celldlDiagram.finishSetup()\n\n // Enable pan/zoom and toolBars\n this.#panzoom!.enable(this.#svgDiagram!)\n\n // Set initial state\n this.#editorState = EDITOR_STATE.Selecting\n this.#activeObject = null\n this.#pointerMoved = false\n this.#selectedObject = null\n this.#propertiesPanel.clearObjectProperties()\n }\n\n closeDiagram() {\n if (this.#celldlDiagram !== null) {\n this.#editorFrame!.clear()\n this.#editorFrame = null\n // this.#toolBar.enable(false)\n this.#panzoom!.disable()\n if (this.#container) {\n this.#container.removeChild(this.#svgDiagram as Node)\n }\n this.#svgDiagram = null\n this.#celldlDiagram = null\n }\n }\n\n resetObjectStates() {\n this.#unsetSelectedObject()\n this.#unsetActiveObject()\n }\n\n #setDefaultCursor() {\n if (this.#editorState === EDITOR_STATE.DrawPath) {\n this.#svgDiagram?.style.setProperty('cursor', 'crosshair')\n } else {\n this.#svgDiagram?.style.removeProperty('cursor')\n }\n if (this.#container) {\n this.#container.style.setProperty('cursor', 'default')\n }\n }\n\n enableContextMenuItem(_itemId: string, _enable: boolean = true) {\n// this.#contextMenu.enableItem(itemId, enable)\n }\n\n #toolBarEvent(event: Event) {\n const detail = (<CustomEvent>event).detail\n\n if (detail.type === 'state') {\n if (Object.values(PANEL_IDS).includes(detail.source)) {\n this.#openPanelId = detail.value ? detail.source : null\n } else if (detail.value && TOOL_TO_STATE.has(detail.source as EDITOR_TOOL_IDS)) {\n this.#editorState = TOOL_TO_STATE.get(detail.source as EDITOR_TOOL_IDS)!\n this.#setDefaultCursor()\n if (this.#editorState !== EDITOR_STATE.Selecting) {\n this.#unsetSelectedObject()\n this.#closeSelectionBox()\n }\n if (this.#editorState !== EDITOR_STATE.DrawPath) {\n // Remove any partial path from editor frame...\n if (this.#pathMaker) {\n this.#pathMaker.close()\n this.#pathMaker = null\n }\n }\n }\n } else if (detail.type === 'value') {\n if (detail.source === EDITOR_TOOL_IDS.DrawConnectionTool) {\n this.#drawConnectionSettings = {\n style: detail.value\n }\n }\n }\n }\n\n async #panelEvent(event: Event) {\n const detail = (<CustomEvent>event).detail\n if (detail.source === this.#openPanelId) {\n if (this.#selectedObject && this.#openPanelId === PANEL_IDS.PropertyPanel) {\n const values = detail.value\n if (values.oldValue !== values.newValue) {\n await this.#propertiesPanel.updateObjectProperties(this.#selectedObject, detail.itemId, detail.value,\n this.#celldlDiagram!.rdfStore)\n notifyChanges()\n }\n }\n }\n }\n\n async #styleEvent(event: Event) {\n const detail = (<CustomEvent>event).detail\n if (detail.source === this.#openPanelId) {\n if (this.#openPanelId === PANEL_IDS.PropertyPanel) {\n await this.#propertiesPanel.updateObjectStyling(this.#selectedObject, detail.object, detail.styling)\n notifyChanges()\n }\n }\n }\n\n showMessage(msg: string, style: string = '') {\n if (this.#statusMsg) {\n this.#statusMsg.innerText = msg\n if (this.#statusStyle !== '') {\n this.#statusMsg.classList.remove(this.#statusStyle)\n }\n if (style !== '') {\n this.#statusMsg.classList.add(style)\n this.#statusStyle = style\n }\n }\n }\n\n #showStatus(pos: PointLike|null) {\n if (pos === null) {\n this.status = ''\n if (this.#statusPos) {\n const text = this.#statusPos.innerText\n if (!text.startsWith('(')) {\n if (text.includes('(')) {\n const parts = text.split('(')\n this.#statusPos.innerText = `(${parts.slice(1).join('(')}`\n } else {\n this.#statusPos.innerText = ''\n }\n }\n }\n } else {\n const position = `(${round(pos.x, 1)}, ${round(pos.y, 1)})`\n if (this.#activeObject) {\n this.status = this.#activeObject.name ?? ''\n if (this.#statusPos) {\n this.#statusPos.innerText = `${this.#activeObject.id} ${position}`\n }\n } else {\n this.status = ''\n if (this.#statusPos) {\n this.#statusPos.innerText = position\n }\n }\n }\n }\n\n #hideTooltip() {\n if (this.#tooltip) {\n this.#tooltip.value.hide()\n }\n }\n\n showTooltip(msg: string, style: string = '') {\n if (msg === '') {\n this.#hideTooltip()\n } else if (this.#tooltip) {\n this.#tooltip.value.setContent(msg)\n this.#tooltip.value.show()\n if (this.#tooltipElement) {\n if (this.#tooltipStyle !== '') {\n this.#tooltipElement.classList.remove(this.#tooltipStyle)\n this.#tooltipStyle = ''\n }\n if (style !== '') {\n const tooltipStyle = `tooltip-${style}`\n this.#tooltipElement.classList.add(tooltipStyle)\n this.#tooltipStyle = tooltipStyle\n }\n }\n }\n }\n\n #domToSvgCoords(domCoords: PointLike): DOMPoint {\n return this.#celldlDiagram!.domToSvgCoords(domCoords)\n }\n\n #highlightAssociatedObjects(object: CellDLObject, highlight: boolean) {\n for (const obj of this.#celldlDiagram!.associatedObjects(object)) {\n obj.highlight(highlight)\n }\n }\n\n #activateObject(object: CellDLObject, active: boolean) {\n object.activate(active)\n if (object.isConnection) {\n this.#highlightAssociatedObjects(object, active)\n }\n }\n\n #setActiveObject(activeObject: CellDLObject | null) {\n if (activeObject && this.#activeObject !== activeObject) {\n activeObject.drawControlHandles()\n this.#activateObject(activeObject, true)\n this.#activeObject = activeObject\n }\n }\n\n #unsetActiveObject() {\n if (this.#activeObject) {\n this.#activeObject.clearControlHandles()\n this.#activateObject(this.#activeObject, false)\n this.#activeObject = null\n }\n }\n\n #setSelectedObject(selectedObject: CellDLObject) {\n this.#unsetSelectedObject() // This will depend upon multi-selection\n if (selectedObject !== null) {\n selectedObject.select(true)\n selectedObject.drawControlHandles()\n this.#selectedObject = selectedObject\n this.#propertiesPanel.setObjectProperties(selectedObject, this.#celldlDiagram!.rdfStore)\n this.enableContextMenuItem(CONTEXT_MENU.DELETE, true)\n this.enableContextMenuItem(CONTEXT_MENU.INFO, true)\n }\n }\n\n #unsetSelectedObject() {\n if (this.#selectedObject) {\n this.#selectedObject.select(false)\n this.#selectedObject.clearControlHandles()\n this.#selectedObject = null\n this.#propertiesPanel.setObjectProperties(null, this.#celldlDiagram!.rdfStore)\n this.enableContextMenuItem(CONTEXT_MENU.DELETE, false)\n this.enableContextMenuItem(CONTEXT_MENU.INFO, false)\n }\n }\n\n #componentTemplateDragEvent(_event: Event) {\n this.#dragging = true\n }\n\n #appDragOverEvent(event: DragEvent) {\n if (this.#dragging && event.dataTransfer) {\n event.preventDefault() // Needed to allow drop\n event.dataTransfer.dropEffect = 'copy'\n }\n }\n\n #componentTemplateSelectedEvent(event: CustomEvent) {\n this.#currentTemplateDetails = event.detail\n }\n\n #addComponentTemplate(eventPosition: PointLike, details: TemplateEventDetails, dragged=false) {\n // Adjust position by offset at component selection\n const zoomScale = this.#panzoom?.scale || 1\n let topLeft = PointMath.subtract(eventPosition, PointMath.scalarScale(details.centre, zoomScale))\n if (dragged) {\n topLeft = topLeft.subtract(PointMath.scalarScale(details.offset, zoomScale))\n }\n const template = componentLibraryPlugin.getObjectTemplateById(details.id)\n if (!template) {\n console.error(`Drop of unknown component template '${details.id}'`)\n return\n }\n const componentGroup = this.#editorFrame!.addSvgElement(template, this.#domToSvgCoords(topLeft))\n const celldlObject = this.#celldlDiagram!.addConnectedObject(componentGroup, template)\n if (celldlObject) {\n this.#setActiveObject(celldlObject)\n this.#setSelectedObject(celldlObject)\n this.#showStatus(eventPosition)\n }\n }\n\n #appDropEvent(event: DragEvent) {\n this.#dragging = false\n event.preventDefault();\n if (event.dataTransfer) {\n const itemList = event.dataTransfer!.items\n for (let index = 0; index < itemList.length; ++index) {\n const item = itemList[index]\n if (item.kind === \"string\" && item.type.match(\"^text/plain\")) {\n item.getAsString((s: string) => {\n this.#addComponentTemplate(event, JSON.parse(s), true)\n })\n }\n }\n }\n }\n\n #objectClickEvent(event: Event) {\n const detail = (<CustomEvent>event).detail\n const clickedObject: CellDLObject = detail.clickedObject\n this.#selectionClickEvent(detail.event, clickedObject.svgElement!, clickedObject)\n }\n\n #pointerClickEvent(event: MouseEvent) {\n const element = event.target as SVGGraphicsElement\n if (\n this.#celldlDiagram === null ||\n !this.#svgDiagram?.contains(element) ||\n // clickTolerance = 1px ? to set pointerMoved?\n (this.#pointerMoved && Date.now() - this.#pointerDownTime > MAX_POINTER_CLICK_TIME)\n ) {\n return\n }\n const clickedObject = this.#celldlDiagram.objectById(getElementId(element))\n if (this.#editorState === EDITOR_STATE.AddComponent && clickedObject === null) {\n if (this.#currentTemplateDetails) {\n this.#addComponentTemplate(event, this.#currentTemplateDetails)\n }\n return\n }\n this.#selectionClickEvent(event, element, clickedObject)\n }\n\n #selectionClickEvent(event: MouseEvent, _element: SVGGraphicsElement, clickedObject: CellDLObject|null) {\n let deselected = false\n if (this.#selectedObject !== null) {\n // Deselect\n deselected = clickedObject === this.#selectedObject\n this.#unsetSelectedObject()\n }\n if (this.#editorState === EDITOR_STATE.DrawPath) {\n if (this.#pathMaker) {\n if (this.#activeObject === null) {\n const svgPoint = this.#domToSvgCoords(event)\n this.#pathMaker.addPoint(svgPoint, event.shiftKey)\n }\n }\n } else {\n if (!deselected && clickedObject && clickedObject === this.#activeObject) {\n // Select when active object is clicked\n this.#setSelectedObject(clickedObject)\n }\n }\n }\n\n #pointerDoubleClickEvent(event: MouseEvent) {\n if (this.#editorState === EDITOR_STATE.DrawPath) {\n if (this.#pathMaker) {\n if (this.#activeObject === null) {\n this.#pathMaker.finishPartialPath(this.#celldlDiagram!, event.shiftKey)\n this.#pathMaker = null\n }\n } else {\n this.#nextPathNode = PathMaker.startPartialPath(this.#domToSvgCoords(event), this.#celldlDiagram!)\n if (this.#nextPathNode != null) {\n const settings = this.#drawConnectionSettings // settings.type is to come from object's domain...\n this.#pathMaker = new PathMaker(this.#editorFrame!, this.#nextPathNode, settings.style)\n }\n }\n }\n }\n\n #notDiagramElement(element: SVGGraphicsElement) {\n return (\n element === this.#svgDiagram ||\n element.id === SVG_PANEL_ID ||\n element.classList.contains(EDITOR_GRID_CLASS) ||\n !this.#svgDiagram?.contains(element)\n )\n }\n\n #pointerOverEvent(event: PointerEvent) {\n if (this.#celldlDiagram === null) {\n return\n }\n const element = event.target as SVGGraphicsElement\n const currentObject = this.#celldlDiagram.objectById(getElementId(element))\n\n if (this.#moving) {\n // A move finishes with pointer up\n return\n } else if (this.#notDiagramElement(element)) {\n this.#hideTooltip()\n if (this.#activeObject && currentObject !== this.#activeObject) {\n this.#unsetActiveObject()\n }\n return\n } else if (this.#selectionBox?.pointerEvent(event, this.#domToSvgCoords(event))) {\n return\n }\n\n if (this.#editorState === EDITOR_STATE.DrawPath) {\n if (\n this.#activeObject &&\n currentObject !== this.#activeObject &&\n (currentObject !== null || (this.#pathMaker && element !== this.#pathMaker.currentSvgPath))\n ) {\n this.#unsetActiveObject()\n }\n if (currentObject) {\n element.style.removeProperty('cursor')\n // Set object active regardless of whether it's valid for the path\n this.#setActiveObject(currentObject)\n if (this.#pathMaker === null) {\n this.#nextPathNode = PathMaker.validStartObject(currentObject)\n } else {\n this.#nextPathNode = this.#pathMaker.validPathNode(currentObject)\n }\n }\n } else {\n if (this.#activeObject && currentObject !== this.#activeObject) {\n this.#unsetActiveObject()\n }\n if (currentObject) {\n this.#setActiveObject(currentObject)\n currentObject.initialiseMove(element)\n }\n }\n }\n\n #pointerOutEvent(event: PointerEvent) {\n const element = event.target as SVGGraphicsElement\n if (\n element === this.#svgDiagram ||\n element.classList.contains(EDITOR_GRID_CLASS) ||\n !this.#svgDiagram?.contains(element)\n ) {\n if (this.#activeObject && !this.#moving) {\n this.#activeObject.finaliseMove()\n this.#unsetActiveObject()\n }\n } else if (this.#editorState === EDITOR_STATE.DrawPath) {\n if (this.#pathMaker === null) {\n this.#unsetActiveObject()\n }\n }\n }\n\n #pointerDownEvent(event: PointerEvent) {\n this.#pointerMoved = false\n this.#pointerDownTime = Date.now()\n const element = event.target as SVGGraphicsElement\n if (event.button === 2 || (!event.shiftKey && this.#notDiagramElement(element))) {\n this.#svgDiagram?.style.removeProperty('cursor')\n this.#container?.style.setProperty('cursor', 'grab')\n this.#panzoom!.pointerDown(event)\n this.#panning = true\n return\n }\n const svgPoint = this.#domToSvgCoords(event)\n if (this.#editorState === EDITOR_STATE.DrawPath) {\n if (this.#activeObject && this.#nextPathNode) {\n if (this.#pathMaker === null) {\n const settings = this.#drawConnectionSettings // settings.type is to come from object's domain...\n this.#pathMaker = new PathMaker(this.#editorFrame!, this.#nextPathNode, settings.style)\n } else if (!this.#pathMaker.empty) {\n if (this.#activeObject.isConduit) {\n this.#pathMaker.addIntermediate(this.#nextPathNode, event.shiftKey)\n } else {\n this.#pathMaker.finishPath(this.#nextPathNode, this.#celldlDiagram!, event.shiftKey)\n this.#pathMaker = null\n }\n }\n }\n } else if (this.#activeObject?.moveable) {\n // EDITOR_STATE.Selecting or EDITOR_STATE.AddComponent\n this.#activeObject.startMove(svgPoint)\n this.#moving = true\n this.#moved = false\n } else if (this.#editorState === EDITOR_STATE.Selecting) {\n if (this.#selectionBox) {\n this.#selectionBox.pointerEvent(event, svgPoint)\n } else if (event.shiftKey) {\n this.#unsetSelectedObject()\n this.#selectionBox = new SelectionBox(this, svgPoint)\n this.#newSelectionBox = true\n }\n }\n }\n\n #pointerMoveEvent(event: PointerEvent) {\n if (this.#panning) {\n this.#pointerMoved = this.#panzoom!.pointerMove(event) || this.#pointerMoved\n return\n }\n this.#pointerMoved = true\n this.#pointerPosition = new DOMPoint(event.x, event.y)\n const svgPoint = this.#domToSvgCoords(event)\n this.#showStatus(svgPoint)\n if (this.#editorState === EDITOR_STATE.DrawPath) {\n if (this.#pathMaker) {\n this.#pathMaker.drawTo(svgPoint, event.shiftKey)\n }\n } else if (this.#activeObject && this.#moving) {\n // EDITOR_STATE.Selecting or EDITOR_STATE.AddComponent\n this.#moved = true\n this.#activeObject!.move(svgPoint)\n this.#celldlDiagram!.objectMoved(this.#activeObject!)\n if (this.#selectionBox) {\n this.#selectionBox.updateSelectedObjects()\n }\n } else if (this.#editorState === EDITOR_STATE.Selecting) {\n if (this.#selectionBox) {\n this.#selectionBox.pointerEvent(event, svgPoint)\n }\n }\n }\n\n #pointerUpEvent(event: PointerEvent) {\n if (this.#celldlDiagram === null) {\n return\n }\n const domPoint = this.#domToSvgCoords(event)\n if (this.#panning) {\n this.#panzoom!.pointerUp(event)\n this.#panning = false\n this.#setDefaultCursor()\n if (\n !this.#pointerMoved &&\n !this.#newSelectionBox &&\n// !this.#contextMenu.isOpen &&\n this.#selectionBox &&\n !this.#selectionBox.pointInside(domPoint)\n ) {\n this.#closeSelectionBox()\n }\n return\n }\n const element = event.target as SVGGraphicsElement\n const currentObject = this.#celldlDiagram.objectById(getElementId(element))\n\n if (this.#editorState !== EDITOR_STATE.DrawPath) {\n if (this.#activeObject && this.#moving) {\n this.#moving = false\n if (this.#moved) {\n this.#activeObject!.endMove()\n if (currentObject !== this.#activeObject) {\n this.#activeObject!.finaliseMove()\n this.#unsetActiveObject()\n }\n }\n } else if (this.#editorState === EDITOR_STATE.Selecting) {\n if (this.#selectionBox && !this.#selectionBox.pointerEvent(event, domPoint)) {\n this.#closeSelectionBox()\n }\n this.#newSelectionBox = false\n }\n }\n }\n\n #closeSelectionBox() {\n if (this.#selectionBox) {\n this.#selectionBox.close()\n this.#selectionBox = null\n }\n }\n\n #deleteSelectedObjects() {\n if (this.#selectedObject) {\n // Delete the object\n this.#unsetActiveObject()\n this.#celldlDiagram!.removeObject(this.#selectedObject)\n this.#unsetSelectedObject()\n this.#showStatus(null)\n } else if (this.#selectionBox) {\n for (const object of this.#selectionBox.selectedObjects) {\n this.#celldlDiagram!.removeObject(object)\n }\n this.#selectionBox.close()\n this.#selectionBox = null\n }\n }\n\n #focusEvent(event: FocusEvent) {\n // Detect when no input fields have focus\n this.#haveFocus = event.type === 'focusout'\n }\n\n #keyDownEvent(event: KeyboardEvent) {\n if (this.#editorState === EDITOR_STATE.DrawPath\n && (event.key === 'Escape' || event.key === 'Backspace')) {\n if (this.#pathMaker) {\n // Remove any partial path\n this.#pathMaker.close()\n this.#pathMaker = null\n }\n } else if (event.key === 'Backspace') {\n if (this.#haveFocus) {\n this.#deleteSelectedObjects()\n } else if (event.target === document.body) {\n // Prevent the default browser action (navigating back)\n event.preventDefault()\n }\n }\n }\n\n #keyUpEvent(event: KeyboardEvent) {\n if (event.key === 'Shift') {\n this.#setDefaultCursor()\n }\n }\n\n #showSelectedObjectInfo() {\n if (this.#selectedObject) {\n //console.log('INFO:', this.#selectedObject.asString())\n }\n }\n}\n\n//==============================================================================\n//==============================================================================\n","/******************************************************************************\n\nCellDL Editor\n\nCopyright (c) 2022 - 2025 David Brooks\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n******************************************************************************/\n\nimport { CellDLEditor } from '@editor/editor'\n\n//==============================================================================\n\nexport namespace alert {\n export function clear() {\n if (CellDLEditor.instance) {\n CellDLEditor.instance.showMessage('')\n }\n }\n\n export function error(msg: string) {\n console.error(msg)\n if (CellDLEditor.instance) {\n CellDLEditor.instance.showMessage(msg, 'error')\n }\n }\n\n export function info(msg: string) {\n if (CellDLEditor.instance) {\n CellDLEditor.instance.showMessage(msg, 'info')\n }\n }\n\n export function tooltip(msg: string) {\n if (CellDLEditor.instance) {\n CellDLEditor.instance.showTooltip(msg, 'error')\n }\n }\n\n export function warn(msg: string) {\n console.warn(msg)\n if (CellDLEditor.instance) {\n CellDLEditor.instance.showMessage(msg, 'warn')\n }\n }\n\n export function elementError(msg: string, svgElement?: SVGGraphicsElement) {\n if (svgElement) {\n svgElement.classList.add('error')\n }\n error(msg)\n }\n}\n\n//==============================================================================\n//==============================================================================\n","/******************************************************************************\n\nCellDL Editor\n\nCopyright (c) 2022 - 2025 David Brooks\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n******************************************************************************/\n\nimport {\n applyToPoint,\n applyToPoints,\n compose,\n fromString,\n identity,\n inverse,\n type Matrix,\n toString as transformToString,\n translate\n} from 'transformation-matrix'\n\n//==============================================================================\n\nimport { Point, type PointLike } from '@renderer/common/points'\n\n//==============================================================================\n\nexport class NormalTransform {\n #inverse: Matrix\n #matrix: Matrix\n\n constructor(p0: PointLike, p1: PointLike) {\n const translate: Matrix = {\n a: 1,\n c: 0,\n e: -p0.x,\n b: 0,\n d: 1,\n f: -p0.y\n }\n const delta = Point.fromPoint(p1).subtract(p0)\n const l2 = delta.x * delta.x + delta.y * delta.y\n const scaleRotate: Matrix = {\n a: delta.x / l2,\n c: delta.y / l2,\n e: 0,\n b: -delta.y / l2,\n d: delta.x / l2,\n f: 0\n }\n this.#matrix = compose([scaleRotate, translate])\n this.#inverse = inverse(this.#matrix)\n }\n\n normalise(point: PointLike): Point {\n return Point.fromPoint(applyToPoint(this.#matrix, point))\n }\n\n invert(point: PointLike): Point {\n return Point.fromPoint(applyToPoint(this.#inverse, point))\n }\n}\n\n//==============================================================================\n\nexport class Transform {\n #matrix: Matrix\n\n constructor(matrix: Matrix) {\n this.#matrix = matrix\n }\n\n static fromString(matrix: string): Transform {\n if (matrix === '' || matrix === 'none') {\n return new Transform(identity())\n } else {\n return new Transform(fromString(matrix))\n }\n }\n\n static Identity(): Transform {\n return new Transform(identity())\n }\n\n get isIdentity(): boolean {\n return transformToString(this.#matrix) === transformToString(identity())\n }\n\n inverse(): Transform {\n return new Transform(inverse(this.#matrix))\n }\n\n leftMultiply(transform: Transform): Transform {\n return new Transform(compose([transform.#matrix, this.#matrix]))\n }\n\n toString(): string {\n return transformToString(this.#matrix)\n }\n\n transformPoint(point: PointLike): Point {\n return Point.fromPoint(applyToPoint(this.#matrix, point))\n }\n\n transformPoints(points: PointLike[]): Point[] {\n return applyToPoints(this.#matrix, points).map((pt) => Point.fromPoint(pt))\n }\n\n static Translate(tx: number, ty: number): Transform {\n return new Transform(translate(tx, ty))\n }\n}\n\n//==============================================================================\n","/******************************************************************************\n\nCellDL Editor\n\nCopyright (c) 2022 - 2025 David Brooks\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n******************************************************************************/\n\nimport * as vue from 'vue'\n\nimport { CONNECTION_SPLAY_PADDING, MAX_CONNECTION_SPLAY_PADDING } from '@renderer/common/styling'\nimport { CONNECTION_WIDTH, SELECTION_STROKE_WIDTH } from '@renderer/common/styling'\nimport { Point, type PointLike, PointMath } from '@renderer/common/points'\nimport { base64Svg, svgCircle } from '@renderer/common/svgUtils'\nimport type { UndoMovePosition } from '@editor/editor/undoredo'\n\nimport { CELLDL_STYLE_CLASS, type CellDLObject } from '@editor/celldlObjects/index'\nimport { Bounds, type RestrictedValue } from '@editor/geometry/index'\nimport { FixedControlRect } from '@editor/geometry/controls'\nimport { Transform } from '@editor/geometry/transforms'\n\n//==============================================================================\n\nconst CONDUIT_SELECTION_RADIUS = 9\n\n//==============================================================================\n\nexport function setInternalIds(svgElement: SVGGraphicsElement, previousId: string = '') {\n const id = svgElement.id\n const idElements = svgElement.querySelectorAll('[id]')\n for (let index = 0; index < idElements.length; ++index) {\n // biome-ignore lint/style/noNonNullAssertion: index is in range\n const element = idElements[index]!\n if (element.id) {\n if (previousId !== '' && element.id.startsWith(`${previousId}-`)) {\n element.id = `${id}${element.id.substring(previousId.length)}`\n } else {\n element.id = `${id}-${element.id}`\n }\n }\n }\n const useElements = svgElement.querySelectorAll('use')\n for (let index = 0; index < useElements.length; ++index) {\n // biome-ignore lint/style/noNonNullAssertion: index is in range\n const element = useElements[index]!\n const link = element.getAttribute('xlink:href')\n if (link?.startsWith('#')) {\n if (previousId !== '' && link.startsWith(`#${previousId}-`)) {\n element.setAttribute('xlink:href', `#${id}${link.substring(previousId.length + 1)}`)\n } else {\n element.setAttribute('xlink:href', `#${id}-${link.substring(1)}`)\n }\n }\n }\n}\n\n//==============================================================================\n\nexport class CellDLSVGElement {\n #bounds!: Bounds\n #centroid!: Point\n #centroidOffset: Point = new Point(0.5, 0.5)\n #cornerOffsets!: [Point, Point, Point, Point] // Wrt centroid, anticlockwise from bottom right\n #selected: boolean = false\n #selectionClasses: Set<string> = new Set()\n #selectionElement: SVGGraphicsElement\n #size: Point = new Point()\n #svgElement: SVGGraphicsElement\n #topLeft!: Point\n #globalTransform: Transform | null = null\n\n constructor(\n readonly celldlObject: CellDLObject,\n svgElement: SVGGraphicsElement | null\n ) {\n if (svgElement === null) {\n throw new Error(`CellDL object '${celldlObject.id}' isn't represented in SVG...`)\n }\n const svgDiagramElement = celldlObject.celldlDiagram?.svgDiagram\n // get all transformations that are being applied to the SVG element\n this.#globalTransform = Transform.Identity()\n let element = svgElement\n while (element !== svgDiagramElement) {\n const transform = getComputedStyle(element).transform\n if (transform !== 'none') {\n this.#globalTransform = this.#globalTransform.leftMultiply(Transform.fromString(transform))\n }\n element = element.parentNode as SVGGraphicsElement\n }\n if (this.#globalTransform.isIdentity) {\n this.#globalTransform = null\n }\n celldlObject.setCelldlSvgElement(this)\n this.#svgElement = svgElement\n this.#selectionElement = svgElement\n this.#updatedSvgElement()\n }\n\n get bounds(): Bounds {\n return this.#bounds\n }\n\n get centroid(): Point {\n return this.#centroid\n }\n\n get centroidOffset(): Point {\n return this.#centroidOffset\n }\n\n get corners(): [Point, Point] {\n return [this.#cornerOffsets[0], this.#cornerOffsets[2]]\n }\n\n get globalTransform() {\n return this.#globalTransform\n }\n\n get height(): number {\n return this.#size.y\n }\n\n get id(): string {\n return this.celldlObject.id\n }\n\n get moveable() {\n return false\n }\n\n get selected() {\n return this.#selected\n }\n\n get size() {\n return this.#size\n }\n\n get svgElement() {\n return this.#svgElement\n }\n\n get topLeft() {\n return this.#topLeft\n }\n\n get width(): number {\n return this.#size.x\n }\n\n setCentroid(centroid: Point) {\n this.#centroid = centroid\n }\n\n svgBounds(recalculate: boolean = false): Bounds {\n // Get bounds in global coordinates\n return recalculate || this.#bounds === undefined\n ? Bounds.fromSvg(this.#svgElement, this.#globalTransform)\n : this.#bounds\n }\n\n updateGlobalTransform(transform: Transform): Transform | null {\n if (this.#globalTransform) {\n this.#globalTransform = this.#globalTransform.leftMultiply(transform)\n if (this.#globalTransform.isIdentity) {\n this.#globalTransform = null\n }\n } else {\n this.#globalTransform = transform\n }\n return this.#globalTransform\n }\n\n #updateBounds() {\n const bounds = this.svgBounds(true)\n this.#size = new Point(bounds.right - bounds.left, bounds.bottom - bounds.top)\n if (this.#centroid) {\n this.#topLeft = this.#centroid.subtract(this.#size.scale(this.#centroidOffset))\n // Get bounds in local coordinates\n this.#bounds = new Bounds(\n this.#topLeft.x,\n this.#topLeft.y,\n this.#topLeft.x + this.#size.x,\n this.#topLeft.y + this.#size.y\n )\n } else {\n this.#topLeft = new Point(bounds.left, bounds.top)\n this.#bounds = bounds\n this.#centroid = this.#size.scale(this.#centroidOffset).add(this.#topLeft)\n }\n const topLeftOffset = this.#size.scale(this.#centroidOffset).scalarScale(-1)\n // Corner offsets are wrt centroid, anticlockwise from bottom right; see comment below in ``boundaryIntersections()``\n const connectionComponentGap: number = CONNECTION_WIDTH / 2 - SELECTION_STROKE_WIDTH / 2\n if (connectionComponentGap !== 0) {\n this.#cornerOffsets = [\n topLeftOffset.add(this.#size).add({ x: connectionComponentGap, y: connectionComponentGap }),\n topLeftOffset\n .add({ x: this.#size.x, y: 0 })\n .add({ x: connectionComponentGap, y: -connectionComponentGap }),\n topLeftOffset.add({ x: -connectionComponentGap, y: -connectionComponentGap }),\n topLeftOffset\n .add({ x: 0, y: this.#size.y })\n .add({ x: -connectionComponentGap, y: connectionComponentGap })\n ]\n } else {\n this.#cornerOffsets = [\n topLeftOffset.add(this.#size),\n topLeftOffset.add({ x: this.#size.x, y: 0 }),\n topLeftOffset,\n topLeftOffset.add({ x: 0, y: this.#size.y })\n ]\n }\n }\n\n #updatedSvgElement() {\n // Find the relative offset to the element's centroid\n this.#centroidOffset = new Point(0.5, 0.5)\n if (this.#svgElement.tagName === 'g') {\n const firstChild = this.#svgElement.children.item(0) as SVGGraphicsElement\n if (firstChild.dataset.centreX) {\n this.#centroidOffset = new Point(+firstChild.dataset.centreX, +firstChild.dataset.centreY!)\n }\n }\n // And set the elements bounds relative to its centroid\n this.#updateBounds()\n // Add a dummy rectangle to a group so that it can be activated and selected\n if (\n this.#svgElement.tagName === 'g' &&\n !this.#svgElement.classList.contains(CELLDL_STYLE_CLASS.Connection) &&\n this.#svgElement.firstElementChild !== null\n ) {\n const bounds = (\n this.#svgElement.classList.contains(CELLDL_STYLE_CLASS.Compartment)\n ? Bounds.fromSvg(this.#svgElement.firstChild as SVGGraphicsElement)\n : Bounds.fromSvg(this.#svgElement)\n ).expand(SELECTION_STROKE_WIDTH / 2)\n // Set height, width and offset of an <svg> child...\n if (this.#svgElement.firstElementChild.tagName === 'svg') {\n const svgChild = this.#svgElement.firstElementChild\n svgChild.setAttribute('x', `${bounds.topLeft.x}px`)\n svgChild.setAttribute('y', `${bounds.topLeft.y}px`)\n svgChild.setAttribute('width', `${bounds.width}px`)\n svgChild.setAttribute('height', `${bounds.height}px`)\n }\n const selectionRect = new FixedControlRect(bounds.asArray()) // versus control rect in RectangularObject\n const svg = selectionRect.svg({\n class: `selection-element parent-id editor-specific ${[...this.#selectionClasses.values()].join(' ')}`\n })\n this.#svgElement.insertAdjacentHTML('beforeend', svg)\n this.#selectionElement = this.#svgElement.lastChild as SVGGraphicsElement\n // Indicate a component is a conduit with a circular mark at its centre\n if (this.celldlObject.isConduit) {\n const centre = new Point(bounds.right - bounds.left, bounds.bottom - bounds.top)\n .scale(this.#centroidOffset)\n .add(new Point(bounds.left, bounds.top))\n const svg = svgCircle(centre, CONDUIT_SELECTION_RADIUS, {\n class: 'selection-element parent-id editor-specific conduit'\n })\n this.#svgElement.insertAdjacentHTML('beforeend', svg)\n }\n }\n }\n\n #selectionElementMembers(): SVGGraphicsElement[] {\n const members: SVGGraphicsElement[] = []\n if (this.#selectionElement.tagName === 'g'\n && this.#selectionElement.classList.contains(CELLDL_STYLE_CLASS.Connection)) {\n const children = this.#selectionElement.children\n for (let index = 0; index < children.length; ++index) {\n // biome-ignore lint/style/noNonNullAssertion: index is in range\n members.push(children[index]! as SVGGraphicsElement)\n }\n } else {\n members.push(this.#selectionElement)\n }\n return members\n }\n\n #setSelectionClass(cls: string, enable: boolean) {\n if (enable) {\n for (const element of this.#selectionElementMembers()) {\n element.classList.add(cls)\n }\n this.#selectionClasses.add(cls)\n } else {\n for (const element of this.#selectionElementMembers()) {\n element.classList.remove(cls)\n }\n this.#selectionClasses.delete(cls)\n }\n }\n\n activate(active = true) {\n this.#setSelectionClass('active', active)\n }\n\n /**\n * Check if an object can be moved.\n *\n * Called when the pointer is over an object.\n *\n * @param {SVGGraphicsElement} _svgElement The SVG element of the object the pointer is over\n * @return {boolean} `true` if the object can be moved, after changing the pointer's\n * cursor to an appropriate form.\n */\n isMoveable(_svgElement: SVGGraphicsElement): boolean {\n return false\n }\n\n startMove(_svgPoint: PointLike) {}\n\n move(_svgPoint: PointLike) {}\n\n endMove() {}\n\n xBounds(padding: number = 0): [number, number] {\n padding = this.xPadding(padding)\n return [\n this.centroid.x + this.#cornerOffsets[2].x - padding,\n this.centroid.x + this.#cornerOffsets[0].x + padding\n ]\n }\n\n xPadding(padding: number): number {\n if (padding <= 1.0) {\n return Math.min(padding * this.width, MAX_CONNECTION_SPLAY_PADDING)\n }\n return padding\n }\n\n yBounds(padding: number = 0): [number, number] {\n padding = this.yPadding(padding)\n return [\n this.centroid.y + this.#cornerOffsets[2].y - padding,\n this.centroid.y + this.#cornerOffsets[0].y + padding\n ]\n }\n\n yPadding(padding: number): number {\n if (padding <= 1.0) {\n return Math.min(padding * this.height, MAX_CONNECTION_SPLAY_PADDING)\n }\n return padding\n }\n\n pointOutside(point: PointLike, padding: number = 0): boolean {\n const xBounds = this.xBounds(padding)\n const yBounds = this.yBounds(padding)\n return point.x < xBounds[0] || xBounds[1] < point.x || point.y < yBounds[0] || yBounds[1] < point.y\n }\n\n /*\n * Return the intersection of the shortest path, normal to an extended bounding\n * box from a point\n *\n * This is done in a way compatible with ``boundaryIntersections()```\n *\n * @param {PointLike} point The point\n * @return {number}\n */\n boundaryNormalIntersection(point: PointLike, padding: number = CONNECTION_SPLAY_PADDING): Point {\n // Corner offsets are wrt centroid, anticlockwise from bottom right\n let corners: [Point, Point, Point, Point]\n if (padding) {\n // expand corners by padding\n const pad = new Point(this.xPadding(padding), this.yPadding(padding))\n corners = [\n this.#cornerOffsets[0].add({ x: pad.x, y: pad.y }), // BR\n this.#cornerOffsets[1].add({ x: pad.x, y: -pad.y }), // TR\n this.#cornerOffsets[2].add({ x: -pad.x, y: -pad.y }), // TL\n this.#cornerOffsets[3].add({ x: -pad.x, y: pad.y }) // BL\n ]\n } else {\n corners = this.#cornerOffsets\n }\n let deltaX = point.x - this.centroid.x\n let deltaY = point.y - this.centroid.y\n if (deltaX < 0) {\n if (deltaY < 0) {\n if (corners[2].x * deltaY < corners[2].y * deltaX) {\n deltaX = corners[2].x // left\n } else {\n deltaY = corners[2].y // top\n }\n } else {\n // deltaY >= 0\n if (corners[3].x * deltaY < corners[3].y * deltaX) {\n deltaY = corners[3].y // bottom\n } else {\n deltaX = corners[3].x // left\n }\n }\n } else {\n // deltaX >= 0\n if (deltaY < 0) {\n if (corners[1].x * deltaY < corners[1].y * deltaX) {\n deltaY = corners[1].y // top\n } else {\n deltaX = corners[1].x // right\n }\n } else {\n // deltaY >= 0\n if (corners[0].x * deltaY < corners[0].y * deltaX) {\n deltaX = corners[0].x // right\n } else {\n deltaY = corners[0].y // bottom\n }\n }\n }\n return this.centroid.add({ x: deltaX, y: deltaY })\n }\n\n #scaledVerticalOffset(x: number, delta: PointLike): Point {\n return new Point(x, (x * delta.y) / delta.x)\n }\n\n #scaledHorizontalOffset(y: number, delta: PointLike): Point {\n return new Point((y * delta.x) / delta.y, y)\n }\n\n boundaryFace(point: PointLike): string {\n if (this.containsPoint(point)) {\n return ''\n }\n const delta = PointMath.subtract(point, this.centroid)\n if (delta.x < 0) {\n if (delta.y < 0) {\n return this.#cornerOffsets[2].x * delta.y < this.#cornerOffsets[2].y * delta.x ? 'L' : 'T'\n } else {\n return this.#cornerOffsets[3].x * delta.y < this.#cornerOffsets[3].y * delta.x ? 'B' : 'L'\n }\n } else {\n if (delta.y < 0) {\n return this.#cornerOffsets[1].x * delta.y < this.#cornerOffsets[1].y * delta.x ? 'T' : 'R'\n } else {\n return this.#cornerOffsets[0].x * delta.y < this.#cornerOffsets[0].y * delta.x ? 'R' : 'B'\n }\n }\n }\n\n boundaryIntersections(\n point: PointLike,\n padding: number = CONNECTION_SPLAY_PADDING\n ): [Point | null, Point | null, string] {\n /*\n * +---dx---+\n * \\ |\n * \\ |\n * \\ |\n * 2 ---\\--------------------------- 1\n * | \\ | |\n * | \\ | |\n * | \\ dh |\n * | \\| |\n * |---dw---o |\n * 3 ------------------------------- 0\n *\n *\n * TOP dh/dw < dy/dx < dh/(w-dw)\n * RIGHT dh/(w-dw) (h-dh)/(w-dw)\n * BOTTOM (h-dh)/(w-dw) (h-dh)/dw\n * LEFT (h-dh)/dw dh/dw\n *\n *\n * Four quadrants wrt centroid:\n *\n * +deltaX, +deltaY bottom-right corner BR 0 (w-dw) (h-dh)\n * +deltaX, -deltaY top-right corner TR 1 (w-dw) -dh\n * -deltaX, -deltaY top-left corner TL 2 -dw -dh\n * -deltaX, +deltaY bottom-left corner BL 3 -dw (h-dh)\n *\n * this.#cornerOffsets is wrt centroid, anticlockwise from bottom right\n */\n if (this.containsPoint(point)) {\n return [null, null, '']\n }\n\n const delta = PointMath.subtract(point, this.centroid)\n let offset: Point\n let face: string = ''\n const pad = new Point(this.xPadding(padding), this.yPadding(padding))\n let paddingOffset: Point = new Point()\n\n // Corner offsets are wrt centroid, anticlockwise from bottom right\n // BR, TR, TL, BL\n // 0 1 2 3\n //\n if (delta.x < 0) {\n if (delta.y < 0) {\n // TL\n if (this.#cornerOffsets[2].x * delta.y < this.#cornerOffsets[2].y * delta.x) {\n // left\n face = 'L'\n offset = this.#scaledVerticalOffset(this.#cornerOffsets[2].x, delta)\n if (padding) {\n paddingOffset = this.#scaledVerticalOffset(offset.x - pad.x, delta)\n }\n } else {\n // top\n face = 'T'\n offset = this.#scaledHorizontalOffset(this.#cornerOffsets[2].y, delta)\n if (padding) {\n paddingOffset = this.#scaledHorizontalOffset(offset.y - pad.y, delta)\n }\n }\n } else {\n // BL\n if (this.#cornerOffsets[3].x * delta.y < this.#cornerOffsets[3].y * delta.x) {\n // bottom\n face = 'B'\n offset = this.#scaledHorizontalOffset(this.#cornerOffsets[3].y, delta)\n if (padding) {\n paddingOffset = this.#scaledHorizontalOffset(offset.y + pad.y, delta)\n }\n } else {\n // left\n face = 'L'\n offset = this.#scaledVerticalOffset(this.#cornerOffsets[3].x, delta)\n if (padding) {\n paddingOffset = this.#scaledVerticalOffset(offset.x - pad.x, delta)\n }\n }\n }\n } else {\n if (delta.y < 0) {\n // TR\n if (this.#cornerOffsets[1].x * delta.y < this.#cornerOffsets[1].y * delta.x) {\n // top\n face = 'T'\n offset = this.#scaledHorizontalOffset(this.#cornerOffsets[1].y, delta)\n if (padding) {\n paddingOffset = this.#scaledHorizontalOffset(offset.y - pad.y, delta)\n }\n } else {\n // right\n face = 'R'\n offset = this.#scaledVerticalOffset(this.#cornerOffsets[1].x, delta)\n if (padding) {\n paddingOffset = this.#scaledVerticalOffset(offset.x + pad.x, delta)\n }\n }\n } else {\n // BR\n if (this.#cornerOffsets[0].x * delta.y < this.#cornerOffsets[0].y * delta.x) {\n // right\n face = 'R'\n offset = this.#scaledVerticalOffset(this.#cornerOffsets[0].x, delta)\n if (padding) {\n paddingOffset = this.#scaledVerticalOffset(offset.x + pad.x, delta)\n }\n } else {\n // bottom\n face = 'B'\n offset = this.#scaledHorizontalOffset(this.#cornerOffsets[0].y, delta)\n if (padding) {\n paddingOffset = this.#scaledHorizontalOffset(offset.y + pad.y, delta)\n }\n }\n }\n }\n if (padding) {\n return [this.centroid.add(offset), this.centroid.add(paddingOffset), face]\n } else {\n return [this.centroid.add(offset), null, face]\n }\n }\n\n containsPoint(point: PointLike, padding: number = 0): boolean {\n let bounds: [Point, Point]\n if (padding) {\n // expand corners by padding\n const pad = new Point(this.xPadding(padding), this.yPadding(padding))\n bounds = [\n this.#cornerOffsets[2].add({ x: -pad.x, y: -pad.y }), // TL\n this.#cornerOffsets[0].add({ x: pad.x, y: pad.y }) // BR\n ]\n } else {\n bounds = [this.#cornerOffsets[2], this.#cornerOffsets[0]]\n }\n const deltaX = point.x - this.centroid.x\n const deltaY = point.y - this.centroid.y\n return bounds[0].x <= deltaX && deltaX <= bounds[1].x && bounds[0].y <= deltaY && deltaY <= bounds[1].y\n }\n\n clearControlHandles() {}\n\n drawControlHandles() {}\n\n highlight(highlight = true) {\n this.#setSelectionClass('highlight', highlight)\n }\n\n undoControlMove(_undoPosition: UndoMovePosition) {}\n\n pointerEvent(_eventType: string, _svgElement: SVGGraphicsElement, _svgCoords: PointLike): boolean {\n return false\n }\n\n redraw() {}\n\n remove() {\n this.svgElement.remove()\n }\n\n select(selected = true) {\n this.#setSelectionClass('selected', selected)\n this.#selected = selected\n }\n\n limitDirection(_direction: string, _minimum: number | RestrictedValue, _maximum: number | RestrictedValue) {}\n\n unlimitDirection() {}\n\n /**\n * Update the SVG of the element with new SVG.\n *\n * Called when an element's properties have been changed.\n */\n async updateSvgElement(svg: string) {\n this.svgElement.innerHTML = `<image href=\"${base64Svg(svg)}\"/>`\n await vue.nextTick() // Wait for image to render\n this.#updatedSvgElement()\n }\n}\n\n//==============================================================================\n//==============================================================================\n","/******************************************************************************\n\nCellDL Editor\n\nCopyright (c) 2022 - 2025 David Brooks\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n******************************************************************************/\n\nimport { CELLDL_STYLE_CLASS, type CellDLConnectedObject, type CellDLObject } from '@editor/celldlObjects/index'\nimport { editGuides } from '@editor/editor/editguides'\nimport { undoRedo, type EditorUndoAction, type UndoMovePosition } from '@editor/editor/undoredo'\nimport { Point, type PointLike } from '@renderer/common/points'\nimport { RestrictedPoint, type RestrictedValue } from '@editor/geometry/index'\nimport { ControlRect } from '@editor/geometry/controls'\nimport { Transform } from '@editor/geometry/transforms'\n\nimport { CellDLSVGElement } from './index'\nimport type { PathElement } from './pathelement'\n\n//==============================================================================\n\nexport class BoundedElement extends CellDLSVGElement {\n // Selected object is stroked bounding box rectangle with control points at each corner\n // Control point move resizes (shift maintains aspect ratio if object doesn't have fixed\n // aspect ratio property).\n // Bounding box grab moves entire object.\n // Rotate via double click on a control point? Cursor to change to show rotate mode; click exits rotate mode.\n // svgElement could be a group.\n // connector nodes on object move with the object (==> need their position wrt. bbox (centre origin, so rotate works?))\n\n #connectedPathElements: Map<string, PathElement> = new Map()\n #controlRect: ControlRect\n #topLeftCorner: Point\n #transform: Transform\n #undoMoveAction: EditorUndoAction | null = null\n\n constructor(object: CellDLObject, svgElement: SVGGraphicsElement, gridAligned: boolean=false, align: boolean=false) {\n super(object, svgElement)\n // local transform on the element\n this.#transform = Transform.fromString(getComputedStyle(svgElement).transform)\n this.#controlRect = new ControlRect(\n RestrictedPoint.fromPoint(this.topLeft),\n RestrictedPoint.fromPoint(this.topLeft.add(this.size)),\n this.centroidOffset\n )\n this.setCentroid(this.#controlRect.centroid.point)\n this.#topLeftCorner = this.#controlRect.topLeftPoint\n this.#controlRect.gridAligned = gridAligned\n if (gridAligned && align) {\n const gridAlignedCentroid = editGuides.gridAlign(this.centroid, { fullSnap: true })\n this.#reposition(gridAlignedCentroid)\n }\n }\n\n isMoveable(_svgElement: SVGGraphicsElement): boolean {\n return !this.svgElement.classList.contains(CELLDL_STYLE_CLASS.Interface)\n }\n\n startMove(svgPoint: PointLike) {\n this.#undoMoveAction = undoRedo.undoMoveAction()\n this.#undoMoveAction.addObjectDetails(this.celldlObject)\n this.#undoMoveAction.startMove(0, this.#controlRect.centroid.point)\n this.#controlRect.startMove(svgPoint)\n }\n\n limitDirection(direction: string, minimum: number | RestrictedValue, maximum: number | RestrictedValue) {\n if (direction === 'H') {\n this.#controlRect.centroid.xValue.narrowRange(minimum, maximum)\n } else if (direction === 'V') {\n this.#controlRect.centroid.yValue.narrowRange(minimum, maximum)\n }\n }\n\n unlimitDirection() {\n this.#controlRect.centroid.xValue.reassignMinimum(-Infinity)\n this.#controlRect.centroid.xValue.reassignMaximum(Infinity)\n this.#controlRect.centroid.yValue.reassignMinimum(-Infinity)\n this.#controlRect.centroid.yValue.reassignMaximum(Infinity)\n }\n\n move(svgPoint: PointLike) {\n if (this.#undoMoveAction) {\n const savedCentroid = this.centroid\n this.#controlRect.move(svgPoint)\n this.setCentroid(this.#controlRect.centroid.point)\n const centroidDelta = this.centroid.subtract(savedCentroid)\n // Reset any restrictions for `componentBoundingBoxBoxMoved()`\n this.unlimitDirection()\n for (const path of this.#connectedPathElements.values()) {\n path.componentBoundingBoxMoved(this, centroidDelta)\n }\n this.#undoMoveAction!.endMove(0, this.#controlRect.centroid.point)\n if (this.#controlRect.dirty) {\n this.celldlObject.redraw()\n }\n }\n }\n\n endMove() {\n super.endMove()\n for (const path of this.#connectedPathElements.values()) {\n path.endMove()\n }\n this.#undoMoveAction = null\n }\n\n addPathElement(path: PathElement) {\n this.#connectedPathElements.set(path.id, path)\n }\n\n removePathElement(path: PathElement) {\n this.#connectedPathElements.delete(path.id)\n }\n\n redraw() {\n const newTopLeft = this.#controlRect.topLeftPoint\n const translation = Transform.Translate(\n newTopLeft.x - this.#topLeftCorner.x,\n newTopLeft.y - this.#topLeftCorner.y\n )\n let transform: Transform\n if (this.globalTransform) {\n const globalInverse = this.globalTransform.inverse()\n const globalTransform = this.updateGlobalTransform(translation)\n if (globalTransform) {\n transform = globalTransform.leftMultiply(globalInverse).leftMultiply(this.#transform)\n } else {\n transform = globalInverse.leftMultiply(this.#transform)\n }\n } else {\n this.updateGlobalTransform(translation)\n transform = translation.leftMultiply(this.#transform)\n }\n if (transform.isIdentity) {\n this.svgElement.removeAttribute('transform')\n } else {\n this.svgElement.setAttribute('transform', transform.toString())\n }\n super.redraw()\n }\n\n #reposition(centroid: Point) {\n this.setCentroid(centroid)\n this.#controlRect.reposition(centroid)\n if (this.#controlRect.dirty) {\n this.redraw()\n }\n }\n\n undoControlMove(undoPosition: UndoMovePosition) {\n if (undoPosition && undoPosition[0] === 0 && undoPosition[1]) {\n this.#reposition(undoPosition[1])\n }\n }\n\n async updateSvgElement(svg: string) {\n const savedCorners = this.corners.map((point) => Point.fromPoint(point))\n await super.updateSvgElement(svg)\n this.#controlRect.setCentroidOffset(this.centroidOffset)\n this.#controlRect.setCornerPositions(\n RestrictedPoint.fromPoint(this.topLeft),\n RestrictedPoint.fromPoint(this.topLeft.add(this.size))\n )\n const cornerDeltas = this.corners.map((corner, index) => corner.subtract(savedCorners[index]!))\n if (this.celldlObject.isConnectable) {\n // Reset any restrictions for `componentBoundingBoxResisized()`\n this.unlimitDirection()\n // Adjust boundary intersections of paths connected to the component\n for (const path of this.#connectedPathElements.values()) {\n path.componentBoundingBoxResisized(this, cornerDeltas as [Point, Point])\n }\n ;(<CellDLConnectedObject>this.celldlObject).connections.forEach((c) => c.redraw())\n }\n }\n}\n\n//==============================================================================\n","/******************************************************************************\n\nCellDL Editor\n\nCopyright (c) 2022 - 2025 David Brooks\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n******************************************************************************/\n\nimport SVGPathCommander from 'svg-path-commander'\nimport type { NormalArray } from 'svg-path-commander'\n\n//==============================================================================\n\nimport type { CellDLConnection } from '@editor/celldlObjects/index'\nimport type { EditorFrame } from '@editor/editor/editorframe'\nimport type { Point, PointLike } from '@renderer/common/points'\nimport { svgPathElement } from '@renderer/common/svgUtils'\nimport type { FixedValue, RestrictedValue } from '@editor/geometry/index'\nimport { ControlPoint } from '@editor/geometry/controls'\nimport type { FoundPoint } from '@editor/geometry/pathutils'\n\nimport type { BoundedElement } from './boundedelement'\n\n//==============================================================================\n\nexport const ID_PART_SEPARATOR = '-'\n\n//==============================================================================\n\nexport class PathPoint extends ControlPoint {\n #static: boolean = false\n\n constructor(\n xValue: RestrictedValue,\n yValue: RestrictedValue,\n readonly component: BoundedElement | null = null,\n static_value: boolean = false\n ) {\n super(xValue, yValue, component)\n this.#static = static_value\n }\n\n get static() {\n return this.#static || this.fixed\n }\n setStatic(value: boolean = true) {\n this.#static = value\n }\n\n copy(): PathPoint {\n return new PathPoint(this.xValue, this.yValue, this.component, this.static)\n }\n}\n\n//==============================================================================\n\nexport class FixedPathPoint extends PathPoint {\n constructor(\n xValue: FixedValue,\n yValue: FixedValue,\n readonly component: BoundedElement | null = null\n ) {\n super(xValue, yValue, component)\n }\n\n copy(): FixedPathPoint {\n return new FixedPathPoint(this.xValue, this.yValue, this.component)\n }\n}\n\n//==============================================================================\n\nexport class PathElement {\n #connection: CellDLConnection\n #pathPoints: PathPoint[] = []\n #editorFrame: EditorFrame\n #firstElement: BoundedElement\n #lastElement: BoundedElement\n #moveIndex: number = 0\n #movePoint: PathPoint | null = null\n #pathArray: NormalArray\n #svgElement: SVGPathElement\n #svgParentId: string\n #validPath: boolean = false\n\n constructor(\n connection: CellDLConnection,\n readonly id: string,\n svgElement: SVGPathElement,\n firstElement: BoundedElement,\n lastElement: BoundedElement\n ) {\n this.#connection = connection\n // biome-ignore lint/style/noNonNullAssertion: the diagram has an editor frame\n this.#editorFrame = connection.celldlDiagram.editorFrame!\n this.#svgElement = svgElement\n this.#svgParentId = id.split(ID_PART_SEPARATOR).slice(0, -1).join(ID_PART_SEPARATOR)\n this.#firstElement = firstElement\n this.#firstElement.addPathElement(this)\n this.#lastElement = lastElement\n this.#lastElement.addPathElement(this)\n\n const description = this.#svgElement.getAttribute('d') as string\n this.#pathArray = SVGPathCommander.normalizePath(description)\n if (this.#pathArray.length >= 2 && this.#pathArray[0][0] === 'M') {\n this.#validPath = true\n this.#svgElement.setAttribute('d', SVGPathCommander.pathToString(this.#pathArray))\n }\n this.setPathPoints(this.#pathArray)\n const simplifiedPath = this.simplifyPathPoints()\n if (simplifiedPath) {\n this.#pathPoints = simplifiedPath\n this.redraw()\n }\n }\n\n get firstElement() {\n return this.#firstElement\n }\n\n get lastElement() {\n return this.#lastElement\n }\n\n get moveIndex() {\n return this.#moveIndex\n }\n\n get movePoint() {\n return this.#movePoint\n }\n\n get pathArray() {\n return this.#pathArray\n }\n\n get svgElement() {\n return this.#svgElement\n }\n\n protected get pathPoints() {\n return this.#pathPoints\n }\n\n protected get validPath() {\n return this.#validPath\n }\n protected set validPath(valid: boolean) {\n this.#validPath = valid\n }\n\n clearControlHandles(selected: boolean) {\n // This only removes handles we know about which is why simplifyPathPoints()\n // needs to remove handles for the points it deletes\n for (let index = 1; index < this.#pathPoints.length - 1; ++index) {\n if (!selected) {\n // biome-ignore lint/style/noNonNullAssertion: index is in range\n this.#pathPoints[index]!.removeSvgElement()\n }\n }\n }\n\n drawControlHandles(selected: boolean) {\n for (let index = 1; index < this.#pathPoints.length - 1; ++index) {\n // biome-ignore lint/style/noNonNullAssertion: index is in range\n const pathPoint = this.#pathPoints[index]!\n const svgElement = pathPoint.createSvgElement(this.#editorFrame, '', this.#connection)\n svgElement.id = `${this.#svgParentId}-cp-${index}`\n svgElement.dataset.parentId = this.#svgParentId\n svgElement.dataset.controlIndex = `${this.id}${ID_PART_SEPARATOR}${index}`\n if (selected) {\n svgElement.classList.add('selected')\n }\n }\n this.#movePoint = null\n }\n\n endMove(selected: boolean=false) {\n this.clearControlHandles(selected)\n const newPoints = this.simplifyPathPoints()\n if (newPoints) {\n this.#pathPoints = newPoints\n this.redraw()\n }\n this.#movePoint = null\n }\n\n isMoveable(index: number): boolean {\n if (index > 0 && index < this.#pathPoints.length - 1) {\n // biome-ignore lint/style/noNonNullAssertion: index is in range\n const pathPoint = this.#pathPoints[index]!\n if (!pathPoint.fixed) {\n this.#movePoint = pathPoint\n this.#moveIndex = index\n return true\n }\n }\n this.#movePoint = null\n return false\n }\n\n move(position: PointLike) {\n let redraw = false\n if (this.#movePoint) {\n this.pathPoints.forEach((pathPoint) => {\n pathPoint.clean()\n })\n this.movePathPoint(position)\n this.pathPoints.forEach((pathPoint) => {\n if (pathPoint.redraw()) redraw = true\n })\n }\n return redraw\n }\n\n protected pathArrayFromPathPoints(): NormalArray {\n const normalArray = this.pathPoints.map((p) => ['L', p.x, p.y])\n // biome-ignore lint/style/noNonNullAssertion: array is three long\n normalArray[0]![0] = 'M'\n return normalArray as NormalArray\n }\n\n redraw() {\n this.#pathArray = this.pathArrayFromPathPoints()\n this.#svgElement.setAttribute('d', SVGPathCommander.pathToString(this.#pathArray))\n }\n\n remove() {\n this.pathPoints.forEach((cp, _) => {\n if (cp.component) {\n cp.component.removePathElement(this)\n }\n })\n }\n\n splitPath(splitPoint: FoundPoint, interfaceElement: BoundedElement): SVGPathElement {\n const point = splitPoint.point\n const headArray: NormalArray = this.#pathArray.slice(0, splitPoint.segment! + 1)\n headArray.push(['L', point.x, point.y])\n\n const tailPoints = this.#pathArray.slice(splitPoint.segment! + 1).map((p: number[]) => {\n // biome-ignore lint/style/noNonNullAssertion: indices are in range\n return { x: p[1]!, y: p[2]! }\n })\n tailPoints.splice(0, 0, point)\n this.#lastElement.removePathElement(this)\n this.#lastElement = interfaceElement\n this.#lastElement.addPathElement(this)\n this.#pathArray = headArray\n\n const svgElement = svgPathElement(tailPoints)\n this.#svgElement.setAttribute('d', SVGPathCommander.pathToString(this.#pathArray))\n this.setPathPoints(this.#pathArray)\n svgElement.classList.add(...this.#svgElement.classList.values())\n return svgElement\n }\n\n startMove(point: PointLike) {\n if (this.#movePoint) {\n this.#movePoint.startMove(point)\n }\n }\n\n componentBoundingBoxMoved(component: BoundedElement, centroidDelta: Point) {\n for (const index of [0, this.#pathPoints.length - 1]) {\n // biome-ignore lint/style/noNonNullAssertion: index is in range\n if (component === this.#pathPoints[index]!.component) {\n this.movedComponentBoundingBox(index, component, centroidDelta)\n return\n }\n }\n }\n\n componentBoundingBoxResisized(component: BoundedElement, cornerDeltas: [Point, Point]) {\n for (const index of [0, this.#pathPoints.length - 1]) {\n // biome-ignore lint/style/noNonNullAssertion: index is in range\n if (component === this.#pathPoints[index]!.component) {\n this.resizedComponentBoundingBox(index, component, cornerDeltas)\n return\n }\n }\n }\n\n undoControlMove(moveIndex: number, movePoint: Point | null) {\n if (moveIndex > 0 && moveIndex < this.#pathPoints.length - 1 && movePoint) {\n // biome-ignore lint/style/noNonNullAssertion: index is in range\n const pathPoint = this.#pathPoints[moveIndex]!\n pathPoint.point = movePoint\n let redraw = false\n this.#pathPoints.forEach((pathPoint) => {\n if (pathPoint.redraw()) redraw = true\n })\n if (redraw) this.redraw()\n }\n }\n\n protected movePathPoint(_position: PointLike) {}\n\n protected movedComponentBoundingBox(_index: number, _component: BoundedElement, _centroidDelta: Point) {}\n\n protected resizedComponentBoundingBox(_index: number, _component: BoundedElement, _cornerDeltas: [Point, Point]) {}\n\n protected setPathPoints(_pathArray: NormalArray) {}\n\n protected simplifyPathPoints(): PathPoint[] | null {\n return null\n }\n}\n\n//==============================================================================\n","/******************************************************************************\n\nCellDL Editor\n\nCopyright (c) 2022 - 2025 David Brooks\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n******************************************************************************/\n\nimport type { NormalArray } from 'svg-path-commander'\n\n//==============================================================================\n\nimport { type Point, type PointLike, PointMath } from '@renderer/common/points'\nimport { FixedValue, RestrictedValue } from '@editor/geometry'\n\nimport type { BoundedElement } from './boundedelement'\nimport { FixedPathPoint, PathElement, PathPoint } from './pathelement'\n\n//==============================================================================\n\nexport class LinearPath extends PathElement {\n protected setPathPoints(pathArray: NormalArray) {\n if (this.validPath) {\n // set by constructor when path starts with 'M' command\n this.pathPoints.length = 0\n let pathPoint: PathPoint = new FixedPathPoint(\n new FixedValue(pathArray[0][1]),\n new FixedValue(pathArray[0][2]),\n this.firstElement\n )\n this.pathPoints.push(pathPoint)\n let n = 1\n while (n < pathArray.length) {\n const drawCommand = pathArray[n]\n if (drawCommand[0] !== 'L') {\n this.validPath = false\n break\n }\n const nextX = new RestrictedValue(drawCommand[1])\n const nextY = new RestrictedValue(drawCommand[2])\n if (n < pathArray.length - 1) {\n pathPoint = new PathPoint(nextX, nextY)\n } else {\n // End of path\n pathPoint = new FixedPathPoint(nextX, nextY, this.lastElement)\n }\n // line from lastpoint to controlpoint\n this.pathPoints.push(pathPoint)\n n += 1\n }\n }\n }\n\n protected movePathPoint(position: PointLike) {\n const firstElement = this.pathPoints.at(0)!.component\n const lastElement = this.pathPoints.at(-1)!.component\n this.movePoint!.move(position)\n if ([1, 2].includes(this.moveIndex)) {\n // Index is for either the first or second point after the start point, so\n // update the boundary intersection for the start point (move of second point may\n // have moved first point after start point)\n const boundaryPoint = firstElement!.boundaryIntersections(this.pathPoints[1])[0]\n if (boundaryPoint) {\n this.pathPoints[0]!.reassignPosition(boundaryPoint)\n }\n }\n if ([2, 3].includes(this.pathPoints.length - this.moveIndex)) {\n // Index is for either the first or second point before the last point, so\n // update the boundary intersection for the last point (move of second point may\n // have moved first point before last point)\n const boundaryPoint = lastElement!.boundaryIntersections(this.pathPoints[this.pathPoints.length - 2])[0]\n if (boundaryPoint) {\n this.pathPoints.at(-1)!.reassignPosition(boundaryPoint)\n }\n }\n }\n\n protected movedComponentBoundingBox(index: number, component: BoundedElement, _centroidDelta: Point) {\n const position = component.centroid\n\n const pathPoint = this.pathPoints.at(index)!\n const prevPoint = index > 0 ? this.pathPoints[index - 1] : null\n const nextPoint = index < this.pathPoints.length - 1 ? this.pathPoints[index + 1] : null\n if (prevPoint) {\n if (index > 1) {\n const component = this.pathPoints.at(index - 2)!.component\n if (component) {\n const boundaryPoint = component.boundaryIntersections(prevPoint)[0]\n if (boundaryPoint) {\n this.pathPoints.at(index - 2)!.reassignPosition(boundaryPoint)\n }\n }\n }\n if (prevPoint.component && !prevPoint.isConduit) {\n const boundaryPoint = prevPoint.component.boundaryIntersections(pathPoint)[0]\n if (boundaryPoint) {\n prevPoint.reassignPosition(boundaryPoint)\n }\n }\n }\n if (nextPoint) {\n if (index < this.pathPoints.length - 2) {\n const component = this.pathPoints.at(index + 2)!.component\n if (component) {\n const boundaryPoint = component.boundaryIntersections(nextPoint)[0]\n if (boundaryPoint) {\n this.pathPoints.at(index + 2)!.reassignPosition(boundaryPoint)\n }\n }\n }\n if (nextPoint.component && !nextPoint.isConduit) {\n const boundaryPoint = nextPoint.component.boundaryIntersections(pathPoint)[0]\n if (boundaryPoint) {\n nextPoint.reassignPosition(boundaryPoint)\n }\n }\n }\n pathPoint.reassignPosition(position)\n\n // One and only one of prev/next point will be defined\n const boundaryPoint = prevPoint\n ? pathPoint.component!.boundaryIntersections(prevPoint)[0]\n : nextPoint\n ? pathPoint.component!.boundaryIntersections(nextPoint)[0]\n : null\n if (boundaryPoint) {\n pathPoint.reassignPosition(boundaryPoint)\n }\n }\n\n protected resizedComponentBoundingBox(index: number, component: BoundedElement, _cornerDeltas: [Point, Point]) {\n this.movedComponentBoundingBox(index, component, _cornerDeltas[0])\n }\n\n protected simplifyPathPoints(): PathPoint[] | null {\n // If two points coincide then remove one...\n const nPoints = this.pathPoints.length\n if (nPoints < 3) {\n return null\n }\n const newPoints: PathPoint[] = []\n newPoints.push(this.pathPoints[0]!)\n let index = 1\n while (index < nPoints - 1) {\n const prevPoint = this.pathPoints[index - 1]!\n const pathPoint = this.pathPoints[index]!\n const nextPoint = this.pathPoints[index + 1]!\n\n if (pathPoint.isConduit) {\n newPoints.push(pathPoint)\n } else if (pathPoint.point.equals(nextPoint.point)) {\n // Two identical points -- remove first one\n pathPoint.removeSvgElement()\n } else if (PointMath.colinear(prevPoint, pathPoint, nextPoint)) {\n // Three colinear points -- remove middle one\n pathPoint.removeSvgElement()\n } else {\n newPoints.push(pathPoint)\n }\n index += 1\n }\n // Add last point\n newPoints.push(this.pathPoints[nPoints - 1]!)\n if (newPoints.length === nPoints) {\n return null\n }\n return newPoints\n }\n}\n\n//==============================================================================\n","/******************************************************************************\n\nCellDL Editor\n\nCopyright (c) 2022 - 2025 David Brooks\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n******************************************************************************/\n\nimport type { NormalArray } from 'svg-path-commander'\n\n//==============================================================================\n\nimport { CONNECTION_SPLAY_PADDING } from '@renderer/common/styling'\nimport { Point, type PointLike, PointMath } from '@renderer/common/points'\nimport { editGuides } from '@editor/editor/editguides'\n\nimport { FixedValue, RestrictedValue } from '@editor/geometry/index'\nimport { roundEqual } from '@editor/utils'\n\nimport type { BoundedElement } from './boundedelement'\nimport { FixedPathPoint, PathElement, PathPoint } from './pathelement'\n\n//==============================================================================\n\n/**\n\n 1) Paths can be described by their edges, with ``S`` being an edge from a\n component's boundary to its splay point, ``H`` a horizontal path, and ``V``\n a vertical path.\n 2) Paths always start and end with ``S`` edges; between these two edges there\n is at least a one long sequence of ``H`` and ``V`` edges, with ``H`` and ``V``\n alternating along the path.\n 3) Path splitting is always in an edge connected to an ``S`` edge.\n 4) There can only be at most two paths split during a CP move -- ``S V H S``\n and its dual.\n 5) Path simplification is a process of edge renewal and joining, and happens at\n the end of a move, immediately before the SVG <path> is set.\n 6) Only ``H`` and ``V`` edges can be removed.\n 6) An edge is removed if it has zero length; one end of this edge will be the node\n used for the move operation.\n 7) If the removed edge was connected to an ``S`` edge, simplification stops\n with edge removal.\n 8) Otherwise the two adjacent ``H`` or ``V`` edges of the removed edge are\n combined and simplification stops.\n 9) CPs and their svgElements have an ``active`` state, used to set removed CPs to\n inactive during path simplification, when CPs are reassigned if there are now\n inactive ones.\n10) If a ``H`` or ``V`` edge connected to the moving node has a length close to\n zero then the node's position snaps to the point at which the edge's length\n is zero.\n\n 1) The node positions at each end of an edge are ``RestrictedPoints``\n 2) An ``H`` edge has identical ``Y`` values of its nodes; if one node is connected\n to an ``S`` edge then this node determines the other's ``Y`` value; ``S H S`` is\n a special case.\n 3) An ``V`` edge has identical ``X`` values of its nodes; if one node is connected\n to an ``S`` edge then this node determines the other's ``X`` value; ``S V S`` is\n a special case.\n 4) The positions of an ``S`` edge's nodes are determined by the intersection of the\n line, from the outermost node to the centroid of the associated component, with\n the component's boundary and its outer padded boundary.\n**/\n\n//==============================================================================\n\ntype EdgeDirection = 'H' | 'S' | 'V'\n\nfunction direction(p0: PointLike, p1: PointLike): EdgeDirection {\n return Math.abs(p0.x - p1.x) > Math.abs(p0.y - p1.y) ? 'H' : 'V'\n}\n\n//==============================================================================\n\nclass PathEdge {\n #direction: EdgeDirection\n #pathPoints: [PathPoint, PathPoint]\n\n constructor(pathPoints: [PathPoint, PathPoint], terminator: boolean = false) {\n this.#pathPoints = pathPoints\n this.#direction = terminator ? 'S' : direction(...pathPoints)\n }\n\n get pathPoints() {\n return this.#pathPoints\n }\n\n get direction() {\n return this.#direction\n }\n\n get length(): number {\n return PointMath.distance(this.#pathPoints[0], this.#pathPoints[1])\n }\n\n combine(other: PathEdge): PathEdge | null {\n if (this.#direction === other.#direction && this.#direction !== 'S') {\n const cp0 = this.#pathPoints[0]\n const cp1 = other.#pathPoints[1]\n // don't blend Y nor X if both edges abut an S edge...\n // (pre-terminator??)\n if (this.#direction === 'H') {\n if (cp0.static && cp1.static) {\n // Don't copy values\n } else if (cp1.static) {\n cp0.yValue = cp1.yValue\n } else {\n cp1.yValue = cp0.yValue\n }\n } else {\n if (cp0.static && cp1.static) {\n // Don't copy values\n } else if (cp1.static) {\n cp0.xValue = cp1.xValue\n } else {\n cp1.xValue = cp0.xValue\n }\n }\n const r = new PathEdge([cp0, cp1])\n return r\n }\n return null\n }\n\n toString(): string {\n return `Edge: ${this.#direction}, ${this.length} [${this.#pathPoints[0].toString()}, ${this.#pathPoints[1].toString()}]`\n }\n}\n\n//==============================================================================\n\nfunction getEdges(pathPoints: PathPoint[]) {\n return pathPoints\n .slice(0, -1)\n .map((cp, i) => new PathEdge([cp, pathPoints[i + 1]!], i === 0 || i === pathPoints.length - 2))\n}\n\n/** DEBUGGING\n\nfunction edgesSignature(path: PathEdge[]): string\n//===============================================\n{\n return `\"${path.map(e => e.direction).join(' ')}\": ${path.map(e => e.length)}`\n}\n\nfunction pathSignature(pathPoints: PathPoint[]): string\n//=====================================================\n{\n return edgesSignature(getEdges(pathPoints))\n}\n\nfunction checkEdges(pathPoints: PathPoint[], id:string='', all:boolean=false)\n//===========================================================================\n{\n const edges = getEdges(pathPoints)\n let goodEdges = (edges.length >= 3\n && edges[0].direction === 'S'\n && edges[1].direction !== 'S'\n && edges[edges.length-1].direction === 'S')\n if (goodEdges) {\n let dirn = edges[1].direction\n for (const edge of edges.slice(2, -1)) {\n if (edge.direction === 'S' || edge.direction === dirn) {\n goodEdges = false\n break\n }\n dirn = edge.direction\n }\n }\n if (all || !goodEdges) {\n console.log(`${!goodEdges ? 'Bad edges' : 'Edges'}...`, id, edgesSignature(edges))\n }\n}\nDEBUGGING **/\n\n//==============================================================================\n\nexport class RectilinearPath extends PathElement {\n protected pathArrayFromPathPoints(): NormalArray {\n const points = this.pathPoints\n const nPoints = points.length\n const firstIndex = PointMath.colinear(points[0]!, points[1]!, points[2]!, true) ? 2 : 1\n const lastIndex = PointMath.colinear(points[nPoints - 3]!, points[nPoints - 2]!, points[nPoints - 1]!, true)\n ? -2\n : -1\n const path: PathPoint[] = [points[0]!, ...points.slice(firstIndex, lastIndex)!, points[nPoints - 1]!]\n const pathArray = path.map(p => ['L', p.x, p.y])\n pathArray[0]![0] = 'M'\n return pathArray as NormalArray\n }\n\n static #elementPathPoints(element: BoundedElement, pathPoint: Point): [PathPoint, PathPoint] {\n const paddedBoundaryPoint = element.boundaryNormalIntersection(pathPoint)\n const intersections = element.boundaryIntersections(paddedBoundaryPoint)\n const boundaryPoint = new FixedPathPoint(\n new FixedValue(intersections[0]!.x),\n new FixedValue(intersections[0]!.y),\n element\n )\n const splayPoint = new PathPoint(\n new RestrictedValue(intersections[1]!.x, ...element.xBounds(CONNECTION_SPLAY_PADDING)),\n new RestrictedValue(intersections[1]!.y, ...element.yBounds(CONNECTION_SPLAY_PADDING))\n )\n splayPoint.setStatic()\n return [boundaryPoint, splayPoint]\n }\n\n protected setPathPoints(pathArray: NormalArray) {\n this.pathPoints.length = 0\n if (this.validPath) {\n // `validPath` is set by the constructor when path starts\n const pathLength = pathArray.length // with 'M' command and is at least 2 long\n let pathIndex = 1\n let currentPathPoint = new Point(pathArray[1][1], pathArray[1][2])\n const firstPathPoints = RectilinearPath.#elementPathPoints(this.firstElement, currentPathPoint)\n this.pathPoints.push(...firstPathPoints)\n let prevPathPoint = this.pathPoints[1]!\n if (!this.firstElement.pointOutside(currentPathPoint, CONNECTION_SPLAY_PADDING)) {\n pathIndex = 2\n currentPathPoint = new Point(pathArray[2][1], pathArray[2][2])\n }\n while (pathIndex < pathLength - 2) {\n const dirn = direction(prevPathPoint, currentPathPoint)\n const pathPoint = new PathPoint(\n dirn === 'H' ? new RestrictedValue(currentPathPoint.x) : prevPathPoint.xValue,\n dirn === 'H' ? prevPathPoint.yValue : new RestrictedValue(currentPathPoint.y)\n )\n\n this.pathPoints.push(pathPoint)\n prevPathPoint = pathPoint\n pathIndex += 1\n currentPathPoint = new Point(pathArray[pathIndex][1], pathArray[pathIndex][2])\n }\n // currentPathPoint is now the second to last path point but we don't yet have a control point for it\n if (this.lastElement.pointOutside(currentPathPoint, CONNECTION_SPLAY_PADDING)) {\n const dirn = direction(prevPathPoint, currentPathPoint)\n const pathPoint = new PathPoint(\n dirn === 'H' ? new RestrictedValue(currentPathPoint.x) : prevPathPoint.xValue,\n dirn === 'H' ? prevPathPoint.yValue : new RestrictedValue(currentPathPoint.y)\n )\n this.pathPoints.push(pathPoint)\n prevPathPoint = pathPoint\n }\n const lastPathPoints = RectilinearPath.#elementPathPoints(this.lastElement, currentPathPoint)\n lastPathPoints.reverse()\n\n if (this.pathPoints.length > 2) {\n const dirn = direction(prevPathPoint, lastPathPoints[0])\n if (dirn === 'H') {\n prevPathPoint.yValue = lastPathPoints[0].yValue\n } else {\n prevPathPoint.xValue = lastPathPoints[0].xValue\n }\n }\n this.pathPoints.push(...lastPathPoints)\n }\n }\n\n #splitPath(dirn: string, firstIndex: number) {\n // Splitting between first at second\n const firstPoint = this.pathPoints[firstIndex]!\n const secondPoint = this.pathPoints[firstIndex + 1]!\n let newPoints: PathPoint[] = [] //firstPoint]\n if (dirn === 'H') {\n const midX = new RestrictedValue((firstPoint.x + secondPoint.x) / 2)\n newPoints = [new PathPoint(midX, firstPoint.yValue), new PathPoint(midX, secondPoint.yValue)]\n } else {\n const midY = new RestrictedValue((firstPoint.y + secondPoint.y) / 2) //, firstPoint.y, secondPoint.y)\n newPoints = [new PathPoint(firstPoint.xValue, midY), new PathPoint(secondPoint.xValue, midY)]\n }\n if (newPoints.length) {\n this.pathPoints.splice(firstIndex + 1, 0, ...newPoints)\n }\n }\n\n #repositionSplayPoint(\n splayPoint: PathPoint,\n index: number,\n face: string,\n component: BoundedElement,\n delta: PointLike\n ) {\n const nPoints = this.pathPoints.length\n const boundaryPoint = this.pathPoints.at(index)!\n splayPoint.adjustValue(delta)\n const boundaryIntersection = component.boundaryIntersections(splayPoint)[0]\n if (boundaryIntersection) {\n boundaryPoint.reassignPosition(boundaryIntersection)\n }\n const dirn = ['L', 'R'].includes(face) ? 'H' : ['T', 'B'].includes(face) ? 'V' : ''\n if (nPoints === 4) {\n if (index === 0) {\n if (\n (dirn === 'H' && !roundEqual(splayPoint.y, this.pathPoints[2]!.y)) ||\n (dirn === 'V' && !roundEqual(splayPoint.x, this.pathPoints[2]!.x))\n ) {\n //splayPoint.x !== this.pathPoints[2].x) {\n this.#splitPath(dirn, 1)\n }\n } else {\n if (\n (dirn === 'H' && !roundEqual(splayPoint.y, this.pathPoints[nPoints - 3]!.y)) ||\n (dirn === 'V' && !roundEqual(splayPoint.x, this.pathPoints[nPoints - 3]!.x))\n ) {\n //splayPoint.x !== this.pathPoints[nPoints-3].x) {\n this.#splitPath(dirn, nPoints - 3)\n }\n }\n }\n }\n\n protected resizedComponentBoundingBox(index: number, component: BoundedElement, cornerDeltas: [Point, Point]) {\n // [TL, BR]\n const nPoints = this.pathPoints.length\n let splayPoint: PathPoint\n if (index === 0) {\n splayPoint = this.pathPoints[index + 1]!\n } else if (index === nPoints - 1) {\n splayPoint = this.pathPoints[index - 1]!\n } else {\n return\n }\n const face = component.boundaryFace(splayPoint)\n if (face === 'L') {\n this.#repositionSplayPoint(splayPoint, index, face, component, { x: cornerDeltas[1].x, y: 0 })\n } else if (face === 'R') {\n this.#repositionSplayPoint(splayPoint, index, face, component, { x: cornerDeltas[0].x, y: 0 })\n } else if (face === 'T') {\n this.#repositionSplayPoint(splayPoint, index, face, component, { x: 0, y: cornerDeltas[1].y })\n } else if (face === 'B') {\n this.#repositionSplayPoint(splayPoint, index, face, component, { x: 0, y: cornerDeltas[0].y })\n }\n }\n\n protected movedComponentBoundingBox(index: number, component: BoundedElement, centroidDelta: Point) {\n const nPoints = this.pathPoints.length\n let splayPoint: PathPoint\n if (index === 0) {\n splayPoint = this.pathPoints[index + 1]!\n } else if (index === nPoints - 1) {\n splayPoint = this.pathPoints[index - 1]!\n } else {\n return\n }\n const face = component.boundaryFace(splayPoint)\n this.#repositionSplayPoint(splayPoint, index, face, component, centroidDelta)\n }\n\n #moveSplayPoint(splayPoint: PathPoint, boundaryPoint: PathPoint, position: PointLike) {\n let intersections = boundaryPoint.component!.boundaryIntersections(position)\n if (intersections[1]) {\n const dirn = ['L', 'R'].includes(intersections[2]) ? 'H' : 'V'\n splayPoint.move(intersections[1], {\n noAlignX: dirn === 'H',\n noAlignY: dirn === 'V',\n fullSnap: false,\n resolution: 0.2\n })\n intersections = boundaryPoint.component!.boundaryIntersections(splayPoint, 0)\n }\n if (intersections[0]) {\n boundaryPoint.reassignPosition(intersections[0])\n }\n }\n\n #updateComponentBoundaryPoint(boundaryPoint: PathPoint, position: PointLike) {\n const intersections = boundaryPoint.component!.boundaryIntersections(position, 0)\n if (intersections[0]) {\n boundaryPoint.reassignPosition(intersections[0])\n }\n }\n\n protected movePathPoint(position: PointLike) {\n const pathPoint = this.movePoint!\n const startPosition = Point.fromPoint(pathPoint)\n const nPoints = this.pathPoints.length\n if (this.moveIndex === 1) {\n // first splay point\n this.#moveSplayPoint(pathPoint, this.pathPoints[this.moveIndex - 1]!, position)\n const dirn = direction(startPosition, this.pathPoints[2]!)\n if (\n (dirn === 'H' && !roundEqual(pathPoint.y, this.pathPoints[2]!.y)) || //pathPoint.y !== this.pathPoints[2].y\n (dirn === 'V' && !roundEqual(pathPoint.x, this.pathPoints[2]!.x))\n ) {\n //pathPoint.x !== this.pathPoints[2].x) {\n this.#splitPath(dirn, 1)\n }\n } else if (this.moveIndex === nPoints - 2) {\n // last splay point\n this.#moveSplayPoint(pathPoint, this.pathPoints[this.moveIndex + 1]!, position)\n const dirn = direction(startPosition, this.pathPoints[nPoints - 3]!)\n if (\n (dirn === 'H' && !roundEqual(pathPoint.y, this.pathPoints[nPoints - 3]!.y)) || //pathPoint.y !== this.pathPoints[nPoints-3].y\n (dirn === 'V' && !roundEqual(pathPoint.x, this.pathPoints[nPoints - 3]!.x))\n ) {\n //pathPoint.x !== this.pathPoints[nPoints-3].x) {\n this.#splitPath(dirn, nPoints - 3)\n }\n } else {\n let alignedPosition = editGuides.gridAlign(pathPoint.offsetPoint(position))\n if (this.moveIndex === 2) {\n const dirn = direction(this.pathPoints[1]!, this.pathPoints[2]!)\n if (this.firstElement.containsPoint(alignedPosition, CONNECTION_SPLAY_PADDING)) {\n if (dirn === 'H') {\n alignedPosition = new Point(this.pathPoints[1]!.x, alignedPosition.y)\n } else {\n alignedPosition = new Point(alignedPosition.x, this.pathPoints[1]!.y)\n }\n } else {\n if (dirn === 'H') {\n alignedPosition = alignedPosition.snapTo(new Point(this.pathPoints[1]!.x, alignedPosition.y))\n } else {\n alignedPosition = alignedPosition.snapTo(new Point(alignedPosition.x, this.pathPoints[1]!.y))\n }\n }\n } else if (\n this.moveIndex === nPoints - 3 &&\n this.lastElement.containsPoint(alignedPosition, CONNECTION_SPLAY_PADDING)\n ) {\n const dirn = direction(this.pathPoints[this.moveIndex]!, this.pathPoints[this.moveIndex + 1]!)\n if (this.lastElement.containsPoint(alignedPosition, CONNECTION_SPLAY_PADDING)) {\n if (dirn === 'H') {\n alignedPosition = new Point(this.pathPoints[this.moveIndex + 1]!.x, alignedPosition.y)\n } else {\n alignedPosition = new Point(alignedPosition.x, this.pathPoints[this.moveIndex + 1]!.y)\n }\n } else {\n if (dirn === 'H') {\n alignedPosition = alignedPosition.snapTo(\n new Point(this.pathPoints[this.moveIndex + 1]!.x, alignedPosition.y)\n )\n } else {\n alignedPosition = alignedPosition.snapTo(\n new Point(alignedPosition.x, this.pathPoints[this.moveIndex + 1]!.y)\n )\n }\n }\n }\n pathPoint.move(alignedPosition, { noAlign: true, noOffset: true })\n if (nPoints >= 5) {\n if (this.moveIndex === 2) {\n // point after first splay point\n this.#updateComponentBoundaryPoint(\n this.pathPoints[this.moveIndex - 2]!,\n this.pathPoints[this.moveIndex - 1]!.point\n )\n }\n if (this.moveIndex === nPoints - 3) {\n // point befor last splay point\n this.#updateComponentBoundaryPoint(\n this.pathPoints[this.moveIndex + 2]!,\n this.pathPoints[this.moveIndex + 1]!.point\n )\n }\n }\n }\n }\n\n /*\n * 5) Path simplification is a process of edge renewal and joining, and happens at\n * the end of a move, immediately before the SVG <path> is set.\n * 6) Only ``H`` and ``V`` edges can be removed.\n * 6) An edge is removed if it has zero length; one end of this edge will be the node\n * used for the move operation.\n * 7) If the removed edge was connected to an ``S`` edge, simplification stops\n * with edge removal.\n * 8) Otherwise the two adjacent ``H`` or ``V`` edges of the removed edge are\n * combined and simplification stops.\n */\n protected simplifyPathPoints(): PathPoint[] | null {\n // Check for and remove identical control points\n\n const nPoints = this.pathPoints.length\n if (nPoints <= 4) {\n return null\n }\n // Work with a local copy so as not to change values in the original\n const pathPoints = this.pathPoints.map((cp) => cp.copy())\n const edges = getEdges(pathPoints)\n // First remove all zero length edges\n let index = 0\n const cleanEdges: PathEdge[] = []\n for (const edge of edges) {\n if (edge.direction === 'S') {\n cleanEdges.push(edge)\n } else {\n if (roundEqual(edge.length, 0)) {\n // remove index\n if (edges[index - 1]!.direction === 'S') {\n edge.pathPoints[1]!.removeSvgElement()\n edges[index + 1]!.pathPoints[0] = edge.pathPoints[0]\n } else if (edges[index + 1]!.direction === 'S') {\n edge.pathPoints[0].removeSvgElement()\n edges[index - 1]!.pathPoints[1] = edge.pathPoints[1]\n } else {\n edge.pathPoints[0].removeSvgElement()\n edge.pathPoints[1].removeSvgElement()\n edges[index + 1]!.pathPoints[0] = edge.pathPoints[0]\n edges[index - 1]!.pathPoints[1] = edge.pathPoints[1]\n }\n } else {\n cleanEdges.push(edge)\n }\n }\n index += 1\n }\n // Now combine adjacent edges with the same direction\n index = 0\n const newEdges: PathEdge[] = []\n while (index < cleanEdges.length) {\n const edge = cleanEdges[index]!\n if (edge.direction === 'S') {\n newEdges.push(edge)\n } else {\n let combinedEdge = edge\n while (index < cleanEdges.length - 1 && edge.direction === cleanEdges[index + 1]!.direction) {\n const newEdge = combinedEdge.combine(cleanEdges[index + 1]!)\n if (newEdge) {\n combinedEdge = newEdge\n } else {\n break\n }\n index += 1\n }\n newEdges.push(combinedEdge)\n }\n index += 1\n }\n const newPoints = newEdges.map((edge) => edge.pathPoints[0])\n newPoints.push(newEdges[newEdges.length - 1]!.pathPoints[1])\n if (newPoints.length === nPoints) {\n return null\n }\n return newPoints\n }\n}\n\n//==============================================================================\n","/******************************************************************************\n\nCellDL Editor\n\nCopyright (c) 2022 - 2025 David Brooks\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n******************************************************************************/\n\nimport SVGPathCommander from 'svg-path-commander'\nimport type { ShapeTypes } from 'svg-path-commander'\n\n//==============================================================================\n\nimport type { PointLike } from '@renderer/common/points'\nimport { alert } from '@editor/editor/alerts'\nimport { undoRedo, type EditorUndoAction, type UndoMovePosition } from '@editor/editor/undoredo'\n\nimport type { CellDLConnection } from '@editor/celldlObjects/index'\nimport { ConnectionStyle } from '@editor/connections/index'\n\n//==============================================================================\n\nimport { ID_PART_SEPARATOR, type PathElement } from './pathelement'\nimport { LinearPath } from './linearpath'\nimport { RectilinearPath } from './rectilinearpath'\nimport { CellDLSVGElement } from './index'\nimport type { BoundedElement } from './boundedelement'\n\n//==============================================================================\n\nconst shapeTags = ['line', 'polyline', 'polygon', 'ellipse', 'circle', 'rect', 'glyph']\nconst svgPathTag = 'path'\nconst svgGroupTag = 'g'\n\n//==============================================================================\n\nexport class SvgConnection extends CellDLSVGElement {\n #pathElements: PathElement[] = []\n #moveableElement: PathElement | null = null\n #undoMoveAction: EditorUndoAction | null = null\n\n constructor(connection: CellDLConnection, svgElement: SVGGraphicsElement, style: ConnectionStyle) {\n super(connection, svgElement)\n\n const svgPaths: SVGPathElement[] = []\n if (shapeTags.includes(svgElement.tagName)) {\n SVGPathCommander.shapeToPath(svgElement as ShapeTypes, true)\n }\n if (svgElement.tagName === svgPathTag) {\n svgPaths.push(<SVGPathElement>svgElement)\n } else if (svgElement.tagName === svgGroupTag) {\n for (const element of svgElement.children) {\n if (shapeTags.includes(element.tagName)) {\n SVGPathCommander.shapeToPath(element as ShapeTypes, true)\n }\n if (element.tagName === 'path') {\n svgPaths.push(<SVGPathElement>element)\n } else {\n throw new Error(`Connection ${connection.id}: SVG paths are not all 'path' elements`)\n }\n }\n } else {\n throw new Error(`Connection ${connection.id}: SVG is not a 'path' element`)\n }\n\n const connectorElements = connection.connectedObjects.map((cn) => <BoundedElement>cn.celldlSvgElement!)\n if (svgPaths.length === connectorElements.length - 1) {\n for (let n = 0; n < svgPaths.length; n += 1) {\n const pathId = `${svgElement.id}${ID_PART_SEPARATOR}${n + 1}`\n const svgPath = svgPaths[n]\n this.#pathElements[n] =\n // @ts-expect-error: `n < svgPaths.length` and so `svgPath` is defined\n style === ConnectionStyle.Rectilinear || svgPath.classList.contains('rectilinear')\n ? new RectilinearPath(\n connection,\n pathId,\n // @ts-expect-error\n svgPath,\n connectorElements[n],\n connectorElements[n + 1]\n )\n : new LinearPath(\n connection,\n pathId,\n // @ts-expect-error\n svgPath,\n connectorElements[n],\n connectorElements[n + 1]\n )\n }\n } else {\n alert.elementError(`Connection ${connection.id}: wrong number of paths for connectors`, this.svgElement)\n }\n }\n\n get pathElements(): PathElement[] {\n return this.#pathElements\n }\n\n clearControlHandles() {\n this.#pathElements.forEach((element) => element.clearControlHandles(this.selected))\n }\n\n drawControlHandles() {\n this.#pathElements.forEach((element) => element.drawControlHandles(this.selected))\n }\n\n clearSelectedHandles() {\n if (this.selected) {\n this.#pathElements.forEach((element) => element.clearControlHandles(false))\n }\n }\n\n drawSelectedHandles() {\n if (this.selected) {\n this.#pathElements.forEach((element) => element.drawControlHandles(true))\n }\n }\n\n endMove() {\n if (this.#moveableElement) {\n this.#moveableElement.endMove(this.selected)\n this.#moveableElement = null\n this.#undoMoveAction = null\n }\n }\n\n isMoveable(svgElement: SVGGraphicsElement): boolean {\n if (svgElement.dataset.controlIndex) {\n const indices = svgElement.dataset.controlIndex\n .split(ID_PART_SEPARATOR)\n .slice(-2)\n .map((n) => +n)\n // @ts-expect-error: `0` and `1` indexes are in range\n if (indices[0] > 0 && indices[0] <= this.#pathElements.length) {\n // @ts-expect-error:\n if (this.#pathElements[indices[0] - 1].isMoveable(indices[1])) {\n // @ts-expect-error:\n this.#moveableElement = this.#pathElements[indices[0] - 1] || null\n return true\n }\n }\n }\n this.#moveableElement = null\n return false\n }\n\n move(position: PointLike) {\n if (this.#moveableElement && this.#undoMoveAction) {\n if (this.#moveableElement.move(position)) {\n this.#undoMoveAction.endMove(this.#moveableElement.moveIndex, this.#moveableElement.movePoint!.point)\n this.#moveableElement.redraw()\n }\n }\n }\n\n redraw() {\n this.#pathElements.forEach((element) => element.redraw())\n super.redraw()\n }\n\n remove() {\n super.remove()\n this.#pathElements.forEach((element) => element.remove())\n }\n\n startMove(svgPoint: PointLike) {\n if (this.#moveableElement && this.#moveableElement.movePoint) {\n this.#undoMoveAction = undoRedo.undoMoveAction()\n this.#undoMoveAction.addObjectDetails(this.celldlObject)\n this.#undoMoveAction.startMove(this.#moveableElement.moveIndex, this.#moveableElement.movePoint.point)\n this.#moveableElement.startMove(svgPoint)\n }\n }\n\n undoControlMove(undoPosition: UndoMovePosition) {\n if (this.#moveableElement && undoPosition) {\n this.#moveableElement.undoControlMove(undoPosition[0], undoPosition[1])\n }\n }\n}\n\n//==============================================================================\n","/******************************************************************************\n\nCellDL Editor\n\nCopyright (c) 2022 - 2025 David Brooks\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n******************************************************************************/\n\nimport { Point, type PointLike } from '@renderer/common/points'\nimport type { Constructor, PropertiesType } from '@renderer/common/types'\n\nimport { alert } from '@editor/editor/alerts'\nimport { editGuides } from '@editor/editor/editguides'\nimport type { UndoMovePosition } from '@editor/editor/undoredo'\n\nimport { BoundedElement } from '@editor/SVGElements/boundedelement'\nimport type { ObjectTemplate } from '@editor/components/index'\nimport type { ConnectionStyle } from '@editor/connections/index'\nimport type { CellDLDiagram } from '@editor/diagram/index'\nimport { SvgConnection } from '@editor/SVGElements/svgconnection'\nimport type { CellDLSVGElement } from '@editor/SVGElements/index'\n\nimport * as $rdf from '@renderer/metadata/index'\nimport type { MetadataPropertiesMap, NamedNode } from '@renderer/metadata/index'\nimport { CELLDL, RDF, RDFS } from '@renderer/metadata/index'\nimport { componentLibraryPlugin } from '@renderer/plugins/index'\n\n//==============================================================================\n\nexport enum CELLDL_STYLE_CLASS { // these are SVG styling class names, not types\n Annotation = 'celldl-Annotation',\n Component = 'celldl-Component',\n Connector = 'celldl-Connector',\n Connection = 'celldl-Connection',\n Conduit = 'celldl-Conduit',\n Compartment = 'celldl-Compartment',\n Interface = 'celldl-InterfacePort',\n Layer = 'celldl-Layer',\n UnconnectedPort = 'celldl-Unconnected',\n Unknown = ''\n}\n\n//==============================================================================\n\n/*\nclass BranchPoint implements PointLike {\n x: number = 0.0\n y: number = 0.0\n #connection: CellDLConnection\n\n // should we not pass in position/offset in range (0.0, 1.0)?\n // and have a separate `setLocation()`??\n constructor(connection: CellDLConnection, x: number, y: number)\n {\n this.#connection = connection\n this.x = x\n this.y = y\n }\n}\n*/\n\n//==============================================================================\n\nexport class CellDLObject {\n static celldlStyleClass: CELLDL_STYLE_CLASS = CELLDL_STYLE_CLASS.Unknown\n static celldlTypeName: string = 'Object'\n\n #celldlStyleClass: CELLDL_STYLE_CLASS\n #celldlDiagram: CellDLDiagram\n #celldlSvgElement: CellDLSVGElement|undefined\n #celldlTypeName: string\n\n #label: string | null = null\n #name: string = ''\n #moveable: boolean = false\n\n #metadataProperties!: MetadataPropertiesMap\n #objectTemplate: ObjectTemplate|undefined\n\n #children: Map<string, CellDLObject> = new Map()\n #parents: Map<string, CellDLObject> = new Map()\n\n #pluginData: Map<string, object> = new Map()\n\n constructor(\n public readonly uri: NamedNode,\n objectTemplate: ObjectTemplate,\n readonly options: PropertiesType = {},\n celldlDiagram: CellDLDiagram,\n updateStore: boolean=true\n ) {\n this.#celldlDiagram = celldlDiagram\n // @ts-expect-error: celldlStyleClass is a member of the object's constructor\n this.#celldlStyleClass = this.constructor.celldlStyleClass\n // @ts-expect-error: celldlType is a member of the object's constructor\n this.#celldlTypeName = this.constructor.celldlTypeName\n this.#objectTemplate = objectTemplate\n this.#name = objectTemplate?.name || ''\n\n this.#setMetadataProperties(objectTemplate.metadataProperties)\n\n if (updateStore) {\n celldlDiagram.rdfStore.addMetadataPropertiesForSubject(uri, this.#metadataProperties)\n }\n\n // Get data that plugins need to associate with the object\n\n this.#pluginData = componentLibraryPlugin.getPluginData(this, celldlDiagram.rdfStore)\n }\n\n toString(): string {\n return `${this.#celldlStyleClass} ${this.id}`\n }\n\n get celldlStyleClass() {\n return this.#celldlStyleClass\n }\n\n get celldlDiagram() {\n return this.#celldlDiagram\n }\n\n get celldlSvgElement() {\n return this.#celldlSvgElement\n }\n setCelldlSvgElement(celldlSvgElement: CellDLSVGElement) {\n this.#celldlSvgElement = celldlSvgElement\n }\n\n get hasEditGuides() {\n return false\n }\n\n get id(): string {\n return this.uri.id()\n }\n\n isA(rdfType: NamedNode) {\n return CELLDL.uri(this.#celldlTypeName).equals(rdfType) || this.#metadataProperties.isA(rdfType)\n }\n\n get isAlignable() {\n return true\n }\n\n get isAnnotation() {\n return this.#celldlTypeName === 'Annotation'\n }\n\n get isComponent() {\n // Conduits are a component sub-class\n return this.#celldlTypeName === 'Component' || this.#celldlTypeName === 'Conduit'\n }\n\n get isConduit() {\n return this.#celldlTypeName === 'Conduit'\n }\n\n get isConnectable() {\n return false\n }\n\n get isConnection() {\n return this.#celldlTypeName === 'Connection'\n }\n\n get isConnector() {\n return this.#celldlTypeName === 'Connector'\n }\n\n get isCompartment() {\n return this.#celldlTypeName === 'Compartment'\n }\n\n get isInterface() {\n return this.#celldlTypeName === 'Interface'\n }\n\n get isUnconnectedPort() {\n return this.#celldlTypeName === 'UnconnectedPort'\n }\n\n get label() {\n return this.#label\n }\n\n // Additional metadata about sub-classed instances\n get metadataProperties() {\n return this.#metadataProperties\n }\n\n get moveable() {\n return this.#moveable\n }\n\n get name() {\n return this.#name\n }\n\n get objectTemplate() {\n return this.#objectTemplate\n }\n\n get selected() {\n return this.#celldlSvgElement?.selected\n }\n\n get svgElement() {\n return this.#celldlSvgElement?.svgElement || null\n }\n\n get pluginIds(): string[] {\n return [...this.#pluginData.keys()]\n }\n\n pluginData(pluginId: string): object {\n return this.#pluginData.get(pluginId) || {}\n }\n\n activate(active = true) {\n this.#celldlSvgElement?.activate(active)\n }\n\n attach(parent: CellDLObject) {\n this.#parents.set(parent.id, parent)\n parent.#children.set(this.id, this)\n }\n\n containsPoint(point: PointLike): boolean {\n return this.#celldlSvgElement?.containsPoint(point) || false\n }\n\n initialiseMove(svgElement: SVGGraphicsElement) {\n this.#moveable = this.#celldlSvgElement?.isMoveable(svgElement) || false\n if (this.#moveable) {\n svgElement.style.setProperty('cursor', 'move')\n }\n }\n\n startMove(svgPoint: PointLike) {\n this.#celldlSvgElement?.startMove(svgPoint)\n }\n\n move(svgPoint: PointLike) {\n this.#celldlSvgElement?.move(svgPoint)\n }\n\n endMove() {\n this.#celldlSvgElement?.endMove()\n }\n\n finaliseMove() {\n this.#moveable = false\n }\n\n clearControlHandles() {\n this.#celldlSvgElement?.clearControlHandles()\n }\n\n drawControlHandles() {\n this.#celldlSvgElement?.drawControlHandles()\n }\n\n highlight(highlight = true) {\n this.#celldlSvgElement?.highlight(highlight)\n }\n\n undoControlMove(undoPosition: UndoMovePosition) {\n this.#celldlSvgElement?.undoControlMove(undoPosition)\n }\n\n redraw() {\n if (this.#celldlSvgElement) {\n this.#celldlSvgElement.redraw()\n }\n }\n\n select(selected = true) {\n this.#celldlSvgElement?.select(selected)\n }\n\n setName(name: string) {\n this.#name = name\n }\n\n assignSvgElement(_svgElement: SVGGraphicsElement, _align: boolean) {\n }\n\n #setMetadataProperties(properties: MetadataPropertiesMap) {\n // Create a new MetadataPropertiesMap rather than storing a reference\n const metadataProperties = properties.copy()\n metadataProperties.setProperty(RDF.uri('type'), CELLDL.uri(this.#celldlTypeName), true)\n this.#metadataProperties = metadataProperties\n const label = properties.get(RDFS.uri('label').value)\n if (label && $rdf.isLiteral(label)) {\n this.#label = (label as $rdf.Literal).value\n }\n }\n}\n\n//==============================================================================\n\nexport class CellDLMoveableObject extends CellDLObject {\n startMove(svgPoint: PointLike) {\n editGuides.removeGuide(this)\n super.startMove(svgPoint)\n }\n\n move(svgPoint: PointLike) {\n super.move(svgPoint)\n editGuides.matchGuide(this) // Highliglight guides that our centroid's now on\n }\n\n endMove() {\n super.endMove()\n editGuides.addGuide(this)\n }\n\n redraw() {\n editGuides.removeGuide(this)\n super.redraw()\n editGuides.addGuide(this)\n }\n\n assignSvgElement(svgElement: SVGGraphicsElement, align: boolean) {\n new BoundedElement(this, svgElement, this.isAlignable, align)\n }\n}\n\n//==============================================================================\n\nexport class CellDLAnnotation extends CellDLMoveableObject {\n static celldlStyleClass = CELLDL_STYLE_CLASS.Annotation\n static celldlTypeName = 'Annotation'\n\n get hasEditGuides() {\n return true\n }\n}\n\n//==============================================================================\n\nexport class CellDLConnectedObject extends CellDLMoveableObject {\n static celldlTypeName = 'Connector'\n\n #connections: Map<string, CellDLConnection> = new Map()\n #maxConnections: number\n\n constructor(\n uri: NamedNode,\n objectTemplate: ObjectTemplate,\n options: PropertiesType = {},\n celldlDiagram: CellDLDiagram\n ) {\n super(uri, objectTemplate, options, celldlDiagram)\n this.#maxConnections = componentLibraryPlugin.getMaxConnections(this)\n }\n\n\n toString(): string {\n return `${super.toString()} Connections: ${[...this.#connections.keys()].join(', ')}`\n }\n\n get connections(): CellDLConnection[] {\n return [...this.#connections.values()]\n }\n\n get isConnectable() {\n return true\n }\n\n get maxConnections(): number {\n return this.#maxConnections\n }\n\n get numConnections(): number {\n return this.#connections.size\n }\n\n getConnection(id: string): CellDLConnection | null {\n return this.#connections.get(id) || null\n }\n\n addConnection(connection: CellDLConnection) {\n if (this.numConnections < this.maxConnections) {\n this.#connections.set(connection.id, connection)\n } else {\n alert.elementError(\n `${this.id}: Cannot add ${connection.id} -- connection limit reached`,\n this.celldlSvgElement ? this.celldlSvgElement.svgElement : undefined\n )\n }\n }\n\n deleteConnection(connection: CellDLConnection) {\n this.#connections.delete(connection.id)\n }\n\n startMove(svgPoint: PointLike) {\n super.startMove(svgPoint)\n // Remove control handles from selected connections\n this.#connections.forEach(connection => {\n connection.clearSelectedHandles()\n })\n }\n\n endMove() {\n super.endMove()\n // Add control handles to selected connections\n this.#connections.forEach(connection => {\n connection.drawSelectedHandles()\n })\n }\n\n redraw() {\n super.redraw()\n // Redraw connections that depend on our position\n this.#connections.forEach(connection => {\n connection.redraw()\n })\n }\n}\n\n//==============================================================================\n\nexport class CellDLComponent extends CellDLConnectedObject {\n static celldlStyleClass = CELLDL_STYLE_CLASS.Component\n static celldlTypeName = 'Component'\n\n get hasEditGuides() {\n return true\n }\n}\n\n//==============================================================================\n\nexport class CellDLConduit extends CellDLComponent {\n static readonly celldlStyleClass = CELLDL_STYLE_CLASS.Conduit\n static celldlTypeName = 'Conduit'\n}\n\n//==============================================================================\n\nexport class CellDLCompartment extends CellDLConnectedObject {\n static readonly celldlStyleClass = CELLDL_STYLE_CLASS.Compartment\n static celldlTypeName = 'Compartment'\n\n #interfacePorts: CellDLInterface[] = []\n\n constructor(\n uri: NamedNode,\n objectTemplate: ObjectTemplate,\n options: PropertiesType = {},\n celldlDiagram: CellDLDiagram\n ) {\n super(uri, objectTemplate, options, celldlDiagram)\n this.#interfacePorts = objectTemplate.metadataProperties\n .getPropertyAsArray(CELLDL.uri('hasInterface'))\n .map((node) => <CellDLInterface>celldlDiagram.getConnector(node))\n .filter((node) => node != null)\n }\n\n toString(): string {\n return `${super.toString()} Ports: ${this.#interfacePorts.map((c) => c.id).join(', ')}`\n }\n\n get interfacePorts() {\n return this.#interfacePorts\n }\n\n get isAlignable() {\n return false\n }\n\n startMove(svgPoint: PointLike) {\n super.startMove(svgPoint)\n }\n\n move(svgPoint: PointLike) {\n super.move(svgPoint)\n // A move of the compartment moves the end of outgoing connections.\n for (const port of this.#interfacePorts) {\n port.move(svgPoint)\n }\n }\n\n endMove() {\n super.endMove()\n for (const port of this.#interfacePorts) {\n port.endMove()\n }\n }\n}\n\n//==============================================================================\n\nexport class CellDLConnection extends CellDLObject {\n static readonly celldlStyleClass = CELLDL_STYLE_CLASS.Connection\n static celldlTypeName = 'Connection'\n\n #connectedObjects: CellDLConnectedObject[] = []\n #svgConnection: SvgConnection|null = null\n\n constructor(\n uri: NamedNode,\n objectTemplate: ObjectTemplate,\n options: PropertiesType = {},\n celldlDiagram: CellDLDiagram\n ) {\n super(uri, objectTemplate, options, celldlDiagram)\n const metadata = objectTemplate.metadataProperties\n const source = celldlDiagram.getConnector(metadata.getProperty(CELLDL.uri('hasSource')))\n const target = celldlDiagram.getConnector(metadata.getProperty(CELLDL.uri('hasTarget')))\n const intermediates: CellDLConnectedObject[] = metadata\n .getPropertyAsArray(CELLDL.uri('hasIntermediate'))\n .map((node) => celldlDiagram.getConnector(node))\n .filter((node) => node != null)\n if (source && target) {\n this.#connectedObjects = [source, ...intermediates, target]\n for (const connector of this.#connectedObjects) {\n connector.addConnection(this)\n }\n } else {\n alert.elementError(\n `Connection ${this.id} has no source and/or target...`,\n this.celldlSvgElement ? this.celldlSvgElement.svgElement : undefined\n )\n }\n }\n\n toString(): string {\n return `${super.toString()} Connecting: ${this.#connectedObjects.map((c) => c.id).join(', ')}`\n }\n\n get connectedObjects() {\n return this.#connectedObjects\n }\n\n get intermediates(): CellDLConnectedObject[] {\n return this.#connectedObjects.slice(1, -1)\n }\n\n get isAlignable() {\n return false\n }\n\n get source(): CellDLConnectedObject | null {\n return this.#connectedObjects[0] || null\n }\n\n get target(): CellDLConnectedObject | null {\n return this.#connectedObjects.length > 1 ? this.#connectedObjects.at(-1) : null\n }\n\n assignSvgElement(svgElement: SVGGraphicsElement, _align: boolean) {\n this.#svgConnection = new SvgConnection(this, svgElement, this.options.style as ConnectionStyle)\n }\n\n clearSelectedHandles() {\n if (this.#svgConnection) {\n this.#svgConnection.clearSelectedHandles()\n }\n }\n\n drawSelectedHandles() {\n if (this.#svgConnection) {\n this.#svgConnection.drawSelectedHandles()\n }\n }\n}\n\n//==============================================================================\n\nexport class CellDLInterface extends CellDLConnectedObject {\n static readonly celldlStyleClass = CELLDL_STYLE_CLASS.Interface\n static celldlTypeName = 'Interface'\n\n #externalConnections: CellDLConnection[] = []\n\n toString(): string {\n return `${super.toString()} External: ${this.#externalConnections.map((c) => c.id).join(', ')}`\n }\n\n get externalConnections(): CellDLConnection[] {\n return this.#externalConnections\n }\n\n get isAlignable() {\n return false\n }\n\n addExternalConnection(connection: CellDLConnection) {\n this.#externalConnections.push(connection)\n }\n\n move(_svgPoint: PointLike) {\n const component = <BoundedElement>this.celldlSvgElement\n const svgElement = <SVGGraphicsElement>this.celldlDiagram.svgDiagram.getElementById(component.id)\n const bounds = svgElement.getBoundingClientRect()\n const centre = new Point((bounds.left + bounds.right) / 2, (bounds.top + bounds.bottom) / 2)\n const centroid = Point.fromPoint(this.celldlDiagram.domToSvgCoords(centre))\n const savedCentroid = component.centroid\n component.setCentroid(centroid)\n component.unlimitDirection()\n const centroidDelta = component.centroid.subtract(savedCentroid)\n for (const connection of this.#externalConnections) {\n for (const path of (<SvgConnection>connection.celldlSvgElement).pathElements) {\n path.componentBoundingBoxMoved(component, centroidDelta)\n }\n connection.redraw()\n }\n }\n\n endMove() {\n for (const connection of this.#externalConnections) {\n for (const path of (<SvgConnection>connection.celldlSvgElement).pathElements) {\n path.endMove()\n }\n }\n }\n}\n\n//==============================================================================\n\nexport class CellDLUnconnectedPort extends CellDLConnectedObject {\n static readonly celldlStyleClass = CELLDL_STYLE_CLASS.UnconnectedPort\n static celldlTypeName = 'UnconnectedPort'\n}\n\n//==============================================================================\n//==============================================================================\n\nexport const CELLDL_CLASS_MAP: Map<string, Constructor<CellDLObject>> = new Map([\n ['Annotation', CellDLAnnotation],\n ['Compartment', CellDLCompartment],\n ['Component', CellDLComponent],\n ['Conduit', CellDLConduit],\n ['Connector', CellDLConnectedObject],\n ['Connection', CellDLConnection],\n ['Interface', CellDLInterface],\n ['UnconnectedPort', CellDLUnconnectedPort],\n])\n\n//==============================================================================\n//==============================================================================\n","/******************************************************************************\n\nCellDL Editor\n\nCopyright (c) 2022 - 2025 David Brooks\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n******************************************************************************/\n/** biome-ignore-all lint/style/noNonNullAssertion: <keys exist in Map> */\n\nimport * as vue from 'vue'\n\n//==============================================================================\n\nimport type {\n CellDLConnection,\n CellDLObject\n} from '@editor/celldlObjects/index'\nimport { CELLDL_CLASS_MAP } from '@editor/celldlObjects/index'\nimport type { Constructor } from '@renderer/common/types'\nimport type {\n ComponentLibrary,\n LibraryComponentTemplate,\n ObjectTemplate,\n} from '@editor/components/index'\nimport type {\n PropertyGroup,\n StyleObject,\n ValueChange\n} from '@editor/components/properties'\nimport { STYLING_GROUP } from '@editor/components/properties'\nimport type {\n MetadataPropertiesMap,\n RdfStore,\n SubjectType\n} from '@renderer/metadata/index'\nimport { CELLDL_URI, fragment, SPARQL_PREFIXES } from '@renderer/metadata/index'\n\n//==============================================================================\n\nexport interface ConnectionStatus {\n alert?: string\n domain?: string\n}\n\n//==============================================================================\n\nexport interface PluginInterface {\n id: string\n\n componentLibrary: ComponentLibrary\n getPropertyGroups: () => PropertyGroup[]\n styleRules: () => string\n svgDefinitions: () => string\n\n newDocument: (uri: string, rdfStore: RdfStore) => void\n addDocumentMetadataToStore: (rdfStore: RdfStore) => void\n getPluginData: (celldlObject: CellDLObject, rdfStore: RdfStore) => object\n\n addNewConnection: (connection: CellDLConnection, rdfStore: RdfStore) => void\n checkConnectionValid: (startObject: CellDLObject, endObject: CellDLObject) => ConnectionStatus|undefined\n deleteConnection: (connection: CellDLConnection, rdfStore: RdfStore) => void\n getMaxConnections: (celldlObject: CellDLObject) => number\n\n getObjectTemplateById: (id: string) => ObjectTemplate|undefined\n getTemplateName: (rdfType: string) => string|undefined\n updateComponentProperties: (celldlObject: CellDLObject,\n componentProperties: PropertyGroup[], rdfStore: RdfStore) => void\n updateObjectProperties: (celldlObject: CellDLObject, itemId: string, value: ValueChange,\n componentProperties: PropertyGroup[], rdfStore: RdfStore) => Promise<void>\n updateComponentStyling: (celldlObject: CellDLObject, objectType: string, styling: StyleObject) => Promise<void>\n}\n\n//==============================================================================\n\nclass ComponentLibraryPlugin {\n static #instance: ComponentLibraryPlugin | null = null\n\n #app: vue.App|undefined = undefined\n #registeredPlugins: Map<string, PluginInterface> = new Map()\n\n #componentLibraries: ComponentLibrary[] = []\n #componentLibrariesRef = vue.ref<ComponentLibrary[]>(this.#componentLibraries)\n #currentDocumentUri: string = ''\n\n private constructor() {\n if (ComponentLibraryPlugin.#instance) {\n throw new Error('Use ComponentLibraryPlugin.instance instead of `new`')\n }\n ComponentLibraryPlugin.#instance = this\n }\n\n static get instance() {\n if (!ComponentLibraryPlugin.#instance) {\n ComponentLibraryPlugin.#instance = new ComponentLibraryPlugin()\n }\n return ComponentLibraryPlugin.#instance\n }\n\n install(app: vue.App, _options: object) {\n if (!this.#app) {\n app.provide<vue.Ref<ComponentLibrary[]>>('componentLibraries', this.#componentLibrariesRef)\n this.#app = app\n }\n }\n\n registerPlugin(plugin: PluginInterface) {\n if (!this.#registeredPlugins.has(plugin.id)) {\n this.#componentLibraries.push(plugin.componentLibrary)\n this.#registeredPlugins.set(plugin.id, plugin)\n }\n }\n\n getSelectedTemplate(): LibraryComponentTemplate|undefined {\n let selectedTemplate: LibraryComponentTemplate|undefined\n if (this.#componentLibraries.length &&\n this.#componentLibraries[0]!.templates.length) {\n\n // Select the default component template\n selectedTemplate = this.#componentLibraries[0]!.templates[0]\n if (selectedTemplate) {\n selectedTemplate.selected = true\n }\n }\n return selectedTemplate\n }\n\n //==========================================================================\n\n newDocument(uri: string, rdfStore: RdfStore) {\n this.#currentDocumentUri = uri\n for (const plugin of this.#registeredPlugins.values()) {\n plugin.newDocument(uri, rdfStore)\n }\n }\n\n addDocumentMetadataToStore(rdfStore: RdfStore) {\n for (const plugin of this.#registeredPlugins.values()) {\n plugin.addDocumentMetadataToStore(rdfStore)\n }\n }\n\n //==========================================================================\n\n addNewConnection(connection: CellDLConnection, rdfStore: RdfStore) {\n for (const plugin of this.#registeredPlugins.values()) {\n plugin.addNewConnection(connection, rdfStore)\n }\n }\n\n checkConnectionValid(startObject: CellDLObject, endObject: CellDLObject): ConnectionStatus|undefined\n {\n for (const plugin of this.#registeredPlugins.values()) {\n const status = plugin.checkConnectionValid(startObject, endObject)\n if (status) {\n return status\n }\n }\n }\n\n deleteConnection(connection: CellDLConnection, rdfStore: RdfStore) {\n for (const plugin of this.#registeredPlugins.values()) {\n plugin.deleteConnection(connection, rdfStore)\n }\n }\n\n getMaxConnections(celldlObject: CellDLObject): number {\n for (const pluginId of celldlObject.pluginIds) {\n const plugin = this.#registeredPlugins.get(pluginId)\n if (plugin) {\n return plugin.getMaxConnections(celldlObject)\n }\n }\n return Infinity\n }\n\n //==========================================================================\n\n getPluginData(celldlObject: CellDLObject, rdfStore: RdfStore): Map<string, object> {\n const pluginDataMap: Map<string, object> = new Map()\n for (const plugin of this.#registeredPlugins.values()) {\n pluginDataMap.set(plugin.id, plugin.getPluginData(celldlObject, rdfStore))\n }\n return pluginDataMap\n }\n\n getObjectTemplate(uri: SubjectType, metadata: MetadataPropertiesMap, rdfStore: RdfStore): ObjectTemplate|undefined {\n let CellDLClass: Constructor<CellDLObject>|undefined\n const rdfTypes: string[] = []\n const rows = rdfStore.query(`${SPARQL_PREFIXES}\n PREFIX : <${this.#currentDocumentUri}#>\n\n SELECT ?type WHERE {\n ${uri.toString()} a ?type\n }`\n )\n for (const r of rows) {\n const rdfType = r.get('type')!.value\n if (rdfType.startsWith(CELLDL_URI) && CELLDL_CLASS_MAP.has(fragment(rdfType))) {\n if (CellDLClass === undefined) {\n CellDLClass = CELLDL_CLASS_MAP.get(fragment(rdfType))\n }\n } else {\n rdfTypes.push(rdfType)\n }\n }\n if (CellDLClass) {\n const objectTemplate: ObjectTemplate = {\n CellDLClass: CellDLClass,\n metadataProperties: metadata\n }\n for (const plugin of this.#registeredPlugins.values()) {\n for (const rdfType of rdfTypes) {\n const name = plugin.getTemplateName(rdfType)\n if (name) {\n objectTemplate.name = name\n return objectTemplate\n }\n }\n }\n return objectTemplate\n }\n }\n\n getObjectTemplateById(fullId: string): ObjectTemplate|undefined {\n const pluginTemplateId = fullId.split('/')\n if (pluginTemplateId.length > 1) {\n const plugin = this.#registeredPlugins.get(pluginTemplateId[0]!)\n if (plugin) {\n return plugin.getObjectTemplateById(pluginTemplateId.slice(1).join('/'))\n }\n }\n }\n\n //==========================================================================\n\n updateComponentProperties(celldlObject: CellDLObject,\n componentProperties: PropertyGroup[], rdfStore: RdfStore): void {\n for (const pluginId of celldlObject.pluginIds) {\n const plugin = this.#registeredPlugins.get(pluginId)\n if (plugin) {\n plugin.updateComponentProperties(celldlObject, componentProperties, rdfStore)\n }\n }\n }\n\n async updateComponentStyling(celldlObject: CellDLObject, objectType: string, styling: StyleObject) {\n for (const pluginId of celldlObject.pluginIds) {\n const plugin = this.#registeredPlugins.get(pluginId)\n if (plugin) {\n await plugin.updateComponentStyling(celldlObject, objectType, styling)\n }\n }\n }\n\n async updateObjectProperties(celldlObject: CellDLObject, itemId: string, value: ValueChange,\n componentProperties: PropertyGroup[], rdfStore: RdfStore) {\n for (const pluginId of celldlObject.pluginIds) {\n const plugin = this.#registeredPlugins.get(pluginId)\n if (plugin) {\n await plugin.updateObjectProperties(celldlObject, itemId, value, componentProperties, rdfStore)\n }\n }\n }\n\n //==========================================================================\n\n getPropertyGroups(): PropertyGroup[] {\n const propertyGroups: PropertyGroup[] = []\n for (const plugin of this.#registeredPlugins.values()) {\n propertyGroups.push(...plugin.getPropertyGroups())\n }\n return propertyGroups\n }\n\n getStylingGroup(): PropertyGroup {\n return STYLING_GROUP\n }\n\n //==========================================================================\n\n // Global style rules and definitions added to the diagram's SVG\n\n styleRules(): string {\n const styling: string[] = []\n for (const plugin of this.#registeredPlugins.values()) {\n styling.push(plugin.styleRules())\n }\n return styling.join('\\n')\n }\n\n svgDefinitions(): string {\n const definitions: string[] = []\n for (const plugin of this.#registeredPlugins.values()) {\n definitions.push(plugin.svgDefinitions())\n }\n return definitions.join('\\n')\n }\n}\n\n//==============================================================================\n\n// Instantiate our plugin components. This will load the BondgraphPlugin\n// and hence BG template definitions from the BG-RDF framework\n\nexport const componentLibraryPlugin = ComponentLibraryPlugin.instance\n\n//==============================================================================\n//==============================================================================\n","/******************************************************************************\n\nCellDL Editor\n\nCopyright (c) 2022 - 2025 David Brooks\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n******************************************************************************/\n\nimport * as vue from 'vue'\n\nimport type * as locApi from '@renderer/libopencor/locUIJsonApi'\n\nimport type { CellDLObject } from '@editor/celldlObjects/index'\nimport type { NamedProperty } from '@editor/components/index'\n\nimport type { IPathStyle } from '@renderer/common/svgUtils'\nimport { DCT, RDFS, type RdfStore, SPARQL_PREFIXES } from '@renderer/metadata/index'\nimport { componentLibraryPlugin } from '@renderer/plugins/index'\n\n//==============================================================================\n\nexport type ItemDetails = locApi.IUiJsonInput & {\n itemId: string\n property: string\n value?: string|number\n units?: string\n optional?: boolean\n numeric?: boolean\n}\n\nexport type StyleObject = {\n fillColours?: string[]\n pathStyle?: IPathStyle\n}\n\nexport interface PropertyGroup {\n groupId: string\n items: ItemDetails[]\n styling?: StyleObject\n title: string\n}\n\nexport type StylingGroup = PropertyGroup & {\n styling: StyleObject\n}\n\nexport interface ValueChange {\n oldValue: string\n newValue: string\n}\n\n//==============================================================================\n\nexport const METADATA_GROUP_ID = 'cd-metadata'\n\nfunction OBJECT_METADATA(): NamedProperty[] {\n return [\n {\n name: 'Label',\n property: RDFS.uri('label').value\n },\n {\n name: 'Description',\n property: DCT.uri('description').value\n }\n ]\n}\n\nfunction METADATA_GROUP(): PropertyGroup {\n return {\n groupId: METADATA_GROUP_ID,\n title: 'Metadata',\n items: OBJECT_METADATA().map((nameUri: NamedProperty) => {\n return {\n itemId: nameUri.property,\n property: nameUri.property,\n name: nameUri.name,\n defaultValue: ''\n }\n })\n }\n}\n\n//==============================================================================\n\nexport const STYLING_GROUP_ID = 'object-styling'\n\nexport const STYLING_GROUP: PropertyGroup = {\n groupId: STYLING_GROUP_ID,\n title: 'Style',\n items: [],\n styling: {}\n}\n\n//==============================================================================\n//==============================================================================\n\nexport function getItemProperty(celldlObject: CellDLObject,\n itemTemplate: ItemDetails, rdfStore: RdfStore): ItemDetails|undefined {\n const objectUri = celldlObject.uri.toString()\n let value: string|undefined\n\n rdfStore.query(`${SPARQL_PREFIXES}\n PREFIX : <${celldlObject.celldlDiagram.uri}#>\n\n SELECT ?value WHERE {\n ${objectUri} <${itemTemplate.property}> ?value\n }`\n ).forEach((r) => {\n value = r.get('value')?.value\n })\n\n if (value === undefined) {\n if (!itemTemplate.optional) {\n return Object.assign({\n ...itemTemplate,\n value: itemTemplate.defaultValue || ''\n })\n }\n return undefined\n }\n if (itemTemplate.numeric) {\n const valueUnits = value.split(' ')\n return {\n ...itemTemplate,\n value: Number(valueUnits[0]),\n units: valueUnits[1]\n }\n }\n return {\n ...itemTemplate,\n value: value\n }\n}\n\n//==============================================================================\n\nexport function updateItemProperty(property: string, value: ValueChange,\n celldlObject: CellDLObject, rdfStore: RdfStore) {\n const objectUri = celldlObject.uri.toString()\n\n rdfStore.update(`${SPARQL_PREFIXES}\n PREFIX : <${celldlObject.celldlDiagram.uri}#>\n\n DELETE {\n ${objectUri} <${property}> ?value\n }\n WHERE {\n ${objectUri} <${property}> ?value\n }`)\n const newValue = String(value.newValue).trim()\n if (newValue) {\n rdfStore.update(`${SPARQL_PREFIXES}\n PREFIX : <${celldlObject.celldlDiagram.uri}#>\n\n INSERT DATA { ${objectUri} <${property}> \"\"\"${newValue.replace('\\\\', '\\\\\\\\')}\"\"\" }\n `)\n }\n}\n\n//==============================================================================\n\nexport class ObjectPropertiesPanel {\n #componentProperties = vue.ref<PropertyGroup[]>([])\n #propertyGroups: PropertyGroup[]\n #metadataIndex: number = -1\n\n constructor() {\n this.#propertyGroups = [\n ...componentLibraryPlugin.getPropertyGroups(),\n METADATA_GROUP(),\n componentLibraryPlugin.getStylingGroup()\n ]\n this.#propertyGroups.forEach((group, index) => {\n if (group.groupId === METADATA_GROUP_ID) {\n this.#metadataIndex = index\n }\n })\n this.#componentProperties.value = structuredClone(this.#propertyGroups)\n for (const group of this.#componentProperties.value) {\n group.items = []\n }\n // Make data available to the properties panel\n\n vue.provide<vue.Ref<PropertyGroup[]>>('componentProperties', this.#componentProperties)\n }\n\n //==================================\n\n clearObjectProperties() {\n // Clear each group's list of items\n for (const group of this.#componentProperties.value) {\n group.items = []\n if (group.styling) {\n group.styling = {}\n }\n }\n }\n\n setObjectProperties(celldlObject: CellDLObject|null, rdfStore: RdfStore) {\n this.clearObjectProperties()\n if (celldlObject) {\n // Update component properties with plugin specific values\n\n componentLibraryPlugin.updateComponentProperties(celldlObject, this.#componentProperties.value, rdfStore)\n\n if (this.#metadataIndex >= 0) {\n // Update component properties in the METADATA_GROUP\n\n // biome-ignore lint/style/noNonNullAssertion: `metadataIndex` is in range\n const group = this.#componentProperties.value[this.#metadataIndex]!\n METADATA_GROUP().items.forEach((itemTemplate: ItemDetails) => {\n const item = getItemProperty(celldlObject, itemTemplate, rdfStore)\n if (item) {\n group.items.push(item)\n }\n })\n }\n }\n }\n\n //==================================\n\n async updateObjectProperties(celldlObject: CellDLObject|null,\n itemId: string, value: ValueChange, rdfStore: RdfStore) {\n if (celldlObject) {\n // Save plugin specific component properties\n\n await componentLibraryPlugin.updateObjectProperties(celldlObject, itemId, value,\n this.#componentProperties.value, rdfStore)\n\n // Save component properties in the METADATA_GROUP\n\n // biome-ignore lint/style/noNonNullAssertion: `metadataIndex` is in range\n const metadataGroup = this.#propertyGroups[this.#metadataIndex]!\n for (const itemTemplate of metadataGroup.items) {\n if (itemId === itemTemplate.itemId) {\n updateItemProperty(itemTemplate.property, value, celldlObject, rdfStore)\n break\n }\n }\n }\n }\n\n //==================================\n\n async updateObjectStyling(celldlObject: CellDLObject|null, objectType: string, styling: StyleObject) {\n if (celldlObject) {\n await componentLibraryPlugin.updateComponentStyling(celldlObject, objectType, styling)\n }\n }\n}\n\n//==============================================================================\n//==============================================================================\n","/******************************************************************************\n\nCellDL Editor\n\nCopyright (c) 2022 - 2025 David Brooks\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n******************************************************************************/\n\nimport { intersect, type Point2D, type Shape, shape, type SvgElements, type SvgProperties } from 'svg-intersections'\n\n//==============================================================================\n\nexport class ShapeIntersections {\n #shape: Shape\n\n constructor(element: Element) {\n this.#shape = this.#shapeFromElement(element)\n }\n\n #shapeFromElement(element: Element): Shape {\n const elementName: SvgElements = <SvgElements>element.tagName\n const attrs = {}\n element.getAttributeNames().map((n) => {\n attrs[n] = element.getAttribute(n)\n })\n return shape(elementName, <SvgProperties<typeof elementName>>attrs)\n }\n\n intersections(element: Element): Point2D[] {\n const elementShape = this.#shapeFromElement(element)\n const i = intersect(this.#shape, elementShape)\n return i.points\n }\n}\n\n//==============================================================================\n","/******************************************************************************\n\nCellDL Editor\n\nCopyright (c) 2022 - 2025 David Brooks\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n******************************************************************************/\n\nimport Flatbush from 'flatbush'\nimport RBush from 'rbush'\n\n//==============================================================================\n\nimport type { CellDLObject } from '@editor/celldlObjects/index'\n\nimport type { Bounds } from './index'\n\n//==============================================================================\n\nexport type ContainedObject = {\n object: CellDLObject\n exact: boolean\n}\n\n//==============================================================================\n\nclass IdBounds {\n id: string\n bounds: Bounds\n\n constructor(celldlObject: CellDLObject) {\n this.bounds = celldlObject.celldlSvgElement!.svgBounds()\n this.id = celldlObject.id\n }\n}\n\n//==============================================================================\n\nclass ExtendableSpatialIndex extends RBush<IdBounds> {\n toBBox(item: IdBounds) {\n return {\n minX: item.bounds.left,\n minY: item.bounds.top,\n maxX: item.bounds.right,\n maxY: item.bounds.bottom\n }\n }\n\n compareMinX(a: IdBounds, b: IdBounds): number {\n return a.bounds.left - b.bounds.left\n }\n\n compareMinY(a: IdBounds, b: IdBounds): number {\n return a.bounds.top - b.bounds.top\n }\n\n remove(item: IdBounds) {\n return super.remove(item, (a, b) => a.id === b.id)\n }\n}\n\n//==============================================================================\n\nexport class CellDLSpatialIndex {\n #index: ExtendableSpatialIndex = new ExtendableSpatialIndex()\n #objects: Map<string, [CellDLObject, IdBounds]> = new Map()\n\n add(celldlObject: CellDLObject) {\n // An object, declared in metadata, might not have a corresponding SVG element...\n if (celldlObject.celldlSvgElement) {\n const item = new IdBounds(celldlObject)\n this.#index.insert(item)\n this.#objects.set(celldlObject.id, [celldlObject, item])\n }\n }\n\n remove(celldlObject: CellDLObject) {\n if (this.#objects.has(celldlObject.id)) {\n this.#index.remove(this.#objects.get(celldlObject.id)![1])\n this.#objects.delete(celldlObject.id)\n }\n }\n\n update(celldlObject: CellDLObject) {\n if (this.#objects.has(celldlObject.id)) {\n const savedItem = this.#objects.get(celldlObject.id)![1]\n const item = new IdBounds(celldlObject)\n if (!savedItem.bounds.equal(item.bounds)) {\n this.#index.remove(savedItem)\n this.#index.insert(item)\n this.#objects.get(celldlObject.id)![1] = item\n }\n }\n }\n\n objectsContainedIn(bounds: Bounds): ContainedObject[] {\n const intersectingItems = this.#index.search({\n minX: bounds.left,\n minY: bounds.top,\n maxX: bounds.right,\n maxY: bounds.bottom\n })\n return intersectingItems.map((item) => {\n return {\n object: this.#objects.get(item.id)![0],\n exact: item.bounds.inContainer(bounds)\n }\n })\n }\n}\n\n//==============================================================================\n\nexport type SpatialSearchResult = {\n object: CellDLObject\n bounds: Bounds\n}\n\n//==============================================================================\n\nexport class SpatialObjectIndex {\n #spatialBounds: Map<number, Bounds> = new Map()\n #spatialObjects: Map<number, CellDLObject> = new Map()\n #spatialObjectIndex: Flatbush | null = null\n\n constructor(celldlObjects: CellDLObject[]) {\n if (celldlObjects.length) {\n this.#spatialObjectIndex = new Flatbush(celldlObjects.length)\n for (const object of celldlObjects) {\n const bounds = object.celldlSvgElement!.svgBounds()\n const index = this.#spatialObjectIndex.add(...bounds.asArray())\n this.#spatialBounds.set(index, bounds)\n this.#spatialObjects.set(index, object)\n }\n this.#spatialObjectIndex.finish()\n }\n }\n\n search(bounds: Bounds): SpatialSearchResult[] {\n return this.#spatialObjectIndex\n ? this.#spatialObjectIndex.search(...bounds.asArray()).map((index) => {\n return {\n object: this.#spatialObjects.get(index)!,\n bounds: this.#spatialBounds.get(index)!\n }\n })\n : []\n }\n}\n\n//==============================================================================\n","/******************************************************************************\n\nCellDL Editor\n\nCopyright (c) 2022 - 2025 David Brooks\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n******************************************************************************/\n\nimport type { NormalArray } from 'svg-path-commander'\n\n//==============================================================================\n\nimport { POINT_EPSILON_SQUARED, Point, type PointLike } from '@renderer/common/points'\nimport { NormalTransform } from './transforms'\n\n//==============================================================================\n\nexport type FoundPoint = {\n point: PointLike\n offset: number | null\n segment: number | null\n}\n\n//==============================================================================\n\nexport class PointFinder {\n #transforms: NormalTransform[] = []\n\n constructor(pathArray: NormalArray) {\n const pathPoints = pathArray\n .filter((p) => ['M', 'L'].includes(p[0]))\n // @ts-expect-error: p.slice(1) will be two numbers\n .map((p) => Point.fromArray(p.slice(1)))\n for (let segment = 0; segment < pathPoints.length - 1; segment += 1) {\n this.#transforms.push(new NormalTransform(pathPoints[segment], pathPoints[segment + 1]))\n }\n }\n\n findPoint(point: PointLike): FoundPoint {\n for (let segment = 0; segment < this.#transforms.length; segment += 1) {\n const p = this.#transforms[segment].normalise(point)\n if (p.x >= 0 && p.x <= 1.0 && p.y * p.y < POINT_EPSILON_SQUARED) {\n return {\n point: this.#transforms[segment].invert({ x: p.x, y: 0 }),\n offset: segment + p.x,\n segment\n }\n }\n }\n return {\n point,\n offset: null,\n segment: null\n }\n }\n}\n\n//==============================================================================\n","/******************************************************************************\n\nCellDL Editor\n\nCopyright (c) 2022 - 2025 David Brooks\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n******************************************************************************/\n\nimport type { PointLike } from '@renderer/common/points'\nimport {\n CELLDL_BACKGROUND_CLASS,\n CellDLStylesheet,\n CONNECTION_COLOUR,\n OLD_CONNECTION_COLOUR\n} from '@renderer/common/styling'\nimport { svgCircleElement, SVG_URI, svgRectElement } from '@renderer/common/svgUtils'\nimport type { Constructor, StringProperties } from '@renderer/common/types'\n\nimport * as $rdf from '@renderer/metadata/index'\nimport {\n CELLDL,\n CELLDL_DECLARATIONS,\n DCT,\n type NamedNode,\n MetadataPropertiesMap,\n type MetadataPropertyValue,\n OWL,\n RDF\n} from '@renderer/metadata/index'\n\nimport type { Bounds, Extent } from '@editor/geometry/index'\nimport { ShapeIntersections } from '@editor/geometry/intersections'\nimport { CellDLSpatialIndex } from '@editor/geometry/spatialindex'\nimport type { ContainedObject } from '@editor/geometry/spatialindex'\nimport { lengthToPixels } from '@editor/geometry/units'\nimport { type FoundPoint, PointFinder } from '@editor/geometry/pathutils'\n\nimport {\n CellDLAnnotation,\n CellDLComponent,\n CellDLConduit,\n type CellDLConnectedObject,\n CellDLConnection,\n CellDLCompartment,\n CellDLInterface,\n type CellDLObject,\n CELLDL_STYLE_CLASS,\n CellDLUnconnectedPort\n} from '@editor/celldlObjects/index.ts'\n\nimport { setInternalIds } from '@editor/SVGElements/index'\nimport type { BoundedElement } from '@editor/SVGElements/boundedelement'\nimport type { SvgConnection } from '@editor/SVGElements/svgconnection'\n\nimport { type CellDLEditor, notifyChanges } from '@editor/editor/index'\nimport { editGuides } from '@editor/editor/editguides'\nimport { type EditorUndoAction, undoRedo } from '@editor/editor/undoredo'\n\nimport type { ObjectTemplate } from '@editor/components/index'\n\nimport { componentLibraryPlugin } from '@renderer/plugins/index'\n\n//==============================================================================\n\nexport const CELLDL_VERSION = '1.0'\n\n//==============================================================================\n\nfunction DIAGRAM_METADATA() {\n return {\n author: DCT.uri('creator'),\n created: DCT.uri('created'),\n description: DCT.uri('description'),\n modified: DCT.uri('modified'),\n title: DCT.uri('title'),\n celldlVersion: OWL.uri('versionInfo')\n }\n}\n\n//==============================================================================\n\nconst NEW_DIAGRAM_URI = 'file:///tmp/new_file.celldl'\n\n//==============================================================================\n\nconst CELLDL_DEFINITIONS_ID = 'celldl-svg-definitions'\nexport const CELLDL_METADATA_ID = 'celldl-rdf-metadata'\nconst CELLDL_STYLESHEET_ID = 'celldl-svg-stylesheet'\n\nconst DIAGRAM_MARGIN = 20\n\n//==============================================================================\n\nconst CELLDL_DIAGRAM_ID = 'celldl-diagram-layer'\n\nconst ID_PREFIX = 'ID-'\n\n//==============================================================================\n\nexport class CellDLDiagram {\n #svgDiagram!: SVGSVGElement\n\n #kb = new $rdf.RdfStore()\n #celldlEditor: CellDLEditor\n\n #documentNode: NamedNode\n #documentNS: $rdf.Namespace\n #filePath: string\n\n #diagramMetadata: Record<string, NamedNode>\n #diagramProperties: StringProperties = {}\n\n #currentLayer: SVGGElement | null = null\n #imported: boolean\n #lastIdentifier: number = 0\n #layers: Map<string, SVGGElement> = new Map()\n #objects: Map<string, CellDLObject> = new Map()\n #orderedLayerIds: string[] = []\n #spatialIndex = new CellDLSpatialIndex()\n\n constructor(filePath: string, celldlData: string, celldlEditor: CellDLEditor, importSvg: boolean = false) {\n this.#diagramMetadata = DIAGRAM_METADATA()\n this.#filePath = filePath\n this.#celldlEditor = celldlEditor\n this.#imported = importSvg\n if (this.#filePath !== '') {\n let documentUri = encodeURI(this.#filePath)\n if (\n !documentUri.startsWith('file:') &&\n !documentUri.startsWith('http:') &&\n !documentUri.startsWith('https:')\n ) {\n documentUri = `file://${documentUri}`\n }\n this.#documentNode = $rdf.namedNode(documentUri)\n this.#documentNS = new $rdf.Namespace(`${documentUri}#`)\n this.#loadCellDL(celldlData)\n this.#loadMetadata()\n } else {\n this.#documentNode = $rdf.namedNode(NEW_DIAGRAM_URI)\n this.#documentNS = new $rdf.Namespace(`${NEW_DIAGRAM_URI}#`)\n if (importSvg) {\n this.#importSvg(celldlData)\n } else {\n this.#newDiagram()\n }\n this.#initaliseMetadata()\n }\n this.#setLastIdentifier()\n this.#setupDefines()\n this.#setStylesheet()\n componentLibraryPlugin.newDocument(this.#documentNode.uri, this.#kb)\n }\n\n finishSetup() {\n // Called when the loaded diagram has been drawn as SVG\n this.#loadComponents()\n this.#loadInterfaces()\n this.#loadConduits()\n this.#loadConnections()\n this.#loadAnnotations()\n if (this.#imported) {\n // We want the file to be flagged as modified\n notifyChanges()\n }\n }\n\n async edit() {\n await this.#celldlEditor.editDiagram(this)\n }\n\n get editorFrame() {\n return this.#celldlEditor.editorFrame\n }\n\n get metadata(): StringProperties {\n return Object.keys(this.#diagramProperties)\n .filter((key) => key in this.#diagramMetadata)\n .reduce((obj: Record<string, any>, key: string) => {\n obj[key] = this.#diagramProperties[key]\n return obj\n }, {})\n }\n set metadata(data: StringProperties) {\n Object.keys(data)\n .filter((key) => key in this.#diagramMetadata)\n .forEach((key) => {\n // @ts-expect-error: `key` is a valid key for `data`\n this.#diagramProperties[key] = data[key]\n })\n notifyChanges()\n }\n\n get rdfStore() {\n return this.#kb\n }\n\n get svgDiagram() {\n return this.#svgDiagram\n }\n\n get uri(): string {\n return this.#documentNode.value\n }\n\n domToSvgCoords(domCoords: PointLike): DOMPoint {\n // Transform from screen coordinates to SVG coordinates\n const dom_to_svg_transform: DOMMatrix | undefined = this.#svgDiagram?.getScreenCTM()?.inverse()\n return DOMPoint.fromPoint(domCoords).matrixTransform(dom_to_svg_transform)\n }\n\n svgToDomCoords(svgCoords: PointLike): DOMPoint {\n // Transform from SVG coordinates to screen coordinates\n const svg_to_dom_transform: DOMMatrix | undefined = this.#svgDiagram?.getScreenCTM() as DOMMatrix\n return DOMPoint.fromPoint(svgCoords).matrixTransform(svg_to_dom_transform)\n }\n\n makeUri(id: string): NamedNode {\n return this.#documentNS.uri(id)\n }\n\n #nextIdentifier(): string {\n this.#lastIdentifier += 1\n return `${ID_PREFIX}${this.#lastIdentifier.toString().padStart(8, '0')}`\n }\n\n removeKnowledge(subject: NamedNode, predicates: NamedNode[]) {\n for (const predicate of predicates) {\n for (const stmt of this.#kb.statementsMatching(subject, predicate, null)) {\n if ($rdf.isBlankNode(stmt.object)) {\n // @ts-expect-error: `stmt.object` is a BlankNode\n this.#kb.removeStatements(stmt.object, null, null)\n }\n }\n this.#kb.removeStatements(subject, predicate, null)\n }\n }\n\n #loadDiagramProperties() {\n for (const [key, property] of Object.entries(this.#diagramMetadata)) {\n for (const stmt of this.#kb.statementsMatching(this.#documentNode, property, null)) {\n this.#diagramProperties[key] = stmt.object.value\n break\n }\n }\n }\n\n #saveDiagramProperties() {\n if (!('created' in this.#diagramProperties)) {\n this.#diagramProperties.created = new Date(Date.now()).toISOString()\n } else {\n this.#diagramProperties.modified = new Date(Date.now()).toISOString()\n }\n for (const [key, property] of Object.entries(this.#diagramMetadata)) {\n this.#kb.removeStatements(this.#documentNode, property, null)\n if (key in this.#diagramProperties) {\n const value = this.#diagramProperties[key]\n if (value && this.#documentNode) {\n this.#kb.add(this.#documentNode, property, $rdf.literal(value))\n }\n }\n }\n }\n\n #setLastIdentifier() {\n for (const element of this.#svgDiagram.querySelectorAll(`[id]`)) {\n if (element.id.startsWith(ID_PREFIX)) {\n const parts = element.id.substring(ID_PREFIX.length).split('-')\n if (parts.length) {\n const lastIdentifier = +parts[0]\n if (lastIdentifier > this.#lastIdentifier) {\n this.#lastIdentifier = lastIdentifier\n }\n }\n }\n }\n }\n\n #setupDefines() {\n // Make sure there is a <defs> and it has a arrow markers for connections\n // (and also a `free-end-connector` ??)\n let defsElement = this.#svgDiagram.getElementById(CELLDL_DEFINITIONS_ID)\n if (defsElement === null) {\n this.#svgDiagram.insertAdjacentHTML('afterbegin', `<defs></defs>`)\n defsElement = this.#svgDiagram.firstChild as SVGDefsElement\n defsElement.id = CELLDL_DEFINITIONS_ID\n defsElement.insertAdjacentHTML('afterbegin', componentLibraryPlugin.svgDefinitions())\n }\n }\n\n #setStylesheet() {\n const css = `${CellDLStylesheet}${componentLibraryPlugin.styleRules()}`\n let styleElement = this.#svgDiagram.querySelector(\n `defs#${CELLDL_DEFINITIONS_ID} > style#${CELLDL_STYLESHEET_ID}`\n )\n if (styleElement === null) {\n const defsElement = this.#svgDiagram.getElementById(CELLDL_DEFINITIONS_ID)\n styleElement = document.createElementNS(SVG_URI, 'style')\n styleElement.id = CELLDL_STYLESHEET_ID\n defsElement.prepend(styleElement)\n styleElement.textContent = css\n }\n }\n\n objectById(id: string): CellDLObject | null {\n return this.#objects.get(id) || null\n }\n\n #saveMetadata(svgDiagram: SVGSVGElement, metadata: string) {\n let metadataElement = svgDiagram.getElementById(CELLDL_METADATA_ID) as SVGMetadataElement\n if (metadataElement === null) {\n svgDiagram.insertAdjacentHTML('afterbegin', `<metadata id=\"${CELLDL_METADATA_ID}\"></metadata>`)\n metadataElement = svgDiagram.getElementById(CELLDL_METADATA_ID) as SVGMetadataElement\n }\n const parser = new DOMParser()\n const xmlDocument = parser.parseFromString('<xml></xml>', 'application/xml')\n const metadataContent = xmlDocument.createCDATASection(metadata)\n metadataElement.replaceChildren(metadataContent)\n metadataElement.dataset.contentType = $rdf.TurtleContentType\n }\n\n #importSvg(svgData: string) {\n this.#loadSvgDiagram(svgData)\n\n // Put all existing content into group with class of CELLDL_BACKGROUND_CLASS\n let backgroundGroup: SVGGraphicsElement | null | undefined\n const backgroundElements: SVGGraphicsElement[] = []\n const children = this.#svgDiagram.children\n for (let index = 0; index < children.length; ++index) {\n // biome-ignore lint/style/noNonNullAssertion: index is in range\n const child = children[index]!\n if (child.tagName !== 'defs') {\n backgroundElements.push(child as SVGGraphicsElement)\n if (child.tagName === 'g' && backgroundGroup === undefined) {\n backgroundGroup = child as SVGGraphicsElement\n } else {\n backgroundGroup = null\n }\n }\n }\n if (!backgroundGroup) {\n backgroundGroup = document.createElementNS(SVG_URI, 'g')\n this.#svgDiagram.appendChild(backgroundGroup)\n for (const child of backgroundElements) {\n backgroundGroup.appendChild(child)\n }\n }\n backgroundGroup.setAttribute('class', CELLDL_BACKGROUND_CLASS)\n this.#setLayer(CELLDL_DIAGRAM_ID)\n }\n\n #loadCellDL(celldlData: string) {\n this.#loadSvgDiagram(celldlData)\n this.#findLayers()\n this.#setLayer(CELLDL_DIAGRAM_ID)\n }\n\n #loadSvgDiagram(svgData: string) {\n const parser = new DOMParser()\n const svgDocument = parser.parseFromString(svgData, 'image/svg+xml')\n const svgDiagram = <SVGSVGElement>svgDocument.firstElementChild\n if (svgDiagram.hasAttribute('width') && svgDiagram.hasAttribute('height')) {\n const width = lengthToPixels(<string>svgDiagram.getAttribute('width'))\n const height = lengthToPixels(<string>svgDiagram.getAttribute('height'))\n if (width !== null && height !== null) {\n svgDiagram.attributes.removeNamedItem('width')\n svgDiagram.attributes.removeNamedItem('height')\n if (!svgDiagram.hasAttribute('viewBox')) {\n svgDiagram.setAttribute('viewBox', `0 0 ${width} ${height}`)\n }\n }\n }\n // Tweak the colour of <path> elements in existing CellDL files so they show\n // better in dark mode.\n const strokedPaths = svgDiagram.querySelectorAll(`path[stroke=\"${OLD_CONNECTION_COLOUR}\"]`)\n for (let index = 0; index < strokedPaths.length; ++index) {\n const path = strokedPaths[index]\n path.setAttribute('stroke', CONNECTION_COLOUR)\n }\n this.#svgDiagram = svgDiagram\n }\n\n #newDiagram() {\n const windowSize = this.#celldlEditor.windowSize\n const svgDiagram = document.createElementNS(SVG_URI, 'svg')\n svgDiagram.setAttribute('viewBox', `0 0 ${windowSize[0]} ${windowSize[1]}`)\n this.#svgDiagram = svgDiagram\n this.#setLayer(CELLDL_DIAGRAM_ID)\n }\n\n #setLayer(layerId: string) {\n let newLayer = <SVGGElement>this.#svgDiagram.querySelector(`svg > g.${CELLDL_STYLE_CLASS.Layer}[id=\"${layerId}\"]`)\n if (newLayer === null) {\n newLayer = document.createElementNS(SVG_URI, 'g')\n newLayer.id = layerId\n newLayer.setAttribute('class', CELLDL_STYLE_CLASS.Layer)\n this.#svgDiagram.appendChild(newLayer)\n this.#layers.set(layerId, newLayer)\n this.#orderedLayerIds.push(layerId)\n }\n this.#currentLayer = newLayer\n }\n\n #findLayers() {\n for (const layer of this.#svgDiagram.querySelectorAll(`g.${CELLDL_STYLE_CLASS.Layer}[id]`)) {\n this.#layers.set(layer.id, <SVGGElement>layer)\n this.#orderedLayerIds.push(layer.id)\n }\n }\n\n #initaliseMetadata() {\n this.#kb.add(this.#documentNode, RDF.uri('type'), CELLDL.uri('Document'))\n this.#diagramProperties.celldlVersion = CELLDL_VERSION\n }\n\n #loadMetadata() {\n const metadataElement = this.#svgDiagram.getElementById(CELLDL_METADATA_ID) as SVGMetadataElement\n if (\n metadataElement &&\n (!('contentType' in metadataElement.dataset) || metadataElement.dataset.contentType === $rdf.TurtleContentType)\n ) {\n const childNodes = metadataElement.childNodes\n for (let index = 0; index < childNodes.length; ++index) {\n // biome-ignore lint/style/noNonNullAssertion: index is in range\n const childNode = childNodes[index]!\n if (childNode.nodeName === '#cdata-section') {\n this.#kb.load(this.#documentNode.uri, (<CDATASection>childNode).data, $rdf.TurtleContentType)\n break\n }\n }\n }\n if (!this.#kb.contains(this.#documentNode, RDF.uri('type'), CELLDL.uri('Document'))) {\n throw new Error(`${this.#filePath} metadata doesn't describe a valid CellDL document`)\n }\n this.#loadDiagramProperties()\n if ('celldlVersion' in this.#diagramProperties) {\n if (this.#diagramProperties.celldlVersion !== CELLDL_VERSION) {\n throw new Error(\n `${this.#filePath} metadata version ${this.#diagramProperties.celldlVersion} is not compatible with editor`\n )\n }\n } else {\n this.#diagramProperties.celldlVersion = CELLDL_VERSION\n }\n }\n\n #trimSVGDiagram(svgDiagram: SVGSVGElement): Extent | null {\n const bounds = (<SVGGraphicsElement[]>(\n [...svgDiagram.children].filter(\n (child) => 'getBBox' in child && !child.classList.contains('editor-specific')\n )\n ))\n .map((child) => child.getBBox())\n .reduce(\n (bounds, bbox) => {\n return bbox.width > 0 && bbox.height > 0\n ? {\n xMin: Math.min(bounds.xMin, bbox.x),\n xMax: Math.max(bounds.xMax, bbox.x + bbox.width),\n yMin: Math.min(bounds.yMin, bbox.y),\n yMax: Math.max(bounds.yMax, bbox.y + bbox.height)\n }\n : bounds\n },\n {\n xMin: Infinity,\n xMax: -Infinity,\n yMin: Infinity,\n yMax: -Infinity\n }\n )\n const round10 = (x: number) => 10 * Math.round(x / 10)\n if (bounds.xMin < bounds.xMax && bounds.yMin < bounds.yMax) {\n return [\n round10(bounds.xMin - DIAGRAM_MARGIN),\n round10(bounds.yMin - DIAGRAM_MARGIN),\n round10(bounds.xMax - bounds.xMin + 2 * DIAGRAM_MARGIN),\n round10(bounds.yMax - bounds.yMin + 2 * DIAGRAM_MARGIN)\n ]\n }\n return null\n }\n\n export(format: string) {\n return {\n error: `Unsupported export format: ${format}`\n }\n }\n\n async serialise(): Promise<string> {\n if (this.#svgDiagram !== null) {\n // Remove active/selected class from elements\n this.#celldlEditor.resetObjectStates()\n\n // Clone our diagram and remove editor specific elements from the SVG\n const svgDiagram = this.#svgDiagram.cloneNode(true) as SVGSVGElement\n svgDiagram.removeAttribute('style')\n this.#removeEditorElements(svgDiagram)\n\n // Remove extraneous whitespace around the diagram\n const trimmedViewbox = this.#trimSVGDiagram(this.#svgDiagram)\n if (trimmedViewbox) {\n svgDiagram.setAttribute('viewBox', trimmedViewbox.map((n) => String(n)).join(' '))\n }\n\n // Add statements about the document from plugins\n componentLibraryPlugin.addDocumentMetadataToStore(this.rdfStore)\n\n // Make sure metadata is up-to-date\n this.#saveDiagramProperties()\n\n // Serialise metadata as Turtle into CDATA section in <metadata> element\n const metadata: string = await this.#serialiseMetadata($rdf.TurtleContentType)\n if (metadata !== '') {\n this.#saveMetadata(svgDiagram, metadata)\n }\n\n // Serialise the actual diagram\n const svgSerializer = new XMLSerializer()\n const svgData = svgSerializer.serializeToString(svgDiagram)\n return svgData\n }\n return ''\n }\n\n async #serialiseMetadata(metadataFormat: $rdf.ContentType): Promise<string> {\n let metadata: string = ''\n try {\n metadata = await this.#kb.serialise(this.#documentNode.uri, metadataFormat, CELLDL_DECLARATIONS)\n } catch (err) {\n console.log(err)\n }\n return metadata\n }\n\n #setUniqueId(svgElement: SVGGraphicsElement) {\n svgElement.id = this.#nextIdentifier()\n setInternalIds(svgElement)\n }\n\n addEditorElement(element: SVGElement, prepend = false) {\n if (prepend) {\n this.#svgDiagram.prepend(element)\n } else {\n this.#svgDiagram.append(element)\n }\n element.classList.add('editor-specific')\n }\n\n #removeEditorElements(svgDiagram: SVGSVGElement) {\n // We save matched elements as an array because ``getElementsByClassName()``\n // returns a live collection\n const editorSpecificElements = Array.from(svgDiagram.getElementsByClassName('editor-specific'))\n for (const element of editorSpecificElements) {\n element.remove()\n }\n }\n\n associatedObjects(object: CellDLObject): CellDLObject[] {\n const objects: CellDLObject[] = []\n for (const associated of this.#associatedObjects(object)) {\n if (associated?.svgElement) {\n objects.push(associated)\n }\n }\n return objects\n }\n\n #associatedObjects(object: CellDLObject | undefined): Set<CellDLObject> {\n let result: Set<CellDLObject> = new Set()\n if (object) {\n if (object.isConnection) {\n result = new Set((<CellDLConnection>object).connectedObjects)\n } else if (object.isConnectable) {\n const objects: CellDLObject[] = []\n for (const connection of (<CellDLConnectedObject>object).connections.values()) {\n objects.push(connection)\n const associatedObjects = this.#associatedObjects(connection)\n objects.push(...associatedObjects)\n }\n result = new Set(objects)\n result.delete(object)\n }\n }\n return result\n }\n\n #addMoveableObject(object: CellDLObject) {\n this.#objects.set(object.id, object)\n this.#spatialIndex.add(object)\n }\n\n #addConnection(connection: CellDLConnection) {\n this.#objects.set(connection.id, connection)\n }\n\n addConnectedObject(svgElement: SVGGraphicsElement, template: ObjectTemplate): CellDLConnectedObject | null {\n const object = this.#addNewObject(svgElement, template) as CellDLConnectedObject\n if (object) {\n this.#addMoveableObject(object)\n }\n notifyChanges()\n return object\n }\n\n addNewConnection(svgElement: SVGGraphicsElement, template: ObjectTemplate): CellDLConnection {\n const connection = this.#addNewObject(svgElement, template) as CellDLConnection\n // let the plugins know\n componentLibraryPlugin.addNewConnection(connection, this.rdfStore)\n notifyChanges()\n return connection\n }\n\n createCompartment(bounds: Bounds, objects: CellDLObject[]): CellDLCompartment {\n // we could simply pass ids into #objects\n const compartmentGroup = document.createElementNS(SVG_URI, 'g')\n compartmentGroup.id = this.#nextIdentifier()\n const cornerPoints = bounds.asPoints()\n const compartmentRect = svgRectElement(cornerPoints[0], cornerPoints[1], { class: 'compartment' })\n const compartmentShape = new ShapeIntersections(compartmentRect)\n compartmentGroup.appendChild(compartmentRect)\n const objectIds = new Set(objects.map((obj) => obj.id))\n const interfacePorts: CellDLInterface[] = []\n for (const object of objects) {\n if (\n !object.isConnection ||\n objectIds.isSupersetOf(new Set((<CellDLConnection>object).connectedObjects.map((obj) => obj.id)))\n ) {\n // Component or connection all inside bounds\n compartmentGroup.appendChild(object.celldlSvgElement!.svgElement)\n if (!object.isConnection) {\n this.#spatialIndex.remove(object)\n }\n } else {\n // Connection that crosses the compartment's boundary\n const connectionPorts = this.#addConnectionToCompartment(\n compartmentGroup,\n compartmentShape,\n objectIds,\n <CellDLConnection>object\n )\n interfacePorts.push(...connectionPorts)\n }\n }\n const compartment = this.#addNewObject(\n compartmentGroup, {\n CellDLClass: CellDLCompartment,\n metadataProperties: MetadataPropertiesMap.fromProperties([\n [CELLDL.uri('hasInterface'), interfacePorts.map((p) => p.uri)]\n ])\n },\n false\n ) as CellDLCompartment\n if (compartment) {\n this.#addMoveableObject(compartment)\n }\n notifyChanges()\n return compartment\n }\n\n #createConnection(connectedObjects: CellDLConnectedObject[], svgElements: SVGGraphicsElement[]): CellDLConnection {\n let svgElement: SVGGraphicsElement\n if (svgElements.length === 0) {\n console.log('No SVG elements to connect...')\n }\n if (svgElements.length > 1) {\n svgElement = document.createElementNS(SVG_URI, 'g')\n svgElement.classList.add(CELLDL_STYLE_CLASS.Connection)\n svgElements.forEach((element) => { element.classList.add('parent-id') })\n svgElements.forEach((element) => { element.classList.remove('selected') })\n svgElements.forEach((element) => { svgElement.appendChild(element) })\n } else {\n svgElement = svgElements[0]!\n svgElement.classList.remove('parent-id', 'selected')\n }\n if (!svgElement.hasAttribute('id')) {\n svgElement.setAttribute('id', this.#nextIdentifier())\n }\n // what ComponentPlugin was used to create the object?\n const metadataProperties = MetadataPropertiesMap.fromProperties([\n [CELLDL.uri('hasSource'), connectedObjects[0]!.uri],\n [CELLDL.uri('hasTarget'), connectedObjects[connectedObjects.length - 1]!.uri],\n [CELLDL.uri('hasIntermediate'), connectedObjects.slice(1, -1).map((c) => c.uri)]\n ])\n const connection = this.#addNewObject(\n svgElement, {\n CellDLClass: CellDLConnection,\n metadataProperties\n },\n false\n ) as CellDLConnection\n this.#addConnection(connection)\n // let the plugins know\n componentLibraryPlugin.addNewConnection(connection, this.rdfStore)\n return connection\n }\n\n #createPort<T extends CellDLConnectedObject>(newObjectClass: Constructor<CellDLObject>, point: PointLike): T {\n const connector = this.#addNewObject(\n svgCircleElement(point, 0, { id: this.#nextIdentifier() }), {\n CellDLClass: newObjectClass,\n metadataProperties: new MetadataPropertiesMap()\n },\n false\n ) as T\n this.#addMoveableObject(connector)\n return connector\n }\n\n createInterfacePort(point: PointLike): CellDLInterface {\n return this.#createPort<CellDLInterface>(CellDLInterface, point)\n }\n\n createUnconnectedPort(point: PointLike): CellDLUnconnectedPort {\n return this.#createPort<CellDLUnconnectedPort>(CellDLUnconnectedPort, point)\n }\n\n #addConnectionToCompartment(\n compartmentGroup: SVGGElement,\n compartmentShape: ShapeIntersections,\n objectIds: Set<string>,\n connection: CellDLConnection\n ): CellDLInterface[] {\n // The connection might intersect the compartment's boundary multiple times, once\n // for each path element, resulting in multiple new connections, both inside and\n // outside of the new compartment. e.g:\n //\n // =========================\n // || ||\n // || +----R R-----+ ||\n // ====1====2===3=====4=====\n // | R---+ |\n // | |\n // A B\n //\n // Connection [A, R, R, R, B] would become:\n //\n // [1, R, 2], [3, R, 4] inside\n // [A, 1], [2, R, 3], [4, B] outside\n //\n // and:\n // +-------K------+\n // R R\n // | |\n // ====1==============2=====\n // || | | ||\n // || A B ||\n // =========================\n //\n // Connection [A, R, K, B] would become:\n //\n // [A, 1], [2, B] inside\n // [1, R, K, R, 2] outside\n //\n const interfacePorts: CellDLInterface[] = []\n const connectors = connection.connectedObjects\n const pathElements = (<SvgConnection>connection.celldlSvgElement!).pathElements\n const pathStart = connectors[0]!\n const newConnectors: CellDLConnectedObject[] = []\n newConnectors.push(pathStart)\n const newElements: SVGPathElement[] = []\n\n // The connection will be split into several, so first remove the original one\n this.removeObject(connection)\n\n let currentPathInside = objectIds.has(pathStart.id)\n let pathEnd: CellDLConnectedObject\n for (let pathElementIndex = 0; pathElementIndex < pathElements.length; pathElementIndex += 1) {\n const pathElement = pathElements[pathElementIndex]!\n pathEnd = connectors[pathElementIndex + 1]!\n if (\n (currentPathInside && objectIds.has(pathEnd.id)) ||\n (!currentPathInside && !objectIds.has(pathEnd.id))\n ) {\n newConnectors.push(pathEnd)\n newElements.push(pathElement.svgElement)\n continue\n }\n const pathIntersections = compartmentShape.intersections(pathElement.svgElement)\n if (pathIntersections.length % 2 === 0) {\n console.warn(`Path unexpectedly intersects selection boundary...`)\n } else {\n let splitPoint: FoundPoint | null = null\n let closestOffset = currentPathInside ? -Infinity : Infinity\n const pointFinder = new PointFinder(pathElement.pathArray)\n // We use the pathElement's intersection which is closest to the inside end\n // for the new interface's location\n for (const point of pathIntersections) {\n const foundPoint = pointFinder.findPoint(point)\n if (\n foundPoint.offset !== null &&\n ((!currentPathInside && foundPoint.offset < closestOffset) ||\n (currentPathInside && foundPoint.offset > closestOffset))\n ) {\n closestOffset = foundPoint.offset\n splitPoint = foundPoint\n }\n }\n if (splitPoint === null) {\n console.warn(`Path unexpectedly doesn't intersect selection boundary...`)\n } else {\n // Create an Interface at the split point\n const interfacePort = this.createInterfacePort(splitPoint.point)\n interfacePorts.push(interfacePort)\n newConnectors.push(interfacePort)\n const interfaceElement = <BoundedElement>interfacePort.celldlSvgElement!\n compartmentGroup.appendChild(interfaceElement.svgElement)\n const tailSvgElement = pathElement.splitPath(splitPoint, interfaceElement)\n const headSvgElement = pathElement.svgElement.cloneNode(true) as SVGPathElement\n headSvgElement.removeAttribute('id')\n newElements.push(headSvgElement)\n const newConnection = this.#createConnection(newConnectors, newElements)\n this.#connectCompartmentConnection(newConnection, compartmentGroup, currentPathInside)\n newConnectors.length = 0\n newConnectors.push(interfacePort)\n newConnectors.push(pathEnd)\n newElements.length = 0\n newElements.push(tailSvgElement)\n currentPathInside = !currentPathInside\n }\n }\n }\n if (newConnectors.length) {\n // && newElements.length ?? Or newConnectors.length > 1\n const newConnection = this.#createConnection(newConnectors, newElements)\n this.#connectCompartmentConnection(newConnection, compartmentGroup, currentPathInside)\n }\n\n return interfacePorts\n }\n\n #connectCompartmentConnection(\n connection: CellDLConnection,\n compartmentGroup: SVGGElement,\n currentPathInside: boolean\n ) {\n if (currentPathInside) {\n compartmentGroup.appendChild(connection.celldlSvgElement!.svgElement)\n } else {\n if (connection.source?.isInterface) {\n ;(<CellDLInterface>connection.source!).addExternalConnection(connection)\n }\n if (connection.target?.isInterface) {\n ;(<CellDLInterface>connection.target!).addExternalConnection(connection)\n }\n }\n }\n\n #addNewObject(svgElement: SVGGraphicsElement, objectTemplate: ObjectTemplate, assignId = true) {\n const CellDLClass = objectTemplate.CellDLClass\n if (assignId) {\n this.#setUniqueId(svgElement)\n }\n // @ts-expect-error:\n svgElement.classList.add(CellDLClass.celldlStyleClass)\n if (this.#currentLayer) {\n this.#currentLayer.appendChild(svgElement)\n }\n // This is where we create an instanced object of its objectTemplate's class\n const celldlObject = new CellDLClass(this.makeUri(svgElement.id), objectTemplate, {}, this)\n if (celldlObject.isConnection) {\n this.#addConnection(<CellDLConnection>celldlObject)\n }\n celldlObject.assignSvgElement(svgElement, true)\n const undoAction = undoRedo.undoInsertAction()\n undoAction.addObjectDetails(celldlObject)\n // WIP... undoAction.addKnowledge(celldlObject.knowledge)\n return celldlObject\n }\n\n #setObjectSvgElement(celldlObject: CellDLObject): boolean {\n const svgElement = <SVGGraphicsElement>this.#svgDiagram.getElementById(celldlObject.id)\n if (svgElement) {\n celldlObject.assignSvgElement(svgElement, false)\n if (celldlObject.hasEditGuides) {\n editGuides.addGuide(<CellDLComponent>celldlObject)\n }\n return true\n }\n console.error(`Missing SVG element for ${celldlObject.id}`)\n return false\n }\n\n #celldlObjectFromRdf<T extends CellDLObject>(CellDLClass: Constructor<T>, subject: $rdf.SubjectType, options = {}): T {\n const metadata = this.#kb.metadataPropertiesForSubject(subject)\n const objectTemplate = componentLibraryPlugin.getObjectTemplate(subject, metadata, this.#kb)\n return new CellDLClass(subject, objectTemplate, options, this, false)\n }\n\n #subjectsOfType(parentType: NamedNode): [$rdf.SubjectType, NamedNode][] {\n return this.#kb.subjectsOfType(parentType).filter((st) => st[0].value.startsWith(this.#documentNode.value))\n }\n\n #loadObject<T extends CellDLObject>(type: NamedNode, CellDLClass: Constructor<T>) {\n for (const subjectType of this.#subjectsOfType(type)) {\n if (subjectType[1].equals(type)) {\n const object = this.#celldlObjectFromRdf(CellDLClass, subjectType[0])\n if (this.#setObjectSvgElement(object)) {\n this.#addMoveableObject(object)\n }\n }\n }\n }\n\n #loadAnnotations() {\n this.#loadObject(CELLDL.uri('Annotation'), CellDLAnnotation)\n }\n\n #loadComponents() {\n this.#loadObject(CELLDL.uri('Component'), CellDLComponent)\n this.#loadObject(CELLDL.uri('UnconnectedPort'), CellDLUnconnectedPort)\n }\n\n #loadInterfaces() {\n this.#loadObject(CELLDL.uri('Connector'), CellDLInterface)\n }\n\n #loadConduits() {\n this.#loadObject(CELLDL.uri('Conduit'), CellDLConduit)\n }\n\n getConnector(connectorNode: MetadataPropertyValue | null): CellDLConnectedObject | null {\n // @ts-expect-error: `value` property exists on a NamedNode\n if (connectorNode && $rdf.isNamedNode(connectorNode) && connectorNode.value.startsWith(this.#documentNode.value)) {\n const connectorId = (<NamedNode>connectorNode).id()\n const connector = this.#objects.get(connectorId) as CellDLConnectedObject\n return connector?.isConnectable ? connector : null\n }\n return null\n }\n\n #loadConnections() {\n this.#loadObject(CELLDL.uri('Connection'), CellDLConnection)\n }\n\n objectsContainedIn(compartment: Bounds): ContainedObject[] {\n return this.#spatialIndex.objectsContainedIn(compartment)\n }\n\n objectMoved(celldlObject: CellDLObject) {\n this.#spatialIndex.update(celldlObject)\n notifyChanges()\n }\n\n deleteInsertedObject(undoAction: EditorUndoAction) {\n for (const objectDetails of [...undoAction.objectDetails].reverse()) {\n const celldlObject = objectDetails.object\n if (celldlObject.isComponent) {\n editGuides.removeGuide(<CellDLComponent>celldlObject)\n }\n celldlObject.celldlSvgElement!.remove() // Will remove SVG element from DOM\n const statements = this.#kb.statementsMatching(celldlObject.uri)\n this.#kb.removeStatementList(statements)\n this.#objects.delete(celldlObject.id)\n }\n }\n\n insertDeletedObject(undoAction: EditorUndoAction) {\n // Add back objects in reverse order, so last removed is first reinserted\n for (const objectDetails of [...undoAction.objectDetails].reverse()) {\n objectDetails.insertSvg(this.svgDiagram) // adds SVG element to DOM\n const celldlObject = objectDetails.object\n if (celldlObject.isComponent) {\n editGuides.addGuide(<CellDLComponent>celldlObject)\n }\n this.#objects.set(celldlObject.id, celldlObject)\n }\n this.#kb.addStatementList(undoAction.knowledge)\n }\n\n removeObject(celldlObject: CellDLObject) {\n if (this.#objects.has(celldlObject.id)) {\n const undoAction = undoRedo.undoDeleteAction()\n this.#removeObject(celldlObject, undoAction)\n notifyChanges()\n }\n }\n\n #removeObject(celldlObject: CellDLObject, undoAction: EditorUndoAction) {\n undoAction.addObjectDetails(celldlObject)\n if (celldlObject.isComponent) {\n editGuides.removeGuide(<CellDLComponent>celldlObject)\n }\n celldlObject.celldlSvgElement!.remove() // Will remove SVG element from DOM\n const statements = this.#kb.statementsMatching(celldlObject.uri)\n undoAction.addKnowledge(statements)\n this.#kb.removeStatementList(statements)\n this.#objects.delete(celldlObject.id)\n this.#spatialIndex.remove(celldlObject)\n if (celldlObject.isConnectable) {\n const connector = <CellDLConnectedObject>celldlObject\n const connections = (<CellDLConnectedObject>celldlObject).connections\n for (const connection of connections) {\n this.#removeObject(connection, undoAction)\n componentLibraryPlugin.deleteConnection(connection, this.rdfStore)\n connector.deleteConnection(connection)\n }\n }\n if (celldlObject.isConnection) {\n const connection = <CellDLConnection>celldlObject\n componentLibraryPlugin.deleteConnection(connection, this.rdfStore)\n for (const connector of connection.connectedObjects) {\n connector.deleteConnection(connection)\n }\n }\n }\n}\n\n//==============================================================================\n","/**\n * Composable utility for injecting PrimeVue theme CSS variables into the DOM.\n *\n * Ex https://github.com/CellDL/CellDLEditor/pull/4/changes from https://github.com/akhuoa\n */\n\nimport { onBeforeMount, getCurrentInstance } from 'vue';\n\n/**\n * @param componentName The key name in the preset (e.g., 'card', 'button', 'select')\n */\nexport function useThemeCssVariables(componentName: string) {\n onBeforeMount(() => {\n const instance = getCurrentInstance();\n const primevue = instance?.appContext.config.globalProperties.$primevue;\n const preset = primevue?.config?.theme?.preset;\n\n if (preset?.components[componentName]) {\n const styles = generateComponentStyles(preset.components[componentName], componentName);\n injectStyles(`lib-fix-${componentName}`, styles);\n }\n });\n}\n\nfunction injectStyles(id: string, css: string) {\n if (document.getElementById(id)) return;\n const style = document.createElement('style');\n style.id = id;\n style.textContent = css;\n document.head.appendChild(style);\n}\n\nfunction resolveReference<T>(value: T|string): T|string {\n if (typeof value !== 'string') return value;\n return value.replace(/\\{([^}]+)\\}/g, (_, path) => {\n return `var(--p-${path.replace(/\\./g, '-')})`;\n });\n}\n\nfunction toKebabCase(str: string) {\n return str.replace(/[A-Z]/g, letter => `-${letter.toLowerCase()}`);\n}\n\nfunction generateComponentStyles(tokenObj: object, prefix: string) {\n let css = `:root {`;\n\n const traverse = (obj: object, parentKey: string) => {\n Object.entries(obj).forEach(([key, value]) => {\n const kebabKey = toKebabCase(key);\n let newKey: string;\n\n if (key === 'root') {\n newKey = parentKey;\n } else {\n newKey = parentKey ? `${parentKey}-${kebabKey}` : kebabKey;\n }\n\n if (typeof value === 'object' && value !== null) {\n traverse(value, newKey);\n } else {\n const resolvedValue = resolveReference(value);\n css += `--p-${prefix}-${newKey}: ${resolvedValue};`;\n }\n });\n };\n\n traverse(tokenObj, '');\n css += `}`;\n return css;\n}\n","<template lang=\"pug\">\n .popover(\n v-if=\"type === 'popover'\"\n ref=\"toolPopover\"\n :class=\"{ hidden: !popoverVisible }\"\n :style=\"{ top: popoverTop }\"\n )\n slot\n .ci.tool-button(\n :id=\"toolId\"\n :class=\"buttonClasses\"\n :style=\"buttonStyle\"\n v-tippy=\"{ content: prompt, placement: 'right' }\"\n :aria-label=\"prompt\"\n @click=\"toolButtonClick\"\n )\n</template>\n\n<script setup lang=\"ts\">\nimport * as vue from 'vue'\n\nconst props = defineProps<{\n toolId?: string\n active?: boolean\n icon?: string\n image?: string\n prompt?: string\n modal?: boolean\n type?: string\n panel?: vue.Raw<vue.Component>\n}>()\n\nconst buttonClasses = vue.computed(() => {\n const classes = []\n if (props.icon) {\n classes.push(props.icon)\n }\n if (props.active) {\n classes.push('active')\n }\n if (props.type === 'popover' && props.modal) {\n classes.push('modal')\n }\n if (props.image) {\n classes.push('image')\n }\n return classes.join(' ')\n})\n\nconst buttonStyle = vue.computed(() => {\n const style = []\n if (props.image) {\n style.push(`background: url(\"${props.image}\");`)\n }\n return style.join(' ')\n})\n\nconst popoverVisible = vue.ref()\npopoverVisible.value = false\n\nconst popoverTop = vue.ref()\n\nconst pointerPos = vue.ref<number>()\nvue.provide('pointerPos', vue.readonly(pointerPos))\n\nconst toolPopover = vue.ref(null)\nlet popoverElement: HTMLElement | null = null\n\nvue.onMounted(() => {\n if (toolPopover.value) {\n popoverElement = (<HTMLElement>toolPopover.value).firstElementChild as HTMLElement\n }\n})\n\n// Make sure popover is closed when button is deactivated\nvue.watch(\n () => props.active,\n () => {\n if (!props.active) {\n popoverVisible.value = false\n }\n }\n)\n\nconst emit = defineEmits(['button-event'])\n\nasync function toolButtonClick(e: MouseEvent) {\n const target: HTMLElement | null = e.target as HTMLElement\n if (target) {\n if (props.type === 'panel') {\n // Simply toggle the panel button; event emission controls panel visibility\n\n target.classList.toggle('active')\n } else {\n if (!target.classList.contains('active')) {\n target.classList.add('active')\n } else if (popoverElement) {\n if (popoverVisible.value) {\n popoverVisible.value = false\n } else {\n popoverVisible.value = true\n\n // Wait for panel to be rendered before getting its height\n await vue.nextTick()\n\n const popoverHeight = popoverElement?.clientHeight\n let top = target.offsetTop + (target.clientWidth - popoverHeight) / 2\n pointerPos.value = popoverHeight / 2 - 10 // 10 is half of pointer's height\n\n if (top < (20 + window.scrollY)) {\n // Make sure our top is at least 20px below top containing element\n const adjustment = (20 + window.scrollY) - top\n top = (20 + window.scrollY)\n pointerPos.value -= adjustment\n }\n popoverTop.value = `${top}px`\n }\n }\n }\n emit('button-event', target.id, target.classList.contains('active'), props.panel || null)\n }\n}\n</script>\n\n<style scoped>\n.tool-button {\n border-style: solid;\n border-color: var(--editor-border-color);\n border-width: 0 1px 2px;\n}\n.tool-button:hover {\n background-color: lightgrey;\n}\n\n.tool-button.ci {\n width: 36px !important;\n height: 36px !important;\n scale: 1 !important;\n padding: 0;\n}\n\n.tool-button.image {\n background-size: 100% 100% !important;\n}\n\n.tool-button.modal::before {\n display: inline-block;\n position: relative;\n transform: scale(0.3);\n width: 10px;\n height: 10px;\n top: 22px;\n left: 22px;\n}\n\n.tool-button.modal::before {\n content: url(\"./icons/ModalButtonLight.svg\");\n}\n\n.celldl-dark-mode .tool-button.modal::before {\n content: url(\"./icons/ModalButtonDark.svg\");\n}\n\n.hidden {\n display: none;\n}\n\n.popover {\n position: absolute;\n}\n\n.active {\n background-color: #3584e4 !important;\n}\n</style>\n","<template lang=\"pug\">\n Toolbar.vertical\n template(#start)\n ToolButton(\n v-for=\"button in buttons\"\n :toolId=\"button.toolId\"\n :active=\"button?.active\"\n :prompt=\"button.prompt\"\n :icon=\"button.icon\"\n :image=\"button.image\"\n :modal=\"!!button?.panel\"\n :type=\"type\"\n :panel=\"button.panel\"\n @button-event=\"buttonEvent\"\n )\n component(\n v-if=\"type === 'popover' && button.panel\"\n :is=\"button.panel\"\n :toolId=\"button.toolId\"\n @popover-event=\"popoverEvent\"\n )\n</template>\n\n<script setup lang=\"ts\">\nimport * as vue from 'vue'\nimport { useThemeCssVariables } from '@renderer/common/themeCssVariables'\n\nuseThemeCssVariables('toolbar')\n\n//==============================================================================\n\nimport { type EditorToolButton } from '@renderer/common/EditorTypes'\n\nimport ToolButton from './ToolButton.vue'\n\n//==============================================================================\n\nconst props = defineProps<{\n type?: string\n buttons: EditorToolButton[]\n}>()\n\nconst emit = defineEmits(['button-event', 'popover-event'])\n\nfunction buttonEvent(toolId: string, active: boolean, panel: vue.Raw<vue.Component> | null) {\n for (const button of props.buttons) {\n if (active && toolId === button.toolId) {\n button.active = true\n } else {\n button.active = false\n }\n }\n emit('button-event', toolId, active, props.type == 'panel' ? panel : null)\n}\n\nfunction popoverEvent(id: string, data: any) {\n emit('popover-event', id, data)\n}\n\n//==============================================================================\n\n</script>\n\n<style>\n.p-toolbar.vertical,\n.p-toolbar.vertical > .p-toolbar-start {\n flex-direction: column !important;\n width: 38px !important;\n padding: 0 !important;\n border-top: 1px solid grey;\n flex-wrap: nowrap !important;\n border-radius: 0 !important;\n}\n</style>\n","/******************************************************************************\n\nCellDL Editor\n\nCopyright (c) 2022 - 2025 David Brooks\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n******************************************************************************/\n\nimport type { CellDLObject } from '@editor/celldlObjects/index'\nimport type { MetadataPropertiesMap } from '@renderer/metadata/index'\n\nimport type { PointLike } from '@renderer/common/points'\nimport type { Constructor, StringProperties } from '@renderer/common/types'\n\n//==============================================================================\n\nexport interface ObjectTemplate {\n CellDLClass: Constructor<CellDLObject>\n description?: string\n image?: string\n metadataProperties: MetadataPropertiesMap\n name?: string\n}\n\n//==============================================================================\n\nexport interface LibraryComponentTemplate {\n id: string\n name: string\n image: string\n selected?: boolean\n}\n\nexport interface ComponentLibrary {\n id: string\n name: string\n templates: LibraryComponentTemplate[]\n}\n\nexport interface ElementTypeName {\n type: string\n name: string\n}\n\n//==============================================================================\n\nexport interface NamedProperty {\n name: string\n property: string\n}\n\n//==============================================================================\n\nexport interface TemplateProperties {\n nodeSettings?: StringProperties\n}\n\n//==============================================================================\n\nexport type TemplateEventDetails = {\n id: string,\n centre: PointLike\n offset: PointLike\n}\n\n//==============================================================================\n\nexport function getTemplateEventDetails(id: string, target: HTMLImageElement,\n event: DragEvent|MouseEvent|null): TemplateEventDetails {\n const details = {\n id: id,\n // Centre of target.x/y wrt image top left\n centre: {\n x: target.naturalWidth / 2,\n y: target.naturalHeight / 2\n },\n offset: { x: 0, y: 0 }\n }\n if (event) {\n // Offset of event.x/y wrt centre\n details.offset = {\n x: event.offsetX - target.scrollWidth / 2,\n y: event.offsetY - target.scrollHeight / 2\n }\n }\n return details\n}\n\n//==============================================================================\n//==============================================================================\n","<template lang=\"pug\">\n Card.left-popover(\n :class=\"{ 'no-gap': !hasTitle, showtip: showtip }\"\n :data-tip-top=\"pointerPos\"\n )\n template(#title)\n div(v-if=\"hasTitle\")\n slot(name=\"title\")\n template(#content)\n slot(name=\"content\")\n</template>\n\n<script setup lang=\"ts\">\nimport * as vue from 'vue'\nimport { useThemeCssVariables } from '@renderer/common/themeCssVariables'\n\nuseThemeCssVariables('card')\n\nconst slots = vue.useSlots()\n\nconst hasTitle = vue.computed(() => !!slots.title);\n\nconst pointerPos = vue.inject<vue.DeepReadonly<number>>('pointerPos')\n\n// Don't show a wrongly positioned tooltip in Firefox\nconst showtip = vue.ref()\nshowtip.value = true //CSS.supports(\"x: attr(x type(*))\")\n</script>\n\n<style>\n.p-card.no-gap > .p-card-body {\n gap: 0px !important;\n}\n</style>\n\n<style scoped>\n.left-popover {\n position: absolute;\n margin-left: 36px;\n z-index: 100;\n border: 1px solid grey;\n}\n\n.left-popover.showtip::before {\n display: inline-block;\n position: absolute;\n width: 20px;\n left: -16px;\n top: attr(data-tip-top px);\n z-index: 99;\n}\n\n.left-popover.showtip::before {\n content: url(\"./icons/LeftPanelArrowLight.svg\");\n}\n\n.celldl-dark-mode .left-popover.showtip::before {\n content: url(\"./icons/LeftPanelArrowDark.svg\");\n}\n\n</style>\n","<template lang=\"pug\">\n ToolPopover\n template(#content)\n .component-library(v-for=\"library in libraries\")\n .library-title {{ library.name }}\n .library-icons\n img.library-icon(\n v-for=\"template in library.templates\"\n :class=\"{ selected: template.selected }\"\n :library=\"library.id\"\n :id=\"fullId(library, template)\"\n :src=\"template.image\"\n :aria-label=\"template.name\"\n v-tippy=\"{ content: template.name, placement: 'right' }\"\n draggable=\"true\"\n @dragstart=\"dragstart\"\n @mousedown=\"selected\"\n )\n</template>\n\n<script setup lang=\"ts\">\nimport * as vue from 'vue'\n\nimport {\n type ComponentLibrary,\n type LibraryComponentTemplate,\n getTemplateEventDetails\n} from '@editor/components/index'\n\nimport ToolPopover from '../toolbar/ToolPopover.vue'\n\nconst libraries = vue.inject<vue.Ref<ComponentLibrary[]>>('componentLibraries')\n\nconst props = defineProps<{\n toolId: string\n}>()\n\nconst idToComponent: Map<string, LibraryComponentTemplate> = new Map()\nlet selectedId: string | undefined\n\nfunction fullId(library: ComponentLibrary, template: LibraryComponentTemplate): string {\n return `${library.id}/${template.id}`\n}\n\nvue.onMounted(() => {\n libraries.value.forEach((library: ComponentLibrary) => {\n library.templates.forEach((template: LibraryComponentTemplate) => {\n const id = fullId(library, template)\n idToComponent.set(id, template)\n if (template.selected) {\n selectedId = id\n }\n })\n })\n if (selectedId) {\n const selectedElement = document.getElementById(selectedId) as HTMLImageElement\n if (selectedElement) {\n document.dispatchEvent(\n new CustomEvent('component-selected', {\n detail: getTemplateEventDetails(selectedId, selectedElement, null)\n })\n )\n }\n }\n})\n\nconst emit = defineEmits(['popover-event'])\n\nfunction selected(e: MouseEvent) {\n const target = e.target as HTMLImageElement\n const component = idToComponent.get(target.id)\n if (target.id && component) {\n if (selectedId) {\n idToComponent.get(selectedId)!.selected = false\n }\n component.selected = true\n selectedId = target.id\n }\n // Tell the editor what template has been selected\n document.dispatchEvent(\n new CustomEvent('component-selected', {\n detail: getTemplateEventDetails(target.id, target, e)\n })\n )\n // Tell the toolbar what component template has been selected\n emit('popover-event', props.toolId, component)\n}\n\nfunction dragstart(e: DragEvent) {\n const target = e.target as HTMLImageElement\n e.dataTransfer!.items.add(JSON.stringify(getTemplateEventDetails(target.id, target, e)), 'text/plain')\n document.dispatchEvent(\n new CustomEvent('component-drag', {\n detail: {\n type: 'dragstart',\n source: props.toolId,\n value: target.id\n }\n })\n )\n}\n</script>\n\n<style scoped>\n.component-library\n{\n width: 150px;\n display: flex;\n flex-direction: column;\n border: var(--p-accordion-header-border-width) solid var(--p-content-border-color);\n}\n.library-title {\n padding: 2px;\n border-bottom: 1px solid green;\n font-size: var(--p-card-title-font-size);\n font-weight: var(--p-card-title-font-weight);\n}\n.library-icons\n{\n display: flex;\n flex-wrap: wrap;\n align-items: start;\n justify-content: space-between;\n gap: 3px;\n overflow-y: auto;\n margin: 1px;\n}\n.library-icon\n{\n width: 45px;\n height: 45px;\n border: 1px solid lightgrey;\n background: var(--p-content-background);\n margin: 0;\n padding: 2px;\n}\n.library-icon:hover {\n background-color: lightgrey;\n}\n.library-icon.selected\n{\n background: #3584e4;\n}\n</style>\n","<template lang=\"pug\">\n ToolPopover\n template(#title) Path Style\n template(#content)\n Select(\n v-model=\"selectedItem\"\n :options=\"items\"\n optionLabel=\"name\"\n :highlightOnSelect=\"true\"\n @change=\"changed\"\n )\n template(#value=\"slotProps\")\n .flex.items-center(v-if=\"slotProps.value\")\n span.ci(:class=\"[slotProps.value.icon]\") \n span {{ slotProps.value.name }}\n span(v-else) {{ slotProps.placeholder }}\n template(#option=\"slotProps\")\n .flex.items-center\n span {{ slotProps.option.name }}\n</template>\n\n<script setup lang=\"ts\">\nimport * as vue from 'vue'\nimport { type SelectChangeEvent } from 'primevue/select'\nimport { useThemeCssVariables } from '@renderer/common/themeCssVariables'\n\nuseThemeCssVariables('select')\n\nimport ToolPopover from '../toolbar/ToolPopover.vue'\n\nimport {\n type ConnectionStyleDefinition,\n CONNECTION_STYLE_DEFINITIONS,\n DEFAULT_CONNECTION_STYLE\n} from '@editor/connections/index'\n\n//==============================================================================\n\nconst selectedId: string = DEFAULT_CONNECTION_STYLE\nconst items = vue.ref<ConnectionStyleDefinition[]>(CONNECTION_STYLE_DEFINITIONS)\n\nconst selectedItem = vue.ref<ConnectionStyleDefinition>()\n\nfor (const item of items.value) {\n if (item.id === selectedId) {\n selectedItem.value = item\n break\n }\n}\n\n//==============================================================================\n\nconst props = defineProps<{\n toolId: string\n}>()\n\nconst emit = defineEmits(['popover-event'])\n\nfunction changed(e: SelectChangeEvent) {\n emit('popover-event', props.toolId, e.value)\n}\n\n//==============================================================================\n</script>\n\n<style scoped>\n/* What does `md.w-56` do?? */\n.p-select {\n width: 170px !important;\n}\n</style>\n\n","<template lang=\"pug\">\n .right-panel\n ScrollPanel(class=\"h-full\")\n .panel-title\n slot(name=\"title\")\n .panel-content\n slot(name=\"content\")\n</template>\n\n<script setup lang=\"ts\">\nimport { useThemeCssVariables } from '@renderer/common/themeCssVariables'\n\nuseThemeCssVariables('scrollpanel')\n</script>\n\n<style scoped>\n.right-panel {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: var(--p-card-background);\n color: var(--p-card-color);\n padding: var(--p-card-body-padding);\n gap: var(--p-card-caption-gap);\n}\n\n.panel-title {\n font-size: var(--p-card-title-font-size);\n font-weight: var(--p-card-title-font-weight);\n}\n\n.panel-content {\n flex: 1;\n}\n</style>\n","<template lang=\"pug\">\n .bottom-margin(v-if=\"possibleValues !== undefined\")\n FloatLabel(variant=\"on\")\n Select(\n v-model=\"discreteValue\"\n :options=\"possibleValues\"\n optionLabel=\"name\"\n @change=\"selectChange\"\n class=\"w-full\"\n scrollHeight=\"400px\"\n size=\"small\"\n )\n template(#value=\"slotProps\")\n span(\n v-if=\"slotProps.value\"\n :class=\"{ emphasise: slotProps.value.emphasise }\"\n ) {{ slotProps.value.name }}\n span(v-else) {{ slotProps.placeholder }}\n template(#option=\"slotProps\")\n .flex.items-center\n span(:class=\"{ emphasise: slotProps.option.emphasise }\") {{ slotProps.option.name }}\n label {{ name }}\n .bottom-margin(v-else-if=\"scalarType\")\n FloatLabel(variant=\"on\")\n InputText(\n v-model=\"scalarValue\"\n v-keyfilter.num\n v-on:focusout=\"inputTextFocusOut\"\n v-on:keypress=\"inputTextKeyPress\"\n class=\"w-full\"\n size=\"small\"\n )\n label {{ nameUnits }}\n .bottom-margin(v-else)\n FloatLabel(variant=\"on\")\n InputText(\n v-model=\"value\"\n @value-change=\"inputTextChange\"\n class=\"w-full\"\n size=\"small\"\n )\n label {{ name }}\n</template>\n\n<script setup lang=\"ts\">\nimport * as vue from 'vue'\nimport { useThemeCssVariables } from '@renderer/common/themeCssVariables'\n\nuseThemeCssVariables('floatlabel')\nuseThemeCssVariables('inputtext')\nuseThemeCssVariables('select')\n\nimport KeyFilter from 'primevue/keyfilter';\n// v-keyfilter=\"{ pattern: /^[+-]?((\\d+(\\.\\d*)?)|(\\.\\d+))([eE][+-]?\\d+)?$/, validateOnly: true }\"\n\nimport type * as locApi from '../../libopencor/locUIJsonApi'\n\ntype ValueType = number|string|locApi.IUiJsonDiscreteInputPossibleValue\n\nconst value = defineModel<ValueType>({ required: true })\n\nconst emits = defineEmits(['change'])\n\nconst props = defineProps<{\n name: string\n value: ValueType\n maximumValue?: number\n minimumValue?: number\n itemId: string\n units?: string\n numeric?: boolean\n possibleValues?: locApi.IUiJsonDiscreteInputPossibleValue[]\n stepValue?: number\n}>()\n\nconst nameUnits = vue.computed(() => props.units ? `${props.name} (${props.units})` : props.name)\n\nconst scalarType = !!props.numeric\n\nlet oldValue = (props.possibleValues === undefined) ? value.value : value.value.value\n\nconst discreteValue = vue.computed<locApi.IUiJsonDiscreteInputPossibleValue>({\n get() {\n return value.value\n },\n set(_: number | string) {\n }\n})\n\nconst scalarValue = vue.ref<number>(value.value)\nconst stringValue = vue.ref<string>(String(value.value))\n\nvue.watch(\n () => props.value,\n () => {\n if (scalarType) {\n scalarValue.value = props.value\n stringValue.value = String(value.value)\n }\n }\n)\n\n// Some methods to handle a scalar value using an input text and a slider.\n\nfunction emitChange(newValue: number | string) {\n void vue.nextTick().then(() => {\n if (scalarType && props.possibleValues === undefined) {\n value.value = newValue\n scalarValue.value = <number>newValue\n stringValue.value = String(newValue) // This will properly format the input text.\n }\n\n emits('change', props.itemId, oldValue, newValue)\n oldValue = newValue\n })\n}\n\ninterface ISelectChangeEvent {\n value: {\n name: string\n value: number\n }\n}\n\nfunction selectChange(event: ISelectChangeEvent) {\n if (event.value.value !== oldValue) {\n emitChange(event.value.value)\n }\n}\n\nfunction inputTextChange(newValueString: string) {\n if (scalarType && newValueString === '') {\n newValueString = String(props.minimumValue)\n }\n\n if (props.minimumValue !== undefined && Number(newValueString) < props.minimumValue) {\n newValueString = String(props.minimumValue)\n }\n\n if (props.maximumValue !== undefined && Number(newValueString) > props.maximumValue) {\n newValueString = String(props.maximumValue)\n }\n\n const newValue = scalarType ? Number(newValueString) : newValueString\n\n if (newValue !== oldValue) {\n emitChange(newValue)\n }\n}\n\nfunction inputTextFocusOut(event: Event) {\n inputTextChange((event.target as HTMLInputElement).value)\n}\n\nfunction inputTextKeyPress(event: KeyboardEvent) {\n if (event.key === 'Enter') {\n inputTextChange((event.target as HTMLInputElement).value)\n }\n}\n</script>\n\n<style scoped>\n .bottom-margin {\n margin-bottom: 30px;\n }\n .emphasise {\n font-style: italic;\n }\n</style>\n","<template lang=\"pug\">\n .card\n .flexPrompt\n label(for=\"gradientCheckbox\") Gradient fill:\n Checkbox#gradientCheckbox(\n v-model=\"fillStyle.gradientFill\"\n @change=\"styleChange\"\n binary\n )\n Divider\n .flexPrompt\n label(for=\"startInput\") {{ startPrompt }}:\n input.colour#startInput(\n type=\"color\"\n :value=\"startColour\"\n @input=\"colourChange\"\n )\n Button#swapButton(\n icon=\"pi pi-sort-alt\"\n variant=\"text\"\n aria-label=\"Swap colours\"\n size=\"small\"\n :class=\"{ hidden: !fillStyle.gradientFill }\"\n @click=\"swapColours\"\n )\n .flexPrompt#stopColour(:class=\"{ hidden: !fillStyle.gradientFill }\")\n label(for=\"stopInput\") Stop colour:\n input.colour#stopInput(\n type=\"color\"\n :value=\"stopColour\"\n @input=\"colourChange\"\n )\n .spacer\n .flexPrompt#stopColour(:class=\"{ hidden: !fillStyle.gradientFill }\")\n label Direction:\n #directions\n .flex.items-right.gap-2\n label(for=\"horizontal\") H\n RadioButton#horizontal(\n v-model=\"gradientDirn\"\n inputId=\"horizontal\"\n name=\"dirn\"\n value=\"H\"\n @change=\"emitChange\"\n )\n .flex.items-right.gap-2\n label(for=\"vertical\") V\n RadioButton#vertical(\n v-model=\"gradientDirn\"\n inputId=\"vertical\"\n name=\"dirn\"\n value=\"V\"\n @change=\"emitChange\"\n )\n</template>\n\n<script setup lang=\"ts\">\nimport * as vue from 'vue'\nimport { TinyColor } from '@ctrl/tinycolor'\nimport { useThemeCssVariables } from '@renderer/common/themeCssVariables'\n\nuseThemeCssVariables('button')\nuseThemeCssVariables('checkbox')\nuseThemeCssVariables('divider')\nuseThemeCssVariables('radiobutton')\n\nimport { type INodeStyle } from '@renderer/common/svgUtils'\n\nconst props = defineProps<{\n fillStyle: INodeStyle\n}>()\n\nconst startPrompt = vue.ref(props.fillStyle.gradientFill ? 'Start colour' : 'Fill colour')\n\nfunction styleChange(e: Event) {\n const target = e.target as HTMLInputElement\n if (target.checked) {\n startPrompt.value = 'Start colour'\n props.fillStyle.gradientFill = true\n } else {\n startPrompt.value = 'Fill colour'\n props.fillStyle.gradientFill = false\n }\n emitChange()\n}\n\nvue.watch(\n () => props.fillStyle,\n () => {\n startPrompt.value = props.fillStyle.gradientFill ? 'Start colour' : 'Fill colour'\n gradientDirn.value = props.fillStyle.direction ?? 'H'\n }\n)\n\nconst colours = vue.computed<{\n start: string\n stop: string\n}>(() => {\n return {\n start: props.fillStyle.colours[0],\n stop: props.fillStyle.colours[1] ?? props.fillStyle.colours[0]\n }\n})\n\nconst startColour = vue.computed<string>(() => {\n return new TinyColor(colours.value.start).toHexString()\n})\n\nconst stopColour = vue.computed<string>(() => {\n const stopColour = colours.value.stop || colours.value.start\n return new TinyColor(stopColour).toHexString()\n})\n\nconst gradientDirn = vue.ref<string>(props.fillStyle.direction ?? 'H')\n\nfunction colourChange(e: Event) {\n const target = e.target as HTMLInputElement\n if (target.id === 'startInput') {\n colours.value.start = target.value\n } else if (target.id === 'stopInput') {\n colours.value.stop = target.value\n }\n emitChange()\n}\n\nfunction swapColours(e: Event) {\n const stopColour = colours.value.stop\n colours.value.stop = colours.value.start\n colours.value.start = stopColour\n emitChange()\n}\n\nconst emit = defineEmits(['change'])\n\nfunction emitChange() {\n if (props.fillStyle.gradientFill) {\n emit('change', {\n gradientFill: true,\n colours: [colours.value.start, colours.value.stop],\n direction: gradientDirn.value\n })\n } else {\n emit('change', {\n gradientFill: false,\n colours: [colours.value.start]\n })\n }\n}\n</script>\n\n<style>\n/* Otherwise the tick mark is not obvious */\n.p-checkbox-checked .p-checkbox-icon {\n color: red !important;\n}\n</style>\n\n<style scoped>\n.flexPrompt {\n display: flex;\n justify-content: space-between;\n margin-bottom: 4px;\n}\n\n#gradientCheckbox {\n margin-right: 3px;\n}\n#swapButton {\n padding: 0;\n}\n#directions {\n display: flex;\n flex-direction: column;\n}\n\n.hidden {\n display: none;\n}\n\n.spacer {\n height: 10px;\n}\n/* Based on https://rebeccamdeprey.com/blog/styling-the-html-color-input */\n\ninput[type=\"color\" i] {\n inline-size: 24px;\n block-size: 24px;\n}\n\n/* Affects area between outer circle and color swatch. Firefox doesn't have an equivalent. */\ninput[type=\"color\" i]::-webkit-color-swatch-wrapper {\n padding: 1px;\n}\n\n/* Affects the inner circle, i.e. the current color selection */\ninput[type=\"color\" i]::-webkit-color-swatch {\n border-radius: 40%;\n}\n\ninput[type=\"color\" i]::-moz-color-swatch {\n border-radius: 40%;\n}\n</style>\n","<template lang=\"pug\">\n .card\n .flexPrompt\n label(for=\"colour\") Path colour\n input.colour#colour(\n type=\"color\"\n :value=\"pathColour\"\n @input=\"colourChange\"\n )\n .spacer\n FloatLabel(variant=\"on\")\n InputText(v-model.number=\"width\")\n Slider(\n v-model=\"width\"\n :min=\"minWidth\"\n :max=\"maxWidth\"\n :step=\"widthStep\"\n @change=\"emitChange\"\n )\n label Width (px)\n .spacer\n .flexPrompt\n label(for=\"dashed\") Dashed:\n Checkbox#gradientCheckbox(\n v-model=\"dashed\"\n binary\n @change=\"emitChange\"\n )\n</template>\n\n<script setup lang=\"ts\">\nimport * as vue from 'vue'\nimport Slider from 'primevue/slider'\nimport { TinyColor } from '@ctrl/tinycolor'\nimport { useThemeCssVariables } from '@renderer/common/themeCssVariables'\n\nuseThemeCssVariables('checkbox')\nuseThemeCssVariables('floatlabel')\nuseThemeCssVariables('inputtext')\nuseThemeCssVariables('slider')\n\nimport { type IPathStyle } from '@renderer/common/svgUtils'\n\nconst props = defineProps<{\n pathStyle: IPathStyle\n}>()\n\nconst colour = vue.ref(props.pathStyle.colour)\nconst dashed = vue.ref(props.pathStyle.dashed)\nconst width = vue.ref(props.pathStyle.width)\n\nconst minWidth = vue.ref<number>(0.5)\nconst maxWidth = vue.ref<number>(10)\nconst widthStep = vue.ref<number>(0.5)\n\nvue.watch(\n () => props.pathStyle,\n () => {\n colour.value = props.pathStyle.colour\n dashed.value = props.pathStyle.dashed\n width.value = props.pathStyle.width\n }\n)\n\nconst pathColour = vue.computed<string>(() => {\n return new TinyColor(colour.value).toHexString()\n})\n\nfunction colourChange(e: Event) {\n const target = e.target as HTMLInputElement\n colour.value = target.value\n emitChange()\n}\n\nconst emit = defineEmits(['change'])\n\nfunction emitChange() {\n emit('change', {\n colour: colour.value,\n dashed: dashed.value,\n width: width.value\n })\n}\n</script>\n\n<style>\n/* Otherwise the tick mark is not obvious */\n.p-checkbox-checked .p-checkbox-icon {\n color: red !important;\n}\n</style>\n\n<style scoped>\n.flexPrompt {\n display: flex;\n justify-content: space-between;\n margin-bottom: 4px;\n}\n\n.spacer {\n height: 10px;\n}\n/* Based on https://rebeccamdeprey.com/blog/styling-the-html-color-input */\n\ninput[type=\"color\" i] {\n inline-size: 24px;\n block-size: 24px;\n}\n\n/* Affects area between outer circle and color swatch. Firefox doesn't have an equivalent. */\ninput[type=\"color\" i]::-webkit-color-swatch-wrapper {\n padding: 1px;\n}\n\n/* Affects the inner circle, i.e. the current color selection */\ninput[type=\"color\" i]::-webkit-color-swatch {\n border-radius: 40%;\n}\n\ninput[type=\"color\" i]::-moz-color-swatch {\n border-radius: 40%;\n}\n</style>\n","<template lang=\"pug\">\n ToolPanel(:id=toolId)\n template(#content)\n div(\n v-if=\"disabled\"\n ) Please select an element or path.\n Accordion(\n v-if=\"!disabled\"\n v-model:value=\"openPanel\"\n )\n AccordionPanel.group(\n v-for=\"(group, groupIndex) in groups\"\n :key=\"group.title\"\n :disabled=\"disabled\"\n :value=\"String(groupIndex)\"\n )\n AccordionHeader(\n v-if=\"hasContent[groupIndex]\"\n ) {{ group.title }}\n AccordionContent(\n v-if=\"hasContent[groupIndex] && groupIndex < (groups.length - 1)\"\n )\n InputWidget(\n v-for=\"(item, index) in group.items\"\n v-model=\"item.value\"\n :itemId=\"item.itemId\"\n :name=\"item.name\"\n :value=\"item.value\"\n :units=\"item.units\"\n :numeric=\"item.numeric\"\n :maximumValue=\"item.maximumValue\"\n :minimumValue=\"item.minimumValue\"\n :possibleValues=\"item.possibleValues\"\n :stepValue=\"item.stepValue\"\n @change=\"updateProperties\"\n )\n AccordionContent(\n v-if=\"hasContent[groupIndex] && groupIndex == (groups.length - 1)\"\n )\n FillStyle(\n v-if=\"objectType === 'node'\"\n :fillStyle=\"objectStyle\"\n @change=\"updateNodeStyle\"\n )\n PathStyle(\n v-if=\"objectType === 'path'\"\n :pathStyle=\"objectStyle\"\n @change=\"updatePathStyle\"\n )\n</template>\n\n<script setup lang=\"ts\">\nimport * as vue from 'vue'\nimport { useThemeCssVariables } from '@renderer/common/themeCssVariables'\n\nuseThemeCssVariables('accordion')\nuseThemeCssVariables('accordioncontent')\nuseThemeCssVariables('accordioncontent')\nuseThemeCssVariables('accordionpanel')\n\nimport type { PropertyGroup, StylingGroup } from '@editor/components/properties'\n\nimport ToolPanel from '../toolbar/ToolPanel.vue'\nimport InputWidget from '../widgets/InputWidget.vue'\n\nimport FillStyle from './FillStyle.vue'\nimport PathStyle from './PathStyle.vue'\n\n\nimport type {\n INodeStyle,\n IPathStyle\n} from '@renderer/common/svgUtils'\n\nconst props = defineProps<{\n toolId: string\n}>()\n\nconst groups = vue.inject<vue.Ref<PropertyGroup[]>>('componentProperties')\n\n// Remember last opened AccordionPanel\n\nconst openPanel = vue.ref<string>('')\n\nconst disabled = vue.computed<boolean>(() => {\n for (const group of groups!.value) {\n if (group.items.length\n || (group.styling\n && 'fillColours' in group.styling\n && group.styling.fillColours\n && Array.isArray(group.styling.fillColours)\n && group.styling.fillColours.length)) {\n return false\n }\n }\n return true\n})\n\nconst hasContent = vue.computed<boolean[]>(() => {\n return groups!.value.map((group: PropertyGroup) => {\n return (group.items.length > 0\n || (group.styling !== undefined && 'fillColours' in group.styling\n && group.styling.fillColours !== undefined\n && Array.isArray(group.styling.fillColours)\n && group.styling.fillColours.length > 0)\n || (group.styling !== undefined && 'pathStyle' in group.styling)\n )\n })\n})\n\nconst objectStyle = vue.computed<INodeStyle|IPathStyle|undefined>(() => {\n const stylingGroup: StylingGroup = groups!.value.at(-1)! as StylingGroup\n if ('fillColours' in stylingGroup.styling) {\n const fillColours: string[] = [...(stylingGroup.styling.fillColours || [])]\n let direction = 'H'\n const colours: string[] = []\n if (fillColours.length && ['H', 'V'].includes(fillColours[0]!)) {\n direction = fillColours.shift()!\n }\n if (fillColours.length === 1) {\n colours.push(fillColours[0]!.trim())\n } else if (fillColours.length) {\n fillColours.forEach(colour => {\n colours.push(colour.trim())\n })\n }\n return {\n gradientFill: colours.length > 1,\n colours,\n direction\n } as INodeStyle\n } else if ('pathStyle' in stylingGroup.styling) {\n return stylingGroup.styling.pathStyle!\n }\n})\n\nconst objectType = vue.computed<string>(() => {\n const stylingGroup: StylingGroup = groups!.value.at(-1)! as StylingGroup\n if ('fillColours' in stylingGroup.styling) {\n return 'node'\n } else if ('pathStyle' in stylingGroup.styling) {\n return 'path'\n }\n return ''\n})\n\nconst emit = defineEmits(['panel-event', 'style-event'])\n\nfunction updateProperties(itemId: string, oldValue: number | string, newValue: number | string) {\n vue.nextTick().then(() => {\n emit('panel-event', props.toolId, itemId, oldValue, newValue)\n })\n}\n\nfunction updateNodeStyle(fillStyle: INodeStyle) {\n void vue.nextTick().then(() => {\n const fillColours: string[] = []\n if (fillStyle.gradientFill) {\n fillColours.push(fillStyle.direction || 'H')\n }\n fillColours.push(...fillStyle.colours)\n emit('style-event', props.toolId, 'node', { fillColours })\n })\n}\n\nfunction updatePathStyle(pathStyle: IPathStyle) {\n void vue.nextTick().then(() => {\n emit('style-event', props.toolId, 'path', { pathStyle })\n })\n}\n</script>\n\n<style>\n/* Allow for FloatLabel text of InputWidget */\n.p-accordioncontent-content {\n padding-top: 8px !important;\n}\n</style>\n","export default \"@prefix bg: <https://bg-rdf.org/ontologies/bondgraph#> .\\n@prefix bgf: <https://bg-rdf.org/ontologies/bondgraph-framework#> .\\n@prefix bpc: <https://bg-rdf.org/ontologies/block-port-connector#> .\\n@prefix cdt: <https://w3id.org/cdt/> .\\n@prefix dcterms: <http://purl.org/dc/terms/> .\\n@prefix owl: <http://www.w3.org/2002/07/owl#> .\\n@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .\\n@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .\\n@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .\\n\\n@base <https://bg-rdf.org/ontologies/bondgraph-framework> .\\n\\n<https://bg-rdf.org/ontologies/bondgraph-framework>\\n a owl:Ontology ;\\n owl:versionInfo \\\"2026-01-21\\\" ;\\n owl:versionIRI <https://bg-rdf.org/ontologies/versioned/bondgraph-framework/2026-01-21-ontology.ttl> ;\\n owl:priorVersion\\n <https://bg-rdf.org/ontologies/versioned/bondgraph-framework/2025-08-13-ontology.html> ,\\n <https://bg-rdf.org/ontologies/versioned/bondgraph-framework/2025-08-13-ontology.ttl> ;\\n dcterms:title \\\"A Framework for Bond-Graph Modelling\\\" .\\n\\n#################################################################\\n# Classes\\n#################################################################\\n\\nbgf:PhysicalDomain\\n a owl:Class ;\\n dcterms:description \\\"A physical domain in which energy is carried by some quantity.\\\" .\\n\\nbgf:Quantity\\n a owl:Class ;\\n dcterms:description \\\"A carrier of energy in a physical domain.\\\" .\\n\\nbgf:Flow\\n a owl:Class ;\\n dcterms:description \\\"The rate of change of a physical domain's quantity.\\\" .\\n\\nbgf:Potential\\n a owl:Class ;\\n dcterms:description \\\"The energy gradient with respect to quantity in a physical domain.\\\" .\\n\\n#################################################################\\n#################################################################\\n\\nbgf:BondgraphModel\\n a owl:Class ;\\n rdfs:subClassOf bg:BondGraph .\\n\\nbgf:BondElement\\n a owl:Class ;\\n rdfs:subClassOf bg:BondElement .\\n\\nbgf:JunctionStructure\\n a owl:Class ;\\n rdfs:subClassOf bg:JunctionStructure .\\n\\nbgf:PowerBond\\n a owl:Class ;\\n dcterms:description \\\"A connection between two PowerPorts over which power is transfered.\\\" ;\\n rdfs:subClassOf bg:PowerBond .\\n\\nbgf:PowerPort\\n a owl:Class ;\\n dcterms:description \\\"A port of a BondElement or JunctionStructure through which power is transfered.\\\" ;\\n rdfs:subClassOf bg:PowerPort .\\n\\n#################################################################\\n\\nbgf:CompositeElement\\n a owl:Class ;\\n dcterms:description \\\"A composite of a bgf:BondElement and a bgf:JunctionStructure, for example a bgf:bgf:ZeroStorageNode.\\\" .\\n\\n#################################################################\\n#################################################################\\n\\nbgf:QuantityStore\\n rdfs:subClassOf bgf:BondElement ;\\n rdfs:label \\\"Static energy store\\\" ;\\n dcterms:description \\\"An element which stores static energy as the amount of some quantity.\\\" .\\n\\nbgf:FlowStore\\n rdfs:subClassOf bgf:BondElement ;\\n rdfs:label \\\"Dynamic energy store\\\" ;\\n dcterms:description \\\"An element which stores dynamic energy as the flow of some quantity.\\\" .\\n\\nbgf:Dissipator\\n rdfs:subClassOf bgf:BondElement ;\\n rdfs:label \\\"Dissipative element\\\" ;\\n dcterms:description \\\"An element which dissipates energy.\\\" .\\n\\nbgf:PotentialSource\\n rdfs:subClassOf bgf:BondElement ;\\n rdfs:label \\\"Potential source\\\" ;\\n dcterms:description \\\"A source of potential energy.\\\" .\\n\\nbgf:FlowSource\\n rdfs:subClassOf bgf:BondElement ;\\n rdfs:label \\\"Flow source\\\" ;\\n dcterms:description \\\"A source of dynamic energy.\\\" .\\n\\n#################################################################\\n\\nbgf:Reaction\\n rdfs:subClassOf bgf:Dissipator ;\\n rdfs:label \\\"Reaction element\\\" ;\\n dcterms:description \\\"A dissipator with two power ports through which quantities are exchanged.\\\" .\\n\\nbgf:Resistance\\n rdfs:subClassOf bgf:Dissipator ;\\n rdfs:label \\\"Resistive element\\\" ;\\n dcterms:description \\\"A dissipator with a single power port.\\\" .\\n\\n#################################################################\\n\\nbgf:OneNode\\n rdfs:subClassOf bgf:JunctionStructure ;\\n rdfs:label \\\"One node\\\" ;\\n dcterms:description \\\"Total potential at node is zero.\\\" .\\n\\nbgf:TransformNode\\n rdfs:subClassOf bgf:JunctionStructure ;\\n rdfs:label \\\"Transform node\\\" ;\\n dcterms:description \\\"Transform potential and flow.\\\" .\\n\\nbgf:ZeroNode\\n rdfs:subClassOf bgf:JunctionStructure ;\\n rdfs:label \\\"Zero node\\\" ;\\n dcterms:description \\\"Total flow at node is zero.\\\" .\\n\\n#################################################################\\n#################################################################\\n\\nbgf:OneStorageNode\\n a bgf:CompositeElement ;\\n rdfs:subClassOf bgf:FlowStore ;\\n rdfs:label \\\"One flow store node\\\" ;\\n dcterms:description \\\"A flow store element with one associated One Nodes\\\" .\\n\\nbgf:OneReactionNode\\n a bgf:CompositeElement ;\\n rdfs:subClassOf bgf:Reaction ;\\n rdfs:label \\\"One reaction node\\\" ;\\n dcterms:description \\\"A dissipator with two associated One Nodes\\\" .\\n\\nbgf:OneResistanceNode\\n a bgf:CompositeElement ;\\n rdfs:subClassOf bgf:Resistance ;\\n rdfs:label \\\"One resistance node\\\" ;\\n dcterms:description \\\"A dissipator with one associated One Node\\\" .\\n\\nbgf:ZeroStorageNode\\n a bgf:CompositeElement ;\\n rdfs:subClassOf bgf:QuantityStore ;\\n rdfs:label \\\"Zero storage node\\\" ;\\n dcterms:description \\\"A storage element with one associated Zero Node\\\" .\\n\\n#################################################################\\n#################################################################\\n\\nbgf:ElementTemplate\\n a owl:Class .\\n\\nbgf:CompositeTemplate\\n a owl:Class .\\n\\nbgf:Constant\\n a owl:Class .\\n\\nbgf:Value\\n a owl:Class .\\n\\nbgf:Variable\\n a owl:Class .\\n\\n#################################################################\\n# Port directions\\n#################################################################\\n\\nbgf:InwardPort\\n a owl:Class .\\n\\nbgf:OutwardPort\\n a owl:Class .\\n\\n#################################################################\\n# Datatypes\\n#################################################################\\n\\nbgf:latex\\n a rdfs:Datatype ;\\n rdfs:subClassOf xsd:string .\\n\\nbgf:mathml\\n a rdfs:Datatype ;\\n rdfs:subClassOf rdf:XMLLiteral .\\n\\n#################################################################\\n# Data properties\\n#################################################################\\n\\nbgf:usesTemplate\\n a owl:DatatypeProperty ;\\n rdfs:domain bgf:BondgraphModel .\\n\\nbgf:hasBlock\\n a owl:DatatypeProperty ;\\n rdfs:domain bgf:BondgraphModel ;\\n rdfs:range xsd:string .\\n\\n#################################################################\\n\\nbgf:bondCount\\n a owl:DatatypeProperty, owl:FunctionalProperty ;\\n dcterms:description \\\"The number of bonds represented in a connection between two Power Ports.\\\" ;\\n rdfs:range xsd:positiveInteger .\\n\\nbgf:constitutiveRelation\\n a owl:DatatypeProperty, owl:FunctionalProperty ;\\n rdfs:domain bgf:ElementTemplate ;\\n rdfs:range bgf:mathml .\\n\\nbgf:hasDomain\\n a owl:DatatypeProperty, owl:FunctionalProperty ;\\n rdfs:domain bgf:PowerPort ;\\n rdfs:range bgf:PhysicalDomain .\\n\\nbgf:portId\\n a owl:DatatypeProperty ;\\n dcterms:description \\\"The identity of each port when a Bond Element or Junction Structure has more than a single Power Port.\\\" ;\\n rdfs:range xsd:Name .\\n\\nbgf:hasSymbol\\n a owl:DatatypeProperty, owl:FunctionalProperty ;\\n rdfs:domain bgf:Value ;\\n rdfs:range xsd:Name .\\n\\nbgf:hasUnits\\n a owl:DatatypeProperty, owl:FunctionalProperty ;\\n rdfs:domain bgf:Variable ;\\n rdfs:range cdt:ucumunit .\\n\\nbgf:hasValue\\n a owl:DatatypeProperty, owl:FunctionalProperty ;\\n rdfs:range cdt:ucum .\\n\\nbgf:varName\\n a owl:DatatypeProperty, owl:FunctionalProperty ;\\n dcterms:description \\\"A name to identify a variable, for both when it is declared and when it is given a value.\\\" ;\\n rdfs:range xsd:Name .\\n\\n#################################################################\\n# Object Properties\\n#################################################################\\n\\nbgf:hasBondElement\\n a owl:ObjectProperty ;\\n rdfs:domain bgf:BondgraphModel ;\\n rdfs:range bgf:BondElement .\\n\\nbgf:hasJunctionStructure\\n a owl:ObjectProperty ;\\n rdfs:domain bgf:BondgraphModel ;\\n rdfs:range bgf:JunctionStructure .\\n\\nbgf:hasPowerBond\\n a owl:ObjectProperty ;\\n rdfs:domain bgf:BondgraphModel ;\\n rdfs:range bgf:PowerBond .\\n\\n#################################################################\\n\\nbgf:direction\\n a owl:ObjectProperty, owl:FunctionalProperty ;\\n dcterms:description \\\"The inward or outward direction of a power port of a multi-port Bond Element.\\\" .\\n\\nbgf:hasConstant\\n a owl:ObjectProperty, owl:FunctionalProperty ;\\n rdfs:domain bgf:PhysicalDomain ;\\n rdfs:range bgf:Variable .\\n\\nbgf:hasPort\\n a owl:ObjectProperty, owl:FunctionalProperty ;\\n rdfs:domain bgf:ElementTemplate .\\n\\nbgf:hasParameter\\n a owl:ObjectProperty, owl:FunctionalProperty ;\\n dcterms:description \\\"A parameter for the constitutive relation of a Bond Element.\\\" ;\\n rdfs:domain bgf:ElementTemplate ;\\n rdfs:range bgf:Variable .\\n\\nbgf:hasVariable\\n a owl:ObjectProperty, owl:FunctionalProperty ;\\n dcterms:description \\\"A non-parameter variable in the constitutive relation of a Bond Element that could be assigned a value.\\\" ;\\n rdfs:domain bgf:ElementTemplate ;\\n rdfs:range bgf:Variable .\\n\\n#################################################################\\n\\nbgf:parameterValue\\n a owl:ObjectProperty, owl:FunctionalProperty ;\\n dcterms:description \\\"A value to assign to a parameter of a bond element\\\" ;\\n rdfs:domain bgf:BondElement ;\\n rdfs:range bgf:Value .\\n\\nbgf:variableValue\\n a owl:ObjectProperty, owl:FunctionalProperty ;\\n dcterms:description \\\"A value to assign to a non-parameter variable in the constitutive relation of a bond element.\\\" ;\\n rdfs:domain bgf:BondElement ;\\n rdfs:range bgf:Value .\\n\\n#################################################################\\n\\nbgf:hasSource\\n a owl:ObjectProperty, owl:FunctionalProperty ;\\n rdfs:domain bgf:PowerBond ;\\n rdfs:range bgf:PowerPort .\\n\\nbgf:hasTarget\\n a owl:ObjectProperty, owl:FunctionalProperty ;\\n rdfs:domain bgf:PowerBond ;\\n rdfs:range bgf:PowerPort .\\n\\n#################################################################\\n\\nbgf:hasPotential\\n a owl:ObjectProperty, owl:FunctionalProperty ;\\n rdfs:domain bgf:PhysicalDomain ;\\n rdfs:range bgf:Variable .\\n\\nbgf:hasFlow\\n a owl:ObjectProperty, owl:FunctionalProperty ;\\n rdfs:domain bgf:PhysicalDomain ;\\n rdfs:range bgf:Variable .\\n\\nbgf:hasQuantity\\n a owl:ObjectProperty, owl:FunctionalProperty ;\\n rdfs:domain bgf:PhysicalDomain ;\\n rdfs:range bgf:Variable .\\n\\n#################################################################\\n# Annotation Properties\\n#################################################################\\n\\nbgf:hasLocation\\n dcterms:description \\\"The location of an element or junction in the physical system described by the bond graph.\\\" .\\n\\nbgf:hasSpecies\\n dcterms:description \\\"The entity which an element or junction represents in the physical system described by the bond graph.\\\" .\\n\\n#################################################################\\n#################################################################\\n\\nbgf:elementTemplate\\n a owl:ObjectProperty, owl:FunctionalProperty ;\\n rdfs:domain bgf:CompositeTemplate ;\\n rdfs:range bgf:ElementTemplate .\\n\\nbgf:junctionStructure\\n a owl:ObjectProperty, owl:FunctionalProperty ;\\n rdfs:domain bgf:CompositeTemplate ;\\n rdfs:range bgf:JunctionStructure .\\n\\n#################################################################\\n#################################################################\\n\"","export default \"@prefix bgf: <https://bg-rdf.org/ontologies/bondgraph-framework#> .\\n@prefix cdt: <https://w3id.org/cdt/> .\\n@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .\\n\\n#===============================================================================\\n\\nbgf:Chemical\\n a bgf:PhysicalDomain ;\\n bgf:hasConstant [\\n bgf:varName \\\"RT\\\" ;\\n bgf:hasValue \\\"2578.73058 J/mol\\\"^^cdt:ucum\\n ], [\\n bgf:varName \\\"F\\\" ;\\n rdfs:label \\\"Faraday's constant\\\" ;\\n bgf:hasValue \\\"0.96485e5 C/mol\\\"^^cdt:ucum\\n ] ;\\n bgf:hasFlow [\\n bgf:varName \\\"v\\\" ;\\n bgf:hasUnits \\\"mol/s\\\"^^cdt:ucumunit\\n ] ;\\n bgf:hasPotential [\\n bgf:varName \\\"u\\\" ;\\n bgf:hasUnits \\\"J/mol\\\"^^cdt:ucumunit\\n ] ;\\n bgf:hasQuantity [\\n bgf:varName \\\"q\\\" ;\\n rdfs:label \\\"Chemical quantity (mol)\\\" ;\\n bgf:hasUnits \\\"mol\\\"^^cdt:ucumunit\\n ] .\\n\\n\\n#===============================================================================\\n\\nbgf:ChemicalPotential\\n a bgf:ElementTemplate ;\\n rdfs:subClassOf bgf:PotentialSource ;\\n bgf:hasDomain bgf:Chemical .\\n\\nbgf:ChemicalFlow\\n a bgf:ElementTemplate ;\\n rdfs:subClassOf bgf:FlowSource ;\\n bgf:hasDomain bgf:Chemical .\\n\\n#===============================================================================\\n\\nbgf:ChemicalReaction\\n a bgf:ElementTemplate ;\\n rdfs:subClassOf bgf:Reaction ;\\n bgf:hasDomain bgf:Chemical ;\\n rdfs:label \\\"Chemical reaction\\\" ;\\n bgf:hasPort [\\n bgf:portId 'f' ;\\n bgf:direction bgf:InwardPort\\n ], [\\n bgf:portId 'r' ;\\n bgf:direction bgf:OutwardPort\\n ] ;\\n bgf:hasParameter [\\n bgf:varName \\\"kappa\\\" ;\\n bgf:hasUnits \\\"mol/s\\\"^^cdt:ucumunit\\n ] ;\\n # v = kappa*(exp(u_f/RT) - exp(u_r/RT))\\n bgf:constitutiveRelation \\\"\\\"\\\"\\n <math xmlns=\\\"http://www.w3.org/1998/Math/MathML\\\">\\n <apply>\\n <eq/>\\n <ci>v</ci>\\n <apply>\\n <times/>\\n <ci>kappa</ci>\\n <apply>\\n <minus/>\\n <apply>\\n <exp/>\\n <apply>\\n <divide/>\\n <ci>u_f</ci>\\n <ci>RT</ci>\\n </apply>\\n </apply>\\n <apply>\\n <exp/>\\n <apply>\\n <divide/>\\n <ci>u_r</ci>\\n <ci>RT</ci>\\n </apply>\\n </apply>\\n </apply>\\n </apply>\\n </apply>\\n </math>\\n \\\"\\\"\\\"^^bgf:mathml .\\n\\n#===============================================================================\\n\\nbgf:ChemicalConcentration\\n a bgf:ElementTemplate ;\\n rdfs:subClassOf bgf:QuantityStore ;\\n bgf:hasDomain bgf:Chemical ;\\n rdfs:label \\\"Chemical concentration\\\" ;\\n bgf:hasParameter [\\n bgf:varName \\\"K\\\" ;\\n bgf:hasUnits \\\"mol-1\\\"^^cdt:ucumunit\\n ] ;\\n # ode(q, t) = v\\n # u = RT*ln(K*q);\\n bgf:constitutiveRelation \\\"\\\"\\\"\\n <math xmlns=\\\"http://www.w3.org/1998/Math/MathML\\\">\\n <apply>\\n <eq/>\\n <apply>\\n <diff/>\\n <bvar>\\n <ci>t</ci>\\n </bvar>\\n <ci>q</ci>\\n </apply>\\n <ci>v</ci>\\n </apply>\\n <apply>\\n <eq/>\\n <ci>u</ci>\\n <apply>\\n <times/>\\n <ci>RT</ci>\\n <apply>\\n <ln/>\\n <apply>\\n <times/>\\n <ci>K</ci>\\n <ci>q</ci>\\n </apply>\\n </apply>\\n </apply>\\n </apply>\\n </math>\\n \\\"\\\"\\\"^^bgf:mathml .\\n\\n#===============================================================================\\n\\nbgf:NKETransporter\\n a bgf:ElementTemplate ;\\n rdfs:subClassOf bgf:Reaction ;\\n bgf:hasDomain bgf:Chemical ;\\n bgf:hasSymbol \\\"NKE\\\" ;\\n bgf:hasPort [\\n bgf:portId 'K_f' ;\\n bgf:direction bgf:InwardPort ;\\n bgf:bondCount 2\\n ], [\\n bgf:portId 'K_r' ;\\n bgf:direction bgf:OutwardPort ;\\n bgf:bondCount 2\\n ], [\\n bgf:portId 'Na_f' ;\\n bgf:direction bgf:InwardPort ;\\n bgf:bondCount 3\\n ], [\\n bgf:portId 'Na_r' ;\\n bgf:direction bgf:OutwardPort ;\\n bgf:bondCount 3\\n ] ;\\n bgf:hasParameter [\\n bgf:varName \\\"k_NKE\\\" ;\\n bgf:hasUnits \\\"mol/s\\\"^^cdt:ucumunit\\n ], [\\n bgf:varName \\\"K_K\\\";\\n bgf:hasUnits \\\"L/mol\\\"^^cdt:ucumunit\\n ], [\\n bgf:varName \\\"K_Na\\\" ;\\n bgf:hasUnits \\\"L/mol\\\"^^cdt:ucumunit\\n ], [\\n bgf:varName \\\"u_e\\\";\\n bgf:hasUnits \\\"J/C\\\"^^cdt:ucumunit\\n ] ;\\n bgf:hasVariable [\\n bgf:varName \\\"q_H2O_in\\\" ;\\n bgf:hasUnits \\\"L\\\"^^cdt:ucumunit\\n ], [\\n bgf:varName \\\"q_H2O_out\\\" ;\\n bgf:hasUnits \\\"L\\\"^^cdt:ucumunit\\n ], [\\n bgf:varName \\\"q_Na_in\\\" ;\\n bgf:hasUnits \\\"mol\\\"^^cdt:ucumunit\\n ], [\\n bgf:varName \\\"q_Na_out\\\" ;\\n bgf:hasUnits \\\"mol\\\"^^cdt:ucumunit\\n ], [\\n bgf:varName \\\"q_K_in\\\" ;\\n bgf:hasUnits \\\"mol\\\"^^cdt:ucumunit\\n ], [\\n bgf:varName \\\"q_K_out\\\" ;\\n bgf:hasUnits \\\"mol\\\"^^cdt:ucumunit\\n ] ;\\n bgf:constitutiveRelation \\\"\\\"\\\"\\n <math xmlns=\\\"http://www.w3.org/1998/Math/MathML\\\">\\n <apply>\\n <eq/>\\n <ci>v</ci>\\n <apply>\\n <divide/>\\n <apply>\\n <times/>\\n <ci>k_NKE</ci>\\n <cn>3</cn>\\n <apply>\\n <minus/>\\n <apply>\\n <times/>\\n <apply>\\n <power/>\\n <apply>\\n <divide/>\\n <apply>\\n <times/>\\n <ci>K_Na</ci>\\n <ci>q_Na_in</ci>\\n </apply>\\n <ci>q_H2O_in</ci>\\n </apply>\\n <cn>3</cn>\\n </apply>\\n <apply>\\n <power/>\\n <apply>\\n <divide/>\\n <apply>\\n <times/>\\n <ci>K_K</ci>\\n <ci>q_K_out</ci>\\n </apply>\\n <ci>q_H2O_out</ci>\\n </apply>\\n <cn>2</cn>\\n </apply>\\n </apply>\\n <apply>\\n <times/>\\n <apply>\\n <power/>\\n <apply>\\n <divide/>\\n <apply>\\n <times/>\\n <ci>K_Na</ci>\\n <ci>q_Na_out</ci>\\n </apply>\\n <ci>q_H2O_out</ci>\\n </apply>\\n <cn>3</cn>\\n </apply>\\n <apply>\\n <power/>\\n <apply>\\n <divide/>\\n <apply>\\n <times/>\\n <ci>K_K</ci>\\n <ci>q_K_in</ci>\\n </apply>\\n <ci>q_H2O_in</ci>\\n </apply>\\n <cn>2</cn>\\n </apply>\\n <apply>\\n <exp/>\\n <apply>\\n <divide/>\\n <apply>\\n <times/>\\n <cn>2</cn>\\n <ci>F</ci>\\n <ci>u_e</ci>\\n </apply>\\n <ci>RT</ci>\\n </apply>\\n </apply>\\n </apply>\\n </apply>\\n </apply>\\n <apply>\\n <times/>\\n <apply>\\n <plus/>\\n <cn>1</cn>\\n <apply>\\n <power/>\\n <apply>\\n <divide/>\\n <apply>\\n <times/>\\n <ci>K_Na</ci>\\n <ci>q_Na_in</ci>\\n </apply>\\n <ci>q_H2O_in</ci>\\n </apply>\\n <cn>3</cn>\\n </apply>\\n </apply>\\n <apply>\\n <plus/>\\n <cn>1</cn>\\n <apply>\\n <power/>\\n <apply>\\n <divide/>\\n <apply>\\n <times/>\\n <ci>K_Na</ci>\\n <ci>q_Na_out</ci>\\n </apply>\\n <ci>q_H2O_out</ci>\\n </apply>\\n <cn>3</cn>\\n </apply>\\n </apply>\\n <apply>\\n <plus/>\\n <cn>1</cn>\\n <apply>\\n <power/>\\n <apply>\\n <divide/>\\n <apply>\\n <times/>\\n <ci>K_K</ci>\\n <ci>q_K_out</ci>\\n </apply>\\n <ci>q_H2O_out</ci>\\n </apply>\\n <cn>2</cn>\\n </apply>\\n </apply>\\n <apply>\\n <plus/>\\n <cn>1</cn>\\n <apply>\\n <power/>\\n <apply>\\n <divide/>\\n <apply>\\n <times/>\\n <ci>K_K</ci>\\n <ci>q_K_in</ci>\\n </apply>\\n <ci>q_H2O_in</ci>\\n </apply>\\n <cn>2</cn>\\n </apply>\\n </apply>\\n </apply>\\n </apply>\\n </apply>\\n </math>\\n \\\"\\\"\\\"^^bgf:mathml .\\n\\n#===============================================================================\\n\\nbgf:ChemicalStorageNode\\n a bgf:CompositeTemplate ;\\n rdfs:label \\\"Chemical storage with Zero Node\\\" ;\\n rdfs:subClassOf bgf:ChemicalConcentration ;\\n rdfs:subClassOf bgf:ZeroStorageNode .\\n\\n#===============================================================================\\n\\nbgf:ChemicalReactionNode\\n a bgf:CompositeTemplate ;\\n rdfs:label \\\"Chemical reaction with One Node\\\" ;\\n rdfs:subClassOf bgf:ChemicalReaction ;\\n rdfs:subClassOf bgf:OneReactionNode .\\n\\n#===============================================================================\\n\\nbgf:NKETransporterNode\\n a bgf:CompositeTemplate ;\\n rdfs:label \\\"NKE transporter with One Node\\\" ;\\n rdfs:subClassOf bgf:NKETransporter ;\\n rdfs:subClassOf bgf:OneReactionNode .\\n\\n#===============================================================================\\n#===============================================================================\\n\"","export default \"@prefix bgf: <https://bg-rdf.org/ontologies/bondgraph-framework#> .\\n@prefix cdt: <https://w3id.org/cdt/> .\\n@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .\\n\\n#===============================================================================\\n\\n# Physical System level\\n\\n#===============================================================================\\n\\nbgf:Electrical\\n a bgf:PhysicalDomain ;\\n bgf:hasFlow [\\n bgf:varName \\\"v\\\" ;\\n rdfs:label \\\"Electrical flow (current)\\\" ;\\n bgf:hasUnits \\\"C/s\\\"^^cdt:ucumunit\\n ] ;\\n bgf:hasPotential [\\n bgf:varName \\\"u\\\" ;\\n rdfs:label \\\"Electrical potential (voltage)\\\" ;\\n bgf:hasUnits \\\"J/C\\\"^^cdt:ucumunit\\n ] ;\\n bgf:hasQuantity [\\n bgf:varName \\\"q\\\" ;\\n rdfs:label \\\"Electrical charge\\\" ;\\n bgf:hasUnits \\\"C\\\"^^cdt:ucumunit\\n ] .\\n\\n#===============================================================================\\n\\nbgf:VoltageSource\\n a bgf:ElementTemplate ;\\n rdfs:subClassOf bgf:PotentialSource ;\\n bgf:hasDomain bgf:Electrical .\\n\\nbgf:CurrentSource\\n a bgf:ElementTemplate ;\\n rdfs:subClassOf bgf:FlowSource ;\\n bgf:hasDomain bgf:Electrical .\\n\\n#===============================================================================\\n\\nbgf:ElectricalResistor\\n a bgf:ElementTemplate ;\\n rdfs:subClassOf bgf:Resistance ;\\n bgf:hasDomain bgf:Electrical ;\\n rdfs:label \\\"Electrical resistor\\\" ;\\n bgf:hasParameter [\\n bgf:varName \\\"R\\\" ;\\n bgf:hasUnits \\\"J.s.C-2\\\"^^cdt:ucumunit\\n ] ;\\n # v = u/R\\n bgf:constitutiveRelation \\\"\\\"\\\"\\n <math xmlns=\\\"http://www.w3.org/1998/Math/MathML\\\">\\n <apply>\\n <eq/>\\n <ci>v</ci>\\n <apply>\\n <divide/>\\n <ci>u</ci>\\n <ci>R</ci>\\n </apply>\\n </apply>\\n </math>\\n \\\"\\\"\\\"^^bgf:mathml .\\n\\n#===============================================================================\\n\\nbgf:ElectricalCapacitor\\n a bgf:ElementTemplate ;\\n rdfs:subClassOf bgf:QuantityStore ;\\n bgf:hasDomain bgf:Electrical ;\\n rdfs:label \\\"Electrical capacitor\\\" ;\\n bgf:hasParameter [\\n bgf:varName \\\"C\\\" ;\\n bgf:hasUnits \\\"C2/J\\\"^^cdt:ucumunit\\n ] ;\\n # dq/dt = v\\n # u = q/C\\n bgf:constitutiveRelation \\\"\\\"\\\"\\n <math xmlns=\\\"http://www.w3.org/1998/Math/MathML\\\">\\n <apply>\\n <eq/>\\n <apply>\\n <diff/>\\n <bvar>\\n <ci>t</ci>\\n </bvar>\\n <ci>q</ci>\\n </apply>\\n <ci>v</ci>\\n </apply>\\n <apply>\\n <eq/>\\n <ci>u</ci>\\n <apply>\\n <divide/>\\n <ci>q</ci>\\n <ci>C</ci>\\n </apply>\\n </apply>\\n </math>\\n \\\"\\\"\\\"^^bgf:mathml .\\n\\n#===============================================================================\\n\\nbgf:ElectricalInductor\\n a bgf:ElementTemplate ;\\n rdfs:subClassOf bgf:FlowStore ;\\n bgf:hasDomain bgf:Electrical ;\\n rdfs:label \\\"Electrical inductor\\\" ;\\n bgf:hasParameter [\\n bgf:varName \\\"L\\\" ;\\n bgf:hasUnits \\\"J.s2.C-2\\\"^^cdt:ucumunit\\n ] ;\\n # dv/dt = u/L\\n bgf:constitutiveRelation \\\"\\\"\\\"\\n <math xmlns=\\\"http://www.w3.org/1998/Math/MathML\\\">\\n <apply>\\n <eq/>\\n <apply>\\n <diff/>\\n <bvar>\\n <ci>t</ci>\\n </bvar>\\n <ci>v</ci>\\n </apply>\\n <apply>\\n <divide/>\\n <ci>u</ci>\\n <ci>L</ci>\\n </apply>\\n </apply>\\n </math>\\n \\\"\\\"\\\"^^bgf:mathml .\\n\\n#===============================================================================\\n#===============================================================================\\n\\nbgf:ElectricalCapacitiveNode\\n a bgf:CompositeTemplate ;\\n rdfs:label \\\"Electrical storage with Zero Node\\\" ;\\n rdfs:subClassOf bgf:ElectricalCapacitor ;\\n rdfs:subClassOf bgf:ZeroStorageNode .\\n\\n#===============================================================================\\n\\nbgf:ElectricalInductiveNode\\n a bgf:CompositeTemplate ;\\n rdfs:label \\\"Electrical inductor with One Node\\\" ;\\n rdfs:subClassOf bgf:ElectricalInductor ;\\n rdfs:subClassOf bgf:OneStorageNode .\\n\\n#===============================================================================\\n\\nbgf:ElectricalResistiveNode\\n a bgf:CompositeTemplate ;\\n rdfs:label \\\"Electrical resistance with One Node\\\" ;\\n rdfs:subClassOf bgf:ElectricalResistor ;\\n rdfs:subClassOf bgf:OneResistanceNode .\\n\\n#===============================================================================\\n#===============================================================================\\n\"","export default \"@prefix bgf: <https://bg-rdf.org/ontologies/bondgraph-framework#> .\\n@prefix cdt: <https://w3id.org/cdt/> .\\n@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .\\n\\n#===============================================================================\\n\\n# Physical System level\\n\\n#===============================================================================\\n\\nbgf:Hydraulic\\n a bgf:PhysicalDomain ;\\n bgf:hasConstant [\\n bgf:varName \\\"RT\\\" ;\\n bgf:hasValue \\\"2578.73058 J/mol\\\"^^cdt:ucum\\n ] ;\\n bgf:hasFlow [\\n bgf:varName \\\"v\\\" ;\\n rdfs:label \\\"Fluid flow (L/s)\\\" ;\\n bgf:hasUnits \\\"L/s\\\"^^cdt:ucumunit\\n ] ;\\n bgf:hasPotential [\\n bgf:varName \\\"u\\\" ;\\n rdfs:label \\\"Fluid pressure (kPa)\\\" ;\\n bgf:hasUnits \\\"J/L\\\"^^cdt:ucumunit\\n ] ;\\n bgf:hasQuantity [\\n bgf:varName \\\"q\\\" ;\\n rdfs:label \\\"Fluid volume (L)\\\" ;\\n bgf:hasUnits \\\"L\\\"^^cdt:ucumunit\\n ] .\\n\\n#===============================================================================\\n\\nbgf:HydraulicPotential\\n a bgf:ElementTemplate ;\\n rdfs:subClassOf bgf:PotentialSource ;\\n bgf:hasDomain bgf:Hydraulic .\\n\\nbgf:HydraulicFlow\\n a bgf:ElementTemplate ;\\n rdfs:subClassOf bgf:FlowSource ;\\n bgf:hasDomain bgf:Hydraulic .\\n\\n#===============================================================================\\n\\nbgf:HydraulicStorage\\n a bgf:ElementTemplate ;\\n rdfs:subClassOf bgf:QuantityStore ;\\n bgf:hasDomain bgf:Hydraulic ;\\n rdfs:label \\\"Hydraulic storage vessel\\\" ;\\n bgf:hasParameter [\\n bgf:varName \\\"E\\\" ;\\n rdfs:label \\\"Elastance\\\" ;\\n bgf:hasUnits \\\"J\\\"^^cdt:ucumunit\\n ] ;\\n # ode(q, t) = v\\n # u = E/q\\n bgf:constitutiveRelation \\\"\\\"\\\"\\n <math xmlns=\\\"http://www.w3.org/1998/Math/MathML\\\">\\n <apply>\\n <eq/>\\n <apply>\\n <diff/>\\n <bvar>\\n <ci>t</ci>\\n </bvar>\\n <ci>q</ci>\\n </apply>\\n <ci>v</ci>\\n </apply>\\n <apply>\\n <eq/>\\n <ci>u</ci>\\n <apply>\\n <divide/>\\n <ci>E</ci>\\n <ci>q</ci>\\n </apply>\\n </apply>\\n </math>\\n \\\"\\\"\\\"^^bgf:mathml .\\n\\n#===============================================================================\\n\\nbgf:HydraulicResistor\\n a bgf:ElementTemplate ;\\n rdfs:subClassOf bgf:Resistance ;\\n bgf:hasDomain bgf:Hydraulic ;\\n rdfs:label \\\"Hydraulic resistance\\\" ;\\n bgf:hasParameter [\\n bgf:varName \\\"k\\\" ;\\n rdfs:label \\\"Conductance (L/s/kPa)\\\" ;\\n bgf:hasUnits \\\"L2.s-1.J-1\\\"^^cdt:ucumunit\\n ] ;\\n bgf:constitutiveRelation \\\"\\\"\\\"\\n <math xmlns=\\\"http://www.w3.org/1998/Math/MathML\\\">\\n <apply>\\n <eq/>\\n <ci>v</ci>\\n <apply>\\n <times/>\\n <ci>k</ci>\\n <ci>u</ci>\\n </apply>\\n </apply>\\n </math>\\n \\\"\\\"\\\"^^bgf:mathml .\\n\\n#===============================================================================\\n\\nbgf:ElasticVessel\\n a bgf:ElementTemplate ;\\n rdfs:subClassOf bgf:QuantityStore ;\\n bgf:hasDomain bgf:Hydraulic ;\\n rdfs:label \\\"Hydraulic elastic storage vessel\\\" ;\\n bgf:hasParameter [\\n bgf:varName \\\"E\\\" ;\\n rdfs:label \\\"Elastance (J)\\\" ;\\n bgf:hasUnits \\\"J\\\"^^cdt:ucumunit\\n ], [\\n bgf:varName \\\"q_hat\\\" ;\\n rdfs:label \\\"Unstressed volume (L)\\\" ;\\n bgf:hasUnits \\\"L\\\"^^cdt:ucumunit\\n ], [\\n bgf:varName \\\"q_bar\\\" ;\\n rdfs:label \\\"Maximum volume (L)\\\" ;\\n bgf:hasUnits \\\"L\\\"^^cdt:ucumunit\\n ] ;\\n # u = E*(q - q_hat)/sqr(q_bar - q);\\n # ode(q, t) = v\\n bgf:constitutiveRelation \\\"\\\"\\\"\\n <math xmlns=\\\"http://www.w3.org/1998/Math/MathML\\\">\\n <apply>\\n <eq/>\\n <apply>\\n <diff/>\\n <bvar>\\n <ci>t</ci>\\n </bvar>\\n <ci>q</ci>\\n </apply>\\n <ci>v</ci>\\n </apply>\\n <apply>\\n <eq/>\\n <ci>u</ci>\\n <apply>\\n <divide/>\\n <apply>\\n <times/>\\n <ci>E</ci>\\n <apply>\\n <minus/>\\n <ci>q</ci>\\n <ci>q_hat</ci>\\n </apply>\\n </apply>\\n <apply>\\n <power/>\\n <apply>\\n <minus/>\\n <ci>q_bar</ci>\\n <ci>q</ci>\\n </apply>\\n <cn>2</cn>\\n </apply>\\n </apply>\\n </apply>\\n </math>\\n \\\"\\\"\\\"^^bgf:mathml .\\n\\n#===============================================================================\\n\\nbgf:OsmoticTransporter\\n a bgf:ElementTemplate ;\\n rdfs:subClassOf bgf:Reaction ;\\n bgf:hasDomain bgf:Hydraulic ; # this gives us flow/potential symbols (v: L/s, u: kPa)\\n rdfs:label \\\"Osmotic transport\\\" ;\\n bgf:hasSymbol \\\"R\\\" ;\\n bgf:hasPort [\\n bgf:portId 'water_in' ;\\n bgf:direction bgf:InwardPort\\n ], [\\n bgf:portId 'water_out' ;\\n bgf:direction bgf:OutwardPort\\n ] ;\\n bgf:hasParameter [\\n bgf:varName \\\"k_membrane\\\" ;\\n rdfs:label \\\"Membrane permeability (L/s/kPa)\\\" ;\\n bgf:hasUnits \\\"L2.s-1.J-1\\\"^^cdt:ucumunit\\n ] ;\\n bgf:hasVariable [\\n bgf:varName \\\"q_solute_in\\\" ;\\n rdfs:label \\\"Inner solute quantity (mol)\\\" ;\\n bgf:hasUnits \\\"mol\\\"^^cdt:ucumunit\\n ], [\\n bgf:varName \\\"q_water_in\\\" ;\\n rdfs:label \\\"Inner water quantity (L)\\\" ;\\n bgf:hasUnits \\\"L\\\"^^cdt:ucumunit\\n ], [\\n bgf:varName \\\"q_solute_out\\\" ;\\n rdfs:label \\\"Outer solute quantity (mol)\\\" ;\\n bgf:hasUnits \\\"mol\\\"^^cdt:ucumunit\\n ], [\\n bgf:varName \\\"q_water_out\\\" ;\\n rdfs:label \\\"Outer water quantity (L)\\\" ;\\n bgf:hasUnits \\\"L\\\"^^cdt:ucumunit\\n ] ;\\n # v = k_membrane*((u_water_in - u_water_out) - RT*(q_solute_in/q_water_in - q_solute_out/q_water_out))\\n bgf:constitutiveRelation \\\"\\\"\\\"\\n <math xmlns=\\\"http://www.w3.org/1998/Math/MathML\\\">\\n <apply>\\n <eq/>\\n <ci>v</ci>\\n <apply>\\n <times/>\\n <ci>k_membrane</ci>\\n <apply>\\n <minus/>\\n <apply>\\n <minus/>\\n <ci>u_water_in</ci>\\n <ci>u_water_out</ci>\\n </apply>\\n <apply>\\n <times/>\\n <ci>RT</ci>\\n <apply>\\n <minus/>\\n <apply>\\n <divide/>\\n <ci>q_solute_in</ci>\\n <ci>q_water_in</ci>\\n </apply>\\n <apply>\\n <divide/>\\n <ci>q_solute_out</ci>\\n <ci>q_water_out</ci>\\n </apply>\\n </apply>\\n </apply>\\n </apply>\\n </apply>\\n </apply>\\n </math>\\n \\\"\\\"\\\"^^bgf:mathml .\\n\\n#===============================================================================\\n\\n#===============================================================================\\n\\nbgf:OldOsmosis\\n a bgf:ElementTemplate ;\\n rdfs:subClassOf bgf:Reaction ;\\n bgf:hasDomain bgf:Hydraulic ; # this gives us flow/potential symbols (v: L/s, u: kPa)\\n rdfs:label \\\"Osmotic transport (original)\\\" ;\\n bgf:hasSymbol \\\"R\\\" ;\\n bgf:hasParameter [\\n bgf:varName \\\"k_membrane\\\" ;\\n rdfs:label \\\"Membrane permeability (L/s/kPa)\\\" ;\\n bgf:hasUnits \\\"L2.s-1.J-1\\\"^^cdt:ucumunit\\n ] ;\\n bgf:hasVariable [\\n bgf:varName \\\"q_solute_in\\\" ;\\n rdfs:label \\\"Inner solute quantity (mol)\\\" ;\\n bgf:hasUnits \\\"mol\\\"^^cdt:ucumunit\\n ], [\\n bgf:varName \\\"q_water_in\\\" ;\\n rdfs:label \\\"Inner water quantity (L)\\\" ;\\n bgf:hasUnits \\\"L\\\"^^cdt:ucumunit\\n ], [\\n bgf:varName \\\"q_solute_out\\\" ;\\n rdfs:label \\\"Outer solute quantity (mol)\\\" ;\\n bgf:hasUnits \\\"mol\\\"^^cdt:ucumunit\\n ], [\\n bgf:varName \\\"q_water_out\\\" ;\\n rdfs:label \\\"Outer water quantity (L)\\\" ;\\n bgf:hasUnits \\\"L\\\"^^cdt:ucumunit\\n ] ;\\n # v = -k_membrane*RT*(q_solute_in/q_water_in - q_solute_out/q_water_out)\\n bgf:constitutiveRelation \\\"\\\"\\\"\\n <math xmlns=\\\"http://www.w3.org/1998/Math/MathML\\\">\\n <apply>\\n <eq/>\\n <ci>v</ci>\\n <apply>\\n <times/>\\n <ci>k_membrane</ci>\\n <apply>\\n <times/>\\n <ci>RT</ci>\\n <apply>\\n <minus/>\\n <apply>\\n <divide/>\\n <ci>q_solute_out</ci>\\n <ci>q_water_out</ci>\\n </apply>\\n <apply>\\n <divide/>\\n <ci>q_solute_in</ci>\\n <ci>q_water_in</ci>\\n </apply>\\n </apply>\\n </apply>\\n </apply>\\n </apply>\\n </math>\\n \\\"\\\"\\\"^^bgf:mathml .\\n\\n#===============================================================================\\n#===============================================================================\\n\\nbgf:HydraulicResistanceNode\\n a bgf:CompositeTemplate ;\\n rdfs:label \\\"Hydraulic resistance with One Node\\\" ;\\n rdfs:subClassOf bgf:HydraulicResistor ;\\n rdfs:subClassOf bgf:OneResistanceNode .\\n\\nbgf:HydraulicStorageNode\\n a bgf:CompositeTemplate ;\\n rdfs:label \\\"Hydraulic storage with Zero Node\\\" ;\\n rdfs:subClassOf bgf:HydraulicStorage ;\\n rdfs:subClassOf bgf:ZeroStorageNode .\\n\\nbgf:HydraulicElasticStorageNode\\n a bgf:CompositeTemplate ;\\n rdfs:label \\\"Hydraulic elastic storage with Zero Node\\\" ;\\n rdfs:subClassOf bgf:ElasticVessel ;\\n rdfs:subClassOf bgf:ZeroStorageNode .\\n\\nbgf:OsmoticTransporterNode\\n a bgf:CompositeTemplate ;\\n rdfs:label \\\"Hydraulic osmotic transport with One Node\\\" ;\\n rdfs:subClassOf bgf:OsmoticTransporter ;\\n rdfs:subClassOf bgf:OneReactionNode .\\n\\nbgf:OldOsmosisNode\\n a bgf:CompositeTemplate ;\\n rdfs:label \\\"Hydraulic osmotic transport with One Node\\\" ;\\n rdfs:subClassOf bgf:OldOsmosis ;\\n rdfs:subClassOf bgf:OneReactionNode .\\n\\n#===============================================================================\\n#===============================================================================\\n\"","export default \"@prefix bgf: <https://bg-rdf.org/ontologies/bondgraph-framework#> .\\n@prefix cdt: <https://w3id.org/cdt/> .\\n@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .\\n\\n#===============================================================================\\n\\n# Physical System level\\n\\n#===============================================================================\\n\\nbgf:Mechanical\\n a bgf:PhysicalDomain ;\\n bgf:hasFlow [\\n bgf:varName \\\"v\\\" ;\\n bgf:hasUnits \\\"m/s\\\"^^cdt:ucumunit\\n ] ;\\n bgf:hasPotential [\\n bgf:varName \\\"u\\\" ;\\n bgf:hasUnits \\\"J/m\\\"^^cdt:ucumunit\\n ] ;\\n bgf:hasQuantity [\\n bgf:varName \\\"q\\\" ;\\n bgf:hasUnits \\\"m\\\"^^cdt:ucumunit\\n ] .\\n\\n#===============================================================================\\n\\nbgf:MechanicalPotential\\n a bgf:ElementTemplate ;\\n rdfs:subClassOf bgf:PotentialSource ;\\n bgf:hasDomain bgf:Mechanical .\\n\\nbgf:MechanicalFlow\\n a bgf:ElementTemplate ;\\n rdfs:subClassOf bgf:FlowSource ;\\n bgf:hasDomain bgf:Mechanical .\\n\\n#===============================================================================\\n\\nbgf:MechanicalResistor\\n a bgf:ElementTemplate ;\\n rdfs:subClassOf bgf:Resistance ;\\n bgf:hasDomain bgf:Mechanical ;\\n rdfs:label \\\"Mechanical resistor\\\" ;\\n bgf:hasParameter [\\n bgf:varName \\\"R\\\" ;\\n bgf:hasUnits \\\"J.s.m-2\\\"^^cdt:ucumunit\\n ] ;\\n bgf:constitutiveRelation \\\"\\\"\\\"\\n <math xmlns=\\\"http://www.w3.org/1998/Math/MathML\\\">\\n <apply>\\n <eq/>\\n <ci>u</ci>\\n <apply>\\n <times/>\\n <ci>v</ci>\\n <ci>R</ci>\\n </apply>\\n </apply>\\n </math>\\n \\\"\\\"\\\"^^bgf:mathml .\\n\\n#===============================================================================\\n\\nbgf:MechanicalCapacitor\\n a bgf:ElementTemplate ;\\n rdfs:subClassOf bgf:QuantityStore ;\\n bgf:hasDomain bgf:Mechanical ;\\n rdfs:label \\\"Mechanical capacitor\\\" ;\\n bgf:hasParameter [\\n bgf:varName \\\"C\\\" ;\\n bgf:hasUnits \\\"m2/J\\\"^^cdt:ucumunit\\n ] ;\\n bgf:constitutiveRelation \\\"\\\"\\\"\\n <math xmlns=\\\"http://www.w3.org/1998/Math/MathML\\\">\\n <apply>\\n <eq/>\\n <apply>\\n <diff/>\\n <bvar>\\n <ci>t</ci>\\n </bvar>\\n <ci>q</ci>\\n </apply>\\n <ci>v</ci>\\n </apply>\\n <apply>\\n <eq/>\\n <ci>u</ci>\\n <apply>\\n <divide/>\\n <ci>q</ci>\\n <ci>C</ci>\\n </apply>\\n </apply>\\n </math>\\n \\\"\\\"\\\"^^bgf:mathml .\\n\\n#===============================================================================\\n\\nbgf:MechanicalInductor\\n a bgf:ElementTemplate ;\\n rdfs:subClassOf bgf:FlowStore ;\\n bgf:hasDomain bgf:Mechanical ;\\n rdfs:label \\\"Mechanical inductor\\\" ;\\n bgf:hasParameter [\\n bgf:varName \\\"L\\\" ;\\n bgf:hasUnits \\\"J.s2.m-2\\\"^^cdt:ucumunit\\n ] ;\\n bgf:hasVariable [\\n bgf:varName \\\"a\\\" ;\\n rdfs:label \\\"Acceleration\\\" ;\\n bgf:hasUnits \\\"m/s2\\\"^^cdt:ucumunit\\n ] ;\\n bgf:constitutiveRelation \\\"\\\"\\\"\\n <math xmlns=\\\"http://www.w3.org/1998/Math/MathML\\\">\\n <apply>\\n <eq/>\\n <apply>\\n <diff/>\\n <bvar>\\n <ci>t</ci>\\n </bvar>\\n <ci>v</ci>\\n </apply>\\n <ci>a</ci>\\n </apply>\\n <apply>\\n <eq/>\\n <ci>u</ci>\\n <apply>\\n <times/>\\n <ci>L</ci>\\n <ci>a</ci>\\n </apply>\\n </apply>\\n </math>\\n \\\"\\\"\\\"^^bgf:mathml .\\n\\n#===============================================================================\\n#===============================================================================\\n\\nbgf:MechanicalCapacitiveNode\\n a bgf:CompositeTemplate ;\\n rdfs:label \\\"Mechanical storage with Zero Node\\\" ;\\n rdfs:subClassOf bgf:MechanicalCapacitor ;\\n rdfs:subClassOf bgf:ZeroStorageNode .\\n\\n#===============================================================================\\n\\nbgf:MechanicalInductiveNode\\n a bgf:CompositeTemplate ;\\n rdfs:label \\\"Mechanical inductor with One Node\\\" ;\\n rdfs:subClassOf bgf:MechanicalInductor ;\\n rdfs:subClassOf bgf:OneStorageNode .\\n\\n#===============================================================================\\n\\nbgf:MechanicalResistiveNode\\n a bgf:CompositeTemplate ;\\n rdfs:label \\\"Mechanical resistance with One Node\\\" ;\\n rdfs:subClassOf bgf:MechanicalResistor ;\\n rdfs:subClassOf bgf:OneResistanceNode .\\n\\n#===============================================================================\\n#===============================================================================\\n\"","/******************************************************************************\n\nCellDL Editor\n\nCopyright (c) 2022 - 2025 David Brooks\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n******************************************************************************/\n\nimport { base64Svg, LatexMathSvg } from '@renderer/common/svgUtils'\n\nimport type {\n BGComponentDefinition,\n BGLibraryComponentTemplate,\n BGElementStyle\n} from './utils'\n\n//==============================================================================\n//==============================================================================\n\nconst ICON_BORDER= '2px'\nconst ICON_PADDING = '3px'\nconst ICON_MIN_WIDTH = '3.5ex'\nconst ICON_MIN_HEIGHT = '4ex'\nconst ICON_VERTICAL_ALIGN = '-1.5ex'\nconst ICON_RADIUS = '6px'\n\nconst MIN_BORDER = '0.2px'\nconst MIN_BORDER_COLOUR = 'grey'\n\n//==============================================================================\n\nexport const DEFAULT_SPECIES = 'i'\nexport const DEFAULT_LOCATION = 'j'\n\n//==============================================================================\n//==============================================================================\n\nconst FLOW_STYLE: BGElementStyle = {\n text: '#00B050',\n background: '#E2F0D9'\n}\n\nconst POTENTIAL_STYLE: BGElementStyle = {\n text: '#FF0909',\n background: '#FBE4D5'\n}\n\nconst POTENTIAL_STORAGE_STYLE: BGElementStyle = {\n text: '#00B050',\n background: '#E2F0D9'\n}\n\nconst KINETIC_STORAGE_STYLE: BGElementStyle = {\n text: 'black',\n background: 'lightgrey'\n}\n\nconst REACTION_STYLE: BGElementStyle = {\n text: '#72329F',\n background: '#FFD966',\n border: 'black'\n}\n\nconst RESISTANCE_STYLE: BGElementStyle = {\n text: '#444',\n background: REACTION_STYLE.background\n}\nconst ONE_RESISTANCE_STYLE: BGElementStyle = {\n text: RESISTANCE_STYLE.text,\n background: RESISTANCE_STYLE.background,\n border: 'green'\n}\n\nconst SCALE_STYLE: BGElementStyle = {\n text: '#7030A0',\n background: '#C1C1FA'\n}\n\nconst UNITS_STYLE: BGElementStyle = {\n text: '#444',\n background: '#DDD'\n}\n\nconst ZERO_STORAGE_STYLE: BGElementStyle = {\n text: FLOW_STYLE.text,\n background: FLOW_STYLE.background,\n border: 'red'\n}\n\n//==============================================================================\n\nexport const BONDGRAPH_COMPONENT_DEFINITIONS: BGComponentDefinition[] = [\n {\n id: 'QuantityStore',\n type: 'https://bg-rdf.org/ontologies/bondgraph-framework#QuantityStore',\n name: 'Static energy store',\n numPorts: 1,\n symbol: 'q',\n style: POTENTIAL_STORAGE_STYLE\n },\n {\n id: 'ZeroNode',\n type: 'https://bg-rdf.org/ontologies/bondgraph-framework#ZeroNode',\n name: 'Zero node',\n numPorts: Infinity,\n symbol: 'u',\n style: POTENTIAL_STYLE\n },\n {\n id: 'OneNode',\n type: 'https://bg-rdf.org/ontologies/bondgraph-framework#OneNode',\n name: 'One node',\n numPorts: Infinity,\n symbol: 'v',\n style: FLOW_STYLE\n },\n {\n id: 'ZeroStorageNode_q',\n type: 'https://bg-rdf.org/ontologies/bondgraph-framework#ZeroStorageNode',\n name: 'Zero storage node',\n numPorts: Infinity,\n symbol: 'q',\n style: ZERO_STORAGE_STYLE\n },\n {\n id: 'ZeroStorageNode_u',\n type: 'https://bg-rdf.org/ontologies/bondgraph-framework#ZeroStorageNode',\n name: 'Zero storage node',\n numPorts: Infinity,\n symbol: 'u',\n style: ZERO_STORAGE_STYLE\n },\n {\n id: 'OneResistanceNode',\n type: 'https://bg-rdf.org/ontologies/bondgraph-framework#OneResistanceNode',\n name: 'One resistance node',\n numPorts: Infinity,\n symbol: 'v',\n style: ONE_RESISTANCE_STYLE\n },\n {\n id: 'Resistance',\n type: 'https://bg-rdf.org/ontologies/bondgraph-framework#Resistance',\n name: 'Resistance',\n numPorts: 1,\n symbol: 'R',\n style: RESISTANCE_STYLE\n },\n {\n id: 'Reaction',\n type: 'https://bg-rdf.org/ontologies/bondgraph-framework#Reaction',\n name: 'Reaction',\n numPorts: 2,\n symbol: 'Rx',\n style: REACTION_STYLE\n },\n {\n id: 'TransformNode',\n type: 'https://bg-rdf.org/ontologies/bondgraph-framework#TransformNode',\n name: 'Transform node',\n numPorts: 2,\n symbol: 'k',\n style: SCALE_STYLE,\n noSpeciesLocation: true\n },\n {\n id: 'FlowStore',\n type: 'https://bg-rdf.org/ontologies/bondgraph-framework#FlowStore',\n name: 'Dynamic energy store',\n numPorts: 1,\n symbol: 'L',\n style: KINETIC_STORAGE_STYLE\n },\n {\n id: 'PotentialSource',\n type: 'https://bg-rdf.org/ontologies/bondgraph-framework#PotentialSource',\n name: 'Potential source',\n numPorts: 1,\n symbol: 'Se',\n style: POTENTIAL_STYLE,\n },\n {\n id: 'FlowSource',\n type: 'https://bg-rdf.org/ontologies/bondgraph-framework#FlowSource',\n name: 'Flow source',\n numPorts: 1,\n symbol: 'Sf',\n style: FLOW_STYLE,\n }\n]\n\n//==============================================================================\n//==============================================================================\n\nfunction typeset(latex: string, style: BGElementStyle, base64: boolean=false): string {\n const svg = LatexMathSvg.svgRect(latex, '', {\n 'min-width': ICON_MIN_WIDTH,\n 'min-height': ICON_MIN_HEIGHT,\n 'vertical-align': ICON_VERTICAL_ALIGN,\n 'border-width': style.border ? ICON_BORDER : MIN_BORDER,\n padding: ICON_PADDING,\n 'corner-radius': ICON_RADIUS,\n background: style.background,\n 'middle-colour': 'white',\n border: style.border || MIN_BORDER_COLOUR\n }\n )\n return base64 ? base64Svg(svg) : svg\n}\n\nfunction makeLatex(symbol: string, species: string|undefined, location: string|undefined): string {\n const latex: string[] = [symbol]\n if (species) {\n latex.push(`^{${species}}`)\n }\n if (location) {\n latex.push(`_{${location}}`)\n }\n return latex.join('')\n}\n\n//======================================\n\nexport function svgImage(symbol: string,\n species: string|undefined,\n location: string|undefined,\n elementStyle: BGElementStyle,\n background: string[]|undefined) {\n const latex = makeLatex(symbol, species, location)\n const style = (!!background && background.length)\n ? Object.assign({}, elementStyle, { background })\n : elementStyle\n return typeset(latex, style)\n}\n\n//==============================================================================\n\nexport function definitionToLibraryTemplate(defn: BGComponentDefinition): BGLibraryComponentTemplate {\n const latex = defn.noSpeciesLocation ? defn.symbol : makeLatex(defn.symbol, DEFAULT_SPECIES, DEFAULT_LOCATION)\n\n return Object.assign({}, defn, {\n image: typeset(latex, defn.style, true)\n })\n}\n\n//==============================================================================\n//==============================================================================\n","/******************************************************************************\n\nCellDL Editor\n\nCopyright (c) 2022 - 2025 David Brooks\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n******************************************************************************/\n/** biome-ignore-all lint/style/noNonNullAssertion: <keys exist in Map> */\n\nimport { ucum } from '@atomic-ehr/ucum'\n\n//==============================================================================\n\nimport { arrowMarkerDefinition } from '@renderer/common/styling'\nimport type { IUiJsonDiscreteInput } from '@renderer/libopencor/locUIJsonApi'\n\nimport { getSvgFillStyle, getSvgPathStyle, setSvgPathStyle, type IPathStyle } from '@renderer/common/svgUtils'\n\nimport { alert } from '@editor/editor/alerts'\nimport {\n CellDLComponent,\n type CellDLConnection,\n type CellDLObject\n} from '@editor/celldlObjects'\nimport type {\n ComponentLibrary,\n ElementTypeName,\n ObjectTemplate\n} from '@editor/components/index'\nimport {\n getItemProperty,\n type ItemDetails,\n type PropertyGroup,\n type StyleObject,\n STYLING_GROUP_ID,\n updateItemProperty,\n type ValueChange\n} from '@editor/components/properties'\nimport * as $rdf from '@renderer/metadata/index'\nimport { BGF, RDF, SPARQL_PREFIXES, type Term } from '@renderer/metadata/index'\nimport { getCurie, type MetadataProperty, MetadataPropertiesMap, RdfStore } from '@renderer/metadata/index'\nimport type { ConnectionStatus, PluginInterface } from '@renderer/plugins/index'\n\nimport {\n BONDGRAPH_COMPONENT_DEFINITIONS,\n DEFAULT_LOCATION,\n DEFAULT_SPECIES,\n definitionToLibraryTemplate,\n svgImage\n} from './definitions'\nimport type {\n BGComponentLibrary,\n BGLibraryComponentTemplate,\n BGElementStyle\n} from './utils'\n\n//==============================================================================\n\nconst BONDGRAPH_FRAMEWORK = 'https://bg-rdf.org/ontologies/bondgraph-framework'\n\n//==============================================================================\n\nconst BGF_ONTOLOGY_URI = 'https://bg-rdf.org/ontologies/bondgraph-framework'\n\nconst BG_RDF_TEMPLATE_BASE_URI = 'https://bg-rdf.org/'\n\nconst BG_RDF_TEMPLATE_URIS = [\n `${BG_RDF_TEMPLATE_BASE_URI}templates/chemical.ttl`,\n `${BG_RDF_TEMPLATE_BASE_URI}templates/electrical.ttl`,\n `${BG_RDF_TEMPLATE_BASE_URI}templates/hydraulic.ttl`,\n `${BG_RDF_TEMPLATE_BASE_URI}templates/mechanical.ttl`\n]\n\nconst BG_RDF_SOURCES: Map<string, string> = new Map()\n\nconst BG_RDF_ASSET_BASE = '/src/assets/bg-rdf/'\n\nconst BG_RDF_ONTOLOGY_ASSET_PATH = `${BG_RDF_ASSET_BASE}ontology.ttl`\n\n// See https://vite.dev/guide/features#custom-queries\n\n// N.B. The path to `glob()` must be a literal, not a computed constant\n\nconst BG_RDF_ONTOLOGY_SOURCE: Record<string, string> = import.meta.glob('@renderer/assets/bg-rdf/ontology.ttl', {\n eager: true,\n import: 'default',\n query: '?raw'\n})\n\nfor (const [path, data] of Object.entries(BG_RDF_ONTOLOGY_SOURCE)) {\n if (path.endsWith(BG_RDF_ONTOLOGY_ASSET_PATH)) {\n BG_RDF_SOURCES.set(BGF_ONTOLOGY_URI, data)\n break\n }\n}\n\n// N.B. The path to `glob()` must be a literal, not a computed constant\n\nconst BG_RDF_TEMPLATE_SOURCES: Record<string, string> = import.meta.glob('@renderer/assets/bg-rdf/templates/*.ttl', {\n eager: true,\n import: 'default',\n query: '?raw'\n})\n\nfor (const [path, data] of Object.entries(BG_RDF_TEMPLATE_SOURCES)) {\n for (const templateUri of BG_RDF_TEMPLATE_URIS) {\n const templatePath = templateUri.substring(BG_RDF_TEMPLATE_BASE_URI.length)\n const templateKey = `${BG_RDF_ASSET_BASE}${templatePath}`\n if (path.endsWith(templateKey)) {\n BG_RDF_SOURCES.set(templateUri, data)\n break\n }\n }\n}\n\n//==============================================================================\n\nexport class BGBaseComponent {\n #name: string|undefined\n #nodeType: string\n #numPorts: number\n #style: BGElementStyle\n #symbol: string\n #type: string\n\n constructor(template: BGLibraryComponentTemplate, name: string, nodeType: string) {\n this.#name = name\n this.#nodeType = nodeType\n this.#symbol = template.symbol\n this.#style = template.style\n this.#type = template.type\n this.#numPorts = template.numPorts\n }\n\n get symbol() {\n return this.#symbol\n }\n\n get isBondElement() {\n return this.#nodeType === BGF.uri('BondElement').value\n }\n\n get isJunctionStructure() {\n return this.#nodeType === BGF.uri('JunctionStructure').value\n }\n\n get name() {\n return this.#name\n }\n\n get numPorts() {\n return this.#numPorts\n }\n\n get style() {\n return this.#style\n }\n\n get type() {\n return this.#type\n }\n}\n\n//==============================================================================\n\ninterface Variable {\n name: string\n units: string\n value?: string\n}\n\ntype IdVariableMap = Map<string, Variable>\n\n//==============================================================================\n\ninterface PhysicalDomain {\n id: string\n flow: Variable\n potential: Variable\n quantity: Variable\n}\n\n//==============================================================================\n\ntype ElementTemplate = ElementTypeName & {\n domain: string\n units?: string\n value?: Variable\n parameters: IdVariableMap\n variables: IdVariableMap\n symbol: string\n defaultStyle: BGElementStyle\n baseComponentType: string\n}\n\n//==============================================================================\n\ninterface PluginData {\n baseComponentType: string\n elementTemplate?: ElementTemplate\n fillColours?: string[]\n symbol?: string\n location?: string\n species?: string\n}\n\n//==============================================================================\n\nenum BG_INPUT {\n ElementType = 'bg-element-type',\n ElementSpecies = 'bg-species',\n ElementLocation = 'bg-location',\n ElementValue = 'bg-element-value'\n}\n\nenum BG_GROUP {\n ElementGroup = 'bg-element-group',\n ParameterGroup = 'bg-parameter-group',\n VariableGroup = 'bg-variable-group'\n}\n\nfunction PROPERTY_GROUPS(): PropertyGroup[] {\n return [\n {\n groupId: BG_GROUP.ElementGroup,\n title: 'Element',\n items: [\n {\n itemId: BG_INPUT.ElementType,\n property: RDF.uri('type').value,\n name: 'Bond Element',\n possibleValues: [],\n optional: true\n },\n {\n itemId: BG_INPUT.ElementSpecies,\n property: BGF.uri('hasSpecies').value,\n name: 'Species',\n defaultValue: ''\n },\n {\n itemId: BG_INPUT.ElementLocation,\n property: BGF.uri('hasLocation').value,\n name: 'Location',\n defaultValue: ''\n },\n // @ts-expect-error:\n {\n itemId: BG_INPUT.ElementValue,\n property: BGF.uri('hasValue').value,\n name: 'Initial value',\n defaultValue: 0,\n numeric: true,\n optional: true\n }\n ]\n },\n {\n groupId: BG_GROUP.ParameterGroup,\n title: 'Parameters',\n items: []\n },\n {\n groupId: BG_GROUP.VariableGroup,\n title: 'Variables',\n items: []\n }\n ]\n}\n\nconst ELEMENT_GROUP_INDEX = 0\nconst PARAMS_GROUP_INDEX = 1\nconst VARS_GROUP_INDEX = 2\n\n// Within ELEMENT_GROUP\nconst ELEMENT_VALUE_INDEX = 3\n\n//==============================================================================\n\nexport class BondgraphPlugin implements PluginInterface {\n readonly id: string = 'bondgraph-components'\n\n #baseComponents: Map<string, BGBaseComponent> = new Map() // Indexed by component.type\n #baseComponentToElementTemplates: Map<string, ElementTemplate[]> = new Map() // Indexed by component.type\n #elementTemplates: Map<string, ElementTemplate> = new Map() // Indexed by element.type\n #propertyGroups: PropertyGroup[]\n\n #componentLibrary: BGComponentLibrary = {\n id: this.id,\n name: 'Bondgraph Elements',\n templates: BONDGRAPH_COMPONENT_DEFINITIONS.map(defn => definitionToLibraryTemplate(defn))\n }\n #bondgraph_component_templates: Map<string, BGLibraryComponentTemplate> = new Map(\n this.#componentLibrary.templates.map((c: BGLibraryComponentTemplate) => [c.id, c])\n )\n\n #currentDocumentUri: string = ''\n #physicalDomains: Map<string, PhysicalDomain> = new Map()\n #rdfStore: RdfStore = new RdfStore()\n\n constructor() {\n this.#propertyGroups = PROPERTY_GROUPS()\n for (const [uri, source] of BG_RDF_SOURCES.entries()) {\n this.#rdfStore.load(uri, source)\n }\n this.#loadDomains()\n this.#loadBaseComponents()\n this.#assignTemplates()\n this.#loadTemplateParameters()\n }\n\n //==========================================================================\n\n get componentLibrary(): ComponentLibrary {\n return this.#componentLibrary\n }\n\n #getName(type: string): string {\n if (this.#elementTemplates.has(type)) {\n return this.#elementTemplates.get(type)!.name\n }\n if (this.#baseComponents.has(type)) {\n return this.#baseComponents.get(type)!.name || ''\n }\n return ''\n }\n\n getPluginData(celldlObject: CellDLObject, rdfStore: RdfStore): object {\n if (celldlObject.isConnection) {\n return {\n baseComponent: {}\n }\n }\n const rows = rdfStore.query(`${SPARQL_PREFIXES}\n PREFIX : <${this.#currentDocumentUri}#>\n\n SELECT ?type ?symbol WHERE {\n ${celldlObject.uri.toString()} a ?type\n OPTIONAL { ${celldlObject.uri.toString()} bgf:hasSymbol ?symbol }\n }`\n )\n let pluginData: PluginData|undefined\n for (const r of rows) {\n const rdfType = r.get('type')!.value\n const symbol = r.get('symbol')\n const baseComponent = this.#baseComponents.get(rdfType)\n if (baseComponent) {\n pluginData = { baseComponentType: rdfType } as PluginData\n } else if (this.#elementTemplates.has(rdfType)) {\n const elementTemplate = this.#elementTemplates.get(rdfType)!\n if (pluginData) {\n pluginData.elementTemplate = elementTemplate\n } else {\n pluginData = {\n baseComponentType: elementTemplate.baseComponentType,\n elementTemplate: elementTemplate\n }\n }\n }\n if (symbol && pluginData) {\n pluginData.symbol = symbol.value\n }\n }\n return pluginData || {}\n }\n\n getTemplateName(rdfType: string): string|undefined {\n const elementTemplate = this.#elementTemplates.get(rdfType)\n if (elementTemplate) {\n return elementTemplate.name\n }\n const baseComponent = this.#baseComponents.get(rdfType)\n if (baseComponent) {\n return baseComponent.name\n }\n }\n\n getObjectTemplateById(id: string): ObjectTemplate|undefined {\n const componentTemplate = this.#bondgraph_component_templates.get(id)\n if (componentTemplate) {\n const metadataProperties: MetadataProperty[] = [\n [ RDF.uri('type'), $rdf.namedNode(componentTemplate.type)],\n [ BGF.uri('hasSymbol'), $rdf.literal(componentTemplate.symbol)]\n ]\n if (!componentTemplate.noSpeciesLocation) {\n metadataProperties.push(\n [ BGF.uri('hasSpecies'), $rdf.literal(DEFAULT_SPECIES)],\n [ BGF.uri('hasLocation'), $rdf.literal(DEFAULT_LOCATION)]\n )\n }\n return {\n CellDLClass: CellDLComponent,\n image: componentTemplate.image,\n metadataProperties: MetadataPropertiesMap.fromProperties(metadataProperties),\n name: this.#getName(componentTemplate.type)\n }\n }\n }\n\n //======================================\n\n getPropertyGroups(): PropertyGroup[] {\n return this.#propertyGroups\n }\n\n //==========================================================================\n\n newDocument(uri: string, rdfStore: RdfStore) {\n // We are creating a BondgraphModel\n\n rdfStore.add($rdf.namedNode(uri), RDF.uri('type'), BGF.uri('BondgraphModel'))\n this.#currentDocumentUri = uri\n\n // Add a copy of the BG-RDF framework as a named graph, to use later when\n // finding BondElements and JunctionStructures\n\n const bgfGraph = $rdf.namedNode(BONDGRAPH_FRAMEWORK)\n for (const statement of this.#rdfStore.statements()) {\n rdfStore.add(statement.subject, statement.predicate, statement.object, bgfGraph)\n }\n }\n\n //======================================\n\n addDocumentMetadataToStore(rdfStore: RdfStore) {\n // First remove existing statements about components in the document\n\n rdfStore.update(`${SPARQL_PREFIXES}\n DELETE {\n <${this.#currentDocumentUri}> bgf:hasBondElement ?uri\n }\n WHERE {\n <${this.#currentDocumentUri}> bgf:hasBondElement ?uri\n }`)\n rdfStore.update(`${SPARQL_PREFIXES}\n DELETE {\n <${this.#currentDocumentUri}> bgf:hasJunctionStructure ?uri\n }\n WHERE {\n <${this.#currentDocumentUri}> bgf:hasJunctionStructure ?uri\n }`)\n\n const statements: string[] = []\n\n // Find the BondElements in the diagram\n\n rdfStore.query(`${SPARQL_PREFIXES}\n PREFIX : <${this.#currentDocumentUri}#>\n SELECT ?uri\n WHERE {\n ?uri a ?type .\n ?type rdfs:subClassOf* bgf:BondElement\n }`, true)\n .forEach((r) => {\n statements.push(`<${this.#currentDocumentUri}> bgf:hasBondElement ${r.get('uri')!.toString()} .`)\n })\n\n // Find the JunctionStructures in the diagram\n\n rdfStore.query(`${SPARQL_PREFIXES}\n PREFIX : <${this.#currentDocumentUri}#>\n\n SELECT ?uri\n WHERE {\n ?uri a ?type .\n ?type rdfs:subClassOf* bgf:JunctionStructure\n }`, true)\n .forEach((r) => {\n statements.push(`<${this.#currentDocumentUri}> bgf:hasJunctionStructure ${r.get('uri')!.toString()} .`)\n })\n\n // And add them to the BondgraphModel\n\n rdfStore.update(`${SPARQL_PREFIXES}\n INSERT DATA {\n ${statements.join('\\n')}\n }\n `)\n }\n\n //==========================================================================\n\n addNewConnection(connection: CellDLConnection, rdfStore: RdfStore) {\n const uri = connection.uri.toString()\n rdfStore.update(`${SPARQL_PREFIXES}\n PREFIX : <${this.#currentDocumentUri}#>\n\n INSERT DATA {\n ${uri} bgf:hasSource ${connection.source!.uri.toString()} .\n ${uri} bgf:hasTarget ${connection.target!.uri.toString()} .\n }\n `)\n }\n\n checkConnectionValid(startObject: CellDLObject, endObject: CellDLObject): ConnectionStatus|undefined {\n const startTemplate = (<PluginData>startObject.pluginData(this.id)).elementTemplate\n const endTemplate = (<PluginData>endObject.pluginData(this.id)).elementTemplate\n if (startTemplate?.domain && endTemplate?.domain\n && startTemplate.domain !== endTemplate.domain) {\n return {\n alert: `Cannot connect ${$rdf.fragment(startTemplate.domain)} and ${$rdf.fragment(endTemplate.domain)} physical domains`\n }\n }\n return {\n domain: startTemplate?.domain || endTemplate?.domain\n }\n }\n\n deleteConnection(connection: CellDLConnection, rdfStore: RdfStore) {\n const uri = connection.uri.toString()\n rdfStore.update(`${SPARQL_PREFIXES}\n PREFIX : <${this.#currentDocumentUri}#>\n\n DELETE DATA {\n ${uri} bgf:hasSource ${connection.source!.uri.toString()} .\n ${uri} bgf:hasTarget ${connection.target!.uri.toString()} .\n }\n `)\n }\n\n getMaxConnections(celldlObject: CellDLObject): number {\n const pluginData = (<PluginData>celldlObject.pluginData(this.id))\n const baseComponent = this.#baseComponents.get(pluginData.baseComponentType)\n return baseComponent ? baseComponent.numPorts : Infinity\n }\n\n //==========================================================================\n\n updateComponentProperties(celldlObject: CellDLObject, componentProperties: PropertyGroup[], rdfStore: RdfStore) {\n alert.clear()\n if (celldlObject.isConnection) {\n componentProperties.forEach(group => {\n if (group.groupId === STYLING_GROUP_ID) {\n this.#loadElementStyling(celldlObject, group, true)\n }\n })\n } else {\n const pluginData = (<PluginData>celldlObject.pluginData(this.id))\n componentProperties.forEach(group => {\n if (group.groupId === BG_GROUP.ElementGroup) {\n this.#getElementProperties(celldlObject, group, rdfStore)\n } else if (pluginData.elementTemplate) {\n if (group.groupId === BG_GROUP.ParameterGroup) {\n this.#setVariableTemplates(pluginData.elementTemplate.parameters, group)\n this.#loadVariableProperties(celldlObject, group, rdfStore)\n } else if (group.groupId === BG_GROUP.VariableGroup) {\n this.#setVariableTemplates(pluginData.elementTemplate.variables, group)\n this.#loadVariableProperties(celldlObject, group, rdfStore)\n }\n } else if (group.groupId === STYLING_GROUP_ID) {\n this.#loadElementStyling(celldlObject, group, false)\n }\n })\n }\n }\n\n #getElementProperties(celldlObject: CellDLObject,\n group: PropertyGroup, rdfStore: RdfStore) {\n const propertyTemplates = this.#propertyGroups[ELEMENT_GROUP_INDEX]!\n const pluginData = <PluginData>celldlObject.pluginData(this.id)\n const elementTemplate = pluginData.elementTemplate\n propertyTemplates.items.forEach((itemTemplate: ItemDetails) => {\n const items: ItemDetails[] = []\n if (itemTemplate.itemId === BG_INPUT.ElementType) {\n const discreteItem = this.#getElementTypeItem(itemTemplate, pluginData)\n if (discreteItem) {\n items.push(discreteItem)\n }\n } else if (itemTemplate.itemId === BG_INPUT.ElementSpecies ||\n itemTemplate.itemId === BG_INPUT.ElementLocation ||\n itemTemplate.itemId === BG_INPUT.ElementValue) {\n let item = getItemProperty(celldlObject, itemTemplate, rdfStore)\n if (!item\n && itemTemplate.itemId === BG_INPUT.ElementValue\n && elementTemplate && elementTemplate.value) {\n item = {...itemTemplate, units: elementTemplate.value.units}\n }\n if (item) {\n if (itemTemplate.itemId === BG_INPUT.ElementSpecies) {\n pluginData.species = String(item.value)\n }\n if (itemTemplate.itemId === BG_INPUT.ElementLocation) {\n pluginData.location = String(item.value)\n }\n if (itemTemplate.itemId === BG_INPUT.ElementValue) {\n item.optional = false\n }\n items.push(item)\n }\n }\n group.items.push(...items)\n })\n }\n\n #loadElementStyling(celldlObject: CellDLObject, group: PropertyGroup, connection: boolean) {\n if (connection) {\n group.styling = {\n pathStyle: getSvgPathStyle(celldlObject.celldlSvgElement!.svgElement)\n }\n } else {\n const pluginData = (<PluginData>celldlObject.pluginData(this.id))\n if (!('fillColours' in pluginData)) {\n pluginData.fillColours = getSvgFillStyle(celldlObject.celldlSvgElement!.svgElement.outerHTML)\n }\n group.styling = {\n fillColours: pluginData.fillColours || []\n }\n }\n }\n\n #loadVariableProperties(celldlObject: CellDLObject, group: PropertyGroup, rdfStore: RdfStore) {\n const objectUri = celldlObject.uri.toString()\n\n const values: Map<string, string> = new Map()\n rdfStore.query(`${SPARQL_PREFIXES}\n PREFIX : <${this.#currentDocumentUri}#>\n\n SELECT ?name ?value\n WHERE {\n ${objectUri} bgf:parameterValue [\n bgf:varName ?name ;\n bgf:hasValue ?value\n ]\n }`\n ).forEach((r) => {\n values.set(r.get('name')!.value, r.get('value')!.value)\n })\n\n group.items.forEach(item => {\n const itemVariable = item.itemId.split('/')\n const varName = itemVariable[1]!\n if (values.has(varName)) {\n const valueUnits = values.get(varName)!.split(' ')\n item.value = valueUnits[0]\n item.units = valueUnits[1]\n }\n })\n }\n\n //==========================================================================\n\n #deleteElementValue(celldlObject: CellDLObject, rdfStore: RdfStore) {\n const item = this.#propertyGroups[ELEMENT_GROUP_INDEX]!.items[ELEMENT_VALUE_INDEX]!\n updateItemProperty(item.property, { newValue: '', oldValue: ''}, celldlObject, rdfStore)\n }\n\n #setElementValueTemplate(variable: Variable|undefined, group: PropertyGroup) {\n const haveVarItem = (group.items.length > ELEMENT_VALUE_INDEX)\n\n const itemDefn = this.#propertyGroups[ELEMENT_GROUP_INDEX]!.items[ELEMENT_VALUE_INDEX]!\n if (haveVarItem) {\n const item = group.items[ELEMENT_VALUE_INDEX]!\n if (variable) {\n item.name = `${itemDefn.name} (${variable.units})`\n item.optional = false\n } else {\n item.optional = false\n item.value = ''\n }\n } else if (variable) {\n group.items.push(Object.assign({}, itemDefn, {\n name: `${itemDefn.name} (${variable.units})`,\n optional: false\n }))\n }\n }\n\n #setVariableTemplates(variables: IdVariableMap, group: PropertyGroup, reset: boolean=false) {\n if (reset) {\n group.items.length = 0\n }\n if (group.items.length === 0) {\n for (const variable of variables.values()) {\n // @ts-expect-error: WIP\n group.items.push({\n itemId: `${group.groupId}/${variable.name}`,\n property: BGF.uri('parameterValue').value,\n name: variable.name,\n units: variable.units,\n minimumValue: 0,\n defaultValue: 0,\n numeric: true\n })\n }\n }\n }\n\n //==========================================================================\n //==========================================================================\n\n #printObjectProperties(celldlObject: CellDLObject, rdfStore: RdfStore) {\n const objectUri = celldlObject.uri.toString()\n\n rdfStore.query(`${SPARQL_PREFIXES}\n PREFIX : <${this.#currentDocumentUri}#>\n\n SELECT ?p ?o WHERE {\n ${objectUri} ?p ?o\n }`).forEach((r) => {\n console.log(celldlObject.id, r.get('p')!.value, r.get('o')!.value)\n })\n }\n\n //==========================================================================\n //==========================================================================\n\n async updateObjectProperties(celldlObject: CellDLObject, itemId: string, value: ValueChange,\n componentProperties: PropertyGroup[], rdfStore: RdfStore) {\n await this.#updateElementProperties(value, itemId, celldlObject, rdfStore)\n\n const elementTemplate = (<PluginData>celldlObject.pluginData(this.id)).elementTemplate\n if (elementTemplate) {\n if (itemId === BG_INPUT.ElementType && value.newValue !== value.oldValue) {\n this.#setElementValueTemplate(elementTemplate.value,\n componentProperties[ELEMENT_GROUP_INDEX]!)\n if (!elementTemplate.value) {\n this.#deleteElementValue(celldlObject, rdfStore)\n }\n this.#setVariableTemplates(elementTemplate.parameters,\n componentProperties[PARAMS_GROUP_INDEX]!, true)\n this.#setVariableTemplates(elementTemplate.variables,\n componentProperties[VARS_GROUP_INDEX]!, true)\n }\n this.#updateVariableProperties(value, itemId, celldlObject, elementTemplate, rdfStore)\n }\n }\n\n //==================================\n\n async updateComponentStyling(celldlObject: CellDLObject, objectType: string, styling: StyleObject) {\n const pluginData = (<PluginData>celldlObject.pluginData(this.id))\n if (objectType === 'node' && 'fillColours' in styling) {\n const fillColours = styling.fillColours as string[] || []\n if (fillColours.toString() !== pluginData.fillColours!.toString()) {\n pluginData.fillColours = [...fillColours]\n await this.#updateSvgElement(celldlObject, pluginData.species, pluginData.location)\n }\n } else if (objectType === 'path' && 'pathStyle' in styling) {\n setSvgPathStyle(celldlObject.celldlSvgElement!.svgElement, styling.pathStyle as IPathStyle)\n }\n }\n\n //==================================\n\n async #updateElementProperties(value: ValueChange, itemId: string,\n celldlObject: CellDLObject, rdfStore: RdfStore) {\n const propertyTemplates = this.#propertyGroups[ELEMENT_GROUP_INDEX]!\n const pluginData = (<PluginData>celldlObject.pluginData(this.id))\n\n for (const item of propertyTemplates.items) {\n if (itemId === item.itemId) {\n alert.clear()\n if (itemId === BG_INPUT.ElementType) {\n await this.#updateElementType(item, value, celldlObject, rdfStore)\n } else if (itemId === BG_INPUT.ElementSpecies) {\n const errorMsg = await this.#updateSvgElement(celldlObject, value.newValue, pluginData.location)\n if (errorMsg === '') {\n updateItemProperty(item.property, value, celldlObject, rdfStore)\n pluginData.species = value.newValue\n } else {\n alert.error(errorMsg)\n }\n } else if (itemId === BG_INPUT.ElementLocation) {\n pluginData.location = value.newValue\n const errorMsg = await this.#updateSvgElement(celldlObject, pluginData.species, value.newValue)\n if (errorMsg === '') {\n updateItemProperty(item.property, value, celldlObject, rdfStore)\n pluginData.location = value.newValue\n } else {\n alert.error(errorMsg)\n }\n } else if (itemId === BG_INPUT.ElementValue) {\n this.#updateElementValue(value, celldlObject, rdfStore)\n }\n break\n }\n }\n }\n\n //==================================\n\n #updateElementValue(value: ValueChange, celldlObject: CellDLObject, rdfStore: RdfStore) {\n const objectUri = celldlObject.uri.toString()\n\n rdfStore.update(`${SPARQL_PREFIXES}\n PREFIX : <${this.#currentDocumentUri}#>\n\n DELETE {\n ${objectUri} bgf:hasValue ?value\n }\n WHERE {\n ${objectUri} bgf:hasValue ?value\n }`)\n const newValue = String(value.newValue).trim()\n const elementTemplate = (<PluginData>celldlObject.pluginData(this.id)).elementTemplate\n const variable = elementTemplate!.value\n if (newValue) {\n rdfStore.update(`${SPARQL_PREFIXES}\n PREFIX : <${this.#currentDocumentUri}#>\n\n INSERT DATA {\n ${objectUri} bgf:hasValue \"${newValue} ${variable!.units}\"^^cdt:ucum .\n }\n `)\n }\n }\n\n //==================================\n\n #updateVariableProperties(value: ValueChange, itemId: string, celldlObject: CellDLObject,\n elementTemplate: ElementTemplate, rdfStore: RdfStore) {\n const itemVariable = itemId.split('/')\n if (itemVariable.length !== 2) {\n return\n }\n itemId = itemVariable[0]!\n if (itemId !== BG_GROUP.ParameterGroup && itemId === BG_GROUP.VariableGroup) {\n return\n }\n const varName = itemVariable[1]!\n const objectUri = celldlObject.uri.toString()\n rdfStore.update(`${SPARQL_PREFIXES}\n PREFIX : <${this.#currentDocumentUri}#>\n\n DELETE WHERE {\n ${objectUri} bgf:parameterValue ?pv .\n ?pv bgf:varName \"${varName}\" ;\n bgf:hasValue ?value .\n }`)\n const variable = (itemId === BG_GROUP.ParameterGroup)\n ? elementTemplate.parameters.get(varName)\n : elementTemplate.variables.get(varName)\n if (!variable) {\n return\n }\n rdfStore.update(`${SPARQL_PREFIXES}\n PREFIX : <${this.#currentDocumentUri}#>\n\n INSERT DATA {\n ${objectUri} bgf:parameterValue _:pv .\n _:pv bgf:varName \"${varName}\" ;\n bgf:hasValue \"${value.newValue} ${variable.units}\"^^cdt:ucum .\n }\n `)\n// Check units...\n// ucum.isConvertible(units1: string, units2: string)\n }\n\n //==================================\n\n async #updateSvgElement(celldlObject: CellDLObject,\n species: string|undefined, location: string|undefined): Promise<string> {\n // Update and redraw the component's SVG element\n\n const pluginData = (<PluginData>celldlObject.pluginData(this.id))\n const baseComponent = this.#baseComponents.get(pluginData.baseComponentType)\n if (!baseComponent) {\n return ''\n }\n const symbol = pluginData?.symbol\n ?? pluginData.elementTemplate?.symbol\n ?? baseComponent.symbol\n let svgData = ''\n try {\n svgData = svgImage(symbol, species, location,\n baseComponent.style, pluginData.fillColours)\n // biome-ignore lint/suspicious/noExplicitAny: <>\n } catch (error: any) {\n return (error as Error).message\n }\n if (svgData) {\n const celldlSvgElement = celldlObject.celldlSvgElement!\n await celldlSvgElement.updateSvgElement(svgData)\n celldlSvgElement.redraw()\n }\n return ''\n }\n\n //==========================================================================\n\n styleRules(): string {\n return '.celldl-Connection.bondgraph.arrow { marker-end:url(#connection-end-arrow-bondgraph) }'\n }\n\n svgDefinitions(): string {\n return arrowMarkerDefinition('connection-end-arrow-bondgraph', 'bondgraph')\n }\n\n //==========================================================================\n\n #getElementTypeItem(itemTemplate: ItemDetails, pluginData: PluginData): ItemDetails|undefined {\n const discreteItem = <IUiJsonDiscreteInput>{...itemTemplate}\n\n discreteItem.possibleValues = []\n const baseComponent = this.#baseComponents.get(pluginData.baseComponentType)\n if (!baseComponent) {\n return\n }\n const elementTemplates = this.#baseComponentToElementTemplates.get(baseComponent.type) || []\n\n // `baseComponent` and `templates` are possible values\n discreteItem.possibleValues.push({\n name: baseComponent.name || '',\n value: baseComponent.type,\n emphasise: true\n })\n discreteItem.possibleValues.push(\n ...elementTemplates.map(t => {\n return {\n name: t.name,\n value: t.type\n }\n })\n )\n\n const discreteValue = pluginData.elementTemplate\n ? pluginData.elementTemplate.type\n : baseComponent.type\n const index = discreteItem.possibleValues.findIndex(v => String(discreteValue) === String(v.value))\n if (index >= 0) {\n discreteItem.value = discreteItem.possibleValues[index]\n }\n\n return discreteItem as ItemDetails\n }\n\n //==========================================================================\n\n async #updateElementType(_itemTemplate: ItemDetails, value: ValueChange,\n celldlObject: CellDLObject, rdfStore: RdfStore) {\n const objectUri = celldlObject.uri.toString()\n const pluginData = (<PluginData>celldlObject.pluginData(this.id))\n const baseComponent = this.#baseComponents.get(pluginData.baseComponentType)!\n\n const deleteTriples: string[] = []\n if (this.#elementTemplates.has(value.oldValue)) {\n deleteTriples.push(`${objectUri} a <${value.oldValue}>`)\n deleteTriples.push(`${objectUri} a <${baseComponent.type}>`)\n delete pluginData.elementTemplate\n } else if (this.#baseComponents.has(value.oldValue)) {\n deleteTriples.push(`${objectUri} a <${value.oldValue}>`)\n }\n const oldSymbol = pluginData.symbol\n if (oldSymbol) {\n deleteTriples.push(`${objectUri} bgf:hasSymbol \"${oldSymbol}\"`)\n }\n rdfStore.update(`${SPARQL_PREFIXES}\n PREFIX : <${this.#currentDocumentUri}#>\n DELETE DATA {\n ${deleteTriples.join('\\n')}\n }`)\n\n rdfStore.update(`${SPARQL_PREFIXES}\n PREFIX : <${this.#currentDocumentUri}#>\n INSERT DATA { ${objectUri} a <${value.newValue}> }\n `)\n let newSymbol: string|undefined\n if (this.#elementTemplates.has(value.newValue)) {\n pluginData.elementTemplate = this.#elementTemplates.get(value.newValue)!\n newSymbol = pluginData.elementTemplate.symbol\n }\n if (newSymbol === undefined) {\n newSymbol = baseComponent.symbol\n }\n if (newSymbol) {\n pluginData.symbol = newSymbol\n rdfStore.update(`${SPARQL_PREFIXES}\n PREFIX : <${this.#currentDocumentUri}#>\n INSERT DATA { ${objectUri} bgf:hasSymbol \"${newSymbol}\" }\n `)\n await this.#updateSvgElement(celldlObject, pluginData.species, pluginData.location)\n }\n celldlObject.setName(this.#getName(value.newValue))\n }\n\n //==========================================================================\n //==========================================================================\n\n #query(sparql: string) {\n return this.#rdfStore.query(`${SPARQL_PREFIXES}${sparql}`)\n }\n\n #loadDomains() {\n this.#query(`\n SELECT ?domain\n ?flowName ?flowUnits\n ?potentialName ?potentialUnits\n ?quantityName ?quantityUnits\n WHERE {\n ?domain a bgf:PhysicalDomain ;\n bgf:hasFlow [\n bgf:varName ?flowName ;\n bgf:hasUnits ?flowUnits\n ] ;\n bgf:hasPotential [\n bgf:varName ?potentialName ;\n bgf:hasUnits ?potentialUnits\n ] ;\n bgf:hasQuantity [\n bgf:varName ?quantityName ;\n bgf:hasUnits ?quantityUnits\n ] .\n }`\n ).forEach((r) => {\n const domain = r.get('domain')!\n this.#physicalDomains.set(domain.value, {\n id: domain.value,\n flow: {\n name: r.get('flowName')!.value,\n units: r.get('flowUnits')!.value,\n },\n potential: {\n name: r.get('potentialName')!.value,\n units: r.get('potentialUnits')!.value,\n },\n quantity: {\n name: r.get('quantityName')!.value,\n units: r.get('quantityUnits')!.value,\n },\n })\n })\n }\n\n #loadBaseComponents() {\n // Get information about the components in the add component tool\n this.#query(`\n SELECT ?element ?label ?base WHERE {\n ?element rdfs:subClassOf ?base .\n OPTIONAL { ?element rdfs:label ?label }\n { ?base rdfs:subClassOf* bg:BondElement }\n UNION\n { ?base rdfs:subClassOf* bg:JunctionStructure }\n }`\n ).forEach((r) => {\n const element = r.get('element')!\n const label = r.get('label')\n const base = r.get('base')!\n for (const componentTemplate of this.#bondgraph_component_templates.values()) {\n if (componentTemplate.type === element.value) {\n let component = this.#baseComponents.get(componentTemplate.type)\n if (!component) {\n if (label) { // Ontology labels override component names\n componentTemplate.name = label.value\n }\n component = new BGBaseComponent(componentTemplate,\n label ? label.value : getCurie(element.value),\n base.value)\n this.#baseComponents.set(componentTemplate.type, component)\n }\n componentTemplate.component = component\n }\n }\n })\n }\n\n #getDiffVariable(domain: PhysicalDomain, relation: string): Variable|undefined {\n relation = relation.replace(/\\n \\s*/g, '') // Remove blanks and new lines\n const diffStateVar = relation.match(/<apply><diff\\/><bvar><ci>[^<]*<\\/ci><\\/bvar><ci>([^<]*)<\\/ci><\\/apply>/)\n if (diffStateVar) {\n const symbol = diffStateVar[1]\n if (symbol === domain.quantity.name) {\n return domain.quantity\n } else if (symbol === domain.flow.name) {\n return domain.flow\n } else if (symbol === domain.potential.name) {\n return domain.potential\n }\n }\n }\n\n #assignTemplates() {\n for (const [base, component] of this.#baseComponents.entries()) {\n this.#query(`\n SELECT ?element ?label ?symbol ?domain ?relation WHERE {\n ?element\n rdfs:subClassOf* ?subType ;\n rdfs:subClassOf* <${base}> .\n ?subType bgf:hasDomain ?domain .\n OPTIONAL { ?element rdfs:label ?label }\n OPTIONAL { ?element bgf:hasSymbol ?symbol }\n OPTIONAL { ?subType bgf:constitutiveRelation ?relation }\n FILTER (\n exists { ?element a bgf:ElementTemplate }\n || exists {<${base}> a bgf:CompositeElement}\n )\n } order by ?label`\n ).forEach((r) => {\n const element = r.get('element')!\n const domainId = r.get('domain')!.value\n const label = r.get('label')\n const symbol = r.get('symbol')\n if (!this.#baseComponentToElementTemplates.has(component.type)) {\n this.#baseComponentToElementTemplates.set(component.type, [])\n }\n const elementTemplate: ElementTemplate = {\n type: element.value,\n domain: domainId,\n name: label ? label.value : getCurie(element.value),\n parameters: new Map(),\n variables: new Map(),\n defaultStyle: component.style,\n symbol: symbol ? symbol.value : component.symbol,\n baseComponentType: component.type,\n }\n const domain = this.#physicalDomains.get(domainId)\n if (domain) {\n if (component.type === BGF.uri('PotentialSource').value) {\n elementTemplate.value = domain.potential\n elementTemplate.units = domain.potential.units\n } else if (component.type === BGF.uri('FlowSource').value) {\n elementTemplate.value = domain.flow\n elementTemplate.units = domain.flow.units\n } else if (component.type === BGF.uri('Reaction').value\n || component.type === BGF.uri('Resistance').value) {\n elementTemplate.units = domain.flow.units\n } else {\n const relation = r.get('relation')\n if (relation) {\n const differentiatedVariable = this.#getDiffVariable(domain, relation.value)\n if (differentiatedVariable) {\n elementTemplate.value = differentiatedVariable\n elementTemplate.units = differentiatedVariable.units\n }\n }\n }\n }\n this.#elementTemplates.set(elementTemplate.type, elementTemplate)\n this.#baseComponentToElementTemplates.get(component.type)!.push(elementTemplate)\n })\n }\n }\n\n #saveParametersAndStates(r: Map<string, Term>) {\n const element = r.get('element')!\n const template = this.#elementTemplates.get(element.value)\n if (!template) return ;\n if (r.has('parameterName')) {\n const name = r.get('parameterName')!.value\n template.parameters.set(name, {\n name: name,\n units: r.get('parameterUnits')!.value\n })\n }\n if (r.has('variableName')) {\n const name = r.get('variableName')!.value\n template.variables.set(name, {\n name: name,\n units: r.get('variableUnits')!.value\n })\n }\n }\n\n #loadTemplateParameters() {\n // Find parameters and variables for Element templates\n this.#query(`\n SELECT ?element ?parameterName ?parameterUnits\n ?variableName ?variableUnits\n WHERE {\n ?element a bgf:ElementTemplate .\n {\n ?element bgf:hasParameter [\n bgf:varName ?parameterName ;\n bgf:hasUnits ?parameterUnits\n ]\n }\n UNION\n {\n ?element bgf:hasVariable [\n bgf:varName ?variableName ;\n bgf:hasUnits ?variableUnits\n ]\n }\n } ORDER BY ?element ?parameterName ?variableName`\n ).forEach((r) => {\n this.#saveParametersAndStates(r)\n })\n // Find parameters and variables for Composite templates\n this.#query(`\n SELECT ?element ?parameterName ?parameterUnits\n ?variableName ?variableUnits\n WHERE {\n ?element a bgf:CompositeTemplate ;\n rdfs:subClassOf ?base .\n ?base a bgf:ElementTemplate .\n {\n ?base bgf:hasParameter [\n bgf:varName ?parameterName ;\n bgf:hasUnits ?parameterUnits\n ]\n }\n UNION\n {\n ?base bgf:hasVariable [\n bgf:varName ?variableName ;\n bgf:hasUnits ?variableUnits\n ]\n }\n } ORDER BY ?element ?parameterName ?variableName`\n ).forEach((r) => {\n this.#saveParametersAndStates(r)\n })\n }\n}\n\n//==============================================================================\n//==============================================================================\n","<template lang=\"pug\">\n .flex.flex-col.h-full\n main.editor-pane.relative.flex.grow\n EditorToolbar.editor-bar(\n :buttons=\"toolButtons\"\n type=\"popover\"\n @button-event=\"buttonEvent\"\n @popover-event=\"popoverEvent\"\n )\n div#svg-content(ref=\"svgContent\")\n <!-- context-menu(id=\"context-menu\") -->\n #panel-content(\n :class=\"{ hidden: !panelVisible }\"\n )\n component(\n v-if=\"panelComponent\"\n :is=\"panelComponent\"\n :toolId=\"panelToolId\"\n @panel-event=\"panelEvent\"\n @style-event=\"styleEvent\"\n )\n EditorToolbar.editor-bar(\n :buttons=\"panelButtons\"\n type=\"panel\"\n @button-event=\"buttonEvent\"\n )\n footer.status-bar\n span#status-msg\n span#status-pos\n</template>\n\n<script setup lang=\"ts\">\nimport * as vue from 'vue'\n\nimport primeVueAuraTheme from '@primeuix/themes/aura'\nimport primeVueConfig from 'primevue/config'\n\nimport vueTippy from 'vue-tippy'\nimport 'tippy.js/dist/tippy.css'\n\n//==============================================================================\n\nimport '@renderer/assets/style.css'\nimport '@renderer/assets/icons.css'\n\nimport * as vueCommon from '@renderer/common/vueCommon'\n\nimport { type StyleObject } from '@editor/components/properties'\nimport { CellDLDiagram } from '@editor/diagram/index'\n\nimport { CellDLEditor } from '@editor/editor/index'\nimport { DEFAULT_EDITOR_TOOL_ID, EDITOR_TOOL_IDS, PANEL_IDS } from '@editor/editor/index'\nimport { editGuides } from '@editor/editor/editguides'\nimport { undoRedo } from '@editor/editor/undoredo'\n\nimport { type EditorToolButton } from '@renderer/common/EditorTypes'\nimport EditorToolbar from '@renderer/components/toolbar/EditorToolbar.vue'\n\nimport ComponentPopover from '@renderer/components/popovers/ComponentPopover.vue'\nimport ConnectionStylePopover from '@renderer/components/popovers/ConnectionStylePopover.vue'\n\nimport PropertiesPanel from '@renderer/components/panels/PropertiesPanel.vue'\n\nimport { componentLibraryPlugin } from '@renderer/plugins/index'\nimport { BondgraphPlugin } from '@renderer/plugins/bondgraph/index'\n\n//==============================================================================\n\nimport type {\n CellDLEditorProps,\n EditorData,\n EditorEditCommand,\n EditorFileCommand,\n EditorSetStateCommand,\n EditorViewCommand\n} from '../../index'\n\nconst props = defineProps<CellDLEditorProps>()\n\n//==============================================================================\n//==============================================================================\n\n// Setup PrimeVue's theme, vue-tippy, and our plugins\n\nconst crtInstance = vue.getCurrentInstance();\n\nif (crtInstance) {\n const app = crtInstance.appContext.app;\n\n if (!app.config.globalProperties.$primevue) {\n app.use(primeVueConfig as unknown as vue.Plugin, {\n theme: {\n preset: primeVueAuraTheme,\n options: {\n darkModeSelector: '.celldl-dark-mode'\n }\n }\n })\n }\n\n app.use(vueTippy)\n\n // Install our component library plugin manager and the Bondgraph plugin\n\n componentLibraryPlugin.install(app, {})\n componentLibraryPlugin.registerPlugin(new BondgraphPlugin())\n}\n\nvueCommon.useTheme().setTheme(props.theme)\n\n//==============================================================================\n\nvue.watch(\n () => props.theme,\n () => {\n vueCommon.useTheme().setTheme(props.theme)\n }\n)\n\n//==============================================================================\n\n// Set the default component from the component library\n\nconst defaultComponent = componentLibraryPlugin.getSelectedTemplate()!\n\n//==============================================================================\n//==============================================================================\n\nconst svgContent = vue.ref(null)\n\nlet celldlDiagram: CellDLDiagram|undefined\n\n//==============================================================================\n\nfunction despatchToolbarEvent(type: string, source: string, value: boolean|string) {\n document.dispatchEvent(\n new CustomEvent('toolbar-event', {\n detail: {\n type,\n source,\n value\n }\n })\n )\n}\n\n//==============================================================================\n\nimport { DEFAULT_CONNECTION_STYLE_DEFINITION } from '@editor/connections/index'\n\nfunction connectionStylePrompt(name: string): string {\n return `Draw ${name.toLowerCase()} connection`\n}\n\n//==============================================================================\n\n// Plugins need to be initialised before creating the editor\n\nlet celldlEditor: CellDLEditor = new CellDLEditor()\n\n//==============================================================================\n//==============================================================================\n\nconst toolButtons = vue.ref<EditorToolButton[]>([\n {\n toolId: EDITOR_TOOL_IDS.SelectTool,\n active: (DEFAULT_EDITOR_TOOL_ID as EDITOR_TOOL_IDS) === EDITOR_TOOL_IDS.SelectTool,\n prompt: 'Selection tool',\n icon: 'ci-pointer'\n },\n {\n toolId: EDITOR_TOOL_IDS.DrawConnectionTool,\n active: (DEFAULT_EDITOR_TOOL_ID as EDITOR_TOOL_IDS) === EDITOR_TOOL_IDS.DrawConnectionTool,\n prompt: connectionStylePrompt(DEFAULT_CONNECTION_STYLE_DEFINITION.name),\n icon: DEFAULT_CONNECTION_STYLE_DEFINITION.icon,\n panel: vue.markRaw(ConnectionStylePopover)\n },\n {\n toolId: EDITOR_TOOL_IDS.AddComponentTool,\n active: (DEFAULT_EDITOR_TOOL_ID as EDITOR_TOOL_IDS) === EDITOR_TOOL_IDS.AddComponentTool,\n prompt: defaultComponent.name,\n image: defaultComponent.image,\n panel: vue.markRaw(ComponentPopover)\n }\n])\n\n//==============================================================================\n\nconst panelButtons = vue.ref<EditorToolButton[]>([\n {\n toolId: PANEL_IDS.PropertyPanel,\n prompt: 'Component properties',\n icon: 'ci-cog',\n panel: vue.markRaw(PropertiesPanel)\n }\n])\n\nconst panelComponent = vue.ref<vue.Raw<vue.Component>>()\n\nconst panelVisible = vue.ref<boolean>()\npanelVisible.value = false\n\nconst panelToolId = vue.ref<string>()\n\n//==============================================================================\n\nfunction resetToolBars() {\n // Set the toolbar to its default tool\n\n for (const toolButton of toolButtons.value) {\n toolButton.active = (DEFAULT_EDITOR_TOOL_ID as EDITOR_TOOL_IDS) === toolButton.toolId\n }\n\n // Hide any open panel\n // FUTURE: reset to default panel tool\n\n panelVisible.value = false\n}\n\n//==============================================================================\n\nfunction buttonEvent(toolId: string, active: boolean, newComponent: vue.Raw<vue.Component> | null) {\n if (newComponent) {\n // Update the RH panel to show its current component\n\n if (active) {\n panelComponent.value = newComponent\n panelToolId.value = toolId\n }\n panelVisible.value = active\n }\n\n // Tell the editor that a tool has changed\n\n despatchToolbarEvent('state', toolId, active)\n}\n\n//==============================================================================\n\nfunction popoverEvent(toolId: string, data: any) {\n if (toolId === EDITOR_TOOL_IDS.DrawConnectionTool) {\n toolButtons.value[1]!.prompt = connectionStylePrompt(data.name)\n toolButtons.value[1]!.icon = data.icon\n\n // Tell the editor that the connection style has changed\n\n despatchToolbarEvent('value', toolId, data.id)\n\n } else if (toolId === EDITOR_TOOL_IDS.AddComponentTool) {\n toolButtons.value[2]!.prompt = data.name\n toolButtons.value[2]!.image = data.image\n\n // Tell the editor that the component template has changed\n\n despatchToolbarEvent('value', toolId, data.id)\n }\n}\n\nfunction panelEvent(toolId: string, itemId: string, oldValue: string, newValue: string) {\n document.dispatchEvent(\n new CustomEvent('panel-event', {\n detail: {\n type: 'value',\n source: toolId,\n itemId: itemId,\n value: {\n oldValue,\n newValue\n }\n }\n })\n )\n}\n\nfunction styleEvent(toolId: string, object: string, styling: StyleObject) {\n document.dispatchEvent(\n new CustomEvent('style-event', {\n detail: {\n type: 'value',\n source: toolId,\n object,\n styling\n }\n })\n )\n}\n\n//==============================================================================\n//==============================================================================\n\nconst emit = defineEmits<{\n 'editor-data': [data: EditorData],\n 'error': [msg: string]\n}>()\n\nvue.watch(\n () => props.editorCommand,\n async () => {\n if (props.editorCommand?.command === 'file') {\n const command = props.editorCommand as EditorFileCommand\n const options = command.options\n if (options.action === 'close') {\n resetToolBars()\n celldlDiagram = new CellDLDiagram('', '', celldlEditor)\n await celldlEditor.editDiagram(celldlDiagram)\n } else if (options.action === 'open') {\n resetToolBars()\n if (options.data !== undefined) {\n try {\n celldlDiagram = new CellDLDiagram(options?.name || '', options.data, celldlEditor)\n await celldlEditor.editDiagram(celldlDiagram)\n } catch(err) {\n emit('error', `Cannot open ${options?.name} -- invalid CellDL file?`)\n }\n }\n } else if (options.action === 'data') {\n const celldl = await celldlDiagram?.serialise()\n emit('editor-data', {\n data: celldl,\n kind: options.kind\n } as EditorData)\n }\n } else if (props.editorCommand?.command === 'edit') {\n const command = props.editorCommand as EditorEditCommand\n const options = command.options\n if (options.action === 'clean') {\n undoRedo.clean()\n }\n } else if (props.editorCommand?.command === 'set-state') {\n const command = props.editorCommand as EditorSetStateCommand\n const options = command.options\n if (options.action === 'reset-tools') {\n resetToolBars()\n }\n } else if (props.editorCommand?.command === 'view') {\n const command = props.editorCommand as EditorViewCommand\n editGuides.setState(command.options)\n }\n }\n)\n\n//==============================================================================\n\nvue.onMounted(async () => {\n\n // Tell the editor about the default connection style and component\n\n despatchToolbarEvent('value', EDITOR_TOOL_IDS.DrawConnectionTool, DEFAULT_CONNECTION_STYLE_DEFINITION.id)\n despatchToolbarEvent('value', EDITOR_TOOL_IDS.AddComponentTool, defaultComponent.id)\n\n if (svgContent.value) {\n celldlEditor.mount(svgContent.value)\n\n // Create a new diagram in the editor's window\n celldlDiagram = new CellDLDiagram('', '', celldlEditor)\n\n await celldlDiagram.edit()\n }\n})\n\n//==============================================================================\n//==============================================================================\n</script>\n\n<style scoped>\n.editor-pane {\n min-height: calc(100% - 1.6em);\n}\n.editor-bar {\n width: 40px;\n overflow: auto;\n}\n#svg-content {\n margin: 0;\n border: 2px solid var(--editor-border-color);\n flex: 1;\n overflow: hidden;\n}\n#panel-content {\n width: 250px;\n border: 2px solid var(--editor-border-color);\n border-left-width: 1px;\n right: 38px; /* This depends on panel bar width... */\n top: 0px;\n bottom: 1.6em;\n position: absolute;\n}\n.hidden {\n display: none;\n}\n.status-bar {\n min-height: 1.6em;\n border-top: 1px solid var(--editor-border-color);\n padding-left: 16px;\n padding-right: 16px;\n background-color: var(--editor-statusbar-background);\n}\n#status-msg.error {\n color: red;\n}\n#status-msg.warn {\n color: blue;\n}\n#status-pos {\n float: right;\n}\n</style>\n"],"names":["useTheme","vueusecore.createGlobalState","prefersColorScheme","isLightMode","vue","isDarkMode","_theme","updateLightAndDarkModes","updateDocumentClasses","event","theme","setTheme","newTheme","useLightMode","useDarkMode","CELLDL_URI","BG_URI","BGF_URI","CDT_URI","TPL_URI","DCT_URI","OWL_URI","RDF_URI","RDFS_URI","XSD_URI","CELLDL_DECLARATIONS","WEB_DECLARATIONS","SVG_URI","declaredNamespaces","SPARQL_PREFIXES","prefixUri","Namespace","#nsuri","nsuri","ln","namedNode","CELLDL","BGF","DCT","OWL","RDF","RDFS","getCurie","term","fullUri","isNamedNode","prefix","nsUri","BaseStore","subject","properties","statements","predicate","value","#addMetadataProperties","isLiteral","MetadataPropertiesMap","node","blankNode","#addListAsCollection","v","s","predicateValues","metadata","predicateValue","#metadataValue","isBlankNode","#listFromCollection","result","nodes","next","headItem","nextItem","values","current","index","literal","datatype","makeNamedNode","parts","makeStatement","quad","TurtleContentType","RdfStore","#rdfStore","graph","p","o","g","statement","baseIri","rdf","contentType","error","namespaces","quads","prettyTurtle","sparql","all_graphs","results","inLib","location","parentType","r","fragment","uri","#rdfTypes","prop","key","#copyValue","type","multiValued","property","inSet","ConnectionStyle","DEFAULT_CONNECTION_STYLE_DEFINITION","DEFAULT_CONNECTION_STYLE","CONNECTION_STYLE_DEFINITIONS","TIP_MARGIN","PathPoint$1","PathPoint","point","celldlObject","x","y","Point","PathEdge$1","source","target","svgPath","#svgPath","PathNode","object","_node","PathMaker","#currentSvgPath","#edges","#editorFrame","#lastNode","#lastNodeElement","#pointBeforeNode","#nodes","#objectIds","#pathPoints","#rectilinearDirn","#startObject","#style","editorFrame","startNode","style","#checkMaxConnections","alert","celldlDiagram","connector","#removeSvgPath","connectionStatus","componentLibraryPlugin","pathNode","shiftKey","#addNode","#constrainAngle","startPoint","rectilinear","noTipMargin","slope","PointMath","slopeLength","delta","lengthScale","round","theta","margin","length","#splitPath","endPoint","midX","midY","#setFirstPoints","currentObject","finishing","objectCentroid","firstPoint","currentPoint","midPoints","endFromStart","startFromEnd","#addPoint","end","lastPoint","#changeDirection","addedPoints","newPoint","#setCurrentSvgPath","centroid","prevPoint","nextPoint","PathEdge","lastPoints","endNode","svgElement","edge","metadataProperties","c","CellDLConnection","lastPointIndex","pathEnd","#removeCurrentSvgPath","pathPoints","points","CONNECTION_COLOUR","CONNECTION_WIDTH","svgPathDescription","EDITOR_FRAME_ID","EditorFrame","#frameGroupElement","svgDiagram","editorFrameGroup","element","template","topLeft","bbox","translation","child","feature","PanZoom","#panning","#pointerDownPosition","#svgDiagram","#containerId","#containerOrigin","#containerSize","#resizeObserver","#minScale","#scale","#maxScale","#step","container","#wheelEvent","#resizeObservation","#currentViewbox","getViewbox","#setViewbox","viewbox","editGuides","n","_event","entries","entry","containerSize","wheel","toScale","viewSize","Bounds","#left","#right","#top","#bottom","left","top","right","bottom","pt0","pt1","globalTransform","bottomRight","bounds","epsilon","IdGenerator","#instance","#nextId","idGenerator","nextId","RestrictedValue","#dirty","#value","#minimum","#maximum","rangeStart","rangeEnd","#getValue","minimum","maximum","minValue","maxValue","FixedValue","_minimum","_maximum","ComputedValue","_","RestrictedPoint","#moveOffset","#xValue","#yValue","xValue","yValue","options","FixedPoint","CONTROL_POINT_RADIUS","GRIPPER_OFFSETS","ControlPoint","#celldlObject","#clickHandler","#svgElement","#pointerClickEvent","p1","p2","connection","svg","offsets","svgRect","svgCircle","position","ControlRect","#gridAligned","#topLeft","#bottomRight","#size","#centroid","#centroidOffset","corner_0","corner_1","centroidOffset","align","x0","y0","x1","y1","attributes","FixedControlRect","SELECTION_BOX_ID","SelectionBox","#controlPoints","#drawing","#editor","#movePoint","#panStart","#panTopLeft","#selectedObjects","#selectionRect","#startPoint","#xMin","#xMax","#yMin","#yMax","editor","#drawTo","domPoint","#updateSelectionRect","resized","#setSelectedObjects","#redrawControlHandles","getElementId","currentIndex","controlPoint","#updateContextMenu","#unsetSelectedObjects","xMid","yMid","styles","cursors","selectedItems","fullSelection","component","selectedObjects","id","enabled","CONTEXT_MENU","MoveDetails","ObjectDetails","#object","#parentId","#priorSiblingId","parent","priorSibling","EditorUndoAction","action","#knowledge","#moveDetails","#objectDetails","controlIndex","notifyChanges","UndoRedo","#redoStack","#undoStack","#clearRedoStack","#popRedoStack","editorAction","#pushRedoStack","redoAction","#popUndoStack","#pushUndoStack","undoAction","reDoing","#newUndoAction","diagram","undoRedo","MAX_POINTER_CLICK_TIME","EDITOR_TOOL_IDS","DEFAULT_EDITOR_TOOL_ID","TOOL_TO_STATE","DEFAULT_EDITOR_STATE","PANEL_IDS","SVG_PANEL_ID","CellDLEditor$1","CellDLEditor","#container","#statusMsg","#statusPos","#statusStyle","#celldlDiagram","#panzoom","#pointerMoved","#pointerPosition","#moving","#moved","#editorState","#activeObject","#dragging","#haveFocus","#pathMaker","#nextPathNode","#currentTemplateDetails","#drawConnectionSettings","#selectedObject","#selectionBox","#newSelectionBox","#pointerDownTime","#openPanelId","#propertiesPanel","ObjectPropertiesPanel","#tooltip","#tooltipElement","#tooltipStyle","#toolBarEvent","#componentTemplateSelectedEvent","#componentTemplateDragEvent","#panelEvent","#styleEvent","#objectClickEvent","svgContainer","#pointerDoubleClickEvent","#pointerOverEvent","#pointerOutEvent","#pointerDownEvent","#pointerMoveEvent","#pointerUpEvent","#focusEvent","#keyDownEvent","#keyUpEvent","#appDragOverEvent","#appDropEvent","tippy","useTippy","text","#unsetSelectedObject","#unsetActiveObject","#setDefaultCursor","_itemId","_enable","detail","#closeSelectionBox","msg","#showStatus","pos","#hideTooltip","tooltipStyle","#domToSvgCoords","domCoords","#highlightAssociatedObjects","highlight","obj","#activateObject","active","#setActiveObject","activeObject","#setSelectedObject","selectedObject","#addComponentTemplate","eventPosition","details","dragged","zoomScale","componentGroup","itemList","item","clickedObject","#selectionClickEvent","_element","deselected","svgPoint","settings","#notDiagramElement","EDITOR_GRID_CLASS","#deleteSelectedObjects","#showSelectedObjectInfo","clear","info","tooltip","warn","elementError","NormalTransform","#inverse","#matrix","p0","translate","l2","scaleRotate","compose","inverse","applyToPoint","Transform","matrix","identity","fromString","transformToString","transform","applyToPoints","pt","tx","ty","CONDUIT_SELECTION_RADIUS","setInternalIds","previousId","idElements","useElements","link","CellDLSVGElement","svgDiagramElement","#globalTransform","#selectionElement","#updatedSvgElement","#bounds","#cornerOffsets","#selected","#selectionClasses","recalculate","#updateBounds","topLeftOffset","connectionComponentGap","SELECTION_STROKE_WIDTH","firstChild","CELLDL_STYLE_CLASS","svgChild","centre","#selectionElementMembers","members","children","#setSelectionClass","cls","enable","_svgElement","_svgPoint","padding","MAX_CONNECTION_SPLAY_PADDING","xBounds","yBounds","CONNECTION_SPLAY_PADDING","corners","pad","deltaX","deltaY","#scaledVerticalOffset","#scaledHorizontalOffset","offset","face","paddingOffset","_undoPosition","_eventType","_svgCoords","selected","_direction","base64Svg","BoundedElement","#connectedPathElements","#controlRect","#topLeftCorner","#transform","#undoMoveAction","gridAligned","gridAlignedCentroid","#reposition","direction","savedCentroid","centroidDelta","path","newTopLeft","globalInverse","undoPosition","savedCorners","cornerDeltas","corner","ID_PART_SEPARATOR","static_value","#static","FixedPathPoint","PathElement","firstElement","lastElement","#connection","#svgParentId","#firstElement","#lastElement","description","#pathArray","SVGPathCommander","#validPath","simplifiedPath","#moveIndex","valid","newPoints","pathPoint","redraw","normalArray","cp","splitPoint","interfaceElement","headArray","tailPoints","svgPathElement","moveIndex","movePoint","_position","_index","_component","_centroidDelta","_cornerDeltas","_pathArray","LinearPath","pathArray","drawCommand","nextX","nextY","boundaryPoint","nPoints","#direction","terminator","other","cp0","cp1","getEdges","i","RectilinearPath","firstIndex","lastIndex","#elementPathPoints","paddedBoundaryPoint","intersections","splayPoint","pathLength","pathIndex","currentPathPoint","firstPathPoints","prevPathPoint","dirn","lastPathPoints","secondPoint","#repositionSplayPoint","boundaryIntersection","roundEqual","#moveSplayPoint","#updateComponentBoundaryPoint","startPosition","alignedPosition","edges","cleanEdges","newEdges","combinedEdge","newEdge","shapeTags","svgPathTag","svgGroupTag","SvgConnection","#pathElements","#moveableElement","svgPaths","connectorElements","cn","pathId","indices","CellDLObject","objectTemplate","updateStore","#celldlStyleClass","#celldlTypeName","#objectTemplate","#name","#setMetadataProperties","#metadataProperties","#pluginData","#celldlSvgElement","#label","#moveable","#children","#parents","celldlSvgElement","rdfType","pluginId","name","_align","label","$rdf.isLiteral","CellDLMoveableObject","CellDLAnnotation","CellDLConnectedObject","#connections","#maxConnections","CellDLComponent","CellDLConduit","CellDLCompartment","#interfacePorts","port","#connectedObjects","#svgConnection","intermediates","CellDLInterface","#externalConnections","CellDLUnconnectedPort","CELLDL_CLASS_MAP","ComponentLibraryPlugin","#app","#registeredPlugins","#componentLibraries","#componentLibrariesRef","#currentDocumentUri","app","_options","plugin","selectedTemplate","rdfStore","startObject","endObject","status","pluginDataMap","CellDLClass","rdfTypes","rows","fullId","pluginTemplateId","componentProperties","objectType","styling","itemId","propertyGroups","STYLING_GROUP","definitions","METADATA_GROUP_ID","OBJECT_METADATA","METADATA_GROUP","nameUri","STYLING_GROUP_ID","getItemProperty","itemTemplate","objectUri","valueUnits","updateItemProperty","newValue","#componentProperties","#propertyGroups","#metadataIndex","group","metadataGroup","ShapeIntersections","#shape","#shapeFromElement","elementName","attrs","shape","elementShape","intersect","IdBounds","ExtendableSpatialIndex","RBush","a","b","CellDLSpatialIndex","#index","#objects","savedItem","PointFinder","#transforms","segment","POINT_EPSILON_SQUARED","CELLDL_VERSION","DIAGRAM_METADATA","NEW_DIAGRAM_URI","CELLDL_DEFINITIONS_ID","CELLDL_METADATA_ID","CELLDL_STYLESHEET_ID","DIAGRAM_MARGIN","CELLDL_DIAGRAM_ID","ID_PREFIX","CellDLDiagram","#kb","$rdf.RdfStore","#celldlEditor","#documentNode","#documentNS","#filePath","#diagramMetadata","#diagramProperties","#currentLayer","#imported","#lastIdentifier","#layers","#orderedLayerIds","#spatialIndex","filePath","celldlData","celldlEditor","importSvg","documentUri","$rdf.namedNode","$rdf.Namespace","#loadCellDL","#loadMetadata","#importSvg","#newDiagram","#initaliseMetadata","#setLastIdentifier","#setupDefines","#setStylesheet","#loadComponents","#loadInterfaces","#loadConduits","#loadConnections","#loadAnnotations","data","dom_to_svg_transform","svgCoords","svg_to_dom_transform","#nextIdentifier","predicates","stmt","$rdf.isBlankNode","#loadDiagramProperties","#saveDiagramProperties","$rdf.literal","lastIdentifier","defsElement","css","CellDLStylesheet","styleElement","#saveMetadata","metadataElement","metadataContent","$rdf.TurtleContentType","svgData","#loadSvgDiagram","backgroundGroup","backgroundElements","CELLDL_BACKGROUND_CLASS","#setLayer","#findLayers","width","lengthToPixels","height","strokedPaths","OLD_CONNECTION_COLOUR","windowSize","layerId","newLayer","layer","childNodes","childNode","#trimSVGDiagram","round10","format","#removeEditorElements","trimmedViewbox","#serialiseMetadata","metadataFormat","err","#setUniqueId","prepend","editorSpecificElements","objects","associated","#associatedObjects","associatedObjects","#addMoveableObject","#addConnection","#addNewObject","compartmentGroup","cornerPoints","compartmentRect","svgRectElement","compartmentShape","objectIds","interfacePorts","connectionPorts","#addConnectionToCompartment","compartment","#createConnection","connectedObjects","svgElements","#createPort","newObjectClass","svgCircleElement","connectors","pathElements","pathStart","newConnectors","newElements","currentPathInside","pathElementIndex","pathElement","pathIntersections","closestOffset","pointFinder","foundPoint","interfacePort","tailSvgElement","headSvgElement","newConnection","#connectCompartmentConnection","assignId","#setObjectSvgElement","#celldlObjectFromRdf","#subjectsOfType","st","#loadObject","subjectType","connectorNode","$rdf.isNamedNode","connectorId","objectDetails","#removeObject","connections","useThemeCssVariables","componentName","onBeforeMount","preset","getCurrentInstance","generateComponentStyles","injectStyles","resolveReference","toKebabCase","str","letter","tokenObj","traverse","parentKey","kebabKey","newKey","resolvedValue","props","__props","buttonClasses","classes","buttonStyle","popoverVisible","popoverTop","pointerPos","toolPopover","popoverElement","emit","__emit","toolButtonClick","e","popoverHeight","adjustment","buttonEvent","toolId","panel","button","popoverEvent","getTemplateEventDetails","slots","hasTitle","showtip","libraries","idToComponent","selectedId","library","selectedElement","dragstart","items","selectedItem","changed","_useModel","emits","nameUnits","scalarType","oldValue","discreteValue","scalarValue","stringValue","emitChange","selectChange","inputTextChange","newValueString","inputTextFocusOut","inputTextKeyPress","startPrompt","styleChange","gradientDirn","colours","startColour","TinyColor","stopColour","colourChange","swapColours","colour","dashed","minWidth","maxWidth","widthStep","pathColour","groups","openPanel","disabled","hasContent","objectStyle","stylingGroup","fillColours","updateProperties","updateNodeStyle","fillStyle","updatePathStyle","pathStyle","__vite_glob_0_0","__vite_glob_1_0","__vite_glob_1_1","__vite_glob_1_2","__vite_glob_1_3","ICON_BORDER","ICON_PADDING","ICON_MIN_WIDTH","ICON_MIN_HEIGHT","ICON_VERTICAL_ALIGN","ICON_RADIUS","MIN_BORDER","MIN_BORDER_COLOUR","DEFAULT_SPECIES","DEFAULT_LOCATION","FLOW_STYLE","POTENTIAL_STYLE","POTENTIAL_STORAGE_STYLE","KINETIC_STORAGE_STYLE","REACTION_STYLE","RESISTANCE_STYLE","ONE_RESISTANCE_STYLE","SCALE_STYLE","ZERO_STORAGE_STYLE","BONDGRAPH_COMPONENT_DEFINITIONS","typeset","latex","base64","LatexMathSvg","makeLatex","symbol","species","svgImage","elementStyle","background","definitionToLibraryTemplate","defn","BONDGRAPH_FRAMEWORK","BGF_ONTOLOGY_URI","BG_RDF_TEMPLATE_BASE_URI","BG_RDF_TEMPLATE_URIS","BG_RDF_SOURCES","BG_RDF_ASSET_BASE","BG_RDF_ONTOLOGY_ASSET_PATH","BG_RDF_ONTOLOGY_SOURCE","BG_RDF_TEMPLATE_SOURCES","templateUri","templatePath","templateKey","BGBaseComponent","#nodeType","#numPorts","#symbol","#type","nodeType","PROPERTY_GROUPS","ELEMENT_GROUP_INDEX","PARAMS_GROUP_INDEX","VARS_GROUP_INDEX","ELEMENT_VALUE_INDEX","BondgraphPlugin","#baseComponents","#baseComponentToElementTemplates","#elementTemplates","#componentLibrary","#bondgraph_component_templates","#physicalDomains","#loadDomains","#loadBaseComponents","#assignTemplates","#loadTemplateParameters","#getName","pluginData","elementTemplate","baseComponent","componentTemplate","bgfGraph","startTemplate","endTemplate","$rdf.fragment","#loadElementStyling","#getElementProperties","#setVariableTemplates","#loadVariableProperties","propertyTemplates","discreteItem","#getElementTypeItem","getSvgPathStyle","getSvgFillStyle","varName","#deleteElementValue","#setElementValueTemplate","variable","haveVarItem","itemDefn","variables","reset","#printObjectProperties","#updateElementProperties","#updateVariableProperties","#updateSvgElement","setSvgPathStyle","#updateElementType","errorMsg","#updateElementValue","itemVariable","arrowMarkerDefinition","elementTemplates","t","_itemTemplate","deleteTriples","oldSymbol","newSymbol","#query","domain","base","#getDiffVariable","relation","diffStateVar","domainId","differentiatedVariable","#saveParametersAndStates","crtInstance","primeVueConfig","primeVueAuraTheme","vueTippy","vueCommon.useTheme","defaultComponent","svgContent","despatchToolbarEvent","connectionStylePrompt","toolButtons","ConnectionStylePopover","ComponentPopover","panelButtons","PropertiesPanel","panelComponent","panelVisible","panelToolId","resetToolBars","toolButton","newComponent","panelEvent","styleEvent","celldl","command"],"mappings":"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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GCAfC,KAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GCAfC,KAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GCAfC,KAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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"}
|