@e-infra/react-molstar-wrapper 0.0.8 → 0.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../node_modules/react/cjs/react-jsx-runtime.production.js","../node_modules/react/cjs/react-jsx-runtime.development.js","../node_modules/react/jsx-runtime.js","../lib/react/LoaderView.tsx","../lib/react/ErrorView.tsx","../lib/core/Plugin.ts","../lib/core/Manager.ts","../lib/core/tree/chopping.ts","../lib/core/tree/colors.ts","../lib/core/tree/selectors.ts","../lib/core/tree/rendering.ts","../lib/core/tree/create-mvs.ts","../lib/react/Viewer.tsx"],"sourcesContent":["/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function getComponentNameFromType(type) {\n if (null == type) return null;\n if (\"function\" === typeof type)\n return type.$$typeof === REACT_CLIENT_REFERENCE\n ? null\n : type.displayName || type.name || null;\n if (\"string\" === typeof type) return type;\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return \"Fragment\";\n case REACT_PROFILER_TYPE:\n return \"Profiler\";\n case REACT_STRICT_MODE_TYPE:\n return \"StrictMode\";\n case REACT_SUSPENSE_TYPE:\n return \"Suspense\";\n case REACT_SUSPENSE_LIST_TYPE:\n return \"SuspenseList\";\n case REACT_ACTIVITY_TYPE:\n return \"Activity\";\n }\n if (\"object\" === typeof type)\n switch (\n (\"number\" === typeof type.tag &&\n console.error(\n \"Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.\"\n ),\n type.$$typeof)\n ) {\n case REACT_PORTAL_TYPE:\n return \"Portal\";\n case REACT_CONTEXT_TYPE:\n return type.displayName || \"Context\";\n case REACT_CONSUMER_TYPE:\n return (type._context.displayName || \"Context\") + \".Consumer\";\n case REACT_FORWARD_REF_TYPE:\n var innerType = type.render;\n type = type.displayName;\n type ||\n ((type = innerType.displayName || innerType.name || \"\"),\n (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n return type;\n case REACT_MEMO_TYPE:\n return (\n (innerType = type.displayName || null),\n null !== innerType\n ? innerType\n : getComponentNameFromType(type.type) || \"Memo\"\n );\n case REACT_LAZY_TYPE:\n innerType = type._payload;\n type = type._init;\n try {\n return getComponentNameFromType(type(innerType));\n } catch (x) {}\n }\n return null;\n }\n function testStringCoercion(value) {\n return \"\" + value;\n }\n function checkKeyStringCoercion(value) {\n try {\n testStringCoercion(value);\n var JSCompiler_inline_result = !1;\n } catch (e) {\n JSCompiler_inline_result = !0;\n }\n if (JSCompiler_inline_result) {\n JSCompiler_inline_result = console;\n var JSCompiler_temp_const = JSCompiler_inline_result.error;\n var JSCompiler_inline_result$jscomp$0 =\n (\"function\" === typeof Symbol &&\n Symbol.toStringTag &&\n value[Symbol.toStringTag]) ||\n value.constructor.name ||\n \"Object\";\n JSCompiler_temp_const.call(\n JSCompiler_inline_result,\n \"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.\",\n JSCompiler_inline_result$jscomp$0\n );\n return testStringCoercion(value);\n }\n }\n function getTaskName(type) {\n if (type === REACT_FRAGMENT_TYPE) return \"<>\";\n if (\n \"object\" === typeof type &&\n null !== type &&\n type.$$typeof === REACT_LAZY_TYPE\n )\n return \"<...>\";\n try {\n var name = getComponentNameFromType(type);\n return name ? \"<\" + name + \">\" : \"<...>\";\n } catch (x) {\n return \"<...>\";\n }\n }\n function getOwner() {\n var dispatcher = ReactSharedInternals.A;\n return null === dispatcher ? null : dispatcher.getOwner();\n }\n function UnknownOwner() {\n return Error(\"react-stack-top-frame\");\n }\n function hasValidKey(config) {\n if (hasOwnProperty.call(config, \"key\")) {\n var getter = Object.getOwnPropertyDescriptor(config, \"key\").get;\n if (getter && getter.isReactWarning) return !1;\n }\n return void 0 !== config.key;\n }\n function defineKeyPropWarningGetter(props, displayName) {\n function warnAboutAccessingKey() {\n specialPropKeyWarningShown ||\n ((specialPropKeyWarningShown = !0),\n console.error(\n \"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)\",\n displayName\n ));\n }\n warnAboutAccessingKey.isReactWarning = !0;\n Object.defineProperty(props, \"key\", {\n get: warnAboutAccessingKey,\n configurable: !0\n });\n }\n function elementRefGetterWithDeprecationWarning() {\n var componentName = getComponentNameFromType(this.type);\n didWarnAboutElementRef[componentName] ||\n ((didWarnAboutElementRef[componentName] = !0),\n console.error(\n \"Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.\"\n ));\n componentName = this.props.ref;\n return void 0 !== componentName ? componentName : null;\n }\n function ReactElement(type, key, props, owner, debugStack, debugTask) {\n var refProp = props.ref;\n type = {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n props: props,\n _owner: owner\n };\n null !== (void 0 !== refProp ? refProp : null)\n ? Object.defineProperty(type, \"ref\", {\n enumerable: !1,\n get: elementRefGetterWithDeprecationWarning\n })\n : Object.defineProperty(type, \"ref\", { enumerable: !1, value: null });\n type._store = {};\n Object.defineProperty(type._store, \"validated\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: 0\n });\n Object.defineProperty(type, \"_debugInfo\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: null\n });\n Object.defineProperty(type, \"_debugStack\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugStack\n });\n Object.defineProperty(type, \"_debugTask\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugTask\n });\n Object.freeze && (Object.freeze(type.props), Object.freeze(type));\n return type;\n }\n function jsxDEVImpl(\n type,\n config,\n maybeKey,\n isStaticChildren,\n debugStack,\n debugTask\n ) {\n var children = config.children;\n if (void 0 !== children)\n if (isStaticChildren)\n if (isArrayImpl(children)) {\n for (\n isStaticChildren = 0;\n isStaticChildren < children.length;\n isStaticChildren++\n )\n validateChildKeys(children[isStaticChildren]);\n Object.freeze && Object.freeze(children);\n } else\n console.error(\n \"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\"\n );\n else validateChildKeys(children);\n if (hasOwnProperty.call(config, \"key\")) {\n children = getComponentNameFromType(type);\n var keys = Object.keys(config).filter(function (k) {\n return \"key\" !== k;\n });\n isStaticChildren =\n 0 < keys.length\n ? \"{key: someKey, \" + keys.join(\": ..., \") + \": ...}\"\n : \"{key: someKey}\";\n didWarnAboutKeySpread[children + isStaticChildren] ||\n ((keys =\n 0 < keys.length ? \"{\" + keys.join(\": ..., \") + \": ...}\" : \"{}\"),\n console.error(\n 'A props object containing a \"key\" prop is being spread into JSX:\\n let props = %s;\\n <%s {...props} />\\nReact keys must be passed directly to JSX without using spread:\\n let props = %s;\\n <%s key={someKey} {...props} />',\n isStaticChildren,\n children,\n keys,\n children\n ),\n (didWarnAboutKeySpread[children + isStaticChildren] = !0));\n }\n children = null;\n void 0 !== maybeKey &&\n (checkKeyStringCoercion(maybeKey), (children = \"\" + maybeKey));\n hasValidKey(config) &&\n (checkKeyStringCoercion(config.key), (children = \"\" + config.key));\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n children &&\n defineKeyPropWarningGetter(\n maybeKey,\n \"function\" === typeof type\n ? type.displayName || type.name || \"Unknown\"\n : type\n );\n return ReactElement(\n type,\n children,\n maybeKey,\n getOwner(),\n debugStack,\n debugTask\n );\n }\n function validateChildKeys(node) {\n isValidElement(node)\n ? node._store && (node._store.validated = 1)\n : \"object\" === typeof node &&\n null !== node &&\n node.$$typeof === REACT_LAZY_TYPE &&\n (\"fulfilled\" === node._payload.status\n ? isValidElement(node._payload.value) &&\n node._payload.value._store &&\n (node._payload.value._store.validated = 1)\n : node._store && (node._store.validated = 1));\n }\n function isValidElement(object) {\n return (\n \"object\" === typeof object &&\n null !== object &&\n object.$$typeof === REACT_ELEMENT_TYPE\n );\n }\n var React = require(\"react\"),\n REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\"),\n ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n hasOwnProperty = Object.prototype.hasOwnProperty,\n isArrayImpl = Array.isArray,\n createTask = console.createTask\n ? console.createTask\n : function () {\n return null;\n };\n React = {\n react_stack_bottom_frame: function (callStackForError) {\n return callStackForError();\n }\n };\n var specialPropKeyWarningShown;\n var didWarnAboutElementRef = {};\n var unknownOwnerDebugStack = React.react_stack_bottom_frame.bind(\n React,\n UnknownOwner\n )();\n var unknownOwnerDebugTask = createTask(getTaskName(UnknownOwner));\n var didWarnAboutKeySpread = {};\n exports.Fragment = REACT_FRAGMENT_TYPE;\n exports.jsx = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !1,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n exports.jsxs = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !0,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","export default function LoaderView() {\n return (\n <div\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n width: \"100%\",\n height: \"100%\",\n backdropFilter: \"blur(5px)\",\n backgroundColor: \"#0000000A\",\n }}\n >\n <div\n style={{\n position: \"absolute\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: \"1rem\",\n }}\n >\n <div\n style={{\n width: \"48px\",\n height: \"48px\",\n border: \"6px solid #e5e7eb\",\n borderTopColor: \"#3b82f6\",\n borderRadius: \"50%\",\n animation: \"spin 0.8s linear infinite\",\n }}\n />\n <p\n style={{\n margin: 0,\n fontSize: \"0.875rem\",\n color: \"#6b7280\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n }}\n >\n Loading...\n </p>\n <style>\n {`\n @keyframes spin {\n to {\n transform: rotate(360deg);\n }\n }\n `}\n </style>\n </div>\n </div>\n );\n}\n","export default function ErrorView() {\n return (\n <div\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n width: \"100%\",\n height: \"100%\",\n backdropFilter: \"blur(5px)\",\n backgroundColor: \"#0000000A\",\n }}\n >\n <div\n style={{\n position: \"absolute\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: \"0.75rem\",\n padding: \"1.5rem\",\n }}\n >\n <div\n style={{\n width: \"48px\",\n height: \"48px\",\n borderRadius: \"50%\",\n backgroundColor: \"#fef2f2\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"#ef4444\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-label=\"Error icon\"\n >\n <title>Error</title>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\" />\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\" />\n </svg>\n </div>\n <div style={{ textAlign: \"center\" }}>\n <p\n style={{\n margin: 0,\n fontSize: \"0.875rem\",\n fontWeight: 600,\n color: \"#1f2937\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n }}\n >\n Error loading viewer\n </p>\n <p\n style={{\n margin: \"0.25rem 0 0 0\",\n fontSize: \"0.75rem\",\n color: \"#6b7280\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n }}\n >\n Please try refreshing the page\n </p>\n </div>\n </div>\n </div>\n );\n}\n","import { loadMVSData } from \"molstar/lib/extensions/mvs/components/formats\";\nimport type { MVSData } from \"molstar/lib/extensions/mvs/mvs-data.d.ts\";\nimport type { ColorHEX, Matrix3D, Vector3D } from \"./types\";\nimport { Color } from \"molstar/lib/mol-util/color\";\n\nimport { createPluginUI } from \"molstar/lib/mol-plugin-ui\";\nimport { renderReact18 } from \"molstar/lib/mol-plugin-ui/react18\";\nimport { PluginSpec } from \"molstar/lib/mol-plugin/spec\";\nimport { MolViewSpec } from \"molstar/lib/extensions/mvs/behavior\";\nimport { DefaultPluginUISpec } from \"molstar/lib/mol-plugin-ui/spec\";\nimport type { InitialUI } from \"./types\";\nimport type { PluginUIContext } from \"molstar/lib/mol-plugin-ui/context\";\nimport { Mat4, Vec3 } from \"molstar/lib/mol-math/linear-algebra\";\nimport { PluginStateObject } from \"molstar/lib/mol-plugin-state/objects\";\nimport { Script } from \"molstar/lib/mol-script/script\";\nimport {\n StructureElement,\n StructureSelection,\n} from \"molstar/lib/mol-model/structure\";\nimport { StateTransforms } from \"molstar/lib/mol-plugin-state/transforms\";\n\nclass Plugin {\n private plugin: PluginUIContext;\n private objectUrls: Set<string>;\n\n constructor(plugin: PluginUIContext) {\n this.plugin = plugin;\n this.objectUrls = new Set();\n }\n\n /**\n * Create a Plugin by instantiating the underlying PluginUI.\n * We use a static async factory because constructors cannot be async.\n */\n static async create(\n container: HTMLElement,\n initialUI: InitialUI\n ): Promise<Plugin> {\n const defaultSpec = DefaultPluginUISpec();\n\n if (!container.querySelector(\".msp-plugin\")) {\n container.innerHTML = \"\";\n }\n\n const plugin = await createPluginUI({\n target: container,\n render: renderReact18,\n spec: {\n actions: defaultSpec.actions ?? [],\n behaviors: [\n ...(initialUI !== \"minimal\" ? defaultSpec.behaviors : []),\n PluginSpec.Behavior(MolViewSpec),\n ],\n animations: [...(defaultSpec.animations || [])],\n layout: {\n initial: {\n showControls: initialUI === \"expanded\",\n controlsDisplay: \"reactive\",\n // isExpanded: false,\n },\n },\n components: {\n ...defaultSpec.components,\n },\n canvas3d: {\n ...defaultSpec.canvas3d,\n camera: {\n ...defaultSpec.canvas3d?.camera,\n helper: {\n axes:\n initialUI === \"minimal\"\n ? {\n name: \"off\",\n params: {},\n }\n : defaultSpec.canvas3d?.camera?.helper?.axes,\n },\n },\n },\n },\n });\n\n return new Plugin(plugin);\n }\n\n dispose() {\n this.plugin.dispose();\n this.cleanupObjectUrls();\n }\n\n cleanupObjectUrls() {\n for (const url of this.objectUrls) {\n try {\n URL.revokeObjectURL(url);\n } catch (_e) {\n // ignore\n }\n\n this.objectUrls.delete(url);\n }\n }\n\n createObjectUrlFromFile(file: File): string {\n const url = URL.createObjectURL(file);\n this.objectUrls.add(url);\n return url;\n }\n\n clear() {\n this.plugin.clear();\n }\n\n async loadMvs(mvs: MVSData) {\n return await loadMVSData(this.plugin, mvs, \"mvsj\");\n }\n\n setBackgroundColor(color: ColorHEX) {\n const hexString = color.replace(\"#\", \"0x\");\n\n this.plugin.canvas3d?.setProps({\n renderer: { backgroundColor: Color.fromHexString(hexString) },\n });\n }\n\n setAnimation(type: \"spin\" | \"rock\" | \"off\", speed?: number) {\n if (type === \"off\") {\n this.plugin.canvas3d?.setProps({\n trackball: {\n animate: {\n name: \"off\",\n params: {},\n },\n },\n });\n\n return;\n }\n\n const animationParams =\n type === \"spin\"\n ? {\n speed: speed ?? 0.05,\n }\n : {\n speed: speed ?? 0.2,\n angle: 10,\n };\n\n this.plugin.canvas3d?.setProps({\n trackball: {\n animate: {\n name: type,\n params: animationParams,\n },\n },\n });\n }\n\n async focusOnDomain(domainStart: number, domainEnd: number) {\n const state = this.plugin.state.data;\n\n // Find all structure cells in the state tree\n const structures = state.selectQ((q) =>\n q.rootsOfType(PluginStateObject.Molecule.Structure)\n );\n\n if (structures.length === 0) {\n return;\n }\n\n // Use the first structure for focusing\n const structureCell = structures[0];\n if (!structureCell?.obj) {\n return;\n }\n\n const structureData = structureCell.obj.data;\n\n // Build a selection query for the residue range\n const selection = Script.getStructureSelection(\n (Q) =>\n Q.struct.generator.atomGroups({\n \"residue-test\": Q.core.rel.inRange([\n Q.struct.atomProperty.macromolecular.auth_seq_id(),\n domainStart,\n domainEnd,\n ]),\n }),\n structureData\n );\n\n const loci = StructureSelection.toLociWithSourceUnits(selection);\n\n // Focus camera on the loci\n if (!StructureElement.Loci.isEmpty(loci)) {\n await this.plugin.managers.camera.focusLoci(loci);\n }\n }\n\n async resetView() {\n // Reset camera to show all structures\n await this.plugin.managers.camera.reset();\n }\n\n async updateStructureTransform(\n structureIndex: number,\n translation?: Vector3D,\n rotation?: Matrix3D\n ) {\n const state = this.plugin.state.data;\n\n // Find all structure cells in the state tree\n const structures = state.selectQ((q) =>\n q.rootsOfType(PluginStateObject.Molecule.Structure)\n );\n\n if (structureIndex >= structures.length) {\n return;\n }\n\n const targetStructure = structures[structureIndex];\n if (!targetStructure) {\n return;\n }\n\n // Find transform nodes in the structure's subtree\n const allCells = state.selectQ((q) => q.root.subtree());\n const transforms = allCells.filter(\n (cell) =>\n cell.transform.transformer ===\n StateTransforms.Model.TransformStructureConformation\n );\n\n // Match transform by structure index (assumes structures and transforms are in same order)\n const targetTransform = transforms[structureIndex];\n\n if (targetTransform) {\n // Create the transformation matrix\n const matrix = Mat4.identity();\n\n // Apply rotation if provided\n if (rotation) {\n // Set rotation part of the matrix (top-left 3x3)\n Mat4.setValue(matrix, 0, 0, rotation[0][0]);\n Mat4.setValue(matrix, 0, 1, rotation[0][1]);\n Mat4.setValue(matrix, 0, 2, rotation[0][2]);\n Mat4.setValue(matrix, 1, 0, rotation[1][0]);\n Mat4.setValue(matrix, 1, 1, rotation[1][1]);\n Mat4.setValue(matrix, 1, 2, rotation[1][2]);\n Mat4.setValue(matrix, 2, 0, rotation[2][0]);\n Mat4.setValue(matrix, 2, 1, rotation[2][1]);\n Mat4.setValue(matrix, 2, 2, rotation[2][2]);\n }\n\n // Apply translation if provided\n if (translation) {\n Mat4.setTranslation(\n matrix,\n Vec3.create(translation[0], translation[1], translation[2])\n );\n }\n\n // Update the transform with new rotation and translation\n const update = state\n .build()\n .to(targetTransform.transform.ref)\n .update(\n StateTransforms.Model.TransformStructureConformation,\n (old) => ({\n ...old,\n transform: {\n name: \"matrix\" as const,\n params: {\n data: matrix,\n transpose: false,\n },\n },\n })\n );\n\n await this.plugin.runTask(state.updateTree(update));\n }\n }\n\n getPluginContext() {\n return this.plugin;\n }\n}\n\nexport { Plugin };\n","import { Plugin } from \"./Plugin\";\nimport type { InitialUI } from \"./types\";\n\nconst PLUGIN_GC_TIMEOUT = 30 * 1000; // 30 seconds\n\nclass Manager {\n private static instance: Manager;\n\n private initializatingContainers: Set<HTMLElement>;\n private plugins: Map<HTMLElement, Plugin>;\n private refCount: Map<Plugin, [number, number]>; // [count, lastUsedTimestamp]\n private timer: number | undefined;\n\n private constructor() {\n this.initializatingContainers = new Set();\n this.plugins = new Map();\n this.refCount = new Map();\n this.timer = undefined;\n\n this.initGC();\n }\n\n public static getInstance(): Manager {\n if (!Manager.instance) {\n Manager.instance = new Manager();\n }\n\n return Manager.instance;\n }\n\n cleanup() {\n clearInterval(this.timer);\n }\n\n private initGC() {\n this.timer = setInterval(() => {\n const now = Date.now();\n\n for (const [plugin, lastActive] of this.refCount) {\n if (lastActive[0] === 0 && now - lastActive[1] > PLUGIN_GC_TIMEOUT) {\n plugin.dispose();\n }\n }\n }, 20 * 1000); // Run every 20 seconds\n }\n\n async initPlugin(\n container: HTMLElement,\n initialUI: InitialUI\n ): Promise<Plugin> {\n if (this.plugins.has(container)) {\n // biome-ignore lint/style/noNonNullAssertion: Safe because of has() check\n return this.plugins.get(container)!;\n }\n\n if (container.querySelector(\".msp-plugin\")) {\n for (const [containerElem, plugin] of this.plugins) {\n if (containerElem.contains(container)) {\n return plugin;\n }\n }\n }\n\n if (this.initializatingContainers.has(container)) {\n while (this.initializatingContainers.has(container)) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n\n const plugin = this.plugins.get(container);\n if (!plugin) {\n throw new Error(\"Viewer initialization failed\");\n }\n\n return plugin;\n }\n\n try {\n this.initializatingContainers.add(container);\n\n if (!container.querySelector(\".msp-plugin\")) {\n container.innerHTML = \"\";\n }\n\n const instance = await Plugin.create(container, initialUI);\n this.refCount.set(instance, [1, Date.now()]);\n\n this.plugins.set(container, instance);\n return instance;\n } finally {\n this.initializatingContainers.delete(container);\n }\n }\n\n getPlugin(container: HTMLElement): Plugin | undefined {\n const plugin = this.plugins.get(container);\n\n if (plugin) {\n const ref = this.refCount.get(plugin);\n if (ref) {\n ref[0]++;\n ref[1] = Date.now();\n }\n }\n\n return plugin;\n }\n\n releasePlugin(plugin: Plugin) {\n const ref = this.refCount.get(plugin);\n if (!ref) {\n throw new Error(\"Trying to release a plugin that is not managed\");\n }\n\n ref[0] = Math.max(0, ref[0] - 1);\n ref[1] = Date.now();\n }\n\n disposePlugin(container: HTMLElement) {\n const plugin = this.plugins.get(container);\n\n if (plugin) {\n plugin.dispose();\n this.plugins.delete(container);\n container.innerHTML = \"\";\n }\n }\n}\n\nexport { Manager };\n","import type { Protein } from \"../types\";\n\ntype NormalizedChoppingEntry = {\n label: string;\n showLabel: boolean;\n ranges: { start: number; end: number }[];\n};\n\nfunction normalizeChoppingData(\n chopping?: Protein[\"chopping\"]\n): NormalizedChoppingEntry[] {\n if (!chopping) {\n return [];\n }\n\n return chopping\n .map((entry) => ({\n label: entry.label,\n showLabel: entry.showLabel,\n ranges: entry.ranges\n .map((range) => ({\n start: Math.min(range.start, range.end),\n end: Math.max(range.start, range.end),\n }))\n .filter(\n (range) => Number.isFinite(range.start) && Number.isFinite(range.end)\n ),\n }))\n .filter((entry) => entry.ranges.length > 0);\n}\n\nexport type { NormalizedChoppingEntry };\nexport { normalizeChoppingData };\n","import type { ColorHEX } from \"../types\";\nimport type {\n ComponentExpressionT,\n ComponentSelectorT,\n} from \"molstar/lib/extensions/mvs/tree/mvs/param-types\";\n\ntype RGB = [number, number, number];\ntype ShadeMode = \"lighten\" | \"darken\" | \"base\";\n\nconst SHADE_STEPS: { mode: ShadeMode; factor: number }[] = [\n { mode: \"lighten\", factor: 0.5 },\n { mode: \"lighten\", factor: 0.25 },\n { mode: \"base\", factor: 0 },\n { mode: \"darken\", factor: 0.1 },\n { mode: \"darken\", factor: 0.25 },\n { mode: \"darken\", factor: 0.4 },\n];\n\nconst BASE_COLOR_YELLOW: ColorHEX = \"#FD9D0D\";\nconst BASE_COLOR_BLUE: ColorHEX = \"#0D6EFD\";\nconst BASE_COLOR_GREY: ColorHEX = \"#F0F0F0\";\nconst MULTI_DOMAIN_COLORS: ColorHEX[] = [\n \"#4e79a7\",\n \"#f28e2c\",\n \"#e15759\",\n \"#76b7b2\",\n \"#59a14f\",\n \"#edc949\",\n \"#af7aa1\",\n \"#ff9da7\",\n \"#9c755f\",\n \"#bab0ac\",\n] as ColorHEX[];\nconst MULTI_PROTEIN_OPACITY_MAX = 0.5;\nconst MULTI_PROTEIN_OPACITY_MIN = 0.1;\nconst ALPHAFOLD_CONFIDENCE_COLORS = {\n veryHigh: \"#0053D6\" as ColorHEX,\n confident: \"#65CBF3\" as ColorHEX,\n low: \"#FFDB13\" as ColorHEX,\n veryLow: \"#FF7D45\" as ColorHEX,\n};\n\nfunction normalizeHexColor(hex: ColorHEX): ColorHEX {\n const trimmed = hex.trim();\n const withoutHash = trimmed.startsWith(\"#\") ? trimmed.slice(1) : trimmed;\n if (withoutHash.length !== 3 && withoutHash.length !== 6) {\n throw new Error(\"Only 3 or 6 digit hex colors are supported\");\n }\n\n if (!/^[0-9A-Fa-f]+$/.test(withoutHash)) {\n throw new Error(\"Invalid hex color value\");\n }\n\n const expanded =\n withoutHash.length === 3\n ? withoutHash\n .split(\"\")\n .map((char) => char + char)\n .join(\"\")\n : withoutHash;\n\n return `#${expanded.toUpperCase()}` as ColorHEX;\n}\n\nfunction hexToRgb(hex: ColorHEX): RGB {\n const normalized = normalizeHexColor(hex);\n return [\n parseInt(normalized.slice(1, 3), 16),\n parseInt(normalized.slice(3, 5), 16),\n parseInt(normalized.slice(5, 7), 16),\n ];\n}\n\nfunction rgbToHex([r, g, b]: RGB): ColorHEX {\n const channelToHex = (channel: number) =>\n channel.toString(16).padStart(2, \"0\");\n return `#${channelToHex(r)}${channelToHex(g)}${channelToHex(b)}`.toUpperCase() as ColorHEX;\n}\n\nfunction mixChannel(value: number, target: number, factor: number) {\n return Math.round(value + (target - value) * factor);\n}\n\nfunction lightenColor([r, g, b]: RGB, factor: number): RGB {\n return [\n mixChannel(r, 255, factor),\n mixChannel(g, 255, factor),\n mixChannel(b, 255, factor),\n ];\n}\n\nfunction darkenColor([r, g, b]: RGB, factor: number): RGB {\n return [\n mixChannel(r, 0, factor),\n mixChannel(g, 0, factor),\n mixChannel(b, 0, factor),\n ];\n}\n\nfunction makeShades(color: ColorHEX, count: number): ColorHEX[] {\n if (count < 1) {\n throw new Error(\"Count must be at least 1\");\n }\n\n const baseColor = hexToRgb(color);\n const palette = SHADE_STEPS.map((step) => {\n if (step.mode === \"lighten\") {\n return rgbToHex(lightenColor(baseColor, step.factor));\n }\n\n if (step.mode === \"darken\") {\n return rgbToHex(darkenColor(baseColor, step.factor));\n }\n\n return rgbToHex(baseColor);\n });\n\n const shades: ColorHEX[] = [];\n for (let i = 0; i < count; i++) {\n shades.push(palette[i % palette.length]!);\n }\n\n return shades;\n}\n\nfunction getBaseColor(colors: ColorHEX[], index: number): ColorHEX {\n return colors[index] ?? BASE_COLOR_GREY;\n}\n\nfunction getOpacityForProtein(\n index: number,\n totalProteins: number\n): number | undefined {\n if (totalProteins < 3 || index === 0) {\n return undefined;\n }\n\n const range = MULTI_PROTEIN_OPACITY_MAX - MULTI_PROTEIN_OPACITY_MIN;\n const step = range / (totalProteins - 1);\n return Math.max(\n MULTI_PROTEIN_OPACITY_MIN,\n MULTI_PROTEIN_OPACITY_MAX - (index - 1) * step\n );\n}\n\nfunction applyFlatColor(\n representation: any,\n color: ColorHEX,\n selector?: ComponentSelectorT | ComponentExpressionT | ComponentExpressionT[]\n) {\n const params: {\n color: ColorHEX;\n selector?:\n | ComponentSelectorT\n | ComponentExpressionT\n | ComponentExpressionT[];\n } = { color };\n\n if (selector) {\n params.selector = selector;\n }\n\n representation.color(params);\n}\n\nfunction applyAlphaFoldConfidenceColor(\n struct: any,\n component: any,\n representation: any\n) {\n representation.colorFromSource({\n schema: \"all_atomic\",\n category_name: \"atom_site\",\n field_name: \"B_iso_or_equiv\",\n palette: {\n kind: \"discrete\",\n mode: \"absolute\",\n colors: [\n [ALPHAFOLD_CONFIDENCE_COLORS.veryLow, 0],\n [ALPHAFOLD_CONFIDENCE_COLORS.low, 50],\n [ALPHAFOLD_CONFIDENCE_COLORS.confident, 70],\n [ALPHAFOLD_CONFIDENCE_COLORS.veryHigh, 90],\n ],\n },\n });\n\n component.tooltip({ text: \"pLDDT:\" });\n struct.tooltipFromSource({\n schema: \"all_atomic\",\n category_name: \"atom_site\",\n field_name: \"B_iso_or_equiv\",\n });\n}\n\nfunction inferColors(count: number, domains?: number): ColorHEX[] {\n if (count < 0) {\n throw new Error(\"Count must be non-negative\");\n }\n\n if (count === 0) {\n return [];\n }\n\n if (domains !== undefined) {\n if (domains <= 1) {\n throw new Error(\n \"At least two domains are required to infer domain colors\"\n );\n }\n\n return [\"#FF999C\", \"#C8EAFF\", \"#8D272B\", \"#86AEC6\"];\n }\n\n if (count === 1) {\n return [BASE_COLOR_BLUE];\n }\n\n if (count === 2) {\n return [BASE_COLOR_BLUE, BASE_COLOR_YELLOW];\n }\n\n return [BASE_COLOR_YELLOW, ...Array(count - 1).fill(BASE_COLOR_GREY)];\n}\n\nexport {\n BASE_COLOR_BLUE,\n BASE_COLOR_GREY,\n BASE_COLOR_YELLOW,\n MULTI_DOMAIN_COLORS,\n makeShades,\n getBaseColor,\n getOpacityForProtein,\n applyFlatColor,\n applyAlphaFoldConfidenceColor,\n inferColors,\n};\n","import type { Protein } from \"../types\";\n\nfunction createChainSelector(protein: Protein) {\n if (!protein.chain) {\n return \"all\";\n }\n\n return protein.file\n ? { label_asym_id: protein.chain }\n : { auth_asym_id: protein.chain };\n}\n\nfunction getRepresentationType(protein: Protein, representationType?: string) {\n return representationType ?? protein.representation ?? \"cartoon\";\n}\n\nfunction createRepresentationParams(\n protein: Protein,\n representationType?: string\n) {\n const repType = getRepresentationType(protein, representationType);\n\n if (protein.file) {\n return { size_factor: 1, tubular_helices: false, type: repType };\n }\n\n return { type: repType };\n}\n\nfunction isCartoonLikeRepresentation(repType: string) {\n return repType === \"cartoon\" || repType === \"backbone\";\n}\n\nfunction createDomainSelector(\n protein: Protein,\n seqRange?: { beg_auth_seq_id: number; end_auth_seq_id: number }\n) {\n if (!protein.chain) {\n return seqRange ?? \"all\";\n }\n\n const chainId = protein.file\n ? { label_asym_id: protein.chain }\n : { auth_asym_id: protein.chain };\n\n return seqRange ? { ...chainId, ...seqRange } : chainId;\n}\n\nexport {\n createChainSelector,\n createDomainSelector,\n createRepresentationParams,\n getRepresentationType,\n isCartoonLikeRepresentation,\n};\n","import type { ColorHEX, Protein } from \"../types\";\nimport type { ComponentExpressionT } from \"molstar/lib/extensions/mvs/tree/mvs/param-types\";\nimport {\n applyAlphaFoldConfidenceColor,\n applyFlatColor,\n BASE_COLOR_BLUE,\n BASE_COLOR_GREY,\n BASE_COLOR_YELLOW,\n getBaseColor,\n getOpacityForProtein,\n MULTI_DOMAIN_COLORS,\n} from \"./colors\";\nimport type { NormalizedChoppingEntry } from \"./chopping\";\nimport {\n createChainSelector,\n createDomainSelector,\n createRepresentationParams,\n getRepresentationType,\n isCartoonLikeRepresentation,\n} from \"./selectors\";\n\nconst REST_OPACITY = 0.15;\n\nfunction renderProteinWithoutChopping(\n struct: any,\n protein: Protein,\n proteinIndex: number,\n totalProteins: number,\n colors: ColorHEX[]\n) {\n const selector = createChainSelector(protein);\n const comp = struct.component({ selector });\n const repType = getRepresentationType(protein);\n const repr = comp.representation(\n createRepresentationParams(protein, repType)\n );\n\n if (totalProteins === 1) {\n if (isCartoonLikeRepresentation(repType)) {\n applyAlphaFoldConfidenceColor(struct, comp, repr);\n }\n return;\n }\n\n if (totalProteins >= 3) {\n if (proteinIndex === 0 && isCartoonLikeRepresentation(repType)) {\n applyAlphaFoldConfidenceColor(struct, comp, repr);\n } else {\n const color = getBaseColor(colors, proteinIndex);\n applyFlatColor(repr, color);\n const opacity = getOpacityForProtein(proteinIndex, totalProteins);\n if (opacity !== undefined) {\n repr.opacity({ opacity });\n }\n }\n return;\n }\n\n const color = getBaseColor(colors, proteinIndex);\n applyFlatColor(repr, color);\n\n const opacity = getOpacityForProtein(proteinIndex, totalProteins);\n if (opacity !== undefined && opacity < 1) {\n repr.opacity({ opacity });\n }\n}\n\nfunction renderProteinWithChopping(\n struct: any,\n protein: Protein,\n proteinIndex: number,\n totalProteins: number,\n colors: ColorHEX[],\n choppingEntries: NormalizedChoppingEntry[]\n) {\n if (choppingEntries.length === 0) {\n return;\n }\n\n const selector = createChainSelector(protein);\n const comp = struct.component({ selector });\n const baseRepr = comp.representation(createRepresentationParams(protein));\n\n let backgroundColor: ColorHEX;\n let restOpacity = REST_OPACITY;\n if (totalProteins === 1 && choppingEntries.length >= 2) {\n backgroundColor = BASE_COLOR_GREY;\n restOpacity = 1;\n } else {\n backgroundColor = getBaseColor(colors, proteinIndex);\n }\n\n applyFlatColor(baseRepr, backgroundColor);\n baseRepr.opacity({ opacity: restOpacity });\n\n const useInlineDomainColoring =\n totalProteins === 1 && choppingEntries.length >= 2;\n\n let domainPalette: ColorHEX[];\n\n if (totalProteins === 1 && choppingEntries.length >= 2) {\n domainPalette = choppingEntries.map(\n (_, index) => MULTI_DOMAIN_COLORS[index % MULTI_DOMAIN_COLORS.length]!\n );\n } else if (totalProteins === 2 && choppingEntries.length >= 2) {\n const baseColorForDomains =\n proteinIndex === 0 ? BASE_COLOR_BLUE : BASE_COLOR_YELLOW;\n domainPalette = Array(choppingEntries.length).fill(baseColorForDomains);\n } else if (totalProteins === 2 && choppingEntries.length === 1) {\n domainPalette = [backgroundColor];\n } else {\n domainPalette = Array(choppingEntries.length).fill(BASE_COLOR_BLUE);\n }\n\n if (useInlineDomainColoring) {\n choppingEntries.forEach((entry, entryIndex) => {\n applyDomainColor(baseRepr, protein, entry, domainPalette[entryIndex]!);\n addDomainLabel(struct, protein, entry);\n });\n return;\n }\n\n choppingEntries.forEach((entry, entryIndex) => {\n renderDomainEntry(struct, protein, entry, domainPalette[entryIndex]!);\n });\n}\n\nfunction applyDomainColor(\n representation: any,\n protein: Protein,\n entry: NormalizedChoppingEntry,\n color: ColorHEX\n) {\n if (entry.ranges.length === 0) {\n return;\n }\n\n const selectors = entry.ranges.map<ComponentExpressionT>((range) => {\n const seqRange = {\n beg_auth_seq_id: range.start,\n end_auth_seq_id: range.end,\n };\n return createDomainSelector(protein, seqRange) as ComponentExpressionT;\n });\n\n const selectorParam = selectors.length === 1 ? selectors[0]! : selectors;\n applyFlatColor(representation, color, selectorParam);\n}\n\nfunction renderDomainEntry(\n struct: any,\n protein: Protein,\n entry: NormalizedChoppingEntry,\n color: ColorHEX\n) {\n const reprParams = createRepresentationParams(protein);\n\n entry.ranges.forEach((range) => {\n const seqRange = {\n beg_auth_seq_id: range.start,\n end_auth_seq_id: range.end,\n };\n const selector = createDomainSelector(protein, seqRange);\n const domainComp = struct.component({ selector });\n const domainRepr = domainComp.representation(reprParams);\n applyFlatColor(domainRepr, color);\n });\n\n addDomainLabel(struct, protein, entry);\n}\n\nfunction addDomainLabel(\n struct: any,\n protein: Protein,\n entry: NormalizedChoppingEntry\n) {\n if (!entry.showLabel || entry.ranges.length === 0) {\n return;\n }\n\n const labelRange =\n entry.ranges[Math.floor(entry.ranges.length / 2)] ?? entry.ranges[0]!;\n const labelSelector = createDomainSelector(protein, {\n beg_auth_seq_id: labelRange.start,\n end_auth_seq_id: labelRange.end,\n });\n struct.component({ selector: labelSelector }).label({\n text: entry.label,\n });\n}\n\nexport { renderProteinWithChopping, renderProteinWithoutChopping };\n","import type {\n ColorHEX,\n Matrix3D,\n Matrix3DFlattened,\n ModelSourceUrls,\n Protein,\n Vector3D,\n} from \"../types\";\nimport type { MVSData } from \"molstar/lib/extensions/mvs/mvs-data.d.ts\";\nimport type { Plugin } from \"../Plugin\";\nimport {\n createMVSBuilder,\n Root,\n} from \"molstar/lib/extensions/mvs/tree/mvs/mvs-builder\";\nimport { normalizeChoppingData } from \"./chopping\";\nimport { inferColors } from \"./colors\";\nimport {\n renderProteinWithChopping,\n renderProteinWithoutChopping,\n} from \"./rendering\";\n\nfunction transposeAndFlatten(matrix: Matrix3D): Matrix3DFlattened {\n return matrix[0].flatMap((_, colIndex) =>\n matrix.map((row) => row[colIndex])\n ) as Matrix3DFlattened;\n}\n\nconst DEFAULT_ROTATION: Matrix3D = [\n [1, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n];\nconst DEFAULT_TRANSLATION: Vector3D = [0, 0, 0];\n\nfunction prepareModelSourceUrl(\n protein: Protein,\n modelSourceUrls: Partial<ModelSourceUrls>,\n plugin?: Plugin\n) {\n const defaultModelSourceUrls = {\n uniProtId: \"https://alphafold.ebi.ac.uk/files\",\n };\n\n let url: string;\n\n if (protein.file) {\n if (!plugin) {\n throw new Error(\n \"Plugin instance is required to create object URL from file\"\n );\n }\n\n url = plugin.createObjectUrlFromFile(protein.file);\n } else if (modelSourceUrls.uniProtId !== undefined) {\n url = modelSourceUrls.uniProtId(protein.uniProtId);\n } else {\n url = `${defaultModelSourceUrls.uniProtId}/AF-${protein.uniProtId}-F1-model_v6.cif`;\n }\n\n return url;\n}\n\nfunction getParseFormat(protein: Protein): \"mmcif\" | \"pdb\" {\n if (!protein.file) {\n return \"mmcif\";\n }\n\n return protein.file.name.endsWith(\".cif\") ||\n protein.file.name.endsWith(\".mmcif\")\n ? \"mmcif\"\n : \"pdb\";\n}\n\nfunction processProtein(\n root: Root,\n protein: Protein,\n proteinIndex: number,\n totalProteins: number,\n colors: ColorHEX[],\n modelSourceUrls: Partial<ModelSourceUrls>,\n plugin?: Plugin\n) {\n const url = prepareModelSourceUrl(protein, modelSourceUrls, plugin);\n const download = root.download({ url });\n\n const parseFormat = getParseFormat(protein);\n const parse = download.parse({ format: parseFormat });\n\n const struct = parse.modelStructure(\n protein.file ? { block_header: null, block_index: 0, model_index: 0 } : {}\n );\n\n struct.transform({\n rotation: transposeAndFlatten(\n protein.superposition?.rotation ?? DEFAULT_ROTATION\n ),\n translation: protein.superposition?.translation ?? DEFAULT_TRANSLATION,\n rotation_center: [0, 0, 0],\n });\n\n const choppingEntries =\n totalProteins >= 3 ? [] : normalizeChoppingData(protein.chopping);\n\n if (choppingEntries.length > 0) {\n renderProteinWithChopping(\n struct,\n protein,\n proteinIndex,\n totalProteins,\n colors,\n choppingEntries\n );\n } else {\n renderProteinWithoutChopping(\n struct,\n protein,\n proteinIndex,\n totalProteins,\n colors\n );\n }\n}\n\nfunction createMVS(\n proteins: Protein[],\n modelSourceUrls: Partial<ModelSourceUrls>,\n plugin?: Plugin\n): MVSData {\n const colors = inferColors(proteins.length);\n\n const root = createMVSBuilder();\n\n for (let i = 0; i < proteins.length; i++) {\n const protein = proteins[i]!;\n processProtein(\n root,\n protein,\n i,\n proteins.length,\n colors,\n modelSourceUrls,\n plugin\n );\n }\n\n return root.getState({\n title: proteins.length > 1 ? \"Protein Comparison\" : \"Protein Visualization\",\n description: `Visualization of ${proteins.length} protein(s)`,\n });\n}\n\nexport { createMVS };\n","\"use client\";\n\nimport {\n useEffect,\n useId,\n useRef,\n useState,\n forwardRef,\n useImperativeHandle,\n type CSSProperties,\n} from \"react\";\nimport \"./style.css\";\nimport \"molstar/lib/mol-plugin-ui/skin/light.scss\";\nimport LoaderView from \"./LoaderView\";\nimport ErrorView from \"./ErrorView\";\nimport { Manager } from \"../core/Manager\";\nimport { createMVS } from \"../core/tree\";\nimport type { Plugin as P } from \"../core/Plugin\";\nimport type { Props, ViewerRef } from \"./types\";\n\ntype ViewerState = \"loading\" | \"success\" | \"error\";\n\n/**\n * Viewer\n *\n * React component that embeds a Mol* viewer plugin and exposes a small imperative\n * API via a forwarded ref. The component is responsible for initializing and\n * releasing a shared plugin instance (via Manager), loading structure data (either\n * from raw `proteins` input or from precomputed `mvs`), and exposing convenience\n * controls such as background color and simple animations (spin/rock).\n *\n * Remarks\n * - Exactly one of `proteins` or `mvs` must be provided. Passing both or neither\n * will throw an error during initialization.\n * - The component holds internal loading state: \"loading\" | \"success\" | \"error\".\n * On initialization errors the state becomes \"error\" and the error is logged to\n * the console.\n * - The plugin instance is created/reused via Manager.getInstance() and is\n * released when the component unmounts (or when the effect cleans up).\n * - UI mode `initialUI` toggles whether control chrome is shown; when set to\n * \"minimal\" an additional CSS class (\"no-controls\") is applied to the container.\n *\n * Props\n * @param proteins - Optional raw proteins data used to construct an MVS representation.\n * When provided, the component will call `createMVS(proteins, modelSourceUrls, plugin)`\n * to compute the view state to load into the plugin.\n * @param mvs - Optional precomputed MVS data. If provided, the viewer loads this\n * directly and does not call `createMVS`.\n * @param modelSourceUrls - Optional lookup mapping used by `createMVS` to resolve\n * model source URLs for remote model retrieval when `proteins` is used.\n * Without trailing slashes, e.g. { uniProtId: \"https://api.example.com/protein\" }.\n * @param initialUI - Which initial UI preset to use for the embedded plugin.\n * Typical values: \"standard\" | \"minimal\". Default: \"standard\".\n * @param bgColor - Background color for the viewer (any valid CSS color). Default: \"#ffffff\".\n * @param spin - Whether to enable continuous spin animation. Mutually exclusive with `rock`.\n * @param spinSpeed - Speed multiplier for the spin animation. Default: 0.05.\n * @param rock - Whether to enable rock animation (back-and-forth). Mutually exclusive with `spin`.\n * @param rockSpeed - Speed multiplier for the rock animation. Default: 0.2.\n * @param height - Optional explicit height (in pixels) for the outer wrapper. If omitted,\n * the wrapper will fill available height (\"100%\").\n * @param className - Optional CSS class to apply to the outer wrapper.\n *\n * Forwarded ref (ViewerRef)\n * The component forwards a ref exposing the following async methods:\n * - highlight(domainId: number): Promise<void>\n * Focuses/highlights a domain in the first protein using its choppingData.\n * No-op if plugin or choppingData is not available.\n * - reset(): Promise<void>\n * Resets the plugin's view to its default/original pose.\n * - updateSuperposition(proteinIndex: number, translation?, rotation?): Promise<void>\n * Updates the transform for a loaded structure (protein) without reloading the\n * entire scene. `translation` is an optional [x, y, z] tuple. `rotation` is an\n * optional 3x3 matrix represented as [[r11,r12,r13],[r21,r22,r23],[r31,r32,r33]].\n * This method relies on the Mol* plugin API to update transforms in-place.\n *\n * Behavior & Side Effects\n * - While the component is initializing the plugin and loading data, it renders a\n * LoaderView. If initialization fails, it renders an ErrorView.\n * - When `spin` or `rock` props change (and the component is in \"success\" state),\n * the corresponding plugin animation is enabled with the provided speed. Passing\n * neither results in animations being turned off.\n * - When `bgColor` changes (and the component is in \"success\" state), the plugin's\n * background color is updated.\n * - The container element receives a stable id (useId) and CSS class \"react-molstar\",\n * plus \"no-controls\" when `initialUI === \"minimal\"`. The visualization container's\n * opacity animates between loading/success states.\n *\n * Example\n * const ref = useRef<ViewerRef | null>(null);\n * <Viewer\n * ref={ref}\n * proteins={myProteins}\n * initialUI=\"standard\"\n * bgColor=\"#000\"\n * />\n * // later\n * await ref.current?.highlight(3);\n * await ref.current?.updateSuperposition(1, [10,0,0], [[1,0,0],[0,1,0],[0,0,1]]);\n *\n * See also\n * - Manager: plugin lifecycle management used to acquire/release plugin instances.\n * - createMVS: helper to convert raw protein input into an MVS representation accepted\n * by the plugin.\n */\nconst Viewer = forwardRef<ViewerRef, Props>(function Viewer(\n {\n proteins,\n mvs,\n modelSourceUrls,\n initialUI = \"standard\",\n bgColor = \"#ffffff\",\n spin = false,\n spinSpeed = 0.05,\n rock = false,\n rockSpeed = 0.2,\n height,\n className,\n }: Props,\n ref\n) {\n const containerRef = useRef<HTMLDivElement>(null);\n const pluginRef = useRef<P | null>(null);\n const proteinsRef = useRef<Props[\"proteins\"]>(proteins);\n const [state, setState] = useState<ViewerState>(\"loading\");\n const id = useId();\n\n // Update proteins ref when proteins prop changes\n useEffect(() => {\n proteinsRef.current = proteins;\n }, [proteins]);\n\n // Expose API methods via ref\n useImperativeHandle(\n ref,\n () => ({\n highlight: async (proteinIndex: number, label: string) => {\n if (\n !pluginRef.current ||\n proteinsRef.current === undefined ||\n proteinsRef.current.length <= proteinIndex\n ) {\n return;\n }\n\n const domain = proteinsRef.current[proteinIndex]?.chopping?.find(\n (d) => d.label === label\n );\n const start = domain?.ranges[0]?.start;\n const end = domain?.ranges[0]?.end;\n\n if (start !== undefined && end !== undefined) {\n await pluginRef.current.focusOnDomain(start, end);\n }\n },\n reset: async () => {\n if (!pluginRef.current) {\n return;\n }\n await pluginRef.current.resetView();\n },\n updateSuperposition: async (\n proteinIndex: number,\n translation?: [number, number, number],\n rotation?: [\n [number, number, number],\n [number, number, number],\n [number, number, number],\n ]\n ) => {\n if (!pluginRef.current) {\n return;\n }\n\n // Use Mol* API directly to update the transform without reloading\n await pluginRef.current.updateStructureTransform(\n proteinIndex,\n translation,\n rotation\n );\n },\n }),\n []\n );\n\n useEffect(() => {\n return () => {\n pluginRef.current = null;\n };\n }, []);\n\n useEffect(() => {\n if (!containerRef.current) {\n return;\n }\n\n if (\n (proteins !== undefined && mvs !== undefined) ||\n (proteins === undefined && mvs === undefined)\n ) {\n throw new Error(\n \"Either `proteins` or `mvs` must be provided, but not both.\"\n );\n }\n\n setState(\"loading\");\n\n let ref: P | undefined;\n\n async function init() {\n const manager = Manager.getInstance();\n\n const el = containerRef.current;\n if (!el) {\n return;\n }\n\n let pl = manager.getPlugin(el);\n if (!pl) {\n pl = await manager.initPlugin(el, initialUI);\n }\n ref = pl;\n pluginRef.current = pl;\n\n try {\n // ensure proteins is defined when mvs is undefined\n if (mvs === undefined && proteins === undefined) {\n throw new Error(\n \"Either `proteins` or `mvs` must be provided, but not both.\"\n );\n }\n\n const proteinsVal = proteins;\n if (mvs === undefined && proteinsVal === undefined) {\n // defensive check, should not happen because of earlier validation\n throw new Error(\"Missing proteins data\");\n }\n\n const proteinsArg = proteinsVal as unknown as Parameters<\n typeof createMVS\n >[0];\n const mvsData =\n mvs ?? createMVS(proteinsArg, modelSourceUrls ?? {}, pl);\n await pl.loadMvs(mvsData);\n } catch (e) {\n // biome-ignore lint/suspicious/noConsole: intentional runtime error logging for viewer init\n console.error(e);\n setState(\"error\");\n return;\n }\n\n setState(\"success\");\n }\n\n init();\n\n return () => {\n if (ref !== undefined) {\n Manager.getInstance().releasePlugin(ref);\n }\n };\n }, [proteins, mvs, modelSourceUrls, initialUI]);\n\n useEffect(() => {\n if (state !== \"success\" || !pluginRef.current) {\n return;\n }\n\n if (spin) {\n pluginRef.current.setAnimation(\"spin\", spinSpeed);\n } else if (rock) {\n pluginRef.current.setAnimation(\"rock\", rockSpeed);\n } else {\n pluginRef.current.setAnimation(\"off\");\n }\n }, [state, spin, rock, spinSpeed, rockSpeed]);\n\n useEffect(() => {\n if (state !== \"success\" || !pluginRef.current) {\n return;\n }\n\n if (bgColor) {\n pluginRef.current.setBackgroundColor(bgColor);\n }\n }, [state, bgColor]);\n\n const styles: CSSProperties = {\n height: height ? `${height}px` : \"100%\",\n position: \"relative\",\n };\n const containerClasses = `react-molstar${initialUI === \"minimal\" ? \" no-controls\" : \"\"}`;\n\n return (\n <div className={className} style={styles}>\n <div\n ref={containerRef}\n id={id}\n className={containerClasses}\n style={{\n opacity: state === \"success\" ? 1 : 0.7,\n transition: \"opacity 0.3s ease-in-out\",\n }}\n />\n\n {state === \"loading\" && <LoaderView />}\n\n {state === \"error\" && <ErrorView />}\n </div>\n );\n});\n\nexport default Viewer;\n"],"names":["jsxRuntimeModule","require$$0","require$$1","jsx","jsxs","DefaultPluginUISpec","createPluginUI","renderReact18","PluginSpec","MolViewSpec","loadMVSData","color","Color","PluginStateObject","Script","StructureSelection","StructureElement","transforms","StateTransforms","Mat4","Vec3","opacity","createMVSBuilder","forwardRef","Viewer","useRef","useState","useId","useEffect","useImperativeHandle","ref"],"mappings":"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","x_google_ignoreList":[0,1,2]}
1
+ {"version":3,"file":"index.cjs.js","sources":["../node_modules/react/cjs/react-jsx-runtime.production.js","../node_modules/react/cjs/react-jsx-runtime.development.js","../node_modules/react/jsx-runtime.js","../lib/react/LoaderView.tsx","../lib/react/ErrorView.tsx","../lib/core/Plugin.ts","../lib/core/Manager.ts","../lib/core/tree/chopping.ts","../lib/core/tree/colors.ts","../lib/core/tree/selectors.ts","../lib/core/tree/rendering.ts","../lib/core/tree/create-mvs.ts","../lib/react/Viewer.tsx"],"sourcesContent":["/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function getComponentNameFromType(type) {\n if (null == type) return null;\n if (\"function\" === typeof type)\n return type.$$typeof === REACT_CLIENT_REFERENCE\n ? null\n : type.displayName || type.name || null;\n if (\"string\" === typeof type) return type;\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return \"Fragment\";\n case REACT_PROFILER_TYPE:\n return \"Profiler\";\n case REACT_STRICT_MODE_TYPE:\n return \"StrictMode\";\n case REACT_SUSPENSE_TYPE:\n return \"Suspense\";\n case REACT_SUSPENSE_LIST_TYPE:\n return \"SuspenseList\";\n case REACT_ACTIVITY_TYPE:\n return \"Activity\";\n }\n if (\"object\" === typeof type)\n switch (\n (\"number\" === typeof type.tag &&\n console.error(\n \"Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.\"\n ),\n type.$$typeof)\n ) {\n case REACT_PORTAL_TYPE:\n return \"Portal\";\n case REACT_CONTEXT_TYPE:\n return type.displayName || \"Context\";\n case REACT_CONSUMER_TYPE:\n return (type._context.displayName || \"Context\") + \".Consumer\";\n case REACT_FORWARD_REF_TYPE:\n var innerType = type.render;\n type = type.displayName;\n type ||\n ((type = innerType.displayName || innerType.name || \"\"),\n (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n return type;\n case REACT_MEMO_TYPE:\n return (\n (innerType = type.displayName || null),\n null !== innerType\n ? innerType\n : getComponentNameFromType(type.type) || \"Memo\"\n );\n case REACT_LAZY_TYPE:\n innerType = type._payload;\n type = type._init;\n try {\n return getComponentNameFromType(type(innerType));\n } catch (x) {}\n }\n return null;\n }\n function testStringCoercion(value) {\n return \"\" + value;\n }\n function checkKeyStringCoercion(value) {\n try {\n testStringCoercion(value);\n var JSCompiler_inline_result = !1;\n } catch (e) {\n JSCompiler_inline_result = !0;\n }\n if (JSCompiler_inline_result) {\n JSCompiler_inline_result = console;\n var JSCompiler_temp_const = JSCompiler_inline_result.error;\n var JSCompiler_inline_result$jscomp$0 =\n (\"function\" === typeof Symbol &&\n Symbol.toStringTag &&\n value[Symbol.toStringTag]) ||\n value.constructor.name ||\n \"Object\";\n JSCompiler_temp_const.call(\n JSCompiler_inline_result,\n \"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.\",\n JSCompiler_inline_result$jscomp$0\n );\n return testStringCoercion(value);\n }\n }\n function getTaskName(type) {\n if (type === REACT_FRAGMENT_TYPE) return \"<>\";\n if (\n \"object\" === typeof type &&\n null !== type &&\n type.$$typeof === REACT_LAZY_TYPE\n )\n return \"<...>\";\n try {\n var name = getComponentNameFromType(type);\n return name ? \"<\" + name + \">\" : \"<...>\";\n } catch (x) {\n return \"<...>\";\n }\n }\n function getOwner() {\n var dispatcher = ReactSharedInternals.A;\n return null === dispatcher ? null : dispatcher.getOwner();\n }\n function UnknownOwner() {\n return Error(\"react-stack-top-frame\");\n }\n function hasValidKey(config) {\n if (hasOwnProperty.call(config, \"key\")) {\n var getter = Object.getOwnPropertyDescriptor(config, \"key\").get;\n if (getter && getter.isReactWarning) return !1;\n }\n return void 0 !== config.key;\n }\n function defineKeyPropWarningGetter(props, displayName) {\n function warnAboutAccessingKey() {\n specialPropKeyWarningShown ||\n ((specialPropKeyWarningShown = !0),\n console.error(\n \"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)\",\n displayName\n ));\n }\n warnAboutAccessingKey.isReactWarning = !0;\n Object.defineProperty(props, \"key\", {\n get: warnAboutAccessingKey,\n configurable: !0\n });\n }\n function elementRefGetterWithDeprecationWarning() {\n var componentName = getComponentNameFromType(this.type);\n didWarnAboutElementRef[componentName] ||\n ((didWarnAboutElementRef[componentName] = !0),\n console.error(\n \"Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.\"\n ));\n componentName = this.props.ref;\n return void 0 !== componentName ? componentName : null;\n }\n function ReactElement(type, key, props, owner, debugStack, debugTask) {\n var refProp = props.ref;\n type = {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n props: props,\n _owner: owner\n };\n null !== (void 0 !== refProp ? refProp : null)\n ? Object.defineProperty(type, \"ref\", {\n enumerable: !1,\n get: elementRefGetterWithDeprecationWarning\n })\n : Object.defineProperty(type, \"ref\", { enumerable: !1, value: null });\n type._store = {};\n Object.defineProperty(type._store, \"validated\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: 0\n });\n Object.defineProperty(type, \"_debugInfo\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: null\n });\n Object.defineProperty(type, \"_debugStack\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugStack\n });\n Object.defineProperty(type, \"_debugTask\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugTask\n });\n Object.freeze && (Object.freeze(type.props), Object.freeze(type));\n return type;\n }\n function jsxDEVImpl(\n type,\n config,\n maybeKey,\n isStaticChildren,\n debugStack,\n debugTask\n ) {\n var children = config.children;\n if (void 0 !== children)\n if (isStaticChildren)\n if (isArrayImpl(children)) {\n for (\n isStaticChildren = 0;\n isStaticChildren < children.length;\n isStaticChildren++\n )\n validateChildKeys(children[isStaticChildren]);\n Object.freeze && Object.freeze(children);\n } else\n console.error(\n \"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\"\n );\n else validateChildKeys(children);\n if (hasOwnProperty.call(config, \"key\")) {\n children = getComponentNameFromType(type);\n var keys = Object.keys(config).filter(function (k) {\n return \"key\" !== k;\n });\n isStaticChildren =\n 0 < keys.length\n ? \"{key: someKey, \" + keys.join(\": ..., \") + \": ...}\"\n : \"{key: someKey}\";\n didWarnAboutKeySpread[children + isStaticChildren] ||\n ((keys =\n 0 < keys.length ? \"{\" + keys.join(\": ..., \") + \": ...}\" : \"{}\"),\n console.error(\n 'A props object containing a \"key\" prop is being spread into JSX:\\n let props = %s;\\n <%s {...props} />\\nReact keys must be passed directly to JSX without using spread:\\n let props = %s;\\n <%s key={someKey} {...props} />',\n isStaticChildren,\n children,\n keys,\n children\n ),\n (didWarnAboutKeySpread[children + isStaticChildren] = !0));\n }\n children = null;\n void 0 !== maybeKey &&\n (checkKeyStringCoercion(maybeKey), (children = \"\" + maybeKey));\n hasValidKey(config) &&\n (checkKeyStringCoercion(config.key), (children = \"\" + config.key));\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n children &&\n defineKeyPropWarningGetter(\n maybeKey,\n \"function\" === typeof type\n ? type.displayName || type.name || \"Unknown\"\n : type\n );\n return ReactElement(\n type,\n children,\n maybeKey,\n getOwner(),\n debugStack,\n debugTask\n );\n }\n function validateChildKeys(node) {\n isValidElement(node)\n ? node._store && (node._store.validated = 1)\n : \"object\" === typeof node &&\n null !== node &&\n node.$$typeof === REACT_LAZY_TYPE &&\n (\"fulfilled\" === node._payload.status\n ? isValidElement(node._payload.value) &&\n node._payload.value._store &&\n (node._payload.value._store.validated = 1)\n : node._store && (node._store.validated = 1));\n }\n function isValidElement(object) {\n return (\n \"object\" === typeof object &&\n null !== object &&\n object.$$typeof === REACT_ELEMENT_TYPE\n );\n }\n var React = require(\"react\"),\n REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\"),\n ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n hasOwnProperty = Object.prototype.hasOwnProperty,\n isArrayImpl = Array.isArray,\n createTask = console.createTask\n ? console.createTask\n : function () {\n return null;\n };\n React = {\n react_stack_bottom_frame: function (callStackForError) {\n return callStackForError();\n }\n };\n var specialPropKeyWarningShown;\n var didWarnAboutElementRef = {};\n var unknownOwnerDebugStack = React.react_stack_bottom_frame.bind(\n React,\n UnknownOwner\n )();\n var unknownOwnerDebugTask = createTask(getTaskName(UnknownOwner));\n var didWarnAboutKeySpread = {};\n exports.Fragment = REACT_FRAGMENT_TYPE;\n exports.jsx = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !1,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n exports.jsxs = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !0,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","export default function LoaderView() {\n return (\n <div\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n width: \"100%\",\n height: \"100%\",\n backdropFilter: \"blur(5px)\",\n backgroundColor: \"#0000000A\",\n }}\n >\n <div\n style={{\n position: \"absolute\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: \"1rem\",\n }}\n >\n <div\n style={{\n width: \"48px\",\n height: \"48px\",\n border: \"6px solid #e5e7eb\",\n borderTopColor: \"#3b82f6\",\n borderRadius: \"50%\",\n animation: \"spin 0.8s linear infinite\",\n }}\n />\n <p\n style={{\n margin: 0,\n fontSize: \"0.875rem\",\n color: \"#6b7280\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n }}\n >\n Loading...\n </p>\n <style>\n {`\n @keyframes spin {\n to {\n transform: rotate(360deg);\n }\n }\n `}\n </style>\n </div>\n </div>\n );\n}\n","export default function ErrorView() {\n return (\n <div\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n width: \"100%\",\n height: \"100%\",\n backdropFilter: \"blur(5px)\",\n backgroundColor: \"#0000000A\",\n }}\n >\n <div\n style={{\n position: \"absolute\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: \"0.75rem\",\n padding: \"1.5rem\",\n }}\n >\n <div\n style={{\n width: \"48px\",\n height: \"48px\",\n borderRadius: \"50%\",\n backgroundColor: \"#fef2f2\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"#ef4444\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-label=\"Error icon\"\n >\n <title>Error</title>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\" />\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\" />\n </svg>\n </div>\n <div style={{ textAlign: \"center\" }}>\n <p\n style={{\n margin: 0,\n fontSize: \"0.875rem\",\n fontWeight: 600,\n color: \"#1f2937\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n }}\n >\n Error loading viewer\n </p>\n <p\n style={{\n margin: \"0.25rem 0 0 0\",\n fontSize: \"0.75rem\",\n color: \"#6b7280\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n }}\n >\n Please try refreshing the page\n </p>\n </div>\n </div>\n </div>\n );\n}\n","import { loadMVSData } from \"molstar/lib/extensions/mvs/components/formats\";\nimport type { MVSData } from \"molstar/lib/extensions/mvs/mvs-data.d.ts\";\nimport type { ColorHEX, Matrix3D, Vector3D } from \"./types\";\nimport { Color } from \"molstar/lib/mol-util/color\";\n\nimport { createPluginUI } from \"molstar/lib/mol-plugin-ui\";\nimport { renderReact18 } from \"molstar/lib/mol-plugin-ui/react18\";\nimport { PluginSpec } from \"molstar/lib/mol-plugin/spec\";\nimport { MolViewSpec } from \"molstar/lib/extensions/mvs/behavior\";\nimport { DefaultPluginUISpec } from \"molstar/lib/mol-plugin-ui/spec\";\nimport type { InitialUI } from \"./types\";\nimport type { PluginUIContext } from \"molstar/lib/mol-plugin-ui/context\";\nimport { Mat4, Vec3 } from \"molstar/lib/mol-math/linear-algebra\";\nimport { PluginStateObject } from \"molstar/lib/mol-plugin-state/objects\";\nimport { Script } from \"molstar/lib/mol-script/script\";\nimport {\n StructureElement,\n StructureSelection,\n} from \"molstar/lib/mol-model/structure\";\nimport { StateTransforms } from \"molstar/lib/mol-plugin-state/transforms\";\n\nclass Plugin {\n private plugin: PluginUIContext;\n private objectUrls: Set<string>;\n private labelsVisible: boolean = true;\n private storedLabels: Array<{\n parentRef: string;\n transform: any;\n }> = [];\n\n constructor(plugin: PluginUIContext) {\n this.plugin = plugin;\n this.objectUrls = new Set();\n }\n\n /**\n * Create a Plugin by instantiating the underlying PluginUI.\n * We use a static async factory because constructors cannot be async.\n */\n static async create(\n container: HTMLElement,\n initialUI: InitialUI\n ): Promise<Plugin> {\n const defaultSpec = DefaultPluginUISpec();\n\n if (!container.querySelector(\".msp-plugin\")) {\n container.innerHTML = \"\";\n }\n\n const plugin = await createPluginUI({\n target: container,\n render: renderReact18,\n spec: {\n actions: defaultSpec.actions ?? [],\n behaviors: [\n ...(initialUI !== \"minimal\" ? defaultSpec.behaviors : []),\n PluginSpec.Behavior(MolViewSpec),\n ],\n animations: [...(defaultSpec.animations || [])],\n layout: {\n initial: {\n showControls: initialUI === \"expanded\",\n controlsDisplay: \"reactive\",\n // isExpanded: false,\n },\n },\n components: {\n ...defaultSpec.components,\n },\n canvas3d: {\n ...defaultSpec.canvas3d,\n camera: {\n ...defaultSpec.canvas3d?.camera,\n helper: {\n axes:\n initialUI === \"minimal\"\n ? {\n name: \"off\",\n params: {},\n }\n : defaultSpec.canvas3d?.camera?.helper?.axes,\n },\n },\n },\n },\n });\n\n return new Plugin(plugin);\n }\n\n dispose() {\n this.plugin.dispose();\n this.cleanupObjectUrls();\n }\n\n cleanupObjectUrls() {\n for (const url of this.objectUrls) {\n try {\n URL.revokeObjectURL(url);\n } catch (_e) {\n // ignore\n }\n\n this.objectUrls.delete(url);\n }\n }\n\n createObjectUrlFromFile(file: File): string {\n const url = URL.createObjectURL(file);\n this.objectUrls.add(url);\n return url;\n }\n\n clear() {\n this.plugin.clear();\n }\n\n async loadMvs(mvs: MVSData) {\n return await loadMVSData(this.plugin, mvs, \"mvsj\");\n }\n\n setBackgroundColor(color: ColorHEX) {\n const hexString = color.replace(\"#\", \"0x\");\n\n this.plugin.canvas3d?.setProps({\n renderer: { backgroundColor: Color.fromHexString(hexString) },\n });\n }\n\n /**\n * Set the visibility of labels by removing or adding them to the state tree.\n * This approach is more reliable than trying to modify the isHidden property.\n */\n async setLabelsVisibility(visible: boolean) {\n // If visibility state is already what we want, do nothing\n if (this.labelsVisible === visible) {\n return;\n }\n\n try {\n const state = this.plugin.state.data;\n\n if (visible) {\n // When turning labels on, re-add them from stored data\n if (this.storedLabels.length > 0) {\n const update = state.build();\n\n for (const storedLabel of this.storedLabels) {\n // Find the parent cell\n const parentCell = state.cells.get(storedLabel.parentRef);\n if (!parentCell) continue;\n\n // Re-apply the stored transform to re-create the label\n update\n .to(storedLabel.parentRef)\n .apply(\n storedLabel.transform.transformer,\n storedLabel.transform.params\n );\n }\n\n await this.plugin.runTask(state.updateTree(update));\n }\n\n this.labelsVisible = true;\n } else {\n // When turning labels off, remove all label nodes from the state tree\n const allObjects = state.selectQ((q) => q.root.subtree());\n\n // Filter for objects that are labels - only check for \"MVS Custom Label\"\n const labels = allObjects.filter((cell) => {\n // Check if the cell has an object\n if (!cell.obj) return false;\n\n // Get label and description\n const label = cell.obj.label || \"\";\n const description = cell.obj.description || \"\";\n\n // Only check for \"MVS Custom Label\"\n return (\n label === \"MVS Custom Label\" || description === \"MVS Custom Label\"\n );\n });\n\n // Store label data before removing\n this.storedLabels = [];\n\n // Remove each label from the state tree\n if (labels.length > 0) {\n const update = state.build();\n\n for (const labelCell of labels) {\n // Get the parent ref (the component this label is attached to)\n const parentRef = labelCell.transform.parent;\n\n // Store the complete transform data for re-adding later\n this.storedLabels.push({\n parentRef,\n transform: {\n transformer: labelCell.transform.transformer,\n params: labelCell.transform.params,\n },\n });\n\n update.delete(labelCell.transform.ref);\n }\n\n await this.plugin.runTask(state.updateTree(update));\n }\n\n this.labelsVisible = false;\n }\n } catch (e) {\n console.error(\"Error setting label visibility:\", e);\n }\n }\n\n setAnimation(type: \"spin\" | \"rock\" | \"off\", speed?: number) {\n if (type === \"off\") {\n this.plugin.canvas3d?.setProps({\n trackball: {\n animate: {\n name: \"off\",\n params: {},\n },\n },\n });\n\n return;\n }\n\n const animationParams =\n type === \"spin\"\n ? {\n speed: speed ?? 0.05,\n }\n : {\n speed: speed ?? 0.2,\n angle: 10,\n };\n\n this.plugin.canvas3d?.setProps({\n trackball: {\n animate: {\n name: type,\n params: animationParams,\n },\n },\n });\n }\n\n async focusOnDomain(\n domainStart: number,\n domainEnd: number,\n proteinIndex: number = 0\n ) {\n const state = this.plugin.state.data;\n\n // Find all structure cells in the state tree\n const structures = state.selectQ((q) =>\n q.rootsOfType(PluginStateObject.Molecule.Structure)\n );\n\n if (structures.length === 0 || proteinIndex >= structures.length) {\n return;\n }\n\n // Use the specified structure for focusing\n const structureCell = structures[proteinIndex];\n if (!structureCell?.obj) {\n return;\n }\n\n const structureData = structureCell.obj.data;\n\n // Build a selection query for the residue range\n const selection = Script.getStructureSelection(\n (Q) =>\n Q.struct.generator.atomGroups({\n \"residue-test\": Q.core.rel.inRange([\n Q.struct.atomProperty.macromolecular.auth_seq_id(),\n domainStart,\n domainEnd,\n ]),\n }),\n structureData\n );\n\n const loci = StructureSelection.toLociWithSourceUnits(selection);\n\n // Focus camera on the loci\n if (!StructureElement.Loci.isEmpty(loci)) {\n await this.plugin.managers.camera.focusLoci(loci);\n }\n }\n\n async resetView() {\n // Reset camera to show all structures\n await this.plugin.managers.camera.reset();\n }\n\n async updateStructureTransform(\n structureIndex: number,\n translation?: Vector3D,\n rotation?: Matrix3D\n ) {\n const state = this.plugin.state.data;\n\n // Find all structure cells in the state tree\n const structures = state.selectQ((q) =>\n q.rootsOfType(PluginStateObject.Molecule.Structure)\n );\n\n if (structureIndex >= structures.length) {\n return;\n }\n\n const targetStructure = structures[structureIndex];\n if (!targetStructure) {\n return;\n }\n\n // Find transform nodes in the structure's subtree\n const allCells = state.selectQ((q) => q.root.subtree());\n const transforms = allCells.filter(\n (cell) =>\n cell.transform.transformer ===\n StateTransforms.Model.TransformStructureConformation\n );\n\n // Match transform by structure index (assumes structures and transforms are in same order)\n const targetTransform = transforms[structureIndex];\n\n if (targetTransform) {\n // Create the transformation matrix\n const matrix = Mat4.identity();\n\n // Apply rotation if provided\n if (rotation) {\n // Set rotation part of the matrix (top-left 3x3)\n Mat4.setValue(matrix, 0, 0, rotation[0][0]);\n Mat4.setValue(matrix, 0, 1, rotation[0][1]);\n Mat4.setValue(matrix, 0, 2, rotation[0][2]);\n Mat4.setValue(matrix, 1, 0, rotation[1][0]);\n Mat4.setValue(matrix, 1, 1, rotation[1][1]);\n Mat4.setValue(matrix, 1, 2, rotation[1][2]);\n Mat4.setValue(matrix, 2, 0, rotation[2][0]);\n Mat4.setValue(matrix, 2, 1, rotation[2][1]);\n Mat4.setValue(matrix, 2, 2, rotation[2][2]);\n }\n\n // Apply translation if provided\n if (translation) {\n Mat4.setTranslation(\n matrix,\n Vec3.create(translation[0], translation[1], translation[2])\n );\n }\n\n // Update the transform with new rotation and translation\n const update = state\n .build()\n .to(targetTransform.transform.ref)\n .update(\n StateTransforms.Model.TransformStructureConformation,\n (old) => ({\n ...old,\n transform: {\n name: \"matrix\" as const,\n params: {\n data: matrix,\n transpose: false,\n },\n },\n })\n );\n\n await this.plugin.runTask(state.updateTree(update));\n }\n }\n\n getPluginContext() {\n return this.plugin;\n }\n}\n\nexport { Plugin };\n","import { Plugin } from \"./Plugin\";\nimport type { InitialUI } from \"./types\";\n\nconst PLUGIN_GC_TIMEOUT = 30 * 1000; // 30 seconds\n\nclass Manager {\n private static instance: Manager;\n\n private initializatingContainers: Set<HTMLElement>;\n private plugins: Map<HTMLElement, Plugin>;\n private refCount: Map<Plugin, [number, number]>; // [count, lastUsedTimestamp]\n private timer: number | undefined;\n\n private constructor() {\n this.initializatingContainers = new Set();\n this.plugins = new Map();\n this.refCount = new Map();\n this.timer = undefined;\n\n this.initGC();\n }\n\n public static getInstance(): Manager {\n if (!Manager.instance) {\n Manager.instance = new Manager();\n }\n\n return Manager.instance;\n }\n\n cleanup() {\n clearInterval(this.timer);\n }\n\n private initGC() {\n this.timer = setInterval(() => {\n const now = Date.now();\n\n for (const [plugin, lastActive] of this.refCount) {\n if (lastActive[0] === 0 && now - lastActive[1] > PLUGIN_GC_TIMEOUT) {\n plugin.dispose();\n }\n }\n }, 20 * 1000); // Run every 20 seconds\n }\n\n async initPlugin(\n container: HTMLElement,\n initialUI: InitialUI\n ): Promise<Plugin> {\n if (this.plugins.has(container)) {\n // biome-ignore lint/style/noNonNullAssertion: Safe because of has() check\n return this.plugins.get(container)!;\n }\n\n if (container.querySelector(\".msp-plugin\")) {\n for (const [containerElem, plugin] of this.plugins) {\n if (containerElem.contains(container)) {\n return plugin;\n }\n }\n }\n\n if (this.initializatingContainers.has(container)) {\n while (this.initializatingContainers.has(container)) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n\n const plugin = this.plugins.get(container);\n if (!plugin) {\n throw new Error(\"Viewer initialization failed\");\n }\n\n return plugin;\n }\n\n try {\n this.initializatingContainers.add(container);\n\n if (!container.querySelector(\".msp-plugin\")) {\n container.innerHTML = \"\";\n }\n\n const instance = await Plugin.create(container, initialUI);\n this.refCount.set(instance, [1, Date.now()]);\n\n this.plugins.set(container, instance);\n return instance;\n } finally {\n this.initializatingContainers.delete(container);\n }\n }\n\n getPlugin(container: HTMLElement): Plugin | undefined {\n const plugin = this.plugins.get(container);\n\n if (plugin) {\n const ref = this.refCount.get(plugin);\n if (ref) {\n ref[0]++;\n ref[1] = Date.now();\n }\n }\n\n return plugin;\n }\n\n releasePlugin(plugin: Plugin) {\n const ref = this.refCount.get(plugin);\n if (!ref) {\n throw new Error(\"Trying to release a plugin that is not managed\");\n }\n\n ref[0] = Math.max(0, ref[0] - 1);\n ref[1] = Date.now();\n }\n\n disposePlugin(container: HTMLElement) {\n const plugin = this.plugins.get(container);\n\n if (plugin) {\n plugin.dispose();\n this.plugins.delete(container);\n container.innerHTML = \"\";\n }\n }\n}\n\nexport { Manager };\n","import type { Protein } from \"../types\";\n\ntype NormalizedChoppingEntry = {\n label: string;\n showLabel: boolean;\n ranges: { start: number; end: number }[];\n};\n\nfunction normalizeChoppingData(\n chopping?: Protein[\"chopping\"]\n): NormalizedChoppingEntry[] {\n if (!chopping) {\n return [];\n }\n\n return chopping\n .map((entry) => ({\n label: entry.label,\n showLabel: entry.showLabel ?? true,\n ranges: entry.ranges\n .map((range) => ({\n start: Math.min(range.start, range.end),\n end: Math.max(range.start, range.end),\n }))\n .filter(\n (range) => Number.isFinite(range.start) && Number.isFinite(range.end)\n ),\n }))\n .filter((entry) => entry.ranges.length > 0);\n}\n\nexport type { NormalizedChoppingEntry };\nexport { normalizeChoppingData };\n","import type { ColorHEX } from \"../types\";\nimport type {\n ComponentExpressionT,\n ComponentSelectorT,\n} from \"molstar/lib/extensions/mvs/tree/mvs/param-types\";\n\ntype RGB = [number, number, number];\ntype ShadeMode = \"lighten\" | \"darken\" | \"base\";\n\nconst SHADE_STEPS: { mode: ShadeMode; factor: number }[] = [\n { mode: \"lighten\", factor: 0.5 },\n { mode: \"lighten\", factor: 0.25 },\n { mode: \"base\", factor: 0 },\n { mode: \"darken\", factor: 0.1 },\n { mode: \"darken\", factor: 0.25 },\n { mode: \"darken\", factor: 0.4 },\n];\n\nconst BASE_COLOR_YELLOW: ColorHEX = \"#FD9D0D\";\nconst BASE_COLOR_BLUE: ColorHEX = \"#0D6EFD\";\nconst BASE_COLOR_GREY: ColorHEX = \"#F0F0F0\";\nconst MULTI_DOMAIN_COLORS: ColorHEX[] = [\n \"#4e79a7\",\n \"#f28e2c\",\n \"#e15759\",\n \"#76b7b2\",\n \"#59a14f\",\n \"#edc949\",\n \"#af7aa1\",\n \"#ff9da7\",\n \"#9c755f\",\n \"#bab0ac\",\n] as ColorHEX[];\nconst MULTI_PROTEIN_OPACITY_MAX = 0.5;\nconst MULTI_PROTEIN_OPACITY_MIN = 0.1;\nconst ALPHAFOLD_CONFIDENCE_COLORS = {\n veryHigh: \"#0053D6\" as ColorHEX,\n confident: \"#65CBF3\" as ColorHEX,\n low: \"#FFDB13\" as ColorHEX,\n veryLow: \"#FF7D45\" as ColorHEX,\n};\n\nfunction normalizeHexColor(hex: ColorHEX): ColorHEX {\n const trimmed = hex.trim();\n const withoutHash = trimmed.startsWith(\"#\") ? trimmed.slice(1) : trimmed;\n if (withoutHash.length !== 3 && withoutHash.length !== 6) {\n throw new Error(\"Only 3 or 6 digit hex colors are supported\");\n }\n\n if (!/^[0-9A-Fa-f]+$/.test(withoutHash)) {\n throw new Error(\"Invalid hex color value\");\n }\n\n const expanded =\n withoutHash.length === 3\n ? withoutHash\n .split(\"\")\n .map((char) => char + char)\n .join(\"\")\n : withoutHash;\n\n return `#${expanded.toUpperCase()}` as ColorHEX;\n}\n\nfunction hexToRgb(hex: ColorHEX): RGB {\n const normalized = normalizeHexColor(hex);\n return [\n parseInt(normalized.slice(1, 3), 16),\n parseInt(normalized.slice(3, 5), 16),\n parseInt(normalized.slice(5, 7), 16),\n ];\n}\n\nfunction rgbToHex([r, g, b]: RGB): ColorHEX {\n const channelToHex = (channel: number) =>\n channel.toString(16).padStart(2, \"0\");\n return `#${channelToHex(r)}${channelToHex(g)}${channelToHex(b)}`.toUpperCase() as ColorHEX;\n}\n\nfunction mixChannel(value: number, target: number, factor: number) {\n return Math.round(value + (target - value) * factor);\n}\n\nfunction lightenColor([r, g, b]: RGB, factor: number): RGB {\n return [\n mixChannel(r, 255, factor),\n mixChannel(g, 255, factor),\n mixChannel(b, 255, factor),\n ];\n}\n\nfunction darkenColor([r, g, b]: RGB, factor: number): RGB {\n return [\n mixChannel(r, 0, factor),\n mixChannel(g, 0, factor),\n mixChannel(b, 0, factor),\n ];\n}\n\nfunction makeShades(color: ColorHEX, count: number): ColorHEX[] {\n if (count < 1) {\n throw new Error(\"Count must be at least 1\");\n }\n\n const baseColor = hexToRgb(color);\n const palette = SHADE_STEPS.map((step) => {\n if (step.mode === \"lighten\") {\n return rgbToHex(lightenColor(baseColor, step.factor));\n }\n\n if (step.mode === \"darken\") {\n return rgbToHex(darkenColor(baseColor, step.factor));\n }\n\n return rgbToHex(baseColor);\n });\n\n const shades: ColorHEX[] = [];\n for (let i = 0; i < count; i++) {\n shades.push(palette[i % palette.length]!);\n }\n\n return shades;\n}\n\nfunction getBaseColor(colors: ColorHEX[], index: number): ColorHEX {\n return colors[index] ?? BASE_COLOR_GREY;\n}\n\nfunction getOpacityForProtein(\n index: number,\n totalProteins: number\n): number | undefined {\n if (totalProteins < 3 || index === 0) {\n return undefined;\n }\n\n const range = MULTI_PROTEIN_OPACITY_MAX - MULTI_PROTEIN_OPACITY_MIN;\n const step = range / (totalProteins - 1);\n return Math.max(\n MULTI_PROTEIN_OPACITY_MIN,\n MULTI_PROTEIN_OPACITY_MAX - (index - 1) * step\n );\n}\n\nfunction applyFlatColor(\n representation: any,\n color: ColorHEX,\n selector?: ComponentSelectorT | ComponentExpressionT | ComponentExpressionT[]\n) {\n const params: {\n color: ColorHEX;\n selector?:\n | ComponentSelectorT\n | ComponentExpressionT\n | ComponentExpressionT[];\n } = { color };\n\n if (selector) {\n params.selector = selector;\n }\n\n representation.color(params);\n}\n\nfunction applyAlphaFoldConfidenceColor(\n struct: any,\n component: any,\n representation: any\n) {\n representation.colorFromSource({\n schema: \"all_atomic\",\n category_name: \"atom_site\",\n field_name: \"B_iso_or_equiv\",\n palette: {\n kind: \"discrete\",\n mode: \"absolute\",\n colors: [\n [ALPHAFOLD_CONFIDENCE_COLORS.veryLow, 0],\n [ALPHAFOLD_CONFIDENCE_COLORS.low, 50],\n [ALPHAFOLD_CONFIDENCE_COLORS.confident, 70],\n [ALPHAFOLD_CONFIDENCE_COLORS.veryHigh, 90],\n ],\n },\n });\n\n component.tooltip({ text: \"pLDDT:\" });\n struct.tooltipFromSource({\n schema: \"all_atomic\",\n category_name: \"atom_site\",\n field_name: \"B_iso_or_equiv\",\n });\n}\n\nfunction inferColors(count: number, domains?: number): ColorHEX[] {\n if (count < 0) {\n throw new Error(\"Count must be non-negative\");\n }\n\n if (count === 0) {\n return [];\n }\n\n if (domains !== undefined) {\n if (domains <= 1) {\n throw new Error(\n \"At least two domains are required to infer domain colors\"\n );\n }\n\n return [\"#FF999C\", \"#C8EAFF\", \"#8D272B\", \"#86AEC6\"];\n }\n\n if (count === 1) {\n return [BASE_COLOR_BLUE];\n }\n\n if (count === 2) {\n return [BASE_COLOR_BLUE, BASE_COLOR_YELLOW];\n }\n\n return [BASE_COLOR_YELLOW, ...Array(count - 1).fill(BASE_COLOR_GREY)];\n}\n\nexport {\n BASE_COLOR_BLUE,\n BASE_COLOR_GREY,\n BASE_COLOR_YELLOW,\n MULTI_DOMAIN_COLORS,\n makeShades,\n getBaseColor,\n getOpacityForProtein,\n applyFlatColor,\n applyAlphaFoldConfidenceColor,\n inferColors,\n};\n","import type { Protein } from \"../types\";\n\nfunction createChainSelector(protein: Protein) {\n if (!protein.chain) {\n return \"all\";\n }\n\n return protein.file\n ? { label_asym_id: protein.chain }\n : { auth_asym_id: protein.chain };\n}\n\nfunction getRepresentationType(protein: Protein, representationType?: string) {\n return representationType ?? protein.representation ?? \"cartoon\";\n}\n\nfunction createRepresentationParams(\n protein: Protein,\n representationType?: string\n) {\n const repType = getRepresentationType(protein, representationType);\n\n if (protein.file) {\n return { size_factor: 1, tubular_helices: false, type: repType };\n }\n\n return { type: repType };\n}\n\nfunction isCartoonLikeRepresentation(repType: string) {\n return repType === \"cartoon\" || repType === \"backbone\";\n}\n\nfunction createDomainSelector(\n protein: Protein,\n seqRange?: { beg_auth_seq_id: number; end_auth_seq_id: number }\n) {\n if (!protein.chain) {\n return seqRange ?? \"all\";\n }\n\n const chainId = protein.file\n ? { label_asym_id: protein.chain }\n : { auth_asym_id: protein.chain };\n\n return seqRange ? { ...chainId, ...seqRange } : chainId;\n}\n\nexport {\n createChainSelector,\n createDomainSelector,\n createRepresentationParams,\n getRepresentationType,\n isCartoonLikeRepresentation,\n};\n","import type { ColorHEX, Protein } from \"../types\";\nimport type { ComponentExpressionT } from \"molstar/lib/extensions/mvs/tree/mvs/param-types\";\nimport {\n applyAlphaFoldConfidenceColor,\n applyFlatColor,\n BASE_COLOR_BLUE,\n BASE_COLOR_GREY,\n BASE_COLOR_YELLOW,\n getBaseColor,\n getOpacityForProtein,\n MULTI_DOMAIN_COLORS,\n} from \"./colors\";\nimport type { NormalizedChoppingEntry } from \"./chopping\";\nimport {\n createChainSelector,\n createDomainSelector,\n createRepresentationParams,\n getRepresentationType,\n isCartoonLikeRepresentation,\n} from \"./selectors\";\n\nconst REST_OPACITY = 0.15;\n\nfunction renderProteinWithoutChopping(\n struct: any,\n protein: Protein,\n proteinIndex: number,\n totalProteins: number,\n colors: ColorHEX[]\n) {\n const selector = createChainSelector(protein);\n const comp = struct.component({ selector });\n const repType = getRepresentationType(protein);\n const repr = comp.representation(\n createRepresentationParams(protein, repType)\n );\n\n if (totalProteins === 1) {\n if (isCartoonLikeRepresentation(repType)) {\n applyAlphaFoldConfidenceColor(struct, comp, repr);\n }\n return;\n }\n\n if (totalProteins >= 3) {\n if (proteinIndex === 0 && isCartoonLikeRepresentation(repType)) {\n applyAlphaFoldConfidenceColor(struct, comp, repr);\n } else {\n const color = getBaseColor(colors, proteinIndex);\n applyFlatColor(repr, color);\n const opacity = getOpacityForProtein(proteinIndex, totalProteins);\n if (opacity !== undefined) {\n repr.opacity({ opacity });\n }\n }\n return;\n }\n\n const color = getBaseColor(colors, proteinIndex);\n applyFlatColor(repr, color);\n\n const opacity = getOpacityForProtein(proteinIndex, totalProteins);\n if (opacity !== undefined && opacity < 1) {\n repr.opacity({ opacity });\n }\n}\n\nfunction renderProteinWithChopping(\n struct: any,\n protein: Protein,\n proteinIndex: number,\n totalProteins: number,\n colors: ColorHEX[],\n choppingEntries: NormalizedChoppingEntry[]\n) {\n if (choppingEntries.length === 0) {\n return;\n }\n\n const selector = createChainSelector(protein);\n const comp = struct.component({ selector });\n const baseRepr = comp.representation(createRepresentationParams(protein));\n\n let backgroundColor: ColorHEX;\n let restOpacity = REST_OPACITY;\n if (totalProteins === 1 && choppingEntries.length >= 2) {\n backgroundColor = BASE_COLOR_GREY;\n restOpacity = 1;\n } else {\n backgroundColor = getBaseColor(colors, proteinIndex);\n }\n\n applyFlatColor(baseRepr, backgroundColor);\n baseRepr.opacity({ opacity: restOpacity });\n\n const useInlineDomainColoring =\n totalProteins === 1 && choppingEntries.length >= 2;\n\n let domainPalette: ColorHEX[];\n\n if (totalProteins === 1 && choppingEntries.length >= 2) {\n domainPalette = choppingEntries.map(\n (_, index) => MULTI_DOMAIN_COLORS[index % MULTI_DOMAIN_COLORS.length]!\n );\n } else if (totalProteins === 2 && choppingEntries.length >= 2) {\n const baseColorForDomains =\n proteinIndex === 0 ? BASE_COLOR_BLUE : BASE_COLOR_YELLOW;\n domainPalette = Array(choppingEntries.length).fill(baseColorForDomains);\n } else if (totalProteins === 2 && choppingEntries.length === 1) {\n domainPalette = [backgroundColor];\n } else {\n domainPalette = Array(choppingEntries.length).fill(BASE_COLOR_BLUE);\n }\n\n if (useInlineDomainColoring) {\n choppingEntries.forEach((entry, entryIndex) => {\n applyDomainColor(baseRepr, protein, entry, domainPalette[entryIndex]!);\n addDomainLabel(struct, protein, entry);\n });\n return;\n }\n\n choppingEntries.forEach((entry, entryIndex) => {\n renderDomainEntry(struct, protein, entry, domainPalette[entryIndex]!);\n });\n}\n\nfunction applyDomainColor(\n representation: any,\n protein: Protein,\n entry: NormalizedChoppingEntry,\n color: ColorHEX\n) {\n if (entry.ranges.length === 0) {\n return;\n }\n\n const selectors = entry.ranges.map<ComponentExpressionT>((range) => {\n const seqRange = {\n beg_auth_seq_id: range.start,\n end_auth_seq_id: range.end,\n };\n return createDomainSelector(protein, seqRange) as ComponentExpressionT;\n });\n\n const selectorParam = selectors.length === 1 ? selectors[0]! : selectors;\n applyFlatColor(representation, color, selectorParam);\n}\n\nfunction renderDomainEntry(\n struct: any,\n protein: Protein,\n entry: NormalizedChoppingEntry,\n color: ColorHEX\n) {\n const reprParams = createRepresentationParams(protein);\n\n entry.ranges.forEach((range) => {\n const seqRange = {\n beg_auth_seq_id: range.start,\n end_auth_seq_id: range.end,\n };\n const selector = createDomainSelector(protein, seqRange);\n const domainComp = struct.component({ selector });\n const domainRepr = domainComp.representation(reprParams);\n applyFlatColor(domainRepr, color);\n });\n\n addDomainLabel(struct, protein, entry);\n}\n\nfunction addDomainLabel(\n struct: any,\n protein: Protein,\n entry: NormalizedChoppingEntry\n) {\n if (!entry.showLabel || entry.ranges.length === 0) {\n return;\n }\n\n const labelRange =\n entry.ranges[Math.floor(entry.ranges.length / 2)] ?? entry.ranges[0]!;\n const labelSelector = createDomainSelector(protein, {\n beg_auth_seq_id: labelRange.start,\n end_auth_seq_id: labelRange.end,\n });\n struct.component({ selector: labelSelector }).label({\n text: entry.label,\n });\n}\n\nexport { renderProteinWithChopping, renderProteinWithoutChopping };\n","import type {\n ColorHEX,\n Matrix3D,\n Matrix3DFlattened,\n ModelSourceUrls,\n Protein,\n Vector3D,\n} from \"../types\";\nimport type { MVSData } from \"molstar/lib/extensions/mvs/mvs-data.d.ts\";\nimport type { Plugin } from \"../Plugin\";\nimport {\n createMVSBuilder,\n Root,\n} from \"molstar/lib/extensions/mvs/tree/mvs/mvs-builder\";\nimport { normalizeChoppingData } from \"./chopping\";\nimport { inferColors } from \"./colors\";\nimport {\n renderProteinWithChopping,\n renderProteinWithoutChopping,\n} from \"./rendering\";\n\nfunction transposeAndFlatten(matrix: Matrix3D): Matrix3DFlattened {\n return matrix[0].flatMap((_, colIndex) =>\n matrix.map((row) => row[colIndex])\n ) as Matrix3DFlattened;\n}\n\nconst DEFAULT_ROTATION: Matrix3D = [\n [1, 0, 0],\n [0, 1, 0],\n [0, 0, 1],\n];\nconst DEFAULT_TRANSLATION: Vector3D = [0, 0, 0];\n\nfunction prepareModelSourceUrl(\n protein: Protein,\n modelSourceUrls: Partial<ModelSourceUrls>,\n plugin?: Plugin\n) {\n const defaultModelSourceUrls = {\n uniProtId: \"https://alphafold.ebi.ac.uk/files\",\n };\n\n let url: string;\n\n if (protein.file) {\n if (!plugin) {\n throw new Error(\n \"Plugin instance is required to create object URL from file\"\n );\n }\n\n url = plugin.createObjectUrlFromFile(protein.file);\n } else if (modelSourceUrls.uniProtId !== undefined) {\n url = modelSourceUrls.uniProtId(protein.uniProtId);\n } else {\n url = `${defaultModelSourceUrls.uniProtId}/AF-${protein.uniProtId}-F1-model_v6.cif`;\n }\n\n return url;\n}\n\nfunction getParseFormat(protein: Protein): \"mmcif\" | \"pdb\" {\n if (!protein.file) {\n return \"mmcif\";\n }\n\n return protein.file.name.endsWith(\".cif\") ||\n protein.file.name.endsWith(\".mmcif\")\n ? \"mmcif\"\n : \"pdb\";\n}\n\nfunction processProtein(\n root: Root,\n protein: Protein,\n proteinIndex: number,\n totalProteins: number,\n colors: ColorHEX[],\n modelSourceUrls: Partial<ModelSourceUrls>,\n plugin?: Plugin\n) {\n const url = prepareModelSourceUrl(protein, modelSourceUrls, plugin);\n const download = root.download({ url });\n\n const parseFormat = getParseFormat(protein);\n const parse = download.parse({ format: parseFormat });\n\n const struct = parse.modelStructure(\n protein.file ? { block_header: null, block_index: 0, model_index: 0 } : {}\n );\n\n struct.transform({\n rotation: transposeAndFlatten(\n protein.superposition?.rotation ?? DEFAULT_ROTATION\n ),\n translation: protein.superposition?.translation ?? DEFAULT_TRANSLATION,\n rotation_center: [0, 0, 0],\n });\n\n const choppingEntries =\n totalProteins >= 3 ? [] : normalizeChoppingData(protein.chopping);\n\n if (choppingEntries.length > 0) {\n renderProteinWithChopping(\n struct,\n protein,\n proteinIndex,\n totalProteins,\n colors,\n choppingEntries\n );\n } else {\n renderProteinWithoutChopping(\n struct,\n protein,\n proteinIndex,\n totalProteins,\n colors\n );\n }\n}\n\nfunction createMVS(\n proteins: Protein[],\n modelSourceUrls: Partial<ModelSourceUrls>,\n plugin?: Plugin\n): MVSData {\n const colors = inferColors(proteins.length);\n\n const root = createMVSBuilder();\n\n for (let i = 0; i < proteins.length; i++) {\n const protein = proteins[i]!;\n processProtein(\n root,\n protein,\n i,\n proteins.length,\n colors,\n modelSourceUrls,\n plugin\n );\n }\n\n return root.getState({\n title: proteins.length > 1 ? \"Protein Comparison\" : \"Protein Visualization\",\n description: `Visualization of ${proteins.length} protein(s)`,\n });\n}\n\nexport { createMVS };\n","\"use client\";\n\nimport {\n useEffect,\n useId,\n useRef,\n useState,\n forwardRef,\n useImperativeHandle,\n type CSSProperties,\n} from \"react\";\nimport \"./style.css\";\nimport \"molstar/lib/mol-plugin-ui/skin/light.scss\";\nimport LoaderView from \"./LoaderView\";\nimport ErrorView from \"./ErrorView\";\nimport { Manager } from \"../core/Manager\";\nimport { createMVS } from \"../core/tree\";\nimport type { Plugin as P } from \"../core/Plugin\";\nimport type { Props, ViewerRef } from \"./types\";\n\ntype ViewerState = \"loading\" | \"success\" | \"error\";\n\n/**\n * Viewer\n *\n * React component that embeds a Mol* viewer plugin and exposes a small imperative\n * API via a forwarded ref. The component is responsible for initializing and\n * releasing a shared plugin instance (via Manager), loading structure data (either\n * from raw `proteins` input or from precomputed `mvs`), and exposing convenience\n * controls such as background color, label visibility, and simple animations (spin/rock).\n *\n * Remarks\n * - Exactly one of `proteins` or `mvs` must be provided. Passing both or neither\n * will throw an error during initialization.\n * - The component holds internal loading state: \"loading\" | \"success\" | \"error\".\n * On initialization errors the state becomes \"error\" and the error is logged to\n * the console.\n * - The plugin instance is created/reused via Manager.getInstance() and is\n * released when the component unmounts (or when the effect cleans up).\n * - UI mode `initialUI` toggles whether control chrome is shown; when set to\n * \"minimal\" an additional CSS class (\"no-controls\") is applied to the container.\n *\n * Props\n * @param proteins - Optional raw proteins data used to construct an MVS representation.\n * When provided, the component will call `createMVS(proteins, modelSourceUrls, plugin)`\n * to compute the view state to load into the plugin.\n * @param mvs - Optional precomputed MVS data. If provided, the viewer loads this\n * directly and does not call `createMVS`.\n * @param modelSourceUrls - Optional lookup mapping used by `createMVS` to resolve\n * model source URLs for remote model retrieval when `proteins` is used.\n * Without trailing slashes, e.g. { uniProtId: \"https://api.example.com/protein\" }.\n * @param initialUI - Which initial UI preset to use for the embedded plugin.\n * Typical values: \"standard\" | \"minimal\". Default: \"standard\".\n * @param bgColor - Background color for the viewer (any valid CSS color). Default: \"#ffffff\".\n * @param labels - Whether to show labels in the viewer. Default: true.\n * @param spin - Whether to enable continuous spin animation. Mutually exclusive with `rock`.\n * @param spinSpeed - Speed multiplier for the spin animation. Default: 0.05.\n * @param rock - Whether to enable rock animation (back-and-forth). Mutually exclusive with `spin`.\n * @param rockSpeed - Speed multiplier for the rock animation. Default: 0.2.\n * @param height - Optional explicit height (in pixels) for the outer wrapper. If omitted,\n * the wrapper will fill available height (\"100%\").\n * @param className - Optional CSS class to apply to the outer wrapper.\n *\n * Forwarded ref (ViewerRef)\n * The component forwards a ref exposing the following async methods:\n * - highlight(proteinIndex: number, label: string): Promise<void>\n * Focuses/highlights a domain within the specified protein by matching the label\n * against the protein's chopping data. The domain's first range (start/end) is used\n * to focus the view. No-op if plugin, proteins, or matching domain is not available.\n * - reset(): Promise<void>\n * Resets the plugin's view to its default/original pose.\n * - updateSuperposition(proteinIndex: number, translation?, rotation?): Promise<void>\n * Updates the transform for a loaded structure (protein) without reloading the\n * entire scene. `translation` is an optional [x, y, z] tuple. `rotation` is an\n * optional 3x3 matrix represented as [[r11,r12,r13],[r21,r22,r23],[r31,r32,r33]].\n * This method relies on the Mol* plugin API to update transforms in-place.\n *\n * Behavior & Side Effects\n * - While the component is initializing the plugin and loading data, it renders a\n * LoaderView. If initialization fails, it renders an ErrorView.\n * - When `spin` or `rock` props change (and the component is in \"success\" state),\n * the corresponding plugin animation is enabled with the provided speed. Passing\n * neither results in animations being turned off.\n * - When `bgColor` changes (and the component is in \"success\" state), the plugin's\n * background color is updated.\n * - When `labels` changes (and the component is in \"success\" state), the plugin's\n * label visibility is updated.\n * - The container element receives a stable id (useId) and CSS class \"react-molstar\",\n * plus \"no-controls\" when `initialUI === \"minimal\"`. The visualization container's\n * opacity animates between loading/success states.\n *\n * Example\n * const ref = useRef<ViewerRef | null>(null);\n * <Viewer\n * ref={ref}\n * proteins={myProteins}\n * initialUI=\"standard\"\n * bgColor=\"#000\"\n * labels={true}\n * />\n * // later\n * await ref.current?.highlight(0, \"Domain A\");\n * await ref.current?.updateSuperposition(1, [10,0,0], [[1,0,0],[0,1,0],[0,0,1]]);\n *\n * See also\n * - Manager: plugin lifecycle management used to acquire/release plugin instances.\n * - createMVS: helper to convert raw protein input into an MVS representation accepted\n * by the plugin.\n */\nconst Viewer = forwardRef<ViewerRef, Props>(function Viewer(\n {\n proteins,\n mvs,\n modelSourceUrls,\n initialUI = \"standard\",\n bgColor = \"#ffffff\",\n spin = false,\n spinSpeed = 0.05,\n rock = false,\n rockSpeed = 0.2,\n height,\n className,\n labels = true,\n }: Props,\n ref\n) {\n const containerRef = useRef<HTMLDivElement>(null);\n const pluginRef = useRef<P | null>(null);\n const proteinsRef = useRef<Props[\"proteins\"]>(proteins);\n const [state, setState] = useState<ViewerState>(\"loading\");\n const id = useId();\n\n // Update proteins ref when proteins prop changes\n useEffect(() => {\n proteinsRef.current = proteins;\n }, [proteins]);\n\n // Expose API methods via ref\n useImperativeHandle(\n ref,\n () => ({\n highlight: async (proteinIndex: number, label: string) => {\n if (\n !pluginRef.current ||\n proteinsRef.current === undefined ||\n proteinsRef.current.length <= proteinIndex\n ) {\n return;\n }\n\n const domain = proteinsRef.current[proteinIndex]?.chopping?.find(\n (d) => d.label === label\n );\n const start = domain?.ranges[0]?.start;\n const end = domain?.ranges[0]?.end;\n\n if (start !== undefined && end !== undefined) {\n await pluginRef.current.focusOnDomain(start, end, proteinIndex);\n }\n },\n reset: async () => {\n if (!pluginRef.current) {\n return;\n }\n await pluginRef.current.resetView();\n },\n updateSuperposition: async (\n proteinIndex: number,\n translation?: [number, number, number],\n rotation?: [\n [number, number, number],\n [number, number, number],\n [number, number, number],\n ]\n ) => {\n if (!pluginRef.current) {\n return;\n }\n\n // Use Mol* API directly to update the transform without reloading\n await pluginRef.current.updateStructureTransform(\n proteinIndex,\n translation,\n rotation\n );\n },\n }),\n []\n );\n\n useEffect(() => {\n return () => {\n pluginRef.current = null;\n };\n }, []);\n\n useEffect(() => {\n if (!containerRef.current) {\n return;\n }\n\n if (\n (proteins !== undefined && mvs !== undefined) ||\n (proteins === undefined && mvs === undefined)\n ) {\n throw new Error(\n \"Either `proteins` or `mvs` must be provided, but not both.\"\n );\n }\n\n setState(\"loading\");\n\n let ref: P | undefined;\n\n async function init() {\n const manager = Manager.getInstance();\n\n const el = containerRef.current;\n if (!el) {\n return;\n }\n\n let pl = manager.getPlugin(el);\n if (!pl) {\n pl = await manager.initPlugin(el, initialUI);\n }\n ref = pl;\n pluginRef.current = pl;\n\n try {\n // ensure proteins is defined when mvs is undefined\n if (mvs === undefined && proteins === undefined) {\n throw new Error(\n \"Either `proteins` or `mvs` must be provided, but not both.\"\n );\n }\n\n const proteinsVal = proteins;\n if (mvs === undefined && proteinsVal === undefined) {\n // defensive check, should not happen because of earlier validation\n throw new Error(\"Missing proteins data\");\n }\n\n const proteinsArg = proteinsVal as unknown as Parameters<\n typeof createMVS\n >[0];\n const mvsData =\n mvs ?? createMVS(proteinsArg, modelSourceUrls ?? {}, pl);\n await pl.loadMvs(mvsData);\n } catch (e) {\n // biome-ignore lint/suspicious/noConsole: intentional runtime error logging for viewer init\n console.error(e);\n setState(\"error\");\n return;\n }\n\n setState(\"success\");\n }\n\n init();\n\n return () => {\n if (ref !== undefined) {\n Manager.getInstance().releasePlugin(ref);\n }\n };\n }, [proteins, mvs, modelSourceUrls, initialUI]);\n\n useEffect(() => {\n if (state !== \"success\" || !pluginRef.current) {\n return;\n }\n\n if (spin) {\n pluginRef.current.setAnimation(\"spin\", spinSpeed);\n } else if (rock) {\n pluginRef.current.setAnimation(\"rock\", rockSpeed);\n } else {\n pluginRef.current.setAnimation(\"off\");\n }\n }, [state, spin, rock, spinSpeed, rockSpeed]);\n\n useEffect(() => {\n if (state !== \"success\" || !pluginRef.current) {\n return;\n }\n\n if (bgColor) {\n pluginRef.current.setBackgroundColor(bgColor);\n }\n }, [state, bgColor]);\n\n useEffect(() => {\n if (state !== \"success\" || !pluginRef.current) {\n return;\n }\n\n pluginRef.current.setLabelsVisibility(labels).catch((error) => {\n console.error(\"Error setting label visibility:\", error);\n });\n }, [state, labels]);\n\n const styles: CSSProperties = {\n height: height ? `${height}px` : \"100%\",\n position: \"relative\",\n };\n const containerClasses = `react-molstar${initialUI === \"minimal\" ? \" no-controls\" : \"\"}`;\n\n return (\n <div className={className} style={styles}>\n <div\n ref={containerRef}\n id={id}\n className={containerClasses}\n style={{\n opacity: state === \"success\" ? 1 : 0.7,\n transition: \"opacity 0.3s ease-in-out\",\n }}\n />\n\n {state === \"loading\" && <LoaderView />}\n\n {state === \"error\" && <ErrorView />}\n </div>\n );\n});\n\nexport default Viewer;\n"],"names":["jsxRuntimeModule","require$$0","require$$1","jsx","jsxs","DefaultPluginUISpec","createPluginUI","renderReact18","PluginSpec","MolViewSpec","loadMVSData","color","Color","PluginStateObject","Script","StructureSelection","StructureElement","transforms","StateTransforms","Mat4","Vec3","opacity","createMVSBuilder","forwardRef","Viewer","useRef","useState","useId","useEffect","useImperativeHandle","ref"],"mappings":"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","x_google_ignoreList":[0,1,2]}
package/dist/index.es.js CHANGED
@@ -476,6 +476,8 @@ function ErrorView() {
476
476
  class Plugin {
477
477
  plugin;
478
478
  objectUrls;
479
+ labelsVisible = true;
480
+ storedLabels = [];
479
481
  constructor(plugin) {
480
482
  this.plugin = plugin;
481
483
  this.objectUrls = /* @__PURE__ */ new Set();
@@ -555,6 +557,60 @@ class Plugin {
555
557
  renderer: { backgroundColor: Color.fromHexString(hexString) }
556
558
  });
557
559
  }
560
+ /**
561
+ * Set the visibility of labels by removing or adding them to the state tree.
562
+ * This approach is more reliable than trying to modify the isHidden property.
563
+ */
564
+ async setLabelsVisibility(visible) {
565
+ if (this.labelsVisible === visible) {
566
+ return;
567
+ }
568
+ try {
569
+ const state = this.plugin.state.data;
570
+ if (visible) {
571
+ if (this.storedLabels.length > 0) {
572
+ const update = state.build();
573
+ for (const storedLabel of this.storedLabels) {
574
+ const parentCell = state.cells.get(storedLabel.parentRef);
575
+ if (!parentCell) continue;
576
+ update.to(storedLabel.parentRef).apply(
577
+ storedLabel.transform.transformer,
578
+ storedLabel.transform.params
579
+ );
580
+ }
581
+ await this.plugin.runTask(state.updateTree(update));
582
+ }
583
+ this.labelsVisible = true;
584
+ } else {
585
+ const allObjects = state.selectQ((q) => q.root.subtree());
586
+ const labels = allObjects.filter((cell) => {
587
+ if (!cell.obj) return false;
588
+ const label = cell.obj.label || "";
589
+ const description = cell.obj.description || "";
590
+ return label === "MVS Custom Label" || description === "MVS Custom Label";
591
+ });
592
+ this.storedLabels = [];
593
+ if (labels.length > 0) {
594
+ const update = state.build();
595
+ for (const labelCell of labels) {
596
+ const parentRef = labelCell.transform.parent;
597
+ this.storedLabels.push({
598
+ parentRef,
599
+ transform: {
600
+ transformer: labelCell.transform.transformer,
601
+ params: labelCell.transform.params
602
+ }
603
+ });
604
+ update.delete(labelCell.transform.ref);
605
+ }
606
+ await this.plugin.runTask(state.updateTree(update));
607
+ }
608
+ this.labelsVisible = false;
609
+ }
610
+ } catch (e) {
611
+ console.error("Error setting label visibility:", e);
612
+ }
613
+ }
558
614
  setAnimation(type, speed) {
559
615
  if (type === "off") {
560
616
  this.plugin.canvas3d?.setProps({
@@ -582,15 +638,15 @@ class Plugin {
582
638
  }
583
639
  });
584
640
  }
585
- async focusOnDomain(domainStart, domainEnd) {
641
+ async focusOnDomain(domainStart, domainEnd, proteinIndex = 0) {
586
642
  const state = this.plugin.state.data;
587
643
  const structures = state.selectQ(
588
644
  (q) => q.rootsOfType(PluginStateObject.Molecule.Structure)
589
645
  );
590
- if (structures.length === 0) {
646
+ if (structures.length === 0 || proteinIndex >= structures.length) {
591
647
  return;
592
648
  }
593
- const structureCell = structures[0];
649
+ const structureCell = structures[proteinIndex];
594
650
  if (!structureCell?.obj) {
595
651
  return;
596
652
  }
@@ -771,7 +827,7 @@ function normalizeChoppingData(chopping) {
771
827
  }
772
828
  return chopping.map((entry) => ({
773
829
  label: entry.label,
774
- showLabel: entry.showLabel,
830
+ showLabel: entry.showLabel ?? true,
775
831
  ranges: entry.ranges.map((range) => ({
776
832
  start: Math.min(range.start, range.end),
777
833
  end: Math.max(range.start, range.end)
@@ -1107,7 +1163,8 @@ const Viewer = forwardRef(function Viewer2({
1107
1163
  rock = false,
1108
1164
  rockSpeed = 0.2,
1109
1165
  height,
1110
- className
1166
+ className,
1167
+ labels = true
1111
1168
  }, ref) {
1112
1169
  const containerRef = useRef(null);
1113
1170
  const pluginRef = useRef(null);
@@ -1130,7 +1187,7 @@ const Viewer = forwardRef(function Viewer2({
1130
1187
  const start = domain?.ranges[0]?.start;
1131
1188
  const end = domain?.ranges[0]?.end;
1132
1189
  if (start !== void 0 && end !== void 0) {
1133
- await pluginRef.current.focusOnDomain(start, end);
1190
+ await pluginRef.current.focusOnDomain(start, end, proteinIndex);
1134
1191
  }
1135
1192
  },
1136
1193
  reset: async () => {
@@ -1227,6 +1284,14 @@ const Viewer = forwardRef(function Viewer2({
1227
1284
  pluginRef.current.setBackgroundColor(bgColor);
1228
1285
  }
1229
1286
  }, [state, bgColor]);
1287
+ useEffect(() => {
1288
+ if (state !== "success" || !pluginRef.current) {
1289
+ return;
1290
+ }
1291
+ pluginRef.current.setLabelsVisibility(labels).catch((error) => {
1292
+ console.error("Error setting label visibility:", error);
1293
+ });
1294
+ }, [state, labels]);
1230
1295
  const styles = {
1231
1296
  height: height ? `${height}px` : "100%",
1232
1297
  position: "relative"