diff --git a/CHANGELOG.md b/CHANGELOG.md index dfd214d..6cc7417 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ user-visible changes. - Hide duplicate View/Edit/Analyze tabs in the inspector on wide layouts - Treat Export as a quiet header action until the figure sheet is open - Show the Bonds switch as off when the current representation does not use bonds +- Ignore `?renderer=three` so interactive viewing stays on 3Dmol ### Changed @@ -25,6 +26,7 @@ user-visible changes. - Put representation, atoms, and layers first in View, with the periodic cell and appearance last - Move interactive quality next to light and dark appearance - Enlarge inspector labels and controls from 9–10 px to 11–12 px and load Inter at regular weights +- Ship only Latin, Latin-extended, and Greek Inter files ## [0.1.0] - 2026-08-06 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6d740a6..5beccf2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,7 +1,8 @@ # Contributing PQViewer welcomes focused bug fixes, scientific regression cases, documentation, -and viewer improvements. +and viewer improvements. What to work on next, and what not to add, is in +[PRODUCT_DIRECTION.md](PRODUCT_DIRECTION.md). ## Before changing code diff --git a/PRODUCT_DIRECTION.md b/PRODUCT_DIRECTION.md index 243b528..53c0b68 100644 --- a/PRODUCT_DIRECTION.md +++ b/PRODUCT_DIRECTION.md @@ -78,13 +78,15 @@ they are stable enough for the wider ecosystem. ## Current release scope -The first public release covers: +The public beta already covers: - PQ trajectories, inputs, run directories, and declared restart chains - optional ASE files, `Atoms`, and indexed trajectories +- Jupyter `view()` embedding and a static web demo - lazy PQ frame access and bounded frontend prefetching - PQ-centered orthorhombic and triclinic cells - atom, molecule, unwrapped, mirrored, centered, and repeated periodic views +- local atom and cell edits with EXTXYZ download - direct and scoped selection, measurements, saved selections, and comparisons - trajectory playback, bookmarks, reference displacement, and atom trails - scalar, measurement, pair-distribution, and coordination plots @@ -92,15 +94,49 @@ The first public release covers: - command search, broad keyboard access, and optional Vim navigation - publication raster figures, vector plot output, and source-validated recipes -## Next priorities +Packaging (`MolarVerse-PQViewer` on PyPI) and notebook embedding exist. Do not +rebuild them. Finish honesty, the PQ run loop, and citable exports. -1. Publish a documented, installable release with stable packaging and examples. -2. Make unsupported actions explain their data requirements in the interface. -3. Improve exported scientific metadata for measurement and pair-analysis CSV. -4. Expand redistributable examples for liquids, crystals, MOFs, and proteins. -5. Add notebook embedding around the same dataset and renderer contracts. -6. Define extension contracts for representations and PQAnalysis results after - the core API has release experience. +## Next steps + +Work in this order. Do not start later items to look busy. + +### 1. Honest disabled actions + +Every control that cannot run should say which data it needs: ribbon, polyhedra, +unwrapped coordinates, pair distribution, coordination, tracking, recipes, and +missing sidecars. Missing capabilities stay hidden or disabled. They are never +faked. + +### 2. The PQ run as the default path + +`pqviewer path/to/run` should be the usual step after a job. Explain restart +chains, incomplete companions, and growing files in the interface. Keep +`refresh()` bounded. Do not add a file manager. + +### 3. Exports a paper can reuse + +Measurement and pair-analysis CSV should record units, frame identity, periodic +mode, and analysis populations. Figure recipes already validate the source; +keep them the reproducibility contract. + +### 4. Examples people can open + +Ship small redistributable liquid, crystal, MOF, and protein fixtures in +`examples/`, including the sources already used in the docs. Provenance stays +in `examples/README.md`. + +### 5. After 1.0 + +Harden Jupyter for remote kernels (loopback and port forwarding). Move stable +`FrameKey`, centered-cell, and pair-result contracts upstream into PQAnalysis +only after they stop changing. + +### Not now + +Do not start extension APIs, a second interactive engine, PQEnalyzer embedding, +or VMD/OVITO plugin parity. Those wait until the core viewer has release +experience. ## Quality gates @@ -118,9 +154,11 @@ Every release needs: - simulation setup or execution - cluster and job management -- coordinate editing or calculator setup +- calculator setup (ASE calculator results may be read; never trigger `calculate`) +- growing Edit into molecule building - a permanent energy dashboard - embedding the PQEnalyzer interface - duplicating PQAnalysis calculations in the frontend -- multiple interactive rendering engines without a clear scientific benefit +- a second interactive rendering engine (`?renderer=three` is not a product) - broad plugin parity with VMD, OVITO, or ChimeraX +- extension APIs before 1.0 diff --git a/docs/viewer-guide.md b/docs/viewer-guide.md index 4728486..9e5d78e 100644 --- a/docs/viewer-guide.md +++ b/docs/viewer-guide.md @@ -111,8 +111,8 @@ Use command search for **Source coordinates** when the stored coordinates need to be shown without display wrapping. The interactive view uses the locally bundled 3Dmol renderer. If it cannot -initialize, PQViewer keeps the established Three renderer available as a -fallback. +initialize, PQViewer falls back to the publication renderer so the structure +stays visible. Do not add a second interactive engine. ## Export diff --git a/frontend/src/RendererScene.test.ts b/frontend/src/RendererScene.test.ts index 2500e17..589b029 100644 --- a/frontend/src/RendererScene.test.ts +++ b/frontend/src/RendererScene.test.ts @@ -2,13 +2,13 @@ import { describe, expect, it } from "vitest"; import { resolveRendererEngine } from "./RendererScene"; describe("renderer selection", () => { - it("uses the bundled 3Dmol engine by default", () => { + it("uses the bundled 3Dmol engine for interactive viewing", () => { expect(resolveRendererEngine("")).toBe("3dmol"); expect(resolveRendererEngine("?renderer=3dmol")).toBe("3dmol"); }); - it("keeps the previous renderer as an explicit fallback", () => { - expect(resolveRendererEngine("?renderer=three")).toBe("three"); + it("does not offer a second interactive engine through the URL", () => { + expect(resolveRendererEngine("?renderer=three")).toBe("3dmol"); expect(resolveRendererEngine("?renderer=other")).toBe("3dmol"); }); }); diff --git a/frontend/src/RendererScene.tsx b/frontend/src/RendererScene.tsx index b14fb16..61c457e 100644 --- a/frontend/src/RendererScene.tsx +++ b/frontend/src/RendererScene.tsx @@ -31,11 +31,8 @@ interface PublicationRequest { timeout: number; } -export function resolveRendererEngine(search?: string): RendererEngineId { - const value = new URLSearchParams( - search ?? (typeof window === "undefined" ? "" : window.location.search), - ).get("renderer"); - return value === "three" ? "three" : "3dmol"; +export function resolveRendererEngine(_search?: string): RendererEngineId { + return "3dmol"; } export const MoleculeScene = forwardRef( diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx index 291ce56..63098e2 100644 --- a/frontend/src/main.tsx +++ b/frontend/src/main.tsx @@ -1,9 +1,17 @@ import { StrictMode } from "react"; import { createRoot } from "react-dom/client"; -import "@fontsource/inter/400.css"; -import "@fontsource/inter/500.css"; -import "@fontsource/inter/600.css"; -import "@fontsource/inter/700.css"; +import "@fontsource/inter/latin-400.css"; +import "@fontsource/inter/latin-500.css"; +import "@fontsource/inter/latin-600.css"; +import "@fontsource/inter/latin-700.css"; +import "@fontsource/inter/latin-ext-400.css"; +import "@fontsource/inter/latin-ext-500.css"; +import "@fontsource/inter/latin-ext-600.css"; +import "@fontsource/inter/latin-ext-700.css"; +import "@fontsource/inter/greek-400.css"; +import "@fontsource/inter/greek-500.css"; +import "@fontsource/inter/greek-600.css"; +import "@fontsource/inter/greek-700.css"; import App from "./App"; import "./styles.css"; diff --git a/frontend/src/styles.css b/frontend/src/styles.css index 60d9ba9..201dcae 100644 --- a/frontend/src/styles.css +++ b/frontend/src/styles.css @@ -468,39 +468,6 @@ output { font-size: 10px; } -.profile-strip { - display: grid; - grid-template-columns: repeat(5, minmax(0, 1fr)); - gap: 2px; - margin-bottom: 13px; - padding: 2px; - border-radius: 9px; - background: var(--surface-soft); -} - -.profile-strip button { - min-width: 0; - min-height: 32px; - padding: 0 3px; - border: 0; - border-radius: 7px; - background: transparent; - color: var(--muted); - font-size: 10px; - cursor: pointer; -} - -.profile-strip button:hover { - color: var(--text); -} - -.profile-strip button.is-active { - background: var(--surface); - box-shadow: 0 1px 3px rgba(31, 51, 57, 0.1); - color: var(--text); - font-weight: 600; -} - .scene-group { padding: 13px 0; border-top: 1px solid var(--line); @@ -2130,7 +2097,6 @@ input[type="range"]::-moz-range-thumb { } .more-menu button, - .profile-strip button, .representation-grid button, .image-presets button, .scene-actions button, @@ -3684,41 +3650,6 @@ button.measurement-plot__legend-item:hover { pointer-events: none; } -.preset-options { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: 5px; -} - -.preset-options button { - min-width: 0; - min-height: 34px; - padding: 0 9px; - border: 1px solid var(--line); - border-radius: 7px; - background: var(--surface); - color: var(--muted); - font-size: 10px; - cursor: pointer; -} - -.preset-options button:hover:not(:disabled) { - border-color: color-mix(in srgb, var(--accent) 30%, var(--line)); - color: var(--text); -} - -.preset-options button.is-active { - border-color: color-mix(in srgb, var(--accent) 48%, var(--line)); - background: var(--accent-soft); - color: var(--accent); - font-weight: 650; -} - -.preset-options button:disabled { - cursor: default; - opacity: 0.45; -} - .workbench[hidden], .workbench-pane[hidden] { display: none; @@ -3918,10 +3849,6 @@ button.measurement-plot__legend-item:hover { margin-bottom: 9px; } -.workbench .profile-strip { - margin: 0; -} - .panel-select-row { min-height: 40px; display: grid; @@ -5485,23 +5412,6 @@ button.measurement-plot__legend-item:hover { border-top: 1px solid var(--line); } -.preset-options { - grid-template-columns: repeat(3, minmax(0, 1fr)); - gap: 6px; -} - -.preset-options button { - min-height: 36px; - padding-inline: 5px; - border-color: var(--line-soft); - background: var(--surface-soft); -} - -.preset-options button.is-active { - border-color: color-mix(in srgb, var(--accent) 38%, var(--line)); - background: var(--accent-soft); -} - .periodic-settings { padding: 0; } @@ -7027,49 +6937,6 @@ button.measurement-plot__legend-item:hover { cursor: default; } -.profile-settings { - padding: 0; -} - -.profile-settings > summary { - min-height: 48px; - display: flex; - align-items: center; - justify-content: space-between; - gap: 10px; - padding: 0 16px; - list-style: none; - color: var(--text); - font-size: 12px; - font-weight: 600; - cursor: pointer; -} - -.profile-settings > summary::-webkit-details-marker { - display: none; -} - -.profile-settings > summary::after { - content: "+"; - margin-left: auto; - color: var(--quiet); - font-family: var(--numeric); -} - -.profile-settings[open] > summary::after { - content: "−"; -} - -.profile-settings > summary small { - color: var(--quiet); - font-size: 11px; - font-weight: 400; -} - -.profile-settings .preset-options { - padding: 0 16px 14px; -} - .atom-display-settings .vector-scale-row { border-top: 1px solid var(--line); } diff --git a/pqviewer/static/assets/index-B9KxOlif.css b/pqviewer/static/assets/index-B9KxOlif.css deleted file mode 100644 index 3206761..0000000 --- a/pqviewer/static/assets/index-B9KxOlif.css +++ /dev/null @@ -1 +0,0 @@ -@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/inter-cyrillic-ext-400-normal-BQZuk6qB.woff2) format("woff2"),url(/assets/inter-cyrillic-ext-400-normal-DQukG94-.woff) format("woff");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/inter-cyrillic-400-normal-obahsSVq.woff2) format("woff2"),url(/assets/inter-cyrillic-400-normal-HOLc17fK.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/inter-greek-ext-400-normal-DGGRlc-M.woff2) format("woff2"),url(/assets/inter-greek-ext-400-normal-KugGGMne.woff) format("woff");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/inter-greek-400-normal-B4URO6DV.woff2) format("woff2"),url(/assets/inter-greek-400-normal-q2sYcFCs.woff) format("woff");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/inter-vietnamese-400-normal-DMkecbls.woff2) format("woff2"),url(/assets/inter-vietnamese-400-normal-Bbgyi5SW.woff) format("woff");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/inter-latin-ext-400-normal-C1nco2VV.woff2) format("woff2"),url(/assets/inter-latin-ext-400-normal-77YHD8bZ.woff) format("woff");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/inter-latin-400-normal-C38fXH4l.woff2) format("woff2"),url(/assets/inter-latin-400-normal-CyCys3Eg.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/inter-cyrillic-ext-500-normal-B0yAr1jD.woff2) format("woff2"),url(/assets/inter-cyrillic-ext-500-normal-BmqWE9Dz.woff) format("woff");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/inter-cyrillic-500-normal-BasfLYem.woff2) format("woff2"),url(/assets/inter-cyrillic-500-normal-CxZf_p3X.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/inter-greek-ext-500-normal-C4iEst2y.woff2) format("woff2"),url(/assets/inter-greek-ext-500-normal-2j5mBUwD.woff) format("woff");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/inter-greek-500-normal-BIZE56-Y.woff2) format("woff2"),url(/assets/inter-greek-500-normal-Xzm54t5V.woff) format("woff");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/inter-vietnamese-500-normal-DOriooB6.woff2) format("woff2"),url(/assets/inter-vietnamese-500-normal-mJboJaSs.woff) format("woff");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/inter-latin-ext-500-normal-CV4jyFjo.woff2) format("woff2"),url(/assets/inter-latin-ext-500-normal-BxGbmqWO.woff) format("woff");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/inter-latin-500-normal-Cerq10X2.woff2) format("woff2"),url(/assets/inter-latin-500-normal-BL9OpVg8.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/inter-cyrillic-ext-600-normal-Dfes3d0z.woff2) format("woff2"),url(/assets/inter-cyrillic-ext-600-normal-Bcila6Z-.woff) format("woff");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/inter-cyrillic-600-normal-CWCymEST.woff2) format("woff2"),url(/assets/inter-cyrillic-600-normal-4D_pXhcN.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/inter-greek-ext-600-normal-DRtmH8MT.woff2) format("woff2"),url(/assets/inter-greek-ext-600-normal-B8X0CLgF.woff) format("woff");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/inter-greek-600-normal-plRanbMR.woff2) format("woff2"),url(/assets/inter-greek-600-normal-BZpKdvQh.woff) format("woff");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/inter-vietnamese-600-normal-Cc8MFFhd.woff2) format("woff2"),url(/assets/inter-vietnamese-600-normal-BuLX-rYi.woff) format("woff");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/inter-latin-ext-600-normal-D2bJ5OIk.woff2) format("woff2"),url(/assets/inter-latin-ext-600-normal-CIVaiw4L.woff) format("woff");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/inter-latin-600-normal-LgqL8muc.woff2) format("woff2"),url(/assets/inter-latin-600-normal-CiBQ2DWP.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/inter-cyrillic-ext-700-normal-BjwYoWNd.woff2) format("woff2"),url(/assets/inter-cyrillic-ext-700-normal-LO58E6JB.woff) format("woff");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/inter-cyrillic-700-normal-CjBOestx.woff2) format("woff2"),url(/assets/inter-cyrillic-700-normal-DrXBdSj3.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/inter-greek-ext-700-normal-qfdV9bQt.woff2) format("woff2"),url(/assets/inter-greek-ext-700-normal-BoQ6DsYi.woff) format("woff");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/inter-greek-700-normal-C3JjAnD8.woff2) format("woff2"),url(/assets/inter-greek-700-normal-BUv2fZ6O.woff) format("woff");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/inter-vietnamese-700-normal-DlLaEgI2.woff2) format("woff2"),url(/assets/inter-vietnamese-700-normal-BZaoP0fm.woff) format("woff");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/inter-latin-ext-700-normal-Ca8adRJv.woff2) format("woff2"),url(/assets/inter-latin-ext-700-normal-TidjK2hL.woff) format("woff");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/inter-latin-700-normal-Yt3aPRUw.woff2) format("woff2"),url(/assets/inter-latin-700-normal-BLAVimhd.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{color-scheme:light;font-family:Inter,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;font-synthesis:none;text-rendering:optimizeLegibility;--header-height: 44px;--canvas: #f6f8f8;--surface: #ffffff;--material: rgba(255, 255, 255, .88);--surface-soft: #edf2f3;--line: #d7e0e2;--line-strong: #c2cfd2;--text: #21363c;--muted: #5c7076;--quiet: #62757a;--disabled: #aab7ba;--accent: #257198;--accent-soft: #e3f0f5;--error: #a23d31;--shadow: 0 10px 32px rgba(30, 51, 57, .11), 0 2px 7px rgba(30, 51, 57, .06);--numeric: "SFMono-Regular", "Roboto Mono", Consolas, monospace}:root[data-appearance=dark]{color-scheme:dark;--canvas: #1e2e33;--surface: #26383e;--material: rgba(38, 56, 62, .92);--surface-soft: #30454c;--line: #465b61;--line-strong: #5a7076;--text: #f2f6f5;--muted: #c1ced0;--quiet: #9aadb1;--disabled: #718286;--accent: #63c4d8;--accent-soft: #294c58;--error: #f09a8d;--shadow: 0 12px 36px rgba(0, 0, 0, .3), 0 2px 8px rgba(0, 0, 0, .2)}*{box-sizing:border-box}html,body,#root{width:100%;height:100%;margin:0;overflow:hidden}body{min-width:320px;background:var(--canvas);color:var(--text)}button,select,input{font:inherit}button,select{color:inherit}button{-webkit-tap-highlight-color:transparent}button:focus-visible,select:focus-visible,input:focus-visible,svg:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.molecule-canvas:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}kbd,output{font-family:var(--numeric)}.app-shell,.workspace{width:100%;height:100svh;min-height:0}.workspace{position:relative;isolation:isolate;overflow:hidden;background:var(--canvas)}.molecule-canvas,.canvas-field{position:absolute;top:var(--header-height);left:0;width:100%;height:calc(100% - var(--header-height));display:block}.molecule-canvas{cursor:grab;touch-action:none}.molecule-canvas:active{cursor:grabbing}.molecule-canvas.is-box-selecting{cursor:crosshair}.selection-marquee{position:absolute;z-index:15;pointer-events:none;border:1px solid var(--accent);border-radius:2px;background:color-mix(in srgb,var(--accent) 9%,transparent)}.icon{width:20px;height:20px;display:block}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.topbar{position:absolute;z-index:20;inset:0 0 auto;height:var(--header-height);display:flex;align-items:center;justify-content:space-between;gap:16px;padding:0 8px 0 12px;border-bottom:1px solid var(--line);background:var(--surface)}.identity,.topbar-tools,.scene-status,.open-button,.command-button,.customize-button{display:flex;align-items:center}.identity{min-width:0;gap:9px}.identity-mark{width:28px;height:28px;flex:0 0 auto;object-fit:contain}.identity>div{min-width:0;display:flex;align-items:baseline;gap:9px}.identity strong{color:var(--text);font-size:13px;font-weight:650;letter-spacing:-.01em}.identity span:last-child{max-width:min(42vw,520px);overflow:hidden;color:var(--muted);font-size:12px;line-height:1.2;text-overflow:ellipsis;white-space:nowrap}.topbar-tools{flex:0 0 auto;gap:3px}.scene-status{gap:13px;margin-right:8px;color:var(--muted);font-size:11px}.scene-status strong{color:var(--text);font-family:var(--numeric);font-size:10px;font-weight:550}.open-button,.command-button,.customize-button,.more-button,.icon-button{min-width:36px;height:36px;display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:0 9px;border:0;border-radius:8px;background:transparent;color:var(--muted);font-size:12px;cursor:pointer;transition:background-color .19s ease,color .19s ease}.open-button:hover,.command-button:hover,.customize-button:hover,.more-button:hover,.icon-button:hover{background:var(--surface-soft);color:var(--text)}.open-button .icon,.command-button .icon,.customize-button .icon,.more-button .icon,.icon-button .icon{width:17px;height:17px}.command-button kbd{color:var(--quiet);font-size:10px}.customize-button{width:36px;padding:0}.customize-button[aria-expanded=true]{background:var(--accent-soft);color:var(--text)}.customize-button:disabled{opacity:.48;cursor:default}.more-control{position:relative}.more-button{width:36px;padding:0}.more-menu{position:absolute;z-index:30;top:calc(100% + 7px);right:0;width:226px;padding:5px;border:1px solid var(--line);border-radius:11px;background:var(--material);box-shadow:var(--shadow);-webkit-backdrop-filter:blur(14px) saturate(1.08);backdrop-filter:blur(14px) saturate(1.08);animation:pop-in .19s ease both}.more-menu button{width:100%;min-height:38px;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:0 10px;border:0;border-radius:7px;background:transparent;color:var(--text);font-size:12px;text-align:left;cursor:pointer}.more-menu button:hover{background:var(--surface-soft)}.more-menu button:disabled{color:var(--disabled);cursor:default}.more-menu button:disabled:hover{background:transparent}.more-menu kbd{color:var(--quiet);font-size:10px}.more-menu hr{height:1px;margin:4px 7px;border:0;background:var(--line)}.scene-control{position:absolute;z-index:12;top:calc(var(--header-height) + 12px);left:14px}.scene-trigger{min-height:44px;display:inline-flex;align-items:center;gap:8px;padding:0 11px 0 12px;border:1px solid var(--line);border-radius:12px;background:var(--material);box-shadow:0 3px 12px #20343a12;-webkit-backdrop-filter:blur(12px) saturate(1.06);backdrop-filter:blur(12px) saturate(1.06);color:var(--text);cursor:pointer;transition:background-color .19s ease,border-color .19s ease,transform .19s ease}.scene-trigger:hover,.scene-trigger[aria-expanded=true]{border-color:var(--line-strong);background:var(--surface)}.scene-trigger:active{transform:scale(.98)}.scene-trigger>span{color:var(--muted);font-size:10px}.scene-trigger>strong{font-size:12px;font-weight:600}.scene-trigger .icon{width:14px;height:14px;color:var(--quiet)}.scene-popover{position:absolute;top:51px;left:0;width:min(356px,calc(100vw - 28px));max-height:min(650px,calc(100svh - 182px));overflow:auto;padding:15px;border:1px solid var(--line);border-radius:14px;background:var(--material);box-shadow:var(--shadow);-webkit-backdrop-filter:blur(16px) saturate(1.06);backdrop-filter:blur(16px) saturate(1.06);scrollbar-color:var(--line-strong) transparent;animation:pop-in .19s ease both}.popover-heading,.sheet-heading,.section-heading-row,.scene-group-heading{display:flex;align-items:center;justify-content:space-between;gap:12px}.popover-heading{margin-bottom:13px}.popover-heading>div,.sheet-heading>div{min-width:0}.popover-heading strong,.sheet-heading strong{display:block;color:var(--text);font-size:15px;font-weight:650;letter-spacing:-.01em}.popover-heading span,.sheet-heading span{display:block;margin-top:3px;color:var(--muted);font-size:10px}.profile-strip{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:2px;margin-bottom:13px;padding:2px;border-radius:9px;background:var(--surface-soft)}.profile-strip button{min-width:0;min-height:32px;padding:0 3px;border:0;border-radius:7px;background:transparent;color:var(--muted);font-size:10px;cursor:pointer}.profile-strip button:hover{color:var(--text)}.profile-strip button.is-active{background:var(--surface);box-shadow:0 1px 3px #1f33391a;color:var(--text);font-weight:600}.scene-group{padding:13px 0;border-top:1px solid var(--line)}.scene-group-label{display:block;margin-bottom:8px;color:var(--muted);font-size:10px;font-weight:650;letter-spacing:.06em;text-transform:uppercase}.scene-group-heading{align-items:baseline}.scene-group-heading .scene-group-label{margin-bottom:8px}.scene-group-heading output{color:var(--quiet);font-size:10px}.representation-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:4px}.representation-grid button{min-height:42px;display:flex;align-items:center;justify-content:space-between;gap:8px;padding:0 10px;border:1px solid transparent;border-radius:8px;background:transparent;color:var(--muted);font-size:11px;text-align:left;cursor:pointer}.representation-grid button:hover:not(:disabled){background:var(--surface-soft);color:var(--text)}.representation-grid button.is-active{border-color:color-mix(in srgb,var(--accent) 32%,var(--line));background:var(--accent-soft);color:var(--text)}.representation-grid button:disabled{color:var(--disabled);cursor:default}.representation-grid button .icon{width:14px;height:14px;color:var(--accent)}.capability-note,.cell-origin-note{display:block;margin-top:7px;color:var(--quiet);font-size:10px;line-height:1.4}.toggle-row,.choice-row{min-height:44px;display:flex;align-items:center;justify-content:space-between;gap:12px;color:var(--text);font-size:12px}.toggle-row.is-disabled,.choice-row.is-disabled{color:var(--disabled)}.toggle-row>button[role=switch],.vim-heading>button[role=switch]{position:relative;width:34px;height:20px;flex:0 0 auto;padding:0;border:0;border-radius:999px;background:var(--line-strong);cursor:pointer;transition:background-color .19s ease}.toggle-row>button[role=switch] i,.vim-heading>button[role=switch] i{position:absolute;top:3px;left:3px;width:14px;height:14px;border-radius:50%;background:#fff;box-shadow:0 1px 3px #14232833;transition:transform .19s ease}.toggle-row>button[role=switch][aria-checked=true],.vim-heading>button[role=switch][aria-checked=true]{background:var(--accent)}.toggle-row>button[role=switch][aria-checked=true] i,.vim-heading>button[role=switch][aria-checked=true] i{transform:translate(14px)}.toggle-row>button[role=switch]:disabled{cursor:default;opacity:.55}.mini-segmented,.settings-segmented{display:flex;min-height:34px;padding:2px;border-radius:8px;background:var(--surface-soft)}.mini-segmented{width:150px}.mini-segmented button,.settings-segmented button{min-width:0;min-height:30px;flex:1 1 0;padding:0 7px;border:0;border-radius:6px;background:transparent;color:var(--muted);font-size:10px;cursor:pointer}.mini-segmented button.is-active,.settings-segmented button.is-active{background:var(--surface);box-shadow:0 1px 3px #1f33391a;color:var(--text);font-weight:600}.image-presets{display:flex;gap:4px;margin-bottom:8px}.image-presets button{min-height:32px;flex:1 1 0;padding:0 8px;border:1px solid var(--line);border-radius:7px;background:transparent;color:var(--muted);font-size:10px;cursor:pointer}.image-presets button:hover{border-color:var(--line-strong);background:var(--surface-soft);color:var(--text)}.image-presets button.is-active{border-color:color-mix(in srgb,var(--accent) 32%,var(--line));background:var(--accent-soft);color:var(--text)}.image-ranges{display:grid;gap:5px}.image-axis{min-height:36px;display:grid;grid-template-columns:22px 1fr 10px 1fr;align-items:center;padding:0 6px;border:1px solid var(--line);border-radius:8px}.image-axis>span{color:var(--muted);font-family:var(--numeric);font-size:10px}.image-axis>i{color:var(--quiet);font-style:normal;font-size:10px;text-align:center}.image-axis select{min-width:0;width:100%;height:30px;padding:0 4px;border:0;background:transparent;color:var(--text);font-family:var(--numeric);font-size:10px;text-align:center}.image-axis.is-disabled{opacity:.42}.scene-actions{display:flex;align-items:center;justify-content:flex-start;gap:5px;margin:0 -15px -15px;padding:11px 15px 15px;border-top:1px solid var(--line);background:var(--surface)}.scene-actions button{min-height:38px;padding:0 10px;border:0;border-radius:8px;background:transparent;color:var(--muted);font-size:10px;cursor:pointer}.scene-actions button:hover{background:var(--surface-soft);color:var(--text)}.scene-actions button.is-active{background:var(--accent-soft);color:var(--text)}.orientation-control{position:absolute;z-index:11;top:calc(var(--header-height) + 12px);right:14px;display:flex;padding:3px;border:1px solid var(--line);border-radius:12px;background:var(--material);box-shadow:0 3px 12px #20343a12;-webkit-backdrop-filter:blur(12px) saturate(1.06);backdrop-filter:blur(12px) saturate(1.06)}.orientation-control button{min-width:38px;height:36px;display:grid;place-items:center;padding:0 7px;border:0;border-radius:8px;background:transparent;color:var(--quiet);font-family:var(--numeric);font-size:10px;cursor:pointer}.orientation-control button:hover,.orientation-control button.is-active{background:var(--surface-soft);color:var(--text)}.orientation-control button.is-active{font-weight:650}.orientation-control button .icon{width:18px;height:18px;color:var(--accent)}.inspector{position:absolute;z-index:14;top:calc(var(--header-height) + 12px);right:14px;bottom:76px;width:316px;overflow:auto;padding:16px 18px 20px;border:1px solid var(--line);border-radius:14px;background:var(--material);box-shadow:var(--shadow);-webkit-backdrop-filter:blur(16px) saturate(1.04);backdrop-filter:blur(16px) saturate(1.04);visibility:hidden;pointer-events:none;opacity:0;transform:translate(14px) scale(.99);transform-origin:top right;transition:opacity .19s ease,transform .19s ease,visibility 0ms linear .19s;scrollbar-color:var(--line-strong) transparent}.inspector.is-open{visibility:visible;pointer-events:auto;opacity:1;transform:translate(0) scale(1);transition-delay:0ms}.panel-heading{min-height:36px;display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding-bottom:7px}.panel-heading h2{margin:0;font-size:16px;line-height:1.3;font-weight:650;letter-spacing:-.01em}.close-inspector{width:32px;min-width:32px;height:32px;padding:0}.readout-section{padding:13px 0}.readout-section+.readout-section{border-top:1px solid var(--line)}.readout-section h3{margin:0 0 9px;color:var(--muted);font-size:11px;font-weight:650;letter-spacing:.06em;text-transform:uppercase}.section-heading-row{min-height:18px;align-items:baseline;margin-bottom:8px}.section-heading-row h3{margin:0}.section-heading-row>span,.section-heading-row>output{color:var(--quiet);font-size:10px}.readout{min-height:27px;display:grid;grid-template-columns:minmax(82px,.82fr) minmax(0,1.18fr);align-items:baseline;gap:10px}.readout span{color:var(--muted);font-size:12px}.readout strong{overflow:hidden;color:var(--text);font-family:var(--numeric);font-size:12px;font-weight:500;text-align:right;text-overflow:ellipsis;white-space:nowrap}.readout.is-accent strong{color:var(--accent);font-weight:650}.cell-metrics-section .readout{grid-template-columns:66px minmax(0,1fr)}.quiet-copy{margin:2px 0 4px;color:var(--muted);font-size:11px;line-height:1.5}.vector-readout{margin:8px 0 9px}.vector-readout>span{display:block;margin-bottom:6px;color:var(--muted);font-size:11px}.vector-readout code{display:grid;grid-template-columns:14px 1fr;row-gap:5px;padding-left:9px;border-left:2px solid var(--line-strong);color:var(--text);font-family:var(--numeric);font-size:10px;line-height:1.25}.vector-readout code i{color:var(--quiet);font-style:normal}.vector-readout code b{position:absolute;right:18px;color:var(--quiet);font-size:10px;font-weight:500}.force-scale{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:8px}.force-scale>span{color:var(--quiet);font-family:var(--numeric);font-size:10px}.timeline{position:absolute;z-index:18;left:50%;bottom:12px;width:min(960px,calc(100% - 28px));min-height:52px;padding:5px 9px 8px;border:1px solid var(--line);border-radius:14px;background:var(--material);box-shadow:0 5px 20px #1f333917;-webkit-backdrop-filter:blur(14px) saturate(1.04);backdrop-filter:blur(14px) saturate(1.04);transform:translate(-50%)}.timeline.is-compact{height:52px;padding-block:4px}.transport-row{min-height:42px;display:flex;align-items:center;gap:10px}.transport-buttons{display:flex;flex:0 0 auto;align-items:center}.transport-button,.play-button{width:40px;height:40px;display:grid;place-items:center;padding:0;border:0;border-radius:9px;background:transparent;color:var(--muted);cursor:pointer}.play-button{color:var(--text)}.transport-button:hover:not(:disabled),.play-button:hover:not(:disabled){background:var(--surface-soft);color:var(--accent)}.transport-button:disabled,.play-button:disabled{opacity:.28;cursor:default}.transport-button .icon,.play-button .icon{width:17px;height:17px}.scrubber{min-width:40px;flex:1 1 auto;display:flex;align-items:center}input[type=range]{width:100%;height:28px;margin:0;appearance:none;background:transparent;cursor:pointer}input[type=range]::-webkit-slider-runnable-track{height:3px;border-radius:3px;background:var(--line-strong)}input[type=range]::-webkit-slider-thumb{width:13px;height:13px;margin-top:-5px;appearance:none;border:2px solid var(--surface);border-radius:50%;background:var(--accent);box-shadow:0 0 0 1px var(--accent)}input[type=range]::-moz-range-track{height:3px;border-radius:3px;background:var(--line-strong)}input[type=range]::-moz-range-thumb{width:11px;height:11px;border:2px solid var(--surface);border-radius:50%;background:var(--accent)}.frame-counter{min-width:74px;color:var(--text);font-size:10px;font-weight:600;text-align:right}.speed-control select,.plot-label select{border:0;background:transparent;cursor:pointer}.speed-control select{width:54px;padding:6px 2px 6px 5px;color:var(--muted);font-family:var(--numeric);font-size:10px;text-align:right}.plot-row{position:relative;height:67px;display:flex;align-items:stretch;gap:12px;padding-top:3px;border-top:1px solid var(--line)}.plot-label{width:106px;display:flex;flex:0 0 auto;flex-direction:column;justify-content:center;gap:3px;overflow:hidden}.plot-label select{width:100%;overflow:hidden;padding:0;color:var(--text);font-size:11px;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.plot-label small{color:var(--quiet);font-family:var(--numeric);font-size:10px}.series-plot{position:relative;min-width:0;flex:1 1 auto}.series-plot svg{width:100%;height:100%;display:block;overflow:visible;cursor:crosshair;touch-action:none}.plot-grid{stroke:var(--line);stroke-width:1;vector-effect:non-scaling-stroke}.series-line{fill:none;stroke:var(--muted);stroke-width:1.5;vector-effect:non-scaling-stroke}.empty-series-line{stroke:var(--line-strong);stroke-width:1;stroke-dasharray:4 6;vector-effect:non-scaling-stroke}.frame-marker{stroke:var(--accent);stroke-width:1.25;opacity:.82;vector-effect:non-scaling-stroke}.frame-point{fill:var(--surface);stroke:var(--accent);stroke-width:2}.plot-range{position:absolute;inset:4px 3px 4px auto;display:flex;flex-direction:column;justify-content:space-between;color:var(--quiet);font-family:var(--numeric);font-size:10px;pointer-events:none}.frame-error{position:static;max-width:76px;flex:0 1 auto;overflow:hidden;padding:3px 6px;border-radius:5px;background:var(--surface);color:var(--error);font-size:10px;text-overflow:ellipsis;white-space:nowrap}.frame-error-compact{display:none}.command-backdrop,.customize-backdrop{position:absolute;z-index:50;inset:var(--header-height) 0 0;background:#141f232e;animation:fade-in .19s ease both}.command-backdrop{display:grid;place-items:start center;padding:min(14vh,120px) 16px 24px}:root[data-appearance=dark] .command-backdrop,:root[data-appearance=dark] .customize-backdrop{background:#00000057}.command-palette{width:min(560px,100%);max-height:min(620px,calc(100svh - 150px));overflow:hidden;border:1px solid var(--line);border-radius:16px;background:var(--material);box-shadow:var(--shadow);-webkit-backdrop-filter:blur(16px) saturate(1.06);backdrop-filter:blur(16px) saturate(1.06);animation:palette-in .21s ease both}.command-search{height:56px;display:flex;align-items:center;gap:10px;padding:0 15px;border-bottom:1px solid var(--line)}.command-search .icon{width:19px;height:19px;color:var(--quiet)}.command-search input{min-width:0;flex:1 1 auto;border:0;outline:0;background:transparent;color:var(--text);font-size:15px}.command-search input::placeholder{color:var(--quiet)}.command-search kbd{color:var(--quiet);font-size:10px}.command-results{max-height:min(500px,calc(100svh - 220px));overflow:auto;padding:6px;scrollbar-color:var(--line-strong) transparent}.command-results>button{width:100%;min-height:44px;display:flex;align-items:center;justify-content:space-between;gap:14px;padding:0 11px;border:0;border-radius:9px;background:transparent;color:var(--text);font-size:12px;text-align:left;cursor:pointer}.command-results>button:hover,.command-results>button.is-active,.command-results>button[aria-selected=true]{background:var(--accent-soft)}.command-results>button[aria-disabled=true]{color:var(--disabled);cursor:default}.command-results>button kbd{color:var(--quiet);font-size:10px}.command-results>button small{max-width:56%;color:var(--quiet);font-size:10px;line-height:1.35;text-align:right}.command-results>p{margin:0;padding:32px 18px;color:var(--muted);font-size:12px;text-align:center}.shortcut-backdrop{padding-top:min(10vh,76px)}.shortcut-panel{width:min(720px,100%);max-height:min(680px,calc(100svh - 120px));overflow:auto;border:1px solid var(--line);border-radius:16px;background:var(--surface);box-shadow:var(--shadow);animation:palette-in .21s ease both;scrollbar-color:var(--line-strong) transparent}.shortcut-heading,.vim-heading{display:flex;align-items:flex-start;justify-content:space-between;gap:18px}.shortcut-heading{min-height:66px;padding:15px 16px 12px 18px;border-bottom:1px solid var(--line)}.shortcut-heading strong,.shortcut-heading span,.vim-heading strong,.vim-heading span{display:block}.shortcut-heading strong{color:var(--text);font-size:14px;font-weight:650}.shortcut-heading span,.vim-heading span{margin-top:3px;color:var(--quiet);font-size:10px}.shortcut-groups{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,13.5em),1fr));gap:12px 16px;padding:4px 18px 14px}.shortcut-groups>section{min-width:0;padding:13px 0 4px}.shortcut-groups>section+section{padding-left:0;border-left:0}.shortcut-groups h3{margin:0 0 7px;color:var(--muted);font-size:10px;font-weight:650;letter-spacing:.06em;text-transform:uppercase}.shortcut-row{min-height:32px;display:grid;grid-template-columns:minmax(7em,max-content) minmax(0,1fr);align-items:center;gap:9px;color:var(--muted);font-size:10px}.shortcut-row>span{min-width:0;overflow-wrap:anywhere}.shortcut-row kbd{width:fit-content;max-width:100%;padding:3px 5px;border:1px solid var(--line);border-radius:5px;background:var(--surface);color:var(--text);font-size:9px;white-space:nowrap}.vim-shortcuts{padding:14px 18px 17px;border-top:1px solid var(--line)}.vim-heading{align-items:center}.vim-heading strong{color:var(--text);font-size:11px;font-weight:650}.vim-shortcut-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,11.5em),1fr));gap:0 12px;margin-top:9px;transition:opacity .18s ease}.vim-shortcuts:not(.is-active) .vim-shortcut-grid{opacity:.62}.customize-sheet{position:absolute;z-index:51;top:12px;right:14px;bottom:14px;width:min(376px,calc(100% - 28px));overflow:auto;padding:17px 18px 18px;border:1px solid var(--line);border-radius:16px;background:var(--material);box-shadow:var(--shadow);-webkit-backdrop-filter:blur(16px) saturate(1.06);backdrop-filter:blur(16px) saturate(1.06);animation:sheet-in .21s ease both;scrollbar-color:var(--line-strong) transparent}.render-sheet{bottom:auto;max-height:calc(100svh - var(--header-height) - 26px);background:var(--surface);-webkit-backdrop-filter:none;backdrop-filter:none}.sheet-heading{min-height:36px;align-items:flex-start;padding-bottom:11px}.settings-section{padding:14px 0;border-top:1px solid var(--line)}.settings-section h3{margin:0 0 10px;color:var(--muted);font-size:10px;font-weight:650;letter-spacing:.06em;text-transform:uppercase}.settings-section>small{display:block;margin-top:8px;color:var(--quiet);font-size:10px;line-height:1.4}.settings-link{width:100%;min-height:38px;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:0;border:0;border-top:1px solid var(--line);background:transparent;color:var(--muted);font-size:11px;cursor:pointer}.settings-link:hover{color:var(--text)}.settings-link kbd{color:var(--quiet);font-size:10px}.keyboard-settings .toggle-row{min-height:38px}.inline-settings{display:grid;gap:7px}.inline-setting{display:grid;grid-template-columns:76px minmax(0,1fr);align-items:center;gap:9px}.inline-setting>span{color:var(--muted);font-size:10px}.customize-pair{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));column-gap:14px;border-top:1px solid var(--line)}.customize-pair .settings-section{min-width:0;border-top:0}#customize-sheet .settings-section{padding:12px 0}.geometry-settings{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px}.slider-settings .geometry-settings label{min-width:0;min-height:44px;grid-template-columns:1fr;align-content:center;gap:2px}.settings-segmented{min-height:36px;border-radius:9px}.settings-segmented button{min-height:32px;border-radius:7px;font-size:10px}.settings-choice{width:100%;min-height:54px;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:8px 10px;border:1px solid transparent;border-radius:9px;background:transparent;color:var(--text);text-align:left;cursor:pointer}.settings-choice:hover,.settings-choice.is-active{background:var(--surface-soft)}.settings-choice.is-active{border-color:color-mix(in srgb,var(--accent) 32%,var(--line))}.settings-choice strong,.settings-choice small{display:block}.settings-choice strong{font-size:11px;font-weight:600}.settings-choice small{margin-top:3px;color:var(--quiet);font-size:10px}.settings-choice .icon{width:15px;height:15px;color:var(--accent)}.render-presets{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px}.render-presets button{min-height:54px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;padding:0 6px;border:1px solid var(--line);border-radius:9px;background:transparent;color:var(--text);cursor:pointer}.render-presets button:hover{border-color:var(--line-strong);background:var(--surface-soft)}.render-presets button.is-active{border-color:color-mix(in srgb,var(--accent) 32%,var(--line));background:var(--accent-soft)}.render-presets strong{font-size:11px;font-weight:600}.render-presets small{color:var(--muted);font-family:var(--numeric);font-size:10px}.render-size{display:grid;grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);align-items:end;gap:8px}.render-size label{display:grid;gap:6px;color:var(--muted);font-size:10px}.render-size input{min-width:0;width:100%;height:38px;padding:0 9px;border:1px solid var(--line);border-radius:8px;background:var(--surface);color:var(--text);font-family:var(--numeric);font-size:11px}.render-size>i{padding-bottom:11px;color:var(--quiet);font-style:normal;font-size:11px}.render-options-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));column-gap:14px;border-top:1px solid var(--line)}.render-options-grid .settings-section{min-width:0;border-top:0}.slider-settings label{min-height:38px;display:grid;grid-template-columns:86px minmax(0,1fr);align-items:center;gap:10px}.slider-settings label>span{display:flex;align-items:center;justify-content:space-between;gap:8px;color:var(--muted);font-size:10px}.slider-settings output{color:var(--text);font-size:10px}.sheet-actions{position:sticky;z-index:1;bottom:-18px;display:flex;justify-content:flex-end;gap:6px;margin:0 -18px -18px;padding:12px 18px 18px;border-top:1px solid var(--line);background:var(--surface)}.sheet-actions>button{min-height:38px;padding:0 13px;border:0;border-radius:8px;background:transparent;color:var(--muted);font-size:11px;cursor:pointer}.sheet-actions>button:hover{background:var(--surface-soft);color:var(--text)}.sheet-actions>button.primary{background:var(--accent);color:#fff;font-weight:600}.sheet-actions>button:disabled,.render-presets button:disabled,.render-sheet .icon-button:disabled{opacity:.5;cursor:default}.drop-overlay{position:absolute;z-index:60;inset:var(--header-height) 0 0;display:grid;place-items:center;padding:24px;background:color-mix(in srgb,var(--canvas) 82%,transparent);-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);pointer-events:none;animation:fade-in .15s ease both}.drop-overlay>div{min-width:min(340px,90vw);padding:28px 32px;border:1px solid color-mix(in srgb,var(--accent) 52%,var(--line));border-radius:16px;background:var(--material);box-shadow:var(--shadow);color:var(--text);text-align:center}.drop-overlay .icon{width:27px;height:27px;margin:0 auto 10px;color:var(--accent)}.drop-overlay strong,.drop-overlay span{display:block}.drop-overlay strong{font-size:16px;font-weight:650}.drop-overlay span{margin-top:6px;color:var(--muted);font-size:11px}.notice{position:absolute;z-index:45;left:50%;bottom:78px;max-width:min(440px,calc(100% - 32px));max-height:min(120px,calc(100% - 24px));overflow:hidden;overflow-wrap:anywhere;padding:9px 13px;border:1px solid var(--line);border-radius:9px;background:var(--material);box-shadow:0 4px 15px #1f333917;color:var(--text);font-size:11px;line-height:1.35;white-space:normal;transform:translate(-50%);animation:notice-in .19s ease both}.notice>span{min-width:0;overflow-wrap:anywhere}.notice.is-error{width:min(440px,calc(100% - 16px));max-width:min(440px,calc(100% - 16px));display:grid;grid-template-columns:minmax(0,1fr) 44px;align-items:start;gap:6px;border-color:color-mix(in srgb,var(--error) 30%,var(--line))}.notice.is-error>span{max-height:100px;overflow:auto;overscroll-behavior:contain;scrollbar-color:var(--line-strong) transparent;scrollbar-gutter:stable}.notice-dismiss{width:44px;height:44px;display:grid;place-items:center;margin:-6px -8px -6px 0;padding:0;border:0;border-radius:6px;background:transparent;color:var(--muted);cursor:pointer}.notice-dismiss:hover{background:var(--surface-soft);color:var(--text)}.notice-dismiss .icon{width:16px;height:16px}.notice.is-busy:before{content:"";width:7px;height:7px;display:inline-block;margin-right:8px;border-radius:50%;background:var(--accent);animation:pulse 1.1s ease-in-out infinite}.centered-state{position:absolute;z-index:18;inset:var(--header-height) 0 0;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px;background:var(--canvas);text-align:center}.centered-state h1{margin:18px 0 0;font-size:17px;font-weight:650;letter-spacing:-.01em}.centered-state p{max-width:360px;margin:7px 0 0;color:var(--muted);font-size:12px;line-height:1.5}.centered-state button{min-height:40px;display:inline-flex;align-items:center;gap:7px;margin-top:17px;padding:0 13px;border:1px solid var(--line);border-radius:9px;background:var(--surface);color:var(--text);font-size:11px;cursor:pointer}.centered-state button:hover{border-color:var(--accent);color:var(--accent)}.state-orbit{position:relative;width:48px;height:48px}.state-orbit i{position:absolute;inset:13px 2px;border:1px solid var(--muted);border-radius:50%;transform:rotate(30deg)}.state-orbit i:nth-child(2){transform:rotate(-30deg)}.state-orbit b{position:absolute;top:21px;left:21px;width:6px;height:6px;border-radius:50%;background:var(--accent)}.state-orbit.is-busy{animation:orbit-spin 1.8s linear infinite}@keyframes pop-in{0%{opacity:0;transform:translateY(-5px) scale(.985)}}@keyframes palette-in{0%{opacity:0;transform:translateY(-8px) scale(.985)}}@keyframes sheet-in{0%{opacity:0;transform:translate(12px) scale(.99)}}@keyframes mobile-sheet-in{0%{opacity:0;transform:translateY(18px) scale(.99)}}@keyframes notice-in{0%{opacity:0;transform:translate(-50%,6px)}}@keyframes fade-in{0%{opacity:0}}@keyframes orbit-spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.35}}@media(max-width:760px){.panel-button,.render-button{min-width:44px;flex-shrink:0}.scene-status,.command-button{display:none}.topbar{padding-right:4px}.open-button,.customize-button,.more-button,.icon-button{min-width:44px;height:44px}.more-menu button,.profile-strip button,.representation-grid button,.image-presets button,.scene-actions button,.sheet-actions>button,.centered-state button{min-height:44px}.mini-segmented,.settings-segmented{min-height:48px}.mini-segmented button,.settings-segmented button{min-height:44px}.image-axis{min-height:48px}.image-axis select,.speed-control select,.plot-label select,.render-size input,input[type=range]{height:44px}.toggle-row>button[role=switch],.vim-heading>button[role=switch]{width:44px;height:44px;background:transparent}.toggle-row>button[role=switch]:before,.vim-heading>button[role=switch]:before{content:"";position:absolute;top:12px;left:5px;width:34px;height:20px;border-radius:999px;background:var(--line-strong);transition:background-color .19s ease}.toggle-row>button[role=switch] i,.vim-heading>button[role=switch] i{top:15px;left:8px}.toggle-row>button[role=switch][aria-checked=true],.vim-heading>button[role=switch][aria-checked=true]{background:transparent}.toggle-row>button[role=switch][aria-checked=true]:before,.vim-heading>button[role=switch][aria-checked=true]:before{background:var(--accent)}.scene-control{top:calc(var(--header-height) + 8px);left:8px}.scene-popover{position:fixed;z-index:40;inset:auto 8px 70px;width:auto;max-height:min(68svh,610px);border-radius:16px;animation-name:mobile-sheet-in}.orientation-control{top:calc(var(--header-height) + 8px);right:8px}.orientation-control button{min-width:44px;height:44px}.inspector{position:fixed;z-index:36;inset:auto 8px 70px;width:auto;max-height:min(56svh,520px);opacity:0;transform:translateY(18px) scale(.99);transform-origin:bottom center}.inspector.is-open{opacity:1;transform:translateY(0) scale(1)}.timeline{bottom:8px;width:calc(100% - 16px);padding-inline:5px;border-radius:13px}.transport-row{gap:4px}.transport-button,.play-button{width:44px;height:44px}.frame-counter{min-width:58px;font-size:10px}.speed-control select{width:46px}.plot-row{height:72px;gap:7px}.plot-label{width:74px}.plot-range{display:none}.notice{bottom:72px}.command-backdrop{position:fixed;inset:0;align-items:end;padding:8px}.command-palette{max-height:min(74svh,620px);border-radius:17px;animation-name:mobile-sheet-in}.command-results{max-height:calc(74svh - 56px)}.command-results>button{min-height:48px}.shortcut-panel{max-height:calc(100svh - 16px);border-radius:17px;animation-name:mobile-sheet-in}.shortcut-groups{grid-template-columns:1fr}.shortcut-groups>section{padding:13px 0 8px}.shortcut-groups>section+section{padding-left:0;border-top:1px solid var(--line);border-left:0}.vim-shortcut-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.customize-backdrop{position:fixed;inset:0}.customize-sheet{position:absolute;inset:auto 8px 8px;width:auto;max-height:min(78svh,660px);border-radius:17px;animation-name:mobile-sheet-in}.render-sheet{max-height:calc(100svh - 68px)}.toggle-row,.choice-row{min-height:48px}}.scrubber-shell{position:relative;min-width:40px;flex:1 1 auto}.scrubber-shell .scrubber{width:100%}.trajectory-marker-rail{position:absolute;right:6px;bottom:2px;left:6px;height:8px;pointer-events:none}.trajectory-marker{position:absolute;top:-8px;width:24px;height:24px;margin:0;padding:0;border:0;background:transparent;cursor:pointer;pointer-events:auto;transform:translate(-50%)}.trajectory-marker:after{position:absolute;top:9px;left:11px;width:3px;height:6px;border-radius:2px;background:var(--quiet);content:""}.trajectory-marker.is-reference:after{top:8px;left:8px;width:7px;height:7px;border:1px solid var(--surface);border-radius:1px;background:var(--accent);transform:rotate(45deg)}.timeline-options>div{max-height:min(620px,calc(100vh - var(--header-height) - var(--timeline-height) - 24px));overflow-y:auto}.timeline-action-list{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:4px}.timeline-action-list button{min-width:0;min-height:32px;overflow:hidden;padding:0 8px;border:1px solid var(--line-soft);border-radius:5px;background:var(--surface);color:var(--text);font-size:10px;text-align:left;text-overflow:ellipsis;white-space:nowrap;cursor:pointer}.timeline-action-list button:hover{border-color:var(--line-strong);background:var(--surface-soft)}.timeline-action-list button:disabled{opacity:.42;cursor:default}@media(max-width:760px){.timeline-action-list button{min-height:40px}}.measurement-plot__header{overflow:hidden}.measurement-plot__meta{min-width:72px;max-width:220px;flex:0 1 220px;display:flex;align-items:baseline;gap:7px;overflow:hidden}.measurement-plot__meta strong{min-width:0;overflow:hidden;color:var(--text);font-family:Inter,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;font-size:12px;font-weight:650;text-overflow:ellipsis;white-space:nowrap}.measurement-plot__meta span{flex:0 0 auto;white-space:nowrap}.measurement-plot__legend{min-width:0;flex:1 1 auto;display:flex;align-items:center;gap:3px;overflow-x:auto;scrollbar-width:none}.measurement-plot__legend::-webkit-scrollbar{display:none}.measurement-plot__legend-item{min-width:0;height:26px;display:inline-flex;flex:0 1 auto;align-items:center;gap:5px;overflow:hidden;padding:0 6px;border:0;border-radius:5px;background:transparent;color:var(--muted);font-size:11px;white-space:nowrap}button.measurement-plot__legend-item{cursor:pointer}button.measurement-plot__legend-item:hover{background:var(--surface-soft);color:var(--text)}.measurement-plot__legend-item>span:not(.measurement-plot__legend-swatch){max-width:150px;overflow:hidden;text-overflow:ellipsis}.measurement-plot__legend-item output{color:var(--text);font-family:var(--numeric)}.measurement-plot__legend-swatch{width:8px;height:2px;flex:0 0 auto;border-radius:2px}.measurement-plot__header-actions,.measurement-plot__context-actions{flex:0 0 auto;display:flex;align-items:center}.measurement-plot__close{width:30px;min-width:30px!important;padding:0!important;font-size:17px!important;font-weight:400!important}.rdf-view-toggle{display:flex;padding:2px;border-radius:5px;background:var(--surface-soft)}.rdf-view-toggle button{min-width:38px;height:26px;padding:0 7px;border:0;border-radius:4px;background:transparent;color:var(--muted);font:600 10px var(--numeric);cursor:pointer}.rdf-view-toggle button.is-active{background:var(--surface);color:var(--accent);box-shadow:0 1px 3px color-mix(in srgb,var(--text) 12%,transparent)}.rdf-sheet{position:absolute;z-index:42;bottom:calc(var(--timeline-height) + 12px);left:50%;width:min(390px,calc(100% - 24px));max-height:calc(100svh - var(--header-height) - var(--timeline-height) - 24px);display:grid;grid-template-rows:auto minmax(0,1fr) auto;overflow:hidden;border:1px solid var(--line);border-radius:10px;background:var(--surface);box-shadow:0 14px 44px color-mix(in srgb,var(--text) 16%,transparent);transform:translate(-50%)}.rdf-sheet>header,.rdf-sheet>footer{min-height:44px;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:0 12px}.rdf-sheet>header{border-bottom:1px solid var(--line-soft)}.rdf-sheet>header strong{font-size:12px}.rdf-sheet>header button{width:32px;height:32px;padding:0;border:0;border-radius:5px;background:transparent;color:var(--muted);font-size:18px;cursor:pointer}.rdf-sheet__body{display:grid;gap:8px;overflow-y:auto;overscroll-behavior:contain;padding:12px}.rdf-sheet__body>label,.rdf-sheet__body details>div>label{display:grid;grid-template-columns:64px minmax(0,1fr);align-items:center;gap:9px;color:var(--muted);font-size:10px}.rdf-sheet select,.rdf-sheet input{width:100%;height:36px;min-width:0;padding:0 9px;border:1px solid var(--line);border-radius:6px;background:var(--surface);color:var(--text);font-size:11px}.rdf-sheet__body details{padding-top:2px}.rdf-sheet__body summary{color:var(--muted);font-size:10px;cursor:pointer}.rdf-sheet__body details>div{display:grid;gap:8px;padding-top:8px}.rdf-sheet>footer{border-top:1px solid var(--line-soft);color:var(--quiet);font-size:11px}.rdf-sheet>footer button{min-width:72px;height:34px;border:0;border-radius:6px;background:var(--accent);color:var(--surface);font-size:10px;font-weight:650;cursor:pointer}.rdf-sheet>footer button:disabled{opacity:.35;cursor:default}.pinned-measurements{display:block;max-width:none;max-height:none;overflow:visible;padding:0}.pinned-measurements>summary{height:34px;display:flex;align-items:center;padding:0 11px;border:1px solid var(--line);border-radius:8px;background:color-mix(in srgb,var(--surface) 94%,transparent);box-shadow:0 3px 12px color-mix(in srgb,var(--text) 7%,transparent);color:var(--muted);font-size:10px;font-weight:650;cursor:pointer;list-style:none}.pinned-measurements>summary::-webkit-details-marker{display:none}.pinned-measurements[open]>summary{border-color:var(--line-strong);color:var(--text)}.pinned-measurements>section{position:absolute;top:calc(100% + 6px);left:0;width:min(360px,calc(100vw - 24px));overflow:hidden;border:1px solid var(--line);border-radius:9px;background:var(--surface);box-shadow:var(--shadow)}.pinned-measurements>section>header{min-height:40px;display:flex;align-items:center;justify-content:space-between;padding:0 8px 0 11px;border-bottom:1px solid var(--line-soft)}.pinned-measurements>section>header strong{font-size:10px}.pinned-measurements>section>header button{height:30px;padding:0 9px;border:0;border-radius:5px;background:var(--accent-soft);color:var(--accent);font-size:10px;font-weight:650;cursor:pointer}.pinned-measurements__list{max-height:250px;overflow-y:auto;padding:5px}.pinned-measurements__list>div{min-width:0;display:flex;align-items:stretch}.pinned-measurements .selection-chip{flex:1 1 auto;width:auto;max-width:none;box-shadow:none}@media(max-width:520px){.measurement-plot__meta{max-width:92px;flex-basis:92px}.measurement-plot__meta span{display:none}.measurement-plot__legend-item>span:not(.measurement-plot__legend-swatch){max-width:82px}.measurement-plot__actions button{min-width:36px;width:36px;padding-inline:3px}.rdf-sheet{bottom:calc(var(--timeline-height) + 8px);width:calc(100% - 16px)}.rdf-sheet select,.rdf-sheet input,.rdf-sheet>footer button{height:40px}.rdf-sheet>header button{width:40px;height:40px}.pinned-measurements{top:calc(var(--header-height) + 58px)}.selection-bar .selection-track-button{display:none}}@media(max-height:420px){.pinned-measurements[open]{z-index:45}.pinned-measurements>section{position:fixed;top:calc(var(--header-height) + 100px);bottom:calc(var(--timeline-height) + 8px);left:8px;width:min(360px,calc(100vw - 16px));display:grid;grid-template-rows:auto minmax(0,1fr)}.pinned-measurements__list{min-height:0;max-height:none;overscroll-behavior:contain}}@media(max-width:380px){.rdf-view-toggle button{min-width:34px;padding-inline:5px}}@media(max-width:520px){.identity>div{display:block}.identity strong,.identity span:last-child{display:block}.identity span:last-child{max-width:42vw;margin-top:2px;font-size:10px}.identity-mark{width:27px;height:27px}.open-button{width:44px;padding:0;font-size:0}.open-button .icon{width:18px;height:18px}.scene-trigger>span{display:none}.scene-trigger>strong{max-width:178px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.orientation-control button{min-width:44px;padding-inline:5px}.transport-buttons .transport-button:first-child,.transport-buttons .transport-button:last-child{width:44px}.frame-counter{min-width:54px}.speed-control select{width:42px;padding-inline:1px}}.workspace.timeline-absent{--timeline-height: 0px;--selection-bottom: 14px}.workspace.timeline-present{--timeline-height: 56px;--selection-bottom: 68px}.canvas-controls>button.is-active{background:var(--accent-soft);color:var(--accent);font-weight:650}.section-label{display:block;margin-bottom:8px;color:var(--quiet);font-size:11px;font-weight:700;letter-spacing:.075em;line-height:1.2;text-transform:uppercase}.section-label-spaced{margin-top:14px}.segmented-options{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:2px;padding:2px;border:1px solid var(--line);border-radius:8px;background:var(--surface-soft)}.segmented-options button{min-width:0;min-height:34px;padding:0 6px;border:1px solid transparent;border-radius:5px;background:transparent;color:var(--muted);font-size:12px;cursor:pointer}.segmented-options button:hover:not(:disabled){color:var(--text)}.segmented-options button.is-active{border-color:var(--line);background:var(--surface);color:var(--accent);font-weight:650}.representation-options{grid-template-columns:repeat(2,minmax(0,1fr))}.display-toggles .section-label{margin:4px 0 2px}.display-toggles .vector-scale-row+.toggle-row{border-top:1px solid var(--line)}.vector-scale-row{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:2px 10px;padding:1px 0 9px 12px;color:var(--muted);font-size:12px}.vector-scale-row input{grid-column:1 / -1;min-width:0}.vector-scale-row output{color:var(--text);font-size:11px}.selection-bar{position:absolute;z-index:16;bottom:var(--selection-bottom);left:50%;width:max-content;max-width:min(640px,calc(100% - 24px));min-height:48px;display:flex;align-items:center;gap:10px;padding:5px 5px 5px 13px;border:1px solid var(--line);border-radius:9px;background:var(--surface);box-shadow:0 5px 18px color-mix(in srgb,var(--text) 10%,transparent);transform:translate(-50%)}.selection-readout{min-width:0;flex:1 1 auto;display:flex;align-items:baseline;gap:9px;overflow:hidden}.selection-readout strong,.selection-readout output{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.selection-readout strong{min-width:0;flex:1 1 auto;font-size:11px}.selection-readout output{flex:0 1 auto;max-width:100%;color:var(--accent);font-size:10px}.selection-hint{color:var(--quiet);font-size:10px;white-space:nowrap}.selection-bar>button:not(.icon-button){flex:0 0 auto;min-width:56px;height:36px;padding:0 9px;border:0;border-radius:5px;background:transparent;color:var(--accent);font-size:10px;font-weight:650;cursor:pointer}.selection-bar>button:not(.icon-button):hover{background:var(--accent-soft)}.selection-bar .measurement-mode[aria-pressed=true]{background:var(--accent-soft)}.measurement-mode-compact{display:none}.selection-bar .icon-button{width:36px;padding:0}.timeline,.timeline.is-compact{height:var(--timeline-height);overflow:visible;padding:0 10px}.timeline .transport-row{min-height:var(--timeline-height);gap:9px}.transport-buttons{gap:0}.transport-button,.play-button{width:36px;height:40px;border-radius:5px}.play-button{color:var(--accent)}.frame-counter{min-width:66px;font-variant-numeric:tabular-nums}.frame-counter-compact{display:none}.frame-metadata{max-width:140px;overflow:hidden;color:var(--muted);font-family:var(--numeric);font-size:10px;text-overflow:ellipsis;white-space:nowrap}.timeline-options{position:relative;flex:0 0 auto}.timeline-options>summary{width:40px;height:40px;display:grid;place-items:center;border-radius:5px;color:var(--muted);cursor:pointer;list-style:none}.timeline-options>summary::-webkit-details-marker{display:none}.timeline-options>summary:hover,.timeline-options[open]>summary{background:var(--surface-soft);color:var(--text)}.timeline-options>div{position:absolute;right:0;bottom:calc(100% + 8px);width:244px;display:grid;gap:10px;padding:12px;border:1px solid var(--line);border-radius:9px;background:var(--surface);box-shadow:var(--shadow)}.timeline-options>div>label{min-height:34px;display:grid;grid-template-columns:1fr 112px;align-items:center;gap:12px;color:var(--muted);font-size:10px}.timeline-options select{width:100%;height:34px;padding:0 24px 0 8px;border:1px solid var(--line);border-radius:5px;background:var(--surface);color:var(--text);font-size:10px}.timeline-options .section-label{margin:3px 0 -3px}.workspace.timeline-present .notice{bottom:calc(var(--timeline-height) + 12px)}.workspace.selection-present .notice{bottom:calc(var(--selection-bottom) + 58px)}@media(min-width:761px){.workbench-open .selection-bar{left:calc((100% - var(--workbench-width) - 24px) / 2);max-width:calc(100% - var(--workbench-width) - 48px)}}@media(max-width:760px){.canvas-controls{right:8px;left:8px;width:auto;height:50px}.canvas-controls>button{min-width:0;height:44px;flex:1 1 0}.frame-metadata{display:none}.selection-bar{max-width:calc(100% - 16px);min-height:52px;gap:5px;padding:4px 4px 4px 11px}.selection-readout{flex:1 1 auto;flex-direction:column;align-items:flex-start;gap:1px}.selection-bar>button:not(.icon-button),.selection-bar .icon-button,.timeline-options>summary{height:44px}}@media(max-width:520px){.workspace.selection-present .workbench{max-height:calc(100% - var(--header-height) - var(--timeline-height) - 80px)}.transport-buttons .transport-button:first-child,.transport-buttons .transport-button:last-child{display:none}.timeline,.timeline.is-compact{padding-inline:4px}.timeline .transport-row{gap:4px}.transport-button,.play-button{width:40px;height:44px}.scrubber{min-width:36px}.frame-counter{min-width:54px;font-size:10px}.timeline-options>div{position:fixed;right:8px;bottom:calc(var(--timeline-height) + 8px);width:min(244px,calc(100vw - 16px))}}@media(max-width:360px){.speed-control{display:none}.representation-grid{grid-template-columns:1fr}}@media(max-width:340px){.orientation-control{top:calc(var(--header-height) + 60px)}}@media(prefers-reduced-motion:reduce){*,*:before,*:after{scroll-behavior:auto!important;animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}:root{--header-height: 48px;--viewport-toolbar-height: 46px;--workbench-width: 344px}.workspace{--timeline-height: 126px;background:var(--canvas)}.workspace.timeline-compact{--timeline-height: 58px}.molecule-canvas,.canvas-field{top:calc(var(--header-height) + var(--viewport-toolbar-height));width:100%;height:calc(100% - var(--header-height) - var(--viewport-toolbar-height) - var(--timeline-height));transition:width .18s ease}.workbench-open .molecule-canvas,.workbench-open .canvas-field{width:calc(100% - var(--workbench-width))}.topbar{height:var(--header-height);padding:0 8px 0 12px;gap:12px;background:var(--surface);box-shadow:none}.identity-mark{width:30px;height:30px}.identity strong{font-size:13px}.topbar-tools,.panel-button,.inspect-button,.render-button{display:flex;align-items:center}.topbar-tools{gap:4px}.open-button,.panel-button,.inspect-button,.render-button,.command-button,.more-button,.icon-button{min-width:36px;height:34px;border-radius:7px}.open-button,.panel-button,.inspect-button,.render-button{gap:7px;padding:0 10px;border:1px solid transparent;background:transparent;color:var(--muted);font-size:11px;cursor:pointer}.open-button:hover,.panel-button:hover,.panel-button[aria-expanded=true],.inspect-button:hover,.inspect-button[aria-expanded=true]{border-color:var(--line);background:var(--surface-soft);color:var(--text)}.render-button{border-color:var(--accent);background:var(--accent);color:#fff;font-weight:600}.render-button:hover:not(:disabled){background:color-mix(in srgb,var(--accent) 88%,#000)}.render-button:disabled{border-color:var(--line);background:var(--surface-soft);color:var(--disabled);cursor:default}.figure-control{display:flex;align-items:center}.figure-control .render-button{border-radius:7px 0 0 7px}.figure-options-button{width:30px;height:34px;display:grid;place-items:center;padding:0;border:1px solid var(--accent);border-left-color:color-mix(in srgb,var(--accent) 68%,#fff);border-radius:0 7px 7px 0;background:var(--accent);color:#fff;cursor:pointer}.figure-options-button:hover:not(:disabled),.figure-options-button[aria-expanded=true]{background:color-mix(in srgb,var(--accent) 84%,#000)}.figure-options-button:disabled{border-color:var(--line);background:var(--surface-soft);color:var(--disabled);cursor:default}.figure-options-button .icon{width:15px;height:15px}.open-button:disabled,.panel-button:disabled,.inspect-button:disabled,.command-button:disabled,.more-button:disabled{color:var(--disabled);cursor:default;opacity:.52}.panel-button .icon,.render-button .icon{width:16px;height:16px}.viewport-toolbar{position:absolute;z-index:11;top:var(--header-height);left:0;right:0;height:var(--viewport-toolbar-height);display:flex;align-items:center;gap:4px;padding:0 10px;border-bottom:1px solid var(--line);background:color-mix(in srgb,var(--surface) 94%,var(--canvas));transition:right .18s ease}.workbench-open .viewport-toolbar{right:var(--workbench-width)}.viewport-preset{min-width:58px;color:var(--muted);font-size:10px;font-weight:650;letter-spacing:.05em;text-transform:uppercase}.viewport-toolbar>label{height:32px;display:flex;align-items:center;gap:3px;padding:0 3px 0 9px;border:1px solid var(--line);border-radius:6px;background:var(--surface)}.viewport-toolbar>label>span{color:var(--quiet);font-size:11px;font-weight:600;text-transform:uppercase}.viewport-toolbar select{height:30px;max-width:126px;padding:0 24px 0 5px;border:0;background:transparent;color:var(--text);font-size:11px;font-weight:550;cursor:pointer}.viewport-toolbar>button{height:32px;padding:0 9px;border:1px solid transparent;border-radius:6px;background:transparent;color:var(--muted);font-size:10px;cursor:pointer}.viewport-toolbar>button:hover,.viewport-toolbar>button.is-active{border-color:var(--line);background:var(--surface);color:var(--text)}.viewport-toolbar>button.is-active{color:var(--accent);font-weight:650}.viewport-divider{width:1px;height:22px;margin:0 3px;background:var(--line)}.viewport-toolbar .orientation-control{position:static;display:flex;margin-left:auto;padding:0;border:0;border-radius:0;background:transparent;box-shadow:none;-webkit-backdrop-filter:none;backdrop-filter:none}.viewport-toolbar .orientation-control button{min-width:34px;height:32px;padding:0 6px;border-radius:6px}.viewport-toolbar .orientation-control button .icon{width:16px;height:16px}.mobile-view-select{display:none!important}.viewport-toolbar button:disabled,.viewport-toolbar select:disabled,.workbench button:disabled,.timeline button:disabled,.timeline select:disabled,.timeline input:disabled{cursor:default;opacity:.48}.workbench{position:absolute;z-index:18;top:var(--header-height);right:0;bottom:0;width:var(--workbench-width);display:flex;flex-direction:column;overflow:hidden;border-left:1px solid var(--line);background:var(--surface);animation:workbench-in .18s ease both}.molecule-stage-3dmol{overflow:hidden;background:#f3f5f2}.molecule-stage-3dmol>canvas{display:block;width:100%!important;height:100%!important}.publication-renderer-source{position:absolute;z-index:-1;inset:0;visibility:hidden;pointer-events:none}.preset-options{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:5px}.preset-options button{min-width:0;min-height:34px;padding:0 9px;border:1px solid var(--line);border-radius:7px;background:var(--surface);color:var(--muted);font-size:10px;cursor:pointer}.preset-options button:hover:not(:disabled){border-color:color-mix(in srgb,var(--accent) 30%,var(--line));color:var(--text)}.preset-options button.is-active{border-color:color-mix(in srgb,var(--accent) 48%,var(--line));background:var(--accent-soft);color:var(--accent);font-weight:650}.preset-options button:disabled{cursor:default;opacity:.45}.workbench[hidden],.workbench-pane[hidden]{display:none}@keyframes workbench-in{0%{opacity:0;transform:translate(12px)}to{opacity:1;transform:translate(0)}}.workbench-tabs{height:43px;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));flex:0 0 auto;border-bottom:1px solid var(--line)}.workbench-tabs button{position:relative;border:0;background:transparent;color:var(--muted);font-size:12px;font-weight:600;cursor:pointer}.workbench-tabs button:hover,.workbench-tabs button.is-active{color:var(--text)}.workbench-tabs button.is-active:after{content:"";position:absolute;right:18px;bottom:-1px;left:18px;height:2px;background:var(--accent)}.workbench-heading{min-height:62px;display:flex;align-items:center;justify-content:space-between;gap:12px;flex:0 0 auto;padding:10px 12px 10px 16px;border-bottom:1px solid var(--line)}.workbench-heading strong,.workbench-heading span{display:block}.workbench-heading strong{color:var(--text);font-size:14px;font-weight:650}.workbench-heading span{margin-top:2px;color:var(--muted);font-size:12px}.workbench-expand-button{display:none}.workbench-body{min-height:0;flex:1 1 auto;overflow:auto;scrollbar-color:var(--line-strong) transparent}.workbench-footer{min-height:43px;display:flex;align-items:stretch;flex:0 0 auto;border-top:1px solid var(--line);background:var(--surface)}.workbench-footer button{min-width:0;display:flex;align-items:center;gap:6px;flex:1 1 0;padding:0 10px;border:0;background:transparent;color:var(--muted);font-size:10px;cursor:pointer}.workbench-footer button:hover{background:var(--surface-soft);color:var(--text)}.workbench-footer button+button{border-left:1px solid var(--line)}.render-workbench-footer{min-height:54px;padding:8px 10px;gap:8px}.render-workbench-footer button{min-height:36px;justify-content:center;border:1px solid var(--line);border-radius:6px;font-weight:600}.render-workbench-footer button+button{border-left:1px solid var(--accent)}.render-workbench-footer .primary{border-color:var(--accent);background:var(--accent);color:#fff}.render-workbench-footer .primary:hover:not(:disabled){background:color-mix(in srgb,var(--accent) 88%,#000)}.workbench-footer .icon{width:14px;height:14px}.workbench-footer kbd{margin-left:auto;color:var(--quiet);font-size:9px}.workbench-section{padding:14px 16px}.workbench-section+.workbench-section{border-top:1px solid var(--line)}.workbench-section>h3,.workbench-section-heading h3,.render-panel .settings-section h3{margin:0 0 9px;color:var(--muted);font-size:11px;font-weight:700;letter-spacing:.08em;text-transform:uppercase}.workbench-section-heading{display:flex;align-items:baseline;justify-content:space-between;gap:10px}.workbench-section-heading span,.workbench-section-heading output{color:var(--quiet);font-family:var(--numeric);font-size:11px}.workbench-section-heading h3{margin-bottom:9px}.workbench .profile-strip{margin:0}.panel-select-row{min-height:40px;display:grid;grid-template-columns:104px minmax(0,1fr);align-items:center;gap:10px;border-top:1px solid var(--line);color:var(--text);font-size:12px}.panel-select-row:first-of-type{border-top:0}.panel-select-row select{min-width:0;height:32px;padding:0 24px 0 8px;border:1px solid var(--line);border-radius:6px;background:var(--surface);color:var(--text);font-size:12px}.panel-details{margin-top:8px;border-top:1px solid var(--line)}.panel-details summary{min-height:38px;display:flex;align-items:center;color:var(--muted);font-size:10px;cursor:pointer}.panel-details[open] summary{color:var(--text)}.panel-details .geometry-settings,.panel-details .image-ranges{padding:2px 0 7px}.layer-heading{min-height:45px;display:flex;align-items:center;justify-content:space-between;gap:12px}.layer-heading strong,.layer-heading span{display:block}.layer-heading strong{font-size:11px;font-weight:600}.layer-heading span{margin-top:2px;color:var(--quiet);font-size:9px}.layer-heading>.toggle-row{min-height:36px}.layer-heading>.toggle-row>span{display:none}.image-heading{margin-top:8px}.panel-slider{display:block;margin-top:8px}.panel-slider>span{display:flex;justify-content:space-between;color:var(--muted);font-size:10px}.panel-slider output{color:var(--text)}.inspector-content{padding:0 16px 16px}.inspector-content .readout-section:first-child{padding-top:14px}.render-panel .settings-section{padding:14px 16px;border-bottom:1px solid var(--line)}.render-panel .render-presets{grid-template-columns:repeat(2,minmax(0,1fr))}.render-panel .render-options-grid{display:block}.render-panel .sheet-actions{position:sticky;bottom:0;margin:0;padding:10px 16px;background:var(--surface)}.render-print-row{min-height:34px;display:flex;align-items:center;justify-content:space-between;gap:12px;color:var(--muted);font-size:10px}.render-print-row select{height:32px;padding:0 24px 0 8px;border:1px solid var(--line);border-radius:6px;background:var(--surface);color:var(--text);font-size:10px}.print-scale-section output{display:block;margin:7px 0 3px;color:var(--text);font-family:var(--numeric);font-size:12px}.render-guide-region{position:absolute;z-index:9;top:calc(var(--header-height) + var(--viewport-toolbar-height));right:0;bottom:var(--timeline-height);left:0;display:grid;place-items:center;overflow:hidden;pointer-events:none;transition:right .18s ease}.workbench-open .render-guide-region{right:var(--workbench-width)}.render-guide{position:relative;flex:0 0 auto;border:1px dashed color-mix(in srgb,var(--accent) 68%,transparent);border-radius:2px;box-shadow:0 0 0 200vmax color-mix(in srgb,var(--canvas) 10%,transparent)}.render-guide span{position:absolute;top:7px;left:8px;padding:2px 5px;border-radius:3px;background:color-mix(in srgb,var(--surface) 90%,transparent);color:var(--accent);font-size:8px;font-weight:700;letter-spacing:.06em;text-transform:uppercase}.workspace.is-rendering .molecule-canvas,.workspace.is-rendering .canvas-field{pointer-events:none}.timeline.is-busy .series-plot svg{pointer-events:none}.command-backdrop,.customize-backdrop{position:fixed;inset:0}.preferences-sheet{width:min(440px,calc(100vw - 24px))}.timeline,.timeline.is-compact{left:0;bottom:0;width:100%;height:var(--timeline-height);min-height:0;padding:5px 12px 8px;border:0;border-top:1px solid var(--line);border-radius:0;background:var(--surface);box-shadow:none;-webkit-backdrop-filter:none;backdrop-filter:none;transform:none;transition:width .18s ease}.timeline .transport-row{min-height:46px}.timeline .plot-row{height:70px}.playback-mode-control select{width:92px;height:32px;padding:0 5px;border:1px solid var(--line);border-radius:6px;background:var(--surface);color:var(--muted);font-size:12px}.notice{bottom:calc(var(--timeline-height) + 12px)}@media(max-width:960px){.viewport-toolbar>label>span,.viewport-preset{display:none}.viewport-toolbar>label{padding-left:3px}.viewport-toolbar>label,.viewport-toolbar>button{min-height:44px}.viewport-toolbar select{height:42px}.viewport-color-control{display:none!important}.viewport-toolbar .orientation-control{display:none}.viewport-toolbar .mobile-view-select{display:flex!important;margin-left:auto}.viewport-toolbar,.workbench-open .viewport-toolbar{overflow-x:auto;scrollbar-width:none}.viewport-toolbar::-webkit-scrollbar{display:none}.playback-mode-control{display:none}}@media(max-width:1100px){.timeline .jump-button{display:none}}@media(max-width:760px){.workspace{--timeline-height: 128px}.workspace.timeline-compact{--timeline-height: 58px}.molecule-canvas,.canvas-field,.workbench-open .molecule-canvas,.workbench-open .canvas-field{width:100%}.topbar{padding-right:4px}.open-button,.panel-button,.render-button,.more-button,.icon-button{width:44px;min-width:44px;height:44px;padding:0;justify-content:center;font-size:0}.panel-button span,.render-button:not(.primary):after{display:none}.viewport-toolbar,.workbench-open .viewport-toolbar{right:0;gap:3px;overflow-x:auto;padding:0 6px;scrollbar-width:none}.viewport-toolbar::-webkit-scrollbar{display:none}.viewport-toolbar>label,.viewport-toolbar>button,.viewport-toolbar .orientation-control{flex:0 0 auto}.viewport-toolbar>label,.viewport-toolbar>button{min-height:44px}.viewport-toolbar select{height:42px;max-width:112px}.viewport-toolbar .orientation-control{display:none}.viewport-toolbar .mobile-view-select{display:flex!important;margin-left:auto}.workbench{position:fixed;top:auto;right:8px;bottom:calc(var(--timeline-height) + 8px);left:8px;width:auto;height:min(44svh,420px);max-height:calc(100svh - var(--header-height) - var(--viewport-toolbar-height) - var(--timeline-height) - 24px);border:1px solid var(--line);border-radius:14px;box-shadow:var(--shadow);animation-name:mobile-sheet-in}.workbench.is-expanded{height:min(68svh,600px)}.workbench-expand-button{width:44px;height:44px;display:grid;place-items:center;border:0;border-radius:7px;background:transparent;color:var(--muted)}.workbench-expand-button[aria-expanded=true] .icon{transform:rotate(180deg)}.workbench-tabs{height:46px}.workbench-heading{min-height:58px}.panel-select-row,.panel-details summary,.layer-heading{min-height:44px}.panel-select-row select,.render-print-row select{height:44px}.workbench-footer,.workbench-footer button{min-height:48px}.render-workbench-footer{min-height:56px}.render-workbench-footer button{min-height:44px}.workbench-open .timeline{width:100%}.workbench-open .render-guide-region{right:0}.timeline .jump-button{display:none}.timeline,.timeline.is-compact{bottom:0;width:100%;padding-inline:6px;border-radius:0}.notice{bottom:calc(var(--timeline-height) + 8px)}}@media(max-width:420px){.identity span:last-child{max-width:31vw}.viewport-toolbar>button{padding-inline:8px}.viewport-color-control{display:none!important}.playback-mode-control{display:none}}@media(max-width:520px){.identity span:last-child{display:none}}@media(max-width:760px)and (max-height:520px){.workspace,.workspace.timeline-compact{--timeline-height: 58px}.timeline .plot-row{display:none}.workbench,.workbench.is-expanded{height:calc(100svh - var(--header-height) - var(--viewport-toolbar-height) - var(--timeline-height) - 16px);max-height:none}.workbench-heading,.workbench-expand-button{display:none}}@media(max-width:340px){.viewport-toolbar,.workbench-open .viewport-toolbar{gap:2px;padding-inline:4px}.viewport-style-control select{width:94px;max-width:94px}.mobile-view-select select{width:50px;padding-right:18px}.viewport-toolbar>button{padding-inline:6px}.viewport-divider{margin-inline:1px}}:root{--header-height: 48px;--viewport-toolbar-height: 0px;--workbench-width: 320px;--export-width: 380px;--figure-panel-reserve: var(--export-width);--figure-panel-gap: 12px}.app-shell,.workspace{min-height:0}.scene-status,.command-button,.viewport-toolbar{display:none}.molecule-canvas,.canvas-field{top:var(--header-height);height:calc(100% - var(--header-height) - var(--timeline-height))}.export-open .molecule-canvas,.export-open .canvas-field{width:calc(100% - var(--export-width))}.canvas-controls{position:absolute;z-index:12;top:calc(var(--header-height) + 10px);right:12px;height:36px;display:flex;align-items:center;padding:2px;border:1px solid var(--line);border-radius:8px;background:var(--surface);box-shadow:0 4px 14px color-mix(in srgb,var(--text) 7%,transparent);transition:right .18s ease}.workbench-open .canvas-controls{right:calc(var(--workbench-width) + 12px)}.export-open .canvas-controls{right:calc(var(--export-width) + 12px)}.canvas-controls>button,.canvas-controls .orientation-control button{min-width:34px;height:30px;padding:0 8px;border:0;border-radius:6px;background:transparent;color:var(--muted);font-size:10px;cursor:pointer}.canvas-controls>button:hover,.canvas-controls .orientation-control button:hover,.canvas-controls .orientation-control button.is-active{background:var(--surface-soft);color:var(--text)}.canvas-controls .orientation-control{position:static;display:flex;margin:0;padding:0 0 0 2px;border:0;border-left:1px solid var(--line);border-radius:0;background:transparent;box-shadow:none;-webkit-backdrop-filter:none;backdrop-filter:none}.canvas-controls .orientation-control .icon{width:15px;height:15px}.canvas-view-select{display:none}.canvas-controls button:disabled,.canvas-controls select:disabled{opacity:.48;cursor:default}.workbench{top:var(--header-height);left:auto;bottom:0;width:var(--workbench-width);border:0;border-left:1px solid var(--line);border-radius:0;box-shadow:none}.workbench:focus{outline:none}.workbench:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.workbench-heading{min-height:50px;padding:7px 10px 7px 16px}.workbench-heading strong{font-size:13px}.workbench-expand-button .icon{transform:rotate(180deg);transition:transform .16s ease}.workbench.is-expanded .workbench-expand-button .icon{transform:rotate(0)}.workbench-body{overscroll-behavior:contain}.workbench-section:first-child{padding-top:12px}.selection-chip{position:absolute;z-index:13;top:calc(var(--header-height) + 12px);left:12px;height:34px;display:flex;align-items:center;gap:7px;padding:0 10px;border:1px solid var(--line);border-radius:8px;background:var(--surface);color:var(--muted);box-shadow:0 4px 14px color-mix(in srgb,var(--text) 7%,transparent);font-size:10px;cursor:pointer}.selection-chip strong{color:var(--text);font-family:var(--numeric);font-size:11px}.selection-chip:hover{border-color:var(--line-strong);color:var(--accent)}.export-sheet{position:fixed;z-index:32;top:var(--header-height);right:0;bottom:0;width:var(--export-width);display:flex;flex-direction:column;overflow:hidden;border-left:1px solid var(--line);background:var(--surface);box-shadow:-10px 0 28px color-mix(in srgb,var(--text) 8%,transparent);animation:workbench-in .18s ease both}.figure-sheet{bottom:var(--timeline-height)}.export-sheet[hidden]{display:none}.export-sheet:focus{outline:none}.export-sheet:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.export-heading{min-height:58px;display:flex;align-items:center;justify-content:space-between;gap:12px;flex:0 0 auto;padding:8px 10px 8px 16px;border-bottom:1px solid var(--line)}.export-heading strong,.export-heading span{display:block}.export-heading strong{color:var(--text);font-size:14px;font-weight:650}.export-heading span{margin-top:2px;color:var(--muted);font-size:12px}.export-body{min-height:0;flex:1 1 auto;overflow:auto;overscroll-behavior:contain}.export-footer{min-height:56px;display:grid;grid-template-columns:1fr 1.45fr;gap:8px;flex:0 0 auto;padding:8px 10px;border-top:1px solid var(--line);background:var(--surface)}.export-footer button{min-height:38px;border:1px solid var(--line);border-radius:7px;background:transparent;color:var(--muted);font-size:11px;font-weight:600;cursor:pointer}.export-footer .primary{border-color:var(--accent);background:var(--accent);color:#fff}.export-footer button:disabled{opacity:.48;cursor:default}.figure-section{padding:16px;border-bottom:1px solid var(--line)}.figure-section-label{display:block;margin-bottom:10px;color:var(--quiet);font-size:11px;font-weight:700;letter-spacing:.08em;text-transform:uppercase}.figure-presets,.figure-choice-row{display:grid;gap:6px}.figure-presets{grid-template-columns:repeat(3,minmax(0,1fr));margin-bottom:10px}.figure-choice-row{grid-template-columns:repeat(2,minmax(0,1fr))}.figure-choice-row+.figure-choice-row{margin-top:8px}.figure-presets button,.figure-choice-row button,.figure-recipe-actions button{min-height:34px;border:1px solid var(--line);border-radius:7px;background:transparent;color:var(--muted);font-size:12px;font-weight:600;cursor:pointer}.figure-presets button:hover,.figure-choice-row button:hover,.figure-recipe-actions button:hover,.figure-presets button.is-active,.figure-choice-row button.is-active{border-color:color-mix(in srgb,var(--accent) 62%,var(--line));background:var(--accent-soft);color:var(--accent-strong)}.figure-number-grid{display:grid;grid-template-columns:1fr 1fr .8fr;gap:6px}.figure-number-grid label,.figure-scale-length{display:grid;gap:5px;color:var(--quiet);font-size:11px}.figure-number-grid input,.figure-scale-length input{min-width:0;height:34px;padding:0 8px;border:1px solid var(--line);border-radius:7px;background:var(--surface);color:var(--text);font-family:var(--numeric);font-size:10px}.figure-toggle{min-height:46px;display:flex;align-items:center;justify-content:space-between;gap:14px;border-bottom:1px solid var(--line);cursor:pointer}.figure-toggle:last-of-type{border-bottom:0}.figure-toggle span,.figure-toggle strong,.figure-toggle small{display:block}.figure-toggle strong{color:var(--text);font-size:12px;font-weight:600}.figure-toggle small{margin-top:2px;color:var(--quiet);font-size:11px}.figure-toggle input{width:16px;height:16px;accent-color:var(--accent)}.figure-scale-length{grid-template-columns:1fr 90px auto;align-items:center;margin-top:8px}.figure-recipe-actions p{margin:0 0 10px;color:var(--quiet);font-size:11px;line-height:1.45}.figure-recipe-actions>div{display:grid;grid-template-columns:1fr 1fr;gap:6px}.figure-sheet-open .molecule-canvas,.figure-sheet-open .canvas-field{width:calc(100% - var(--figure-panel-reserve))}.figure-sheet-open .canvas-controls{right:calc(var(--figure-panel-reserve) + var(--figure-panel-gap));transition:none}.export-options{border-bottom:1px solid var(--line)}.export-options>summary{min-height:48px;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:0 16px;color:var(--text);font-size:11px;font-weight:600;cursor:pointer}.export-options>summary small{overflow:hidden;color:var(--quiet);font-size:11px;font-weight:400;text-overflow:ellipsis;white-space:nowrap}.export-options-body{border-top:1px solid var(--line)}.export-open .render-guide-region{right:var(--export-width)}.timeline,.timeline.is-compact{left:0;bottom:0;width:100%;height:var(--timeline-height);border:0;border-top:1px solid var(--line);border-radius:0;background:var(--surface);box-shadow:none;-webkit-backdrop-filter:none;backdrop-filter:none;transform:none}.frame-counter{white-space:nowrap}.figure-sheet-open .timeline{z-index:33}.workbench-open .timeline{width:calc(100% - var(--workbench-width))}.export-open .timeline{width:calc(100% - var(--export-width))}.playback-mode-control{display:none}@media(max-width:719px){.workspace{--figure-panel-reserve: 0px;--figure-panel-gap: 8px}.inspect-button{display:none}.workbench-open .molecule-canvas,.workbench-open .canvas-field,.export-open .molecule-canvas,.export-open .canvas-field{width:100%}.workbench,.workbench.is-expanded{position:fixed;top:auto;right:0;bottom:var(--timeline-height);left:0;width:auto;height:min(44svh,360px);max-height:calc(100svh - var(--header-height) - var(--timeline-height) - 16px);border:0;border-top:1px solid var(--line);border-radius:0;box-shadow:0 -10px 28px color-mix(in srgb,var(--text) 8%,transparent)}.workbench.is-expanded{height:min(68svh,560px)}.workbench-heading{min-height:50px}.workbench-expand-button{display:grid}.workbench-open .timeline,.export-open .timeline{width:100%}.workbench-open .canvas-controls,.export-open .canvas-controls{right:8px}.canvas-controls{top:calc(var(--header-height) + 8px);right:8px;height:44px}.canvas-controls>button{min-width:44px;height:40px}.canvas-controls .orientation-control{display:none}.canvas-view-select{height:40px;display:flex;align-items:center;border-left:1px solid var(--line)}.canvas-view-select select{width:58px;height:40px;padding:0 18px 0 8px;border:0;background:transparent;color:var(--text);font-size:11px}.selection-chip{top:calc(var(--header-height) + 13px);left:8px;height:40px}.export-sheet{top:auto;right:0;bottom:var(--timeline-height);left:0;width:auto;height:min(72svh,560px);max-height:calc(100svh - var(--header-height) - var(--timeline-height) - 8px);border:0;border-top:1px solid var(--line);box-shadow:0 -10px 28px color-mix(in srgb,var(--text) 8%,transparent);animation-name:mobile-sheet-in}.figure-sheet.export-sheet{max-height:calc(100svh - var(--header-height) - var(--timeline-height) - 64px)}.export-open .render-guide-region{right:0}.export-heading{min-height:50px}.export-footer button{min-height:44px}.figure-options-button{width:44px;height:44px}.figure-presets button,.figure-choice-row button,.figure-recipe-actions button{min-height:44px}.figure-number-grid input,.figure-scale-length input{height:44px}.render-panel .render-presets{grid-template-columns:repeat(4,minmax(0,1fr))}.render-panel .render-presets button{min-width:0;padding-inline:4px}}@media(max-width:760px){.topbar{padding-inline:8px 4px}.open-button{width:44px;min-width:44px;padding:0;font-size:0}.panel-button,.inspect-button,.render-button{width:auto;min-width:50px;height:44px;padding:0 9px;font-size:10px}.panel-button span{display:inline}.more-button{width:44px;min-width:44px;height:44px}}@media(min-width:720px){.more-inspect-action{display:none!important}}@media(max-width:520px){.identity>div{min-width:0;display:block}.identity strong{display:none}.identity span:last-child{display:block;max-width:none;margin:0;font-size:10px}.identity-mark{width:28px;height:28px}}@media(max-width:420px){.identity>div{display:none}}@media(min-width:720px)and (max-width:760px){.workbench-open .molecule-canvas,.workbench-open .canvas-field{width:calc(100% - var(--workbench-width))}.export-open .molecule-canvas,.export-open .canvas-field{width:calc(100% - var(--export-width))}}@media(max-width:479px),(min-width:480px)and (max-width:760px)and (min-height:521px){.workspace.workbench-open.selection-present .selection-bar{bottom:calc(var(--timeline-height) + var(--mobile-workbench-height))}.workspace.workbench-expanded.selection-present .selection-bar{visibility:hidden;pointer-events:none}}@media(min-width:480px)and (max-width:760px)and (max-height:520px){.workspace,.workspace.timeline-compact{--timeline-height: 58px;--figure-panel-reserve: min(320px, 48vw);--figure-panel-gap: 8px}.timeline .plot-row{display:none}.workbench,.workbench.is-expanded,.export-sheet{top:var(--header-height);right:0;bottom:var(--timeline-height);left:auto;width:min(320px,48vw);height:auto;max-height:none;border:0;border-left:1px solid var(--line);border-radius:0;box-shadow:-10px 0 28px color-mix(in srgb,var(--text) 8%,transparent)}.figure-sheet.export-sheet{max-height:none}.workbench-heading{display:flex}.workbench-expand-button{display:none}.workbench-open .canvas-controls,.export-open .canvas-controls{right:calc(min(320px,48vw) + 8px)}.workbench-open .molecule-canvas,.workbench-open .canvas-field,.export-open .molecule-canvas,.export-open .canvas-field{width:calc(100% - min(320px,48vw))}.export-open .render-guide-region{right:min(320px,48vw)}.workbench-open .timeline,.export-open .timeline{width:calc(100% - min(320px,48vw))}.render-panel .render-presets{grid-template-columns:repeat(2,minmax(0,1fr))}}:root{--timeline-height: 52px;--workbench-width: 304px;--scene-strip-height: 40px}.workspace.timeline-compact{--timeline-height: 52px}.workspace.timeline-absent{--timeline-height: 0px}.workspace.timeline-present{--timeline-height: 52px}.scene-strip{position:absolute;z-index:14;top:var(--header-height);right:0;left:0;height:var(--scene-strip-height);display:flex;align-items:stretch;overflow:hidden;border-bottom:1px solid var(--line);background:color-mix(in srgb,var(--surface) 96%,var(--canvas));transition:right .18s ease}.scene-strip-presets{min-width:0;display:flex;align-items:stretch}.scene-strip-presets button{position:relative;min-width:76px;padding:0 12px;border:0;background:transparent;color:var(--quiet);font-size:10px;font-weight:560;letter-spacing:.01em;cursor:pointer}.scene-strip-presets button:after{content:"";position:absolute;right:12px;bottom:0;left:12px;height:2px;border-radius:2px 2px 0 0;background:transparent}.scene-strip-presets button:hover:not(:disabled){color:var(--text);background:var(--surface-soft)}.scene-strip-presets button.is-active{color:var(--accent);font-weight:680}.scene-strip-presets button.is-active:after{background:var(--accent)}.scene-strip-presets button:disabled{color:color-mix(in srgb,var(--quiet) 48%,transparent);cursor:default}.scene-strip-facts{min-width:0;display:flex;align-items:center;gap:0;margin-left:auto;padding-right:12px;color:var(--quiet);font-family:var(--numeric);font-size:9px;white-space:nowrap}.scene-strip-facts span{display:flex;gap:3px;align-items:baseline}.scene-strip-facts span+span:before{content:"";width:1px;height:12px;margin:0 9px;background:var(--line)}.scene-strip-facts strong{color:var(--muted);font-weight:650}.molecule-canvas,.canvas-field{top:calc(var(--header-height) + var(--scene-strip-height));height:calc(100% - var(--header-height) - var(--scene-strip-height) - var(--timeline-height))}.workbench-open .scene-strip{right:var(--workbench-width)}.figure-sheet-open .scene-strip{right:var(--figure-panel-reserve)}.workbench-open .molecule-canvas,.workbench-open .canvas-field,.workbench-open .timeline{width:calc(100% - var(--workbench-width))}.workbench{position:absolute;z-index:24;top:calc(var(--header-height) + var(--scene-strip-height));right:0;bottom:0;left:auto;width:var(--workbench-width);height:auto;max-height:none;overflow:hidden;border:0;border-left:1px solid var(--line);border-radius:0;background:var(--surface);box-shadow:none}.workbench.atom-card{width:320px}.workbench-heading{min-height:54px;padding:6px 8px 6px 16px}.workbench-heading-copy{min-width:0}.workbench-heading-copy span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.workbench-body{max-height:none;overflow:auto}.workbench-section,.workbench-section:first-child{padding:12px 16px}.scene-panel .workbench-section+.workbench-section{border-top:1px solid var(--line)}.preset-options{grid-template-columns:repeat(3,minmax(0,1fr));gap:6px}.preset-options button{min-height:36px;padding-inline:5px;border-color:var(--line-soft);background:var(--surface-soft)}.preset-options button.is-active{border-color:color-mix(in srgb,var(--accent) 38%,var(--line));background:var(--accent-soft)}.periodic-settings{padding:0}.periodic-settings>summary{position:relative;min-height:54px;display:grid;grid-template-columns:minmax(0,1fr) auto;align-content:center;gap:3px 12px;padding:8px 36px 8px 16px;list-style:none;color:var(--text);font-size:11px;font-weight:600;cursor:pointer}.periodic-settings>summary::-webkit-details-marker{display:none}.periodic-settings>summary:after{content:"";position:absolute;right:17px;width:6px;height:6px;border-right:1.5px solid var(--quiet);border-bottom:1.5px solid var(--quiet);transform:rotate(45deg) translateY(-2px);transition:transform .14s ease}.periodic-settings[open]>summary:after{transform:rotate(225deg) translate(-1px,-1px)}.periodic-settings>summary small{min-width:0;overflow:hidden;color:var(--quiet);font-size:11px;font-weight:450;text-overflow:ellipsis;white-space:nowrap}.periodic-settings-body{padding:0 16px 14px;border-top:1px solid var(--line-soft)}.periodic-control-label{display:block;margin:12px 0 6px;color:var(--muted);font-size:11px;font-weight:600}.workbench-section>.section-label+.periodic-control-label{margin-top:0}.periodic-inline-control,.periodic-repeat-heading{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:12px}.periodic-inline-control .periodic-control-label,.periodic-repeat-heading .periodic-control-label{margin:0}.periodic-repeat-heading>span:last-child{color:var(--quiet);font-size:11px;font-variant-numeric:tabular-nums}.periodic-axis-options{display:flex;gap:4px}.periodic-axis-options button,.periodic-repeat-row button{width:30px;height:30px;padding:0;border:1px solid var(--line);border-radius:6px;background:var(--surface);color:var(--muted);font-size:11px;cursor:pointer}.periodic-axis-options button:hover:not(:disabled),.periodic-repeat-row button:hover:not(:disabled){border-color:var(--line-strong);color:var(--text)}.periodic-axis-options button.is-active{border-color:color-mix(in srgb,var(--accent) 34%,var(--line));background:var(--accent-soft);color:var(--accent);font-weight:700}.periodic-repeat-grid{display:grid;gap:4px;margin-top:6px}.periodic-repeat-row{display:grid;grid-template-columns:minmax(0,1fr) 30px 38px 30px;align-items:center;gap:4px;min-height:30px}.periodic-repeat-row>span{color:var(--text);font-size:11px;font-style:italic}.periodic-repeat-row output{color:var(--text);font-size:12px;font-variant-numeric:tabular-nums;text-align:center}.periodic-repeat-row.is-disabled>span,.periodic-repeat-row.is-disabled output{color:var(--quiet)}.periodic-axis-options button:disabled,.periodic-repeat-row button:disabled{cursor:default;opacity:.38}.panel-select-row{min-height:34px}.display-toggles{padding-block:9px}.display-toggles .toggle-row{min-height:36px}.display-toggles .toggle-row+.toggle-row{border-top:1px solid var(--line-soft)}.atom-card .inspector-content{padding:0}.atom-card .readout-section{padding:12px 14px 14px;border:0}.workbench-open .canvas-controls{right:calc(var(--workbench-width) + 12px);opacity:1;pointer-events:auto}.canvas-controls{top:calc(var(--header-height) + var(--scene-strip-height) + 10px)}.selection-chip{top:calc(var(--header-height) + var(--scene-strip-height) + 12px)}.timeline,.timeline.is-compact{height:var(--timeline-height)}.timeline .transport-row{min-height:var(--timeline-height)}@media(max-width:760px){.workspace{--mobile-workbench-height: min(48svh, 440px);--scene-strip-height: 44px}.scene-strip{right:0;overflow:visible}.scene-strip-presets{width:100%;overflow-x:auto;overflow-y:hidden;scrollbar-width:none}.scene-strip-presets::-webkit-scrollbar{display:none}.scene-strip-presets button{flex:0 0 auto;min-width:72px;padding-inline:9px}.scene-strip-presets button:after{right:9px;left:9px}.scene-strip-presets button:disabled{display:none}.scene-strip-facts{display:none}.workbench-open .molecule-canvas,.workbench-open .canvas-field{width:100%;height:calc(100% - var(--header-height) - var(--scene-strip-height) - var(--timeline-height) - var(--mobile-workbench-height))}.workbench-open .timeline{width:100%}.workbench,.workbench.atom-card{position:fixed;top:auto;right:0;bottom:var(--timeline-height);left:0;width:auto;height:var(--mobile-workbench-height);max-height:calc(100svh - var(--header-height) - var(--scene-strip-height) - var(--timeline-height));border:0;border-top:1px solid var(--line);border-radius:0;box-shadow:0 -12px 30px color-mix(in srgb,var(--text) 9%,transparent)}.workbench-open .canvas-controls{right:8px}.canvas-controls{top:calc(var(--header-height) + var(--scene-strip-height) + 8px)}.selection-chip{top:calc(var(--header-height) + var(--scene-strip-height) + 10px)}.panel-button,.render-button{min-width:0;padding-inline:8px}.panel-button .icon,.render-button .icon{display:none}.periodic-axis-options button,.periodic-repeat-row button{width:42px;height:42px}.periodic-repeat-row{grid-template-columns:minmax(0,1fr) 42px 46px 42px;min-height:42px}}@media(max-width:760px){.open-button{width:auto;min-width:62px;padding-inline:8px;font-size:10px}}.command-button{display:inline-flex;width:auto;min-width:124px;padding-inline:11px;border-color:var(--line-strong);background:var(--surface-soft);color:var(--text);box-shadow:0 1px 2px color-mix(in srgb,var(--text) 7%,transparent)}.command-button span{display:inline;font-weight:650}.command-button:hover{border-color:color-mix(in srgb,var(--accent) 54%,var(--line-strong));background:var(--accent-soft)}.command-button kbd{white-space:nowrap}.command-backdrop{z-index:70}@media(min-width:761px){.identity{max-width:calc(50% - 112px)}.command-button{position:absolute;top:7px;left:50%;width:clamp(176px,23vw,286px);transform:translate(-50%)}}@media(max-width:760px){.command-button{display:inline-flex;width:44px;min-width:44px;height:44px;padding:0;border-color:color-mix(in srgb,var(--accent) 45%,var(--line-strong));background:var(--accent-soft);color:var(--accent)}.command-button span,.command-button kbd{display:none}.command-button .icon{width:18px;height:18px}}.workspace{--measurement-plot-height: 164px}.measurement-plot-open .selection-bar{z-index:18;bottom:calc(var(--timeline-height) + var(--measurement-plot-height) + 7px);width:min(760px,calc(100% - 24px));max-width:none;border-radius:10px 10px 0 0;box-shadow:0 8px 24px color-mix(in srgb,var(--text) 9%,transparent)}.measurement-plot-open .selection-readout{flex:1 1 auto}.workspace.measurement-plot-open .notice{bottom:calc(var(--timeline-height) + var(--measurement-plot-height) + 70px)}.measurement-plot{position:absolute;z-index:17;bottom:calc(var(--timeline-height) + 8px);left:50%;width:min(760px,calc(100% - 24px));height:var(--measurement-plot-height);display:grid;grid-template-rows:34px minmax(0,1fr) 18px;overflow:hidden;border:1px solid var(--line);border-top:0;border-radius:0 0 10px 10px;background:var(--surface);box-shadow:0 8px 24px color-mix(in srgb,var(--text) 9%,transparent);transform:translate(-50%)}.measurement-plot.is-complete{grid-template-rows:34px minmax(0,1fr)}.measurement-plot__header{min-width:0;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:3px 5px 3px 13px;border-bottom:1px solid var(--line-soft)}.measurement-plot__meta{color:var(--quiet);font-family:var(--numeric);font-size:10px}.measurement-plot__actions{flex:0 0 auto;display:flex;align-items:center;gap:1px}.measurement-plot__export-menu{position:relative;display:none}.measurement-plot__export-menu>summary{list-style:none}.measurement-plot__export-menu>summary::-webkit-details-marker{display:none}.measurement-plot__actions button{height:30px;min-width:40px;padding:0 7px;border:0;border-radius:5px;background:transparent;color:var(--muted);font-size:10px;font-weight:650;cursor:pointer}.measurement-plot__actions button:hover:not(:disabled){background:var(--surface-soft);color:var(--text)}.measurement-plot__actions button:disabled{color:var(--disabled);cursor:default}.measurement-plot__chart{width:100%;height:100%;min-height:0;display:block;cursor:crosshair}.measurement-plot__chart:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.measurement-plot__grid,.measurement-plot__axis{stroke:var(--line-soft);stroke-width:1}.measurement-plot__axis{stroke:var(--line-strong)}.measurement-plot__trace{stroke:var(--accent);stroke-width:1.8}.measurement-plot__trace-point,.measurement-plot__cursor-point{fill:var(--accent)}.measurement-plot__cursor{stroke:var(--accent);stroke-width:1.25;opacity:.7}.measurement-plot__cursor-point{stroke:var(--surface);stroke-width:2}.measurement-plot__tick,.measurement-plot__axis-label,.measurement-plot__unit,.measurement-plot__empty{fill:var(--quiet);font-family:var(--numeric);font-size:12px}.measurement-plot__axis-label,.measurement-plot__unit,.measurement-plot__empty{font-family:inherit;font-size:11px}.measurement-plot__progress{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:8px;padding:0 12px;color:var(--quiet);font-family:var(--numeric);font-size:10px}.measurement-plot__progress progress{width:100%;height:2px;overflow:hidden;border:0;border-radius:2px;background:var(--surface-soft);color:var(--accent);appearance:none}.measurement-plot__progress progress::-webkit-progress-bar{background:var(--surface-soft)}.measurement-plot__progress progress::-webkit-progress-value{background:var(--accent)}.measurement-plot__progress progress::-moz-progress-bar{background:var(--accent)}.selection-bar .selection-plot-button[aria-pressed=true]{background:var(--accent-soft)}@media(max-width:520px){.workspace{--measurement-plot-height: 194px}.measurement-plot,.measurement-plot-open .selection-bar{width:calc(100% - 16px)}.measurement-plot{grid-template-rows:44px minmax(0,1fr) 18px}.measurement-plot.is-complete{grid-template-rows:44px minmax(0,1fr)}.measurement-plot__header{overflow:visible;padding-left:10px}.measurement-plot__actions>button:not(.measurement-plot__close){display:none}.measurement-plot__export-menu{display:block}.measurement-plot__export-menu>summary{width:58px;height:44px;display:grid;place-items:center;border-radius:5px;color:var(--muted);font-size:10px;font-weight:650;cursor:pointer}.measurement-plot__export-menu[open]>summary{background:var(--surface-soft);color:var(--text)}.measurement-plot__export-menu>div{position:absolute;z-index:2;top:calc(100% + 2px);right:0;width:112px;padding:4px;border:1px solid var(--line);border-radius:7px;background:var(--surface);box-shadow:var(--shadow)}.measurement-plot__export-menu>div button{width:100%;display:block;text-align:left}.measurement-plot__actions button{width:44px;height:44px;padding-inline:5px}}@media(max-width:380px){.measurement-plot-open .selection-bar>button:not(.icon-button){min-width:48px;padding-inline:6px}}@media(max-width:760px)and (max-height:520px){.workspace{--measurement-plot-height: 132px}.measurement-plot{grid-template-rows:44px minmax(0,1fr) 14px}.measurement-plot.is-complete{grid-template-rows:44px minmax(0,1fr)}.measurement-plot__progress{padding-inline:9px}}@media(max-width:760px){.open-button,.panel-button,.inspect-button,.render-button,.canvas-controls>button{font-size:11px}.canvas-controls{height:48px}.canvas-controls>button{min-width:44px;height:44px}.transport-button,.play-button,.timeline-options>summary{width:40px;height:44px}.segmented-options button{min-height:40px;font-size:11px}.workspace.selection-present .timeline-options>div{bottom:calc(100% + 82px)}}@media(max-width:600px){.transport-buttons .transport-button:first-child,.transport-buttons .transport-button:last-child{display:none}.frame-counter-full{display:none}.frame-counter-compact{display:inline}.frame-error-full{display:none}.frame-error-compact{display:inline}.frame-error{min-width:28px;max-width:28px;flex:0 0 28px;padding-inline:0}}@media(min-width:521px)and (max-width:760px){.workspace.selection-present .workbench{max-height:calc(100% - var(--header-height) - var(--scene-strip-height) - var(--timeline-height) - 80px)}}@media(max-width:479px)and (max-height:520px){.workbench-heading{min-height:44px;display:flex}}@media(max-width:380px){.selection-hint{display:none}.measurement-plot-open .selection-bar{flex-wrap:wrap;justify-content:flex-end;row-gap:4px;padding-block:6px}.measurement-plot-open .selection-readout{flex:1 0 100%;overflow:hidden}.measurement-plot-open .selection-readout strong{min-width:0;max-width:100%;flex:0 1 auto}.measurement-plot-open .selection-readout output{flex:0 0 auto}.workspace.measurement-plot-open .notice{bottom:calc(var(--timeline-height) + var(--measurement-plot-height) + 100px)}.measurement-mode-full{display:none}.measurement-mode-compact{display:inline}}@media(max-width:520px){.workspace.selection-present .timeline-options>div{bottom:calc(var(--selection-bottom) + 60px)}}@media(max-width:760px)and (max-height:450px){.workspace.playback-options-open .canvas-controls,.workspace.playback-options-open .selection-bar{visibility:hidden;pointer-events:none}.workspace.playback-options-open .timeline-options>div{bottom:calc(100% + 8px)}}@media(max-width:520px)and (max-height:450px){.workspace.playback-options-open .timeline-options>div{bottom:calc(var(--timeline-height) + 8px)}}@media(max-width:760px)and (max-height:360px){.workspace.measurement-plot-open .canvas-controls{visibility:hidden;pointer-events:none}.workspace.measurement-plot-open .notice{top:calc(var(--header-height) + var(--scene-strip-height) + 8px);bottom:auto;max-height:calc(100% - var(--header-height) - var(--scene-strip-height) - var(--timeline-height) - 16px)}}.selection-tools{position:relative;flex:0 0 auto}.selection-tools>summary{min-width:54px;height:36px;display:grid;place-items:center;padding:0 9px;border-radius:5px;color:var(--accent);font-size:10px;font-weight:650;cursor:pointer;list-style:none}.selection-tools>summary::-webkit-details-marker{display:none}.selection-tools>summary:hover,.selection-tools[open]>summary{background:var(--accent-soft)}.selection-tools-popover{position:absolute;right:0;bottom:calc(100% + 10px);width:min(300px,calc(100vw - 20px));max-height:min(520px,calc(100svh - var(--header-height) - var(--scene-strip-height) - var(--header-height) - var(--timeline-height) - 36px));overflow-x:hidden;overflow-y:auto;border:1px solid var(--line);border-radius:10px;background:var(--surface);box-shadow:var(--shadow)}.selection-tools-popover>section{display:grid;gap:8px;padding:11px}.selection-tools-popover>section+section{border-top:1px solid var(--line)}.selection-tools-popover label,.selection-tools-popover section>span{color:var(--quiet);font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:uppercase}.selection-scope-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:5px}.selection-scope-grid button,.selection-input-row button,.saved-selections button{min-height:32px;border:1px solid var(--line);border-radius:6px;background:transparent;color:var(--text);font-size:12px;cursor:pointer}.selection-scope-grid button:hover:not(:disabled),.selection-input-row button:hover:not(:disabled),.saved-selections button:hover:not(:disabled){border-color:var(--line-strong);background:var(--surface-soft)}.selection-scope-grid button:disabled,.selection-input-row button:disabled{opacity:.4;cursor:default}.selection-input-row{display:grid;grid-template-columns:minmax(0,1fr) auto auto;align-items:center;gap:6px}.selection-input-row.is-name{grid-template-columns:minmax(0,1fr) auto}.selection-input-row input{min-width:0;height:34px;padding:0 9px;border:1px solid var(--line);border-radius:6px;background:var(--surface);color:var(--text);font:11px var(--numeric)}.selection-input-row input:focus{border-color:var(--accent);outline:2px solid var(--accent-soft)}.selection-input-row>span{color:var(--muted);font:10px var(--numeric)}.selection-input-row button{padding-inline:10px;color:var(--accent);font-weight:650}.saved-selections{max-height:178px;overflow:auto}.saved-selections>div{display:grid;grid-template-columns:minmax(0,1fr) 32px;gap:5px}.saved-selections>div>button:first-child{min-width:0;display:flex;align-items:center;justify-content:space-between;gap:8px;padding:0 9px;text-align:left}.saved-selections button span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.saved-selections button small{color:var(--quiet);font:9px var(--numeric)}.saved-selections>div>button:last-child{display:grid;place-items:center;padding:0;color:var(--quiet)}.saved-selections .icon{width:12px;height:12px}.pinned-measurements{position:absolute;z-index:13;top:calc(var(--header-height) + var(--scene-strip-height) + 12px);left:12px;display:block;max-width:none;max-height:none;overflow:visible;padding:0}.pinned-measurements .selection-chip{position:static;min-width:0;border-radius:8px 0 0 8px;box-shadow:none}.pinned-measurements .selection-chip span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pinned-measurements .selection-chip[aria-pressed=true]{border-color:color-mix(in srgb,var(--accent) 48%,var(--line));background:var(--accent-soft)}.pinned-measurement-remove{width:30px;flex:0 0 30px;display:grid;place-items:center;border:1px solid var(--line);border-left:0;border-radius:0 8px 8px 0;background:var(--surface);color:var(--quiet);cursor:pointer}.pinned-measurement-remove:hover{color:var(--text)}.pinned-measurement-remove .icon{width:12px;height:12px}.selection-summary-panel .readout-section{padding-top:4px}@media(max-width:760px){.selection-bar{width:calc(100% - 16px)}.selection-tools{position:static}.selection-tools>summary{height:44px}.selection-tools-popover{right:8px;left:8px;width:auto}.selection-scope-grid button,.selection-input-row button,.saved-selections button{min-height:38px}.selection-input-row input{height:40px}.pinned-measurements{top:calc(var(--header-height) + var(--scene-strip-height) + 60px);left:8px}.pinned-measurements .selection-chip{height:40px}}@media(max-width:520px){.selection-bar .measurement-mode{display:none}.selection-readout{min-width:80px}.selection-tools>summary{min-width:48px;padding-inline:7px}}@media(max-width:719px)and (min-height:521px),(max-width:479px){.figure-sheet.export-sheet{max-height:calc(100svh - var(--header-height) - var(--scene-strip-height) - var(--timeline-height) - 64px)}}@media(min-width:480px)and (max-width:719px)and (max-height:520px){.figure-sheet.export-sheet{max-height:none}}:root,.workspace{--scene-strip-height: 0px}.identity{height:40px;padding:0 8px 0 0;border:1px solid transparent;border-radius:7px;background:transparent;text-align:left;cursor:pointer}.identity:hover:not(:disabled),.identity[aria-expanded=true]{border-color:var(--line);background:var(--surface-soft)}.identity:disabled{cursor:default}.structure-button,.appearance-button{min-width:36px;height:34px;padding:0 10px;border:1px solid transparent;border-radius:7px;background:transparent;color:var(--muted);font-size:11px;cursor:pointer}.structure-button:hover:not(:disabled),.structure-button[aria-expanded=true],.appearance-button:hover:not(:disabled){border-color:var(--line);background:var(--surface-soft);color:var(--text)}.structure-button:disabled,.appearance-button:disabled{opacity:.45;cursor:default}.molecule-stage-3dmol{background:var(--canvas)}.workbench-tabs{order:1}.workbench-body{order:2}.workbench-heading{order:0}.workbench-tabs button:disabled{color:var(--disabled);cursor:default}.structure-overview{background:color-mix(in srgb,var(--surface-soft) 54%,var(--surface))}.structure-fact-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 18px}.structure-fact-grid div{min-width:0}.structure-fact-grid span,.structure-fact-grid strong{display:block}.structure-fact-grid span{margin-bottom:3px;color:var(--quiet);font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase}.structure-fact-grid strong{overflow-wrap:anywhere;color:var(--text);font-family:var(--numeric);font-size:12px;font-weight:600}.scientific-note,.structure-actions p,.atom-editor>p{margin:12px 0 0;color:var(--quiet);font-size:11px;line-height:1.55}.cell-editor-mode{margin-bottom:12px}.cell-parameter-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:7px}.cell-parameter-grid label{position:relative;min-width:0}.cell-parameter-grid label>span,.cell-parameter-grid label>small{position:absolute;z-index:1;top:9px;color:var(--quiet);font-family:var(--numeric);font-size:11px;pointer-events:none}.cell-parameter-grid label>span{left:8px;color:var(--muted);font-weight:700}.cell-parameter-grid label>small{right:7px}.cell-parameter-grid input,.cell-vector-grid input,.atom-editor input{width:100%;height:34px;border:1px solid var(--line);border-radius:6px;background:var(--surface);color:var(--text);font-family:var(--numeric);font-size:10px}.cell-parameter-grid input{padding:0 22px}.cell-parameter-grid input:focus,.cell-vector-grid input:focus,.atom-editor input:focus{border-color:var(--accent);outline:2px solid var(--accent-soft)}.cell-vector-grid{display:grid;grid-template-columns:18px repeat(3,minmax(0,1fr));align-items:center;gap:6px}.cell-vector-grid>span,.cell-vector-grid>strong{color:var(--quiet);font-family:var(--numeric);font-size:11px;text-align:center}.cell-vector-grid>strong{color:var(--muted)}.cell-vector-grid input{min-width:0;padding:0 6px;text-align:right}.cell-axis-row{min-height:42px;display:flex;align-items:center;justify-content:space-between;gap:10px;margin-top:10px;border-top:1px solid var(--line);color:var(--muted);font-size:12px}.cell-axis-row>div{display:flex;gap:4px}.cell-axis-row button{width:30px;height:28px;border:1px solid var(--line);border-radius:6px;background:var(--surface);color:var(--quiet);font-family:var(--numeric);font-size:10px;cursor:pointer}.cell-axis-row button.is-active{border-color:color-mix(in srgb,var(--accent) 44%,var(--line));background:var(--accent-soft);color:var(--accent);font-weight:700}.cell-scale-choice{min-height:44px;display:flex;align-items:center;gap:9px;border-top:1px solid var(--line);color:var(--text);font-size:12px}.cell-scale-choice input{accent-color:var(--accent)}.cell-scale-choice span,.cell-scale-choice small{display:block}.cell-scale-choice small{margin-top:2px;color:var(--quiet);font-size:11px}.editor-error{margin:0 0 8px;color:var(--error);font-size:11px;line-height:1.4}.primary-panel-action,.structure-actions>button{width:100%;min-height:36px;display:flex;align-items:center;justify-content:center;gap:8px;padding:0 10px;border:1px solid var(--line);border-radius:6px;background:var(--surface);color:var(--muted);font-size:12px;font-weight:600;cursor:pointer}.primary-panel-action{border-color:var(--accent);background:var(--accent);color:#fff}.primary-panel-action:hover{background:color-mix(in srgb,var(--accent) 88%,#000)}.primary-panel-action small{color:inherit;font-family:var(--numeric);font-size:11px;opacity:.72}.structure-actions{display:grid;gap:7px}.structure-actions>button:hover:not(:disabled){border-color:var(--line-strong);background:var(--surface-soft);color:var(--text)}.structure-actions>button:disabled{opacity:.42;cursor:default}.structure-actions p{margin-top:2px}.representation-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px}.representation-grid button{min-width:0;min-height:38px;padding:0 7px;border:1px solid var(--line);border-radius:6px;background:var(--surface);color:var(--muted);font-size:12px;cursor:pointer}.representation-grid button:hover:not(:disabled){border-color:var(--line-strong);color:var(--text)}.representation-grid button.is-active{border-color:color-mix(in srgb,var(--accent) 44%,var(--line));background:var(--accent-soft);color:var(--accent);font-weight:700}.representation-grid button:disabled{opacity:.38;cursor:default}.profile-settings{padding:0}.profile-settings>summary{min-height:48px;display:flex;align-items:center;justify-content:space-between;gap:10px;padding:0 16px;list-style:none;color:var(--text);font-size:12px;font-weight:600;cursor:pointer}.profile-settings>summary::-webkit-details-marker{display:none}.profile-settings>summary:after{content:"+";margin-left:auto;color:var(--quiet);font-family:var(--numeric)}.profile-settings[open]>summary:after{content:"−"}.profile-settings>summary small{color:var(--quiet);font-size:11px;font-weight:400}.profile-settings .preset-options{padding:0 16px 14px}.atom-display-settings .vector-scale-row{border-top:1px solid var(--line)}.atom-editor{margin:0 -16px;padding:14px 16px;border-bottom:1px solid var(--line);background:color-mix(in srgb,var(--surface-soft) 48%,var(--surface))}.atom-editor-heading{min-height:34px;display:flex;align-items:flex-start;justify-content:space-between;gap:10px;margin-bottom:10px}.atom-editor-heading span,.atom-editor-heading strong,.atom-editor-heading small{display:block}.atom-editor-heading span{color:var(--quiet);font-size:11px}.atom-editor-heading strong{margin-top:2px;color:var(--text);font:650 15px var(--numeric)}.atom-editor-heading small{color:var(--quiet);font-size:11px}.atom-element-field{display:grid;grid-template-columns:76px minmax(0,1fr);align-items:center;gap:8px;color:var(--muted);font-size:12px}.atom-editor input{min-width:0;padding:0 8px}.atom-coordinate-fields{min-width:0;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:6px;margin:12px 0 0;padding:12px 0 0;border:0;border-top:1px solid var(--line)}.atom-coordinate-fields legend{padding:0;color:var(--quiet);font-size:11px}.atom-coordinate-fields label{position:relative;min-width:0}.atom-coordinate-fields label span,.atom-coordinate-fields label small{position:absolute;z-index:1;top:9px;color:var(--quiet);font:11px var(--numeric);pointer-events:none}.atom-coordinate-fields label span{left:7px}.atom-coordinate-fields label small{right:7px}.atom-coordinate-fields input{padding:0 19px}.atom-editor .primary-panel-action{margin-top:10px}:root[data-appearance=dark] .molecule-stage-3dmol{background:var(--canvas)}@media(max-width:980px){.appearance-button{display:none}}@media(max-width:760px){.workspace{--scene-strip-height: 0px}.structure-button{display:none}.open-button{width:40px;min-width:40px;padding:0;font-size:0}.open-button .icon{width:17px;height:17px}.panel-button{width:40px;padding:0}.panel-button span{display:none}.panel-button .icon{display:block}.workbench-tabs button{min-height:44px}}@media(max-width:420px){.topbar{padding-inline:4px;gap:2px}.identity{width:40px;padding:0;justify-content:center}.identity-mark{width:28px;height:28px}.topbar-tools{gap:1px}.render-button{min-width:44px;padding-inline:6px;font-size:9px}.figure-options-button{width:32px;min-width:32px}}.identity{cursor:default;-webkit-user-select:none;user-select:none}.identity:hover{border-color:transparent;background:transparent}.task-navigation{align-items:center;gap:2px}.task-button,.tools-button,.help-button{min-width:36px;height:34px;display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:0 10px;border:1px solid transparent;border-radius:7px;background:transparent;color:var(--muted);font-size:11px;font-weight:550;cursor:pointer}.task-button:hover:not(:disabled),.task-button[aria-expanded=true],.tools-button:hover:not(:disabled),.tools-button[aria-expanded=true],.help-button:hover:not(:disabled){border-color:var(--line);background:var(--surface-soft);color:var(--text)}.task-button[aria-expanded=true]{border-color:color-mix(in srgb,var(--accent) 34%,var(--line));background:var(--accent-soft);color:var(--accent)}.task-button:disabled,.tools-button:disabled,.help-button:disabled{color:var(--disabled);cursor:default;opacity:.5}.tools-button{display:none}.help-button{padding-inline:8px}.help-button strong{display:none;font:650 13px var(--numeric)}.export-button.render-button{border-radius:7px;border-color:var(--line);background:transparent;color:var(--text);font-weight:600}.export-button.render-button:hover:not(:disabled){border-color:var(--line-strong, var(--line));background:var(--surface-soft);color:var(--text)}.export-button.render-button[aria-expanded=true]{border-color:var(--accent);background:var(--accent);color:#fff}.workbench-heading-actions{display:flex;align-items:center;gap:2px}.edit-target-options{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:4px;padding:8px;border-bottom:1px solid var(--line);background:var(--surface-soft)}.edit-target-options button{min-height:36px;border:1px solid transparent;border-radius:6px;background:transparent;color:var(--muted);font-size:12px;font-weight:650;cursor:pointer}.edit-target-options button:hover:not(:disabled){border-color:var(--line);color:var(--text)}.edit-target-options button.is-active{border-color:color-mix(in srgb,var(--accent) 34%,var(--line));background:var(--surface);color:var(--accent)}.edit-target-options button:disabled{color:var(--disabled);cursor:default}.appearance-options{display:grid;grid-template-columns:repeat(2,minmax(0,1fr))}.appearance-options button{min-height:36px}.appearance-settings .panel-select-row{margin-top:10px;border-top:1px solid var(--line)}.selected-atom-overview{min-height:68px;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px 16px;border-bottom:1px solid var(--line);background:color-mix(in srgb,var(--surface-soft) 52%,var(--surface))}.selected-atom-overview span,.selected-atom-overview strong{display:block}.selected-atom-overview span{color:var(--quiet);font-size:11px}.selected-atom-overview strong{margin-top:2px;color:var(--text);font:650 16px var(--numeric)}.selected-atom-overview button,.analysis-actions button,.analysis-method-grid button{min-height:36px;padding:0 10px;border:1px solid var(--line);border-radius:6px;background:var(--surface);color:var(--muted);font-size:12px;font-weight:600;cursor:pointer}.selected-atom-overview button:hover:not(:disabled),.analysis-actions button:hover:not(:disabled),.analysis-method-grid button:hover:not(:disabled){border-color:var(--line-strong);color:var(--text)}.analysis-panel{min-height:100%}.analysis-empty{padding:6px 0 2px}.analysis-empty strong,.analysis-measurement-copy strong{color:var(--text);font-size:13px;font-weight:650}.analysis-empty p,.analysis-measurement-copy p{margin:7px 0 0;color:var(--quiet);font-size:12px;line-height:1.55}.analysis-empty>div{display:grid;gap:5px;margin-top:14px}.analysis-empty>div span{color:var(--muted);font-size:12px}.analysis-empty kbd{min-width:56px;display:inline-block;margin-right:7px;padding:3px 5px;border:1px solid var(--line);border-radius:4px;background:var(--surface-soft);color:var(--text);text-align:center}.analysis-measurement-copy strong,.analysis-measurement-copy span{display:block}.analysis-measurement-copy span{margin-top:3px;color:var(--muted);font:10px var(--numeric)}.analysis-actions,.analysis-method-grid{display:grid;gap:6px;margin-top:12px}.analysis-actions{grid-template-columns:repeat(2,minmax(0,1fr))}.analysis-actions button:last-child{grid-column:1 / -1}.analysis-method-grid{grid-template-columns:repeat(2,minmax(0,1fr));margin-top:4px}.analysis-actions button:disabled,.analysis-method-grid button:disabled{color:var(--disabled);cursor:default;opacity:.55}.analysis-selection .selection-summary-panel{margin:0 -16px -12px}.canvas-hint{position:absolute;z-index:14;right:50%;bottom:calc(var(--timeline-height) + 18px);display:flex;align-items:center;gap:13px;padding:8px 8px 8px 12px;border:1px solid var(--line);border-radius:9px;background:color-mix(in srgb,var(--surface) 94%,transparent);color:var(--muted);box-shadow:0 5px 18px color-mix(in srgb,var(--text) 8%,transparent);font-size:9px;transform:translate(50%);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.canvas-hint strong{color:var(--text);font-weight:650}.canvas-hint button{width:28px;height:28px;display:grid;place-items:center;padding:0;border:0;border-radius:5px;background:transparent;color:var(--quiet);cursor:pointer}.canvas-hint button:hover{background:var(--surface-soft);color:var(--text)}.canvas-hint .icon{width:14px;height:14px}[data-setting-id]{transition:box-shadow .18s ease,background-color .18s ease}[data-setting-id].is-search-target{position:relative;z-index:1;box-shadow:inset 3px 0 0 var(--accent),0 0 0 2px var(--accent-soft)}.command-results>button{min-height:50px;padding-block:7px}.command-result-copy{min-width:0;display:block}.command-result-copy>span,.command-result-copy>small{display:block;max-width:none;text-align:left}.command-result-copy>span{overflow:hidden;color:inherit;font-size:12px;text-overflow:ellipsis;white-space:nowrap}.command-results>button .command-result-copy>small{max-width:none;margin-top:3px;color:var(--quiet);font-size:11px;line-height:1.2;text-align:left;white-space:nowrap}.command-result-detail{flex:0 0 auto}.command-result-detail small{display:block}@media(min-width:761px){.task-navigation{display:flex}.identity{max-width:calc(50% - 150px)}.workbench-tabs{display:none}}@media(max-width:1040px)and (min-width:761px){.task-button{padding-inline:7px}.help-button span{display:none}.help-button strong{display:block}.open-button{width:36px;padding:0;font-size:0}}@media(max-width:760px){.task-navigation{display:none}.open-button,.command-button,.tools-button,.export-button.render-button,.help-button{height:40px}.tools-button{min-width:56px;display:inline-flex}.tools-button .icon{width:16px;height:16px}.help-button{width:40px;min-width:40px;padding:0}.help-button span{display:none}.help-button strong{display:block}.workbench-heading-actions{display:flex}.workbench-expand-button{width:44px;height:44px;display:grid;place-items:center;padding:0;border:0;border-radius:7px;background:transparent;color:var(--muted);cursor:pointer}.workbench-expand-button:hover{background:var(--surface-soft);color:var(--text)}.workbench-expand-button .icon{width:16px;height:16px;transform:rotate(-90deg)}.workbench.is-expanded .workbench-expand-button .icon{transform:rotate(90deg)}.workspace{--mobile-workbench-height: min(56svh, 460px)}.workbench.is-expanded{top:var(--header-height);bottom:var(--timeline-height);height:auto;max-height:none}.workbench-expanded .molecule-canvas,.workbench-expanded .canvas-field{width:100%;height:calc(100% - var(--header-height) - var(--timeline-height))}.canvas-hint{right:10px;bottom:calc(var(--timeline-height) + 12px);left:10px;justify-content:space-between;gap:7px;transform:none}}@media(max-width:420px){.identity>div{display:block;min-width:0}.identity strong{display:none}.identity span:last-child{display:block;max-width:none;font-size:10px}.identity{width:auto;min-width:0;max-width:min(42vw,148px);padding:0 4px 0 0;justify-content:flex-start}.topbar-tools{gap:0}.tools-button{min-width:50px;padding-inline:5px}.export-button.render-button{width:42px;min-width:42px;padding:0;font-size:0}.export-button .icon{display:block;width:16px;height:16px}.canvas-hint{display:grid;grid-template-columns:1fr auto;gap:4px 8px}.canvas-hint span{grid-column:1}.canvas-hint button{grid-row:1 / 4;grid-column:2}}@media(min-width:480px)and (max-width:760px)and (max-height:520px){.workbench,.workbench.is-expanded{top:var(--header-height);right:0;bottom:var(--timeline-height);left:auto;width:min(320px,48vw);height:auto;max-height:none;border-top:0;border-left:1px solid var(--line)}.workbench-expand-button{display:none}.workbench-open .molecule-canvas,.workbench-open .canvas-field{width:calc(100% - min(320px,48vw));height:calc(100% - var(--header-height) - var(--timeline-height))}} diff --git a/pqviewer/static/assets/index-CQmxkr4B.css b/pqviewer/static/assets/index-CQmxkr4B.css new file mode 100644 index 0000000..b01c126 --- /dev/null +++ b/pqviewer/static/assets/index-CQmxkr4B.css @@ -0,0 +1 @@ +@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/inter-latin-400-normal-C38fXH4l.woff2) format("woff2"),url(/assets/inter-latin-400-normal-CyCys3Eg.woff) format("woff")}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/inter-latin-500-normal-Cerq10X2.woff2) format("woff2"),url(/assets/inter-latin-500-normal-BL9OpVg8.woff) format("woff")}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/inter-latin-600-normal-LgqL8muc.woff2) format("woff2"),url(/assets/inter-latin-600-normal-CiBQ2DWP.woff) format("woff")}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/inter-latin-700-normal-Yt3aPRUw.woff2) format("woff2"),url(/assets/inter-latin-700-normal-BLAVimhd.woff) format("woff")}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/inter-latin-ext-400-normal-C1nco2VV.woff2) format("woff2"),url(/assets/inter-latin-ext-400-normal-77YHD8bZ.woff) format("woff")}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/inter-latin-ext-500-normal-CV4jyFjo.woff2) format("woff2"),url(/assets/inter-latin-ext-500-normal-BxGbmqWO.woff) format("woff")}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/inter-latin-ext-600-normal-D2bJ5OIk.woff2) format("woff2"),url(/assets/inter-latin-ext-600-normal-CIVaiw4L.woff) format("woff")}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/inter-latin-ext-700-normal-Ca8adRJv.woff2) format("woff2"),url(/assets/inter-latin-ext-700-normal-TidjK2hL.woff) format("woff")}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/inter-greek-400-normal-B4URO6DV.woff2) format("woff2"),url(/assets/inter-greek-400-normal-q2sYcFCs.woff) format("woff")}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/inter-greek-500-normal-BIZE56-Y.woff2) format("woff2"),url(/assets/inter-greek-500-normal-Xzm54t5V.woff) format("woff")}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/inter-greek-600-normal-plRanbMR.woff2) format("woff2"),url(/assets/inter-greek-600-normal-BZpKdvQh.woff) format("woff")}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/inter-greek-700-normal-C3JjAnD8.woff2) format("woff2"),url(/assets/inter-greek-700-normal-BUv2fZ6O.woff) format("woff")}:root{color-scheme:light;font-family:Inter,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;font-synthesis:none;text-rendering:optimizeLegibility;--header-height: 44px;--canvas: #f6f8f8;--surface: #ffffff;--material: rgba(255, 255, 255, .88);--surface-soft: #edf2f3;--line: #d7e0e2;--line-strong: #c2cfd2;--text: #21363c;--muted: #5c7076;--quiet: #62757a;--disabled: #aab7ba;--accent: #257198;--accent-soft: #e3f0f5;--error: #a23d31;--shadow: 0 10px 32px rgba(30, 51, 57, .11), 0 2px 7px rgba(30, 51, 57, .06);--numeric: "SFMono-Regular", "Roboto Mono", Consolas, monospace}:root[data-appearance=dark]{color-scheme:dark;--canvas: #1e2e33;--surface: #26383e;--material: rgba(38, 56, 62, .92);--surface-soft: #30454c;--line: #465b61;--line-strong: #5a7076;--text: #f2f6f5;--muted: #c1ced0;--quiet: #9aadb1;--disabled: #718286;--accent: #63c4d8;--accent-soft: #294c58;--error: #f09a8d;--shadow: 0 12px 36px rgba(0, 0, 0, .3), 0 2px 8px rgba(0, 0, 0, .2)}*{box-sizing:border-box}html,body,#root{width:100%;height:100%;margin:0;overflow:hidden}body{min-width:320px;background:var(--canvas);color:var(--text)}button,select,input{font:inherit}button,select{color:inherit}button{-webkit-tap-highlight-color:transparent}button:focus-visible,select:focus-visible,input:focus-visible,svg:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.molecule-canvas:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}kbd,output{font-family:var(--numeric)}.app-shell,.workspace{width:100%;height:100svh;min-height:0}.workspace{position:relative;isolation:isolate;overflow:hidden;background:var(--canvas)}.molecule-canvas,.canvas-field{position:absolute;top:var(--header-height);left:0;width:100%;height:calc(100% - var(--header-height));display:block}.molecule-canvas{cursor:grab;touch-action:none}.molecule-canvas:active{cursor:grabbing}.molecule-canvas.is-box-selecting{cursor:crosshair}.selection-marquee{position:absolute;z-index:15;pointer-events:none;border:1px solid var(--accent);border-radius:2px;background:color-mix(in srgb,var(--accent) 9%,transparent)}.icon{width:20px;height:20px;display:block}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.topbar{position:absolute;z-index:20;inset:0 0 auto;height:var(--header-height);display:flex;align-items:center;justify-content:space-between;gap:16px;padding:0 8px 0 12px;border-bottom:1px solid var(--line);background:var(--surface)}.identity,.topbar-tools,.scene-status,.open-button,.command-button,.customize-button{display:flex;align-items:center}.identity{min-width:0;gap:9px}.identity-mark{width:28px;height:28px;flex:0 0 auto;object-fit:contain}.identity>div{min-width:0;display:flex;align-items:baseline;gap:9px}.identity strong{color:var(--text);font-size:13px;font-weight:650;letter-spacing:-.01em}.identity span:last-child{max-width:min(42vw,520px);overflow:hidden;color:var(--muted);font-size:12px;line-height:1.2;text-overflow:ellipsis;white-space:nowrap}.topbar-tools{flex:0 0 auto;gap:3px}.scene-status{gap:13px;margin-right:8px;color:var(--muted);font-size:11px}.scene-status strong{color:var(--text);font-family:var(--numeric);font-size:10px;font-weight:550}.open-button,.command-button,.customize-button,.more-button,.icon-button{min-width:36px;height:36px;display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:0 9px;border:0;border-radius:8px;background:transparent;color:var(--muted);font-size:12px;cursor:pointer;transition:background-color .19s ease,color .19s ease}.open-button:hover,.command-button:hover,.customize-button:hover,.more-button:hover,.icon-button:hover{background:var(--surface-soft);color:var(--text)}.open-button .icon,.command-button .icon,.customize-button .icon,.more-button .icon,.icon-button .icon{width:17px;height:17px}.command-button kbd{color:var(--quiet);font-size:10px}.customize-button{width:36px;padding:0}.customize-button[aria-expanded=true]{background:var(--accent-soft);color:var(--text)}.customize-button:disabled{opacity:.48;cursor:default}.more-control{position:relative}.more-button{width:36px;padding:0}.more-menu{position:absolute;z-index:30;top:calc(100% + 7px);right:0;width:226px;padding:5px;border:1px solid var(--line);border-radius:11px;background:var(--material);box-shadow:var(--shadow);-webkit-backdrop-filter:blur(14px) saturate(1.08);backdrop-filter:blur(14px) saturate(1.08);animation:pop-in .19s ease both}.more-menu button{width:100%;min-height:38px;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:0 10px;border:0;border-radius:7px;background:transparent;color:var(--text);font-size:12px;text-align:left;cursor:pointer}.more-menu button:hover{background:var(--surface-soft)}.more-menu button:disabled{color:var(--disabled);cursor:default}.more-menu button:disabled:hover{background:transparent}.more-menu kbd{color:var(--quiet);font-size:10px}.more-menu hr{height:1px;margin:4px 7px;border:0;background:var(--line)}.scene-control{position:absolute;z-index:12;top:calc(var(--header-height) + 12px);left:14px}.scene-trigger{min-height:44px;display:inline-flex;align-items:center;gap:8px;padding:0 11px 0 12px;border:1px solid var(--line);border-radius:12px;background:var(--material);box-shadow:0 3px 12px #20343a12;-webkit-backdrop-filter:blur(12px) saturate(1.06);backdrop-filter:blur(12px) saturate(1.06);color:var(--text);cursor:pointer;transition:background-color .19s ease,border-color .19s ease,transform .19s ease}.scene-trigger:hover,.scene-trigger[aria-expanded=true]{border-color:var(--line-strong);background:var(--surface)}.scene-trigger:active{transform:scale(.98)}.scene-trigger>span{color:var(--muted);font-size:10px}.scene-trigger>strong{font-size:12px;font-weight:600}.scene-trigger .icon{width:14px;height:14px;color:var(--quiet)}.scene-popover{position:absolute;top:51px;left:0;width:min(356px,calc(100vw - 28px));max-height:min(650px,calc(100svh - 182px));overflow:auto;padding:15px;border:1px solid var(--line);border-radius:14px;background:var(--material);box-shadow:var(--shadow);-webkit-backdrop-filter:blur(16px) saturate(1.06);backdrop-filter:blur(16px) saturate(1.06);scrollbar-color:var(--line-strong) transparent;animation:pop-in .19s ease both}.popover-heading,.sheet-heading,.section-heading-row,.scene-group-heading{display:flex;align-items:center;justify-content:space-between;gap:12px}.popover-heading{margin-bottom:13px}.popover-heading>div,.sheet-heading>div{min-width:0}.popover-heading strong,.sheet-heading strong{display:block;color:var(--text);font-size:15px;font-weight:650;letter-spacing:-.01em}.popover-heading span,.sheet-heading span{display:block;margin-top:3px;color:var(--muted);font-size:10px}.scene-group{padding:13px 0;border-top:1px solid var(--line)}.scene-group-label{display:block;margin-bottom:8px;color:var(--muted);font-size:10px;font-weight:650;letter-spacing:.06em;text-transform:uppercase}.scene-group-heading{align-items:baseline}.scene-group-heading .scene-group-label{margin-bottom:8px}.scene-group-heading output{color:var(--quiet);font-size:10px}.representation-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:4px}.representation-grid button{min-height:42px;display:flex;align-items:center;justify-content:space-between;gap:8px;padding:0 10px;border:1px solid transparent;border-radius:8px;background:transparent;color:var(--muted);font-size:11px;text-align:left;cursor:pointer}.representation-grid button:hover:not(:disabled){background:var(--surface-soft);color:var(--text)}.representation-grid button.is-active{border-color:color-mix(in srgb,var(--accent) 32%,var(--line));background:var(--accent-soft);color:var(--text)}.representation-grid button:disabled{color:var(--disabled);cursor:default}.representation-grid button .icon{width:14px;height:14px;color:var(--accent)}.capability-note,.cell-origin-note{display:block;margin-top:7px;color:var(--quiet);font-size:10px;line-height:1.4}.toggle-row,.choice-row{min-height:44px;display:flex;align-items:center;justify-content:space-between;gap:12px;color:var(--text);font-size:12px}.toggle-row.is-disabled,.choice-row.is-disabled{color:var(--disabled)}.toggle-row>button[role=switch],.vim-heading>button[role=switch]{position:relative;width:34px;height:20px;flex:0 0 auto;padding:0;border:0;border-radius:999px;background:var(--line-strong);cursor:pointer;transition:background-color .19s ease}.toggle-row>button[role=switch] i,.vim-heading>button[role=switch] i{position:absolute;top:3px;left:3px;width:14px;height:14px;border-radius:50%;background:#fff;box-shadow:0 1px 3px #14232833;transition:transform .19s ease}.toggle-row>button[role=switch][aria-checked=true],.vim-heading>button[role=switch][aria-checked=true]{background:var(--accent)}.toggle-row>button[role=switch][aria-checked=true] i,.vim-heading>button[role=switch][aria-checked=true] i{transform:translate(14px)}.toggle-row>button[role=switch]:disabled{cursor:default;opacity:.55}.mini-segmented,.settings-segmented{display:flex;min-height:34px;padding:2px;border-radius:8px;background:var(--surface-soft)}.mini-segmented{width:150px}.mini-segmented button,.settings-segmented button{min-width:0;min-height:30px;flex:1 1 0;padding:0 7px;border:0;border-radius:6px;background:transparent;color:var(--muted);font-size:10px;cursor:pointer}.mini-segmented button.is-active,.settings-segmented button.is-active{background:var(--surface);box-shadow:0 1px 3px #1f33391a;color:var(--text);font-weight:600}.image-presets{display:flex;gap:4px;margin-bottom:8px}.image-presets button{min-height:32px;flex:1 1 0;padding:0 8px;border:1px solid var(--line);border-radius:7px;background:transparent;color:var(--muted);font-size:10px;cursor:pointer}.image-presets button:hover{border-color:var(--line-strong);background:var(--surface-soft);color:var(--text)}.image-presets button.is-active{border-color:color-mix(in srgb,var(--accent) 32%,var(--line));background:var(--accent-soft);color:var(--text)}.image-ranges{display:grid;gap:5px}.image-axis{min-height:36px;display:grid;grid-template-columns:22px 1fr 10px 1fr;align-items:center;padding:0 6px;border:1px solid var(--line);border-radius:8px}.image-axis>span{color:var(--muted);font-family:var(--numeric);font-size:10px}.image-axis>i{color:var(--quiet);font-style:normal;font-size:10px;text-align:center}.image-axis select{min-width:0;width:100%;height:30px;padding:0 4px;border:0;background:transparent;color:var(--text);font-family:var(--numeric);font-size:10px;text-align:center}.image-axis.is-disabled{opacity:.42}.scene-actions{display:flex;align-items:center;justify-content:flex-start;gap:5px;margin:0 -15px -15px;padding:11px 15px 15px;border-top:1px solid var(--line);background:var(--surface)}.scene-actions button{min-height:38px;padding:0 10px;border:0;border-radius:8px;background:transparent;color:var(--muted);font-size:10px;cursor:pointer}.scene-actions button:hover{background:var(--surface-soft);color:var(--text)}.scene-actions button.is-active{background:var(--accent-soft);color:var(--text)}.orientation-control{position:absolute;z-index:11;top:calc(var(--header-height) + 12px);right:14px;display:flex;padding:3px;border:1px solid var(--line);border-radius:12px;background:var(--material);box-shadow:0 3px 12px #20343a12;-webkit-backdrop-filter:blur(12px) saturate(1.06);backdrop-filter:blur(12px) saturate(1.06)}.orientation-control button{min-width:38px;height:36px;display:grid;place-items:center;padding:0 7px;border:0;border-radius:8px;background:transparent;color:var(--quiet);font-family:var(--numeric);font-size:10px;cursor:pointer}.orientation-control button:hover,.orientation-control button.is-active{background:var(--surface-soft);color:var(--text)}.orientation-control button.is-active{font-weight:650}.orientation-control button .icon{width:18px;height:18px;color:var(--accent)}.inspector{position:absolute;z-index:14;top:calc(var(--header-height) + 12px);right:14px;bottom:76px;width:316px;overflow:auto;padding:16px 18px 20px;border:1px solid var(--line);border-radius:14px;background:var(--material);box-shadow:var(--shadow);-webkit-backdrop-filter:blur(16px) saturate(1.04);backdrop-filter:blur(16px) saturate(1.04);visibility:hidden;pointer-events:none;opacity:0;transform:translate(14px) scale(.99);transform-origin:top right;transition:opacity .19s ease,transform .19s ease,visibility 0ms linear .19s;scrollbar-color:var(--line-strong) transparent}.inspector.is-open{visibility:visible;pointer-events:auto;opacity:1;transform:translate(0) scale(1);transition-delay:0ms}.panel-heading{min-height:36px;display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding-bottom:7px}.panel-heading h2{margin:0;font-size:16px;line-height:1.3;font-weight:650;letter-spacing:-.01em}.close-inspector{width:32px;min-width:32px;height:32px;padding:0}.readout-section{padding:13px 0}.readout-section+.readout-section{border-top:1px solid var(--line)}.readout-section h3{margin:0 0 9px;color:var(--muted);font-size:11px;font-weight:650;letter-spacing:.06em;text-transform:uppercase}.section-heading-row{min-height:18px;align-items:baseline;margin-bottom:8px}.section-heading-row h3{margin:0}.section-heading-row>span,.section-heading-row>output{color:var(--quiet);font-size:10px}.readout{min-height:27px;display:grid;grid-template-columns:minmax(82px,.82fr) minmax(0,1.18fr);align-items:baseline;gap:10px}.readout span{color:var(--muted);font-size:12px}.readout strong{overflow:hidden;color:var(--text);font-family:var(--numeric);font-size:12px;font-weight:500;text-align:right;text-overflow:ellipsis;white-space:nowrap}.readout.is-accent strong{color:var(--accent);font-weight:650}.cell-metrics-section .readout{grid-template-columns:66px minmax(0,1fr)}.quiet-copy{margin:2px 0 4px;color:var(--muted);font-size:11px;line-height:1.5}.vector-readout{margin:8px 0 9px}.vector-readout>span{display:block;margin-bottom:6px;color:var(--muted);font-size:11px}.vector-readout code{display:grid;grid-template-columns:14px 1fr;row-gap:5px;padding-left:9px;border-left:2px solid var(--line-strong);color:var(--text);font-family:var(--numeric);font-size:10px;line-height:1.25}.vector-readout code i{color:var(--quiet);font-style:normal}.vector-readout code b{position:absolute;right:18px;color:var(--quiet);font-size:10px;font-weight:500}.force-scale{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:8px}.force-scale>span{color:var(--quiet);font-family:var(--numeric);font-size:10px}.timeline{position:absolute;z-index:18;left:50%;bottom:12px;width:min(960px,calc(100% - 28px));min-height:52px;padding:5px 9px 8px;border:1px solid var(--line);border-radius:14px;background:var(--material);box-shadow:0 5px 20px #1f333917;-webkit-backdrop-filter:blur(14px) saturate(1.04);backdrop-filter:blur(14px) saturate(1.04);transform:translate(-50%)}.timeline.is-compact{height:52px;padding-block:4px}.transport-row{min-height:42px;display:flex;align-items:center;gap:10px}.transport-buttons{display:flex;flex:0 0 auto;align-items:center}.transport-button,.play-button{width:40px;height:40px;display:grid;place-items:center;padding:0;border:0;border-radius:9px;background:transparent;color:var(--muted);cursor:pointer}.play-button{color:var(--text)}.transport-button:hover:not(:disabled),.play-button:hover:not(:disabled){background:var(--surface-soft);color:var(--accent)}.transport-button:disabled,.play-button:disabled{opacity:.28;cursor:default}.transport-button .icon,.play-button .icon{width:17px;height:17px}.scrubber{min-width:40px;flex:1 1 auto;display:flex;align-items:center}input[type=range]{width:100%;height:28px;margin:0;appearance:none;background:transparent;cursor:pointer}input[type=range]::-webkit-slider-runnable-track{height:3px;border-radius:3px;background:var(--line-strong)}input[type=range]::-webkit-slider-thumb{width:13px;height:13px;margin-top:-5px;appearance:none;border:2px solid var(--surface);border-radius:50%;background:var(--accent);box-shadow:0 0 0 1px var(--accent)}input[type=range]::-moz-range-track{height:3px;border-radius:3px;background:var(--line-strong)}input[type=range]::-moz-range-thumb{width:11px;height:11px;border:2px solid var(--surface);border-radius:50%;background:var(--accent)}.frame-counter{min-width:74px;color:var(--text);font-size:10px;font-weight:600;text-align:right}.speed-control select,.plot-label select{border:0;background:transparent;cursor:pointer}.speed-control select{width:54px;padding:6px 2px 6px 5px;color:var(--muted);font-family:var(--numeric);font-size:10px;text-align:right}.plot-row{position:relative;height:67px;display:flex;align-items:stretch;gap:12px;padding-top:3px;border-top:1px solid var(--line)}.plot-label{width:106px;display:flex;flex:0 0 auto;flex-direction:column;justify-content:center;gap:3px;overflow:hidden}.plot-label select{width:100%;overflow:hidden;padding:0;color:var(--text);font-size:11px;font-weight:600;text-overflow:ellipsis;white-space:nowrap}.plot-label small{color:var(--quiet);font-family:var(--numeric);font-size:10px}.series-plot{position:relative;min-width:0;flex:1 1 auto}.series-plot svg{width:100%;height:100%;display:block;overflow:visible;cursor:crosshair;touch-action:none}.plot-grid{stroke:var(--line);stroke-width:1;vector-effect:non-scaling-stroke}.series-line{fill:none;stroke:var(--muted);stroke-width:1.5;vector-effect:non-scaling-stroke}.empty-series-line{stroke:var(--line-strong);stroke-width:1;stroke-dasharray:4 6;vector-effect:non-scaling-stroke}.frame-marker{stroke:var(--accent);stroke-width:1.25;opacity:.82;vector-effect:non-scaling-stroke}.frame-point{fill:var(--surface);stroke:var(--accent);stroke-width:2}.plot-range{position:absolute;inset:4px 3px 4px auto;display:flex;flex-direction:column;justify-content:space-between;color:var(--quiet);font-family:var(--numeric);font-size:10px;pointer-events:none}.frame-error{position:static;max-width:76px;flex:0 1 auto;overflow:hidden;padding:3px 6px;border-radius:5px;background:var(--surface);color:var(--error);font-size:10px;text-overflow:ellipsis;white-space:nowrap}.frame-error-compact{display:none}.command-backdrop,.customize-backdrop{position:absolute;z-index:50;inset:var(--header-height) 0 0;background:#141f232e;animation:fade-in .19s ease both}.command-backdrop{display:grid;place-items:start center;padding:min(14vh,120px) 16px 24px}:root[data-appearance=dark] .command-backdrop,:root[data-appearance=dark] .customize-backdrop{background:#00000057}.command-palette{width:min(560px,100%);max-height:min(620px,calc(100svh - 150px));overflow:hidden;border:1px solid var(--line);border-radius:16px;background:var(--material);box-shadow:var(--shadow);-webkit-backdrop-filter:blur(16px) saturate(1.06);backdrop-filter:blur(16px) saturate(1.06);animation:palette-in .21s ease both}.command-search{height:56px;display:flex;align-items:center;gap:10px;padding:0 15px;border-bottom:1px solid var(--line)}.command-search .icon{width:19px;height:19px;color:var(--quiet)}.command-search input{min-width:0;flex:1 1 auto;border:0;outline:0;background:transparent;color:var(--text);font-size:15px}.command-search input::placeholder{color:var(--quiet)}.command-search kbd{color:var(--quiet);font-size:10px}.command-results{max-height:min(500px,calc(100svh - 220px));overflow:auto;padding:6px;scrollbar-color:var(--line-strong) transparent}.command-results>button{width:100%;min-height:44px;display:flex;align-items:center;justify-content:space-between;gap:14px;padding:0 11px;border:0;border-radius:9px;background:transparent;color:var(--text);font-size:12px;text-align:left;cursor:pointer}.command-results>button:hover,.command-results>button.is-active,.command-results>button[aria-selected=true]{background:var(--accent-soft)}.command-results>button[aria-disabled=true]{color:var(--disabled);cursor:default}.command-results>button kbd{color:var(--quiet);font-size:10px}.command-results>button small{max-width:56%;color:var(--quiet);font-size:10px;line-height:1.35;text-align:right}.command-results>p{margin:0;padding:32px 18px;color:var(--muted);font-size:12px;text-align:center}.shortcut-backdrop{padding-top:min(10vh,76px)}.shortcut-panel{width:min(720px,100%);max-height:min(680px,calc(100svh - 120px));overflow:auto;border:1px solid var(--line);border-radius:16px;background:var(--surface);box-shadow:var(--shadow);animation:palette-in .21s ease both;scrollbar-color:var(--line-strong) transparent}.shortcut-heading,.vim-heading{display:flex;align-items:flex-start;justify-content:space-between;gap:18px}.shortcut-heading{min-height:66px;padding:15px 16px 12px 18px;border-bottom:1px solid var(--line)}.shortcut-heading strong,.shortcut-heading span,.vim-heading strong,.vim-heading span{display:block}.shortcut-heading strong{color:var(--text);font-size:14px;font-weight:650}.shortcut-heading span,.vim-heading span{margin-top:3px;color:var(--quiet);font-size:10px}.shortcut-groups{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,13.5em),1fr));gap:12px 16px;padding:4px 18px 14px}.shortcut-groups>section{min-width:0;padding:13px 0 4px}.shortcut-groups>section+section{padding-left:0;border-left:0}.shortcut-groups h3{margin:0 0 7px;color:var(--muted);font-size:10px;font-weight:650;letter-spacing:.06em;text-transform:uppercase}.shortcut-row{min-height:32px;display:grid;grid-template-columns:minmax(7em,max-content) minmax(0,1fr);align-items:center;gap:9px;color:var(--muted);font-size:10px}.shortcut-row>span{min-width:0;overflow-wrap:anywhere}.shortcut-row kbd{width:fit-content;max-width:100%;padding:3px 5px;border:1px solid var(--line);border-radius:5px;background:var(--surface);color:var(--text);font-size:9px;white-space:nowrap}.vim-shortcuts{padding:14px 18px 17px;border-top:1px solid var(--line)}.vim-heading{align-items:center}.vim-heading strong{color:var(--text);font-size:11px;font-weight:650}.vim-shortcut-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,11.5em),1fr));gap:0 12px;margin-top:9px;transition:opacity .18s ease}.vim-shortcuts:not(.is-active) .vim-shortcut-grid{opacity:.62}.customize-sheet{position:absolute;z-index:51;top:12px;right:14px;bottom:14px;width:min(376px,calc(100% - 28px));overflow:auto;padding:17px 18px 18px;border:1px solid var(--line);border-radius:16px;background:var(--material);box-shadow:var(--shadow);-webkit-backdrop-filter:blur(16px) saturate(1.06);backdrop-filter:blur(16px) saturate(1.06);animation:sheet-in .21s ease both;scrollbar-color:var(--line-strong) transparent}.render-sheet{bottom:auto;max-height:calc(100svh - var(--header-height) - 26px);background:var(--surface);-webkit-backdrop-filter:none;backdrop-filter:none}.sheet-heading{min-height:36px;align-items:flex-start;padding-bottom:11px}.settings-section{padding:14px 0;border-top:1px solid var(--line)}.settings-section h3{margin:0 0 10px;color:var(--muted);font-size:10px;font-weight:650;letter-spacing:.06em;text-transform:uppercase}.settings-section>small{display:block;margin-top:8px;color:var(--quiet);font-size:10px;line-height:1.4}.settings-link{width:100%;min-height:38px;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:0;border:0;border-top:1px solid var(--line);background:transparent;color:var(--muted);font-size:11px;cursor:pointer}.settings-link:hover{color:var(--text)}.settings-link kbd{color:var(--quiet);font-size:10px}.keyboard-settings .toggle-row{min-height:38px}.inline-settings{display:grid;gap:7px}.inline-setting{display:grid;grid-template-columns:76px minmax(0,1fr);align-items:center;gap:9px}.inline-setting>span{color:var(--muted);font-size:10px}.customize-pair{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));column-gap:14px;border-top:1px solid var(--line)}.customize-pair .settings-section{min-width:0;border-top:0}#customize-sheet .settings-section{padding:12px 0}.geometry-settings{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px}.slider-settings .geometry-settings label{min-width:0;min-height:44px;grid-template-columns:1fr;align-content:center;gap:2px}.settings-segmented{min-height:36px;border-radius:9px}.settings-segmented button{min-height:32px;border-radius:7px;font-size:10px}.settings-choice{width:100%;min-height:54px;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:8px 10px;border:1px solid transparent;border-radius:9px;background:transparent;color:var(--text);text-align:left;cursor:pointer}.settings-choice:hover,.settings-choice.is-active{background:var(--surface-soft)}.settings-choice.is-active{border-color:color-mix(in srgb,var(--accent) 32%,var(--line))}.settings-choice strong,.settings-choice small{display:block}.settings-choice strong{font-size:11px;font-weight:600}.settings-choice small{margin-top:3px;color:var(--quiet);font-size:10px}.settings-choice .icon{width:15px;height:15px;color:var(--accent)}.render-presets{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px}.render-presets button{min-height:54px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;padding:0 6px;border:1px solid var(--line);border-radius:9px;background:transparent;color:var(--text);cursor:pointer}.render-presets button:hover{border-color:var(--line-strong);background:var(--surface-soft)}.render-presets button.is-active{border-color:color-mix(in srgb,var(--accent) 32%,var(--line));background:var(--accent-soft)}.render-presets strong{font-size:11px;font-weight:600}.render-presets small{color:var(--muted);font-family:var(--numeric);font-size:10px}.render-size{display:grid;grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);align-items:end;gap:8px}.render-size label{display:grid;gap:6px;color:var(--muted);font-size:10px}.render-size input{min-width:0;width:100%;height:38px;padding:0 9px;border:1px solid var(--line);border-radius:8px;background:var(--surface);color:var(--text);font-family:var(--numeric);font-size:11px}.render-size>i{padding-bottom:11px;color:var(--quiet);font-style:normal;font-size:11px}.render-options-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));column-gap:14px;border-top:1px solid var(--line)}.render-options-grid .settings-section{min-width:0;border-top:0}.slider-settings label{min-height:38px;display:grid;grid-template-columns:86px minmax(0,1fr);align-items:center;gap:10px}.slider-settings label>span{display:flex;align-items:center;justify-content:space-between;gap:8px;color:var(--muted);font-size:10px}.slider-settings output{color:var(--text);font-size:10px}.sheet-actions{position:sticky;z-index:1;bottom:-18px;display:flex;justify-content:flex-end;gap:6px;margin:0 -18px -18px;padding:12px 18px 18px;border-top:1px solid var(--line);background:var(--surface)}.sheet-actions>button{min-height:38px;padding:0 13px;border:0;border-radius:8px;background:transparent;color:var(--muted);font-size:11px;cursor:pointer}.sheet-actions>button:hover{background:var(--surface-soft);color:var(--text)}.sheet-actions>button.primary{background:var(--accent);color:#fff;font-weight:600}.sheet-actions>button:disabled,.render-presets button:disabled,.render-sheet .icon-button:disabled{opacity:.5;cursor:default}.drop-overlay{position:absolute;z-index:60;inset:var(--header-height) 0 0;display:grid;place-items:center;padding:24px;background:color-mix(in srgb,var(--canvas) 82%,transparent);-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);pointer-events:none;animation:fade-in .15s ease both}.drop-overlay>div{min-width:min(340px,90vw);padding:28px 32px;border:1px solid color-mix(in srgb,var(--accent) 52%,var(--line));border-radius:16px;background:var(--material);box-shadow:var(--shadow);color:var(--text);text-align:center}.drop-overlay .icon{width:27px;height:27px;margin:0 auto 10px;color:var(--accent)}.drop-overlay strong,.drop-overlay span{display:block}.drop-overlay strong{font-size:16px;font-weight:650}.drop-overlay span{margin-top:6px;color:var(--muted);font-size:11px}.notice{position:absolute;z-index:45;left:50%;bottom:78px;max-width:min(440px,calc(100% - 32px));max-height:min(120px,calc(100% - 24px));overflow:hidden;overflow-wrap:anywhere;padding:9px 13px;border:1px solid var(--line);border-radius:9px;background:var(--material);box-shadow:0 4px 15px #1f333917;color:var(--text);font-size:11px;line-height:1.35;white-space:normal;transform:translate(-50%);animation:notice-in .19s ease both}.notice>span{min-width:0;overflow-wrap:anywhere}.notice.is-error{width:min(440px,calc(100% - 16px));max-width:min(440px,calc(100% - 16px));display:grid;grid-template-columns:minmax(0,1fr) 44px;align-items:start;gap:6px;border-color:color-mix(in srgb,var(--error) 30%,var(--line))}.notice.is-error>span{max-height:100px;overflow:auto;overscroll-behavior:contain;scrollbar-color:var(--line-strong) transparent;scrollbar-gutter:stable}.notice-dismiss{width:44px;height:44px;display:grid;place-items:center;margin:-6px -8px -6px 0;padding:0;border:0;border-radius:6px;background:transparent;color:var(--muted);cursor:pointer}.notice-dismiss:hover{background:var(--surface-soft);color:var(--text)}.notice-dismiss .icon{width:16px;height:16px}.notice.is-busy:before{content:"";width:7px;height:7px;display:inline-block;margin-right:8px;border-radius:50%;background:var(--accent);animation:pulse 1.1s ease-in-out infinite}.centered-state{position:absolute;z-index:18;inset:var(--header-height) 0 0;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px;background:var(--canvas);text-align:center}.centered-state h1{margin:18px 0 0;font-size:17px;font-weight:650;letter-spacing:-.01em}.centered-state p{max-width:360px;margin:7px 0 0;color:var(--muted);font-size:12px;line-height:1.5}.centered-state button{min-height:40px;display:inline-flex;align-items:center;gap:7px;margin-top:17px;padding:0 13px;border:1px solid var(--line);border-radius:9px;background:var(--surface);color:var(--text);font-size:11px;cursor:pointer}.centered-state button:hover{border-color:var(--accent);color:var(--accent)}.state-orbit{position:relative;width:48px;height:48px}.state-orbit i{position:absolute;inset:13px 2px;border:1px solid var(--muted);border-radius:50%;transform:rotate(30deg)}.state-orbit i:nth-child(2){transform:rotate(-30deg)}.state-orbit b{position:absolute;top:21px;left:21px;width:6px;height:6px;border-radius:50%;background:var(--accent)}.state-orbit.is-busy{animation:orbit-spin 1.8s linear infinite}@keyframes pop-in{0%{opacity:0;transform:translateY(-5px) scale(.985)}}@keyframes palette-in{0%{opacity:0;transform:translateY(-8px) scale(.985)}}@keyframes sheet-in{0%{opacity:0;transform:translate(12px) scale(.99)}}@keyframes mobile-sheet-in{0%{opacity:0;transform:translateY(18px) scale(.99)}}@keyframes notice-in{0%{opacity:0;transform:translate(-50%,6px)}}@keyframes fade-in{0%{opacity:0}}@keyframes orbit-spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.35}}@media(max-width:760px){.panel-button,.render-button{min-width:44px;flex-shrink:0}.scene-status,.command-button{display:none}.topbar{padding-right:4px}.open-button,.customize-button,.more-button,.icon-button{min-width:44px;height:44px}.more-menu button,.representation-grid button,.image-presets button,.scene-actions button,.sheet-actions>button,.centered-state button{min-height:44px}.mini-segmented,.settings-segmented{min-height:48px}.mini-segmented button,.settings-segmented button{min-height:44px}.image-axis{min-height:48px}.image-axis select,.speed-control select,.plot-label select,.render-size input,input[type=range]{height:44px}.toggle-row>button[role=switch],.vim-heading>button[role=switch]{width:44px;height:44px;background:transparent}.toggle-row>button[role=switch]:before,.vim-heading>button[role=switch]:before{content:"";position:absolute;top:12px;left:5px;width:34px;height:20px;border-radius:999px;background:var(--line-strong);transition:background-color .19s ease}.toggle-row>button[role=switch] i,.vim-heading>button[role=switch] i{top:15px;left:8px}.toggle-row>button[role=switch][aria-checked=true],.vim-heading>button[role=switch][aria-checked=true]{background:transparent}.toggle-row>button[role=switch][aria-checked=true]:before,.vim-heading>button[role=switch][aria-checked=true]:before{background:var(--accent)}.scene-control{top:calc(var(--header-height) + 8px);left:8px}.scene-popover{position:fixed;z-index:40;inset:auto 8px 70px;width:auto;max-height:min(68svh,610px);border-radius:16px;animation-name:mobile-sheet-in}.orientation-control{top:calc(var(--header-height) + 8px);right:8px}.orientation-control button{min-width:44px;height:44px}.inspector{position:fixed;z-index:36;inset:auto 8px 70px;width:auto;max-height:min(56svh,520px);opacity:0;transform:translateY(18px) scale(.99);transform-origin:bottom center}.inspector.is-open{opacity:1;transform:translateY(0) scale(1)}.timeline{bottom:8px;width:calc(100% - 16px);padding-inline:5px;border-radius:13px}.transport-row{gap:4px}.transport-button,.play-button{width:44px;height:44px}.frame-counter{min-width:58px;font-size:10px}.speed-control select{width:46px}.plot-row{height:72px;gap:7px}.plot-label{width:74px}.plot-range{display:none}.notice{bottom:72px}.command-backdrop{position:fixed;inset:0;align-items:end;padding:8px}.command-palette{max-height:min(74svh,620px);border-radius:17px;animation-name:mobile-sheet-in}.command-results{max-height:calc(74svh - 56px)}.command-results>button{min-height:48px}.shortcut-panel{max-height:calc(100svh - 16px);border-radius:17px;animation-name:mobile-sheet-in}.shortcut-groups{grid-template-columns:1fr}.shortcut-groups>section{padding:13px 0 8px}.shortcut-groups>section+section{padding-left:0;border-top:1px solid var(--line);border-left:0}.vim-shortcut-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.customize-backdrop{position:fixed;inset:0}.customize-sheet{position:absolute;inset:auto 8px 8px;width:auto;max-height:min(78svh,660px);border-radius:17px;animation-name:mobile-sheet-in}.render-sheet{max-height:calc(100svh - 68px)}.toggle-row,.choice-row{min-height:48px}}.scrubber-shell{position:relative;min-width:40px;flex:1 1 auto}.scrubber-shell .scrubber{width:100%}.trajectory-marker-rail{position:absolute;right:6px;bottom:2px;left:6px;height:8px;pointer-events:none}.trajectory-marker{position:absolute;top:-8px;width:24px;height:24px;margin:0;padding:0;border:0;background:transparent;cursor:pointer;pointer-events:auto;transform:translate(-50%)}.trajectory-marker:after{position:absolute;top:9px;left:11px;width:3px;height:6px;border-radius:2px;background:var(--quiet);content:""}.trajectory-marker.is-reference:after{top:8px;left:8px;width:7px;height:7px;border:1px solid var(--surface);border-radius:1px;background:var(--accent);transform:rotate(45deg)}.timeline-options>div{max-height:min(620px,calc(100vh - var(--header-height) - var(--timeline-height) - 24px));overflow-y:auto}.timeline-action-list{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:4px}.timeline-action-list button{min-width:0;min-height:32px;overflow:hidden;padding:0 8px;border:1px solid var(--line-soft);border-radius:5px;background:var(--surface);color:var(--text);font-size:10px;text-align:left;text-overflow:ellipsis;white-space:nowrap;cursor:pointer}.timeline-action-list button:hover{border-color:var(--line-strong);background:var(--surface-soft)}.timeline-action-list button:disabled{opacity:.42;cursor:default}@media(max-width:760px){.timeline-action-list button{min-height:40px}}.measurement-plot__header{overflow:hidden}.measurement-plot__meta{min-width:72px;max-width:220px;flex:0 1 220px;display:flex;align-items:baseline;gap:7px;overflow:hidden}.measurement-plot__meta strong{min-width:0;overflow:hidden;color:var(--text);font-family:Inter,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;font-size:12px;font-weight:650;text-overflow:ellipsis;white-space:nowrap}.measurement-plot__meta span{flex:0 0 auto;white-space:nowrap}.measurement-plot__legend{min-width:0;flex:1 1 auto;display:flex;align-items:center;gap:3px;overflow-x:auto;scrollbar-width:none}.measurement-plot__legend::-webkit-scrollbar{display:none}.measurement-plot__legend-item{min-width:0;height:26px;display:inline-flex;flex:0 1 auto;align-items:center;gap:5px;overflow:hidden;padding:0 6px;border:0;border-radius:5px;background:transparent;color:var(--muted);font-size:11px;white-space:nowrap}button.measurement-plot__legend-item{cursor:pointer}button.measurement-plot__legend-item:hover{background:var(--surface-soft);color:var(--text)}.measurement-plot__legend-item>span:not(.measurement-plot__legend-swatch){max-width:150px;overflow:hidden;text-overflow:ellipsis}.measurement-plot__legend-item output{color:var(--text);font-family:var(--numeric)}.measurement-plot__legend-swatch{width:8px;height:2px;flex:0 0 auto;border-radius:2px}.measurement-plot__header-actions,.measurement-plot__context-actions{flex:0 0 auto;display:flex;align-items:center}.measurement-plot__close{width:30px;min-width:30px!important;padding:0!important;font-size:17px!important;font-weight:400!important}.rdf-view-toggle{display:flex;padding:2px;border-radius:5px;background:var(--surface-soft)}.rdf-view-toggle button{min-width:38px;height:26px;padding:0 7px;border:0;border-radius:4px;background:transparent;color:var(--muted);font:600 10px var(--numeric);cursor:pointer}.rdf-view-toggle button.is-active{background:var(--surface);color:var(--accent);box-shadow:0 1px 3px color-mix(in srgb,var(--text) 12%,transparent)}.rdf-sheet{position:absolute;z-index:42;bottom:calc(var(--timeline-height) + 12px);left:50%;width:min(390px,calc(100% - 24px));max-height:calc(100svh - var(--header-height) - var(--timeline-height) - 24px);display:grid;grid-template-rows:auto minmax(0,1fr) auto;overflow:hidden;border:1px solid var(--line);border-radius:10px;background:var(--surface);box-shadow:0 14px 44px color-mix(in srgb,var(--text) 16%,transparent);transform:translate(-50%)}.rdf-sheet>header,.rdf-sheet>footer{min-height:44px;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:0 12px}.rdf-sheet>header{border-bottom:1px solid var(--line-soft)}.rdf-sheet>header strong{font-size:12px}.rdf-sheet>header button{width:32px;height:32px;padding:0;border:0;border-radius:5px;background:transparent;color:var(--muted);font-size:18px;cursor:pointer}.rdf-sheet__body{display:grid;gap:8px;overflow-y:auto;overscroll-behavior:contain;padding:12px}.rdf-sheet__body>label,.rdf-sheet__body details>div>label{display:grid;grid-template-columns:64px minmax(0,1fr);align-items:center;gap:9px;color:var(--muted);font-size:10px}.rdf-sheet select,.rdf-sheet input{width:100%;height:36px;min-width:0;padding:0 9px;border:1px solid var(--line);border-radius:6px;background:var(--surface);color:var(--text);font-size:11px}.rdf-sheet__body details{padding-top:2px}.rdf-sheet__body summary{color:var(--muted);font-size:10px;cursor:pointer}.rdf-sheet__body details>div{display:grid;gap:8px;padding-top:8px}.rdf-sheet>footer{border-top:1px solid var(--line-soft);color:var(--quiet);font-size:11px}.rdf-sheet>footer button{min-width:72px;height:34px;border:0;border-radius:6px;background:var(--accent);color:var(--surface);font-size:10px;font-weight:650;cursor:pointer}.rdf-sheet>footer button:disabled{opacity:.35;cursor:default}.pinned-measurements{display:block;max-width:none;max-height:none;overflow:visible;padding:0}.pinned-measurements>summary{height:34px;display:flex;align-items:center;padding:0 11px;border:1px solid var(--line);border-radius:8px;background:color-mix(in srgb,var(--surface) 94%,transparent);box-shadow:0 3px 12px color-mix(in srgb,var(--text) 7%,transparent);color:var(--muted);font-size:10px;font-weight:650;cursor:pointer;list-style:none}.pinned-measurements>summary::-webkit-details-marker{display:none}.pinned-measurements[open]>summary{border-color:var(--line-strong);color:var(--text)}.pinned-measurements>section{position:absolute;top:calc(100% + 6px);left:0;width:min(360px,calc(100vw - 24px));overflow:hidden;border:1px solid var(--line);border-radius:9px;background:var(--surface);box-shadow:var(--shadow)}.pinned-measurements>section>header{min-height:40px;display:flex;align-items:center;justify-content:space-between;padding:0 8px 0 11px;border-bottom:1px solid var(--line-soft)}.pinned-measurements>section>header strong{font-size:10px}.pinned-measurements>section>header button{height:30px;padding:0 9px;border:0;border-radius:5px;background:var(--accent-soft);color:var(--accent);font-size:10px;font-weight:650;cursor:pointer}.pinned-measurements__list{max-height:250px;overflow-y:auto;padding:5px}.pinned-measurements__list>div{min-width:0;display:flex;align-items:stretch}.pinned-measurements .selection-chip{flex:1 1 auto;width:auto;max-width:none;box-shadow:none}@media(max-width:520px){.measurement-plot__meta{max-width:92px;flex-basis:92px}.measurement-plot__meta span{display:none}.measurement-plot__legend-item>span:not(.measurement-plot__legend-swatch){max-width:82px}.measurement-plot__actions button{min-width:36px;width:36px;padding-inline:3px}.rdf-sheet{bottom:calc(var(--timeline-height) + 8px);width:calc(100% - 16px)}.rdf-sheet select,.rdf-sheet input,.rdf-sheet>footer button{height:40px}.rdf-sheet>header button{width:40px;height:40px}.pinned-measurements{top:calc(var(--header-height) + 58px)}.selection-bar .selection-track-button{display:none}}@media(max-height:420px){.pinned-measurements[open]{z-index:45}.pinned-measurements>section{position:fixed;top:calc(var(--header-height) + 100px);bottom:calc(var(--timeline-height) + 8px);left:8px;width:min(360px,calc(100vw - 16px));display:grid;grid-template-rows:auto minmax(0,1fr)}.pinned-measurements__list{min-height:0;max-height:none;overscroll-behavior:contain}}@media(max-width:380px){.rdf-view-toggle button{min-width:34px;padding-inline:5px}}@media(max-width:520px){.identity>div{display:block}.identity strong,.identity span:last-child{display:block}.identity span:last-child{max-width:42vw;margin-top:2px;font-size:10px}.identity-mark{width:27px;height:27px}.open-button{width:44px;padding:0;font-size:0}.open-button .icon{width:18px;height:18px}.scene-trigger>span{display:none}.scene-trigger>strong{max-width:178px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.orientation-control button{min-width:44px;padding-inline:5px}.transport-buttons .transport-button:first-child,.transport-buttons .transport-button:last-child{width:44px}.frame-counter{min-width:54px}.speed-control select{width:42px;padding-inline:1px}}.workspace.timeline-absent{--timeline-height: 0px;--selection-bottom: 14px}.workspace.timeline-present{--timeline-height: 56px;--selection-bottom: 68px}.canvas-controls>button.is-active{background:var(--accent-soft);color:var(--accent);font-weight:650}.section-label{display:block;margin-bottom:8px;color:var(--quiet);font-size:11px;font-weight:700;letter-spacing:.075em;line-height:1.2;text-transform:uppercase}.section-label-spaced{margin-top:14px}.segmented-options{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:2px;padding:2px;border:1px solid var(--line);border-radius:8px;background:var(--surface-soft)}.segmented-options button{min-width:0;min-height:34px;padding:0 6px;border:1px solid transparent;border-radius:5px;background:transparent;color:var(--muted);font-size:12px;cursor:pointer}.segmented-options button:hover:not(:disabled){color:var(--text)}.segmented-options button.is-active{border-color:var(--line);background:var(--surface);color:var(--accent);font-weight:650}.representation-options{grid-template-columns:repeat(2,minmax(0,1fr))}.display-toggles .section-label{margin:4px 0 2px}.display-toggles .vector-scale-row+.toggle-row{border-top:1px solid var(--line)}.vector-scale-row{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:2px 10px;padding:1px 0 9px 12px;color:var(--muted);font-size:12px}.vector-scale-row input{grid-column:1 / -1;min-width:0}.vector-scale-row output{color:var(--text);font-size:11px}.selection-bar{position:absolute;z-index:16;bottom:var(--selection-bottom);left:50%;width:max-content;max-width:min(640px,calc(100% - 24px));min-height:48px;display:flex;align-items:center;gap:10px;padding:5px 5px 5px 13px;border:1px solid var(--line);border-radius:9px;background:var(--surface);box-shadow:0 5px 18px color-mix(in srgb,var(--text) 10%,transparent);transform:translate(-50%)}.selection-readout{min-width:0;flex:1 1 auto;display:flex;align-items:baseline;gap:9px;overflow:hidden}.selection-readout strong,.selection-readout output{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.selection-readout strong{min-width:0;flex:1 1 auto;font-size:11px}.selection-readout output{flex:0 1 auto;max-width:100%;color:var(--accent);font-size:10px}.selection-hint{color:var(--quiet);font-size:10px;white-space:nowrap}.selection-bar>button:not(.icon-button){flex:0 0 auto;min-width:56px;height:36px;padding:0 9px;border:0;border-radius:5px;background:transparent;color:var(--accent);font-size:10px;font-weight:650;cursor:pointer}.selection-bar>button:not(.icon-button):hover{background:var(--accent-soft)}.selection-bar .measurement-mode[aria-pressed=true]{background:var(--accent-soft)}.measurement-mode-compact{display:none}.selection-bar .icon-button{width:36px;padding:0}.timeline,.timeline.is-compact{height:var(--timeline-height);overflow:visible;padding:0 10px}.timeline .transport-row{min-height:var(--timeline-height);gap:9px}.transport-buttons{gap:0}.transport-button,.play-button{width:36px;height:40px;border-radius:5px}.play-button{color:var(--accent)}.frame-counter{min-width:66px;font-variant-numeric:tabular-nums}.frame-counter-compact{display:none}.frame-metadata{max-width:140px;overflow:hidden;color:var(--muted);font-family:var(--numeric);font-size:10px;text-overflow:ellipsis;white-space:nowrap}.timeline-options{position:relative;flex:0 0 auto}.timeline-options>summary{width:40px;height:40px;display:grid;place-items:center;border-radius:5px;color:var(--muted);cursor:pointer;list-style:none}.timeline-options>summary::-webkit-details-marker{display:none}.timeline-options>summary:hover,.timeline-options[open]>summary{background:var(--surface-soft);color:var(--text)}.timeline-options>div{position:absolute;right:0;bottom:calc(100% + 8px);width:244px;display:grid;gap:10px;padding:12px;border:1px solid var(--line);border-radius:9px;background:var(--surface);box-shadow:var(--shadow)}.timeline-options>div>label{min-height:34px;display:grid;grid-template-columns:1fr 112px;align-items:center;gap:12px;color:var(--muted);font-size:10px}.timeline-options select{width:100%;height:34px;padding:0 24px 0 8px;border:1px solid var(--line);border-radius:5px;background:var(--surface);color:var(--text);font-size:10px}.timeline-options .section-label{margin:3px 0 -3px}.workspace.timeline-present .notice{bottom:calc(var(--timeline-height) + 12px)}.workspace.selection-present .notice{bottom:calc(var(--selection-bottom) + 58px)}@media(min-width:761px){.workbench-open .selection-bar{left:calc((100% - var(--workbench-width) - 24px) / 2);max-width:calc(100% - var(--workbench-width) - 48px)}}@media(max-width:760px){.canvas-controls{right:8px;left:8px;width:auto;height:50px}.canvas-controls>button{min-width:0;height:44px;flex:1 1 0}.frame-metadata{display:none}.selection-bar{max-width:calc(100% - 16px);min-height:52px;gap:5px;padding:4px 4px 4px 11px}.selection-readout{flex:1 1 auto;flex-direction:column;align-items:flex-start;gap:1px}.selection-bar>button:not(.icon-button),.selection-bar .icon-button,.timeline-options>summary{height:44px}}@media(max-width:520px){.workspace.selection-present .workbench{max-height:calc(100% - var(--header-height) - var(--timeline-height) - 80px)}.transport-buttons .transport-button:first-child,.transport-buttons .transport-button:last-child{display:none}.timeline,.timeline.is-compact{padding-inline:4px}.timeline .transport-row{gap:4px}.transport-button,.play-button{width:40px;height:44px}.scrubber{min-width:36px}.frame-counter{min-width:54px;font-size:10px}.timeline-options>div{position:fixed;right:8px;bottom:calc(var(--timeline-height) + 8px);width:min(244px,calc(100vw - 16px))}}@media(max-width:360px){.speed-control{display:none}.representation-grid{grid-template-columns:1fr}}@media(max-width:340px){.orientation-control{top:calc(var(--header-height) + 60px)}}@media(prefers-reduced-motion:reduce){*,*:before,*:after{scroll-behavior:auto!important;animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}:root{--header-height: 48px;--viewport-toolbar-height: 46px;--workbench-width: 344px}.workspace{--timeline-height: 126px;background:var(--canvas)}.workspace.timeline-compact{--timeline-height: 58px}.molecule-canvas,.canvas-field{top:calc(var(--header-height) + var(--viewport-toolbar-height));width:100%;height:calc(100% - var(--header-height) - var(--viewport-toolbar-height) - var(--timeline-height));transition:width .18s ease}.workbench-open .molecule-canvas,.workbench-open .canvas-field{width:calc(100% - var(--workbench-width))}.topbar{height:var(--header-height);padding:0 8px 0 12px;gap:12px;background:var(--surface);box-shadow:none}.identity-mark{width:30px;height:30px}.identity strong{font-size:13px}.topbar-tools,.panel-button,.inspect-button,.render-button{display:flex;align-items:center}.topbar-tools{gap:4px}.open-button,.panel-button,.inspect-button,.render-button,.command-button,.more-button,.icon-button{min-width:36px;height:34px;border-radius:7px}.open-button,.panel-button,.inspect-button,.render-button{gap:7px;padding:0 10px;border:1px solid transparent;background:transparent;color:var(--muted);font-size:11px;cursor:pointer}.open-button:hover,.panel-button:hover,.panel-button[aria-expanded=true],.inspect-button:hover,.inspect-button[aria-expanded=true]{border-color:var(--line);background:var(--surface-soft);color:var(--text)}.render-button{border-color:var(--accent);background:var(--accent);color:#fff;font-weight:600}.render-button:hover:not(:disabled){background:color-mix(in srgb,var(--accent) 88%,#000)}.render-button:disabled{border-color:var(--line);background:var(--surface-soft);color:var(--disabled);cursor:default}.figure-control{display:flex;align-items:center}.figure-control .render-button{border-radius:7px 0 0 7px}.figure-options-button{width:30px;height:34px;display:grid;place-items:center;padding:0;border:1px solid var(--accent);border-left-color:color-mix(in srgb,var(--accent) 68%,#fff);border-radius:0 7px 7px 0;background:var(--accent);color:#fff;cursor:pointer}.figure-options-button:hover:not(:disabled),.figure-options-button[aria-expanded=true]{background:color-mix(in srgb,var(--accent) 84%,#000)}.figure-options-button:disabled{border-color:var(--line);background:var(--surface-soft);color:var(--disabled);cursor:default}.figure-options-button .icon{width:15px;height:15px}.open-button:disabled,.panel-button:disabled,.inspect-button:disabled,.command-button:disabled,.more-button:disabled{color:var(--disabled);cursor:default;opacity:.52}.panel-button .icon,.render-button .icon{width:16px;height:16px}.viewport-toolbar{position:absolute;z-index:11;top:var(--header-height);left:0;right:0;height:var(--viewport-toolbar-height);display:flex;align-items:center;gap:4px;padding:0 10px;border-bottom:1px solid var(--line);background:color-mix(in srgb,var(--surface) 94%,var(--canvas));transition:right .18s ease}.workbench-open .viewport-toolbar{right:var(--workbench-width)}.viewport-preset{min-width:58px;color:var(--muted);font-size:10px;font-weight:650;letter-spacing:.05em;text-transform:uppercase}.viewport-toolbar>label{height:32px;display:flex;align-items:center;gap:3px;padding:0 3px 0 9px;border:1px solid var(--line);border-radius:6px;background:var(--surface)}.viewport-toolbar>label>span{color:var(--quiet);font-size:11px;font-weight:600;text-transform:uppercase}.viewport-toolbar select{height:30px;max-width:126px;padding:0 24px 0 5px;border:0;background:transparent;color:var(--text);font-size:11px;font-weight:550;cursor:pointer}.viewport-toolbar>button{height:32px;padding:0 9px;border:1px solid transparent;border-radius:6px;background:transparent;color:var(--muted);font-size:10px;cursor:pointer}.viewport-toolbar>button:hover,.viewport-toolbar>button.is-active{border-color:var(--line);background:var(--surface);color:var(--text)}.viewport-toolbar>button.is-active{color:var(--accent);font-weight:650}.viewport-divider{width:1px;height:22px;margin:0 3px;background:var(--line)}.viewport-toolbar .orientation-control{position:static;display:flex;margin-left:auto;padding:0;border:0;border-radius:0;background:transparent;box-shadow:none;-webkit-backdrop-filter:none;backdrop-filter:none}.viewport-toolbar .orientation-control button{min-width:34px;height:32px;padding:0 6px;border-radius:6px}.viewport-toolbar .orientation-control button .icon{width:16px;height:16px}.mobile-view-select{display:none!important}.viewport-toolbar button:disabled,.viewport-toolbar select:disabled,.workbench button:disabled,.timeline button:disabled,.timeline select:disabled,.timeline input:disabled{cursor:default;opacity:.48}.workbench{position:absolute;z-index:18;top:var(--header-height);right:0;bottom:0;width:var(--workbench-width);display:flex;flex-direction:column;overflow:hidden;border-left:1px solid var(--line);background:var(--surface);animation:workbench-in .18s ease both}.molecule-stage-3dmol{overflow:hidden;background:#f3f5f2}.molecule-stage-3dmol>canvas{display:block;width:100%!important;height:100%!important}.publication-renderer-source{position:absolute;z-index:-1;inset:0;visibility:hidden;pointer-events:none}.workbench[hidden],.workbench-pane[hidden]{display:none}@keyframes workbench-in{0%{opacity:0;transform:translate(12px)}to{opacity:1;transform:translate(0)}}.workbench-tabs{height:43px;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));flex:0 0 auto;border-bottom:1px solid var(--line)}.workbench-tabs button{position:relative;border:0;background:transparent;color:var(--muted);font-size:12px;font-weight:600;cursor:pointer}.workbench-tabs button:hover,.workbench-tabs button.is-active{color:var(--text)}.workbench-tabs button.is-active:after{content:"";position:absolute;right:18px;bottom:-1px;left:18px;height:2px;background:var(--accent)}.workbench-heading{min-height:62px;display:flex;align-items:center;justify-content:space-between;gap:12px;flex:0 0 auto;padding:10px 12px 10px 16px;border-bottom:1px solid var(--line)}.workbench-heading strong,.workbench-heading span{display:block}.workbench-heading strong{color:var(--text);font-size:14px;font-weight:650}.workbench-heading span{margin-top:2px;color:var(--muted);font-size:12px}.workbench-expand-button{display:none}.workbench-body{min-height:0;flex:1 1 auto;overflow:auto;scrollbar-color:var(--line-strong) transparent}.workbench-footer{min-height:43px;display:flex;align-items:stretch;flex:0 0 auto;border-top:1px solid var(--line);background:var(--surface)}.workbench-footer button{min-width:0;display:flex;align-items:center;gap:6px;flex:1 1 0;padding:0 10px;border:0;background:transparent;color:var(--muted);font-size:10px;cursor:pointer}.workbench-footer button:hover{background:var(--surface-soft);color:var(--text)}.workbench-footer button+button{border-left:1px solid var(--line)}.render-workbench-footer{min-height:54px;padding:8px 10px;gap:8px}.render-workbench-footer button{min-height:36px;justify-content:center;border:1px solid var(--line);border-radius:6px;font-weight:600}.render-workbench-footer button+button{border-left:1px solid var(--accent)}.render-workbench-footer .primary{border-color:var(--accent);background:var(--accent);color:#fff}.render-workbench-footer .primary:hover:not(:disabled){background:color-mix(in srgb,var(--accent) 88%,#000)}.workbench-footer .icon{width:14px;height:14px}.workbench-footer kbd{margin-left:auto;color:var(--quiet);font-size:9px}.workbench-section{padding:14px 16px}.workbench-section+.workbench-section{border-top:1px solid var(--line)}.workbench-section>h3,.workbench-section-heading h3,.render-panel .settings-section h3{margin:0 0 9px;color:var(--muted);font-size:11px;font-weight:700;letter-spacing:.08em;text-transform:uppercase}.workbench-section-heading{display:flex;align-items:baseline;justify-content:space-between;gap:10px}.workbench-section-heading span,.workbench-section-heading output{color:var(--quiet);font-family:var(--numeric);font-size:11px}.workbench-section-heading h3{margin-bottom:9px}.panel-select-row{min-height:40px;display:grid;grid-template-columns:104px minmax(0,1fr);align-items:center;gap:10px;border-top:1px solid var(--line);color:var(--text);font-size:12px}.panel-select-row:first-of-type{border-top:0}.panel-select-row select{min-width:0;height:32px;padding:0 24px 0 8px;border:1px solid var(--line);border-radius:6px;background:var(--surface);color:var(--text);font-size:12px}.panel-details{margin-top:8px;border-top:1px solid var(--line)}.panel-details summary{min-height:38px;display:flex;align-items:center;color:var(--muted);font-size:10px;cursor:pointer}.panel-details[open] summary{color:var(--text)}.panel-details .geometry-settings,.panel-details .image-ranges{padding:2px 0 7px}.layer-heading{min-height:45px;display:flex;align-items:center;justify-content:space-between;gap:12px}.layer-heading strong,.layer-heading span{display:block}.layer-heading strong{font-size:11px;font-weight:600}.layer-heading span{margin-top:2px;color:var(--quiet);font-size:9px}.layer-heading>.toggle-row{min-height:36px}.layer-heading>.toggle-row>span{display:none}.image-heading{margin-top:8px}.panel-slider{display:block;margin-top:8px}.panel-slider>span{display:flex;justify-content:space-between;color:var(--muted);font-size:10px}.panel-slider output{color:var(--text)}.inspector-content{padding:0 16px 16px}.inspector-content .readout-section:first-child{padding-top:14px}.render-panel .settings-section{padding:14px 16px;border-bottom:1px solid var(--line)}.render-panel .render-presets{grid-template-columns:repeat(2,minmax(0,1fr))}.render-panel .render-options-grid{display:block}.render-panel .sheet-actions{position:sticky;bottom:0;margin:0;padding:10px 16px;background:var(--surface)}.render-print-row{min-height:34px;display:flex;align-items:center;justify-content:space-between;gap:12px;color:var(--muted);font-size:10px}.render-print-row select{height:32px;padding:0 24px 0 8px;border:1px solid var(--line);border-radius:6px;background:var(--surface);color:var(--text);font-size:10px}.print-scale-section output{display:block;margin:7px 0 3px;color:var(--text);font-family:var(--numeric);font-size:12px}.render-guide-region{position:absolute;z-index:9;top:calc(var(--header-height) + var(--viewport-toolbar-height));right:0;bottom:var(--timeline-height);left:0;display:grid;place-items:center;overflow:hidden;pointer-events:none;transition:right .18s ease}.workbench-open .render-guide-region{right:var(--workbench-width)}.render-guide{position:relative;flex:0 0 auto;border:1px dashed color-mix(in srgb,var(--accent) 68%,transparent);border-radius:2px;box-shadow:0 0 0 200vmax color-mix(in srgb,var(--canvas) 10%,transparent)}.render-guide span{position:absolute;top:7px;left:8px;padding:2px 5px;border-radius:3px;background:color-mix(in srgb,var(--surface) 90%,transparent);color:var(--accent);font-size:8px;font-weight:700;letter-spacing:.06em;text-transform:uppercase}.workspace.is-rendering .molecule-canvas,.workspace.is-rendering .canvas-field{pointer-events:none}.timeline.is-busy .series-plot svg{pointer-events:none}.command-backdrop,.customize-backdrop{position:fixed;inset:0}.preferences-sheet{width:min(440px,calc(100vw - 24px))}.timeline,.timeline.is-compact{left:0;bottom:0;width:100%;height:var(--timeline-height);min-height:0;padding:5px 12px 8px;border:0;border-top:1px solid var(--line);border-radius:0;background:var(--surface);box-shadow:none;-webkit-backdrop-filter:none;backdrop-filter:none;transform:none;transition:width .18s ease}.timeline .transport-row{min-height:46px}.timeline .plot-row{height:70px}.playback-mode-control select{width:92px;height:32px;padding:0 5px;border:1px solid var(--line);border-radius:6px;background:var(--surface);color:var(--muted);font-size:12px}.notice{bottom:calc(var(--timeline-height) + 12px)}@media(max-width:960px){.viewport-toolbar>label>span,.viewport-preset{display:none}.viewport-toolbar>label{padding-left:3px}.viewport-toolbar>label,.viewport-toolbar>button{min-height:44px}.viewport-toolbar select{height:42px}.viewport-color-control{display:none!important}.viewport-toolbar .orientation-control{display:none}.viewport-toolbar .mobile-view-select{display:flex!important;margin-left:auto}.viewport-toolbar,.workbench-open .viewport-toolbar{overflow-x:auto;scrollbar-width:none}.viewport-toolbar::-webkit-scrollbar{display:none}.playback-mode-control{display:none}}@media(max-width:1100px){.timeline .jump-button{display:none}}@media(max-width:760px){.workspace{--timeline-height: 128px}.workspace.timeline-compact{--timeline-height: 58px}.molecule-canvas,.canvas-field,.workbench-open .molecule-canvas,.workbench-open .canvas-field{width:100%}.topbar{padding-right:4px}.open-button,.panel-button,.render-button,.more-button,.icon-button{width:44px;min-width:44px;height:44px;padding:0;justify-content:center;font-size:0}.panel-button span,.render-button:not(.primary):after{display:none}.viewport-toolbar,.workbench-open .viewport-toolbar{right:0;gap:3px;overflow-x:auto;padding:0 6px;scrollbar-width:none}.viewport-toolbar::-webkit-scrollbar{display:none}.viewport-toolbar>label,.viewport-toolbar>button,.viewport-toolbar .orientation-control{flex:0 0 auto}.viewport-toolbar>label,.viewport-toolbar>button{min-height:44px}.viewport-toolbar select{height:42px;max-width:112px}.viewport-toolbar .orientation-control{display:none}.viewport-toolbar .mobile-view-select{display:flex!important;margin-left:auto}.workbench{position:fixed;top:auto;right:8px;bottom:calc(var(--timeline-height) + 8px);left:8px;width:auto;height:min(44svh,420px);max-height:calc(100svh - var(--header-height) - var(--viewport-toolbar-height) - var(--timeline-height) - 24px);border:1px solid var(--line);border-radius:14px;box-shadow:var(--shadow);animation-name:mobile-sheet-in}.workbench.is-expanded{height:min(68svh,600px)}.workbench-expand-button{width:44px;height:44px;display:grid;place-items:center;border:0;border-radius:7px;background:transparent;color:var(--muted)}.workbench-expand-button[aria-expanded=true] .icon{transform:rotate(180deg)}.workbench-tabs{height:46px}.workbench-heading{min-height:58px}.panel-select-row,.panel-details summary,.layer-heading{min-height:44px}.panel-select-row select,.render-print-row select{height:44px}.workbench-footer,.workbench-footer button{min-height:48px}.render-workbench-footer{min-height:56px}.render-workbench-footer button{min-height:44px}.workbench-open .timeline{width:100%}.workbench-open .render-guide-region{right:0}.timeline .jump-button{display:none}.timeline,.timeline.is-compact{bottom:0;width:100%;padding-inline:6px;border-radius:0}.notice{bottom:calc(var(--timeline-height) + 8px)}}@media(max-width:420px){.identity span:last-child{max-width:31vw}.viewport-toolbar>button{padding-inline:8px}.viewport-color-control{display:none!important}.playback-mode-control{display:none}}@media(max-width:520px){.identity span:last-child{display:none}}@media(max-width:760px)and (max-height:520px){.workspace,.workspace.timeline-compact{--timeline-height: 58px}.timeline .plot-row{display:none}.workbench,.workbench.is-expanded{height:calc(100svh - var(--header-height) - var(--viewport-toolbar-height) - var(--timeline-height) - 16px);max-height:none}.workbench-heading,.workbench-expand-button{display:none}}@media(max-width:340px){.viewport-toolbar,.workbench-open .viewport-toolbar{gap:2px;padding-inline:4px}.viewport-style-control select{width:94px;max-width:94px}.mobile-view-select select{width:50px;padding-right:18px}.viewport-toolbar>button{padding-inline:6px}.viewport-divider{margin-inline:1px}}:root{--header-height: 48px;--viewport-toolbar-height: 0px;--workbench-width: 320px;--export-width: 380px;--figure-panel-reserve: var(--export-width);--figure-panel-gap: 12px}.app-shell,.workspace{min-height:0}.scene-status,.command-button,.viewport-toolbar{display:none}.molecule-canvas,.canvas-field{top:var(--header-height);height:calc(100% - var(--header-height) - var(--timeline-height))}.export-open .molecule-canvas,.export-open .canvas-field{width:calc(100% - var(--export-width))}.canvas-controls{position:absolute;z-index:12;top:calc(var(--header-height) + 10px);right:12px;height:36px;display:flex;align-items:center;padding:2px;border:1px solid var(--line);border-radius:8px;background:var(--surface);box-shadow:0 4px 14px color-mix(in srgb,var(--text) 7%,transparent);transition:right .18s ease}.workbench-open .canvas-controls{right:calc(var(--workbench-width) + 12px)}.export-open .canvas-controls{right:calc(var(--export-width) + 12px)}.canvas-controls>button,.canvas-controls .orientation-control button{min-width:34px;height:30px;padding:0 8px;border:0;border-radius:6px;background:transparent;color:var(--muted);font-size:10px;cursor:pointer}.canvas-controls>button:hover,.canvas-controls .orientation-control button:hover,.canvas-controls .orientation-control button.is-active{background:var(--surface-soft);color:var(--text)}.canvas-controls .orientation-control{position:static;display:flex;margin:0;padding:0 0 0 2px;border:0;border-left:1px solid var(--line);border-radius:0;background:transparent;box-shadow:none;-webkit-backdrop-filter:none;backdrop-filter:none}.canvas-controls .orientation-control .icon{width:15px;height:15px}.canvas-view-select{display:none}.canvas-controls button:disabled,.canvas-controls select:disabled{opacity:.48;cursor:default}.workbench{top:var(--header-height);left:auto;bottom:0;width:var(--workbench-width);border:0;border-left:1px solid var(--line);border-radius:0;box-shadow:none}.workbench:focus{outline:none}.workbench:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.workbench-heading{min-height:50px;padding:7px 10px 7px 16px}.workbench-heading strong{font-size:13px}.workbench-expand-button .icon{transform:rotate(180deg);transition:transform .16s ease}.workbench.is-expanded .workbench-expand-button .icon{transform:rotate(0)}.workbench-body{overscroll-behavior:contain}.workbench-section:first-child{padding-top:12px}.selection-chip{position:absolute;z-index:13;top:calc(var(--header-height) + 12px);left:12px;height:34px;display:flex;align-items:center;gap:7px;padding:0 10px;border:1px solid var(--line);border-radius:8px;background:var(--surface);color:var(--muted);box-shadow:0 4px 14px color-mix(in srgb,var(--text) 7%,transparent);font-size:10px;cursor:pointer}.selection-chip strong{color:var(--text);font-family:var(--numeric);font-size:11px}.selection-chip:hover{border-color:var(--line-strong);color:var(--accent)}.export-sheet{position:fixed;z-index:32;top:var(--header-height);right:0;bottom:0;width:var(--export-width);display:flex;flex-direction:column;overflow:hidden;border-left:1px solid var(--line);background:var(--surface);box-shadow:-10px 0 28px color-mix(in srgb,var(--text) 8%,transparent);animation:workbench-in .18s ease both}.figure-sheet{bottom:var(--timeline-height)}.export-sheet[hidden]{display:none}.export-sheet:focus{outline:none}.export-sheet:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.export-heading{min-height:58px;display:flex;align-items:center;justify-content:space-between;gap:12px;flex:0 0 auto;padding:8px 10px 8px 16px;border-bottom:1px solid var(--line)}.export-heading strong,.export-heading span{display:block}.export-heading strong{color:var(--text);font-size:14px;font-weight:650}.export-heading span{margin-top:2px;color:var(--muted);font-size:12px}.export-body{min-height:0;flex:1 1 auto;overflow:auto;overscroll-behavior:contain}.export-footer{min-height:56px;display:grid;grid-template-columns:1fr 1.45fr;gap:8px;flex:0 0 auto;padding:8px 10px;border-top:1px solid var(--line);background:var(--surface)}.export-footer button{min-height:38px;border:1px solid var(--line);border-radius:7px;background:transparent;color:var(--muted);font-size:11px;font-weight:600;cursor:pointer}.export-footer .primary{border-color:var(--accent);background:var(--accent);color:#fff}.export-footer button:disabled{opacity:.48;cursor:default}.figure-section{padding:16px;border-bottom:1px solid var(--line)}.figure-section-label{display:block;margin-bottom:10px;color:var(--quiet);font-size:11px;font-weight:700;letter-spacing:.08em;text-transform:uppercase}.figure-presets,.figure-choice-row{display:grid;gap:6px}.figure-presets{grid-template-columns:repeat(3,minmax(0,1fr));margin-bottom:10px}.figure-choice-row{grid-template-columns:repeat(2,minmax(0,1fr))}.figure-choice-row+.figure-choice-row{margin-top:8px}.figure-presets button,.figure-choice-row button,.figure-recipe-actions button{min-height:34px;border:1px solid var(--line);border-radius:7px;background:transparent;color:var(--muted);font-size:12px;font-weight:600;cursor:pointer}.figure-presets button:hover,.figure-choice-row button:hover,.figure-recipe-actions button:hover,.figure-presets button.is-active,.figure-choice-row button.is-active{border-color:color-mix(in srgb,var(--accent) 62%,var(--line));background:var(--accent-soft);color:var(--accent-strong)}.figure-number-grid{display:grid;grid-template-columns:1fr 1fr .8fr;gap:6px}.figure-number-grid label,.figure-scale-length{display:grid;gap:5px;color:var(--quiet);font-size:11px}.figure-number-grid input,.figure-scale-length input{min-width:0;height:34px;padding:0 8px;border:1px solid var(--line);border-radius:7px;background:var(--surface);color:var(--text);font-family:var(--numeric);font-size:10px}.figure-toggle{min-height:46px;display:flex;align-items:center;justify-content:space-between;gap:14px;border-bottom:1px solid var(--line);cursor:pointer}.figure-toggle:last-of-type{border-bottom:0}.figure-toggle span,.figure-toggle strong,.figure-toggle small{display:block}.figure-toggle strong{color:var(--text);font-size:12px;font-weight:600}.figure-toggle small{margin-top:2px;color:var(--quiet);font-size:11px}.figure-toggle input{width:16px;height:16px;accent-color:var(--accent)}.figure-scale-length{grid-template-columns:1fr 90px auto;align-items:center;margin-top:8px}.figure-recipe-actions p{margin:0 0 10px;color:var(--quiet);font-size:11px;line-height:1.45}.figure-recipe-actions>div{display:grid;grid-template-columns:1fr 1fr;gap:6px}.figure-sheet-open .molecule-canvas,.figure-sheet-open .canvas-field{width:calc(100% - var(--figure-panel-reserve))}.figure-sheet-open .canvas-controls{right:calc(var(--figure-panel-reserve) + var(--figure-panel-gap));transition:none}.export-options{border-bottom:1px solid var(--line)}.export-options>summary{min-height:48px;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:0 16px;color:var(--text);font-size:11px;font-weight:600;cursor:pointer}.export-options>summary small{overflow:hidden;color:var(--quiet);font-size:11px;font-weight:400;text-overflow:ellipsis;white-space:nowrap}.export-options-body{border-top:1px solid var(--line)}.export-open .render-guide-region{right:var(--export-width)}.timeline,.timeline.is-compact{left:0;bottom:0;width:100%;height:var(--timeline-height);border:0;border-top:1px solid var(--line);border-radius:0;background:var(--surface);box-shadow:none;-webkit-backdrop-filter:none;backdrop-filter:none;transform:none}.frame-counter{white-space:nowrap}.figure-sheet-open .timeline{z-index:33}.workbench-open .timeline{width:calc(100% - var(--workbench-width))}.export-open .timeline{width:calc(100% - var(--export-width))}.playback-mode-control{display:none}@media(max-width:719px){.workspace{--figure-panel-reserve: 0px;--figure-panel-gap: 8px}.inspect-button{display:none}.workbench-open .molecule-canvas,.workbench-open .canvas-field,.export-open .molecule-canvas,.export-open .canvas-field{width:100%}.workbench,.workbench.is-expanded{position:fixed;top:auto;right:0;bottom:var(--timeline-height);left:0;width:auto;height:min(44svh,360px);max-height:calc(100svh - var(--header-height) - var(--timeline-height) - 16px);border:0;border-top:1px solid var(--line);border-radius:0;box-shadow:0 -10px 28px color-mix(in srgb,var(--text) 8%,transparent)}.workbench.is-expanded{height:min(68svh,560px)}.workbench-heading{min-height:50px}.workbench-expand-button{display:grid}.workbench-open .timeline,.export-open .timeline{width:100%}.workbench-open .canvas-controls,.export-open .canvas-controls{right:8px}.canvas-controls{top:calc(var(--header-height) + 8px);right:8px;height:44px}.canvas-controls>button{min-width:44px;height:40px}.canvas-controls .orientation-control{display:none}.canvas-view-select{height:40px;display:flex;align-items:center;border-left:1px solid var(--line)}.canvas-view-select select{width:58px;height:40px;padding:0 18px 0 8px;border:0;background:transparent;color:var(--text);font-size:11px}.selection-chip{top:calc(var(--header-height) + 13px);left:8px;height:40px}.export-sheet{top:auto;right:0;bottom:var(--timeline-height);left:0;width:auto;height:min(72svh,560px);max-height:calc(100svh - var(--header-height) - var(--timeline-height) - 8px);border:0;border-top:1px solid var(--line);box-shadow:0 -10px 28px color-mix(in srgb,var(--text) 8%,transparent);animation-name:mobile-sheet-in}.figure-sheet.export-sheet{max-height:calc(100svh - var(--header-height) - var(--timeline-height) - 64px)}.export-open .render-guide-region{right:0}.export-heading{min-height:50px}.export-footer button{min-height:44px}.figure-options-button{width:44px;height:44px}.figure-presets button,.figure-choice-row button,.figure-recipe-actions button{min-height:44px}.figure-number-grid input,.figure-scale-length input{height:44px}.render-panel .render-presets{grid-template-columns:repeat(4,minmax(0,1fr))}.render-panel .render-presets button{min-width:0;padding-inline:4px}}@media(max-width:760px){.topbar{padding-inline:8px 4px}.open-button{width:44px;min-width:44px;padding:0;font-size:0}.panel-button,.inspect-button,.render-button{width:auto;min-width:50px;height:44px;padding:0 9px;font-size:10px}.panel-button span{display:inline}.more-button{width:44px;min-width:44px;height:44px}}@media(min-width:720px){.more-inspect-action{display:none!important}}@media(max-width:520px){.identity>div{min-width:0;display:block}.identity strong{display:none}.identity span:last-child{display:block;max-width:none;margin:0;font-size:10px}.identity-mark{width:28px;height:28px}}@media(max-width:420px){.identity>div{display:none}}@media(min-width:720px)and (max-width:760px){.workbench-open .molecule-canvas,.workbench-open .canvas-field{width:calc(100% - var(--workbench-width))}.export-open .molecule-canvas,.export-open .canvas-field{width:calc(100% - var(--export-width))}}@media(max-width:479px),(min-width:480px)and (max-width:760px)and (min-height:521px){.workspace.workbench-open.selection-present .selection-bar{bottom:calc(var(--timeline-height) + var(--mobile-workbench-height))}.workspace.workbench-expanded.selection-present .selection-bar{visibility:hidden;pointer-events:none}}@media(min-width:480px)and (max-width:760px)and (max-height:520px){.workspace,.workspace.timeline-compact{--timeline-height: 58px;--figure-panel-reserve: min(320px, 48vw);--figure-panel-gap: 8px}.timeline .plot-row{display:none}.workbench,.workbench.is-expanded,.export-sheet{top:var(--header-height);right:0;bottom:var(--timeline-height);left:auto;width:min(320px,48vw);height:auto;max-height:none;border:0;border-left:1px solid var(--line);border-radius:0;box-shadow:-10px 0 28px color-mix(in srgb,var(--text) 8%,transparent)}.figure-sheet.export-sheet{max-height:none}.workbench-heading{display:flex}.workbench-expand-button{display:none}.workbench-open .canvas-controls,.export-open .canvas-controls{right:calc(min(320px,48vw) + 8px)}.workbench-open .molecule-canvas,.workbench-open .canvas-field,.export-open .molecule-canvas,.export-open .canvas-field{width:calc(100% - min(320px,48vw))}.export-open .render-guide-region{right:min(320px,48vw)}.workbench-open .timeline,.export-open .timeline{width:calc(100% - min(320px,48vw))}.render-panel .render-presets{grid-template-columns:repeat(2,minmax(0,1fr))}}:root{--timeline-height: 52px;--workbench-width: 304px;--scene-strip-height: 40px}.workspace.timeline-compact{--timeline-height: 52px}.workspace.timeline-absent{--timeline-height: 0px}.workspace.timeline-present{--timeline-height: 52px}.scene-strip{position:absolute;z-index:14;top:var(--header-height);right:0;left:0;height:var(--scene-strip-height);display:flex;align-items:stretch;overflow:hidden;border-bottom:1px solid var(--line);background:color-mix(in srgb,var(--surface) 96%,var(--canvas));transition:right .18s ease}.scene-strip-presets{min-width:0;display:flex;align-items:stretch}.scene-strip-presets button{position:relative;min-width:76px;padding:0 12px;border:0;background:transparent;color:var(--quiet);font-size:10px;font-weight:560;letter-spacing:.01em;cursor:pointer}.scene-strip-presets button:after{content:"";position:absolute;right:12px;bottom:0;left:12px;height:2px;border-radius:2px 2px 0 0;background:transparent}.scene-strip-presets button:hover:not(:disabled){color:var(--text);background:var(--surface-soft)}.scene-strip-presets button.is-active{color:var(--accent);font-weight:680}.scene-strip-presets button.is-active:after{background:var(--accent)}.scene-strip-presets button:disabled{color:color-mix(in srgb,var(--quiet) 48%,transparent);cursor:default}.scene-strip-facts{min-width:0;display:flex;align-items:center;gap:0;margin-left:auto;padding-right:12px;color:var(--quiet);font-family:var(--numeric);font-size:9px;white-space:nowrap}.scene-strip-facts span{display:flex;gap:3px;align-items:baseline}.scene-strip-facts span+span:before{content:"";width:1px;height:12px;margin:0 9px;background:var(--line)}.scene-strip-facts strong{color:var(--muted);font-weight:650}.molecule-canvas,.canvas-field{top:calc(var(--header-height) + var(--scene-strip-height));height:calc(100% - var(--header-height) - var(--scene-strip-height) - var(--timeline-height))}.workbench-open .scene-strip{right:var(--workbench-width)}.figure-sheet-open .scene-strip{right:var(--figure-panel-reserve)}.workbench-open .molecule-canvas,.workbench-open .canvas-field,.workbench-open .timeline{width:calc(100% - var(--workbench-width))}.workbench{position:absolute;z-index:24;top:calc(var(--header-height) + var(--scene-strip-height));right:0;bottom:0;left:auto;width:var(--workbench-width);height:auto;max-height:none;overflow:hidden;border:0;border-left:1px solid var(--line);border-radius:0;background:var(--surface);box-shadow:none}.workbench.atom-card{width:320px}.workbench-heading{min-height:54px;padding:6px 8px 6px 16px}.workbench-heading-copy{min-width:0}.workbench-heading-copy span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.workbench-body{max-height:none;overflow:auto}.workbench-section,.workbench-section:first-child{padding:12px 16px}.scene-panel .workbench-section+.workbench-section{border-top:1px solid var(--line)}.periodic-settings{padding:0}.periodic-settings>summary{position:relative;min-height:54px;display:grid;grid-template-columns:minmax(0,1fr) auto;align-content:center;gap:3px 12px;padding:8px 36px 8px 16px;list-style:none;color:var(--text);font-size:11px;font-weight:600;cursor:pointer}.periodic-settings>summary::-webkit-details-marker{display:none}.periodic-settings>summary:after{content:"";position:absolute;right:17px;width:6px;height:6px;border-right:1.5px solid var(--quiet);border-bottom:1.5px solid var(--quiet);transform:rotate(45deg) translateY(-2px);transition:transform .14s ease}.periodic-settings[open]>summary:after{transform:rotate(225deg) translate(-1px,-1px)}.periodic-settings>summary small{min-width:0;overflow:hidden;color:var(--quiet);font-size:11px;font-weight:450;text-overflow:ellipsis;white-space:nowrap}.periodic-settings-body{padding:0 16px 14px;border-top:1px solid var(--line-soft)}.periodic-control-label{display:block;margin:12px 0 6px;color:var(--muted);font-size:11px;font-weight:600}.workbench-section>.section-label+.periodic-control-label{margin-top:0}.periodic-inline-control,.periodic-repeat-heading{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:12px}.periodic-inline-control .periodic-control-label,.periodic-repeat-heading .periodic-control-label{margin:0}.periodic-repeat-heading>span:last-child{color:var(--quiet);font-size:11px;font-variant-numeric:tabular-nums}.periodic-axis-options{display:flex;gap:4px}.periodic-axis-options button,.periodic-repeat-row button{width:30px;height:30px;padding:0;border:1px solid var(--line);border-radius:6px;background:var(--surface);color:var(--muted);font-size:11px;cursor:pointer}.periodic-axis-options button:hover:not(:disabled),.periodic-repeat-row button:hover:not(:disabled){border-color:var(--line-strong);color:var(--text)}.periodic-axis-options button.is-active{border-color:color-mix(in srgb,var(--accent) 34%,var(--line));background:var(--accent-soft);color:var(--accent);font-weight:700}.periodic-repeat-grid{display:grid;gap:4px;margin-top:6px}.periodic-repeat-row{display:grid;grid-template-columns:minmax(0,1fr) 30px 38px 30px;align-items:center;gap:4px;min-height:30px}.periodic-repeat-row>span{color:var(--text);font-size:11px;font-style:italic}.periodic-repeat-row output{color:var(--text);font-size:12px;font-variant-numeric:tabular-nums;text-align:center}.periodic-repeat-row.is-disabled>span,.periodic-repeat-row.is-disabled output{color:var(--quiet)}.periodic-axis-options button:disabled,.periodic-repeat-row button:disabled{cursor:default;opacity:.38}.panel-select-row{min-height:34px}.display-toggles{padding-block:9px}.display-toggles .toggle-row{min-height:36px}.display-toggles .toggle-row+.toggle-row{border-top:1px solid var(--line-soft)}.atom-card .inspector-content{padding:0}.atom-card .readout-section{padding:12px 14px 14px;border:0}.workbench-open .canvas-controls{right:calc(var(--workbench-width) + 12px);opacity:1;pointer-events:auto}.canvas-controls{top:calc(var(--header-height) + var(--scene-strip-height) + 10px)}.selection-chip{top:calc(var(--header-height) + var(--scene-strip-height) + 12px)}.timeline,.timeline.is-compact{height:var(--timeline-height)}.timeline .transport-row{min-height:var(--timeline-height)}@media(max-width:760px){.workspace{--mobile-workbench-height: min(48svh, 440px);--scene-strip-height: 44px}.scene-strip{right:0;overflow:visible}.scene-strip-presets{width:100%;overflow-x:auto;overflow-y:hidden;scrollbar-width:none}.scene-strip-presets::-webkit-scrollbar{display:none}.scene-strip-presets button{flex:0 0 auto;min-width:72px;padding-inline:9px}.scene-strip-presets button:after{right:9px;left:9px}.scene-strip-presets button:disabled{display:none}.scene-strip-facts{display:none}.workbench-open .molecule-canvas,.workbench-open .canvas-field{width:100%;height:calc(100% - var(--header-height) - var(--scene-strip-height) - var(--timeline-height) - var(--mobile-workbench-height))}.workbench-open .timeline{width:100%}.workbench,.workbench.atom-card{position:fixed;top:auto;right:0;bottom:var(--timeline-height);left:0;width:auto;height:var(--mobile-workbench-height);max-height:calc(100svh - var(--header-height) - var(--scene-strip-height) - var(--timeline-height));border:0;border-top:1px solid var(--line);border-radius:0;box-shadow:0 -12px 30px color-mix(in srgb,var(--text) 9%,transparent)}.workbench-open .canvas-controls{right:8px}.canvas-controls{top:calc(var(--header-height) + var(--scene-strip-height) + 8px)}.selection-chip{top:calc(var(--header-height) + var(--scene-strip-height) + 10px)}.panel-button,.render-button{min-width:0;padding-inline:8px}.panel-button .icon,.render-button .icon{display:none}.periodic-axis-options button,.periodic-repeat-row button{width:42px;height:42px}.periodic-repeat-row{grid-template-columns:minmax(0,1fr) 42px 46px 42px;min-height:42px}}@media(max-width:760px){.open-button{width:auto;min-width:62px;padding-inline:8px;font-size:10px}}.command-button{display:inline-flex;width:auto;min-width:124px;padding-inline:11px;border-color:var(--line-strong);background:var(--surface-soft);color:var(--text);box-shadow:0 1px 2px color-mix(in srgb,var(--text) 7%,transparent)}.command-button span{display:inline;font-weight:650}.command-button:hover{border-color:color-mix(in srgb,var(--accent) 54%,var(--line-strong));background:var(--accent-soft)}.command-button kbd{white-space:nowrap}.command-backdrop{z-index:70}@media(min-width:761px){.identity{max-width:calc(50% - 112px)}.command-button{position:absolute;top:7px;left:50%;width:clamp(176px,23vw,286px);transform:translate(-50%)}}@media(max-width:760px){.command-button{display:inline-flex;width:44px;min-width:44px;height:44px;padding:0;border-color:color-mix(in srgb,var(--accent) 45%,var(--line-strong));background:var(--accent-soft);color:var(--accent)}.command-button span,.command-button kbd{display:none}.command-button .icon{width:18px;height:18px}}.workspace{--measurement-plot-height: 164px}.measurement-plot-open .selection-bar{z-index:18;bottom:calc(var(--timeline-height) + var(--measurement-plot-height) + 7px);width:min(760px,calc(100% - 24px));max-width:none;border-radius:10px 10px 0 0;box-shadow:0 8px 24px color-mix(in srgb,var(--text) 9%,transparent)}.measurement-plot-open .selection-readout{flex:1 1 auto}.workspace.measurement-plot-open .notice{bottom:calc(var(--timeline-height) + var(--measurement-plot-height) + 70px)}.measurement-plot{position:absolute;z-index:17;bottom:calc(var(--timeline-height) + 8px);left:50%;width:min(760px,calc(100% - 24px));height:var(--measurement-plot-height);display:grid;grid-template-rows:34px minmax(0,1fr) 18px;overflow:hidden;border:1px solid var(--line);border-top:0;border-radius:0 0 10px 10px;background:var(--surface);box-shadow:0 8px 24px color-mix(in srgb,var(--text) 9%,transparent);transform:translate(-50%)}.measurement-plot.is-complete{grid-template-rows:34px minmax(0,1fr)}.measurement-plot__header{min-width:0;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:3px 5px 3px 13px;border-bottom:1px solid var(--line-soft)}.measurement-plot__meta{color:var(--quiet);font-family:var(--numeric);font-size:10px}.measurement-plot__actions{flex:0 0 auto;display:flex;align-items:center;gap:1px}.measurement-plot__export-menu{position:relative;display:none}.measurement-plot__export-menu>summary{list-style:none}.measurement-plot__export-menu>summary::-webkit-details-marker{display:none}.measurement-plot__actions button{height:30px;min-width:40px;padding:0 7px;border:0;border-radius:5px;background:transparent;color:var(--muted);font-size:10px;font-weight:650;cursor:pointer}.measurement-plot__actions button:hover:not(:disabled){background:var(--surface-soft);color:var(--text)}.measurement-plot__actions button:disabled{color:var(--disabled);cursor:default}.measurement-plot__chart{width:100%;height:100%;min-height:0;display:block;cursor:crosshair}.measurement-plot__chart:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.measurement-plot__grid,.measurement-plot__axis{stroke:var(--line-soft);stroke-width:1}.measurement-plot__axis{stroke:var(--line-strong)}.measurement-plot__trace{stroke:var(--accent);stroke-width:1.8}.measurement-plot__trace-point,.measurement-plot__cursor-point{fill:var(--accent)}.measurement-plot__cursor{stroke:var(--accent);stroke-width:1.25;opacity:.7}.measurement-plot__cursor-point{stroke:var(--surface);stroke-width:2}.measurement-plot__tick,.measurement-plot__axis-label,.measurement-plot__unit,.measurement-plot__empty{fill:var(--quiet);font-family:var(--numeric);font-size:12px}.measurement-plot__axis-label,.measurement-plot__unit,.measurement-plot__empty{font-family:inherit;font-size:11px}.measurement-plot__progress{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:8px;padding:0 12px;color:var(--quiet);font-family:var(--numeric);font-size:10px}.measurement-plot__progress progress{width:100%;height:2px;overflow:hidden;border:0;border-radius:2px;background:var(--surface-soft);color:var(--accent);appearance:none}.measurement-plot__progress progress::-webkit-progress-bar{background:var(--surface-soft)}.measurement-plot__progress progress::-webkit-progress-value{background:var(--accent)}.measurement-plot__progress progress::-moz-progress-bar{background:var(--accent)}.selection-bar .selection-plot-button[aria-pressed=true]{background:var(--accent-soft)}@media(max-width:520px){.workspace{--measurement-plot-height: 194px}.measurement-plot,.measurement-plot-open .selection-bar{width:calc(100% - 16px)}.measurement-plot{grid-template-rows:44px minmax(0,1fr) 18px}.measurement-plot.is-complete{grid-template-rows:44px minmax(0,1fr)}.measurement-plot__header{overflow:visible;padding-left:10px}.measurement-plot__actions>button:not(.measurement-plot__close){display:none}.measurement-plot__export-menu{display:block}.measurement-plot__export-menu>summary{width:58px;height:44px;display:grid;place-items:center;border-radius:5px;color:var(--muted);font-size:10px;font-weight:650;cursor:pointer}.measurement-plot__export-menu[open]>summary{background:var(--surface-soft);color:var(--text)}.measurement-plot__export-menu>div{position:absolute;z-index:2;top:calc(100% + 2px);right:0;width:112px;padding:4px;border:1px solid var(--line);border-radius:7px;background:var(--surface);box-shadow:var(--shadow)}.measurement-plot__export-menu>div button{width:100%;display:block;text-align:left}.measurement-plot__actions button{width:44px;height:44px;padding-inline:5px}}@media(max-width:380px){.measurement-plot-open .selection-bar>button:not(.icon-button){min-width:48px;padding-inline:6px}}@media(max-width:760px)and (max-height:520px){.workspace{--measurement-plot-height: 132px}.measurement-plot{grid-template-rows:44px minmax(0,1fr) 14px}.measurement-plot.is-complete{grid-template-rows:44px minmax(0,1fr)}.measurement-plot__progress{padding-inline:9px}}@media(max-width:760px){.open-button,.panel-button,.inspect-button,.render-button,.canvas-controls>button{font-size:11px}.canvas-controls{height:48px}.canvas-controls>button{min-width:44px;height:44px}.transport-button,.play-button,.timeline-options>summary{width:40px;height:44px}.segmented-options button{min-height:40px;font-size:11px}.workspace.selection-present .timeline-options>div{bottom:calc(100% + 82px)}}@media(max-width:600px){.transport-buttons .transport-button:first-child,.transport-buttons .transport-button:last-child{display:none}.frame-counter-full{display:none}.frame-counter-compact{display:inline}.frame-error-full{display:none}.frame-error-compact{display:inline}.frame-error{min-width:28px;max-width:28px;flex:0 0 28px;padding-inline:0}}@media(min-width:521px)and (max-width:760px){.workspace.selection-present .workbench{max-height:calc(100% - var(--header-height) - var(--scene-strip-height) - var(--timeline-height) - 80px)}}@media(max-width:479px)and (max-height:520px){.workbench-heading{min-height:44px;display:flex}}@media(max-width:380px){.selection-hint{display:none}.measurement-plot-open .selection-bar{flex-wrap:wrap;justify-content:flex-end;row-gap:4px;padding-block:6px}.measurement-plot-open .selection-readout{flex:1 0 100%;overflow:hidden}.measurement-plot-open .selection-readout strong{min-width:0;max-width:100%;flex:0 1 auto}.measurement-plot-open .selection-readout output{flex:0 0 auto}.workspace.measurement-plot-open .notice{bottom:calc(var(--timeline-height) + var(--measurement-plot-height) + 100px)}.measurement-mode-full{display:none}.measurement-mode-compact{display:inline}}@media(max-width:520px){.workspace.selection-present .timeline-options>div{bottom:calc(var(--selection-bottom) + 60px)}}@media(max-width:760px)and (max-height:450px){.workspace.playback-options-open .canvas-controls,.workspace.playback-options-open .selection-bar{visibility:hidden;pointer-events:none}.workspace.playback-options-open .timeline-options>div{bottom:calc(100% + 8px)}}@media(max-width:520px)and (max-height:450px){.workspace.playback-options-open .timeline-options>div{bottom:calc(var(--timeline-height) + 8px)}}@media(max-width:760px)and (max-height:360px){.workspace.measurement-plot-open .canvas-controls{visibility:hidden;pointer-events:none}.workspace.measurement-plot-open .notice{top:calc(var(--header-height) + var(--scene-strip-height) + 8px);bottom:auto;max-height:calc(100% - var(--header-height) - var(--scene-strip-height) - var(--timeline-height) - 16px)}}.selection-tools{position:relative;flex:0 0 auto}.selection-tools>summary{min-width:54px;height:36px;display:grid;place-items:center;padding:0 9px;border-radius:5px;color:var(--accent);font-size:10px;font-weight:650;cursor:pointer;list-style:none}.selection-tools>summary::-webkit-details-marker{display:none}.selection-tools>summary:hover,.selection-tools[open]>summary{background:var(--accent-soft)}.selection-tools-popover{position:absolute;right:0;bottom:calc(100% + 10px);width:min(300px,calc(100vw - 20px));max-height:min(520px,calc(100svh - var(--header-height) - var(--scene-strip-height) - var(--header-height) - var(--timeline-height) - 36px));overflow-x:hidden;overflow-y:auto;border:1px solid var(--line);border-radius:10px;background:var(--surface);box-shadow:var(--shadow)}.selection-tools-popover>section{display:grid;gap:8px;padding:11px}.selection-tools-popover>section+section{border-top:1px solid var(--line)}.selection-tools-popover label,.selection-tools-popover section>span{color:var(--quiet);font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:uppercase}.selection-scope-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:5px}.selection-scope-grid button,.selection-input-row button,.saved-selections button{min-height:32px;border:1px solid var(--line);border-radius:6px;background:transparent;color:var(--text);font-size:12px;cursor:pointer}.selection-scope-grid button:hover:not(:disabled),.selection-input-row button:hover:not(:disabled),.saved-selections button:hover:not(:disabled){border-color:var(--line-strong);background:var(--surface-soft)}.selection-scope-grid button:disabled,.selection-input-row button:disabled{opacity:.4;cursor:default}.selection-input-row{display:grid;grid-template-columns:minmax(0,1fr) auto auto;align-items:center;gap:6px}.selection-input-row.is-name{grid-template-columns:minmax(0,1fr) auto}.selection-input-row input{min-width:0;height:34px;padding:0 9px;border:1px solid var(--line);border-radius:6px;background:var(--surface);color:var(--text);font:11px var(--numeric)}.selection-input-row input:focus{border-color:var(--accent);outline:2px solid var(--accent-soft)}.selection-input-row>span{color:var(--muted);font:10px var(--numeric)}.selection-input-row button{padding-inline:10px;color:var(--accent);font-weight:650}.saved-selections{max-height:178px;overflow:auto}.saved-selections>div{display:grid;grid-template-columns:minmax(0,1fr) 32px;gap:5px}.saved-selections>div>button:first-child{min-width:0;display:flex;align-items:center;justify-content:space-between;gap:8px;padding:0 9px;text-align:left}.saved-selections button span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.saved-selections button small{color:var(--quiet);font:9px var(--numeric)}.saved-selections>div>button:last-child{display:grid;place-items:center;padding:0;color:var(--quiet)}.saved-selections .icon{width:12px;height:12px}.pinned-measurements{position:absolute;z-index:13;top:calc(var(--header-height) + var(--scene-strip-height) + 12px);left:12px;display:block;max-width:none;max-height:none;overflow:visible;padding:0}.pinned-measurements .selection-chip{position:static;min-width:0;border-radius:8px 0 0 8px;box-shadow:none}.pinned-measurements .selection-chip span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pinned-measurements .selection-chip[aria-pressed=true]{border-color:color-mix(in srgb,var(--accent) 48%,var(--line));background:var(--accent-soft)}.pinned-measurement-remove{width:30px;flex:0 0 30px;display:grid;place-items:center;border:1px solid var(--line);border-left:0;border-radius:0 8px 8px 0;background:var(--surface);color:var(--quiet);cursor:pointer}.pinned-measurement-remove:hover{color:var(--text)}.pinned-measurement-remove .icon{width:12px;height:12px}.selection-summary-panel .readout-section{padding-top:4px}@media(max-width:760px){.selection-bar{width:calc(100% - 16px)}.selection-tools{position:static}.selection-tools>summary{height:44px}.selection-tools-popover{right:8px;left:8px;width:auto}.selection-scope-grid button,.selection-input-row button,.saved-selections button{min-height:38px}.selection-input-row input{height:40px}.pinned-measurements{top:calc(var(--header-height) + var(--scene-strip-height) + 60px);left:8px}.pinned-measurements .selection-chip{height:40px}}@media(max-width:520px){.selection-bar .measurement-mode{display:none}.selection-readout{min-width:80px}.selection-tools>summary{min-width:48px;padding-inline:7px}}@media(max-width:719px)and (min-height:521px),(max-width:479px){.figure-sheet.export-sheet{max-height:calc(100svh - var(--header-height) - var(--scene-strip-height) - var(--timeline-height) - 64px)}}@media(min-width:480px)and (max-width:719px)and (max-height:520px){.figure-sheet.export-sheet{max-height:none}}:root,.workspace{--scene-strip-height: 0px}.identity{height:40px;padding:0 8px 0 0;border:1px solid transparent;border-radius:7px;background:transparent;text-align:left;cursor:pointer}.identity:hover:not(:disabled),.identity[aria-expanded=true]{border-color:var(--line);background:var(--surface-soft)}.identity:disabled{cursor:default}.structure-button,.appearance-button{min-width:36px;height:34px;padding:0 10px;border:1px solid transparent;border-radius:7px;background:transparent;color:var(--muted);font-size:11px;cursor:pointer}.structure-button:hover:not(:disabled),.structure-button[aria-expanded=true],.appearance-button:hover:not(:disabled){border-color:var(--line);background:var(--surface-soft);color:var(--text)}.structure-button:disabled,.appearance-button:disabled{opacity:.45;cursor:default}.molecule-stage-3dmol{background:var(--canvas)}.workbench-tabs{order:1}.workbench-body{order:2}.workbench-heading{order:0}.workbench-tabs button:disabled{color:var(--disabled);cursor:default}.structure-overview{background:color-mix(in srgb,var(--surface-soft) 54%,var(--surface))}.structure-fact-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 18px}.structure-fact-grid div{min-width:0}.structure-fact-grid span,.structure-fact-grid strong{display:block}.structure-fact-grid span{margin-bottom:3px;color:var(--quiet);font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase}.structure-fact-grid strong{overflow-wrap:anywhere;color:var(--text);font-family:var(--numeric);font-size:12px;font-weight:600}.scientific-note,.structure-actions p,.atom-editor>p{margin:12px 0 0;color:var(--quiet);font-size:11px;line-height:1.55}.cell-editor-mode{margin-bottom:12px}.cell-parameter-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:7px}.cell-parameter-grid label{position:relative;min-width:0}.cell-parameter-grid label>span,.cell-parameter-grid label>small{position:absolute;z-index:1;top:9px;color:var(--quiet);font-family:var(--numeric);font-size:11px;pointer-events:none}.cell-parameter-grid label>span{left:8px;color:var(--muted);font-weight:700}.cell-parameter-grid label>small{right:7px}.cell-parameter-grid input,.cell-vector-grid input,.atom-editor input{width:100%;height:34px;border:1px solid var(--line);border-radius:6px;background:var(--surface);color:var(--text);font-family:var(--numeric);font-size:10px}.cell-parameter-grid input{padding:0 22px}.cell-parameter-grid input:focus,.cell-vector-grid input:focus,.atom-editor input:focus{border-color:var(--accent);outline:2px solid var(--accent-soft)}.cell-vector-grid{display:grid;grid-template-columns:18px repeat(3,minmax(0,1fr));align-items:center;gap:6px}.cell-vector-grid>span,.cell-vector-grid>strong{color:var(--quiet);font-family:var(--numeric);font-size:11px;text-align:center}.cell-vector-grid>strong{color:var(--muted)}.cell-vector-grid input{min-width:0;padding:0 6px;text-align:right}.cell-axis-row{min-height:42px;display:flex;align-items:center;justify-content:space-between;gap:10px;margin-top:10px;border-top:1px solid var(--line);color:var(--muted);font-size:12px}.cell-axis-row>div{display:flex;gap:4px}.cell-axis-row button{width:30px;height:28px;border:1px solid var(--line);border-radius:6px;background:var(--surface);color:var(--quiet);font-family:var(--numeric);font-size:10px;cursor:pointer}.cell-axis-row button.is-active{border-color:color-mix(in srgb,var(--accent) 44%,var(--line));background:var(--accent-soft);color:var(--accent);font-weight:700}.cell-scale-choice{min-height:44px;display:flex;align-items:center;gap:9px;border-top:1px solid var(--line);color:var(--text);font-size:12px}.cell-scale-choice input{accent-color:var(--accent)}.cell-scale-choice span,.cell-scale-choice small{display:block}.cell-scale-choice small{margin-top:2px;color:var(--quiet);font-size:11px}.editor-error{margin:0 0 8px;color:var(--error);font-size:11px;line-height:1.4}.primary-panel-action,.structure-actions>button{width:100%;min-height:36px;display:flex;align-items:center;justify-content:center;gap:8px;padding:0 10px;border:1px solid var(--line);border-radius:6px;background:var(--surface);color:var(--muted);font-size:12px;font-weight:600;cursor:pointer}.primary-panel-action{border-color:var(--accent);background:var(--accent);color:#fff}.primary-panel-action:hover{background:color-mix(in srgb,var(--accent) 88%,#000)}.primary-panel-action small{color:inherit;font-family:var(--numeric);font-size:11px;opacity:.72}.structure-actions{display:grid;gap:7px}.structure-actions>button:hover:not(:disabled){border-color:var(--line-strong);background:var(--surface-soft);color:var(--text)}.structure-actions>button:disabled{opacity:.42;cursor:default}.structure-actions p{margin-top:2px}.representation-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px}.representation-grid button{min-width:0;min-height:38px;padding:0 7px;border:1px solid var(--line);border-radius:6px;background:var(--surface);color:var(--muted);font-size:12px;cursor:pointer}.representation-grid button:hover:not(:disabled){border-color:var(--line-strong);color:var(--text)}.representation-grid button.is-active{border-color:color-mix(in srgb,var(--accent) 44%,var(--line));background:var(--accent-soft);color:var(--accent);font-weight:700}.representation-grid button:disabled{opacity:.38;cursor:default}.atom-display-settings .vector-scale-row{border-top:1px solid var(--line)}.atom-editor{margin:0 -16px;padding:14px 16px;border-bottom:1px solid var(--line);background:color-mix(in srgb,var(--surface-soft) 48%,var(--surface))}.atom-editor-heading{min-height:34px;display:flex;align-items:flex-start;justify-content:space-between;gap:10px;margin-bottom:10px}.atom-editor-heading span,.atom-editor-heading strong,.atom-editor-heading small{display:block}.atom-editor-heading span{color:var(--quiet);font-size:11px}.atom-editor-heading strong{margin-top:2px;color:var(--text);font:650 15px var(--numeric)}.atom-editor-heading small{color:var(--quiet);font-size:11px}.atom-element-field{display:grid;grid-template-columns:76px minmax(0,1fr);align-items:center;gap:8px;color:var(--muted);font-size:12px}.atom-editor input{min-width:0;padding:0 8px}.atom-coordinate-fields{min-width:0;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:6px;margin:12px 0 0;padding:12px 0 0;border:0;border-top:1px solid var(--line)}.atom-coordinate-fields legend{padding:0;color:var(--quiet);font-size:11px}.atom-coordinate-fields label{position:relative;min-width:0}.atom-coordinate-fields label span,.atom-coordinate-fields label small{position:absolute;z-index:1;top:9px;color:var(--quiet);font:11px var(--numeric);pointer-events:none}.atom-coordinate-fields label span{left:7px}.atom-coordinate-fields label small{right:7px}.atom-coordinate-fields input{padding:0 19px}.atom-editor .primary-panel-action{margin-top:10px}:root[data-appearance=dark] .molecule-stage-3dmol{background:var(--canvas)}@media(max-width:980px){.appearance-button{display:none}}@media(max-width:760px){.workspace{--scene-strip-height: 0px}.structure-button{display:none}.open-button{width:40px;min-width:40px;padding:0;font-size:0}.open-button .icon{width:17px;height:17px}.panel-button{width:40px;padding:0}.panel-button span{display:none}.panel-button .icon{display:block}.workbench-tabs button{min-height:44px}}@media(max-width:420px){.topbar{padding-inline:4px;gap:2px}.identity{width:40px;padding:0;justify-content:center}.identity-mark{width:28px;height:28px}.topbar-tools{gap:1px}.render-button{min-width:44px;padding-inline:6px;font-size:9px}.figure-options-button{width:32px;min-width:32px}}.identity{cursor:default;-webkit-user-select:none;user-select:none}.identity:hover{border-color:transparent;background:transparent}.task-navigation{align-items:center;gap:2px}.task-button,.tools-button,.help-button{min-width:36px;height:34px;display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:0 10px;border:1px solid transparent;border-radius:7px;background:transparent;color:var(--muted);font-size:11px;font-weight:550;cursor:pointer}.task-button:hover:not(:disabled),.task-button[aria-expanded=true],.tools-button:hover:not(:disabled),.tools-button[aria-expanded=true],.help-button:hover:not(:disabled){border-color:var(--line);background:var(--surface-soft);color:var(--text)}.task-button[aria-expanded=true]{border-color:color-mix(in srgb,var(--accent) 34%,var(--line));background:var(--accent-soft);color:var(--accent)}.task-button:disabled,.tools-button:disabled,.help-button:disabled{color:var(--disabled);cursor:default;opacity:.5}.tools-button{display:none}.help-button{padding-inline:8px}.help-button strong{display:none;font:650 13px var(--numeric)}.export-button.render-button{border-radius:7px;border-color:var(--line);background:transparent;color:var(--text);font-weight:600}.export-button.render-button:hover:not(:disabled){border-color:var(--line-strong, var(--line));background:var(--surface-soft);color:var(--text)}.export-button.render-button[aria-expanded=true]{border-color:var(--accent);background:var(--accent);color:#fff}.workbench-heading-actions{display:flex;align-items:center;gap:2px}.edit-target-options{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:4px;padding:8px;border-bottom:1px solid var(--line);background:var(--surface-soft)}.edit-target-options button{min-height:36px;border:1px solid transparent;border-radius:6px;background:transparent;color:var(--muted);font-size:12px;font-weight:650;cursor:pointer}.edit-target-options button:hover:not(:disabled){border-color:var(--line);color:var(--text)}.edit-target-options button.is-active{border-color:color-mix(in srgb,var(--accent) 34%,var(--line));background:var(--surface);color:var(--accent)}.edit-target-options button:disabled{color:var(--disabled);cursor:default}.appearance-options{display:grid;grid-template-columns:repeat(2,minmax(0,1fr))}.appearance-options button{min-height:36px}.appearance-settings .panel-select-row{margin-top:10px;border-top:1px solid var(--line)}.selected-atom-overview{min-height:68px;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px 16px;border-bottom:1px solid var(--line);background:color-mix(in srgb,var(--surface-soft) 52%,var(--surface))}.selected-atom-overview span,.selected-atom-overview strong{display:block}.selected-atom-overview span{color:var(--quiet);font-size:11px}.selected-atom-overview strong{margin-top:2px;color:var(--text);font:650 16px var(--numeric)}.selected-atom-overview button,.analysis-actions button,.analysis-method-grid button{min-height:36px;padding:0 10px;border:1px solid var(--line);border-radius:6px;background:var(--surface);color:var(--muted);font-size:12px;font-weight:600;cursor:pointer}.selected-atom-overview button:hover:not(:disabled),.analysis-actions button:hover:not(:disabled),.analysis-method-grid button:hover:not(:disabled){border-color:var(--line-strong);color:var(--text)}.analysis-panel{min-height:100%}.analysis-empty{padding:6px 0 2px}.analysis-empty strong,.analysis-measurement-copy strong{color:var(--text);font-size:13px;font-weight:650}.analysis-empty p,.analysis-measurement-copy p{margin:7px 0 0;color:var(--quiet);font-size:12px;line-height:1.55}.analysis-empty>div{display:grid;gap:5px;margin-top:14px}.analysis-empty>div span{color:var(--muted);font-size:12px}.analysis-empty kbd{min-width:56px;display:inline-block;margin-right:7px;padding:3px 5px;border:1px solid var(--line);border-radius:4px;background:var(--surface-soft);color:var(--text);text-align:center}.analysis-measurement-copy strong,.analysis-measurement-copy span{display:block}.analysis-measurement-copy span{margin-top:3px;color:var(--muted);font:10px var(--numeric)}.analysis-actions,.analysis-method-grid{display:grid;gap:6px;margin-top:12px}.analysis-actions{grid-template-columns:repeat(2,minmax(0,1fr))}.analysis-actions button:last-child{grid-column:1 / -1}.analysis-method-grid{grid-template-columns:repeat(2,minmax(0,1fr));margin-top:4px}.analysis-actions button:disabled,.analysis-method-grid button:disabled{color:var(--disabled);cursor:default;opacity:.55}.analysis-selection .selection-summary-panel{margin:0 -16px -12px}.canvas-hint{position:absolute;z-index:14;right:50%;bottom:calc(var(--timeline-height) + 18px);display:flex;align-items:center;gap:13px;padding:8px 8px 8px 12px;border:1px solid var(--line);border-radius:9px;background:color-mix(in srgb,var(--surface) 94%,transparent);color:var(--muted);box-shadow:0 5px 18px color-mix(in srgb,var(--text) 8%,transparent);font-size:9px;transform:translate(50%);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.canvas-hint strong{color:var(--text);font-weight:650}.canvas-hint button{width:28px;height:28px;display:grid;place-items:center;padding:0;border:0;border-radius:5px;background:transparent;color:var(--quiet);cursor:pointer}.canvas-hint button:hover{background:var(--surface-soft);color:var(--text)}.canvas-hint .icon{width:14px;height:14px}[data-setting-id]{transition:box-shadow .18s ease,background-color .18s ease}[data-setting-id].is-search-target{position:relative;z-index:1;box-shadow:inset 3px 0 0 var(--accent),0 0 0 2px var(--accent-soft)}.command-results>button{min-height:50px;padding-block:7px}.command-result-copy{min-width:0;display:block}.command-result-copy>span,.command-result-copy>small{display:block;max-width:none;text-align:left}.command-result-copy>span{overflow:hidden;color:inherit;font-size:12px;text-overflow:ellipsis;white-space:nowrap}.command-results>button .command-result-copy>small{max-width:none;margin-top:3px;color:var(--quiet);font-size:11px;line-height:1.2;text-align:left;white-space:nowrap}.command-result-detail{flex:0 0 auto}.command-result-detail small{display:block}@media(min-width:761px){.task-navigation{display:flex}.identity{max-width:calc(50% - 150px)}.workbench-tabs{display:none}}@media(max-width:1040px)and (min-width:761px){.task-button{padding-inline:7px}.help-button span{display:none}.help-button strong{display:block}.open-button{width:36px;padding:0;font-size:0}}@media(max-width:760px){.task-navigation{display:none}.open-button,.command-button,.tools-button,.export-button.render-button,.help-button{height:40px}.tools-button{min-width:56px;display:inline-flex}.tools-button .icon{width:16px;height:16px}.help-button{width:40px;min-width:40px;padding:0}.help-button span{display:none}.help-button strong{display:block}.workbench-heading-actions{display:flex}.workbench-expand-button{width:44px;height:44px;display:grid;place-items:center;padding:0;border:0;border-radius:7px;background:transparent;color:var(--muted);cursor:pointer}.workbench-expand-button:hover{background:var(--surface-soft);color:var(--text)}.workbench-expand-button .icon{width:16px;height:16px;transform:rotate(-90deg)}.workbench.is-expanded .workbench-expand-button .icon{transform:rotate(90deg)}.workspace{--mobile-workbench-height: min(56svh, 460px)}.workbench.is-expanded{top:var(--header-height);bottom:var(--timeline-height);height:auto;max-height:none}.workbench-expanded .molecule-canvas,.workbench-expanded .canvas-field{width:100%;height:calc(100% - var(--header-height) - var(--timeline-height))}.canvas-hint{right:10px;bottom:calc(var(--timeline-height) + 12px);left:10px;justify-content:space-between;gap:7px;transform:none}}@media(max-width:420px){.identity>div{display:block;min-width:0}.identity strong{display:none}.identity span:last-child{display:block;max-width:none;font-size:10px}.identity{width:auto;min-width:0;max-width:min(42vw,148px);padding:0 4px 0 0;justify-content:flex-start}.topbar-tools{gap:0}.tools-button{min-width:50px;padding-inline:5px}.export-button.render-button{width:42px;min-width:42px;padding:0;font-size:0}.export-button .icon{display:block;width:16px;height:16px}.canvas-hint{display:grid;grid-template-columns:1fr auto;gap:4px 8px}.canvas-hint span{grid-column:1}.canvas-hint button{grid-row:1 / 4;grid-column:2}}@media(min-width:480px)and (max-width:760px)and (max-height:520px){.workbench,.workbench.is-expanded{top:var(--header-height);right:0;bottom:var(--timeline-height);left:auto;width:min(320px,48vw);height:auto;max-height:none;border-top:0;border-left:1px solid var(--line)}.workbench-expand-button{display:none}.workbench-open .molecule-canvas,.workbench-open .canvas-field{width:calc(100% - min(320px,48vw));height:calc(100% - var(--header-height) - var(--timeline-height))}} diff --git a/pqviewer/static/assets/index-B5Kg_efE.js b/pqviewer/static/assets/index-Dtn8HXMR.js similarity index 96% rename from pqviewer/static/assets/index-B5Kg_efE.js rename to pqviewer/static/assets/index-Dtn8HXMR.js index f91e425..613acff 100644 --- a/pqviewer/static/assets/index-B5Kg_efE.js +++ b/pqviewer/static/assets/index-Dtn8HXMR.js @@ -40,7 +40,7 @@ uniform vec3 publicationBackground;`).replace(n,`${n} gl_FragColor.a = 1.0; } - // color space`);if(o===r||!o.includes("publicationCoverage"))throw new Error("Publication output shader is incompatible");e.material.fragmentShader=o,e.material.uniforms.publicationTransparent={value:t.kind==="transparent"?1:0},e.material.uniforms.publicationBackground={value:new Fe(t.kind==="solid"?t.color:"#000000")},e.material.needsUpdate=!0}function Nb(e){e.root.traverse(t=>{t instanceof Oe&&t.dispose()}),e.resources.geometries.forEach(t=>t.dispose()),e.resources.materials.forEach(t=>t.dispose()),e.resources.textures.forEach(t=>t.dispose())}function Eb(e){for(let t=0;t<16&&e.getError()!==e.NO_ERROR;t+=1);}function Ib(e,t){return e===t.OUT_OF_MEMORY?"the GPU could not allocate the requested image":e===t.INVALID_VALUE?"the requested image dimensions are unsupported":e===t.INVALID_FRAMEBUFFER_OPERATION?"the export framebuffer is incomplete":`WebGL error 0x${e.toString(16)}`}function Fb(e,t){e.scene.background instanceof Fe&&e.scene.background.set(t.background),e.renderer.toneMappingExposure=t.exposure,e.hemisphere.color.set(t.hemisphereSky),e.hemisphere.groundColor.set(t.hemisphereGround),e.hemisphere.intensity=t.hemisphereIntensity,e.key.color.set(t.key),e.key.intensity=t.keyIntensity,e.rim.color.set(t.rim),e.rim.intensity=t.rimIntensity,e.selectionMaterial.color.set(t.selection),e.selectionMaterial.opacity=t.selectionOpacity,e.selectionPointsMaterial.color.set(t.selection),e.keyboardFocusMaterial.color.set(t.selection)}function $b(e,t,n,r,o,s){const i=e.atomObject?.userData.instanceToAtom instanceof Uint32Array?e.atomObject.userData.instanceToAtom:n.instanceToAtom;if(e.atomObject instanceof Nn){const a=e.atomObject.geometry.getAttribute("color");for(let c=0;cKr(a,s.force)),e.velocities?.children.forEach(a=>Kr(a,s.velocity)),e.ribbon&&Fd(e.ribbon.geometry,t,n,r,o,s),e.polyhedra&&_b(e.polyhedra,t,n,r,o,s)}function Fd(e,t,n,r,o,s){const i=e.getAttribute("color"),a=e.getAttribute("atomIndex"),c=e.getAttribute("secondaryStructure"),l=e.getAttribute("secondaryStructureWeights");if(!(i instanceof Se)||!(a instanceof Se))return;const u=new Fe(s.ribbon),d=o==="light"?[new Fe("#3f7f82"),new Fe("#bc6070"),new Fe("#c4903d")]:[new Fe("#77b8b8"),new Fe("#e28b98"),new Fe("#e1bd70")],f=new Fe;for(let g=0;g{if(i.userData.polyhedronEdges===!0){Kr(i,s.bond);return}if(!(i instanceof Ar))return;const a=i.geometry.getAttribute("color"),c=i.geometry.getAttribute("centerAtomIndex");if(!(!(a instanceof Se)||!(c instanceof Se))){for(let l=0;l{const o=r.material;(Array.isArray(o)?o:o?[o]:[]).forEach(i=>{"color"in i&&i.color instanceof Fe&&i.color.set(t),n!==void 0&&"opacity"in i&&(i.opacity=n)})})}function Rb(e){for(const t of[e.atomObject,e.bonds,e.cell,e.forces,e.velocities,e.ribbon,e.polyhedra])t&&(e.root.remove(t),ps(t));e.atomObject=null,e.bonds=null,e.cell=null,e.forces=null,e.velocities=null,e.ribbon=null,e.polyhedra=null,e.ribbonSelections.clear(),e.pickables=[]}function Tb(e,t,n,r){for(;e.children.length>0;){const l=e.children[e.children.length-1];e.remove(l),ps(l)}if(!t)return;const o=ms[r],s=new Fe(o.background),i=new Fe(o.selection);for(const l of n.trails.slice(0,vd)){const u=$d(t,l);if(u.length===0)continue;const d=u.length/6,f=new Float32Array(d*6);for(let b=0;bPb(t,l)).filter(l=>l!==null),c=Db(a,o.displacement);c&&(c.name="reference-displacements",e.add(c))}function $d(e,t){if(!Number.isSafeInteger(t.atom)||t.atom<0||t.atom>=e.count||t.image.length!==3||!t.image.every(Number.isInteger)||t.points.length<6||t.points.length%3!==0)return new Float32Array;const n=Math.min(ob,Math.floor(t.points.length/3)),r=Math.floor(t.points.length/3)-n,o=t.points.length-3,s=new N().fromArray(t.points,o);if(![s.x,s.y,s.z].every(Number.isFinite))return new Float32Array;const i=qa(e,t.atom,t.image);if(!i)return new Float32Array;const a=[],c=new N;for(let u=r;u=e.count||n.length!==3||!n.every(Number.isInteger))return null;const r=new N().fromArray(e.positions,t*3);if(!e.basis)return r;const o=t*3,s=[n[0]-(e.baseImages[o]??0),n[1]-(e.baseImages[o+1]??0),n[2]-(e.baseImages[o+2]??0)];return r.add(ht(s,e.basis))}function Pb(e,t){const n=qa(e,t.atom,t.image);if(!n||![...t.from,...t.to].every(Number.isFinite))return null;const r=new N(t.to[0]-t.from[0],t.to[1]-t.from[1],t.to[2]-t.from[2]).applyMatrix3(e.displayTransform),o=r.length();if(!Number.isFinite(o)||o<=1e-10)return null;const s=r.clone().multiplyScalar(1/o),i=Math.min(.22,Math.max(.07,o*.18),o*.45);return{tail:n.clone().sub(r),tip:n,direction:s,head:i}}function Db(e,t){if(e.length===0)return null;const n=new Hn,r=new Oe(new xa(.014,.014,1,8,1,!1),new br({color:t,transparent:!0,opacity:.82,depthWrite:!1}),e.length);r.instanceMatrix.setUsage(Ot),n.add(r);const o=new Oe(new du(1,1,9),new br({color:t,transparent:!0,opacity:.88,depthWrite:!1}),e.length);return o.instanceMatrix.setUsage(Ot),n.add(o),hs(n,[...e]),n}function Lb(e,t,n,r,o,s,i,a,c,l,u){const d=ms[o];if(r.mode==="ribbon"){if(e.ribbon=Pd(t,n,r,o,d),e.ribbon){e.root.add(e.ribbon),e.pickables.push(e.ribbon);const g=e.ribbon.userData.ribbonSelections;g instanceof Map&&(e.ribbonSelections=g)}const f=Dd(t,n);if(f){const g={...r,mode:"ball-stick"};e.atomObject=fs(f,n,g,o,!1,"ball-stick"),e.atomObject&&(e.atomObject.userData.instanceToAtom=f.instanceToAtom,e.atomObject.userData.instanceImages=f.instanceImages,e.root.add(e.atomObject),e.pickables.push(e.atomObject));const h=Wi(f,g,!1);e.bonds=Yr(g,d,h.segments.length>Zo?"lines":"instances",h.segments),e.bonds&&e.root.add(e.bonds)}}else{e.polyhedra=r.mode==="polyhedra"?Rd(t,n,r,o,d,!1,u):null;const f=r.mode==="polyhedra"&&!e.polyhedra;e.atomObject=f?null:fs(t,n,r,o,!1),e.atomObject&&(e.root.add(e.atomObject),e.pickables.push(e.atomObject)),e.bonds=e.polyhedra||f?null:Yr(r,d,l.bondKind,l.bondSegments),e.bonds&&e.root.add(e.bonds),e.polyhedra&&e.root.add(e.polyhedra)}e.cell=r.cell?Hb(t,d):null,e.cell&&e.root.add(e.cell),e.forces=r.forces?kl(t,s,a,d.force,l.forceInstances):null,e.forces&&e.root.add(e.forces),e.velocities=r.velocities?kl(t,i,c,d.velocity,l.velocityInstances):null,e.velocities&&e.root.add(e.velocities)}function Ob(e,t,n,r,o,s,i,a){if(!Bb(e,a))return!1;const c=a.forceInstances.length>0?ca(t,r,s,a.forceInstances):[],l=a.velocityInstances.length>0?ca(t,o,i,a.velocityInstances):[];return c.length!==a.forceInstances.length||l.length!==a.velocityInstances.length?!1:(e.atomObject&&zb(e.atomObject,t),e.bonds&&Vb(e.bonds,a.bondSegments),e.cell&&Ub(e.cell,t),e.forces&&hs(e.forces,c),e.velocities&&hs(e.velocities,l),n.mode!=="ribbon"&&n.mode!=="polyhedra")}function Bb(e,t){if(e.ribbon||e.polyhedra)return!1;if(t.atomKind==="none"){if(e.atomObject)return!1}else if(t.atomKind==="points"){if(!(e.atomObject instanceof Nn)||e.atomObject.geometry.getAttribute("position").count!==t.atomCount)return!1}else if(!(e.atomObject instanceof Oe)||e.atomObject.instanceMatrix.count!==t.atomCount)return!1;if(t.bondKind==="none"){if(e.bonds)return!1}else if(t.bondKind==="lines"){if(!(e.bonds instanceof vr)||e.bonds.geometry.getAttribute("position").count!==t.bondSegments.length*2)return!1}else if(!(e.bonds instanceof Oe)||e.bonds.instanceMatrix.count!==t.bondSegments.length)return!1;if(t.cellLineCount===0){if(e.cell)return!1}else if(!e.cell||e.cell.geometry.getAttribute("position").count!==t.cellLineCount*2)return!1;return Ml(e.forces,t.forceInstances.length)&&Ml(e.velocities,t.velocityInstances.length)}function Ml(e,t){if(t===0)return e===null;const[n,r]=e?.children??[];return n instanceof Oe&&r instanceof Oe&&n.instanceMatrix.count===t&&r.instanceMatrix.count===t}function zb(e,t){const n=new N;if(e instanceof Nn){const o=e.geometry.getAttribute("position");for(let s=0;s{n.setXYZ(s*2,r.x,r.y,r.z),n.setXYZ(s*2+1,o.x,o.y,o.z)}),n.needsUpdate=!0,e.geometry.computeBoundingSphere();return}e instanceof Oe&&_d(e,t)}function Ub(e,t){if(!t.basis)return;const n=[];t.images.forEach(o=>Ha(n,t.basis,o,t.cellCenter));const r=e.geometry.getAttribute("position");r.array.set(n),r.needsUpdate=!0,e.geometry.computeBoundingSphere()}function qb(e){return JSON.stringify([e.mode,e.water,e.hydrogens,e.images.min,e.images.max,e.cell,e.bonds,e.forces,e.velocities,e.atomScale,e.bondScale,e.color,e.quality])}function fs(e,t,n,r,o=!1,s){const i=e.instanceToAtom.length;if(i===0)return null;if(Su(n,i)){const g=new Float32Array(i*3),h=new Float32Array(i*3),b=new N;for(let M=0;M{f.toArray(u,h*6),g.toArray(u,h*6+3)});const d=new fn;return d.setAttribute("position",new Se(u,3).setUsage(Ot)),new vr(d,new ws({color:t.bond,transparent:!0,opacity:t.bondOpacity}))}const s=(e.mode==="licorice"?.14:e.mode==="polyhedra"?.025:.045)*Math.max(.1,e.bondScale),i=o&&r.length<=12e3?16:vu(e,r.length)?12:8,a=new xa(s,s,1,i,1,!1),c=new Sr({color:t.bond,roughness:.56,metalness:.01,transparent:!0,opacity:t.bondOpacity}),l=new Oe(a,c,r.length);return l.instanceMatrix.setUsage(Ot),_d(l,r),l}function _d(e,t){const n=new lo,r=new N;t.forEach(({from:o,to:s},i)=>{r.subVectors(s,o);const a=r.length();n.position.copy(o).add(s).multiplyScalar(.5),n.quaternion.setFromUnitVectors(ia,r.normalize()),n.scale.set(1,a,1),n.updateMatrix(),e.setMatrixAt(i,n.matrix)}),e.instanceMatrix.needsUpdate=!0,e.computeBoundingSphere()}function Hb(e,t){if(!e.basis||e.images.length===0)return null;const n=[];e.images.forEach(o=>Ha(n,e.basis,o,e.cellCenter));const r=new fn;return r.setAttribute("position",new sn(n,3).setUsage(Ot)),new vr(r,new ws({color:t.cell,transparent:!0,opacity:t.cellOpacity}))}function Ha(e,t,n,r){const o=Ca(t,n,r),s=(a,c,l)=>a*4+c*2+l,i=[];for(let a=0;a<=1;a+=1){for(let c=0;c<=1;c+=1)i.push([s(a,c,0),s(a,c,1)]);for(let c=0;c<=1;c+=1)i.push([s(a,0,c),s(a,1,c)])}for(let a=0;a<=1;a+=1)for(let c=0;c<=1;c+=1)i.push([s(0,a,c),s(1,a,c)]);i.forEach(([a,c])=>e.push(...o[a].toArray(),...o[c].toArray()))}function kl(e,t,n,r,o){const s=ca(e,t,n,o);if(s.length===0)return null;const i=new Hn,a=new Oe(new xa(.018,.018,1,8,1,!1),new br({color:r}),s.length);a.instanceMatrix.setUsage(Ot),i.add(a);const c=new Oe(new du(1,1,9),new br({color:r}),s.length);return c.instanceMatrix.setUsage(Ot),i.add(c),hs(i,s),i}function ca(e,t,n,r){if(!t||t.length{const d=e.instanceToAtom[u];return Math.hypot(t[d*3],t[d*3+1],t[d*3+2])}).filter(u=>Number.isFinite(u)&&u>1e-12).sort((u,d)=>u-d);if(o.length===0)return[];const i=1.45/o[Math.floor((o.length-1)*.9)]*n,a=[],c=new N,l=new N;for(const u of r){const d=e.instanceToAtom[u],f=d*3;c.set(t[f],t[f+1],t[f+2]);const g=c.length();ju(c.normalize(),e),Vt(l,e,u);const h=g*i,b=Math.min(Math.min(.24,Math.max(.075,h*.24)),h*.5),w=(e.radii[d]??.3)*1.03;a.push({tail:l.clone().addScaledVector(c,w),tip:l.clone().addScaledVector(c,w+h),direction:c.clone(),head:b})}return a}function hs(e,t){const[n,r]=e.children;if(!(n instanceof Oe)||!(r instanceof Oe))return;const o=new lo,s=new N;t.forEach((i,a)=>{s.copy(i.tip).addScaledVector(i.direction,-i.head*.48),o.position.copy(i.tail).add(s).multiplyScalar(.5),o.quaternion.setFromUnitVectors(ia,i.direction),o.scale.set(1,i.tail.distanceTo(s),1),o.updateMatrix(),n.setMatrixAt(a,o.matrix)}),n.instanceMatrix.needsUpdate=!0,t.forEach((i,a)=>{o.position.copy(i.tip).addScaledVector(i.direction,-i.head*.5),o.quaternion.setFromUnitVectors(ia,i.direction),o.scale.set(i.head*.34,i.head,i.head*.34),o.updateMatrix(),r.setMatrixAt(a,o.matrix)}),r.instanceMatrix.needsUpdate=!0,n.computeBoundingSphere(),n.boundingBox=null,r.computeBoundingSphere(),r.boundingBox=null}function Rd(e,t,n,r,o,s=!1,i,a){const c=i??Ka(e),l=gd(c.input,{images:e.images,maxCenters:c.maxCenters,centerAtomicNumbers:c.centerAtomicNumbers,containedInCell:n.cell,cellCenter:e.cellCenter,colorForCenter:(h,b)=>Et(t,h,b,n.color,r)},c.topology);if(!l)return null;const u=new Hn,d=new Ar(l,new Sr({vertexColors:!0,transparent:!0,opacity:s?.2:r==="light"?.28:.34,depthWrite:!s,roughness:s?.7:.58,metalness:0,flatShading:!0,side:zi,polygonOffset:!0,polygonOffsetFactor:1,polygonOffsetUnits:1}));d.userData.publicationExcludeFromAo=!0,d.renderOrder=1,u.add(d);const f=l.userData.edgePositions instanceof Float32Array?l.userData.edgePositions:new Float32Array;let g;if(s&&a){const{LineMaterial:h,LineSegments2:b,LineSegmentsGeometry:w}=a.constructors,M=new w;M.setPositions(Array.from(f));const k=new h({color:o.bond,linewidth:ke.clamp(1.18*Math.min(a.width/2400,a.height/1800),1,2.8),transparent:!0,opacity:.66,depthWrite:!1,alphaToCoverage:!0}),S=new b(M,k);S.isLine2=!0,S.userData.publicationFitPositions=f,S.frustumCulled=!1,g=S}else{const h=new fn;h.setAttribute("position",new Se(f,3)),h.computeBoundingSphere(),g=new vr(h,new ws({color:o.bond,transparent:!0,opacity:.36,depthWrite:!1}))}return g.userData.polyhedronEdges=!0,g.userData.publicationExcludeFromAo=!0,g.renderOrder=2,u.add(g),u}function Kb(e){const t=Ka(e),n=Cs(t.input,{maxCenters:t.maxCenters,centerAtomicNumbers:t.centerAtomicNumbers});return pd(t.input,{maxCenters:t.maxCenters,centerAtomicNumbers:t.centerAtomicNumbers},n)}function Ka(e){const t=e.visibleAtoms.length===e.count?e.bonds:Gb(e),n=Td(e,t);return{input:n,maxCenters:e.visibleAtoms.length>24?8:64,centerAtomicNumbers:bd(n)}}function Td(e,t){return{positions:e.positions,atomicNumbers:e.atomicNumbers,bonds:t,basis:e.basis,pbc:e.pbc}}function Gb(e){const t=new Set(e.visibleAtoms);return e.bonds.filter(([n,r])=>t.has(n)&&t.has(r))}function Pd(e,t,n,r,o){if(e.backbone.length<3)return null;const s=e.images.map(d=>ht(d,e.basis)),i=Wa(e).map(d=>Xa(e,d)),a=[],c=[];for(const d of i){const f=Ga(d,t);a.push({residues:d,centers:ld(d,f)});const g=Ng(d,{scale:n.atomScale,quality:n.quality,structures:f,translations:s,translationImages:e.images});g&&c.push(g)}const l=c.length===1?c[0]:Qm(c,!1);if(!l)return null;c.length>1&&c.forEach(d=>d.dispose()),Fd(l,t,e,n,r,o);const u=new Ar(l,new Sr({vertexColors:!0,roughness:.62,metalness:0,dithering:!0,side:Ym}));return u.userData.ribbonSelections=Ld(a,e),u}function Ga(e,t){const n=fo(e),r=new Map((t.topology.residues??[]).filter(o=>o.secondary_structure).map(o=>[o.index,o.secondary_structure]));for(let o=0;o[c.index,c])),r=t.topology.atom_residue_index??[],o=e.visibleAtoms.filter(c=>n.get(r[c]??-1)?.category!=="amino-acid");if(o.length===0)return null;const s=new Set(o),i=[],a=[];for(let c=0;cs.has(c)&&s.has(l)),visibleAtoms:o,instanceToAtom:Uint32Array.from(i),instanceImages:Int8Array.from(a),radii:e.atomicNumbers.map(c=>ka(c,"ball-stick",.82)),backbone:[]}}function Wa(e){const t=[];for(const n of e.backbone){const r=n.runIndex??0;for(;t.length<=r;)t.push([]);t[r].push(n)}return t.filter(n=>n.length>=3)}function Xa(e,t){const n=[];for(const r of t){const o=new N().fromArray(e.positions,r.ca*3),s=n.length===0?o:Dt(n[n.length-1].ca,o,e.basis,e.pbc),i=Wb(o,s,e.basis,e.pbc),a=r.ca*3,c=[(e.baseImages[a]??0)+i[0],(e.baseImages[a+1]??0)+i[1],(e.baseImages[a+2]??0)+i[2]],l=Dt(s,new N().fromArray(e.positions,r.n*3),e.basis,e.pbc),u=Dt(s,new N().fromArray(e.positions,r.c*3),e.basis,e.pbc),d=Dt(u,new N().fromArray(e.positions,r.o*3),e.basis,e.pbc);n.push({atomIndex:r.ca,residueIndex:r.residueIndex,image:c,n:l,ca:s,c:u,o:d})}return n}function Wb(e,t,n,r){if(!n)return[0,0,0];const o=t.clone().sub(e);return[r[0]?Math.round(o.dot(n.reciprocal[0])):0,r[1]?Math.round(o.dot(n.reciprocal[1])):0,r[2]?Math.round(o.dot(n.reciprocal[2])):0]}function Ld(e,t){const n=new Map;for(const{residues:r,centers:o}of e)for(let s=0;s{const l=mn(c.atom,c.image);if(i.has(l))return;const u=c.atom*3,d=c.image.map((f,g)=>f-(e.baseImages[u+g]??0));d.some(f=>f<-127||f>127)||(i.add(l),o.push(c.atom),s.push(d[0],d[1],d[2]))};for(const c of t.values())a(c.selection);for(let c=0;c{M>=0&&M{if(!h.has(k)){if(h.add(k),i&&v.toArray(i,S*3),c)v.toArray(c,o*3);else{let j=e.selection.children[o];j||(j=new Ar(e.selectionGeometry,e.selectionMaterial),j.renderOrder=10,e.selection.add(j)),j.position.copy(v),j.scale.setScalar(Math.max(.24,r.radii[M]||.3)*1.35),j.visible=!0}f&&(f[S]=1),o+=1}};for(const[M,k]of e.ribbonSelections??[]){const S=s.get(M);S!==void 0&&b(k.selection.atom,M,S,k.position)}for(let M=0;Mw;)e.selection.remove(e.selection.children[e.selection.children.length-1]);return c?(a.needsUpdate=!0,e.selectionPoints.geometry.setDrawRange(0,o),e.selectionPoints.visible=o>0):(e.selectionPoints.geometry.setDrawRange(0,0),e.selectionPoints.visible=!1),i&&f&&t.length>0&&f.every(M=>M===1)?i:null}function Mi(e,t,n){const r=e.model;if(e.keyboardFocus.visible=!1,!r||!t)return null;const o=e.ribbonSelections.get(mn(t.atom,t.image));if(o)return e.keyboardFocus.position.copy(o.position),e.keyboardFocus.scale.setScalar(Math.max(.24,r.radii[t.atom]||.3)*1.62),e.keyboardFocus.visible=!0,-1;if(n!==null&&so(e.instanceToAtom,e.instanceImages,n,t,e.baseImages))return Cl(e,t,n),n;for(let s=0;s=0?a:0:a>=0?(a+Math.sign(o)+i)%i:o<0?i-1:0,l=Ya(e,t,c,s);return l?{selection:l,instance:c}:null}function so(e,t,n,r,o=new Int32Array){if(!r||!Number.isInteger(n)||n<0||n>=e.length)return!1;const s=n*3,i=e[n]*3;return s+2n.distanceToSquared(new N().fromBufferAttribute(r,u))=0&&Od(c)?{atom:a,image:c}:null}function Ya(e,t,n,r=new Int32Array){if(!Number.isInteger(n)||n<0||n>=e.length)return null;const o=n*3;if(o+2>=t.length)return null;const s=e[n],i=s*3;return{atom:s,image:[(r[i]??0)+t[o],(r[i+1]??0)+t[o+1],(r[i+2]??0)+t[o+2]]}}function Od(e){return e.length===3&&e.every(Number.isInteger)}function mn(e,t){return`${e}:${t[0]}:${t[1]}:${t[2]}`}function Jb(e,t){return!e||!t?e===t:mn(e.atom,e.image)===mn(t.atom,t.image)}function ey(e,t){const n=`${e.topology.symbols?.[t.atom]??"Atom"} ${t.atom+1}`,r=t.image.map((o,s)=>{if(o===0)return"";const i=o>0?"+":"−",a=Math.abs(o)===1?"":Math.abs(o);return`${i}${a}${"abc"[s]}`}).join("");return r?`${n} (${r})`:n}function ty(e,t,n,r){const o=e.model;if(!o||t.width<=0||t.height<=0)return[];const s=Math.max(t.left,Math.min(n.x,r.x)),i=Math.min(t.right,Math.max(n.x,r.x)),a=Math.max(t.top,Math.min(n.y,r.y)),c=Math.min(t.bottom,Math.max(n.y,r.y));if(i<=s||c<=a)return[];e.camera.updateMatrixWorld();const l=new N,u=[],d=new Set,f=(g,h)=>{const b=mn(g.atom,g.image);if(d.has(b)||(l.copy(h),l.project(e.camera),!Number.isFinite(l.x)||!Number.isFinite(l.y)||l.z<-1||l.z>1))return;const w=t.left+(l.x+1)*.5*t.width,M=t.top+(1-l.y)*.5*t.height;wi||Mc||(d.add(b),u.push(g))};for(const g of e.ribbonSelections.values())f(g.selection,g.position);for(let g=0;gcy(s,n.basis,c,n.cellCenter));const i=o.getSize(new N).length(),a=s.getSize(new N).length();Xf(i,a,n.images)&&o.union(s)}return o.isEmpty()?null:o}function jl(e,t){const n=ry(e,t);if(!n)return;Bd(e.controls);const r=t.presentation.mode==="ribbon"&&t.preset==="perspective"&&t.model.images.length===1?oy(t.model,t.manifest):null,o=r?hg(r.positions,r.points.map((S,v)=>v),t.presentation.atomScale,e.camera.aspect,r.points.map(S=>S.faceNormal)):null,s=o?.center??n.getCenter(new N),i=ke.degToRad(e.camera.fov*.5),a=Math.atan(Math.tan(i)*e.camera.aspect),c=Math.min(i,a),{direction:l,up:u}=o??uy(t.preset),d=new N().crossVectors(u,l).normalize(),f=new N().crossVectors(l,d).normalize(),g=.78;let h=1.6/Math.tan(c)*1.08;const b=o&&e.ribbon?e.ribbon.geometry.getAttribute("position"):null,w=new N,M=new N,k=(S,v)=>{M.copy(S).sub(s);const j=M.dot(l);h=Math.max(h,j+(Math.abs(M.dot(d))+v)/(Math.tan(a)*g),j+(Math.abs(M.dot(f))+v)/(Math.tan(i)*g))};if(b)for(let S=0;S{const s=Xa(e,o);return jg(s,Ga(s,t))});if(n.length<3)return null;const r=new Float32Array(n.length*3);return n.forEach((o,s)=>o.center.toArray(r,s*3)),{positions:r,points:n}}function sy(e,t){return{position:e.position.toArray(),target:t.toArray(),up:e.up.toArray(),fov:e.fov,zoom:e.zoom,near:e.near,far:e.far}}function iy(e,t){if([...t.position,...t.target,...t.up,t.fov,t.zoom,t.near,t.far].some(r=>!Number.isFinite(r))||t.fov<=0||t.fov>=180||t.zoom<=0||t.near<=0||t.far<=t.near)throw new Error("The saved camera is invalid");Bd(e.controls),e.camera.position.fromArray(t.position),e.camera.up.fromArray(t.up).normalize(),e.camera.fov=t.fov,e.camera.zoom=t.zoom,e.camera.near=t.near,e.camera.far=t.far,e.controls.target.fromArray(t.target),e.camera.updateProjectionMatrix(),e.controls.update(),e.cameraMode="manual"}function Bd(e){const t=e.enableDamping;e.enableDamping=!1;try{e.update()}finally{e.enableDamping=t}}function ay(e,t){const n=Yf(e.images);return[t.mode,t.wrap,t.cellOrigin.join(","),t.mirror.join(","),t.cell,e.visibleAtoms.length,n.count,n.span.join(",")].join(":")}function cy(e,t,n,r){Ca(t,n,r).forEach(o=>e.expandByPoint(o))}function ly(e){const t=[];for(const n of[e.min.x,e.max.x])for(const r of[e.min.y,e.max.y])for(const o of[e.min.z,e.max.z])t.push(new N(n,r,o));return t}function uy(e){return e==="xy"?{direction:new N(0,0,1),up:new N(0,1,0)}:e==="xz"?{direction:new N(0,1,0),up:new N(0,0,1)}:e==="yz"?{direction:new N(1,0,0),up:new N(0,0,1)}:{direction:new N(1,.68,1.15).normalize(),up:new N(0,1,0)}}function ps(e){const t=new Set,n=new Set;e.traverse(r=>{const o=r;r instanceof Oe&&r.dispose(),o.geometry&&!t.has(o.geometry)&&(t.add(o.geometry),o.geometry.dispose()),(Array.isArray(o.material)?o.material:o.material?[o.material]:[]).forEach(i=>{n.has(i)||(n.add(i),i.dispose())})})}const zd={1:"#f0eee7",2:"#d8f2f2",3:"#b889df",4:"#bed17f",5:"#d4956d",6:"#94a3a7",7:"#5680dd",8:"#df6259",9:"#6cba79",10:"#7bcdd0",11:"#9874ce",12:"#89a86d",13:"#c7b8ae",14:"#d5aa82",15:"#ed9e54",16:"#ead462",17:"#74ca88",18:"#8bdce2",19:"#aa7bdd",20:"#99ba7b",22:"#8294aa",26:"#cf8964",29:"#d19a71",30:"#adb3b7",35:"#b65a4c",38:"#8ead82",53:"#8d61b5"},dy={...zd,1:"#aab5b3",6:"#59656f",7:"#315bb8",8:"#c94138",9:"#318448",15:"#d87924",16:"#c5a51c",17:"#348b4c",22:"#637f9e",38:"#77986d"},Ve=["X","H","He","Li","Be","B","C","N","O","F","Ne","Na","Mg","Al","Si","P","S","Cl","Ar","K","Ca","Sc","Ti","V","Cr","Mn","Fe","Co","Ni","Cu","Zn","Ga","Ge","As","Se","Br","Kr","Rb","Sr","Y","Zr","Nb","Mo","Tc","Ru","Rh","Pd","Ag","Cd","In","Sn","Sb","Te","I","Xe","Cs","Ba","La","Ce","Pr","Nd","Pm","Sm","Eu","Gd","Tb","Dy","Ho","Er","Tm","Yb","Lu","Hf","Ta","W","Re","Os","Ir","Pt","Au","Hg","Tl","Pb","Bi","Po","At","Rn","Fr","Ra","Ac","Th","Pa","U","Np","Pu","Am","Cm","Bk","Cf","Es","Fm","Md","No","Lr","Rf","Db","Sg","Bh","Hs","Mt","Ds","Rg","Cn","Nh","Fl","Mc","Lv","Ts","Og"],my="unknown hydrogen helium lithium beryllium boron carbon nitrogen oxygen fluorine neon sodium magnesium aluminium silicon phosphorus sulfur chlorine argon potassium calcium scandium titanium vanadium chromium manganese iron cobalt nickel copper zinc gallium germanium arsenic selenium bromine krypton rubidium strontium yttrium zirconium niobium molybdenum technetium ruthenium rhodium palladium silver cadmium indium tin antimony tellurium iodine xenon caesium barium lanthanum cerium praseodymium neodymium promethium ",fy="samarium europium gadolinium terbium dysprosium holmium erbium thulium ytterbium lutetium hafnium tantalum tungsten rhenium osmium iridium platinum gold mercury thallium lead bismuth polonium astatine radon francium radium actinium thorium protactinium uranium ",hy="neptunium plutonium americium curium berkelium californium einsteinium fermium ",py="mendelevium nobelium lawrencium rutherfordium dubnium seaborgium bohrium hassium ",gy="meitnerium darmstadtium roentgenium copernicium nihonium flerovium moscovium livermorium tennessine oganesson",gs=(my+fy+hy+py+gy).split(" "),Xn=new Map;for(let e=1;e0&&e[an(l),u])),s=xr(t);if(n==="add"){for(const l of s){const u=an(l);o.has(u)||(o.set(u,r.length),r.push(l))}return r}const i=new Set(s.map(an)),a=r.filter(l=>!i.has(an(l))),c=new Set(r.map(an));for(const l of s)c.has(an(l))||a.push(l);return a}function yy(e,t){return{name:Cy(e),selections:xr(t)}}function Qa(e){const t=new Map;for(const o of e){const s=Ve[o]??"X";t.set(s,(t.get(s)??0)+1)}const n=[...t.keys()];return(t.has("C")?["C",...t.has("H")?["H"]:[],...n.filter(o=>o!=="C"&&o!=="H").sort()]:n.sort()).map(o=>{const s=t.get(o);return`${o}${s===1?"":s}`}).join("")}function xy(e){const t=e.match(/^\s*select\s+within\s+((?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?)\s*(?:a|å|angstroms?)\s+of\s+selection\s*$/i);if(!t)return null;const n=Number(t[1]);return Number.isFinite(n)&&n>0?n:null}function wy(e,t){const n=e.trim();if(!n||t.atomCount<1)return null;const r=n.match(/^(?:#|atom\s+)?(\d+)$/i);if(r){const i=Number(r[1]);return!Number.isInteger(i)||i<1||i>t.atomCount?null:i-1}const o=t.atomNames,s=n.match(/^([A-Za-z][a-z]?)(\d+)$/);if(s&&t.symbolAt){const i=Number(s[2])-1;if(i>=0&&ic.trim().toLowerCase()===i);if(a>=0)return a}return null}function Vd(e){Ud(e);const t=Sy(e),n=new Int32Array(e.count),r=new Uint8Array(e.count);for(let i=0;i0,componentRoots:s,residueIndices:t}}class Ay{context;hasConnectivity;componentRoots;residueIndices;visibleInstances=null;constructor(t,n=Vd(t)){if(Ud(t),n.count!==t.count)throw new RangeError("Selection topology does not match the scene");this.context=t,this.hasConnectivity=n.hasConnectivity,this.componentRoots=n.componentRoots,this.residueIndices=n.residueIndices}selectionAt(t){if(!Number.isInteger(t)||t<0||t>=this.context.instanceToAtom.length)return null;const n=this.context.instanceToAtom[t];if(n>=this.context.count)return null;const r=t*3,o=n*3;return{atom:n,image:[this.context.baseImages[o]+this.context.instanceImages[r],this.context.baseImages[o+1]+this.context.instanceImages[r+1],this.context.baseImages[o+2]+this.context.instanceImages[r+2]]}}displayedPosition(t){if(!ur(t,this.context.count))return null;const n=new Float64Array(3);return ki(n,this.context,t)?[n[0],n[1],n[2]]:null}isVisible(t){return this.instanceFor(t)!==null}selectScope(t,n){if(!ur(t,this.context.count))return[];const r=this.displayImage(t);if(!r||this.instanceFor(t)===null)return[];if(n==="atom")return[Za(t)];const o=t.atom;let s;if(n==="element"){const i=this.context.atomicNumbers[o];s=a=>this.context.atomicNumbers[a]===i}else if(n==="residue"){const i=this.residueIndices[o];if(i<0)return null;s=a=>this.residueIndices[a]===i}else if(n==="component"){if(!this.hasConnectivity)return null;const i=this.componentRoots[o];s=a=>this.componentRoots[a]===i}else if(n==="molecule"){const i=this.residueIndices[o];if(this.hasConnectivity){const a=this.componentRoots[o];s=c=>this.componentRoots[c]===a}else{if(i<0)return null;s=a=>this.residueIndices[a]===i}}else throw new TypeError(`Unknown scientific selection scope: ${String(n)}`);return this.collectVisible((i,a)=>s(i)&&this.instanceHasDisplayImage(a,r))}selectElement(t){const n=la(t);return n===null?[]:this.collectVisible(r=>this.context.atomicNumbers[r]===n)}selectWater(){return this.collectVisible(t=>this.context.waterAtoms.has(t))}withinDistance(t,n){return this.withinDistanceOf([t],n)}withinDistanceOf(t,n){if(!Number.isFinite(n)||n<=0)return[];const r=new Float64Array(3),o=new Map,s=new Set;for(const c of t){if(!ur(c,this.context.count))continue;const l=an(c);if(s.has(l)||(s.add(l),!ki(r,this.context,c)))continue;const u=El(Math.floor(r[0]/n),Math.floor(r[1]/n),Math.floor(r[2]/n)),d=o.get(u);d?d.push(r[0],r[1],r[2]):o.set(u,[r[0],r[1],r[2]])}if(o.size===0)return[];const i=n*n,a=new Float64Array(3);return this.collectVisible((c,l)=>{const u=l*3;if(!qd(a,0,this.context,c,this.context.instanceImages[u],this.context.instanceImages[u+1],this.context.instanceImages[u+2]))return!1;const d=Math.floor(a[0]/n),f=Math.floor(a[1]/n),g=Math.floor(a[2]/n);for(let h=d-1;h<=d+1;h+=1)for(let b=f-1;b<=f+1;b+=1)for(let w=g-1;w<=g+1;w+=1){const M=o.get(El(h,b,w));if(M)for(let k=0;k=this.context.count||!t(s,o))continue;const i=this.selectionAt(o);if(!i)continue;const a=an(i);r.has(a)||(r.add(a),n.push(i))}return n}displayImage(t){if(!ur(t,this.context.count))return null;const n=t.atom*3;return[t.image[0]-this.context.baseImages[n],t.image[1]-this.context.baseImages[n+1],t.image[2]-this.context.baseImages[n+2]]}instanceFor(t){const n=this.displayImage(t);return n?this.ensureVisibleInstances().get(Nl(t.atom,n[0],n[1],n[2]))??null:null}instanceHasDisplayImage(t,n){const r=t*3;return this.context.instanceImages[r]===n[0]&&this.context.instanceImages[r+1]===n[1]&&this.context.instanceImages[r+2]===n[2]}ensureVisibleInstances(){if(this.visibleInstances)return this.visibleInstances;const t=new Map;for(let n=0;n=this.context.count)continue;const o=n*3,s=Nl(r,this.context.instanceImages[o],this.context.instanceImages[o+1],this.context.instanceImages[o+2]);t.has(s)||t.set(s,n)}return this.visibleInstances=t,t}}function Ud(e){if(!Number.isInteger(e.count)||e.count<0)throw new RangeError("Selection context count must be a non-negative integer");if(e.atomicNumbers.length=0&&r<=2147483647&&(t[n]=r)}return t}function ki(e,t,n){const r=n.atom*3;return qd(e,0,t,n.atom,n.image[0]-t.baseImages[r],n.image[1]-t.baseImages[r+1],n.image[2]-t.baseImages[r+2])}function qd(e,t,n,r,o,s,i){const a=r*3;let c=n.positions[a],l=n.positions[a+1],u=n.positions[a+2];if(![c,l,u].every(Number.isFinite))return!1;if(o!==0||s!==0||i!==0){const d=n.cell;if(!d)return!1;c+=o*d[0]+s*d[3]+i*d[6],l+=o*d[1]+s*d[4]+i*d[7],u+=o*d[2]+s*d[5]+i*d[8]}return[c,l,u].every(Number.isFinite)?(e[t]=c,e[t+1]=l,e[t+2]=u,!0):!1}function vy(e,t,n){return Number.isInteger(e)&&Number.isInteger(t)&&e>=0&&t>=0&&e=0&&e.atom80)throw new RangeError("Named selection name is too long");return t}const jy=[[0,1],[0,2],[0,4],[1,3],[1,5],[2,3],[2,6],[3,7],[4,5],[4,6],[5,7],[6,7]],Ny={1:"#F7F7F4",2:"#D8F2F2",3:"#B889DF",4:"#BED17F",5:"#D4956D",6:"#4B5560",7:"#315FBC",8:"#D94A42",9:"#55A65C",10:"#7BCDD0",11:"#9874CE",12:"#89A86D",13:"#C7B8AE",14:"#D5AA82",15:"#DE8D31",16:"#D7B52F",17:"#4C9A59",18:"#8BDCE2",19:"#AA7BDD",20:"#99BA7B",22:"#637F9E",26:"#A76545",29:"#B87333",30:"#6D79A8",35:"#B65A4C",38:"#77986D",53:"#8D61B5"};function Hd(e){return Ny[e]}function Ey(e,t,n){const r=new Map((e.topology.residues??[]).map(d=>[d.index,d])),o=Py(t,e),s=new Map,i=[],a=[];for(let d=0;d(n.wrap==="atom"||n.wrap==="unwrapped")&&Ss(t.positions,d,f,t.basis,t.pbc).some(g=>g!==0)),l=new Set(c.map(([d,f])=>$l(d,f)));if(n.bonds)for(const d of t.images)for(const[f,g]of t.bonds){if(l.has($l(f,g)))continue;const h=s.get(Ci(f,d)),b=s.get(Ci(g,d));h===void 0||b===void 0||(i[h].bonds.push(b),i[h].bondOrder.push(1),i[b].bonds.push(h),i[b].bondOrder.push(1))}const u=Jo(t,n);return{atoms:i,selections:a,bondSegments:u,shapeBondSegments:c.length===0?[]:Jo({...t,bonds:c},n),boundaryBondCount:c.length,cellSegments:n.cell?_y(t):[],collisionSegments:Ry(t),layoutKey:[e.dataset_generation??e.name,t.count,Fl(t.atomicNumbers),t.visibleAtoms.join(","),t.images.map(d=>d.join(",")).join(";"),Fl(t.baseImages),n.water,n.hydrogens?1:0,n.bonds?1:0,n.color,e.topology.residues?.length??0].join("|")}}function Iy(e){const t=e.properties;return![t.pqAtom,t.pqImageA,t.pqImageB,t.pqImageC].every(Number.isInteger)||t.pqAtom<0?null:{atom:t.pqAtom,image:[t.pqImageA,t.pqImageB,t.pqImageC]}}function Fy(e,t){return{count:t.count,atomicNumbers:t.atomicNumbers,positions:t.positions,baseImages:t.baseImages,cell:t.basis?Float64Array.from(t.basis.vectors.flatMap(n=>[n.x,n.y,n.z])):null,bonds:t.bonds,waterAtoms:t.waterAtoms,instanceToAtom:t.instanceToAtom,instanceImages:t.instanceImages,atomResidueIndex:e.topology.atom_residue_index}}function $y(e,t){const n=new Float64Array(t.length*3);for(let r=0;r=e.count)return null;const s=o.atom*3,i=[o.image[0]-(e.baseImages[s]??0),o.image[1]-(e.baseImages[s+1]??0),o.image[2]-(e.baseImages[s+2]??0)],a=ht(i,e.basis);n[r*3]=e.positions[s]+a.x,n[r*3+1]=e.positions[s+1]+a.y,n[r*3+2]=e.positions[s+2]+a.z}return n}function _y(e){if(!e.basis)return[];const t=[];for(const n of e.images){const r=Ca(e.basis,n,e.cellCenter);for(const[o,s]of jy)t.push({from:r[o],to:r[s]})}return t}function Ry(e){if(e.visibleAtoms.length>2e3)return[];const t=new Set(e.bonds.map(([i,a])=>ii.length()):null,s=Float64Array.from(e.atomicNumbers,i=>Qf(i));for(let i=0;if*o[0]+1e-10||Math.abs(j)>f*o[1]+1e-10||Math.abs(E)>f*o[2]+1e-10)continue;const D=new N(e.positions[c],e.positions[c+1],e.positions[c+2]),U=Dt(D,new N(e.positions[d],e.positions[d+1],e.positions[d+2]),e.basis,e.pbc);g=U.x-D.x,h=U.y-D.y,b=U.z-D.z}else g=e.positions[d]-e.positions[c],h=e.positions[d+1]-e.positions[c+1],b=e.positions[d+2]-e.positions[c+2];const w=g*g+h*h+b*b;if(w>.0025&&w=256)break}}if(n.length>=256)break}return n.length===0?[]:e.images.flatMap(i=>{const a=ht(i,e.basis);return n.map(({from:c,to:l})=>({from:c.clone().add(a),to:l.clone().add(a)}))})}function Ty(e){const t=new Float64Array(e.count*3),n=e.basis.reciprocal;for(let r=0;rs.secondary_structure).map(s=>[s.index,s.secondary_structure])),o=new Map;for(const s of e.backbone){const i=s.runIndex??0,a=o.get(i)??[];a.push(s),o.set(i,a)}for(const s of o.values()){if(s.length<3)continue;const i=[];for(const l of s){const u=new N().fromArray(e.positions,l.ca*3),d=i.length===0?u:Dt(i.at(-1).ca,u,e.basis,e.pbc);i.push({atomIndex:l.ca,residueIndex:l.residueIndex,n:Dt(d,new N().fromArray(e.positions,l.n*3),e.basis,e.pbc),ca:d,c:Dt(d,new N().fromArray(e.positions,l.c*3),e.basis,e.pbc),o:new N}),i.at(-1).o=Dt(i.at(-1).c,new N().fromArray(e.positions,l.o*3),e.basis,e.pbc)}const a=fo(i),c=i.map((l,u)=>r.get(l.residueIndex)??a[u]);i.forEach((l,u)=>{n.set(l.residueIndex,{structure:c[u],begin:u===0||c[u-1]!==c[u],end:u===c.length-1||c[u+1]!==c[u]})})}return n}function Dy(e){return e==="helix"?"h":e==="sheet"?"s":"c"}function Ly(e,t,n,r){if(r==="element")return Hd(n)??"#65757A";if(r==="chain"){const o=e.topology.atom_residue_index?.[t],s=e.topology.residues?.find(i=>i.index===o);return Il(Oy(s?.chain_id??"A"))}return Il(e.topology.atom_residue_index?.[t]??t)}function Il(e){const t=(e*.173%1+1)%1;return`#${new Fe().setHSL(t,.42,.43).getHexString()}`}function Oy(e){let t=0;for(let n=0;n>8&255,t=Math.imul(t,16777619);return(t>>>0).toString(36)}function Ci(e,t){return`${e}:${t[0]}:${t[1]}:${t[2]}`}function $l(e,t){return e{const $=v.current;if(!$)return;let y=!1,z=null;return Pn(()=>import("./3dmol-DaMeRkCq.js").then(B=>B._),__vite__mapDeps([2,3])).then(B=>{if(y)return;const ee=B.createViewer($,{backgroundColor:io.background,backgroundAlpha:1,antialias:!0,upscale:!0,cartoonQuality:12,disableFog:!0,minimumZoomToDistance:2.4});ee.setDefaultCartoonQuality(12),ee.setProjection("perspective"),j.current={viewer:ee,model:null,scene:null,plan:null,layoutKey:"",styleKey:"",fitMode:"ball-stick",manifestName:"",fittedKey:"",lastResetSignal:-1,lastViewSignal:-1,selectionShape:null,keyboardShape:null,surfaceVersion:0,pickSerial:0,pointer:{pointerType:"mouse",shiftKey:!1,metaKey:!1,ctrlKey:!1}};let H=$.clientWidth/Math.max(1,$.clientHeight);z=new ResizeObserver(()=>{const ie=$.clientWidth/Math.max(1,$.clientHeight);ee.resize();const _=j.current;_?.plan&&Number.isFinite(H)&&Math.abs(ie-H)>.04&&(ee.zoomTo(),ee.zoom(Kd(_.plan.cellSegments.length>0,_.fitMode,ie))),H=ie,ee.render()}),z.observe($),Y(ie=>ie+1)}).catch(B=>{y||R.current?.(B instanceof Error?B:new Error("3Dmol could not be loaded"))}),()=>{y=!0,z?.disconnect();const B=j.current;j.current=null,B?.viewer.clear(),$.replaceChildren()}},[]),x.useEffect(()=>{const $=j.current,y=v.current;if(!$||!y)return;const z=performance.now(),B=Ma(t,n,o,r);if(!B){$.viewer.clear(),$.model=null,$.scene=null,$.plan=null,$.styleKey="",delete y.dataset.renderedManifest,delete y.dataset.sourceFrameIndex,y.dataset.atomCount="0",y.dataset.renderMs="0",b?.(null),w?.(null);return}const ee=performance.now(),H=Ey(t,B,o),ie=performance.now()-ee,_=$.model!==null&&$.layoutKey===H.layoutKey&&$.plan?.atoms.length===H.atoms.length,Z=[o.mode,o.atomScale,o.bondScale,o.quality].join("|");if(_){const re=H.atoms.map(({x:K,y:J,z:Xe})=>[K,J,Xe]);$.model.setCoordinates([re],"array"),$.model.setFrame(0)}else $.viewer.removeAllModels(),$.model=$.viewer.addModel(),$.model.addAtoms(H.atoms);const pe=$.model;if(!pe)throw new Error("3Dmol model creation failed");$.viewer.removeAllShapes(),$.viewer.removeAllSurfaces(),$.selectionShape=null,$.keyboardShape=null,(!_||$.styleKey!==Z)&&(qy(pe,o,H.atoms.length),$.styleKey=Z),_||pe.setClickable({},!0,(re,K,J)=>{$.pickSerial+=1;const Xe=Iy(re);if(!Xe)return;const Me=J??$.pointer;D.current(Xe,sa(Me))});const G=u==="light"?io:ao,xe=fe(n,["forces","force"]),Ae=fe(n,["velocities","velocity","vel"]),ge=Au(B,o,xe,Ae);$.viewer.setBackgroundColor(G.background,1),Hy($.viewer,H.shapeBondSegments,o,G.bond),Ky($.viewer,H.cellSegments,G.cell),Gy($.viewer,H.collisionSegments,G.collision),_l($.viewer,B,xe,c,ge.forceInstances,G.force),_l($.viewer,B,Ae,l,ge.velocityInstances,G.velocity),Xy($.viewer,B,i,G);const Le=o.mode==="polyhedra"?Yy($.viewer,B,G,o.cell):0;if(o.mode==="surface"&&H.atoms.length<=Vy){const re=++$.surfaceVersion,K=$.viewer.addSurface("VDW",{color:"#BCD4D8",opacity:.26},{},{});Promise.resolve(K).then(()=>{j.current!==$||$.surfaceVersion!==re||$.viewer.render()}).catch(J=>{j.current!==$||$.surfaceVersion!==re||R.current?.(J instanceof Error?J:new Error("Surface generation failed"))})}else $.surfaceVersion+=1;$.scene=B,$.plan=H,$.layoutKey=H.layoutKey,$.fitMode=o.mode,$.manifestName=t.name,w?.(Fy(t,B));const W={imageCount:B.images.length,forceCount:ge.forceInstances.length,forceTotal:ge.forceTotal,velocityCount:ge.velocityInstances.length,velocityTotal:ge.velocityTotal,capabilities:kd(t,n,o,r)};b?.(W);const Q=[t.name,t.topology.atom_count,H.layoutKey,o.mode==="ribbon"?"ribbon":"structure",H.cellSegments.length].join("|");($.fittedKey!==Q||$.lastResetSignal!==a||$.lastViewSignal!==f)&&(Jy($.viewer,d,H.cellSegments.length>0,o.mode,y.clientWidth/Math.max(1,y.clientHeight)),$.fittedKey=Q,$.lastResetSignal=a,$.lastViewSignal=f),$.viewer.render();const de=F.current;de&&(Rl($.viewer,de),F.current=null),y.dataset.renderedManifest=t.name,y.dataset.sourceFrameIndex=String(n?.header.frame_key?.source_index??""),y.dataset.atomCount=String(H.atoms.length),y.dataset.bondCount=String(H.bondSegments.length),y.dataset.boundaryBondCount=String(H.boundaryBondCount),y.dataset.renderedBoundaryBondCount=String(H.shapeBondSegments.length),y.dataset.polyhedronCount=String(Le),y.dataset.cellSegmentCount=String(H.cellSegments.length),y.dataset.collisionCount=String(H.collisionSegments.length),y.dataset.forceCount=String(ge.forceInstances.length),y.dataset.velocityCount=String(ge.velocityInstances.length),y.dataset.planMs=ie.toFixed(1),y.dataset.viewerMs=(performance.now()-ee-ie).toFixed(1),y.dataset.renderMs=(performance.now()-z).toFixed(1)},[u,c,n,t,b,w,r,o,a,I,i,l,d,f]),x.useEffect(()=>{const $=j.current;if(!$?.scene){M?.(null);return}Qy($,s,u),Zy($,ae,u),$.viewer.render(),M?.($y($.scene,s))},[u,n,ae,M,o,s,I]),x.useEffect(()=>{const $=v.current;if(!$)return;let y=null,z=!1,B=!1;const ee=W=>{const Q=$.getBoundingClientRect(),de=Math.max(Q.left,Math.min(Q.right,W.clientX)),re=Math.max(Q.top,Math.min(Q.bottom,W.clientY)),K=Math.min(y.x,de),J=Math.min(y.y,re);return{left:K,top:J,width:Math.abs(de-y.x),height:Math.abs(re-y.y)}},H=()=>{y=null,z=!1,B=!1,ce(null)},ie=W=>{const Q=j.current;Q&&(Q.pointer=W,!(!W.shiftKey||W.button!==0)&&(y={x:W.clientX,y:W.clientY,pointerId:W.pointerId},B=!0,$.setPointerCapture(W.pointerId),W.preventDefault(),W.stopImmediatePropagation()))},_=W=>{if(!B||!y||W.pointerId!==y.pointerId)return;const Q=ee(W);z||=Q.width>4||Q.height>4,ce(Q),W.preventDefault(),W.stopImmediatePropagation()},Z=W=>{const Q=j.current;if(B&&y&&W.pointerId===y.pointerId){if(z&&Q?.plan){const re=ee(W),K=Q.viewer.modelToScreen(Q.plan.atoms),J=[],Xe=new Set;K.forEach((Me,qt)=>{if(Me.xre.left+re.width||Me.yre.top+re.height)return;const Ue=Q.plan.selections[qt],In=`${Ue.atom}:${Ue.image.join(":")}`;Xe.has(In)||(Xe.add(In),J.push(Ue))}),U.current?.(J,!0)}$.hasPointerCapture(W.pointerId)&&$.releasePointerCapture(W.pointerId),H(),W.preventDefault(),W.stopImmediatePropagation();return}if(!Q||W.button!==0)return;const de=Q.pickSerial;window.setTimeout(()=>{j.current===Q&&Q.pickSerial===de&&!sa(W)&&D.current(null,!1)},0)},pe=()=>H(),G=()=>{const W=j.current;if(!W?.scene)return;const Q=Un(W.scene.instanceToAtom,W.scene.instanceImages,E.current.at(-1)??null,null,0,W.scene.baseImages);T.current=Q?.selection??null,O.current=Q?.instance??null,se(Q?.selection??null)},xe=()=>{T.current=null,O.current=null,se(null)},Ae=W=>{const Q=j.current;if(!Q?.scene||W.metaKey||W.ctrlKey||W.altKey)return;const de=W.key==="ArrowDown"?1:W.key==="ArrowUp"?-1:0;if(de!==0){const K=Un(Q.scene.instanceToAtom,Q.scene.instanceImages,T.current,O.current,de,Q.scene.baseImages);T.current=K?.selection??null,O.current=K?.instance??null,se(K?.selection??null),W.preventDefault();return}if(W.key!=="Enter"||W.repeat)return;const re=Un(Q.scene.instanceToAtom,Q.scene.instanceImages,T.current??E.current.at(-1)??null,O.current,0,Q.scene.baseImages);re&&(T.current=re.selection,O.current=re.instance,se(re.selection),D.current(re.selection,!0),W.preventDefault())},ge=W=>{W.key!=="Escape"||!B||(H(),W.preventDefault())},Le=W=>{const Q=j.current;if(!Q)return;const de=Math.max(.5,Math.min(2,Math.exp(-W.deltaY*.001)));Q.viewer.zoom(de),Q.viewer.render(),W.preventDefault(),W.stopImmediatePropagation()};return $.addEventListener("pointerdown",ie,!0),$.addEventListener("pointermove",_,!0),$.addEventListener("pointerup",Z,!0),$.addEventListener("pointercancel",pe,!0),$.addEventListener("focus",G),$.addEventListener("blur",xe),$.addEventListener("keydown",Ae),$.addEventListener("wheel",Le,{capture:!0,passive:!1}),window.addEventListener("keydown",ge),()=>{$.removeEventListener("pointerdown",ie,!0),$.removeEventListener("pointermove",_,!0),$.removeEventListener("pointerup",Z,!0),$.removeEventListener("pointercancel",pe,!0),$.removeEventListener("focus",G),$.removeEventListener("blur",xe),$.removeEventListener("keydown",Ae),$.removeEventListener("wheel",Le,!0),window.removeEventListener("keydown",ge)}},[I]),x.useImperativeHandle(S,()=>({exportPng:async()=>{throw new Error("Publication export is provided by the renderer facade")},exportFigure:async()=>{throw new Error("Publication export is provided by the renderer facade")},captureCamera:()=>e0(j.current?.viewer),restoreCamera:$=>{const y=j.current;if(!y?.plan){F.current=$;return}Rl(y.viewer,$)}}),[I]);const me=ae?`${t.topology.symbols?.[ae.atom]??"Atom"} ${ae.atom+1}`:"";return m.jsxs(m.Fragment,{children:[m.jsx("div",{ref:v,className:L?"molecule-canvas molecule-stage-3dmol is-box-selecting":"molecule-canvas molecule-stage-3dmol","data-renderer":"3dmol","data-representation":o.mode,"data-wrap":o.wrap,role:"region","aria-label":"Molecular structure","aria-description":"Use Up and Down to browse visible atoms. Press Enter to toggle an atom selection. Shift-drag to select a box.","aria-keyshortcuts":"ArrowUp ArrowDown Enter",tabIndex:0}),L&&m.jsx("div",{className:"selection-marquee","data-testid":"selection-marquee",style:L,"aria-hidden":"true"}),m.jsx("span",{className:"sr-only","aria-live":"polite",children:me?`${me}. Press Enter to toggle selection.`:""})]})});function qy(e,t,n){const r=o=>String(o.color??"#65757A");if(e.setStyle({},{}),t.mode==="ribbon"){const o={style:"edged",arrows:!0,tubes:!1,thickness:.42,opacity:1};t.color==="structure"?(e.setStyle({hetflag:!1},{cartoon:{...o,color:"#438493"}}),e.setStyle({hetflag:!1,ss:"h"},{cartoon:{...o,color:"#C96A5A"}}),e.setStyle({hetflag:!1,ss:"s"},{cartoon:{...o,color:"#D2A23A"}})):e.setStyle({hetflag:!1},{cartoon:{...o,colorfunc:r}}),e.setStyle({hetflag:!0},{sphere:{scale:.24,colorfunc:r},stick:{radius:.11,color:"#849190"}},!0);return}if(n>1e5){e.setStyle({},{cross:{scale:Math.max(.25,t.atomScale*.45),colorfunc:r},line:{color:"#849190",opacity:.58}});return}if(t.mode==="lines"){e.setStyle({},{sphere:{radius:Math.max(.055,t.atomScale*.095),colorfunc:r},line:{color:"#879492",opacity:.62}});return}if(t.mode==="spacefill"){e.setStyle({},{sphere:{scale:t.atomScale,colorfunc:r}});return}if(t.mode==="polyhedra"){e.setStyle({},{sphere:{radius:.17*t.atomScale,colorfunc:r}});return}if(t.mode==="licorice"){e.setStyle({},{sphere:{radius:.23*t.atomScale,colorfunc:r},stick:{radius:.19*t.bondScale,color:"#849190"}});return}e.setStyle({},{sphere:{scale:Math.max(.18,t.atomScale*.26),colorfunc:r},stick:{radius:(t.mode==="surface"?.05:.085)*t.bondScale,color:"#849190"}})}function Hy(e,t,n,r){if(t.length===0||n.mode==="spacefill"||n.mode==="ribbon"||n.mode==="polyhedra")return;const o=e.addShape({color:r,opacity:.92});if(n.mode==="lines"||t.length>12e3){for(const i of t)o.addLine({start:it(i.from),end:it(i.to),color:r,opacity:.9});return}const s=n.mode==="licorice"?.19*n.bondScale:(t.length>256?.045:.085)*n.bondScale;for(const i of t)o.addCylinder({start:it(i.from),end:it(i.to),radius:s,color:r,fromCap:"round",toCap:"round"})}function Ky(e,t,n){if(t.length===0)return;const r=e.addShape({color:n,opacity:.62});for(const o of t)r.addCylinder({start:it(o.from),end:it(o.to),radius:.01,color:n,opacity:.62,fromCap:"flat",toCap:"flat"})}function Gy(e,t,n){if(t.length===0)return;const r=e.addShape({color:n,opacity:.9});t.forEach((o,s)=>{r.addDashedCylinder({start:it(o.from),end:it(o.to),radius:.035,dashLength:.11,gapLength:.09,color:n}),s<64&&(r.addSphere({center:it(o.from),radius:.58,color:n,opacity:.72,wireframe:!0}),r.addSphere({center:it(o.to),radius:.58,color:n,opacity:.72,wireframe:!0}))})}function _l(e,t,n,r,o,s){const i=Wy(t,n,r,o);if(i.length===0)return;const a=e.addShape({color:s});for(const c of i)a.addArrow({start:it(c.tail),end:it(c.tip),radius:.025,radiusRatio:Math.max(2.5,c.head/.025),midpos:-c.head,color:s})}function Wy(e,t,n,r){if(!t||t.length{const l=e.instanceToAtom[c];return Math.hypot(t[l*3],t[l*3+1],t[l*3+2])}).filter(c=>Number.isFinite(c)&&c>1e-12).sort((c,l)=>c-l);if(o.length===0)return[];const i=1.45/o[Math.floor((o.length-1)*.9)]*n,a=[];for(const c of r){const l=e.instanceToAtom[c],u=l*3,d=new N(t[u],t[u+1],t[u+2]),f=d.length();if(!Number.isFinite(f)||f<=1e-12)continue;ju(d.normalize(),e);const g=t0(e,c),h=f*i,b=Math.min(.24,Math.max(.075,h*.24),h*.5),w=(e.radii[l]??.3)*1.03;a.push({tail:g.clone().addScaledVector(d,w),tip:g.clone().addScaledVector(d,w+h),head:b})}return a}function Xy(e,t,n,r){for(const o of n.trails.slice(0,vd)){const s=$d(t,o);if(s.length===0)continue;const i=e.addShape({color:r.trail,opacity:.76});for(let a=0;ao.has(S)&&o.has(v)),i={positions:t.positions,atomicNumbers:t.atomicNumbers,bonds:s,basis:t.basis,pbc:t.pbc},a=t.visibleAtoms.length>24?8:64,c=bd(i),l=Cs(i,{centerAtomicNumbers:c}),u=gd(i,{images:t.images,maxCenters:a,centerAtomicNumbers:c,containedInCell:r,cellCenter:t.cellCenter,colorForCenter:(S,v)=>n===ao?n.polyhedron:Hd(v)??n.polyhedron},l);if(!u)return 0;u.computeVertexNormals();const d=u.getAttribute("position"),f=u.getAttribute("normal"),g=Array.from({length:d.count},(S,v)=>({x:d.getX(v),y:d.getY(v),z:d.getZ(v)})),h=f?Array.from({length:f.count},(S,v)=>({x:f.getX(v),y:f.getY(v),z:f.getZ(v)})):void 0,b=u.getAttribute("color"),w=Array.from({length:b.count},(S,v)=>`rgb(${Math.round(b.getX(v)*255)}, ${Math.round(b.getY(v)*255)}, ${Math.round(b.getZ(v)*255)})`);e.addCustom({vertexArr:g,normalArr:h,faceArr:Array.from({length:d.count},(S,v)=>v),color:w,opacity:.38});const M=u.userData.edgePositions;if(M instanceof Float32Array){const S=e.addShape({color:n.polyhedronEdge,opacity:.42});for(let v=0;v{if(s>=zy)return;const c=e.plan.selections[a];r.has(bs(c))&&(o.addSphere({center:{x:i.x,y:i.y,z:i.z},radius:Math.max(.3,(e.scene.radii[c.atom]??.3)*1.35),color:n==="light"?io.selection:ao.selection,wireframe:!0,opacity:.82,quality:2}),s+=1)}),e.selectionShape=o}function Zy(e,t,n){if(e.keyboardShape&&(e.viewer.removeShape(e.keyboardShape),e.keyboardShape=null),!e.scene||!e.plan||!t)return;const r=e.plan.selections.findIndex(i=>bs(i)===bs(t));if(r<0)return;const o=e.plan.atoms[r],s=n==="light"?io.keyboard:ao.keyboard;e.keyboardShape=e.viewer.addSphere({center:{x:o.x,y:o.y,z:o.z},radius:Math.max(.34,(e.scene.radii[t.atom]??.3)*1.58),color:s,wireframe:!0,opacity:.94,quality:2})}function Jy(e,t,n,r,o){const s=e.getView();e.setView([s[0],s[1],s[2],s[3],0,0,0,1]),e.zoomTo(),t==="perspective"?(e.setProjection("perspective"),e.rotate(24,"x"),e.rotate(-32,"y")):(e.setProjection("orthographic"),t==="xz"&&e.rotate(90,"x"),t==="yz"&&e.rotate(-90,"y")),e.zoom(Kd(n,r,o))}function Kd(e,t,n){return(e?.9:t==="ribbon"?.98:.76)*Math.min(1,Math.max(.35,n))}function e0(e){if(!e)throw new Error("The molecular scene is not ready");const t=e.getView(),n=new N(-t[0],-t[1],-t[2]),o=new ya(t[4],t[5],t[6],t[7]).normalize().clone().invert(),s=e.getPerceivedDistance(),i=new N(0,0,s).applyQuaternion(o).add(n),a=new N(0,1,0).applyQuaternion(o).normalize();return{position:i.toArray(),target:n.toArray(),up:a.toArray(),fov:20,zoom:1,near:1,far:800}}function Rl(e,t){if(!e)throw new Error("The molecular scene is not ready");if([...t.position,...t.target,...t.up,t.fov,t.zoom,t.near,t.far].some(c=>!Number.isFinite(c)))throw new Error("The saved camera is invalid");const r=new N().fromArray(t.position),o=new N().fromArray(t.target),s=new N().fromArray(t.up).normalize(),a=new ya().setFromRotationMatrix(new Xo().lookAt(r,o,s)).invert();e.setView([-o.x,-o.y,-o.z,e.getView()[3],a.x,a.y,a.z,a.w]),e.setPerceivedDistance(r.distanceTo(o)),e.render()}function t0(e,t){const n=e.instanceToAtom[t],r=new N().fromArray(e.positions,n*3);if(!e.basis)return r;const o=t*3;return r.addScaledVector(e.basis.vectors[0],e.instanceImages[o]).addScaledVector(e.basis.vectors[1],e.instanceImages[o+1]).addScaledVector(e.basis.vectors[2],e.instanceImages[o+2])}function bs(e){return`${e.atom}:${e.image[0]}:${e.image[1]}:${e.image[2]}`}function it(e){return{x:e.x,y:e.y,z:e.z}}function n0(e){return new URLSearchParams(typeof window>"u"?"":window.location.search).get("renderer")==="three"?"three":"3dmol"}const r0=x.forwardRef(function(t,n){const r=n0(),[o,s]=x.useState(!1),[i,a]=x.useState(null),[c,l]=x.useState(0),u=x.useRef(null),d=x.useRef(null),f=x.useRef(null),g=x.useRef(0),h=o?"three":r;f.current=i;const b=x.useCallback((w,M)=>{if(h==="three"){const v=u.current;return v?w==="png"?v.exportPng(M):v.exportFigure(M):Promise.reject(new Error("The molecular scene is not ready"))}if(t.presentation.mode==="surface")return Promise.reject(new Error("Surface figures are not available in the publication renderer. Choose another preset."));if(f.current)return Promise.reject(new Error("A figure export is already in progress"));const k=u.current;if(!k)return Promise.reject(new Error("The molecular scene is not ready"));let S;try{S=k.captureCamera()}catch(v){return Promise.reject(v instanceof Error?v:new Error("The molecular scene is not ready"))}return new Promise((v,j)=>{const E=++g.current,D=window.setTimeout(()=>{const R=f.current;!R||R.id!==E||(R.reject(new Error("The publication renderer did not become ready")),f.current=null,a(null))},6e4),U={id:E,kind:w,options:M,camera:S,resolve:v,reject:j,started:!1,timeout:D};f.current=U,a(U)})},[h,t.presentation.mode]);return x.useImperativeHandle(n,()=>({exportPng:w=>b("png",w),exportFigure:w=>b("figure",w),captureCamera:()=>{const w=u.current;if(!w)throw new Error("The molecular scene is not ready");return w.captureCamera()},restoreCamera:w=>{const M=u.current;if(!M)throw new Error("The molecular scene is not ready");M.restoreCamera(w)}}),[b]),x.useEffect(()=>{const w=f.current,M=d.current;if(!w||!M||w.started||c!==w.id)return;w.started=!0;try{M.restoreCamera(w.camera)}catch(S){window.clearTimeout(w.timeout),w.reject(S instanceof Error?S:new Error("The publication camera could not be restored")),f.current=null,a(null);return}(w.kind==="png"?M.exportPng(w.options):M.exportFigure(w.options)).then(w.resolve,S=>{w.reject(S instanceof Error?S:new Error("Figure export failed"))}).finally(()=>{window.clearTimeout(w.timeout),f.current?.id===w.id&&(f.current=null,a(null))})},[c]),x.useEffect(()=>()=>{const w=f.current;w&&(window.clearTimeout(w.timeout),w.reject(new Error("Figure export was cancelled")))},[]),m.jsxs(m.Fragment,{children:[h==="3dmol"?m.jsx(Uy,{...t,ref:u,onEngineError:()=>s(!0)}):m.jsx(xl,{...t,ref:u}),i&&h==="3dmol"&&m.jsx("div",{className:"publication-renderer-source","data-testid":"publication-renderer-source","aria-hidden":"true",children:m.jsx(xl,{...t,ref:d,onSelect:()=>{},onSelectMany:()=>{},onSceneInfo:w=>{w&&l(i.id)},onSelectionContext:()=>{},onSelectionPositions:()=>{}})})]})}),Gd=1e4;function o0({open:e,frameCount:t,options:n,defaultReferenceId:r,initialView:o,onRun:s,onClose:i}){const a=Lo(n,r)??n[0],c=n.find(I=>I.id!==a?.id)??a,[l,u]=x.useState(a?.id??""),[d,f]=x.useState(c?.id??""),[g,h]=x.useState("all"),[b,w]=x.useState("200"),[M,k]=x.useState(""),S=x.useRef(null);x.useEffect(()=>{if(!e)return;const I=Lo(n,r)??n[0],Y=n.find(L=>L.id!==I?.id)??I;u(I?.id??""),f(Y?.id??""),h("all"),w("200"),k("")},[r,e,n]),x.useEffect(()=>{if(!e)return;const I=requestAnimationFrame(()=>S.current?.focus());return()=>cancelAnimationFrame(I)},[e]);const v=Math.max(1,Math.ceil(t/Gd)),j=Math.ceil(t/v),E=x.useMemo(()=>[{value:"all",label:v===1?`All · ${t.toLocaleString()}`:`All · ${j.toLocaleString()} sampled`},...t>100?[{value:"last-100",label:"Last 100"}]:[],...t>1e3?[{value:"last-1000",label:"Last 1,000"}]:[]],[v,t,j]);if(!e)return null;const D=Lo(n,l),U=Lo(n,d),R=Number(b),T=M.trim()?Number(M):void 0,O=!!(D&&U&&Number.isSafeInteger(R)&&R>=20&&R<=2e3&&(T===void 0||Number.isFinite(T)&&T>0)),F=()=>{!O||!D||!U||s(s0({reference:D,target:U,frames:g,frameCount:t,bins:R,rMax:T,initialView:o}))};return m.jsxs("section",{className:"rdf-sheet",role:"dialog","aria-labelledby":"rdf-sheet-title",onKeyDown:I=>{I.key==="Escape"&&(I.preventDefault(),i())},children:[m.jsxs("header",{children:[m.jsx("strong",{id:"rdf-sheet-title",children:"Pair analysis"}),m.jsx("button",{type:"button",onClick:i,"aria-label":"Close",children:"×"})]}),m.jsxs("div",{className:"rdf-sheet__body",children:[m.jsxs("label",{children:[m.jsx("span",{children:"From"}),m.jsx("select",{ref:S,value:l,onChange:I=>u(I.target.value),children:n.map(I=>m.jsxs("option",{value:I.id,children:[I.label," · ",I.atomIndices.length.toLocaleString()]},I.id))})]}),m.jsxs("label",{children:[m.jsx("span",{children:"To"}),m.jsx("select",{value:d,onChange:I=>f(I.target.value),children:n.map(I=>m.jsxs("option",{value:I.id,children:[I.label," · ",I.atomIndices.length.toLocaleString()]},I.id))})]}),m.jsxs("label",{children:[m.jsx("span",{children:"Frames"}),m.jsx("select",{value:g,onChange:I=>h(I.target.value),children:E.map(I=>m.jsx("option",{value:I.value,children:I.label},I.value))})]}),m.jsxs("details",{children:[m.jsx("summary",{children:"Advanced"}),m.jsxs("div",{children:[m.jsxs("label",{children:[m.jsx("span",{children:"Bins"}),m.jsx("input",{inputMode:"numeric",value:b,onChange:I=>w(I.target.value)})]}),m.jsxs("label",{children:[m.jsx("span",{children:"r max · Å"}),m.jsx("input",{inputMode:"decimal",value:M,placeholder:"Automatic",onChange:I=>k(I.target.value)})]})]})]})]}),m.jsxs("footer",{children:[m.jsx("span",{children:"PQAnalysis · full periodic cells"}),m.jsx("button",{type:"button",disabled:!O,onClick:F,children:"Run"})]})]})}function s0({reference:e,target:t,frames:n,frameCount:r,bins:o,rMax:s,initialView:i}){const a=n==="last-100"?100:n==="last-1000"?1e3:r,c=n==="all"?Math.max(1,Math.ceil(r/Gd)):1;return{reference:e,target:t,frameStart:Math.max(0,r-a),frameStop:r,frameStep:c,bins:o,rMax:s,initialView:i}}function Lo(e,t){return t?e.find(n=>n.id===t):void 0}function i0(e){return a0(e)?{commands:"⌘K",open:"⌘O",export:"⌘⇧S"}:{commands:"Ctrl K",open:"Ctrl O",export:"Ctrl Shift S"}}function a0(e){return/mac|iphone|ipad|ipod/i.test(e)}function c0(e){return e==="true"}function l0(e,t,n){return n<=0?0:Math.max(0,Math.min(n-1,e+t))}function u0(e,t){return e==="g"?t==="g"?{action:"first-frame",prefix:null}:{action:null,prefix:"g"}:e==="G"?{action:"last-frame",prefix:null}:e==="l"?{action:"next-frame",prefix:null}:e==="L"?{action:"next-ten-frames",prefix:null}:e==="h"?{action:"previous-frame",prefix:null}:e==="H"?{action:"previous-ten-frames",prefix:null}:e===":"?{action:"commands",prefix:null}:{action:null,prefix:null}}const Wd=(...e)=>e.filter((t,n,r)=>!!t&&t.trim()!==""&&r.indexOf(t)===n).join(" ").trim();const d0=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase();const m0=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(t,n,r)=>r?r.toUpperCase():n.toLowerCase());const Tl=e=>{const t=m0(e);return t.charAt(0).toUpperCase()+t.slice(1)};var ji={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};const f0=e=>{for(const t in e)if(t.startsWith("aria-")||t==="role"||t==="title")return!0;return!1},h0=x.createContext({}),p0=()=>x.useContext(h0),g0=x.forwardRef(({color:e,size:t,strokeWidth:n,absoluteStrokeWidth:r,className:o="",children:s,iconNode:i,...a},c)=>{const{size:l=24,strokeWidth:u=2,absoluteStrokeWidth:d=!1,color:f="currentColor",className:g=""}=p0()??{},h=r??d?Number(n??u)*24/Number(t??l):n??u;return x.createElement("svg",{ref:c,...ji,width:t??l??ji.width,height:t??l??ji.height,stroke:e??f,strokeWidth:h,className:Wd("lucide",g,o),...!s&&!f0(a)&&{"aria-hidden":"true"},...a},[...i.map(([b,w])=>x.createElement(b,w)),...Array.isArray(s)?s:[s]])});const pt=(e,t)=>{const n=x.forwardRef(({className:r,...o},s)=>x.createElement(g0,{ref:s,iconNode:t,className:Wd(`lucide-${d0(Tl(e))}`,`lucide-${e}`,r),...o}));return n.displayName=Tl(e),n};const b0=[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]],y0=pt("chevron-left",b0);const x0=[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]],w0=pt("chevron-right",x0);const A0=[["circle",{cx:"12",cy:"12",r:"1",key:"41hilf"}],["circle",{cx:"19",cy:"12",r:"1",key:"1wjl8i"}],["circle",{cx:"5",cy:"12",r:"1",key:"1pcz8c"}]],S0=pt("ellipsis",A0);const v0=[["path",{d:"m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2",key:"usdka0"}]],M0=pt("folder-open",v0);const k0=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2",key:"1m3agn"}],["circle",{cx:"9",cy:"9",r:"2",key:"af1f0g"}],["path",{d:"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21",key:"1xmnt7"}]],C0=pt("image",k0);const j0=[["rect",{x:"14",y:"3",width:"5",height:"18",rx:"1",key:"kaeet6"}],["rect",{x:"5",y:"3",width:"5",height:"18",rx:"1",key:"1wsw3u"}]],N0=pt("pause",j0);const E0=[["path",{d:"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z",key:"10ikf1"}]],I0=pt("play",E0);const F0=[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}]],$0=pt("rotate-ccw",F0);const _0=[["path",{d:"m21 21-4.34-4.34",key:"14j7rj"}],["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}]],R0=pt("search",_0);const T0=[["path",{d:"M17.971 4.285A2 2 0 0 1 21 6v12a2 2 0 0 1-3.029 1.715l-9.997-5.998a2 2 0 0 1-.003-3.432z",key:"15892j"}],["path",{d:"M3 20V4",key:"1ptbpl"}]],P0=pt("skip-back",T0);const D0=[["path",{d:"M21 4v16",key:"7j8fe9"}],["path",{d:"M6.029 4.285A2 2 0 0 0 3 6v12a2 2 0 0 0 3.029 1.715l9.997-5.998a2 2 0 0 0 .003-3.432z",key:"zs4d6"}]],L0=pt("skip-forward",D0);const O0=[["path",{d:"M10 5H3",key:"1qgfaw"}],["path",{d:"M12 19H3",key:"yhmn1j"}],["path",{d:"M14 3v4",key:"1sua03"}],["path",{d:"M16 17v4",key:"1q0r14"}],["path",{d:"M21 12h-9",key:"1o4lsq"}],["path",{d:"M21 19h-5",key:"1rlt1p"}],["path",{d:"M21 5h-7",key:"1oszz2"}],["path",{d:"M8 10v4",key:"tgpxqk"}],["path",{d:"M8 12H3",key:"a7s4jb"}]],B0=pt("sliders-horizontal",O0);const z0=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],V0=pt("x",z0),U0={back:y0,close:V0,first:P0,folder:M0,image:C0,last:L0,more:S0,next:w0,pause:N0,play:I0,retry:$0,search:R0,sliders:B0};function $e({name:e}){const t=U0[e];return m.jsx(t,{className:"icon","aria-hidden":"true",strokeWidth:1.7})}const Es=["positions","position","coordinates","coords"],Xd=["cell","cell_vectors","box"];function Is(e){const t=fe(e,[...Xd]);return!t||t.length<9?null:[t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8]]}function Pl(e){Yd(e);const t=Ni(e,0),n=Ni(e,3),r=Ni(e,6);return{a:t,b:n,c:r,alpha:Ei(e,3,6,n,r),beta:Ei(e,0,6,t,r),gamma:Ei(e,0,3,t,n)}}function q0(e){const{a:t,b:n,c:r,alpha:o,beta:s,gamma:i}=e;for(const[h,b]of Object.entries({a:t,b:n,c:r}))if(!Number.isFinite(b)||b<=0)throw new Error(`${h} must be greater than zero`);for(const[h,b]of Object.entries({alpha:o,beta:s,gamma:i}))if(!Number.isFinite(b)||b<=0||b>=180)throw new Error(`${h} must be between 0° and 180°`);const a=$i(o),c=$i(s),l=$i(i),u=Math.sin(l);if(Math.abs(u)<1e-8)throw new Error("γ produces a singular cell");const d=r*Math.cos(c),f=r*(Math.cos(a)-Math.cos(c)*Math.cos(l))/u,g=r*r-d*d-f*f;if(g<=1e-10)throw new Error("Cell angles produce zero volume");return Ja([t,0,0,n*Math.cos(l),n*u,0,d,f,Math.sqrt(g)])}function Ja(e){Yd(e);const t=[...e.slice(0,9)],n=Qd(t);if(!Number.isFinite(n)||Math.abs(n)<1e-8)throw new Error("Cell vectors must define a non-zero volume");return t}function H0(e,t=6){const n=fe(e,[...Es]);if(!n||n.length<3)return[10,0,0,0,10,0,0,0,10];const r=[0,0,0];for(let s=0;s+2Math.max(4,s*2+t));return[o[0],0,0,0,o[1],0,0,0,o[2]]}function K0(e,t,n){if(!Number.isInteger(t)||t<0)throw new Error("Atom index is invalid");if(n.length<3||n.some(i=>!Number.isFinite(i)))throw new Error("Atom coordinates must be finite numbers");const r=tc(e,Es);if(!r||t*3+2>=r.array.length)throw new Error("Atom coordinates are unavailable");const o=ec(e),s=new Float32Array(r.array);return s.set(n.slice(0,3),t*3),o.arrays.set(r.name,s),o}function G0(e,t,n,r){const o=Ja(t);if(n.length<3)throw new Error("Periodic axes are invalid");const s=Is(e);let i=ec(e);const a=tc(e,Xd),c=a?.name??"cell";return i.arrays.set(c,new Float32Array(o)),i.header.pbc=[!!n[0],!!n[1],!!n[2]],a||(i.header.arrays=[...i.header.arrays,{name:c,dtype:"float32",shape:[3,3],byte_offset:0,byte_length:9*Float32Array.BYTES_PER_ELEMENT,unit:"angstrom"}]),r&&s&&(i=Y0(i,s,o)),i}function W0(e,t,n){if(!Number.isInteger(t)||t<0||t>=e.topology.atom_count)throw new Error("Atom index is invalid");const r=la(n);if(r===null)throw new Error(`Unknown element “${n.trim()}”`);const o=Array.from({length:e.topology.atom_count},(i,a)=>e.topology.atomic_numbers?.[a]??la(e.topology.symbols?.[a]??"")??0),s=Array.from({length:e.topology.atom_count},(i,a)=>e.topology.symbols?.[a]??Ve[o[a]]??"X");return o[t]=r,s[t]=Ve[r],{...e,topology:{...e.topology,atomic_numbers:o,symbols:s}}}function X0(e,t){const n=fe(t,[...Es]);if(!n||n.lengtha?"T":"F").join(" ")}"`].filter(Boolean).join(" "),i=Array.from({length:e.topology.atom_count},(a,c)=>{const l=e.topology.atomic_numbers?.[c]??0,u=e.topology.symbols?.[c]??Ve[l]??"X",d=c*3;return`${u} ${Oo(n[d])} ${Oo(n[d+1])} ${Oo(n[d+2])}`});return`${e.topology.atom_count} + // color space`);if(o===r||!o.includes("publicationCoverage"))throw new Error("Publication output shader is incompatible");e.material.fragmentShader=o,e.material.uniforms.publicationTransparent={value:t.kind==="transparent"?1:0},e.material.uniforms.publicationBackground={value:new Fe(t.kind==="solid"?t.color:"#000000")},e.material.needsUpdate=!0}function Nb(e){e.root.traverse(t=>{t instanceof Oe&&t.dispose()}),e.resources.geometries.forEach(t=>t.dispose()),e.resources.materials.forEach(t=>t.dispose()),e.resources.textures.forEach(t=>t.dispose())}function Eb(e){for(let t=0;t<16&&e.getError()!==e.NO_ERROR;t+=1);}function Ib(e,t){return e===t.OUT_OF_MEMORY?"the GPU could not allocate the requested image":e===t.INVALID_VALUE?"the requested image dimensions are unsupported":e===t.INVALID_FRAMEBUFFER_OPERATION?"the export framebuffer is incomplete":`WebGL error 0x${e.toString(16)}`}function Fb(e,t){e.scene.background instanceof Fe&&e.scene.background.set(t.background),e.renderer.toneMappingExposure=t.exposure,e.hemisphere.color.set(t.hemisphereSky),e.hemisphere.groundColor.set(t.hemisphereGround),e.hemisphere.intensity=t.hemisphereIntensity,e.key.color.set(t.key),e.key.intensity=t.keyIntensity,e.rim.color.set(t.rim),e.rim.intensity=t.rimIntensity,e.selectionMaterial.color.set(t.selection),e.selectionMaterial.opacity=t.selectionOpacity,e.selectionPointsMaterial.color.set(t.selection),e.keyboardFocusMaterial.color.set(t.selection)}function $b(e,t,n,r,o,s){const i=e.atomObject?.userData.instanceToAtom instanceof Uint32Array?e.atomObject.userData.instanceToAtom:n.instanceToAtom;if(e.atomObject instanceof Nn){const a=e.atomObject.geometry.getAttribute("color");for(let c=0;cKr(a,s.force)),e.velocities?.children.forEach(a=>Kr(a,s.velocity)),e.ribbon&&Fd(e.ribbon.geometry,t,n,r,o,s),e.polyhedra&&_b(e.polyhedra,t,n,r,o,s)}function Fd(e,t,n,r,o,s){const i=e.getAttribute("color"),a=e.getAttribute("atomIndex"),c=e.getAttribute("secondaryStructure"),l=e.getAttribute("secondaryStructureWeights");if(!(i instanceof Se)||!(a instanceof Se))return;const u=new Fe(s.ribbon),d=o==="light"?[new Fe("#3f7f82"),new Fe("#bc6070"),new Fe("#c4903d")]:[new Fe("#77b8b8"),new Fe("#e28b98"),new Fe("#e1bd70")],f=new Fe;for(let g=0;g{if(i.userData.polyhedronEdges===!0){Kr(i,s.bond);return}if(!(i instanceof Ar))return;const a=i.geometry.getAttribute("color"),c=i.geometry.getAttribute("centerAtomIndex");if(!(!(a instanceof Se)||!(c instanceof Se))){for(let l=0;l{const o=r.material;(Array.isArray(o)?o:o?[o]:[]).forEach(i=>{"color"in i&&i.color instanceof Fe&&i.color.set(t),n!==void 0&&"opacity"in i&&(i.opacity=n)})})}function Rb(e){for(const t of[e.atomObject,e.bonds,e.cell,e.forces,e.velocities,e.ribbon,e.polyhedra])t&&(e.root.remove(t),ps(t));e.atomObject=null,e.bonds=null,e.cell=null,e.forces=null,e.velocities=null,e.ribbon=null,e.polyhedra=null,e.ribbonSelections.clear(),e.pickables=[]}function Tb(e,t,n,r){for(;e.children.length>0;){const l=e.children[e.children.length-1];e.remove(l),ps(l)}if(!t)return;const o=ms[r],s=new Fe(o.background),i=new Fe(o.selection);for(const l of n.trails.slice(0,vd)){const u=$d(t,l);if(u.length===0)continue;const d=u.length/6,f=new Float32Array(d*6);for(let b=0;bPb(t,l)).filter(l=>l!==null),c=Db(a,o.displacement);c&&(c.name="reference-displacements",e.add(c))}function $d(e,t){if(!Number.isSafeInteger(t.atom)||t.atom<0||t.atom>=e.count||t.image.length!==3||!t.image.every(Number.isInteger)||t.points.length<6||t.points.length%3!==0)return new Float32Array;const n=Math.min(ob,Math.floor(t.points.length/3)),r=Math.floor(t.points.length/3)-n,o=t.points.length-3,s=new N().fromArray(t.points,o);if(![s.x,s.y,s.z].every(Number.isFinite))return new Float32Array;const i=qa(e,t.atom,t.image);if(!i)return new Float32Array;const a=[],c=new N;for(let u=r;u=e.count||n.length!==3||!n.every(Number.isInteger))return null;const r=new N().fromArray(e.positions,t*3);if(!e.basis)return r;const o=t*3,s=[n[0]-(e.baseImages[o]??0),n[1]-(e.baseImages[o+1]??0),n[2]-(e.baseImages[o+2]??0)];return r.add(ht(s,e.basis))}function Pb(e,t){const n=qa(e,t.atom,t.image);if(!n||![...t.from,...t.to].every(Number.isFinite))return null;const r=new N(t.to[0]-t.from[0],t.to[1]-t.from[1],t.to[2]-t.from[2]).applyMatrix3(e.displayTransform),o=r.length();if(!Number.isFinite(o)||o<=1e-10)return null;const s=r.clone().multiplyScalar(1/o),i=Math.min(.22,Math.max(.07,o*.18),o*.45);return{tail:n.clone().sub(r),tip:n,direction:s,head:i}}function Db(e,t){if(e.length===0)return null;const n=new Hn,r=new Oe(new xa(.014,.014,1,8,1,!1),new br({color:t,transparent:!0,opacity:.82,depthWrite:!1}),e.length);r.instanceMatrix.setUsage(Ot),n.add(r);const o=new Oe(new du(1,1,9),new br({color:t,transparent:!0,opacity:.88,depthWrite:!1}),e.length);return o.instanceMatrix.setUsage(Ot),n.add(o),hs(n,[...e]),n}function Lb(e,t,n,r,o,s,i,a,c,l,u){const d=ms[o];if(r.mode==="ribbon"){if(e.ribbon=Pd(t,n,r,o,d),e.ribbon){e.root.add(e.ribbon),e.pickables.push(e.ribbon);const g=e.ribbon.userData.ribbonSelections;g instanceof Map&&(e.ribbonSelections=g)}const f=Dd(t,n);if(f){const g={...r,mode:"ball-stick"};e.atomObject=fs(f,n,g,o,!1,"ball-stick"),e.atomObject&&(e.atomObject.userData.instanceToAtom=f.instanceToAtom,e.atomObject.userData.instanceImages=f.instanceImages,e.root.add(e.atomObject),e.pickables.push(e.atomObject));const h=Wi(f,g,!1);e.bonds=Yr(g,d,h.segments.length>Zo?"lines":"instances",h.segments),e.bonds&&e.root.add(e.bonds)}}else{e.polyhedra=r.mode==="polyhedra"?Rd(t,n,r,o,d,!1,u):null;const f=r.mode==="polyhedra"&&!e.polyhedra;e.atomObject=f?null:fs(t,n,r,o,!1),e.atomObject&&(e.root.add(e.atomObject),e.pickables.push(e.atomObject)),e.bonds=e.polyhedra||f?null:Yr(r,d,l.bondKind,l.bondSegments),e.bonds&&e.root.add(e.bonds),e.polyhedra&&e.root.add(e.polyhedra)}e.cell=r.cell?Hb(t,d):null,e.cell&&e.root.add(e.cell),e.forces=r.forces?kl(t,s,a,d.force,l.forceInstances):null,e.forces&&e.root.add(e.forces),e.velocities=r.velocities?kl(t,i,c,d.velocity,l.velocityInstances):null,e.velocities&&e.root.add(e.velocities)}function Ob(e,t,n,r,o,s,i,a){if(!Bb(e,a))return!1;const c=a.forceInstances.length>0?ca(t,r,s,a.forceInstances):[],l=a.velocityInstances.length>0?ca(t,o,i,a.velocityInstances):[];return c.length!==a.forceInstances.length||l.length!==a.velocityInstances.length?!1:(e.atomObject&&zb(e.atomObject,t),e.bonds&&Vb(e.bonds,a.bondSegments),e.cell&&Ub(e.cell,t),e.forces&&hs(e.forces,c),e.velocities&&hs(e.velocities,l),n.mode!=="ribbon"&&n.mode!=="polyhedra")}function Bb(e,t){if(e.ribbon||e.polyhedra)return!1;if(t.atomKind==="none"){if(e.atomObject)return!1}else if(t.atomKind==="points"){if(!(e.atomObject instanceof Nn)||e.atomObject.geometry.getAttribute("position").count!==t.atomCount)return!1}else if(!(e.atomObject instanceof Oe)||e.atomObject.instanceMatrix.count!==t.atomCount)return!1;if(t.bondKind==="none"){if(e.bonds)return!1}else if(t.bondKind==="lines"){if(!(e.bonds instanceof vr)||e.bonds.geometry.getAttribute("position").count!==t.bondSegments.length*2)return!1}else if(!(e.bonds instanceof Oe)||e.bonds.instanceMatrix.count!==t.bondSegments.length)return!1;if(t.cellLineCount===0){if(e.cell)return!1}else if(!e.cell||e.cell.geometry.getAttribute("position").count!==t.cellLineCount*2)return!1;return Ml(e.forces,t.forceInstances.length)&&Ml(e.velocities,t.velocityInstances.length)}function Ml(e,t){if(t===0)return e===null;const[n,r]=e?.children??[];return n instanceof Oe&&r instanceof Oe&&n.instanceMatrix.count===t&&r.instanceMatrix.count===t}function zb(e,t){const n=new N;if(e instanceof Nn){const o=e.geometry.getAttribute("position");for(let s=0;s{n.setXYZ(s*2,r.x,r.y,r.z),n.setXYZ(s*2+1,o.x,o.y,o.z)}),n.needsUpdate=!0,e.geometry.computeBoundingSphere();return}e instanceof Oe&&_d(e,t)}function Ub(e,t){if(!t.basis)return;const n=[];t.images.forEach(o=>Ha(n,t.basis,o,t.cellCenter));const r=e.geometry.getAttribute("position");r.array.set(n),r.needsUpdate=!0,e.geometry.computeBoundingSphere()}function qb(e){return JSON.stringify([e.mode,e.water,e.hydrogens,e.images.min,e.images.max,e.cell,e.bonds,e.forces,e.velocities,e.atomScale,e.bondScale,e.color,e.quality])}function fs(e,t,n,r,o=!1,s){const i=e.instanceToAtom.length;if(i===0)return null;if(Su(n,i)){const g=new Float32Array(i*3),h=new Float32Array(i*3),b=new N;for(let M=0;M{f.toArray(u,h*6),g.toArray(u,h*6+3)});const d=new fn;return d.setAttribute("position",new Se(u,3).setUsage(Ot)),new vr(d,new ws({color:t.bond,transparent:!0,opacity:t.bondOpacity}))}const s=(e.mode==="licorice"?.14:e.mode==="polyhedra"?.025:.045)*Math.max(.1,e.bondScale),i=o&&r.length<=12e3?16:vu(e,r.length)?12:8,a=new xa(s,s,1,i,1,!1),c=new Sr({color:t.bond,roughness:.56,metalness:.01,transparent:!0,opacity:t.bondOpacity}),l=new Oe(a,c,r.length);return l.instanceMatrix.setUsage(Ot),_d(l,r),l}function _d(e,t){const n=new lo,r=new N;t.forEach(({from:o,to:s},i)=>{r.subVectors(s,o);const a=r.length();n.position.copy(o).add(s).multiplyScalar(.5),n.quaternion.setFromUnitVectors(ia,r.normalize()),n.scale.set(1,a,1),n.updateMatrix(),e.setMatrixAt(i,n.matrix)}),e.instanceMatrix.needsUpdate=!0,e.computeBoundingSphere()}function Hb(e,t){if(!e.basis||e.images.length===0)return null;const n=[];e.images.forEach(o=>Ha(n,e.basis,o,e.cellCenter));const r=new fn;return r.setAttribute("position",new sn(n,3).setUsage(Ot)),new vr(r,new ws({color:t.cell,transparent:!0,opacity:t.cellOpacity}))}function Ha(e,t,n,r){const o=Ca(t,n,r),s=(a,c,l)=>a*4+c*2+l,i=[];for(let a=0;a<=1;a+=1){for(let c=0;c<=1;c+=1)i.push([s(a,c,0),s(a,c,1)]);for(let c=0;c<=1;c+=1)i.push([s(a,0,c),s(a,1,c)])}for(let a=0;a<=1;a+=1)for(let c=0;c<=1;c+=1)i.push([s(0,a,c),s(1,a,c)]);i.forEach(([a,c])=>e.push(...o[a].toArray(),...o[c].toArray()))}function kl(e,t,n,r,o){const s=ca(e,t,n,o);if(s.length===0)return null;const i=new Hn,a=new Oe(new xa(.018,.018,1,8,1,!1),new br({color:r}),s.length);a.instanceMatrix.setUsage(Ot),i.add(a);const c=new Oe(new du(1,1,9),new br({color:r}),s.length);return c.instanceMatrix.setUsage(Ot),i.add(c),hs(i,s),i}function ca(e,t,n,r){if(!t||t.length{const d=e.instanceToAtom[u];return Math.hypot(t[d*3],t[d*3+1],t[d*3+2])}).filter(u=>Number.isFinite(u)&&u>1e-12).sort((u,d)=>u-d);if(o.length===0)return[];const i=1.45/o[Math.floor((o.length-1)*.9)]*n,a=[],c=new N,l=new N;for(const u of r){const d=e.instanceToAtom[u],f=d*3;c.set(t[f],t[f+1],t[f+2]);const g=c.length();ju(c.normalize(),e),Vt(l,e,u);const h=g*i,b=Math.min(Math.min(.24,Math.max(.075,h*.24)),h*.5),w=(e.radii[d]??.3)*1.03;a.push({tail:l.clone().addScaledVector(c,w),tip:l.clone().addScaledVector(c,w+h),direction:c.clone(),head:b})}return a}function hs(e,t){const[n,r]=e.children;if(!(n instanceof Oe)||!(r instanceof Oe))return;const o=new lo,s=new N;t.forEach((i,a)=>{s.copy(i.tip).addScaledVector(i.direction,-i.head*.48),o.position.copy(i.tail).add(s).multiplyScalar(.5),o.quaternion.setFromUnitVectors(ia,i.direction),o.scale.set(1,i.tail.distanceTo(s),1),o.updateMatrix(),n.setMatrixAt(a,o.matrix)}),n.instanceMatrix.needsUpdate=!0,t.forEach((i,a)=>{o.position.copy(i.tip).addScaledVector(i.direction,-i.head*.5),o.quaternion.setFromUnitVectors(ia,i.direction),o.scale.set(i.head*.34,i.head,i.head*.34),o.updateMatrix(),r.setMatrixAt(a,o.matrix)}),r.instanceMatrix.needsUpdate=!0,n.computeBoundingSphere(),n.boundingBox=null,r.computeBoundingSphere(),r.boundingBox=null}function Rd(e,t,n,r,o,s=!1,i,a){const c=i??Ka(e),l=gd(c.input,{images:e.images,maxCenters:c.maxCenters,centerAtomicNumbers:c.centerAtomicNumbers,containedInCell:n.cell,cellCenter:e.cellCenter,colorForCenter:(h,b)=>Et(t,h,b,n.color,r)},c.topology);if(!l)return null;const u=new Hn,d=new Ar(l,new Sr({vertexColors:!0,transparent:!0,opacity:s?.2:r==="light"?.28:.34,depthWrite:!s,roughness:s?.7:.58,metalness:0,flatShading:!0,side:zi,polygonOffset:!0,polygonOffsetFactor:1,polygonOffsetUnits:1}));d.userData.publicationExcludeFromAo=!0,d.renderOrder=1,u.add(d);const f=l.userData.edgePositions instanceof Float32Array?l.userData.edgePositions:new Float32Array;let g;if(s&&a){const{LineMaterial:h,LineSegments2:b,LineSegmentsGeometry:w}=a.constructors,M=new w;M.setPositions(Array.from(f));const k=new h({color:o.bond,linewidth:ke.clamp(1.18*Math.min(a.width/2400,a.height/1800),1,2.8),transparent:!0,opacity:.66,depthWrite:!1,alphaToCoverage:!0}),S=new b(M,k);S.isLine2=!0,S.userData.publicationFitPositions=f,S.frustumCulled=!1,g=S}else{const h=new fn;h.setAttribute("position",new Se(f,3)),h.computeBoundingSphere(),g=new vr(h,new ws({color:o.bond,transparent:!0,opacity:.36,depthWrite:!1}))}return g.userData.polyhedronEdges=!0,g.userData.publicationExcludeFromAo=!0,g.renderOrder=2,u.add(g),u}function Kb(e){const t=Ka(e),n=Cs(t.input,{maxCenters:t.maxCenters,centerAtomicNumbers:t.centerAtomicNumbers});return pd(t.input,{maxCenters:t.maxCenters,centerAtomicNumbers:t.centerAtomicNumbers},n)}function Ka(e){const t=e.visibleAtoms.length===e.count?e.bonds:Gb(e),n=Td(e,t);return{input:n,maxCenters:e.visibleAtoms.length>24?8:64,centerAtomicNumbers:bd(n)}}function Td(e,t){return{positions:e.positions,atomicNumbers:e.atomicNumbers,bonds:t,basis:e.basis,pbc:e.pbc}}function Gb(e){const t=new Set(e.visibleAtoms);return e.bonds.filter(([n,r])=>t.has(n)&&t.has(r))}function Pd(e,t,n,r,o){if(e.backbone.length<3)return null;const s=e.images.map(d=>ht(d,e.basis)),i=Wa(e).map(d=>Xa(e,d)),a=[],c=[];for(const d of i){const f=Ga(d,t);a.push({residues:d,centers:ld(d,f)});const g=Ng(d,{scale:n.atomScale,quality:n.quality,structures:f,translations:s,translationImages:e.images});g&&c.push(g)}const l=c.length===1?c[0]:Qm(c,!1);if(!l)return null;c.length>1&&c.forEach(d=>d.dispose()),Fd(l,t,e,n,r,o);const u=new Ar(l,new Sr({vertexColors:!0,roughness:.62,metalness:0,dithering:!0,side:Ym}));return u.userData.ribbonSelections=Ld(a,e),u}function Ga(e,t){const n=fo(e),r=new Map((t.topology.residues??[]).filter(o=>o.secondary_structure).map(o=>[o.index,o.secondary_structure]));for(let o=0;o[c.index,c])),r=t.topology.atom_residue_index??[],o=e.visibleAtoms.filter(c=>n.get(r[c]??-1)?.category!=="amino-acid");if(o.length===0)return null;const s=new Set(o),i=[],a=[];for(let c=0;cs.has(c)&&s.has(l)),visibleAtoms:o,instanceToAtom:Uint32Array.from(i),instanceImages:Int8Array.from(a),radii:e.atomicNumbers.map(c=>ka(c,"ball-stick",.82)),backbone:[]}}function Wa(e){const t=[];for(const n of e.backbone){const r=n.runIndex??0;for(;t.length<=r;)t.push([]);t[r].push(n)}return t.filter(n=>n.length>=3)}function Xa(e,t){const n=[];for(const r of t){const o=new N().fromArray(e.positions,r.ca*3),s=n.length===0?o:Dt(n[n.length-1].ca,o,e.basis,e.pbc),i=Wb(o,s,e.basis,e.pbc),a=r.ca*3,c=[(e.baseImages[a]??0)+i[0],(e.baseImages[a+1]??0)+i[1],(e.baseImages[a+2]??0)+i[2]],l=Dt(s,new N().fromArray(e.positions,r.n*3),e.basis,e.pbc),u=Dt(s,new N().fromArray(e.positions,r.c*3),e.basis,e.pbc),d=Dt(u,new N().fromArray(e.positions,r.o*3),e.basis,e.pbc);n.push({atomIndex:r.ca,residueIndex:r.residueIndex,image:c,n:l,ca:s,c:u,o:d})}return n}function Wb(e,t,n,r){if(!n)return[0,0,0];const o=t.clone().sub(e);return[r[0]?Math.round(o.dot(n.reciprocal[0])):0,r[1]?Math.round(o.dot(n.reciprocal[1])):0,r[2]?Math.round(o.dot(n.reciprocal[2])):0]}function Ld(e,t){const n=new Map;for(const{residues:r,centers:o}of e)for(let s=0;s{const l=mn(c.atom,c.image);if(i.has(l))return;const u=c.atom*3,d=c.image.map((f,g)=>f-(e.baseImages[u+g]??0));d.some(f=>f<-127||f>127)||(i.add(l),o.push(c.atom),s.push(d[0],d[1],d[2]))};for(const c of t.values())a(c.selection);for(let c=0;c{M>=0&&M{if(!h.has(k)){if(h.add(k),i&&v.toArray(i,S*3),c)v.toArray(c,o*3);else{let j=e.selection.children[o];j||(j=new Ar(e.selectionGeometry,e.selectionMaterial),j.renderOrder=10,e.selection.add(j)),j.position.copy(v),j.scale.setScalar(Math.max(.24,r.radii[M]||.3)*1.35),j.visible=!0}f&&(f[S]=1),o+=1}};for(const[M,k]of e.ribbonSelections??[]){const S=s.get(M);S!==void 0&&b(k.selection.atom,M,S,k.position)}for(let M=0;Mw;)e.selection.remove(e.selection.children[e.selection.children.length-1]);return c?(a.needsUpdate=!0,e.selectionPoints.geometry.setDrawRange(0,o),e.selectionPoints.visible=o>0):(e.selectionPoints.geometry.setDrawRange(0,0),e.selectionPoints.visible=!1),i&&f&&t.length>0&&f.every(M=>M===1)?i:null}function Mi(e,t,n){const r=e.model;if(e.keyboardFocus.visible=!1,!r||!t)return null;const o=e.ribbonSelections.get(mn(t.atom,t.image));if(o)return e.keyboardFocus.position.copy(o.position),e.keyboardFocus.scale.setScalar(Math.max(.24,r.radii[t.atom]||.3)*1.62),e.keyboardFocus.visible=!0,-1;if(n!==null&&so(e.instanceToAtom,e.instanceImages,n,t,e.baseImages))return Cl(e,t,n),n;for(let s=0;s=0?a:0:a>=0?(a+Math.sign(o)+i)%i:o<0?i-1:0,l=Ya(e,t,c,s);return l?{selection:l,instance:c}:null}function so(e,t,n,r,o=new Int32Array){if(!r||!Number.isInteger(n)||n<0||n>=e.length)return!1;const s=n*3,i=e[n]*3;return s+2n.distanceToSquared(new N().fromBufferAttribute(r,u))=0&&Od(c)?{atom:a,image:c}:null}function Ya(e,t,n,r=new Int32Array){if(!Number.isInteger(n)||n<0||n>=e.length)return null;const o=n*3;if(o+2>=t.length)return null;const s=e[n],i=s*3;return{atom:s,image:[(r[i]??0)+t[o],(r[i+1]??0)+t[o+1],(r[i+2]??0)+t[o+2]]}}function Od(e){return e.length===3&&e.every(Number.isInteger)}function mn(e,t){return`${e}:${t[0]}:${t[1]}:${t[2]}`}function Jb(e,t){return!e||!t?e===t:mn(e.atom,e.image)===mn(t.atom,t.image)}function ey(e,t){const n=`${e.topology.symbols?.[t.atom]??"Atom"} ${t.atom+1}`,r=t.image.map((o,s)=>{if(o===0)return"";const i=o>0?"+":"−",a=Math.abs(o)===1?"":Math.abs(o);return`${i}${a}${"abc"[s]}`}).join("");return r?`${n} (${r})`:n}function ty(e,t,n,r){const o=e.model;if(!o||t.width<=0||t.height<=0)return[];const s=Math.max(t.left,Math.min(n.x,r.x)),i=Math.min(t.right,Math.max(n.x,r.x)),a=Math.max(t.top,Math.min(n.y,r.y)),c=Math.min(t.bottom,Math.max(n.y,r.y));if(i<=s||c<=a)return[];e.camera.updateMatrixWorld();const l=new N,u=[],d=new Set,f=(g,h)=>{const b=mn(g.atom,g.image);if(d.has(b)||(l.copy(h),l.project(e.camera),!Number.isFinite(l.x)||!Number.isFinite(l.y)||l.z<-1||l.z>1))return;const w=t.left+(l.x+1)*.5*t.width,M=t.top+(1-l.y)*.5*t.height;wi||Mc||(d.add(b),u.push(g))};for(const g of e.ribbonSelections.values())f(g.selection,g.position);for(let g=0;gcy(s,n.basis,c,n.cellCenter));const i=o.getSize(new N).length(),a=s.getSize(new N).length();Xf(i,a,n.images)&&o.union(s)}return o.isEmpty()?null:o}function jl(e,t){const n=ry(e,t);if(!n)return;Bd(e.controls);const r=t.presentation.mode==="ribbon"&&t.preset==="perspective"&&t.model.images.length===1?oy(t.model,t.manifest):null,o=r?hg(r.positions,r.points.map((S,v)=>v),t.presentation.atomScale,e.camera.aspect,r.points.map(S=>S.faceNormal)):null,s=o?.center??n.getCenter(new N),i=ke.degToRad(e.camera.fov*.5),a=Math.atan(Math.tan(i)*e.camera.aspect),c=Math.min(i,a),{direction:l,up:u}=o??uy(t.preset),d=new N().crossVectors(u,l).normalize(),f=new N().crossVectors(l,d).normalize(),g=.78;let h=1.6/Math.tan(c)*1.08;const b=o&&e.ribbon?e.ribbon.geometry.getAttribute("position"):null,w=new N,M=new N,k=(S,v)=>{M.copy(S).sub(s);const j=M.dot(l);h=Math.max(h,j+(Math.abs(M.dot(d))+v)/(Math.tan(a)*g),j+(Math.abs(M.dot(f))+v)/(Math.tan(i)*g))};if(b)for(let S=0;S{const s=Xa(e,o);return jg(s,Ga(s,t))});if(n.length<3)return null;const r=new Float32Array(n.length*3);return n.forEach((o,s)=>o.center.toArray(r,s*3)),{positions:r,points:n}}function sy(e,t){return{position:e.position.toArray(),target:t.toArray(),up:e.up.toArray(),fov:e.fov,zoom:e.zoom,near:e.near,far:e.far}}function iy(e,t){if([...t.position,...t.target,...t.up,t.fov,t.zoom,t.near,t.far].some(r=>!Number.isFinite(r))||t.fov<=0||t.fov>=180||t.zoom<=0||t.near<=0||t.far<=t.near)throw new Error("The saved camera is invalid");Bd(e.controls),e.camera.position.fromArray(t.position),e.camera.up.fromArray(t.up).normalize(),e.camera.fov=t.fov,e.camera.zoom=t.zoom,e.camera.near=t.near,e.camera.far=t.far,e.controls.target.fromArray(t.target),e.camera.updateProjectionMatrix(),e.controls.update(),e.cameraMode="manual"}function Bd(e){const t=e.enableDamping;e.enableDamping=!1;try{e.update()}finally{e.enableDamping=t}}function ay(e,t){const n=Yf(e.images);return[t.mode,t.wrap,t.cellOrigin.join(","),t.mirror.join(","),t.cell,e.visibleAtoms.length,n.count,n.span.join(",")].join(":")}function cy(e,t,n,r){Ca(t,n,r).forEach(o=>e.expandByPoint(o))}function ly(e){const t=[];for(const n of[e.min.x,e.max.x])for(const r of[e.min.y,e.max.y])for(const o of[e.min.z,e.max.z])t.push(new N(n,r,o));return t}function uy(e){return e==="xy"?{direction:new N(0,0,1),up:new N(0,1,0)}:e==="xz"?{direction:new N(0,1,0),up:new N(0,0,1)}:e==="yz"?{direction:new N(1,0,0),up:new N(0,0,1)}:{direction:new N(1,.68,1.15).normalize(),up:new N(0,1,0)}}function ps(e){const t=new Set,n=new Set;e.traverse(r=>{const o=r;r instanceof Oe&&r.dispose(),o.geometry&&!t.has(o.geometry)&&(t.add(o.geometry),o.geometry.dispose()),(Array.isArray(o.material)?o.material:o.material?[o.material]:[]).forEach(i=>{n.has(i)||(n.add(i),i.dispose())})})}const zd={1:"#f0eee7",2:"#d8f2f2",3:"#b889df",4:"#bed17f",5:"#d4956d",6:"#94a3a7",7:"#5680dd",8:"#df6259",9:"#6cba79",10:"#7bcdd0",11:"#9874ce",12:"#89a86d",13:"#c7b8ae",14:"#d5aa82",15:"#ed9e54",16:"#ead462",17:"#74ca88",18:"#8bdce2",19:"#aa7bdd",20:"#99ba7b",22:"#8294aa",26:"#cf8964",29:"#d19a71",30:"#adb3b7",35:"#b65a4c",38:"#8ead82",53:"#8d61b5"},dy={...zd,1:"#aab5b3",6:"#59656f",7:"#315bb8",8:"#c94138",9:"#318448",15:"#d87924",16:"#c5a51c",17:"#348b4c",22:"#637f9e",38:"#77986d"},Ve=["X","H","He","Li","Be","B","C","N","O","F","Ne","Na","Mg","Al","Si","P","S","Cl","Ar","K","Ca","Sc","Ti","V","Cr","Mn","Fe","Co","Ni","Cu","Zn","Ga","Ge","As","Se","Br","Kr","Rb","Sr","Y","Zr","Nb","Mo","Tc","Ru","Rh","Pd","Ag","Cd","In","Sn","Sb","Te","I","Xe","Cs","Ba","La","Ce","Pr","Nd","Pm","Sm","Eu","Gd","Tb","Dy","Ho","Er","Tm","Yb","Lu","Hf","Ta","W","Re","Os","Ir","Pt","Au","Hg","Tl","Pb","Bi","Po","At","Rn","Fr","Ra","Ac","Th","Pa","U","Np","Pu","Am","Cm","Bk","Cf","Es","Fm","Md","No","Lr","Rf","Db","Sg","Bh","Hs","Mt","Ds","Rg","Cn","Nh","Fl","Mc","Lv","Ts","Og"],my="unknown hydrogen helium lithium beryllium boron carbon nitrogen oxygen fluorine neon sodium magnesium aluminium silicon phosphorus sulfur chlorine argon potassium calcium scandium titanium vanadium chromium manganese iron cobalt nickel copper zinc gallium germanium arsenic selenium bromine krypton rubidium strontium yttrium zirconium niobium molybdenum technetium ruthenium rhodium palladium silver cadmium indium tin antimony tellurium iodine xenon caesium barium lanthanum cerium praseodymium neodymium promethium ",fy="samarium europium gadolinium terbium dysprosium holmium erbium thulium ytterbium lutetium hafnium tantalum tungsten rhenium osmium iridium platinum gold mercury thallium lead bismuth polonium astatine radon francium radium actinium thorium protactinium uranium ",hy="neptunium plutonium americium curium berkelium californium einsteinium fermium ",py="mendelevium nobelium lawrencium rutherfordium dubnium seaborgium bohrium hassium ",gy="meitnerium darmstadtium roentgenium copernicium nihonium flerovium moscovium livermorium tennessine oganesson",gs=(my+fy+hy+py+gy).split(" "),Xn=new Map;for(let e=1;e0&&e[an(l),u])),s=xr(t);if(n==="add"){for(const l of s){const u=an(l);o.has(u)||(o.set(u,r.length),r.push(l))}return r}const i=new Set(s.map(an)),a=r.filter(l=>!i.has(an(l))),c=new Set(r.map(an));for(const l of s)c.has(an(l))||a.push(l);return a}function yy(e,t){return{name:Cy(e),selections:xr(t)}}function Qa(e){const t=new Map;for(const o of e){const s=Ve[o]??"X";t.set(s,(t.get(s)??0)+1)}const n=[...t.keys()];return(t.has("C")?["C",...t.has("H")?["H"]:[],...n.filter(o=>o!=="C"&&o!=="H").sort()]:n.sort()).map(o=>{const s=t.get(o);return`${o}${s===1?"":s}`}).join("")}function xy(e){const t=e.match(/^\s*select\s+within\s+((?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?)\s*(?:a|å|angstroms?)\s+of\s+selection\s*$/i);if(!t)return null;const n=Number(t[1]);return Number.isFinite(n)&&n>0?n:null}function wy(e,t){const n=e.trim();if(!n||t.atomCount<1)return null;const r=n.match(/^(?:#|atom\s+)?(\d+)$/i);if(r){const i=Number(r[1]);return!Number.isInteger(i)||i<1||i>t.atomCount?null:i-1}const o=t.atomNames,s=n.match(/^([A-Za-z][a-z]?)(\d+)$/);if(s&&t.symbolAt){const i=Number(s[2])-1;if(i>=0&&ic.trim().toLowerCase()===i);if(a>=0)return a}return null}function Vd(e){Ud(e);const t=Sy(e),n=new Int32Array(e.count),r=new Uint8Array(e.count);for(let i=0;i0,componentRoots:s,residueIndices:t}}class Ay{context;hasConnectivity;componentRoots;residueIndices;visibleInstances=null;constructor(t,n=Vd(t)){if(Ud(t),n.count!==t.count)throw new RangeError("Selection topology does not match the scene");this.context=t,this.hasConnectivity=n.hasConnectivity,this.componentRoots=n.componentRoots,this.residueIndices=n.residueIndices}selectionAt(t){if(!Number.isInteger(t)||t<0||t>=this.context.instanceToAtom.length)return null;const n=this.context.instanceToAtom[t];if(n>=this.context.count)return null;const r=t*3,o=n*3;return{atom:n,image:[this.context.baseImages[o]+this.context.instanceImages[r],this.context.baseImages[o+1]+this.context.instanceImages[r+1],this.context.baseImages[o+2]+this.context.instanceImages[r+2]]}}displayedPosition(t){if(!ur(t,this.context.count))return null;const n=new Float64Array(3);return ki(n,this.context,t)?[n[0],n[1],n[2]]:null}isVisible(t){return this.instanceFor(t)!==null}selectScope(t,n){if(!ur(t,this.context.count))return[];const r=this.displayImage(t);if(!r||this.instanceFor(t)===null)return[];if(n==="atom")return[Za(t)];const o=t.atom;let s;if(n==="element"){const i=this.context.atomicNumbers[o];s=a=>this.context.atomicNumbers[a]===i}else if(n==="residue"){const i=this.residueIndices[o];if(i<0)return null;s=a=>this.residueIndices[a]===i}else if(n==="component"){if(!this.hasConnectivity)return null;const i=this.componentRoots[o];s=a=>this.componentRoots[a]===i}else if(n==="molecule"){const i=this.residueIndices[o];if(this.hasConnectivity){const a=this.componentRoots[o];s=c=>this.componentRoots[c]===a}else{if(i<0)return null;s=a=>this.residueIndices[a]===i}}else throw new TypeError(`Unknown scientific selection scope: ${String(n)}`);return this.collectVisible((i,a)=>s(i)&&this.instanceHasDisplayImage(a,r))}selectElement(t){const n=la(t);return n===null?[]:this.collectVisible(r=>this.context.atomicNumbers[r]===n)}selectWater(){return this.collectVisible(t=>this.context.waterAtoms.has(t))}withinDistance(t,n){return this.withinDistanceOf([t],n)}withinDistanceOf(t,n){if(!Number.isFinite(n)||n<=0)return[];const r=new Float64Array(3),o=new Map,s=new Set;for(const c of t){if(!ur(c,this.context.count))continue;const l=an(c);if(s.has(l)||(s.add(l),!ki(r,this.context,c)))continue;const u=El(Math.floor(r[0]/n),Math.floor(r[1]/n),Math.floor(r[2]/n)),d=o.get(u);d?d.push(r[0],r[1],r[2]):o.set(u,[r[0],r[1],r[2]])}if(o.size===0)return[];const i=n*n,a=new Float64Array(3);return this.collectVisible((c,l)=>{const u=l*3;if(!qd(a,0,this.context,c,this.context.instanceImages[u],this.context.instanceImages[u+1],this.context.instanceImages[u+2]))return!1;const d=Math.floor(a[0]/n),f=Math.floor(a[1]/n),g=Math.floor(a[2]/n);for(let h=d-1;h<=d+1;h+=1)for(let b=f-1;b<=f+1;b+=1)for(let w=g-1;w<=g+1;w+=1){const M=o.get(El(h,b,w));if(M)for(let k=0;k=this.context.count||!t(s,o))continue;const i=this.selectionAt(o);if(!i)continue;const a=an(i);r.has(a)||(r.add(a),n.push(i))}return n}displayImage(t){if(!ur(t,this.context.count))return null;const n=t.atom*3;return[t.image[0]-this.context.baseImages[n],t.image[1]-this.context.baseImages[n+1],t.image[2]-this.context.baseImages[n+2]]}instanceFor(t){const n=this.displayImage(t);return n?this.ensureVisibleInstances().get(Nl(t.atom,n[0],n[1],n[2]))??null:null}instanceHasDisplayImage(t,n){const r=t*3;return this.context.instanceImages[r]===n[0]&&this.context.instanceImages[r+1]===n[1]&&this.context.instanceImages[r+2]===n[2]}ensureVisibleInstances(){if(this.visibleInstances)return this.visibleInstances;const t=new Map;for(let n=0;n=this.context.count)continue;const o=n*3,s=Nl(r,this.context.instanceImages[o],this.context.instanceImages[o+1],this.context.instanceImages[o+2]);t.has(s)||t.set(s,n)}return this.visibleInstances=t,t}}function Ud(e){if(!Number.isInteger(e.count)||e.count<0)throw new RangeError("Selection context count must be a non-negative integer");if(e.atomicNumbers.length=0&&r<=2147483647&&(t[n]=r)}return t}function ki(e,t,n){const r=n.atom*3;return qd(e,0,t,n.atom,n.image[0]-t.baseImages[r],n.image[1]-t.baseImages[r+1],n.image[2]-t.baseImages[r+2])}function qd(e,t,n,r,o,s,i){const a=r*3;let c=n.positions[a],l=n.positions[a+1],u=n.positions[a+2];if(![c,l,u].every(Number.isFinite))return!1;if(o!==0||s!==0||i!==0){const d=n.cell;if(!d)return!1;c+=o*d[0]+s*d[3]+i*d[6],l+=o*d[1]+s*d[4]+i*d[7],u+=o*d[2]+s*d[5]+i*d[8]}return[c,l,u].every(Number.isFinite)?(e[t]=c,e[t+1]=l,e[t+2]=u,!0):!1}function vy(e,t,n){return Number.isInteger(e)&&Number.isInteger(t)&&e>=0&&t>=0&&e=0&&e.atom80)throw new RangeError("Named selection name is too long");return t}const jy=[[0,1],[0,2],[0,4],[1,3],[1,5],[2,3],[2,6],[3,7],[4,5],[4,6],[5,7],[6,7]],Ny={1:"#F7F7F4",2:"#D8F2F2",3:"#B889DF",4:"#BED17F",5:"#D4956D",6:"#4B5560",7:"#315FBC",8:"#D94A42",9:"#55A65C",10:"#7BCDD0",11:"#9874CE",12:"#89A86D",13:"#C7B8AE",14:"#D5AA82",15:"#DE8D31",16:"#D7B52F",17:"#4C9A59",18:"#8BDCE2",19:"#AA7BDD",20:"#99BA7B",22:"#637F9E",26:"#A76545",29:"#B87333",30:"#6D79A8",35:"#B65A4C",38:"#77986D",53:"#8D61B5"};function Hd(e){return Ny[e]}function Ey(e,t,n){const r=new Map((e.topology.residues??[]).map(d=>[d.index,d])),o=Py(t,e),s=new Map,i=[],a=[];for(let d=0;d(n.wrap==="atom"||n.wrap==="unwrapped")&&Ss(t.positions,d,f,t.basis,t.pbc).some(g=>g!==0)),l=new Set(c.map(([d,f])=>$l(d,f)));if(n.bonds)for(const d of t.images)for(const[f,g]of t.bonds){if(l.has($l(f,g)))continue;const h=s.get(Ci(f,d)),b=s.get(Ci(g,d));h===void 0||b===void 0||(i[h].bonds.push(b),i[h].bondOrder.push(1),i[b].bonds.push(h),i[b].bondOrder.push(1))}const u=Jo(t,n);return{atoms:i,selections:a,bondSegments:u,shapeBondSegments:c.length===0?[]:Jo({...t,bonds:c},n),boundaryBondCount:c.length,cellSegments:n.cell?_y(t):[],collisionSegments:Ry(t),layoutKey:[e.dataset_generation??e.name,t.count,Fl(t.atomicNumbers),t.visibleAtoms.join(","),t.images.map(d=>d.join(",")).join(";"),Fl(t.baseImages),n.water,n.hydrogens?1:0,n.bonds?1:0,n.color,e.topology.residues?.length??0].join("|")}}function Iy(e){const t=e.properties;return![t.pqAtom,t.pqImageA,t.pqImageB,t.pqImageC].every(Number.isInteger)||t.pqAtom<0?null:{atom:t.pqAtom,image:[t.pqImageA,t.pqImageB,t.pqImageC]}}function Fy(e,t){return{count:t.count,atomicNumbers:t.atomicNumbers,positions:t.positions,baseImages:t.baseImages,cell:t.basis?Float64Array.from(t.basis.vectors.flatMap(n=>[n.x,n.y,n.z])):null,bonds:t.bonds,waterAtoms:t.waterAtoms,instanceToAtom:t.instanceToAtom,instanceImages:t.instanceImages,atomResidueIndex:e.topology.atom_residue_index}}function $y(e,t){const n=new Float64Array(t.length*3);for(let r=0;r=e.count)return null;const s=o.atom*3,i=[o.image[0]-(e.baseImages[s]??0),o.image[1]-(e.baseImages[s+1]??0),o.image[2]-(e.baseImages[s+2]??0)],a=ht(i,e.basis);n[r*3]=e.positions[s]+a.x,n[r*3+1]=e.positions[s+1]+a.y,n[r*3+2]=e.positions[s+2]+a.z}return n}function _y(e){if(!e.basis)return[];const t=[];for(const n of e.images){const r=Ca(e.basis,n,e.cellCenter);for(const[o,s]of jy)t.push({from:r[o],to:r[s]})}return t}function Ry(e){if(e.visibleAtoms.length>2e3)return[];const t=new Set(e.bonds.map(([i,a])=>ii.length()):null,s=Float64Array.from(e.atomicNumbers,i=>Qf(i));for(let i=0;if*o[0]+1e-10||Math.abs(j)>f*o[1]+1e-10||Math.abs(E)>f*o[2]+1e-10)continue;const D=new N(e.positions[c],e.positions[c+1],e.positions[c+2]),U=Dt(D,new N(e.positions[d],e.positions[d+1],e.positions[d+2]),e.basis,e.pbc);g=U.x-D.x,h=U.y-D.y,b=U.z-D.z}else g=e.positions[d]-e.positions[c],h=e.positions[d+1]-e.positions[c+1],b=e.positions[d+2]-e.positions[c+2];const w=g*g+h*h+b*b;if(w>.0025&&w=256)break}}if(n.length>=256)break}return n.length===0?[]:e.images.flatMap(i=>{const a=ht(i,e.basis);return n.map(({from:c,to:l})=>({from:c.clone().add(a),to:l.clone().add(a)}))})}function Ty(e){const t=new Float64Array(e.count*3),n=e.basis.reciprocal;for(let r=0;rs.secondary_structure).map(s=>[s.index,s.secondary_structure])),o=new Map;for(const s of e.backbone){const i=s.runIndex??0,a=o.get(i)??[];a.push(s),o.set(i,a)}for(const s of o.values()){if(s.length<3)continue;const i=[];for(const l of s){const u=new N().fromArray(e.positions,l.ca*3),d=i.length===0?u:Dt(i.at(-1).ca,u,e.basis,e.pbc);i.push({atomIndex:l.ca,residueIndex:l.residueIndex,n:Dt(d,new N().fromArray(e.positions,l.n*3),e.basis,e.pbc),ca:d,c:Dt(d,new N().fromArray(e.positions,l.c*3),e.basis,e.pbc),o:new N}),i.at(-1).o=Dt(i.at(-1).c,new N().fromArray(e.positions,l.o*3),e.basis,e.pbc)}const a=fo(i),c=i.map((l,u)=>r.get(l.residueIndex)??a[u]);i.forEach((l,u)=>{n.set(l.residueIndex,{structure:c[u],begin:u===0||c[u-1]!==c[u],end:u===c.length-1||c[u+1]!==c[u]})})}return n}function Dy(e){return e==="helix"?"h":e==="sheet"?"s":"c"}function Ly(e,t,n,r){if(r==="element")return Hd(n)??"#65757A";if(r==="chain"){const o=e.topology.atom_residue_index?.[t],s=e.topology.residues?.find(i=>i.index===o);return Il(Oy(s?.chain_id??"A"))}return Il(e.topology.atom_residue_index?.[t]??t)}function Il(e){const t=(e*.173%1+1)%1;return`#${new Fe().setHSL(t,.42,.43).getHexString()}`}function Oy(e){let t=0;for(let n=0;n>8&255,t=Math.imul(t,16777619);return(t>>>0).toString(36)}function Ci(e,t){return`${e}:${t[0]}:${t[1]}:${t[2]}`}function $l(e,t){return e{const $=v.current;if(!$)return;let y=!1,z=null;return Pn(()=>import("./3dmol-DaMeRkCq.js").then(B=>B._),__vite__mapDeps([2,3])).then(B=>{if(y)return;const ee=B.createViewer($,{backgroundColor:io.background,backgroundAlpha:1,antialias:!0,upscale:!0,cartoonQuality:12,disableFog:!0,minimumZoomToDistance:2.4});ee.setDefaultCartoonQuality(12),ee.setProjection("perspective"),j.current={viewer:ee,model:null,scene:null,plan:null,layoutKey:"",styleKey:"",fitMode:"ball-stick",manifestName:"",fittedKey:"",lastResetSignal:-1,lastViewSignal:-1,selectionShape:null,keyboardShape:null,surfaceVersion:0,pickSerial:0,pointer:{pointerType:"mouse",shiftKey:!1,metaKey:!1,ctrlKey:!1}};let H=$.clientWidth/Math.max(1,$.clientHeight);z=new ResizeObserver(()=>{const ie=$.clientWidth/Math.max(1,$.clientHeight);ee.resize();const _=j.current;_?.plan&&Number.isFinite(H)&&Math.abs(ie-H)>.04&&(ee.zoomTo(),ee.zoom(Kd(_.plan.cellSegments.length>0,_.fitMode,ie))),H=ie,ee.render()}),z.observe($),Y(ie=>ie+1)}).catch(B=>{y||R.current?.(B instanceof Error?B:new Error("3Dmol could not be loaded"))}),()=>{y=!0,z?.disconnect();const B=j.current;j.current=null,B?.viewer.clear(),$.replaceChildren()}},[]),x.useEffect(()=>{const $=j.current,y=v.current;if(!$||!y)return;const z=performance.now(),B=Ma(t,n,o,r);if(!B){$.viewer.clear(),$.model=null,$.scene=null,$.plan=null,$.styleKey="",delete y.dataset.renderedManifest,delete y.dataset.sourceFrameIndex,y.dataset.atomCount="0",y.dataset.renderMs="0",b?.(null),w?.(null);return}const ee=performance.now(),H=Ey(t,B,o),ie=performance.now()-ee,_=$.model!==null&&$.layoutKey===H.layoutKey&&$.plan?.atoms.length===H.atoms.length,Z=[o.mode,o.atomScale,o.bondScale,o.quality].join("|");if(_){const re=H.atoms.map(({x:K,y:J,z:Xe})=>[K,J,Xe]);$.model.setCoordinates([re],"array"),$.model.setFrame(0)}else $.viewer.removeAllModels(),$.model=$.viewer.addModel(),$.model.addAtoms(H.atoms);const pe=$.model;if(!pe)throw new Error("3Dmol model creation failed");$.viewer.removeAllShapes(),$.viewer.removeAllSurfaces(),$.selectionShape=null,$.keyboardShape=null,(!_||$.styleKey!==Z)&&(qy(pe,o,H.atoms.length),$.styleKey=Z),_||pe.setClickable({},!0,(re,K,J)=>{$.pickSerial+=1;const Xe=Iy(re);if(!Xe)return;const Me=J??$.pointer;D.current(Xe,sa(Me))});const G=u==="light"?io:ao,xe=fe(n,["forces","force"]),Ae=fe(n,["velocities","velocity","vel"]),ge=Au(B,o,xe,Ae);$.viewer.setBackgroundColor(G.background,1),Hy($.viewer,H.shapeBondSegments,o,G.bond),Ky($.viewer,H.cellSegments,G.cell),Gy($.viewer,H.collisionSegments,G.collision),_l($.viewer,B,xe,c,ge.forceInstances,G.force),_l($.viewer,B,Ae,l,ge.velocityInstances,G.velocity),Xy($.viewer,B,i,G);const Le=o.mode==="polyhedra"?Yy($.viewer,B,G,o.cell):0;if(o.mode==="surface"&&H.atoms.length<=Vy){const re=++$.surfaceVersion,K=$.viewer.addSurface("VDW",{color:"#BCD4D8",opacity:.26},{},{});Promise.resolve(K).then(()=>{j.current!==$||$.surfaceVersion!==re||$.viewer.render()}).catch(J=>{j.current!==$||$.surfaceVersion!==re||R.current?.(J instanceof Error?J:new Error("Surface generation failed"))})}else $.surfaceVersion+=1;$.scene=B,$.plan=H,$.layoutKey=H.layoutKey,$.fitMode=o.mode,$.manifestName=t.name,w?.(Fy(t,B));const W={imageCount:B.images.length,forceCount:ge.forceInstances.length,forceTotal:ge.forceTotal,velocityCount:ge.velocityInstances.length,velocityTotal:ge.velocityTotal,capabilities:kd(t,n,o,r)};b?.(W);const Q=[t.name,t.topology.atom_count,H.layoutKey,o.mode==="ribbon"?"ribbon":"structure",H.cellSegments.length].join("|");($.fittedKey!==Q||$.lastResetSignal!==a||$.lastViewSignal!==f)&&(Jy($.viewer,d,H.cellSegments.length>0,o.mode,y.clientWidth/Math.max(1,y.clientHeight)),$.fittedKey=Q,$.lastResetSignal=a,$.lastViewSignal=f),$.viewer.render();const de=F.current;de&&(Rl($.viewer,de),F.current=null),y.dataset.renderedManifest=t.name,y.dataset.sourceFrameIndex=String(n?.header.frame_key?.source_index??""),y.dataset.atomCount=String(H.atoms.length),y.dataset.bondCount=String(H.bondSegments.length),y.dataset.boundaryBondCount=String(H.boundaryBondCount),y.dataset.renderedBoundaryBondCount=String(H.shapeBondSegments.length),y.dataset.polyhedronCount=String(Le),y.dataset.cellSegmentCount=String(H.cellSegments.length),y.dataset.collisionCount=String(H.collisionSegments.length),y.dataset.forceCount=String(ge.forceInstances.length),y.dataset.velocityCount=String(ge.velocityInstances.length),y.dataset.planMs=ie.toFixed(1),y.dataset.viewerMs=(performance.now()-ee-ie).toFixed(1),y.dataset.renderMs=(performance.now()-z).toFixed(1)},[u,c,n,t,b,w,r,o,a,I,i,l,d,f]),x.useEffect(()=>{const $=j.current;if(!$?.scene){M?.(null);return}Qy($,s,u),Zy($,ae,u),$.viewer.render(),M?.($y($.scene,s))},[u,n,ae,M,o,s,I]),x.useEffect(()=>{const $=v.current;if(!$)return;let y=null,z=!1,B=!1;const ee=W=>{const Q=$.getBoundingClientRect(),de=Math.max(Q.left,Math.min(Q.right,W.clientX)),re=Math.max(Q.top,Math.min(Q.bottom,W.clientY)),K=Math.min(y.x,de),J=Math.min(y.y,re);return{left:K,top:J,width:Math.abs(de-y.x),height:Math.abs(re-y.y)}},H=()=>{y=null,z=!1,B=!1,ce(null)},ie=W=>{const Q=j.current;Q&&(Q.pointer=W,!(!W.shiftKey||W.button!==0)&&(y={x:W.clientX,y:W.clientY,pointerId:W.pointerId},B=!0,$.setPointerCapture(W.pointerId),W.preventDefault(),W.stopImmediatePropagation()))},_=W=>{if(!B||!y||W.pointerId!==y.pointerId)return;const Q=ee(W);z||=Q.width>4||Q.height>4,ce(Q),W.preventDefault(),W.stopImmediatePropagation()},Z=W=>{const Q=j.current;if(B&&y&&W.pointerId===y.pointerId){if(z&&Q?.plan){const re=ee(W),K=Q.viewer.modelToScreen(Q.plan.atoms),J=[],Xe=new Set;K.forEach((Me,qt)=>{if(Me.xre.left+re.width||Me.yre.top+re.height)return;const Ue=Q.plan.selections[qt],In=`${Ue.atom}:${Ue.image.join(":")}`;Xe.has(In)||(Xe.add(In),J.push(Ue))}),U.current?.(J,!0)}$.hasPointerCapture(W.pointerId)&&$.releasePointerCapture(W.pointerId),H(),W.preventDefault(),W.stopImmediatePropagation();return}if(!Q||W.button!==0)return;const de=Q.pickSerial;window.setTimeout(()=>{j.current===Q&&Q.pickSerial===de&&!sa(W)&&D.current(null,!1)},0)},pe=()=>H(),G=()=>{const W=j.current;if(!W?.scene)return;const Q=Un(W.scene.instanceToAtom,W.scene.instanceImages,E.current.at(-1)??null,null,0,W.scene.baseImages);T.current=Q?.selection??null,O.current=Q?.instance??null,se(Q?.selection??null)},xe=()=>{T.current=null,O.current=null,se(null)},Ae=W=>{const Q=j.current;if(!Q?.scene||W.metaKey||W.ctrlKey||W.altKey)return;const de=W.key==="ArrowDown"?1:W.key==="ArrowUp"?-1:0;if(de!==0){const K=Un(Q.scene.instanceToAtom,Q.scene.instanceImages,T.current,O.current,de,Q.scene.baseImages);T.current=K?.selection??null,O.current=K?.instance??null,se(K?.selection??null),W.preventDefault();return}if(W.key!=="Enter"||W.repeat)return;const re=Un(Q.scene.instanceToAtom,Q.scene.instanceImages,T.current??E.current.at(-1)??null,O.current,0,Q.scene.baseImages);re&&(T.current=re.selection,O.current=re.instance,se(re.selection),D.current(re.selection,!0),W.preventDefault())},ge=W=>{W.key!=="Escape"||!B||(H(),W.preventDefault())},Le=W=>{const Q=j.current;if(!Q)return;const de=Math.max(.5,Math.min(2,Math.exp(-W.deltaY*.001)));Q.viewer.zoom(de),Q.viewer.render(),W.preventDefault(),W.stopImmediatePropagation()};return $.addEventListener("pointerdown",ie,!0),$.addEventListener("pointermove",_,!0),$.addEventListener("pointerup",Z,!0),$.addEventListener("pointercancel",pe,!0),$.addEventListener("focus",G),$.addEventListener("blur",xe),$.addEventListener("keydown",Ae),$.addEventListener("wheel",Le,{capture:!0,passive:!1}),window.addEventListener("keydown",ge),()=>{$.removeEventListener("pointerdown",ie,!0),$.removeEventListener("pointermove",_,!0),$.removeEventListener("pointerup",Z,!0),$.removeEventListener("pointercancel",pe,!0),$.removeEventListener("focus",G),$.removeEventListener("blur",xe),$.removeEventListener("keydown",Ae),$.removeEventListener("wheel",Le,!0),window.removeEventListener("keydown",ge)}},[I]),x.useImperativeHandle(S,()=>({exportPng:async()=>{throw new Error("Publication export is provided by the renderer facade")},exportFigure:async()=>{throw new Error("Publication export is provided by the renderer facade")},captureCamera:()=>e0(j.current?.viewer),restoreCamera:$=>{const y=j.current;if(!y?.plan){F.current=$;return}Rl(y.viewer,$)}}),[I]);const me=ae?`${t.topology.symbols?.[ae.atom]??"Atom"} ${ae.atom+1}`:"";return m.jsxs(m.Fragment,{children:[m.jsx("div",{ref:v,className:L?"molecule-canvas molecule-stage-3dmol is-box-selecting":"molecule-canvas molecule-stage-3dmol","data-renderer":"3dmol","data-representation":o.mode,"data-wrap":o.wrap,role:"region","aria-label":"Molecular structure","aria-description":"Use Up and Down to browse visible atoms. Press Enter to toggle an atom selection. Shift-drag to select a box.","aria-keyshortcuts":"ArrowUp ArrowDown Enter",tabIndex:0}),L&&m.jsx("div",{className:"selection-marquee","data-testid":"selection-marquee",style:L,"aria-hidden":"true"}),m.jsx("span",{className:"sr-only","aria-live":"polite",children:me?`${me}. Press Enter to toggle selection.`:""})]})});function qy(e,t,n){const r=o=>String(o.color??"#65757A");if(e.setStyle({},{}),t.mode==="ribbon"){const o={style:"edged",arrows:!0,tubes:!1,thickness:.42,opacity:1};t.color==="structure"?(e.setStyle({hetflag:!1},{cartoon:{...o,color:"#438493"}}),e.setStyle({hetflag:!1,ss:"h"},{cartoon:{...o,color:"#C96A5A"}}),e.setStyle({hetflag:!1,ss:"s"},{cartoon:{...o,color:"#D2A23A"}})):e.setStyle({hetflag:!1},{cartoon:{...o,colorfunc:r}}),e.setStyle({hetflag:!0},{sphere:{scale:.24,colorfunc:r},stick:{radius:.11,color:"#849190"}},!0);return}if(n>1e5){e.setStyle({},{cross:{scale:Math.max(.25,t.atomScale*.45),colorfunc:r},line:{color:"#849190",opacity:.58}});return}if(t.mode==="lines"){e.setStyle({},{sphere:{radius:Math.max(.055,t.atomScale*.095),colorfunc:r},line:{color:"#879492",opacity:.62}});return}if(t.mode==="spacefill"){e.setStyle({},{sphere:{scale:t.atomScale,colorfunc:r}});return}if(t.mode==="polyhedra"){e.setStyle({},{sphere:{radius:.17*t.atomScale,colorfunc:r}});return}if(t.mode==="licorice"){e.setStyle({},{sphere:{radius:.23*t.atomScale,colorfunc:r},stick:{radius:.19*t.bondScale,color:"#849190"}});return}e.setStyle({},{sphere:{scale:Math.max(.18,t.atomScale*.26),colorfunc:r},stick:{radius:(t.mode==="surface"?.05:.085)*t.bondScale,color:"#849190"}})}function Hy(e,t,n,r){if(t.length===0||n.mode==="spacefill"||n.mode==="ribbon"||n.mode==="polyhedra")return;const o=e.addShape({color:r,opacity:.92});if(n.mode==="lines"||t.length>12e3){for(const i of t)o.addLine({start:it(i.from),end:it(i.to),color:r,opacity:.9});return}const s=n.mode==="licorice"?.19*n.bondScale:(t.length>256?.045:.085)*n.bondScale;for(const i of t)o.addCylinder({start:it(i.from),end:it(i.to),radius:s,color:r,fromCap:"round",toCap:"round"})}function Ky(e,t,n){if(t.length===0)return;const r=e.addShape({color:n,opacity:.62});for(const o of t)r.addCylinder({start:it(o.from),end:it(o.to),radius:.01,color:n,opacity:.62,fromCap:"flat",toCap:"flat"})}function Gy(e,t,n){if(t.length===0)return;const r=e.addShape({color:n,opacity:.9});t.forEach((o,s)=>{r.addDashedCylinder({start:it(o.from),end:it(o.to),radius:.035,dashLength:.11,gapLength:.09,color:n}),s<64&&(r.addSphere({center:it(o.from),radius:.58,color:n,opacity:.72,wireframe:!0}),r.addSphere({center:it(o.to),radius:.58,color:n,opacity:.72,wireframe:!0}))})}function _l(e,t,n,r,o,s){const i=Wy(t,n,r,o);if(i.length===0)return;const a=e.addShape({color:s});for(const c of i)a.addArrow({start:it(c.tail),end:it(c.tip),radius:.025,radiusRatio:Math.max(2.5,c.head/.025),midpos:-c.head,color:s})}function Wy(e,t,n,r){if(!t||t.length{const l=e.instanceToAtom[c];return Math.hypot(t[l*3],t[l*3+1],t[l*3+2])}).filter(c=>Number.isFinite(c)&&c>1e-12).sort((c,l)=>c-l);if(o.length===0)return[];const i=1.45/o[Math.floor((o.length-1)*.9)]*n,a=[];for(const c of r){const l=e.instanceToAtom[c],u=l*3,d=new N(t[u],t[u+1],t[u+2]),f=d.length();if(!Number.isFinite(f)||f<=1e-12)continue;ju(d.normalize(),e);const g=t0(e,c),h=f*i,b=Math.min(.24,Math.max(.075,h*.24),h*.5),w=(e.radii[l]??.3)*1.03;a.push({tail:g.clone().addScaledVector(d,w),tip:g.clone().addScaledVector(d,w+h),head:b})}return a}function Xy(e,t,n,r){for(const o of n.trails.slice(0,vd)){const s=$d(t,o);if(s.length===0)continue;const i=e.addShape({color:r.trail,opacity:.76});for(let a=0;ao.has(S)&&o.has(v)),i={positions:t.positions,atomicNumbers:t.atomicNumbers,bonds:s,basis:t.basis,pbc:t.pbc},a=t.visibleAtoms.length>24?8:64,c=bd(i),l=Cs(i,{centerAtomicNumbers:c}),u=gd(i,{images:t.images,maxCenters:a,centerAtomicNumbers:c,containedInCell:r,cellCenter:t.cellCenter,colorForCenter:(S,v)=>n===ao?n.polyhedron:Hd(v)??n.polyhedron},l);if(!u)return 0;u.computeVertexNormals();const d=u.getAttribute("position"),f=u.getAttribute("normal"),g=Array.from({length:d.count},(S,v)=>({x:d.getX(v),y:d.getY(v),z:d.getZ(v)})),h=f?Array.from({length:f.count},(S,v)=>({x:f.getX(v),y:f.getY(v),z:f.getZ(v)})):void 0,b=u.getAttribute("color"),w=Array.from({length:b.count},(S,v)=>`rgb(${Math.round(b.getX(v)*255)}, ${Math.round(b.getY(v)*255)}, ${Math.round(b.getZ(v)*255)})`);e.addCustom({vertexArr:g,normalArr:h,faceArr:Array.from({length:d.count},(S,v)=>v),color:w,opacity:.38});const M=u.userData.edgePositions;if(M instanceof Float32Array){const S=e.addShape({color:n.polyhedronEdge,opacity:.42});for(let v=0;v{if(s>=zy)return;const c=e.plan.selections[a];r.has(bs(c))&&(o.addSphere({center:{x:i.x,y:i.y,z:i.z},radius:Math.max(.3,(e.scene.radii[c.atom]??.3)*1.35),color:n==="light"?io.selection:ao.selection,wireframe:!0,opacity:.82,quality:2}),s+=1)}),e.selectionShape=o}function Zy(e,t,n){if(e.keyboardShape&&(e.viewer.removeShape(e.keyboardShape),e.keyboardShape=null),!e.scene||!e.plan||!t)return;const r=e.plan.selections.findIndex(i=>bs(i)===bs(t));if(r<0)return;const o=e.plan.atoms[r],s=n==="light"?io.keyboard:ao.keyboard;e.keyboardShape=e.viewer.addSphere({center:{x:o.x,y:o.y,z:o.z},radius:Math.max(.34,(e.scene.radii[t.atom]??.3)*1.58),color:s,wireframe:!0,opacity:.94,quality:2})}function Jy(e,t,n,r,o){const s=e.getView();e.setView([s[0],s[1],s[2],s[3],0,0,0,1]),e.zoomTo(),t==="perspective"?(e.setProjection("perspective"),e.rotate(24,"x"),e.rotate(-32,"y")):(e.setProjection("orthographic"),t==="xz"&&e.rotate(90,"x"),t==="yz"&&e.rotate(-90,"y")),e.zoom(Kd(n,r,o))}function Kd(e,t,n){return(e?.9:t==="ribbon"?.98:.76)*Math.min(1,Math.max(.35,n))}function e0(e){if(!e)throw new Error("The molecular scene is not ready");const t=e.getView(),n=new N(-t[0],-t[1],-t[2]),o=new ya(t[4],t[5],t[6],t[7]).normalize().clone().invert(),s=e.getPerceivedDistance(),i=new N(0,0,s).applyQuaternion(o).add(n),a=new N(0,1,0).applyQuaternion(o).normalize();return{position:i.toArray(),target:n.toArray(),up:a.toArray(),fov:20,zoom:1,near:1,far:800}}function Rl(e,t){if(!e)throw new Error("The molecular scene is not ready");if([...t.position,...t.target,...t.up,t.fov,t.zoom,t.near,t.far].some(c=>!Number.isFinite(c)))throw new Error("The saved camera is invalid");const r=new N().fromArray(t.position),o=new N().fromArray(t.target),s=new N().fromArray(t.up).normalize(),a=new ya().setFromRotationMatrix(new Xo().lookAt(r,o,s)).invert();e.setView([-o.x,-o.y,-o.z,e.getView()[3],a.x,a.y,a.z,a.w]),e.setPerceivedDistance(r.distanceTo(o)),e.render()}function t0(e,t){const n=e.instanceToAtom[t],r=new N().fromArray(e.positions,n*3);if(!e.basis)return r;const o=t*3;return r.addScaledVector(e.basis.vectors[0],e.instanceImages[o]).addScaledVector(e.basis.vectors[1],e.instanceImages[o+1]).addScaledVector(e.basis.vectors[2],e.instanceImages[o+2])}function bs(e){return`${e.atom}:${e.image[0]}:${e.image[1]}:${e.image[2]}`}function it(e){return{x:e.x,y:e.y,z:e.z}}function n0(e){return"3dmol"}const r0=x.forwardRef(function(t,n){const r=n0(),[o,s]=x.useState(!1),[i,a]=x.useState(null),[c,l]=x.useState(0),u=x.useRef(null),d=x.useRef(null),f=x.useRef(null),g=x.useRef(0),h=o?"three":r;f.current=i;const b=x.useCallback((w,M)=>{if(h==="three"){const v=u.current;return v?w==="png"?v.exportPng(M):v.exportFigure(M):Promise.reject(new Error("The molecular scene is not ready"))}if(t.presentation.mode==="surface")return Promise.reject(new Error("Surface figures are not available in the publication renderer. Choose another preset."));if(f.current)return Promise.reject(new Error("A figure export is already in progress"));const k=u.current;if(!k)return Promise.reject(new Error("The molecular scene is not ready"));let S;try{S=k.captureCamera()}catch(v){return Promise.reject(v instanceof Error?v:new Error("The molecular scene is not ready"))}return new Promise((v,j)=>{const E=++g.current,D=window.setTimeout(()=>{const R=f.current;!R||R.id!==E||(R.reject(new Error("The publication renderer did not become ready")),f.current=null,a(null))},6e4),U={id:E,kind:w,options:M,camera:S,resolve:v,reject:j,started:!1,timeout:D};f.current=U,a(U)})},[h,t.presentation.mode]);return x.useImperativeHandle(n,()=>({exportPng:w=>b("png",w),exportFigure:w=>b("figure",w),captureCamera:()=>{const w=u.current;if(!w)throw new Error("The molecular scene is not ready");return w.captureCamera()},restoreCamera:w=>{const M=u.current;if(!M)throw new Error("The molecular scene is not ready");M.restoreCamera(w)}}),[b]),x.useEffect(()=>{const w=f.current,M=d.current;if(!w||!M||w.started||c!==w.id)return;w.started=!0;try{M.restoreCamera(w.camera)}catch(S){window.clearTimeout(w.timeout),w.reject(S instanceof Error?S:new Error("The publication camera could not be restored")),f.current=null,a(null);return}(w.kind==="png"?M.exportPng(w.options):M.exportFigure(w.options)).then(w.resolve,S=>{w.reject(S instanceof Error?S:new Error("Figure export failed"))}).finally(()=>{window.clearTimeout(w.timeout),f.current?.id===w.id&&(f.current=null,a(null))})},[c]),x.useEffect(()=>()=>{const w=f.current;w&&(window.clearTimeout(w.timeout),w.reject(new Error("Figure export was cancelled")))},[]),m.jsxs(m.Fragment,{children:[h==="3dmol"?m.jsx(Uy,{...t,ref:u,onEngineError:()=>s(!0)}):m.jsx(xl,{...t,ref:u}),i&&h==="3dmol"&&m.jsx("div",{className:"publication-renderer-source","data-testid":"publication-renderer-source","aria-hidden":"true",children:m.jsx(xl,{...t,ref:d,onSelect:()=>{},onSelectMany:()=>{},onSceneInfo:w=>{w&&l(i.id)},onSelectionContext:()=>{},onSelectionPositions:()=>{}})})]})}),Gd=1e4;function o0({open:e,frameCount:t,options:n,defaultReferenceId:r,initialView:o,onRun:s,onClose:i}){const a=Lo(n,r)??n[0],c=n.find(I=>I.id!==a?.id)??a,[l,u]=x.useState(a?.id??""),[d,f]=x.useState(c?.id??""),[g,h]=x.useState("all"),[b,w]=x.useState("200"),[M,k]=x.useState(""),S=x.useRef(null);x.useEffect(()=>{if(!e)return;const I=Lo(n,r)??n[0],Y=n.find(L=>L.id!==I?.id)??I;u(I?.id??""),f(Y?.id??""),h("all"),w("200"),k("")},[r,e,n]),x.useEffect(()=>{if(!e)return;const I=requestAnimationFrame(()=>S.current?.focus());return()=>cancelAnimationFrame(I)},[e]);const v=Math.max(1,Math.ceil(t/Gd)),j=Math.ceil(t/v),E=x.useMemo(()=>[{value:"all",label:v===1?`All · ${t.toLocaleString()}`:`All · ${j.toLocaleString()} sampled`},...t>100?[{value:"last-100",label:"Last 100"}]:[],...t>1e3?[{value:"last-1000",label:"Last 1,000"}]:[]],[v,t,j]);if(!e)return null;const D=Lo(n,l),U=Lo(n,d),R=Number(b),T=M.trim()?Number(M):void 0,O=!!(D&&U&&Number.isSafeInteger(R)&&R>=20&&R<=2e3&&(T===void 0||Number.isFinite(T)&&T>0)),F=()=>{!O||!D||!U||s(s0({reference:D,target:U,frames:g,frameCount:t,bins:R,rMax:T,initialView:o}))};return m.jsxs("section",{className:"rdf-sheet",role:"dialog","aria-labelledby":"rdf-sheet-title",onKeyDown:I=>{I.key==="Escape"&&(I.preventDefault(),i())},children:[m.jsxs("header",{children:[m.jsx("strong",{id:"rdf-sheet-title",children:"Pair analysis"}),m.jsx("button",{type:"button",onClick:i,"aria-label":"Close",children:"×"})]}),m.jsxs("div",{className:"rdf-sheet__body",children:[m.jsxs("label",{children:[m.jsx("span",{children:"From"}),m.jsx("select",{ref:S,value:l,onChange:I=>u(I.target.value),children:n.map(I=>m.jsxs("option",{value:I.id,children:[I.label," · ",I.atomIndices.length.toLocaleString()]},I.id))})]}),m.jsxs("label",{children:[m.jsx("span",{children:"To"}),m.jsx("select",{value:d,onChange:I=>f(I.target.value),children:n.map(I=>m.jsxs("option",{value:I.id,children:[I.label," · ",I.atomIndices.length.toLocaleString()]},I.id))})]}),m.jsxs("label",{children:[m.jsx("span",{children:"Frames"}),m.jsx("select",{value:g,onChange:I=>h(I.target.value),children:E.map(I=>m.jsx("option",{value:I.value,children:I.label},I.value))})]}),m.jsxs("details",{children:[m.jsx("summary",{children:"Advanced"}),m.jsxs("div",{children:[m.jsxs("label",{children:[m.jsx("span",{children:"Bins"}),m.jsx("input",{inputMode:"numeric",value:b,onChange:I=>w(I.target.value)})]}),m.jsxs("label",{children:[m.jsx("span",{children:"r max · Å"}),m.jsx("input",{inputMode:"decimal",value:M,placeholder:"Automatic",onChange:I=>k(I.target.value)})]})]})]})]}),m.jsxs("footer",{children:[m.jsx("span",{children:"PQAnalysis · full periodic cells"}),m.jsx("button",{type:"button",disabled:!O,onClick:F,children:"Run"})]})]})}function s0({reference:e,target:t,frames:n,frameCount:r,bins:o,rMax:s,initialView:i}){const a=n==="last-100"?100:n==="last-1000"?1e3:r,c=n==="all"?Math.max(1,Math.ceil(r/Gd)):1;return{reference:e,target:t,frameStart:Math.max(0,r-a),frameStop:r,frameStep:c,bins:o,rMax:s,initialView:i}}function Lo(e,t){return t?e.find(n=>n.id===t):void 0}function i0(e){return a0(e)?{commands:"⌘K",open:"⌘O",export:"⌘⇧S"}:{commands:"Ctrl K",open:"Ctrl O",export:"Ctrl Shift S"}}function a0(e){return/mac|iphone|ipad|ipod/i.test(e)}function c0(e){return e==="true"}function l0(e,t,n){return n<=0?0:Math.max(0,Math.min(n-1,e+t))}function u0(e,t){return e==="g"?t==="g"?{action:"first-frame",prefix:null}:{action:null,prefix:"g"}:e==="G"?{action:"last-frame",prefix:null}:e==="l"?{action:"next-frame",prefix:null}:e==="L"?{action:"next-ten-frames",prefix:null}:e==="h"?{action:"previous-frame",prefix:null}:e==="H"?{action:"previous-ten-frames",prefix:null}:e===":"?{action:"commands",prefix:null}:{action:null,prefix:null}}const Wd=(...e)=>e.filter((t,n,r)=>!!t&&t.trim()!==""&&r.indexOf(t)===n).join(" ").trim();const d0=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase();const m0=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(t,n,r)=>r?r.toUpperCase():n.toLowerCase());const Tl=e=>{const t=m0(e);return t.charAt(0).toUpperCase()+t.slice(1)};var ji={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};const f0=e=>{for(const t in e)if(t.startsWith("aria-")||t==="role"||t==="title")return!0;return!1},h0=x.createContext({}),p0=()=>x.useContext(h0),g0=x.forwardRef(({color:e,size:t,strokeWidth:n,absoluteStrokeWidth:r,className:o="",children:s,iconNode:i,...a},c)=>{const{size:l=24,strokeWidth:u=2,absoluteStrokeWidth:d=!1,color:f="currentColor",className:g=""}=p0()??{},h=r??d?Number(n??u)*24/Number(t??l):n??u;return x.createElement("svg",{ref:c,...ji,width:t??l??ji.width,height:t??l??ji.height,stroke:e??f,strokeWidth:h,className:Wd("lucide",g,o),...!s&&!f0(a)&&{"aria-hidden":"true"},...a},[...i.map(([b,w])=>x.createElement(b,w)),...Array.isArray(s)?s:[s]])});const pt=(e,t)=>{const n=x.forwardRef(({className:r,...o},s)=>x.createElement(g0,{ref:s,iconNode:t,className:Wd(`lucide-${d0(Tl(e))}`,`lucide-${e}`,r),...o}));return n.displayName=Tl(e),n};const b0=[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]],y0=pt("chevron-left",b0);const x0=[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]],w0=pt("chevron-right",x0);const A0=[["circle",{cx:"12",cy:"12",r:"1",key:"41hilf"}],["circle",{cx:"19",cy:"12",r:"1",key:"1wjl8i"}],["circle",{cx:"5",cy:"12",r:"1",key:"1pcz8c"}]],S0=pt("ellipsis",A0);const v0=[["path",{d:"m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2",key:"usdka0"}]],M0=pt("folder-open",v0);const k0=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2",key:"1m3agn"}],["circle",{cx:"9",cy:"9",r:"2",key:"af1f0g"}],["path",{d:"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21",key:"1xmnt7"}]],C0=pt("image",k0);const j0=[["rect",{x:"14",y:"3",width:"5",height:"18",rx:"1",key:"kaeet6"}],["rect",{x:"5",y:"3",width:"5",height:"18",rx:"1",key:"1wsw3u"}]],N0=pt("pause",j0);const E0=[["path",{d:"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z",key:"10ikf1"}]],I0=pt("play",E0);const F0=[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}]],$0=pt("rotate-ccw",F0);const _0=[["path",{d:"m21 21-4.34-4.34",key:"14j7rj"}],["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}]],R0=pt("search",_0);const T0=[["path",{d:"M17.971 4.285A2 2 0 0 1 21 6v12a2 2 0 0 1-3.029 1.715l-9.997-5.998a2 2 0 0 1-.003-3.432z",key:"15892j"}],["path",{d:"M3 20V4",key:"1ptbpl"}]],P0=pt("skip-back",T0);const D0=[["path",{d:"M21 4v16",key:"7j8fe9"}],["path",{d:"M6.029 4.285A2 2 0 0 0 3 6v12a2 2 0 0 0 3.029 1.715l9.997-5.998a2 2 0 0 0 .003-3.432z",key:"zs4d6"}]],L0=pt("skip-forward",D0);const O0=[["path",{d:"M10 5H3",key:"1qgfaw"}],["path",{d:"M12 19H3",key:"yhmn1j"}],["path",{d:"M14 3v4",key:"1sua03"}],["path",{d:"M16 17v4",key:"1q0r14"}],["path",{d:"M21 12h-9",key:"1o4lsq"}],["path",{d:"M21 19h-5",key:"1rlt1p"}],["path",{d:"M21 5h-7",key:"1oszz2"}],["path",{d:"M8 10v4",key:"tgpxqk"}],["path",{d:"M8 12H3",key:"a7s4jb"}]],B0=pt("sliders-horizontal",O0);const z0=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],V0=pt("x",z0),U0={back:y0,close:V0,first:P0,folder:M0,image:C0,last:L0,more:S0,next:w0,pause:N0,play:I0,retry:$0,search:R0,sliders:B0};function $e({name:e}){const t=U0[e];return m.jsx(t,{className:"icon","aria-hidden":"true",strokeWidth:1.7})}const Es=["positions","position","coordinates","coords"],Xd=["cell","cell_vectors","box"];function Is(e){const t=fe(e,[...Xd]);return!t||t.length<9?null:[t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8]]}function Pl(e){Yd(e);const t=Ni(e,0),n=Ni(e,3),r=Ni(e,6);return{a:t,b:n,c:r,alpha:Ei(e,3,6,n,r),beta:Ei(e,0,6,t,r),gamma:Ei(e,0,3,t,n)}}function q0(e){const{a:t,b:n,c:r,alpha:o,beta:s,gamma:i}=e;for(const[h,b]of Object.entries({a:t,b:n,c:r}))if(!Number.isFinite(b)||b<=0)throw new Error(`${h} must be greater than zero`);for(const[h,b]of Object.entries({alpha:o,beta:s,gamma:i}))if(!Number.isFinite(b)||b<=0||b>=180)throw new Error(`${h} must be between 0° and 180°`);const a=$i(o),c=$i(s),l=$i(i),u=Math.sin(l);if(Math.abs(u)<1e-8)throw new Error("γ produces a singular cell");const d=r*Math.cos(c),f=r*(Math.cos(a)-Math.cos(c)*Math.cos(l))/u,g=r*r-d*d-f*f;if(g<=1e-10)throw new Error("Cell angles produce zero volume");return Ja([t,0,0,n*Math.cos(l),n*u,0,d,f,Math.sqrt(g)])}function Ja(e){Yd(e);const t=[...e.slice(0,9)],n=Qd(t);if(!Number.isFinite(n)||Math.abs(n)<1e-8)throw new Error("Cell vectors must define a non-zero volume");return t}function H0(e,t=6){const n=fe(e,[...Es]);if(!n||n.length<3)return[10,0,0,0,10,0,0,0,10];const r=[0,0,0];for(let s=0;s+2Math.max(4,s*2+t));return[o[0],0,0,0,o[1],0,0,0,o[2]]}function K0(e,t,n){if(!Number.isInteger(t)||t<0)throw new Error("Atom index is invalid");if(n.length<3||n.some(i=>!Number.isFinite(i)))throw new Error("Atom coordinates must be finite numbers");const r=tc(e,Es);if(!r||t*3+2>=r.array.length)throw new Error("Atom coordinates are unavailable");const o=ec(e),s=new Float32Array(r.array);return s.set(n.slice(0,3),t*3),o.arrays.set(r.name,s),o}function G0(e,t,n,r){const o=Ja(t);if(n.length<3)throw new Error("Periodic axes are invalid");const s=Is(e);let i=ec(e);const a=tc(e,Xd),c=a?.name??"cell";return i.arrays.set(c,new Float32Array(o)),i.header.pbc=[!!n[0],!!n[1],!!n[2]],a||(i.header.arrays=[...i.header.arrays,{name:c,dtype:"float32",shape:[3,3],byte_offset:0,byte_length:9*Float32Array.BYTES_PER_ELEMENT,unit:"angstrom"}]),r&&s&&(i=Y0(i,s,o)),i}function W0(e,t,n){if(!Number.isInteger(t)||t<0||t>=e.topology.atom_count)throw new Error("Atom index is invalid");const r=la(n);if(r===null)throw new Error(`Unknown element “${n.trim()}”`);const o=Array.from({length:e.topology.atom_count},(i,a)=>e.topology.atomic_numbers?.[a]??la(e.topology.symbols?.[a]??"")??0),s=Array.from({length:e.topology.atom_count},(i,a)=>e.topology.symbols?.[a]??Ve[o[a]]??"X");return o[t]=r,s[t]=Ve[r],{...e,topology:{...e.topology,atomic_numbers:o,symbols:s}}}function X0(e,t){const n=fe(t,[...Es]);if(!n||n.lengtha?"T":"F").join(" ")}"`].filter(Boolean).join(" "),i=Array.from({length:e.topology.atom_count},(a,c)=>{const l=e.topology.atomic_numbers?.[c]??0,u=e.topology.symbols?.[c]??Ve[l]??"X",d=c*3;return`${u} ${Oo(n[d])} ${Oo(n[d+1])} ${Oo(n[d+2])}`});return`${e.topology.atom_count} ${s} ${i.join(` `)} diff --git a/pqviewer/static/assets/inter-cyrillic-400-normal-HOLc17fK.woff b/pqviewer/static/assets/inter-cyrillic-400-normal-HOLc17fK.woff deleted file mode 100644 index 6bd8b02..0000000 Binary files a/pqviewer/static/assets/inter-cyrillic-400-normal-HOLc17fK.woff and /dev/null differ diff --git a/pqviewer/static/assets/inter-cyrillic-400-normal-obahsSVq.woff2 b/pqviewer/static/assets/inter-cyrillic-400-normal-obahsSVq.woff2 deleted file mode 100644 index e7583fc..0000000 Binary files a/pqviewer/static/assets/inter-cyrillic-400-normal-obahsSVq.woff2 and /dev/null differ diff --git a/pqviewer/static/assets/inter-cyrillic-500-normal-BasfLYem.woff2 b/pqviewer/static/assets/inter-cyrillic-500-normal-BasfLYem.woff2 deleted file mode 100644 index dd14bcf..0000000 Binary files a/pqviewer/static/assets/inter-cyrillic-500-normal-BasfLYem.woff2 and /dev/null differ diff --git a/pqviewer/static/assets/inter-cyrillic-500-normal-CxZf_p3X.woff b/pqviewer/static/assets/inter-cyrillic-500-normal-CxZf_p3X.woff deleted file mode 100644 index c8aa26e..0000000 Binary files a/pqviewer/static/assets/inter-cyrillic-500-normal-CxZf_p3X.woff and /dev/null differ diff --git a/pqviewer/static/assets/inter-cyrillic-600-normal-4D_pXhcN.woff b/pqviewer/static/assets/inter-cyrillic-600-normal-4D_pXhcN.woff deleted file mode 100644 index 10ec579..0000000 Binary files a/pqviewer/static/assets/inter-cyrillic-600-normal-4D_pXhcN.woff and /dev/null differ diff --git a/pqviewer/static/assets/inter-cyrillic-600-normal-CWCymEST.woff2 b/pqviewer/static/assets/inter-cyrillic-600-normal-CWCymEST.woff2 deleted file mode 100644 index e250ef0..0000000 Binary files a/pqviewer/static/assets/inter-cyrillic-600-normal-CWCymEST.woff2 and /dev/null differ diff --git a/pqviewer/static/assets/inter-cyrillic-700-normal-CjBOestx.woff2 b/pqviewer/static/assets/inter-cyrillic-700-normal-CjBOestx.woff2 deleted file mode 100644 index 781e4b4..0000000 Binary files a/pqviewer/static/assets/inter-cyrillic-700-normal-CjBOestx.woff2 and /dev/null differ diff --git a/pqviewer/static/assets/inter-cyrillic-700-normal-DrXBdSj3.woff b/pqviewer/static/assets/inter-cyrillic-700-normal-DrXBdSj3.woff deleted file mode 100644 index 46451f1..0000000 Binary files a/pqviewer/static/assets/inter-cyrillic-700-normal-DrXBdSj3.woff and /dev/null differ diff --git a/pqviewer/static/assets/inter-cyrillic-ext-400-normal-BQZuk6qB.woff2 b/pqviewer/static/assets/inter-cyrillic-ext-400-normal-BQZuk6qB.woff2 deleted file mode 100644 index 4ee0d27..0000000 Binary files a/pqviewer/static/assets/inter-cyrillic-ext-400-normal-BQZuk6qB.woff2 and /dev/null differ diff --git a/pqviewer/static/assets/inter-cyrillic-ext-400-normal-DQukG94-.woff b/pqviewer/static/assets/inter-cyrillic-ext-400-normal-DQukG94-.woff deleted file mode 100644 index 6b6dc78..0000000 Binary files a/pqviewer/static/assets/inter-cyrillic-ext-400-normal-DQukG94-.woff and /dev/null differ diff --git a/pqviewer/static/assets/inter-cyrillic-ext-500-normal-B0yAr1jD.woff2 b/pqviewer/static/assets/inter-cyrillic-ext-500-normal-B0yAr1jD.woff2 deleted file mode 100644 index c21492c..0000000 Binary files a/pqviewer/static/assets/inter-cyrillic-ext-500-normal-B0yAr1jD.woff2 and /dev/null differ diff --git a/pqviewer/static/assets/inter-cyrillic-ext-500-normal-BmqWE9Dz.woff b/pqviewer/static/assets/inter-cyrillic-ext-500-normal-BmqWE9Dz.woff deleted file mode 100644 index e5c7962..0000000 Binary files a/pqviewer/static/assets/inter-cyrillic-ext-500-normal-BmqWE9Dz.woff and /dev/null differ diff --git a/pqviewer/static/assets/inter-cyrillic-ext-600-normal-Bcila6Z-.woff b/pqviewer/static/assets/inter-cyrillic-ext-600-normal-Bcila6Z-.woff deleted file mode 100644 index 7b24dd8..0000000 Binary files a/pqviewer/static/assets/inter-cyrillic-ext-600-normal-Bcila6Z-.woff and /dev/null differ diff --git a/pqviewer/static/assets/inter-cyrillic-ext-600-normal-Dfes3d0z.woff2 b/pqviewer/static/assets/inter-cyrillic-ext-600-normal-Dfes3d0z.woff2 deleted file mode 100644 index e00289e..0000000 Binary files a/pqviewer/static/assets/inter-cyrillic-ext-600-normal-Dfes3d0z.woff2 and /dev/null differ diff --git a/pqviewer/static/assets/inter-cyrillic-ext-700-normal-BjwYoWNd.woff2 b/pqviewer/static/assets/inter-cyrillic-ext-700-normal-BjwYoWNd.woff2 deleted file mode 100644 index 1a5c3ce..0000000 Binary files a/pqviewer/static/assets/inter-cyrillic-ext-700-normal-BjwYoWNd.woff2 and /dev/null differ diff --git a/pqviewer/static/assets/inter-cyrillic-ext-700-normal-LO58E6JB.woff b/pqviewer/static/assets/inter-cyrillic-ext-700-normal-LO58E6JB.woff deleted file mode 100644 index 6fb2700..0000000 Binary files a/pqviewer/static/assets/inter-cyrillic-ext-700-normal-LO58E6JB.woff and /dev/null differ diff --git a/pqviewer/static/assets/inter-greek-ext-400-normal-DGGRlc-M.woff2 b/pqviewer/static/assets/inter-greek-ext-400-normal-DGGRlc-M.woff2 deleted file mode 100644 index 7cb1d6b..0000000 Binary files a/pqviewer/static/assets/inter-greek-ext-400-normal-DGGRlc-M.woff2 and /dev/null differ diff --git a/pqviewer/static/assets/inter-greek-ext-400-normal-KugGGMne.woff b/pqviewer/static/assets/inter-greek-ext-400-normal-KugGGMne.woff deleted file mode 100644 index 96f1f60..0000000 Binary files a/pqviewer/static/assets/inter-greek-ext-400-normal-KugGGMne.woff and /dev/null differ diff --git a/pqviewer/static/assets/inter-greek-ext-500-normal-2j5mBUwD.woff b/pqviewer/static/assets/inter-greek-ext-500-normal-2j5mBUwD.woff deleted file mode 100644 index 713c500..0000000 Binary files a/pqviewer/static/assets/inter-greek-ext-500-normal-2j5mBUwD.woff and /dev/null differ diff --git a/pqviewer/static/assets/inter-greek-ext-500-normal-C4iEst2y.woff2 b/pqviewer/static/assets/inter-greek-ext-500-normal-C4iEst2y.woff2 deleted file mode 100644 index 4062b66..0000000 Binary files a/pqviewer/static/assets/inter-greek-ext-500-normal-C4iEst2y.woff2 and /dev/null differ diff --git a/pqviewer/static/assets/inter-greek-ext-600-normal-B8X0CLgF.woff b/pqviewer/static/assets/inter-greek-ext-600-normal-B8X0CLgF.woff deleted file mode 100644 index b3d15d1..0000000 Binary files a/pqviewer/static/assets/inter-greek-ext-600-normal-B8X0CLgF.woff and /dev/null differ diff --git a/pqviewer/static/assets/inter-greek-ext-600-normal-DRtmH8MT.woff2 b/pqviewer/static/assets/inter-greek-ext-600-normal-DRtmH8MT.woff2 deleted file mode 100644 index 83e7de9..0000000 Binary files a/pqviewer/static/assets/inter-greek-ext-600-normal-DRtmH8MT.woff2 and /dev/null differ diff --git a/pqviewer/static/assets/inter-greek-ext-700-normal-BoQ6DsYi.woff b/pqviewer/static/assets/inter-greek-ext-700-normal-BoQ6DsYi.woff deleted file mode 100644 index e36fd56..0000000 Binary files a/pqviewer/static/assets/inter-greek-ext-700-normal-BoQ6DsYi.woff and /dev/null differ diff --git a/pqviewer/static/assets/inter-greek-ext-700-normal-qfdV9bQt.woff2 b/pqviewer/static/assets/inter-greek-ext-700-normal-qfdV9bQt.woff2 deleted file mode 100644 index af7bcba..0000000 Binary files a/pqviewer/static/assets/inter-greek-ext-700-normal-qfdV9bQt.woff2 and /dev/null differ diff --git a/pqviewer/static/assets/inter-vietnamese-400-normal-Bbgyi5SW.woff b/pqviewer/static/assets/inter-vietnamese-400-normal-Bbgyi5SW.woff deleted file mode 100644 index ff3f8f1..0000000 Binary files a/pqviewer/static/assets/inter-vietnamese-400-normal-Bbgyi5SW.woff and /dev/null differ diff --git a/pqviewer/static/assets/inter-vietnamese-400-normal-DMkecbls.woff2 b/pqviewer/static/assets/inter-vietnamese-400-normal-DMkecbls.woff2 deleted file mode 100644 index ba7767f..0000000 Binary files a/pqviewer/static/assets/inter-vietnamese-400-normal-DMkecbls.woff2 and /dev/null differ diff --git a/pqviewer/static/assets/inter-vietnamese-500-normal-DOriooB6.woff2 b/pqviewer/static/assets/inter-vietnamese-500-normal-DOriooB6.woff2 deleted file mode 100644 index abe88f5..0000000 Binary files a/pqviewer/static/assets/inter-vietnamese-500-normal-DOriooB6.woff2 and /dev/null differ diff --git a/pqviewer/static/assets/inter-vietnamese-500-normal-mJboJaSs.woff b/pqviewer/static/assets/inter-vietnamese-500-normal-mJboJaSs.woff deleted file mode 100644 index 87a9d4d..0000000 Binary files a/pqviewer/static/assets/inter-vietnamese-500-normal-mJboJaSs.woff and /dev/null differ diff --git a/pqviewer/static/assets/inter-vietnamese-600-normal-BuLX-rYi.woff b/pqviewer/static/assets/inter-vietnamese-600-normal-BuLX-rYi.woff deleted file mode 100644 index 264f0f5..0000000 Binary files a/pqviewer/static/assets/inter-vietnamese-600-normal-BuLX-rYi.woff and /dev/null differ diff --git a/pqviewer/static/assets/inter-vietnamese-600-normal-Cc8MFFhd.woff2 b/pqviewer/static/assets/inter-vietnamese-600-normal-Cc8MFFhd.woff2 deleted file mode 100644 index e7b7814..0000000 Binary files a/pqviewer/static/assets/inter-vietnamese-600-normal-Cc8MFFhd.woff2 and /dev/null differ diff --git a/pqviewer/static/assets/inter-vietnamese-700-normal-BZaoP0fm.woff b/pqviewer/static/assets/inter-vietnamese-700-normal-BZaoP0fm.woff deleted file mode 100644 index 26d92ec..0000000 Binary files a/pqviewer/static/assets/inter-vietnamese-700-normal-BZaoP0fm.woff and /dev/null differ diff --git a/pqviewer/static/assets/inter-vietnamese-700-normal-DlLaEgI2.woff2 b/pqviewer/static/assets/inter-vietnamese-700-normal-DlLaEgI2.woff2 deleted file mode 100644 index 38c516e..0000000 Binary files a/pqviewer/static/assets/inter-vietnamese-700-normal-DlLaEgI2.woff2 and /dev/null differ diff --git a/pqviewer/static/index.html b/pqviewer/static/index.html index dd86c51..55e8bb2 100644 --- a/pqviewer/static/index.html +++ b/pqviewer/static/index.html @@ -7,11 +7,11 @@ PQViewer - + - +