@celldl/viewer 0.20260730.0 → 0.20260731.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 -10
- package/dist/CellDLViewer-VYbEXBgZ.js +12034 -0
- package/dist/CellDLViewer-VYbEXBgZ.js.map +1 -0
- package/dist/CellDLViewer.css +1 -0
- package/dist/CellDLViewer.es.js +1 -2
- package/dist/CellDLViewer.es.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +11 -10
- package/dist/CellDLViewer-Cyo8fJde.js +0 -1463
- package/dist/CellDLViewer-Cyo8fJde.js.map +0 -1
- package/dist/vendor-BsdU7enb.js +0 -14131
- package/dist/vendor-BsdU7enb.js.map +0 -1
- package/dist/viewer.css +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CellDLViewer-Cyo8fJde.js","sources":["../src/common/vueCommon.ts","../src/geometry/units.ts","../src/common/svgUtils.ts","../src/metadata/namespaces.ts","../src/metadata/store.ts","../src/metadata/oxigraphStore.ts","../src/metadata/index.ts","../src/common/points.ts","../src/utils.ts","../src/geometry/index.ts","../src/geometry/controls.ts","../src/common/styling.ts","../src/geometry/transforms.ts","../src/SVGElements/index.ts","../src/SVGElements/boundedelement.ts","../src/celldlObjects/index.ts","../src/viewer/model.ts","../src/viewer/panzoom.ts","../src/viewer/index.ts","../src/components/CellDLViewer.vue"],"sourcesContent":["//==============================================================================\n//\n// From https://github.com/agarny/webapp/blob/main/src/renderer/src/common/vueCommon.ts\n//\n//==============================================================================\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//==============================================================================\n//==============================================================================\n","/******************************************************************************\n\nCellDL Model Viewer\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 const EM_SIZE = 16 // Pixels, sets ``font-size`` in CellDLStylesheet\nexport const EX_SIZE = EM_SIZE / 2\n\nconst CM_PER_INCH = 2.54\nconst MM_PER_INCH = 10 * CM_PER_INCH\n\nconst POINTS_PER_INCH = 72\nconst PICAS_PER_INCH = 6\nconst PIXELS_PER_INCH = 96\n\n//==============================================================================\n\nconst __unit_scaling: Map<string, number | null> = new Map([\n ['px', 1],\n ['in', PIXELS_PER_INCH],\n ['cm', PIXELS_PER_INCH / CM_PER_INCH],\n ['mm', PIXELS_PER_INCH / MM_PER_INCH],\n ['pt', PIXELS_PER_INCH / POINTS_PER_INCH],\n ['pc', PIXELS_PER_INCH / PICAS_PER_INCH],\n ['%', null], // 1/100.0 of viewport dimension\n ['em', EM_SIZE], // em/pt depends on current font size\n ['ex', EX_SIZE] // ex/pt depends on current font size\n])\n\nconst __unit_length_re = /(.*)(em|ex|px|in|cm|mm|pt|pc|%)/\n\nexport function lengthToPixels(length: string | number | null): number | null {\n if (typeof length !== 'string') {\n return length\n }\n const match = length.match(__unit_length_re)\n if (match === null || match.length < 3) {\n return +length\n } else {\n // @ts-expect-error:\n const scaling = __unit_scaling.get(match[2])\n if (scaling !== null && scaling !== undefined) {\n // @ts-expect-error:\n return scaling * +match[1]\n }\n }\n return null\n}\n\nexport function pixelsToLength(pixels: string | number, units: string): string | null {\n const scaling = __unit_scaling.get(units)\n if (scaling !== null && scaling !== undefined) {\n return `${Math.round((+pixels * 1000) / scaling) / 1000}${units}`\n }\n return null\n}\n\n//==============================================================================\n","/******************************************************************************\n\nCellDL Model Viewer\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 '@viewer/common/points'\nimport type { StringProperties } from '@viewer/common/types'\nimport type { Extent } from '@viewer/geometry'\nimport { lengthToPixels } from '@viewer/geometry/units'\n\n//==============================================================================\n\nexport const SVG_URI = 'http://www.w3.org/2000/svg'\n\n//==============================================================================\n\nexport interface INodeStyle {\n gradientFill: boolean\n colours: string[]\n direction?: string\n}\n\nexport interface IPathStyle {\n colour: string // defaut is CONNECTION_COLOUR (with opacity of 0.7)\n width: number // default is CONNECTION_WIDTH (but +2 when selected)\n dashed: boolean // set `dashed` class`\n}\n\n//==============================================================================\n\nexport interface LatexMathSvgOptions {\n background?: string|string[]\n border?: string\n 'border-width'?: string\n class?: string\n 'corner-radius'?: string\n 'middle-colour'?: string\n 'min-height'?: string\n 'min-width'?: string\n padding?: string\n 'vertical-align'?: string\n}\n\n//==============================================================================\n\nexport function svgSize(svgDocument: Document): PointLike | null {\n const svgElement = svgDocument.documentElement\n const width = lengthToPixels(svgElement.getAttribute('width'))\n const height = lengthToPixels(svgElement.getAttribute('height'))\n if (width && height) {\n return {\n x: width,\n y: height\n }\n }\n return null\n}\n\nexport function getViewbox(svgElement: SVGGraphicsElement): Extent {\n return svgElement\n .getAttribute('viewBox')\n ?.split(' ')\n .map((n) => +n) as Extent\n}\n\n//==============================================================================\n\ntype Attributes = StringProperties\n\nexport function createSVGElement(tagName: string, attributes: Attributes): SVGElement {\n const element = document.createElementNS(SVG_URI, tagName)\n for (const [key, value] of Object.entries(attributes)) {\n element.setAttribute(key, value)\n }\n return element\n}\n\nfunction attributePairs(attributes: Attributes): string {\n const attributePairs: string[] = []\n for (const [key, value] of Object.entries(attributes)) {\n attributePairs.push(` ${key}=\"${value}\"`)\n }\n return attributePairs.join('')\n}\n\n//==============================================================================\n\nfunction svgCircleAttributes(c: PointLike, r: number, attributes: Attributes): Attributes {\n return Object.assign({}, attributes, {\n cx: `${c.x}`,\n cy: `${c.y}`,\n r: `${r}`\n })\n}\n\nexport function svgCircle(centre: PointLike, radius: number, attributes: Attributes = {}): string {\n return `<circle${attributePairs(svgCircleAttributes(centre, radius, attributes))}/>`\n}\n\nexport function svgCircleElement(centre: PointLike, radius: number, attributes: Attributes = {}): SVGCircleElement {\n return createSVGElement('circle', svgCircleAttributes(centre, radius, attributes)) as SVGCircleElement\n}\n\n//==============================================================================\n\nexport function svgPath(points: PointLike[], attributes: Attributes = {}): string {\n const description = svgPathDescription(points)\n return description ? `<path${attributePairs(attributes)} d=\"${description}\"/>` : ''\n}\n\nexport function svgPathDescription(points: PointLike[]): string {\n const pts = points.map((pt) => `${pt.x},${pt.y}`)\n return pts.length > 1 ? `M${pts.join(' L')}` : ''\n}\n\nexport function svgPathElement(points: PointLike[], attributes: Attributes = {}): SVGPathElement {\n const description = svgPathDescription(points)\n return createSVGElement('path', Object.assign({}, attributes, { d: description })) as SVGPathElement\n}\n\n//==============================================================================\n\nfunction svgRectAttributes(tl: PointLike, br: PointLike, attributes: Attributes): Attributes {\n return Object.assign({}, attributes, {\n x: `${Math.min(tl.x, br.x)}`,\n y: `${Math.min(tl.y, br.y)}`,\n width: `${Math.abs(br.x - tl.x)}`,\n height: `${Math.abs(br.y - tl.y)}`\n })\n}\n\nexport function svgRect(topLeft: PointLike, bottomRight: PointLike, attributes: Attributes = {}): string {\n return `<rect${attributePairs(svgRectAttributes(topLeft, bottomRight, attributes))}/>`\n}\n\nexport function svgRectElement(\n topLeft: PointLike,\n bottomRight: PointLike,\n attributes: StringProperties = {}\n): SVGRectElement {\n return createSVGElement('rect', svgRectAttributes(topLeft, bottomRight, attributes)) as SVGRectElement\n}\n\n//==============================================================================\n//==============================================================================\n\n// Minimal CSS needed for stand-alone image\nexport const LatexStyleRules = [\n 'svg {color: black}', // default value of ``currentColor``\n 'svg a{fill:blue;stroke:blue}',\n // Round the corners of filled background rectangles\n '[data-mml-node=\"mstyle\"]>rect[data-bgcolor=\"true\"]{rx: 8%; ry: 12%}',\n '[data-mml-node=\"merror\"]>g{fill:red;stroke:red}',\n '[data-mml-node=\"merror\"]>rect[data-background]{fill:yellow;stroke:none}',\n '[data-frame],[data-line]{stroke-width:70px;fill:none}',\n '.mjx-dashed{stroke-dasharray:140}',\n '.mjx-dotted{stroke-linecap:round;stroke-dasharray:0,140}',\n 'use[data-c]{stroke-width:3px}'\n].join('')\n\n//==============================================================================\n\nexport function base64Svg(svg: string): string {\n return `data:image/svg+xml;base64,${Buffer.from(svg, 'utf8').toString('base64')}`\n}\n\n//==============================================================================\n\nexport function getSvgImageFromBase64(svgText: string): string|undefined {\n const base64 = svgText.match(/data:image\\/svg\\+xml;base64,(?<base64>.*)/)\n if (base64) {\n return Buffer.from(base64.groups!.base64!, 'base64').toString('utf8')\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 { isNamedNode, namedNode, type NamedNode } from './rdfstore'\n\nimport { SVG_URI } from '@viewer/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 '.'\n\nimport type { SubjectType, PredicateType, ObjectType } from '.'\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) {\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 isLiteral,\n isNamedNode,\n literal,\n namedNode,\n RdfStore,\n TurtleContentType\n} from './rdfstore'\n\nexport type {\n BlankNode,\n ContentType,\n Literal,\n NamedNode,\n ObjectType,\n PredicateType,\n Statement,\n SubjectType,\n Term\n} from './rdfstore'\n\nexport type { PredicateValue } from './store'\n\nexport * from './namespaces'\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 Model Viewer\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 interface PointLike {\n x: number\n y: number\n}\n\nexport type PointArray = [number, number]\n\n//==============================================================================\n\n// Two points are considered to be the same if the square of the distance between\n// them is no bigger than POINT_EPSILON_SQUARED\n\nexport const POINT_EPSILON = 1e-4\nexport const POINT_EPSILON_SQUARED = POINT_EPSILON * POINT_EPSILON\n\n//==============================================================================\n\nexport class Point implements PointLike {\n constructor(\n readonly x: number = 0,\n readonly y: number = 0\n ) {}\n\n static fromPoint(point: PointLike): Point {\n return new Point(point.x, point.y)\n }\n\n static fromArray(coords: PointArray): Point {\n return new Point(coords[0], coords[1])\n }\n\n asArray(): PointArray {\n return [this.x, this.y]\n }\n\n add(point: PointLike): Point {\n return Point.fromPoint(PointMath.add(this, point))\n }\n\n colinear(p1: PointLike, p2: PointLike, between: boolean = false): boolean {\n return PointMath.colinear(this, p1, p2, between)\n }\n\n copy(): Point {\n return new Point(this.x, this.y)\n }\n\n distance(point: PointLike): number {\n return PointMath.distance(this, point)\n }\n\n equals(point: PointLike): boolean {\n return PointMath.equals(this, point)\n }\n\n isZero(): boolean {\n return PointMath.isZero(this)\n }\n\n apply(fn: (n: number) => number): Point {\n return Point.fromPoint(PointMath.apply(this, fn))\n }\n\n scalarScale(scale: number): Point {\n return Point.fromPoint(PointMath.scalarScale(this, scale))\n }\n\n scale(scale: PointLike): Point {\n return Point.fromPoint(PointMath.scale(this, scale))\n }\n\n subtract(point: PointLike): Point {\n return Point.fromPoint(PointMath.subtract(this, point))\n }\n\n toString(): string {\n return `(${this.x}, ${this.y})`\n }\n}\n\n//==============================================================================\n\n// biome-ignore lint/complexity/noStaticOnlyClass: use static members to provide a namespace\nexport class PointMath {\n static add(p1: PointLike, p2: PointLike): Point {\n return new Point(p1.x + p2.x, p1.y + p2.y)\n }\n\n static apply(p1: PointLike, fn: (number: number) => number): Point {\n return new Point(fn(p1.x), fn(p1.y))\n }\n\n static colinear(p0: PointLike, p1: PointLike, p2: PointLike, between: boolean = false): boolean {\n const d0 = PointMath.distance(p0, p1)\n const d1 = PointMath.distance(p1, p2)\n const d2 = PointMath.distance(p0, p2)\n if (d2 > d0 && d2 > d1) {\n return d0 + d1 < d2 * (1 + POINT_EPSILON)\n } else if (between) {\n return false\n } else if (d1 > d0 && d1 > d2) {\n return d0 + d2 < d1 * (1 + POINT_EPSILON)\n } else {\n return d1 + d2 < d0 * (1 + POINT_EPSILON)\n }\n }\n\n static distance(p1: PointLike, p2: PointLike): number {\n return Math.sqrt((p1.x - p2.x) ** 2 + (p1.y - p2.y) ** 2)\n }\n\n static equals(p1: PointLike, p2: PointLike): boolean {\n return (p1.x - p2.x) ** 2 + (p1.y - p2.y) ** 2 <= POINT_EPSILON_SQUARED\n }\n\n static isZero(pt: PointLike): boolean {\n return pt.x ** 2 + pt.y ** 2 <= POINT_EPSILON_SQUARED\n }\n\n static scalarScale(p1: PointLike, scale: number): Point {\n return new Point(scale * p1.x, scale * p1.y)\n }\n\n static scale(p1: PointLike, scale: PointLike): Point {\n return new Point(scale.x * p1.x, scale.y * p1.y)\n }\n\n static subtract(p1: PointLike, p2: PointLike): Point {\n return new Point(p1.x - p2.x, p1.y - p2.y)\n }\n}\n\n//==============================================================================\n","/******************************************************************************\n\nCellDL Model Viewer\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 { Pair } from '@viewer/common/types'\n\n//==============================================================================\n\nexport function sleep(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\n//==============================================================================\n\nexport function round(length: number, decimalPlaces: number = 3): number {\n const tenPower = 10 ** decimalPlaces\n return Math.round(tenPower * length) / tenPower\n}\n\nexport function roundEqual(l1: number, l2: number, decimalPlaces: number = 3): boolean {\n const tenPower = 10 ** decimalPlaces\n return Math.round(tenPower * l1) / tenPower === Math.round(tenPower * l2) / tenPower\n}\n\n//==============================================================================\n\nexport function* range(startOrStop: number, stop: number | null = null, step: number | null = null) {\n if (stop === null) {\n stop = startOrStop\n startOrStop = 0\n }\n if (step === null) {\n step = 1\n }\n for (let x = startOrStop; x < stop; x += step) {\n yield x\n }\n}\n\n//==============================================================================\n\n// From https://stackoverflow.com/a/65064026\n\nexport function pairwise<T>(a: T[]): Pair<T>[] {\n return a.flatMap((x: T) => {\n return a.flatMap((y: T): Pair<T>[] => {\n return x !== y ? [[x, y]] : []\n })\n })\n}\n\n//==============================================================================\n","/******************************************************************************\n\nCellDL Model Viewer\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 '@viewer/common/points'\nimport type { Transform } from '@viewer/geometry/transforms'\nimport { round } from '@viewer/utils'\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 if (!IdGenerator.#instance) {\n IdGenerator.#instance = new IdGenerator()\n }\n return IdGenerator.#instance\n }\n\n get nextId() {\n this.#nextId += 1\n return this.#nextId\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 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 #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 reassignValue(point: PointLike) {\n this.xValue.reassignValue(point.x)\n this.yValue.reassignValue(point.y)\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 Model Viewer\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, PointMath } from '@viewer/common/points'\nimport { svgRect } from '@viewer/common/svgUtils'\nimport type { StringProperties } from '@viewer/common/types'\nimport { FixedPoint, FixedValue } from '@viewer/geometry'\n\nimport { RestrictedPoint } from '.'\n\n//==============================================================================\n\nexport class ControlRect {\n #topLeft!: RestrictedPoint\n #bottomRight!: RestrictedPoint\n #size!: Point\n #centroid!: RestrictedPoint\n #centroidOffset!: 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 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 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","/******************************************************************************\n\nCellDL Model Viewer\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 { EM_SIZE } from '@viewer/geometry/units'\n\n//==============================================================================\n\nexport const CONNECTION_ARROW_SIZE = [4, 4] // [W, H] pixels\nexport const CONNECTION_SPLAY_PADDING = 16 // If <= 1.0 then fraction of elements width and height else pixels\nexport const MAX_CONNECTION_SPLAY_PADDING = 20 // pixels\n\nexport const CONNECTION_COLOUR = '#456'\nexport const OLD_CONNECTION_COLOUR = \"#334155\" // For auto update of `stroke` in <path> elements\n\nexport const CONNECTION_WIDTH = 2 // pixels\nexport const CONNECTION_DASH = 2 // * width\n\nexport const INTERFACE_PORT_RADIUS = 4 // pixels\nexport const SELECTION_STROKE_WIDTH = 3 // pixels\n\n//==============================================================================\n\nexport const CELLDL_BACKGROUND_CLASS = 'celldl-background'\n\n//==============================================================================\n\nexport function arrowMarkerDefinition(markerId: string, markerType: string): string {\n // see https://developer.mozilla.org/en-US/docs/Web/SVG/Element/marker\n const W = 1\n return `<marker id=\"${markerId}\" viewBox=\"0 0 ${5.5 * W} ${5 * W}\" class=\"${markerType}\"\n refX=\"${5 * W}\" refY=\"${2.5 * W}\" orient=\"auto-start-reverse\" markerUnits=\"strokeWidth\"\n markerWidth=\"${CONNECTION_ARROW_SIZE[0]}\" markerHeight=\"${CONNECTION_ARROW_SIZE[1]}\">\n <path fill=\"context-stroke\" stroke=\"context-stroke\" d=\"M0,0 L${5.05 * W},${2.2 * W} L${5.05 * W},${2.8 * W} L0,${5 * W} L${W},${2.5 * W} z\" />\n </marker>`\n}\n\n//==============================================================================\n\nexport type GradientStop = {\n offset: string\n colour: string\n}\n\nexport function gradientDefinition(type: string, gradientId: string, stops: GradientStop[]): string {\n return `<${type}Gradient id=\"${gradientId}\">${stops\n .map((def) => `<stop offset=\"${def.offset}\" stop-color=\"${def.colour}\" />`)\n .join('\\n ')}</${type}Gradient>`\n}\n\n//==============================================================================\n\nexport const CellDLStylesheet = [\n `svg{font-size:${EM_SIZE}px}`,\n /* Conduits */\n '.celldl-Conduit{z-index:9999}',\n /* Connections */\n `.celldl-Connection{stroke-linejoin:round;fill:none}`,\n /* Compartments */\n '.celldl-Compartment>rect.compartment{fill:#CCC;opacity:0.6;stroke:#444;rx:10px;ry:10px}',\n /* Interfaces */\n `.celldl-InterfacePort{fill:red;r:${INTERFACE_PORT_RADIUS}px}`,\n `.celldl-Unconnected{fill:red;fill-opacity:0.1;stroke:red;r:${INTERFACE_PORT_RADIUS}px}`\n].join('')\n\n//==============================================================================\n","/******************************************************************************\n\nCellDL Model Viewer\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 '@viewer/common/points'\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 Model Viewer\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\n\nimport { CELLDL_CLASS, type CellDLObject } from '@viewer/celldlObjects'\nimport { Point, type PointLike } from '@viewer/common/points'\nimport { CONNECTION_WIDTH, SELECTION_STROKE_WIDTH } from '@viewer/common/styling'\nimport { svgCircle } from '@viewer/common/svgUtils'\nimport { Bounds } from '@viewer/geometry'\nimport { FixedControlRect }from '@viewer/geometry/controls'\nimport { Transform } from '@viewer/geometry/transforms'\n\n\nconst CONDUIT_SELECTION_RADIUS = 9\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.celldlModel?.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 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 #selectionElementMembers(): SVGGraphicsElement[] {\n const members: SVGGraphicsElement[] = []\n if (this.#selectionElement.tagName === 'g'\n && this.#selectionElement.classList.contains(CELLDL_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 highlight(highlight = true) {\n this.#setSelectionClass('highlight', highlight)\n }\n\n pointerEvent(_eventType: string, _svgElement: SVGGraphicsElement, _svgCoords: PointLike): boolean {\n return false\n }\n\n select(selected = true) {\n this.#setSelectionClass('selected', selected)\n this.#selected = selected\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_CLASS.Connection) &&\n this.#svgElement.firstElementChild !== null\n ) {\n const bounds = (\n this.#svgElement.classList.contains(CELLDL_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\n//==============================================================================\n","/******************************************************************************\n\nCellDL Model Viewer\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 '@viewer/celldlObjects'\nimport { RestrictedPoint } from '@viewer/geometry'\nimport { ControlRect } from '@viewer/geometry/controls'\n\nimport { CellDLSVGElement } from '.'\n\n//==============================================================================\n\nexport class BoundedElement extends CellDLSVGElement {\n #controlRect: ControlRect\n\n constructor(object: CellDLObject, svgElement: SVGGraphicsElement) {\n super(object, svgElement)\n // local transform on the element\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 }\n}\n\n//==============================================================================\n","/******************************************************************************\n\nCellDL Model Viewer\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 { PropertiesType } from '@viewer/common/types'\nimport { CELLDL, type NamedNode } from '@viewer/metadata'\nimport type { CellDLSVGElement } from '@viewer/SVGElements'\nimport { BoundedElement } from '@viewer/SVGElements/boundedelement'\nimport type { CellDLModel } from '@viewer/viewer/model'\n\n//==============================================================================\n\nexport enum CELLDL_CLASS {\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\nexport class CellDLObject {\n static celldlClassName: CELLDL_CLASS = CELLDL_CLASS.Unknown\n static celldlType: string = 'Object'\n\n #celldlClassName: CELLDL_CLASS\n #celldlModel: CellDLModel\n #celldlSvgElement: CellDLSVGElement|undefined\n #celldlType: NamedNode\n\n #tooltip: string|undefined\n\n constructor(\n public readonly uri: NamedNode,\n readonly options: PropertiesType = {},\n celldlModel: CellDLModel\n ) {\n this.#celldlModel = celldlModel\n // @ts-expect-error: celldlClassName is a member of the object's constructor\n this.#celldlClassName = this.constructor.celldlClassName\n // @ts-expect-error: celldlType is a member of the object's constructor\n this.#celldlType = CELLDL.uri(this.constructor.celldlType)\n }\n\n toString(): string {\n return `${this.#celldlClassName} ${this.id}`\n }\n\n get celldlClassName() {\n return this.#celldlClassName\n }\n\n get celldlModel() {\n return this.#celldlModel\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 this.#celldlType.equals(rdfType) // || this.#metadataProperties.isA(rdfType)\n }\n\n get isAlignable() {\n return true\n }\n\n get isAnnotation() {\n return this.celldlClassName === CELLDL_CLASS.Annotation\n }\n\n get isComponent() {\n // Conduits are a component sub-class\n return this.celldlClassName === CELLDL_CLASS.Component || this.celldlClassName === CELLDL_CLASS.Conduit\n }\n\n get isConduit() {\n return this.celldlClassName === CELLDL_CLASS.Conduit\n }\n\n get isConnectable() {\n return false\n }\n\n get isConnection() {\n return this.celldlClassName === CELLDL_CLASS.Connection\n }\n\n get isCompartment() {\n return this.celldlClassName === CELLDL_CLASS.Compartment\n }\n\n get isInterface() {\n return this.celldlClassName === CELLDL_CLASS.Interface\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 tooltip(): string|undefined {\n return this.#tooltip\n }\n set tooltip(tooltip: string) {\n this.#tooltip = tooltip\n }\n\n activate(active = true) {\n this.#celldlSvgElement?.activate(active)\n }\n\n highlight(highlight = true) {\n this.#celldlSvgElement?.highlight(highlight)\n }\n\n select(selected = true) {\n this.#celldlSvgElement?.select(selected)\n }\n\n assignSvgElement(_svgElement: SVGGraphicsElement) {\n }\n}\n\n//==============================================================================\n\nexport class CellDLMoveableObject extends CellDLObject {\n assignSvgElement(svgElement: SVGGraphicsElement) {\n new BoundedElement(this, svgElement)\n }\n}\n\n//==============================================================================\n\nexport class CellDLAnnotation extends CellDLMoveableObject {\n static celldlClassName = CELLDL_CLASS.Annotation\n static celldlType = 'Annotation'\n}\n\n//==============================================================================\n\nexport class CellDLConnectedObject extends CellDLMoveableObject {\n static celldlType = 'Connector'\n\n get isConnectable() {\n return true\n }\n}\n\n//==============================================================================\n\nexport class CellDLComponent extends CellDLConnectedObject {\n static celldlClassName = CELLDL_CLASS.Component\n static celldlType = 'Component'\n}\n\n//==============================================================================\n\nexport class CellDLConduit extends CellDLComponent {\n static readonly celldlClassName = CELLDL_CLASS.Conduit\n static celldlType = 'Conduit'\n}\n\n//==============================================================================\n\nexport class CellDLCompartment extends CellDLConnectedObject {\n static readonly celldlClassName = CELLDL_CLASS.Compartment\n static celldlType = 'Compartment'\n}\n\n//==============================================================================\n\nexport class CellDLConnection extends CellDLObject {\n static readonly celldlClassName = CELLDL_CLASS.Connection\n static celldlType = 'Connection'\n}\n\n//==============================================================================\n\nexport class CellDLInterface extends CellDLConnectedObject {\n static readonly celldlClassName = CELLDL_CLASS.Interface\n static celldlType = 'Interface'\n\n #externalConnections: CellDLConnection[] = []\n\n toString(): string {\n return `${super.toString()} External: ${this.#externalConnections.map((c) => c.id).join(', ')}`\n }\n}\n\n//==============================================================================\n\nexport class CellDLUnconnectedPort extends CellDLConnectedObject {\n static readonly celldlClassName = CELLDL_CLASS.UnconnectedPort\n static celldlType = 'UnconnectedPort'\n}\n\n//==============================================================================\n//==============================================================================\n","/******************************************************************************\n\nCellDL Model Viewer\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 CellDLAnnotation,\n CellDLCompartment,\n CellDLComponent,\n CellDLConduit,\n type CellDLConnectedObject,\n CellDLConnection,\n CellDLInterface,\n type CellDLObject,\n CellDLUnconnectedPort\n} from '@viewer/celldlObjects'\n\nimport {\n CONNECTION_COLOUR,\n OLD_CONNECTION_COLOUR\n} from '@viewer/common/styling'\n\nimport type { Constructor } from '@viewer/common/types'\n\nimport { lengthToPixels } from '@viewer/geometry/units'\n\nimport * as $rdf from '@viewer/metadata'\nimport {\n CELLDL,\n type NamedNode,\n type MetadataPropertyValue\n} from '@viewer/metadata'\n\nimport type { CellDLViewer } from '.'\n\nimport type { Annotations, Annotation, ModelViewerOptions, ViewerEvent } from '../../index'\n\n//==============================================================================\n//==============================================================================\n\nconst CELLDL_METADATA_ID = 'celldl-rdf-metadata'\n\nconst VIEWER_DIAGRAM_URI = 'file://tmp/viewing.celldl'\n\n//==============================================================================\n\nexport class CellDLModel {\n #svgDiagram: SVGSVGElement|null = null\n\n #kb = new $rdf.RdfStore()\n #celldlViewer: CellDLViewer\n\n #documentNode: NamedNode\n #documentNS: $rdf.Namespace\n\n #annotations: Map<string, Annotation> = new Map()\n #objects: Map<string, CellDLObject> = new Map()\n\n constructor(celldlViewer: CellDLViewer, celldlData: string='', annotations: Annotations={},\n options: ModelViewerOptions|undefined=undefined) {\n this.#celldlViewer = celldlViewer\n this.#documentNode = $rdf.namedNode(VIEWER_DIAGRAM_URI)\n this.#documentNS = new $rdf.Namespace(`${VIEWER_DIAGRAM_URI}#`)\n if (celldlData !== '') {\n this.#loadSvgDiagram(celldlData)\n this.#loadMetadata()\n const tooltipField = options ? options.tooltip : undefined\n for (const object of this.#objects.values()) {\n if (object.id in annotations) {\n // @ts-expect-error: objectId is in annotations\n const annotation: Annotation = annotations[object.id]\n this.#annotations.set(object.id, annotation)\n if (tooltipField && tooltipField in annotation) {\n object.tooltip = String(annotation[tooltipField])\n }\n }\n }\n }\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 this.#loadAnnotatedSVGFeatures()\n }\n\n async viewModel() {\n if (this.#svgDiagram) {\n await this.#celldlViewer.viewDiagram(this)\n } else {\n this.#celldlViewer.closeDiagram()\n }\n }\n\n viewerEvent(type: string, object: CellDLObject|undefined=undefined) {\n const eventDetail: ViewerEvent = {\n type: type\n }\n if (object) {\n eventDetail.component = {\n id: object.id\n }\n if (this.#annotations.has(object.id)) {\n eventDetail.component.annotation = this.#annotations.get(object.id)\n }\n }\n document.dispatchEvent(\n new CustomEvent('viewer-event', {\n detail: eventDetail\n })\n )\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 makeUri(id: string): NamedNode {\n return this.#documentNS.uri(id)\n }\n\n objectById(id: string): CellDLObject | null {\n return this.#objects.get(id) || null\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 // @ts-expect-error: `index` is in range\n const path: HTMLElement = strokedPaths[index]\n path.setAttribute('stroke', CONNECTION_COLOUR)\n }\n this.#svgDiagram = svgDiagram\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 }\n\n #setObjectSvgElement(celldlObject: CellDLObject): boolean {\n const svgElement = <SVGGraphicsElement>this.#svgDiagram?.getElementById(celldlObject.id)\n if (svgElement) {\n celldlObject.assignSvgElement(svgElement)\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): T {\n const metadata = this.#kb.metadataPropertiesForSubject(subject)\n const celldlObject = new CellDLClass(subject, metadata, this)\n return celldlObject\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 #addMoveableObject(object: CellDLObject) {\n this.#objects.set(object.id, object)\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 #loadAnnotatedSVGFeatures() {\n // @ts-expect-error: we have an SVG diagram\n const featuresWithId = this.#svgDiagram.querySelectorAll(`*[id]`)\n for (let index = 0; index < featuresWithId.length; ++index) {\n // @ts-expect-error: `index` is in range\n const feature: SVGGraphicsElement = featuresWithId[index]\n if (!this.#objects.has(feature.id)) {\n // This must match CELLDL_STYLE_CLASS and CELLDL_CLASS_MAP in the Editor's code.\n const CellDLClass = feature.classList.contains('celldl-Annotation') ? CellDLAnnotation\n : feature.classList.contains('celldl-Compartment') ? CellDLCompartment\n : feature.classList.contains('celldl-Component') ? CellDLComponent\n : feature.classList.contains('celldl-Connection') ? CellDLConnection\n : feature.classList.contains('celldl-InterfacePort') ? CellDLInterface\n : feature.classList.contains('celldl-Unconnected') ? CellDLUnconnectedPort\n : null\n if (CellDLClass !== null) {\n const object = new CellDLClass(this.makeUri(feature.id), {}, this)\n object.assignSvgElement(feature)\n this.#addMoveableObject(object)\n }\n }\n }\n }\n}\n\n//==============================================================================\n","/******************************************************************************\n\nCellDL Model Viewer\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\n\nimport { Point } from '@viewer/common/points'\nimport { getViewbox } from '@viewer/common/svgUtils'\nimport type { Extent } from '@viewer/geometry'\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 // @ts-expect-error: we have an SVG diagram\n return getViewbox(this.#svgDiagram)\n }\n\n #setViewbox(viewbox: Extent) {\n // @ts-expect-error: we have an SVG diagram\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 Viewer\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'\nimport { useTippy } from \"vue-tippy\"\n\n//==============================================================================\n\nimport '@viewer/assets/svgContent.css'\n\nimport type { CellDLObject } from '@viewer/celldlObjects'\n\nimport type { CellDLModel } from './model'\n\n//==============================================================================\n\nimport PanZoom from './panzoom'\n\n//==============================================================================\n\nconst MAX_POINTER_CLICK_TIME = 200 // milliseconds\n\n//==============================================================================\n\nexport function notifyChanges() {\n document.dispatchEvent(new CustomEvent('file-edited'))\n}\n\n//==============================================================================\n\nexport function getElementId(element: SVGGraphicsElement): string {\n if (element.dataset.parentId) {\n return element.dataset.parentId\n } else if (element.classList.contains('parent-id')) {\n return element.parentElement?.id || ''\n }\n while (element.tagName === 'text') {\n const prevElement = element.previousElementSibling\n if (prevElement) {\n element = prevElement as SVGGraphicsElement\n } else {\n break\n }\n }\n return element.id\n}\n\n//==============================================================================\n\nconst SVG_PANEL_ID = 'svg-panel'\n\nexport class CellDLViewer {\n static instance: CellDLViewer | null = null\n\n #container: HTMLElement | null = null\n #celldlModel: CellDLModel | null = null\n #svgDiagram: SVGSVGElement | null = null\n\n #panning: boolean = false\n #panzoom: PanZoom | null = null\n #pointerMoved: boolean = false\n\n #activeObject: CellDLObject | null = null\n #selectedObject: CellDLObject | null = null\n\n #pointerDownTime: number = 0\n\n #tooltip: vue.Ref|undefined\n #tooltipElement: HTMLElement|undefined\n #tooltipStyle: string = ''\n\n constructor() {\n CellDLViewer.instance = this\n }\n\n mount(svgContainer: HTMLElement) {\n this.#container = svgContainer\n\n // Create a panzoom handler\n this.#panzoom = new PanZoom(this.#container)\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 // Handle context menu events\n this.#container.addEventListener('contextmenu', (event) => {\n if (this.#celldlModel) {\n const element = event.target as SVGGraphicsElement\n const clickedObject = this.#celldlModel.objectById(getElementId(element))\n if (clickedObject && clickedObject === this.#activeObject) {\n this.#setSelectedObject(clickedObject)\n }\n\n document.dispatchEvent(new CustomEvent('open-context-menu', {\n detail: {\n// state: this.#contextMenuActiveItems,\n event: event\n }\n }))\n\n }\n })\n\n document.addEventListener('context-menu-click', (event: Event) => {\n const eventId = (<CustomEvent>event).detail.id\n // Only action is Annotate?\n // Or also Info ??\n if (eventId === 'annotate') {\n //\n } else if (eventId === 'info') {\n //this.#showSelectedObjectInfo()\n }\n })\n }\n\n #addPointerEventHandlers() {\n if (this.#container) {\n this.#container.addEventListener('click', this.#pointerClickEvent.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 }\n\n #removePointerEventHandlers() {\n if (this.#container) {\n this.#container.removeEventListener('click', this.#pointerClickEvent.bind(this))\n\n this.#container.removeEventListener('pointerover', this.#pointerOverEvent.bind(this))\n this.#container.removeEventListener('pointerout', this.#pointerOutEvent.bind(this))\n\n this.#container.removeEventListener('pointerdown', this.#pointerDownEvent.bind(this))\n this.#container.removeEventListener('pointermove', this.#pointerMoveEvent.bind(this))\n this.#container.removeEventListener('pointerup', this.#pointerUpEvent.bind(this))\n }\n }\n\n get celldlModel() {\n return this.#celldlModel\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 async viewDiagram(celldlModel: CellDLModel) {\n if (this.#celldlModel !== null) {\n this.closeDiagram(true)\n } else {\n this.#addPointerEventHandlers()\n }\n this.#celldlModel = celldlModel\n this.#svgDiagram = celldlModel.svgDiagram\n\n // Show the model's diagram in the viewer's window\n if (this.#container) {\n // @ts-expect-error: we have a SVG diagram\n this.#container.appendChild(this.#svgDiagram)\n }\n\n // Allow for the diagram to render\n await vue.nextTick()\n\n // Finish setting up the model as we now have SVG elements\n celldlModel.finishSetup()\n\n // Enable pan/zoom and toolBars\n // @ts-expect-error: we have a SVG diagram\n this.#panzoom?.enable(this.#svgDiagram)\n\n // Set initial state\n this.#activeObject = null\n this.#pointerMoved = false\n this.#selectedObject = null\n }\n\n closeDiagram(newDiagram: boolean=false) {\n if (this.#celldlModel !== null) {\n if (!newDiagram) {\n this.#removePointerEventHandlers()\n }\n this.#panzoom?.disable()\n if (this.#container) {\n this.#container.removeChild(this.#svgDiagram as Node)\n }\n this.#svgDiagram = null\n this.#celldlModel = null\n }\n }\n\n resetObjectStates() {\n this.#unsetSelectedObject()\n this.#unsetActiveObject()\n }\n\n #setDefaultCursor() {\n this.#svgDiagram?.style.removeProperty('cursor')\n if (this.#container) {\n this.#container.style.setProperty('cursor', 'default')\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 #emitModelEvent(type: string, object: CellDLObject|undefined=undefined) {\n if (this.#celldlModel) {\n this.#celldlModel.viewerEvent(type, object)\n }\n }\n\n #activateObject(object: CellDLObject, active: boolean) {\n object.activate(active)\n }\n\n #setActiveObject(activeObject: CellDLObject | null) {\n if (activeObject && this.#activeObject !== activeObject) {\n this.#activateObject(activeObject, true)\n this.#activeObject = activeObject\n if (activeObject.tooltip) {\n this.#showTooltip(activeObject.tooltip, 'info')\n }\n this.#emitModelEvent('active', activeObject)\n }\n }\n\n #unsetActiveObject() {\n if (this.#activeObject) {\n this.#activateObject(this.#activeObject, false)\n this.#activeObject = null\n this.#emitModelEvent('unactive')\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 this.#selectedObject = selectedObject\n this.#emitModelEvent('select', selectedObject)\n }\n }\n\n #unsetSelectedObject() {\n if (this.#selectedObject) {\n this.#emitModelEvent('unselect', this.#selectedObject)\n this.#selectedObject.select(false)\n this.#selectedObject = null\n }\n }\n\n #pointerClickEvent(event: MouseEvent) {\n const element = event.target as SVGGraphicsElement\n if (\n this.#celldlModel === 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.#celldlModel.objectById(getElementId(element))\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 (!deselected && clickedObject && clickedObject === this.#activeObject) {\n // Select when active object is clicked\n this.#setSelectedObject(clickedObject)\n }\n }\n\n #notDiagramElement(element: SVGGraphicsElement) {\n return (\n element === this.#svgDiagram ||\n element.id === SVG_PANEL_ID ||\n !this.#svgDiagram?.contains(element)\n )\n }\n\n #pointerOverEvent(event: PointerEvent) {\n if (this.#celldlModel === null) {\n return\n }\n const element = event.target as SVGGraphicsElement\n const currentObject = this.#celldlModel.objectById(getElementId(element))\n\n if (this.#notDiagramElement(element)) {\n this.#hideTooltip()\n if (this.#activeObject && currentObject !== this.#activeObject) {\n this.#unsetActiveObject()\n }\n return\n }\n\n if (this.#activeObject && currentObject !== this.#activeObject) {\n this.#unsetActiveObject()\n }\n if (currentObject) {\n this.#setActiveObject(currentObject)\n }\n }\n\n #pointerOutEvent(event: PointerEvent) {\n const element = event.target as SVGGraphicsElement\n if (element === this.#svgDiagram || !this.#svgDiagram?.contains(element)) {\n if (this.#activeObject) {\n this.#unsetActiveObject()\n }\n }\n }\n\n #pointerDownEvent(event: PointerEvent) {\n this.#pointerMoved = false\n this.#pointerDownTime = Date.now()\n this.#svgDiagram?.style.removeProperty('cursor')\n this.#container?.style.setProperty('cursor', 'grab')\n // @ts-expect-error: `panzoom` is defined\n this.#panzoom.pointerDown(event)\n this.#panning = true\n }\n\n #pointerMoveEvent(event: PointerEvent) {\n if (this.#panning) {\n // @ts-expect-error: `panzoom` is defined\n this.#pointerMoved = this.#panzoom.pointerMove(event) || this.#pointerMoved\n return\n }\n this.#pointerMoved = true\n }\n\n #pointerUpEvent(event: PointerEvent) {\n if (this.#celldlModel === null) {\n return\n }\n if (this.#panning) {\n // @ts-expect-error: `panzoom` is defined\n this.#panzoom.pointerUp(event)\n this.#panning = false\n this.#setDefaultCursor()\n return\n }\n }\n}\n\n//==============================================================================\n//==============================================================================\n","<template lang=\"pug\">\n .flex.flex-col.h-full\n main.viewer-pane.relative.flex.grow\n div#svg-content(ref=\"svgContent\")\n ContextMenu(\n ref=\"context-menu\" :model=\"contextMenuItems\"\n )\n</template>\n\n<script setup lang=\"ts\">\nimport * as vue from 'vue'\nimport * as vueusecore from '@vueuse/core'\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 '@viewer/assets/style.css'\n\nimport * as vueCommon from '@viewer/common/vueCommon'\nimport { CellDLModel } from '@viewer/viewer/model'\nimport { CellDLViewer } from '@viewer/viewer'\n\n//==============================================================================\n\nimport type { CellDLViewerProps, ViewerEvent } from '../../index'\n\nconst props = defineProps<CellDLViewerProps>()\n\n//==============================================================================\n//==============================================================================\n\n// Get the current Vue app instance to use some PrimeVue plugins and VueTippy.\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\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\nconst svgContent = vue.ref(null)\n\nlet celldlModel: CellDLModel|undefined\n\nconst celldlViewer: CellDLViewer = new CellDLViewer()\n\n//==============================================================================\n\nconst emit = defineEmits<{\n 'error': [msg: string]\n 'event': [detail: ViewerEvent]\n}>()\n\n//==============================================================================\n\nvue.watch(\n () => props.celldlData,\n async () => {\n if (props.celldlData === '') {\n celldlModel = new CellDLModel(celldlViewer)\n await celldlModel.viewModel()\n } else {\n try {\n celldlModel = new CellDLModel(celldlViewer, props.celldlData, props.annotations, props.options)\n await celldlModel.viewModel()\n } catch(err) {\n emit('error', `Invalid CellDL file... (${err})`)\n }\n }\n }\n)\n\n//==============================================================================\n\nvue.onMounted(async () => {\n\n if (svgContent.value) {\n celldlViewer.mount(svgContent.value)\n\n // Create a new model in the viewer's window\n celldlModel = new CellDLModel(celldlViewer)\n\n await celldlModel.viewModel()\n }\n})\n\n//==============================================================================\n\nvueusecore.useEventListener(document, 'viewer-event', (event: CustomEvent) => {\n emit('event', event.detail)\n})\n\n//==============================================================================\n//==============================================================================\n</script>\n\n<style scoped>\n.viewer-pane {\n min-height: 100%;\n}\n#svg-content {\n margin: 0;\n border: 2px solid grey;\n flex: 1;\n overflow: hidden;\n}\n</style>\n"],"names":["useTheme","vueusecore.createGlobalState","prefersColorScheme","isLightMode","vue","isDarkMode","_theme","updateLightAndDarkModes","updateDocumentClasses","event","theme","setTheme","newTheme","useLightMode","useDarkMode","EM_SIZE","EX_SIZE","CM_PER_INCH","MM_PER_INCH","POINTS_PER_INCH","PICAS_PER_INCH","PIXELS_PER_INCH","__unit_scaling","__unit_length_re","lengthToPixels","length","match","scaling","SVG_URI","getViewbox","svgElement","n","attributePairs","attributes","key","value","svgCircleAttributes","c","r","svgCircle","centre","radius","svgRectAttributes","tl","br","svgRect","topLeft","bottomRight","CELLDL_URI","BG_URI","BGF_URI","CDT_URI","TPL_URI","DCT_URI","OWL_URI","RDF_URI","RDFS_URI","XSD_URI","CELLDL_DECLARATIONS","WEB_DECLARATIONS","declaredNamespaces","prefixUri","Namespace","#nsuri","nsuri","ln","namedNode","CELLDL","RDF","BaseStore","subject","properties","statements","predicate","#addMetadataProperties","isLiteral","isNamedNode","MetadataPropertiesMap","node","blankNode","#addListAsCollection","v","s","predicateValues","metadata","predicateValue","#metadataValue","isBlankNode","#listFromCollection","result","nodes","next","headItem","nextItem","values","current","index","term","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","#rdfTypes","prop","#copyValue","type","multiValued","property","inSet","POINT_EPSILON","POINT_EPSILON_SQUARED","Point","x","y","point","coords","PointMath","p1","p2","between","fn","scale","p0","d0","d1","d2","pt","round","decimalPlaces","tenPower","Bounds","#left","#right","#top","#bottom","left","top","right","bottom","pt0","pt1","globalTransform","bbox","bounds","epsilon","margin","container","IdGenerator","#instance","#nextId","idGenerator","nextId","prefix","RestrictedValue","#dirty","#value","#minimum","#maximum","rangeStart","rangeEnd","#getValue","delta","minimum","maximum","minValue","maxValue","FixedValue","_minimum","_maximum","RestrictedPoint","#xValue","#yValue","xValue","yValue","FixedPoint","ControlRect","#topLeft","#bottomRight","#size","#centroid","#centroidOffset","#svgElement","corner_0","corner_1","centroidOffset","x0","y0","x1","y1","FixedControlRect","CONNECTION_COLOUR","OLD_CONNECTION_COLOUR","CONNECTION_WIDTH","SELECTION_STROKE_WIDTH","Transform","#matrix","matrix","identity","fromString","transformToString","inverse","transform","compose","applyToPoint","points","applyToPoints","tx","ty","translate","CONDUIT_SELECTION_RADIUS","CellDLSVGElement","celldlObject","svgDiagramElement","#globalTransform","element","#selectionElement","#updatedSvgElement","#bounds","#cornerOffsets","#selected","#selectionClasses","centroid","recalculate","#selectionElementMembers","members","CELLDL_CLASS","children","#setSelectionClass","cls","enable","active","highlight","_eventType","_svgElement","_svgCoords","selected","#updateBounds","topLeftOffset","connectionComponentGap","firstChild","svgChild","svg","BoundedElement","#controlRect","object","CellDLObject","uri","options","celldlModel","#celldlModel","#celldlClassName","#celldlType","#celldlSvgElement","#tooltip","celldlSvgElement","rdfType","tooltip","CellDLMoveableObject","CellDLAnnotation","CellDLConnectedObject","CellDLComponent","CellDLConduit","CellDLCompartment","CellDLConnection","CellDLInterface","#externalConnections","CellDLUnconnectedPort","CELLDL_METADATA_ID","VIEWER_DIAGRAM_URI","CellDLModel","#svgDiagram","#kb","$rdf.RdfStore","#celldlViewer","#documentNode","#documentNS","#annotations","#objects","celldlViewer","celldlData","annotations","$rdf.namedNode","$rdf.Namespace","#loadSvgDiagram","#loadMetadata","tooltipField","annotation","#loadComponents","#loadInterfaces","#loadConduits","#loadConnections","#loadAnnotations","#loadAnnotatedSVGFeatures","eventDetail","id","svgData","svgDiagram","width","height","strokedPaths","metadataElement","$rdf.TurtleContentType","childNodes","childNode","#setObjectSvgElement","#celldlObjectFromRdf","CellDLClass","#subjectsOfType","st","#addMoveableObject","#loadObject","subjectType","connectorNode","$rdf.isNamedNode","connectorId","connector","featuresWithId","feature","PanZoom","#panning","#pointerDownPosition","#containerId","#containerOrigin","#containerSize","#resizeObserver","#minScale","#scale","#maxScale","#step","#wheelEvent","#resizeObservation","#currentViewbox","#setViewbox","viewbox","_event","entries","entry","containerSize","wheel","toScale","viewSize","MAX_POINTER_CLICK_TIME","getElementId","prevElement","SVG_PANEL_ID","CellDLViewer$1","CellDLViewer","#container","#panzoom","#pointerMoved","#activeObject","#selectedObject","#pointerDownTime","#tooltipElement","#tooltipStyle","svgContainer","tippy","useTippy","clickedObject","#setSelectedObject","#addPointerEventHandlers","#pointerClickEvent","#pointerOverEvent","#pointerOutEvent","#pointerDownEvent","#pointerMoveEvent","#pointerUpEvent","#removePointerEventHandlers","newDiagram","#unsetSelectedObject","#unsetActiveObject","#setDefaultCursor","#hideTooltip","#showTooltip","msg","style","tooltipStyle","#emitModelEvent","#activateObject","#setActiveObject","activeObject","selectedObject","#selectionClickEvent","_element","deselected","#notDiagramElement","currentObject","props","__props","crtInstance","app","primeVueConfig","primeVueAuraTheme","vueTippy","vueCommon.useTheme","svgContent","emit","__emit","err","vueusecore.useEventListener"],"mappings":"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"}
|