@liveroom-tech/react-immersive 5.0.2 → 5.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +580 -38
- package/dist/{ModelViewer-DOexHkJC.d.ts → ModelViewer-Bj-KjiDL.d.mts} +91 -42
- package/dist/{ModelViewer-CbbJT85n.d.mts → ModelViewer-BkQ73y6N.d.ts} +91 -42
- package/dist/binding-builder.css +1 -1
- package/dist/binding-builder.js +13 -12
- package/dist/binding-builder.mjs +1 -1
- package/dist/chunk-32WCLPTZ.mjs +1 -0
- package/dist/chunk-CSGNL4XU.mjs +3 -0
- package/dist/chunk-F2ILTIPG.mjs +28 -0
- package/dist/chunk-V6GALFL5.mjs +1 -0
- package/dist/chunk-WN6GMMHF.mjs +1 -0
- package/dist/hosted.css +1 -1
- package/dist/hosted.d.mts +3 -3
- package/dist/hosted.d.ts +3 -3
- package/dist/hosted.js +12 -11
- package/dist/hosted.mjs +1 -1
- package/dist/index.css +1 -1
- package/dist/index.d.mts +54 -10
- package/dist/index.d.ts +54 -10
- package/dist/index.js +11 -10
- package/dist/index.mjs +1 -1
- package/dist/{modelInfo-CEmmvVCH.d.mts → modelInfo-DnkmTGMd.d.mts} +6 -0
- package/dist/{modelInfo-CEmmvVCH.d.ts → modelInfo-DnkmTGMd.d.ts} +6 -0
- package/dist/{objectCatalog-5W8n5xNQ.d.ts → objectCatalog-BIeXURoq.d.mts} +276 -5
- package/dist/{objectCatalog-5W8n5xNQ.d.mts → objectCatalog-BIeXURoq.d.ts} +276 -5
- package/dist/simple-model-viewer.d.mts +2 -2
- package/dist/simple-model-viewer.d.ts +2 -2
- package/dist/simple-model-viewer.js +3 -3
- package/dist/simple-model-viewer.mjs +1 -1
- package/dist/utils.d.mts +2 -2
- package/dist/utils.d.ts +2 -2
- package/dist/utils.js +1 -1
- package/dist/utils.mjs +1 -1
- package/package.json +1 -1
- package/dist/chunk-3GX7DOGS.mjs +0 -3
- package/dist/chunk-AH5NAZWX.mjs +0 -27
- package/dist/chunk-BGYK4Y2Y.mjs +0 -1
- package/dist/chunk-WFEYRUZC.mjs +0 -1
- package/dist/chunk-XTLSAYAQ.mjs +0 -1
package/dist/hosted.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{a as i}from"./chunk-
|
|
1
|
+
"use client";import{a as i}from"./chunk-CSGNL4XU.mjs";import{u as e}from"./chunk-F2ILTIPG.mjs";import"./chunk-V6GALFL5.mjs";import"./chunk-32WCLPTZ.mjs";import"./chunk-JR557W27.mjs";import{jsx as t}from"react/jsx-runtime";function o(r){return t(e,{...r})}export{i as ProjectBindingBuilder,o as ProjectModelViewer};
|
package/dist/index.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
:root{--ri-styles-model-viewer: 1}.ri-viewer--license-checking,.ri-viewer--license-invalid{display:flex;align-items:center;justify-content:center;width:100%;height:100%;background-color:#f9f9f9}.ri-viewer{--ri-font-family: Inter, "Segoe UI", Helvetica, Arial, sans-serif;--ri-viewer-bg: #1c1c1d;--ri-viewer-text: #111827;--ri-panel-bg: #ffffff;--ri-panel-border: #e5e7eb;--ri-panel-title: #111827;--ri-panel-muted-text: #4b5563;--ri-panel-subtle-text: #9ca3af;--ri-panel-surface: #f9fafb;--ri-panel-surface-hover: #f3f4f6;--ri-panel-surface-border: #e5e7eb;--ri-panel-button-text: #1f2937;--ri-panel-accent: #2563eb;--ri-panel-accent-contrast: #ffffff;--ri-license-overlay-bg: rgba(0, 0, 0, .04);--ri-license-overlay-border: rgba(0, 0, 0, .08);--ri-license-overlay-text: #888;--ri-license-overlay-error-bg: rgba(192, 57, 43, .06);--ri-license-overlay-error-border: rgba(192, 57, 43, .2);--ri-license-overlay-error-text: #c0392b;--ri-sidepanel-font-family: Inter, "Segoe UI", Helvetica, Arial, sans-serif;--ri-sidepanel-bg: var(--ri-databinding-bg, #111318);--ri-sidepanel-open-btn-bg: rgba(20, 20, 20, .82);--ri-sidepanel-open-btn-bg-hover: #27282b7e;--ri-sidepanel-border: rgba(255, 255, 255, .06);--ri-sidepanel-divider: rgba(255, 255, 255, .04);--ri-sidepanel-border-strong: rgba(255, 255, 255, .08);--ri-sidepanel-border-active: rgba(255, 255, 255, .18);--ri-sidepanel-shadow-left: 4px 0 24px rgba(0, 0, 0, .35);--ri-sidepanel-shadow-right: -4px 0 24px rgba(0, 0, 0, .35);--ri-sidepanel-text: var(--ri-databinding-text, #f1f5f9);--ri-sidepanel-text-emphasis: var(--ri-databinding-text-hover, #cbd5e1);--ri-sidepanel-text-muted: var(--ri-databinding-text-muted, #94a3b8);--ri-sidepanel-text-subtle: var(--ri-databinding-text-subtle, #64748b);--ri-sidepanel-placeholder: var(--ri-databinding-text-faint, #475569);--ri-sidepanel-surface: rgba(255, 255, 255, .05);--ri-sidepanel-surface-hover: rgba(255, 255, 255, .1);--ri-sidepanel-accent: #3b82f6;--ri-sidepanel-accent-soft: rgba(59, 130, 246, .12);--ri-databinding-bg: #111318;--ri-databinding-border: rgba(255, 255, 255, .06);--ri-databinding-border-strong: rgba(255, 255, 255, .08);--ri-databinding-border-hover: rgba(255, 255, 255, .15);--ri-databinding-shadow: 4px 0 24px rgba(0, 0, 0, .35);--ri-databinding-font-family: "Inter", "Segoe UI", sans-serif;--ri-databinding-mono-font-family: "JetBrains Mono", "Fira Code", "Menlo", monospace;--ri-databinding-text: #f1f5f9;--ri-databinding-text-muted: #94a3b8;--ri-databinding-text-subtle: #64748b;--ri-databinding-text-faint: #475569;--ri-databinding-text-hover: #cbd5e1;--ri-databinding-surface: rgba(255, 255, 255, .03);--ri-databinding-surface-hover: rgba(255, 255, 255, .06);--ri-databinding-accent: #93c5fd;--ri-databinding-accent-glow: rgba(147, 197, 253, .8);--ri-databinding-accent-border: rgba(96, 165, 250, .55);--ri-databinding-accent-gradient: linear-gradient( 135deg, #1e3a8a 0%, #1d4ed8 60%, #2563eb 100% );--ri-databinding-accent-gradient-active: linear-gradient( 135deg, #1e3a8a 0%, #1e40af 100% );display:flex;flex-direction:row;width:100%;height:100%;min-height:0;overflow:hidden;background:var(--ri-viewer-bg);position:relative;color:var(--ri-viewer-text);font-family:var(--ri-font-family);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility;font-synthesis:none}.ri-viewer *{box-sizing:border-box}.ri-viewerLeft{display:flex;flex:1;min-height:0;min-width:0;position:relative}.ri-viewerRight{display:flex;flex-shrink:0;min-width:0}.ri-panel{width:280px;min-height:0;background:var(--ri-panel-bg);border-right:1px solid var(--ri-panel-border);display:flex;flex-direction:column;padding:20px;overflow-y:auto;flex-shrink:0;transition:margin-left .3s ease,transform .3s ease}.ri-panel--open{transform:translate(0);margin-left:0}.ri-panel--closed{transform:translate(-100%);margin-left:-280px}.ri-panelHeader{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:12px}.ri-panelTitle{margin:0;font-size:15px;font-weight:700;color:var(--ri-panel-title);line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ri-closeButton{border:0;background:transparent;color:var(--ri-panel-subtle-text);font-size:22px;line-height:1;padding:0;cursor:pointer;flex-shrink:0;transition:color .2s ease}.ri-closeButton:hover{color:var(--ri-panel-muted-text)}.ri-json{margin:0 0 16px;padding:12px;background:var(--ri-panel-surface);border:1px solid var(--ri-panel-surface-border);border-radius:12px;font-size:12px;line-height:1.55;color:var(--ri-panel-button-text);overflow-x:auto;white-space:pre-wrap;word-break:break-word}.ri-divider{border-top:1px solid var(--ri-panel-border);margin-bottom:12px}.ri-sectionLabel{margin-bottom:8px;font-size:11px;font-weight:700;color:var(--ri-panel-subtle-text);text-transform:uppercase;letter-spacing:.16em}.ri-actionList{display:flex;flex-direction:column;gap:8px}.ri-actionButton{width:100%;border-radius:8px;border:1px solid var(--ri-panel-surface-border);background:var(--ri-panel-surface);color:var(--ri-panel-button-text);padding:10px 12px;text-align:left;font-size:14px;line-height:1.4;cursor:pointer;transition:background-color .2s ease,border-color .2s ease,color .2s ease}.ri-actionButton:hover{background:var(--ri-panel-surface-hover);border-color:var(--ri-panel-border)}.ri-actionButton--active{background:var(--ri-panel-accent);border-color:var(--ri-panel-accent);color:var(--ri-panel-accent-contrast)}.ri-actionButton--active:hover{background:var(--ri-panel-accent);border-color:var(--ri-panel-accent)}.ri-canvasArea{flex:1 1 auto;position:relative;min-width:0}.ri-canvasArea--measuring{cursor:crosshair}.ri-canvasArea canvas{opacity:1;transition:opacity .18s ease}.ri-canvasArea--positioning canvas{opacity:0;transition:none}.ri-bindingsMismatchBanner{position:absolute;top:12px;left:50%;transform:translate(-50%);z-index:20;display:flex;align-items:center;gap:8px;padding:7px 12px 7px 10px;border-radius:8px;background:#1e1400e0;border:1px solid rgba(251,191,36,.35);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);color:#fbbf24;font-size:12px;font-weight:500;line-height:1.4;white-space:nowrap;pointer-events:auto;max-width:calc(100% - 32px);white-space:normal;text-align:center}.ri-bindingsMismatchBanner__icon{flex-shrink:0}.ri-bindingsMismatchBanner__dismiss{flex-shrink:0;display:flex;align-items:center;justify-content:center;margin-left:4px;padding:2px;background:none;border:none;border-radius:4px;color:#fbbf24b3;cursor:pointer;transition:color .15s ease,background .15s ease}.ri-bindingsMismatchBanner__dismiss:hover{color:#fbbf24;background:#fbbf241f}.ri-measureTools,.ri-uvCheckerTools{position:absolute;top:16px;left:16px;z-index:10;display:flex;gap:8px;align-items:center}.ri-measureButton{width:34px;height:34px;padding:0;background:#141414d1;border:1px solid rgba(255,255,255,.12);color:#ffffffbf;border-radius:8px;cursor:pointer;display:flex;align-items:center;justify-content:center;touch-action:manipulation;user-select:none;-webkit-tap-highlight-color:transparent;backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);transition:background .15s ease,color .15s ease,border-color .15s ease}.ri-measureButton:hover{background:#282828eb;color:#fff;border-color:#ffffff40}.ri-measureButton:active{background:#38dbf0;color:#06343c;border-color:#38dbf0}.ri-measureButton--active{background:#22d3ee;border-color:#22d3ee;color:#06343c}.ri-measureButton--active:hover{background:#38dbf0;color:#06343c}.ri-measureHint{padding:6px 10px;border-radius:8px;font-size:12px;line-height:1;color:#fff;background:#141414d1;border:1px solid rgba(255,255,255,.12);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);white-space:nowrap}.ri-explodeTools{position:absolute;top:16px;left:16px;z-index:10;display:flex;gap:8px;align-items:center}.ri-explodeSlider{display:flex;align-items:center;gap:8px;height:34px;padding:0 12px;background:#141414d1;border:1px solid rgba(255,255,255,.12);border-radius:8px;backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px)}.ri-explodeSlider input[type=range]{width:120px;accent-color:#22d3ee;cursor:pointer}.ri-cinematicTools{position:absolute;left:16px;z-index:10;display:flex;gap:8px;align-items:center}.ri-measureDot{width:10px;height:10px;border-radius:50%;background:#22d3ee;border:2px solid #fff;box-shadow:0 0 0 1px #0006;pointer-events:none}.ri-measureLabel{padding:3px 7px;border-radius:6px;font-size:12px;font-weight:600;line-height:1;white-space:nowrap;color:#06343c;background:#22d3ee;box-shadow:0 1px 4px #00000059;pointer-events:none;user-select:none}.ri-xrTools{position:absolute;left:16px;z-index:10;display:flex;gap:8px;align-items:center}.ri-xrButton{display:inline-flex;align-items:center;gap:8px;height:34px;padding:0 10px;font-size:13px;font-weight:500;color:#fff;background:#141414d1;border:1px solid rgba(255,255,255,.16);border-radius:8px;cursor:pointer;touch-action:manipulation;user-select:none;-webkit-tap-highlight-color:transparent;backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);transition:background .15s ease,border-color .15s ease}.ri-xrButton:hover{background:#282828eb;border-color:#ffffff4d}.ri-mobileHandoffBackdrop{position:absolute;z-index:30;inset:0;display:grid;place-items:center;padding:20px;background:#020617ad;backdrop-filter:blur(5px);-webkit-backdrop-filter:blur(5px)}.ri-mobileHandoffDialog{position:relative;display:flex;width:min(100%,300px);flex-direction:column;align-items:center;padding:16px;text-align:center;color:#e2e8f0;background:#0f172a;border:1px solid rgba(148,163,184,.3);border-radius:16px;box-shadow:0 24px 80px #00000080}.ri-mobileHandoffDialog>svg{color:#67e8f9}.ri-mobileHandoffDialog h2{margin:12px 0 0;font-size:18px;line-height:1.25;color:#fff}.ri-mobileHandoffDialog p{margin:8px 0 16px;font-size:13px;line-height:1.5;color:#cbd5e1}.ri-mobileHandoffQr{display:grid;place-items:center;padding:10px;background:#fff;border-radius:10px}.ri-mobileHandoffDialog a{margin-top:16px;font-size:13px;font-weight:600;color:#a5f3fc;text-decoration:underline;text-underline-offset:3px}.ri-mobileHandoffClose{position:absolute;top:10px;right:10px;display:grid;width:30px;height:30px;place-items:center;padding:0;color:#cbd5e1;background:transparent;border:0;border-radius:6px;cursor:pointer}.ri-mobileHandoffClose:hover{color:#fff;background:#ffffff1a}.ri-arHintOverlay{position:absolute;top:18px;left:50%;transform:translate(-50%);z-index:10;width:min(calc(100% - 32px),360px);pointer-events:none}.ri-arHint{margin:0 auto;width:fit-content;max-width:100%;padding:6px 12px;font-size:11px;font-weight:500;line-height:1.2;text-align:center;color:#ffffffeb;background:#14141494;border:1px solid rgba(255,255,255,.12);border-radius:999px;user-select:none;backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px)}.ri-arOverlay{position:absolute;bottom:24px;left:50%;transform:translate(-50%);z-index:10;width:min(calc(100% - 32px),420px);pointer-events:none}.ri-arControls{display:flex;flex-direction:column;align-items:center;gap:10px}.ri-arStatus,.ri-arActionButton{max-width:100%;padding:8px 16px;font-size:13px;font-weight:600;line-height:1.3;text-align:center;white-space:nowrap;color:#fff;background:#141414d1;border:1px solid rgba(255,255,255,.16);border-radius:19px;user-select:none;backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px)}.ri-arStatus{pointer-events:none}.ri-arActionButton{display:inline-flex;align-items:center;justify-content:center;gap:6px;cursor:pointer;pointer-events:auto;touch-action:manipulation;-webkit-tap-highlight-color:transparent;transition:background .15s ease,border-color .15s ease,color .15s ease,transform .15s ease}.ri-arActionButton svg{flex-shrink:0}.ri-arActionButton:hover{background:#282828eb;border-color:#ffffff4d}.ri-arActionButton:active{transform:scale(.98)}.ri-arActionButton--primary{color:#06343c;background:#22d3ee;border-color:transparent;box-shadow:0 1px 4px #00000059}.ri-arActionButton--primary:hover{background:#67e8f9;border-color:transparent}.ri-arActionButton.ri-arActionButton--active,.ri-arActionButton[aria-pressed=true],.ri-arActionButton.ri-arActionButton--active:hover,.ri-arActionButton[aria-pressed=true]:hover,.ri-arActionButton.ri-arActionButton--active:active,.ri-arActionButton[aria-pressed=true]:active{color:#06343c;background:#22d3ee;border-color:transparent;box-shadow:0 1px 4px #00000059}.ri-hiddenInput{display:none}.ri-popover{position:absolute;z-index:50;background:#fff;border:1px solid #e5e7eb;border-radius:16px;box-shadow:0 24px 48px #0f172a2e;color:#111827}.ri-popover--inline{position:static;z-index:auto;width:100%;border-radius:10px;box-shadow:none}.ri-popover--inline .react-colorful{width:100%}.ri-popover--inline{background:var(--ri-databinding-surface, rgba(255, 255, 255, .03));border-color:var(--ri-databinding-border-strong, rgba(255, 255, 255, .08));color:var(--ri-databinding-text, #f1f5f9)}.ri-popover--inline .ri-popoverHeader{border-bottom-color:var( --ri-databinding-border-strong, rgba(255, 255, 255, .08) )}.ri-popover--inline .ri-popoverLabel,.ri-popover--inline .ri-colorCode{color:var(--ri-databinding-text-muted, #94a3b8)}.ri-popover--inline .ri-secondaryButton{background:var(--ri-databinding-surface-hover, rgba(255, 255, 255, .06));border-color:var(--ri-databinding-border-strong, rgba(255, 255, 255, .08));color:var(--ri-databinding-text, #f1f5f9)}.ri-popover--inline .ri-secondaryButton:hover{background:#ffffff1f}.ri-popover--inline .ri-previewFrame{border-color:var(--ri-databinding-border-strong, rgba(255, 255, 255, .08))}.ri-popover--inline .ri-emptyState{border-color:var(--ri-databinding-border-hover, rgba(255, 255, 255, .15));color:var(--ri-databinding-text-subtle, #64748b)}.ri-popover--inline .ri-uploadButton{background:var(--ri-databinding-accent-gradient, #2563eb);color:#fff}.ri-popover--inline .ri-uploadButton:hover{background:var(--ri-databinding-accent-gradient-active, #1d4ed8)}.ri-popover--inline .ri-removeButton{background:transparent;border-color:var(--ri-databinding-border-strong, rgba(255, 255, 255, .08));color:var(--ri-databinding-text-muted, #94a3b8)}.ri-popover--inline .ri-removeButton:hover{background:var(--ri-databinding-surface-hover, rgba(255, 255, 255, .06))}.ri-popover--inline .ri-formatHint{color:var(--ri-databinding-text-subtle, #64748b)}.ri-popoverHeader{padding:12px 16px}.ri-popoverLabel{margin:0 0 8px;font-size:11px;font-weight:700;color:#6b7280;text-transform:uppercase;letter-spacing:.16em}.ri-inlineRow{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-top:8px}.ri-colorCode{font-size:12px;color:#9ca3af;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;text-transform:uppercase}.ri-secondaryButton{border:1px solid #e5e7eb;background:#f3f4f6;color:#374151;border-radius:8px;padding:6px 10px;font-size:12px;cursor:pointer;transition:background-color .2s ease}.ri-secondaryButton:hover{background:#e5e7eb}.ri-materialBody{display:flex;flex-direction:column;gap:12px;padding-left:12px;padding-right:12px;padding-bottom:12px}.ri-previewFrame{position:relative;height:112px;border-radius:12px;overflow:hidden;border:1px solid #e5e7eb}.ri-previewImage{width:100%;height:100%;object-fit:cover;display:block}.ri-previewCaption{position:absolute;left:0;right:0;bottom:0;background:#0006;padding:4px 8px;color:#fff;font-size:10px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ri-emptyState{height:112px;border-radius:12px;border:2px dashed #e5e7eb;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;color:#d1d5db;text-align:center}.ri-uploadButton{width:100%;border:0;border-radius:10px;background:#111827;color:#fff;padding:10px 12px;font-size:12px;font-weight:600;cursor:pointer;transition:background-color .2s ease}.ri-uploadButton:hover{background:#374151}.ri-removeButton{width:100%;border-radius:10px;border:1px solid #e5e7eb;background:#fff;color:#6b7280;padding:8px 12px;font-size:12px;cursor:pointer;transition:background-color .2s ease}.ri-removeButton:hover{background:#f9fafb}.ri-formatHint{margin:0;text-align:center;font-size:10px;color:#d1d5db}.ri-texturePosition{display:flex;flex-direction:column;gap:8px;padding-top:8px;border-top:1px solid #e5e7eb}.ri-texturePositionLabel{margin:0;font-size:11px;font-weight:600;color:#6b7280}.ri-texturePositionGrid{display:grid;grid-template-columns:1fr 1fr;gap:8px}.ri-texturePositionField{display:flex;flex-direction:column;gap:4px;font-size:11px;color:#6b7280}.ri-texturePositionField--full{grid-column:1 / -1}.ri-texturePositionField input[type=number]{width:100%;border-radius:8px;border:1px solid #e5e7eb;background:#fff;color:#111827;padding:6px 8px;font-size:12px}.ri-texturePositionSliderRow{display:flex;align-items:center;gap:8px}.ri-texturePositionSliderRow input[type=range]{flex:1}.ri-texturePositionSliderRow input[type=number]{width:56px;border-radius:8px;border:1px solid #e5e7eb;background:#fff;color:#111827;padding:6px 8px;font-size:12px}.ri-texturePositionHint{margin:0;font-size:11px;line-height:1.4;color:#9ca3af}.ri-popover--inline .ri-texturePosition{border-color:var(--ri-databinding-border-strong, rgba(255, 255, 255, .08))}.ri-popover--inline .ri-texturePositionLabel,.ri-popover--inline .ri-texturePositionField,.ri-popover--inline .ri-texturePositionHint{color:var(--ri-databinding-text-muted, #94a3b8)}.ri-popover--inline .ri-texturePositionField input[type=number],.ri-popover--inline .ri-texturePositionSliderRow input[type=number]{background:var(--ri-databinding-surface-hover, rgba(255, 255, 255, .06));border-color:var(--ri-databinding-border-strong, rgba(255, 255, 255, .08));color:var(--ri-databinding-text, #e2e8f0)}.ri-buttonContainer{display:flex;justify-content:space-between;align-items:center;gap:8px;position:absolute;bottom:12px;left:12px;right:12px;z-index:10}.ri-tourControls{display:flex;gap:6px;align-items:center;flex-shrink:0}.ri-rightControls{display:flex;gap:6px;align-items:center;flex-shrink:0;margin-left:auto}.ri-rightControls:only-child{margin-left:auto}.ri-navButtonSingle,.ri-tourButton,.ri-resetButton,.ri-downloadButton{height:34px;background:#141414d1;border:1px solid rgba(255,255,255,.12);color:#ffffffbf!important;border-radius:8px;backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);cursor:pointer;transition:background .15s ease,color .15s ease,border-color .15s ease,transform .15s ease;user-select:none;-webkit-tap-highlight-color:transparent}.ri-navButtonSingle:hover:not(:disabled),.ri-tourButton:hover:not(:disabled),.ri-resetButton:hover:not(:disabled){background:#282828eb;color:#fff;border-color:#ffffff40}.ri-navButtonSingle:active:not(:disabled),.ri-tourButton:active:not(:disabled),.ri-resetButton:active:not(:disabled){background:#38dbf0;color:#06343c;border-color:#38dbf0}.ri-navButtonSingle:disabled,.ri-tourButton:disabled,.ri-resetButton:disabled{opacity:.45;cursor:not-allowed}.ri-navButtonSingle{padding:0 16px;font-size:13px;font-weight:500;display:flex;align-items:center;gap:8px;white-space:nowrap}.ri-tourButton{padding:0 12px;font-size:13px;font-weight:500;display:flex;align-items:center;gap:4px;white-space:nowrap}.ri-tourButton svg{width:15px;height:15px;flex-shrink:0}.ri-tourButton--stop{border-color:#f446;color:#ff6b6b}.ri-tourButton--stop:hover:not(:disabled){background:#ff444426;border-color:#f449;color:#ff6b6b}.ri-tourButton--stop:active:not(:disabled){background:#f44;color:#fff;border-color:#f44}.ri-tourButton--next{border-color:#38dbf04d;color:#38dbf0}.ri-tourButton--next:hover:not(:disabled){background:#38dbf01f;border-color:#38dbf080;color:#38dbf0}.ri-tourButton--next:active:not(:disabled){background:#38dbf0;color:#06343c;border-color:#38dbf0}.mv-rightControls{position:absolute;bottom:5px;right:5px;z-index:10000;display:flex;align-items:center;gap:5px;pointer-events:auto}.mv-resetButton,.mv-controllersButton,.mv-downloadButton{height:34px;display:inline-flex;align-items:center;justify-content:center;gap:6px;border:1px solid rgba(255,255,255,.12);border-radius:8px;background:#141414d1;color:#ffffffbf;font-size:13px;font-weight:500;white-space:nowrap;cursor:pointer;user-select:none;-webkit-tap-highlight-color:transparent;backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);transition:background .15s ease,color .15s ease,border-color .15s ease,transform .15s ease,opacity .15s ease}.mv-resetButton:hover:not(:disabled),.mv-controllersButton:hover:not(:disabled),.mv-downloadButton:hover:not(:disabled){background:#282828eb;color:#fff;border-color:#ffffff40}.mv-resetButton:active:not(:disabled),.mv-controllersButton:active:not(:disabled),.mv-downloadButton:active:not(:disabled){background:#38dbf0;color:#06343c;border-color:#38dbf0}.mv-resetButton:disabled,.mv-controllersButton:disabled,.mv-downloadButton:disabled{opacity:.45;cursor:not-allowed}.mv-resetButton:focus-visible,.mv-controllersButton:focus-visible,.mv-downloadButton:focus-visible{outline:2px solid rgba(255,255,255,.5);outline-offset:2px}.mv-resetButton{width:34px;padding:0;flex-shrink:0}.mv-resetButton svg{width:15px;height:15px;flex-shrink:0;pointer-events:none}.mv-controllersWrapper{position:relative;display:inline-flex;flex-direction:column;align-items:stretch}.mv-controllersButton{width:34px;padding:0;flex-shrink:0}.mv-controllersButton svg{width:15px;height:15px;flex-shrink:0;pointer-events:none}.mv-controllersMenu{position:absolute;bottom:calc(100% + 6px);right:0;min-width:168px;display:flex;flex-direction:column;padding:6px;border:1px solid rgba(255,255,255,.14);border-radius:10px;background:#141414eb;box-shadow:0 16px 32px #0f172a66;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);z-index:100;animation:mv-menuReveal .12s ease}.mv-controllersMenuItem{display:flex;align-items:center;gap:9px;width:100%;padding:9px 12px;border:none;border-radius:6px;background:transparent;color:#fff;font-size:13px;font-weight:400;text-align:left;white-space:nowrap;cursor:pointer;transition:background .1s ease,color .1s ease}.mv-controllersMenuItem:hover:not(:disabled){background:#ffffff1a}.mv-controllersMenuItem--active{background:#38dbf026;color:#38dbf0;font-weight:600}.mv-controllersMenuItem--active:hover{background:#38dbf038}.mv-downloadWrapper{position:relative;display:inline-flex;flex-direction:column;align-items:stretch}.mv-downloadButton{padding:0 16px;flex-shrink:0}.mv-downloadButton svg{width:15px;height:15px;flex-shrink:0;pointer-events:none}.mv-downloadButton__spinner{display:inline-block;width:13px;height:13px;border:2px solid rgba(255,255,255,.3);border-top-color:#fff;border-radius:50%;animation:mv-spin .7s linear infinite;flex-shrink:0}.mv-downloadMenu{position:absolute;bottom:calc(100% + 6px);right:0;min-width:168px;display:flex;flex-direction:column;padding:6px;border:1px solid rgba(255,255,255,.14);border-radius:10px;background:#141414eb;box-shadow:0 16px 32px #0f172a66;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);overflow:hidden;z-index:100;animation:mv-menuReveal .12s ease}.mv-downloadMenuItem{display:flex;align-items:center;gap:9px;width:100%;padding:10px 14px;border:none;border-radius:6px;background:transparent;color:#fff;font-size:13px;font-weight:400;text-align:left;white-space:nowrap;cursor:pointer;transition:background .1s ease}.mv-downloadMenuItem:hover:not(:disabled){background:#ffffff1a}.mv-downloadMenuItem:disabled{opacity:.4;cursor:not-allowed}.mv-downloadMenuDivider{height:1px;margin:0 10px;background:#ffffff1a}.mv-downloadMenuNotice{max-width:220px;padding:8px 14px 11px;color:#fca5a5;font-size:11px;line-height:1.4}@keyframes mv-menuReveal{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes mv-spin{to{transform:rotate(360deg)}}@media(max-width:768px){.mv-rightControls{flex-wrap:wrap;gap:6px}.mv-downloadButton{padding:0 10px;font-size:12px}}@media(max-width:480px){.mv-downloadButton{padding:0 10px;font-size:12px}.mv-downloadButton span{display:none}}.ri-annotationMarker{position:relative;width:36px;height:36px;border-radius:50%;background:#141414d1;border:2px solid rgba(255,255,255,.9);color:#fff;display:flex;align-items:center;justify-content:center;font-size:14px;font-weight:700;cursor:pointer;z-index:20;user-select:none;box-shadow:0 2px 8px #00000073;pointer-events:auto;transition:opacity .3s ease,transform .3s ease}.ri-annotationMarker:hover{transform:scale(1.08);box-shadow:0 12px 28px #0f172a2e;background:#282828eb}.ri-annotationPopup{position:absolute;width:min(270px,calc(100vw - 32px));background:#141414d9;border:1px solid rgba(255,255,255,.12);border-radius:16px;padding:16px;z-index:30;display:flex;flex-direction:column;gap:12px;box-shadow:0 24px 48px #0f172a2e;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px)}.ri-annotationInput,.ri-annotationTextarea{width:100%;border:1px solid rgba(255,255,255,.12);background:#ffffff0d;color:#e5e7eb;border-radius:10px;padding:10px 12px;outline:none;font-family:inherit;transition:border-color .2s ease,box-shadow .2s ease}.ri-annotationInput{font-size:14px;font-weight:500}.ri-annotationTextarea{font-size:13px;resize:vertical;min-height:110px}.ri-annotationInput:focus,.ri-annotationTextarea:focus{border-color:#38dbf0;box-shadow:0 0 0 3px #38dbf01f}.ri-annotationActions{display:flex;align-items:center;gap:10px}.ri-annotationOkBtn{border:0;border-radius:8px;background:#38dbf0cc;color:#06343c;padding:8px 18px;font-size:13px;font-weight:600;cursor:pointer;transition:background-color .2s ease,opacity .2s ease}.ri-annotationOkBtn:hover:not(:disabled){background:#38dbf0}.ri-annotationOkBtn:disabled,.ri-annotationOkBtn.disabled{opacity:.5;cursor:not-allowed}.ri-annotationCancelBtn{border:1px solid rgba(255,255,255,.12);background:transparent;color:#9ca3af;border-radius:8px;padding:8px 12px;font-size:13px;cursor:pointer;transition:background-color .2s ease,border-color .2s ease}.ri-annotationCancelBtn:hover{background:#ffffff0d;border-color:#fff3}.ri-annotationIcons{margin-left:auto;display:flex;align-items:center;gap:12px;color:#9ca3af}.ri-annotationIcons svg{flex-shrink:0}.ri-viewAnnotationPopup{position:relative;background:#141414d9;border:1px solid rgba(255,255,255,.12);border-radius:8px;padding:12px 16px;min-width:200px;max-width:min(280px,calc(100vw - 48px));box-shadow:0 8px 24px #00000080;pointer-events:auto;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);animation:ri-viewAnnotationFadeIn .15s ease-out;margin-left:24px;margin-top:-20px;isolation:isolate;z-index:1000}.ri-viewAnnotationClose{background:transparent;border:none;color:#b7bdc6;cursor:pointer;font-size:18px;padding:0 4px;transition:color .2s;line-height:1}.ri-viewAnnotationClose:hover{color:#e2e8f0}.ri-viewAnnotationDescription{margin:0;color:#cbd5e1;font-size:13px;line-height:1.4;word-wrap:break-word}@keyframes ri-viewAnnotationFadeIn{0%{opacity:0;transform:translateY(-6px) scale(.96)}to{opacity:1;transform:translateY(0) scale(1)}}.ri-annotationNavSingle{position:absolute;bottom:120px;left:50%;transform:translate(-50%);z-index:10;display:flex;flex-direction:column;align-items:center;gap:10px;pointer-events:none}.ri-annotationNavSingle>*{pointer-events:auto}.ri-navBadge{background:#ffffff1a;padding:2px 10px;border-radius:4px;font-size:12px;font-weight:400;color:#ffffffb3}.ri-annotationTitleHint{background:#000000b3;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);color:#fff;padding:8px 20px;border-radius:8px;font-size:13px;border:1px solid rgba(255,255,255,.08);text-align:center;max-width:350px;animation:slideUp .3s ease}.ri-annotationHintTitle{font-weight:600;color:#e5e7eb}.ri-annotationHintDesc{font-size:12px;opacity:.6;margin-top:2px;color:#d1d5db}@keyframes slideUp{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.ri-canvasArea .bb-loadingOverlay{position:absolute;inset:0;z-index:12;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:16px;padding:24px;text-align:center;border-radius:14px;background:#0f172a75;backdrop-filter:blur(1px)}.ri-canvasArea .bb-loadingSpinner{width:40px;height:40px;border-radius:999px;border:3px solid rgba(226,232,240,.24);border-top-color:#93c5fd;animation:bb-spin .8s linear infinite}.ri-canvasArea .bb-loadingMessage{max-width:320px;color:#f7f8f9;font-size:13px;font-weight:600;line-height:1.5}.ri-canvasArea .bb-loadingProgressRow{display:flex;align-items:center;gap:8px;width:100%;max-width:240px}.ri-canvasArea .bb-loadingProgress{flex:1;height:6px;border-radius:999px;background:#e2e8f03d;overflow:hidden}.ri-canvasArea .bb-loadingProgress__bar{height:100%;border-radius:inherit;background:#93c5fd}.ri-canvasArea .bb-loadingProgress__label{flex-shrink:0;min-width:34px;text-align:right;color:#f7f8f9;font-size:12px;font-weight:600;font-variant-numeric:tabular-nums}.ri-largeModelBanner{position:absolute;top:12px;left:50%;transform:translate(-50%);z-index:20;display:flex;align-items:center;gap:8px;padding:7px 12px 7px 10px;border-radius:8px;background:#1e1400e0;border:1px solid rgba(251,191,36,.35);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);color:#fbbf24;font-size:12px;font-weight:500;line-height:1.4;pointer-events:auto;max-width:calc(100% - 32px);white-space:normal;text-align:center}.ri-largeModelBanner--offset{top:64px}.ri-largeModelBanner__icon{flex-shrink:0}.ri-largeModelBanner__dismiss{flex-shrink:0;display:flex;align-items:center;justify-content:center;margin-left:4px;padding:2px;background:none;border:none;border-radius:4px;color:#fbbf24b3;cursor:pointer;transition:color .15s ease,background .15s ease}.ri-largeModelBanner__dismiss:hover{color:#fbbf24;background:#fbbf241f}.ri-uvCheckerBanner{position:absolute;top:12px;right:12px;z-index:20;display:flex;align-items:center;gap:8px;max-width:min(360px,calc(100% - 24px));padding:7px 11px;border:1px solid rgba(244,114,182,.4);border-radius:8px;background:#280a23e6;color:#f9a8d4;font-size:12px;font-weight:500;line-height:1.4;text-align:left;pointer-events:none;backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px)}.ri-uvCheckerBanner__icon{flex-shrink:0}@media(max-width:768px){.ri-xrTools{gap:6px}.ri-xrButton{height:34px;gap:6px;padding:0 8px;font-size:11px}.ri-xrButton svg{width:14px;height:14px}.ri-xrButtonPrefix{display:none}.ri-annotationNavSingle{bottom:100px}.ri-navButtonSingle{padding:8px 20px;font-size:13px;min-width:110px}.ri-annotationTitleHint{padding:6px 14px;font-size:12px;max-width:250px}.ri-viewAnnotationPopup{min-width:160px;max-width:220px;padding:10px 12px}.ri-viewAnnotationTitle{font-size:13px}.ri-viewAnnotationDescription{font-size:12px}.ri-buttonContainer{flex-wrap:wrap;gap:6px}.ri-tourControls,.ri-rightControls{flex-wrap:wrap}}@media(max-width:480px){.ri-xrTools{gap:5px}.ri-xrButton{height:34px;gap:5px;font-size:10px}.ri-xrButton svg{width:13px;height:13px}.ri-annotationNavSingle{bottom:80px}.ri-navButtonSingle{padding:6px 16px;font-size:12px;min-width:90px;gap:6px}.ri-annotationTitleHint{padding:4px 10px;font-size:11px;max-width:200px}.ri-navBadge{font-size:10px;padding:1px 6px}.ri-tourButton{padding:0 8px;font-size:12px}.ri-tourButton span{display:none}.ri-downloadButton{padding:0 10px;font-size:12px}.ri-downloadButton span{display:none}}.ri-loadError{position:absolute;inset:0;z-index:5;display:flex;align-items:center;justify-content:center;padding:16px;pointer-events:none}.ri-loadError__card{display:flex;flex-direction:column;gap:8px;width:min(460px,100%);padding:18px 22px;border-radius:10px;color:var(--ri-license-overlay-error-text, #c0392b);background:var(--ri-license-overlay-error-bg, rgba(255, 245, 244, .96));border:1px solid var(--ri-license-overlay-error-border, rgba(192, 57, 43, .2));box-shadow:0 18px 42px #0f172a1f;pointer-events:auto}.ri-loadError__header{display:flex;align-items:center;gap:8px}.ri-loadError__title{font-size:14px;font-weight:700;line-height:1.3}.ri-loadError__detail{margin:0;font-size:13px;line-height:1.5;color:var(--ri-license-overlay-text, #374151)}.ri-loadError__source,.ri-loadError__technical{margin:0;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;line-height:1.45;overflow-wrap:anywhere;color:var(--ri-license-overlay-text, #374151);opacity:.75}.ri-loadError__technical{opacity:.55}.ri-overlay{position:absolute;inset:0;z-index:5;pointer-events:none}.ri-overlay>*{pointer-events:auto}.ri-license-overlay{display:flex;flex-direction:column;gap:10px;min-width:min(420px,calc(100% - 32px));max-width:min(460px,calc(100% - 32px));padding:20px 28px;border-radius:10px;color:var(--ri-license-overlay-text, #374151);background:var(--ri-license-overlay-bg, rgba(0, 0, 0, .04));border:1px solid var(--ri-license-overlay-border, rgba(0, 0, 0, .08));box-shadow:0 18px 42px #0f172a14}.ri-license-overlay__header{display:flex;align-items:center;gap:10px}.ri-license-overlay__statusDot{width:10px;height:10px;border-radius:999px;background:currentColor;opacity:.7;flex-shrink:0}.ri-license-overlay__icon{flex-shrink:0}.ri-license-overlay__title{font-size:14px;font-weight:700;line-height:1.2}.ri-license-overlay__message{margin:0;font-size:14px;font-weight:500;line-height:1.5}.ri-license-overlay--error{color:var(--ri-license-overlay-error-text, #c0392b);background:var(--ri-license-overlay-error-bg, rgba(192, 57, 43, .06));border:1px solid var(--ri-license-overlay-error-border, rgba(192, 57, 43, .2))}.ri-annotationMarker--hovered{transform:scale(1.08);box-shadow:0 12px 28px #0f172a2e;background:#282828eb}.ri-viewAnnotationHeader{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}.ri-viewAnnotationTitle{margin:0;color:#e2e8f0;font-size:14px;font-weight:600}.mc__wrapper{position:absolute;bottom:-10px;left:50%;transform:translate(-50%);display:flex;flex-direction:column;align-items:center;z-index:100}.mc__dpad{display:flex;flex-direction:column;align-items:center;gap:2px;margin-bottom:20px}.mc__middle-row{display:flex;align-items:center;gap:2px}.mc__joystick{width:60px;height:60px;flex-shrink:0;background:radial-gradient(circle at 40% 35%,#ffffff12,#0000008c);border-radius:50%;border:1.5px solid rgba(255,255,255,.15);position:relative;cursor:grab;touch-action:none;transition:border-color .2s ease,box-shadow .2s ease;margin:4px;box-shadow:0 4px 16px #00000080,0 0 0 4px #ffffff08}.mc__joystick:hover{border-color:#ffffff47;box-shadow:0 4px 20px #0000008c,0 0 0 4px #4285f414}.mc__joystick:active{cursor:grabbing;border-color:#4285f499;box-shadow:0 2px 12px #00000080,0 0 4px #4285f426}.mc__knob{position:absolute;top:50%;left:50%;width:34px;height:34px;margin-left:-17px;margin-top:-17px;background:linear-gradient(145deg,#5a9bf5,#1a66d9);border-radius:50%;cursor:grab;box-shadow:0 3px 10px #1a66d980,0 1px #ffffff40 inset;transition:transform .04s linear,box-shadow .1s ease;border:1.5px solid rgba(255,255,255,.45)}.mc__joystick:active .mc__knob{box-shadow:0 2px 16px #4285f4b3,0 1px #ffffff40 inset;animation:pulse .6s ease infinite}.mc__arrow{padding:0;margin:0;background:transparent;border:none;border-radius:0;box-shadow:none;outline:none;-webkit-appearance:none;appearance:none;cursor:pointer;display:flex;align-items:center;justify-content:center;touch-action:manipulation;user-select:none;-webkit-tap-highlight-color:transparent;transition:transform .1s ease,filter .15s ease;overflow:visible}.mc__arrow svg{display:block!important;pointer-events:none!important;user-select:none!important;-webkit-user-select:none!important;overflow:visible!important}.mc__arrow--up{margin-bottom:2px}.mc__arrow--up:hover{transform:scale(1.15) translateY(-2px);filter:drop-shadow(0 4px 12px rgba(66,133,244,.8))}.mc__arrow--up:active{transform:scale(.92) translateY(2px)}.mc__arrow--down{margin-top:2px}.mc__arrow--down:hover{transform:scale(1.15) translateY(2px);filter:drop-shadow(0 -4px 12px rgba(66,133,244,.8))}.mc__arrow--down:active{transform:scale(.92) translateY(-2px)}.mc__arrow--left{margin-right:2px}.mc__arrow--left:hover{transform:scale(1.15) translate(-2px);filter:drop-shadow(4px 0 12px rgba(66,133,244,.8))}.mc__arrow--left:active{transform:scale(.92) translate(2px)}.mc__arrow--right{margin-left:2px}.mc__arrow--right:hover{transform:scale(1.15) translate(2px);filter:drop-shadow(-4px 0 12px rgba(66,133,244,.8))}.mc__arrow--right:active{transform:scale(.92) translate(-2px)}@keyframes pulse{0%,to{box-shadow:0 2px 16px #4285f499,0 1px #ffffff40 inset;opacity:.85}50%{box-shadow:0 4px 24px #4285f4f2,0 1px #ffffff40 inset;opacity:1}}@media(max-width:768px){.mc__wrapper{bottom:-5px}.mc__joystick{width:68px;height:68px}.mc__knob{width:30px;height:30px;margin-left:-15px;margin-top:-15px}.mc__arrow--up:hover{transform:scale(1.1) translateY(-1px)}.mc__arrow--down:hover{transform:scale(1.1) translateY(1px)}.mc__arrow--left:hover{transform:scale(1.1) translate(-1px)}.mc__arrow--right:hover{transform:scale(1.1) translate(1px)}}@media(max-width:480px){.mc__joystick{width:56px;height:56px}.mc__knob{width:26px;height:26px;margin-left:-13px;margin-top:-13px}.mc__arrow--up{margin-bottom:1px}.mc__arrow--down{margin-top:1px}.mc__arrow--left{margin-right:1px}.mc__arrow--right{margin-left:1px}}@media(hover:none){.mc__arrow:hover{transform:none!important;filter:none!important}.mc__arrow:active{transform:scale(.92)!important}}.left-panel{width:280px;min-height:0;background:var(--ri-databinding-bg, #111318);border-right:1px solid var(--ri-databinding-border, rgba(255, 255, 255, .06));display:flex;flex-direction:column;padding:24px 18px;overflow-y:auto;font-family:var( --ri-databinding-font-family, "Inter", "Segoe UI", sans-serif );flex-shrink:0;transition:margin-left .45s cubic-bezier(.4,0,.2,1);box-shadow:var(--ri-databinding-shadow, 4px 0 24px rgba(0, 0, 0, .35))}.left-panel--open{margin-left:0}.left-panel--closed{margin-left:-280px}.left-panel::-webkit-scrollbar{width:4px}.left-panel::-webkit-scrollbar-track{background:transparent}.left-panel::-webkit-scrollbar-thumb{background:var(--ri-databinding-border-strong, rgba(255, 255, 255, .08));border-radius:4px}.left-panel__header{display:flex;align-items:center;justify-content:space-between;margin-bottom:16px;padding-bottom:14px;border-bottom:1px solid var(--ri-databinding-border-strong, rgba(255, 255, 255, .08))}.left-panel__title{font-size:14px;font-weight:600;color:var(--ri-databinding-text, #f1f5f9);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-right:8px;margin:0;letter-spacing:.02em}.left-panel__close-btn{width:26px;height:26px;display:flex;align-items:center;justify-content:center;background:var(--ri-databinding-surface, rgba(255, 255, 255, .03));border:1px solid var(--ri-databinding-border-strong, rgba(255, 255, 255, .08));border-radius:6px;color:var(--ri-databinding-text-subtle, #64748b);font-size:13px;flex-shrink:0;cursor:pointer;transition:background .15s ease,color .15s ease,border-color .15s ease}.left-panel__close-btn:hover{background:var(--ri-databinding-surface-hover, rgba(255, 255, 255, .06));color:var(--ri-databinding-text-hover, #cbd5e1);border-color:var(--ri-databinding-border-hover, rgba(255, 255, 255, .15))}.left-panel__data{padding:12px 6px;background:var(--ri-databinding-surface, rgba(255, 255, 255, .03));border:1px solid var(--ri-databinding-border-strong, rgba(255, 255, 255, .08));border-radius:10px;font-size:11px;font-family:var( --ri-databinding-mono-font-family, "JetBrains Mono", "Fira Code", "Menlo", monospace );color:var(--ri-databinding-text-muted, #94a3b8);line-height:1.7;overflow-x:auto;margin-bottom:18px}.left-panel__divider{border:none;border-top:1px solid var(--ri-databinding-border, rgba(255, 255, 255, .06));margin-bottom:16px}.left-panel__actions-label{font-size:10px;font-weight:600;color:var(--ri-databinding-text-faint, #475569);text-transform:uppercase;letter-spacing:.12em;margin-bottom:10px}.left-panel__actions-list{display:flex;flex-direction:column;gap:6px}.left-panel__action-extra{display:grid;grid-template-rows:0fr;opacity:0;margin-top:0;transition:grid-template-rows .28s cubic-bezier(.4,0,.2,1),opacity .2s ease,margin-top .28s cubic-bezier(.4,0,.2,1)}.left-panel__action-extra--open{grid-template-rows:1fr;opacity:1;margin-top:4px}.left-panel__action-extra-inner{overflow:hidden;min-height:0}.left-panel__action-btn{position:relative;padding:9px 14px;border-radius:8px;text-align:left;font-size:13px;font-weight:500;cursor:pointer;overflow:hidden;border:1px solid var(--ri-databinding-border-strong, rgba(255, 255, 255, .08));background:var(--ri-databinding-surface, rgba(255, 255, 255, .03));color:var(--ri-databinding-text-muted, #94a3b8);letter-spacing:.01em}.left-panel__action-btn:active{transform:scale(.97)}.left-panel__action-btn--active:before{content:"";position:absolute;left:0;top:20%;bottom:20%;width:3px;background:var(--ri-databinding-accent, #93c5fd);border-radius:0 3px 3px 0;box-shadow:0 0 8px var(--ri-databinding-accent-glow, rgba(147, 197, 253, .8))}.left-panel__action-btn--active:hover{background:var( --ri-databinding-accent-gradient, linear-gradient(135deg, #1e3a8a 0%, #1d4ed8 60%, #2563eb 100%) );border-color:var(--ri-databinding-accent-border, rgba(96, 165, 250, .55))}.left-panel__action-btn--active:active{transform:scale(.97);background:var( --ri-databinding-accent-gradient-active, linear-gradient(135deg, #1e3a8a 0%, #1e40af 100%) )}.left-panel__data{display:flex;flex-direction:column;gap:2px;margin-bottom:18px}.left-panel__data-row{display:flex;align-items:baseline;justify-content:space-between;gap:10px;padding:7px 10px;border-radius:7px;background:var(--ri-databinding-surface, rgba(255, 255, 255, .03));border:1px solid transparent;transition:background .15s ease,border-color .15s ease}.left-panel__data-row:hover{background:var(--ri-databinding-surface-hover, rgba(255, 255, 255, .06));border-color:var(--ri-databinding-border-strong, rgba(255, 255, 255, .08))}.left-panel__data-key{font-size:11px;font-weight:600;color:var(--ri-databinding-text-faint, #475569);text-transform:uppercase;letter-spacing:.07em;white-space:nowrap;flex-shrink:0}.left-panel__data-value{font-size:12px;font-family:var( --ri-databinding-mono-font-family, "JetBrains Mono", "Fira Code", "Menlo", monospace );text-align:right;overflow-wrap:anywhere;word-break:break-word;min-width:0}.left-panel__data-group{display:flex;flex-direction:column;gap:2px;padding:7px 10px;border-radius:7px;background:var(--ri-databinding-surface, rgba(255, 255, 255, .03));border:1px solid transparent;transition:background .15s ease,border-color .15s ease}.left-panel__data-group:hover{background:var(--ri-databinding-surface-hover, rgba(255, 255, 255, .06));border-color:var(--ri-databinding-border-strong, rgba(255, 255, 255, .08))}.left-panel__data-children{display:flex;flex-direction:column;gap:2px;margin-top:4px;padding-left:10px;border-left:1px solid var(--ri-databinding-border-strong, rgba(255, 255, 255, .08))}.left-panel__data-children .left-panel__data-row,.left-panel__data-children .left-panel__data-group{padding:3px 0;background:transparent;border-color:transparent}.left-panel__data-children .left-panel__data-row:hover,.left-panel__data-children .left-panel__data-group:hover{background:transparent}@media(max-width:900px){.left-panel{width:50vw}.left-panel--open{margin-left:0}.left-panel--closed{margin-left:-50vw}.left-panel{padding:18px 12px}.left-panel__data-row{flex-direction:column;align-items:stretch;gap:2px;padding:6px 8px}.left-panel__data-group{padding:6px 8px}.left-panel__data-value{text-align:left;font-size:11.5px}.left-panel__data-children{padding-left:8px}}.ri-sidepanel-wrap{height:100%;transition:width .45s cubic-bezier(.4,0,.2,1);overflow:visible}.ri-sidepanel-wrap--open{width:300px;flex-shrink:0}.ri-sidepanel-wrap--closed{width:0;flex-shrink:0;overflow:hidden}.ri-sidepanel__open-btn{position:absolute;top:12px;right:12px;display:flex;align-items:center;gap:7px;padding:7px 13px;border-radius:7px;border:1px solid var(--ri-sidepanel-border-strong, rgba(255, 255, 255, .08));background:var(--ri-sidepanel-open-btn-bg, rgba(20, 20, 20, .82));cursor:pointer;font-size:13px;font-weight:500;color:var(--ri-sidepanel-text-muted, #94a3b8);z-index:190;transition:background .15s}.ri-sidepanel__open-btn:hover{background:var(--ri-sidepanel-open-btn-bg-hover, #27282b7e)}.ri-sidepanel{position:absolute;top:0;right:0;width:300px;height:100%;background:var(--ri-sidepanel-bg, #141824);display:flex;flex-direction:column;font-family:var( --ri-sidepanel-font-family, Inter, "Segoe UI", Helvetica, Arial, sans-serif );transform:translate(100%);transition:transform .45s cubic-bezier(.4,0,.2,1);z-index:200;border-left:1px solid var(--ri-sidepanel-border, rgba(255, 255, 255, .06));box-shadow:var(--ri-sidepanel-shadow-right, -4px 0 24px rgba(0, 0, 0, .35))}.ri-sidepanel--open{transform:translate(0)}.ri-sidepanel--closed{transform:translate(100%)}.ri-sidepanel__header{padding:24px 20px 16px;border-bottom:1px solid var(--ri-sidepanel-border-strong, rgba(255, 255, 255, .08))}.ri-sidepanel__header-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:4px}.ri-sidepanel__eyebrow{font-size:10px;font-weight:700;letter-spacing:.12em;color:var(--ri-sidepanel-text-subtle, #64748b);text-transform:uppercase}.ri-sidepanel__title{font-size:22px;font-weight:700;color:var(--ri-sidepanel-text, #f1f5f9);margin:0;line-height:1.2}.ri-sidepanel__close-btn{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:8px;border:1px solid var(--ri-sidepanel-border-strong, rgba(255, 255, 255, .08));background:var(--ri-sidepanel-surface, rgba(255, 255, 255, .05));cursor:pointer;color:var(--ri-sidepanel-text-muted, #94a3b8);transition:background .15s,color .15s;flex-shrink:0}.ri-sidepanel__close-btn:hover{background:var(--ri-sidepanel-surface-hover, rgba(255, 255, 255, .1));color:var(--ri-sidepanel-text, #f1f5f9)}.ri-sidepanel__search-wrap{padding:14px 16px;border-bottom:1px solid var(--ri-sidepanel-border-strong, rgba(255, 255, 255, .08))}.ri-sidepanel__search{width:100%;padding:10px 14px;border-radius:10px;border:1px solid var(--ri-sidepanel-border-strong, rgba(255, 255, 255, .08));background:var(--ri-sidepanel-surface, rgba(255, 255, 255, .05));color:var(--ri-sidepanel-text, #e2e8f0);font-size:13px;outline:none;box-sizing:border-box;transition:border-color .15s,background .15s}.ri-sidepanel__search::placeholder{color:var(--ri-sidepanel-placeholder, #475569)}.ri-sidepanel__search:focus{border-color:var(--ri-sidepanel-border-active, rgba(255, 255, 255, .18));background:var(--ri-sidepanel-surface-hover, rgba(255, 255, 255, .08))}.ri-sidepanel__list{display:flex;flex-direction:column;padding:10px 0;overflow-y:auto;flex:1}.ri-sidepanel__list::-webkit-scrollbar{width:4px}.ri-sidepanel__list::-webkit-scrollbar-track{background:transparent}.ri-sidepanel__list::-webkit-scrollbar-thumb{background:var(--ri-sidepanel-surface-hover, rgba(255, 255, 255, .1));border-radius:4px}.ri-sidepanel__row{display:flex;justify-content:space-between;padding:12px 20px;cursor:pointer;width:100%;border:none;background:transparent;color:inherit;font:inherit;text-align:left;appearance:none;-webkit-appearance:none;transition:background .12s;border-bottom:1px solid var(--ri-sidepanel-divider, rgba(255, 255, 255, .04))}.ri-sidepanel__row:hover,.ri-sidepanel__row--hovered{background:var(--ri-sidepanel-surface, rgba(255, 255, 255, .05))}.ri-sidepanel__row--selected{background:var(--ri-sidepanel-accent-soft, rgba(59, 130, 246, .12))}.ri-sidepanel__label{font-size:14px;font-weight:600;color:var(--ri-sidepanel-text-muted, #94a3b8);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ri-sidepanel__label--hovered,.ri-sidepanel__label--selected{color:var(--ri-sidepanel-text-emphasis, #ffffff)}.ri-sidepanel__meta{font-size:12px;color:var(--ri-sidepanel-text-muted, #94a3b8);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ri-sidepanel__vis-btn{display:flex;align-items:center;flex-shrink:0;cursor:pointer;background:none;border:none;padding:0;margin-left:10px}.ri-sidepanel__checkbox{width:16px;height:16px;border-radius:4px;border:1.5px solid var(--ri-sidepanel-border-active, rgba(255, 255, 255, .2));background:transparent;display:flex;align-items:center;justify-content:center;transition:background .15s,border-color .15s}.ri-sidepanel__checkbox--checked{background:var(--ri-sidepanel-accent, #3b82f6);border-color:var(--ri-sidepanel-accent, #3b82f6)}@media(max-width:900px){.ri-sidepanel-wrap--open,.ri-sidepanel{width:50vw}}.bb-loadingOverlay{position:absolute;inset:0;z-index:5;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:16px;padding:24px;text-align:center;border-radius:14px;background:#f8fafcd1;backdrop-filter:blur(2px)}.bb-loadingSpinner{width:40px;height:40px;border-radius:999px;border:3px solid rgba(148,163,184,.3);border-top-color:#2563eb;animation:bb-spin .8s linear infinite}@keyframes bb-spin{to{transform:rotate(360deg)}}.bb-loadingProgressRow{display:flex;align-items:center;gap:8px;width:100%;max-width:240px}.bb-loadingProgress{flex:1;height:6px;border-radius:999px;background:#94a3b84d;overflow:hidden}.bb-loadingProgress__bar{height:100%;border-radius:inherit;background:#2563eb;transition:width .15s ease-out}.bb-loadingProgress__label{flex-shrink:0;min-width:34px;text-align:right;color:#475569;font-size:12px;font-weight:600;font-variant-numeric:tabular-nums}.bb-loadingMessage{max-width:320px;color:#475569;font-size:13px;font-weight:600;line-height:1.5}
|
|
1
|
+
:root{--ri-styles-model-viewer: 1}.ri-viewer--license-checking,.ri-viewer--license-invalid{display:flex;align-items:center;justify-content:center;width:100%;height:100%;background-color:#f9f9f9}.ri-viewer{--ri-font-family: Inter, "Segoe UI", Helvetica, Arial, sans-serif;--ri-viewer-bg: #1c1c1d;--ri-viewer-text: #111827;--ri-panel-bg: #ffffff;--ri-panel-border: #e5e7eb;--ri-panel-title: #111827;--ri-panel-muted-text: #4b5563;--ri-panel-subtle-text: #9ca3af;--ri-panel-surface: #f9fafb;--ri-panel-surface-hover: #f3f4f6;--ri-panel-surface-border: #e5e7eb;--ri-panel-button-text: #1f2937;--ri-panel-accent: #2563eb;--ri-panel-accent-contrast: #ffffff;--ri-license-overlay-bg: rgba(0, 0, 0, .04);--ri-license-overlay-border: rgba(0, 0, 0, .08);--ri-license-overlay-text: #888;--ri-license-overlay-error-bg: rgba(192, 57, 43, .06);--ri-license-overlay-error-border: rgba(192, 57, 43, .2);--ri-license-overlay-error-text: #c0392b;--ri-sidepanel-font-family: Inter, "Segoe UI", Helvetica, Arial, sans-serif;--ri-sidepanel-bg: var(--ri-databinding-bg, #111318);--ri-sidepanel-open-btn-bg: rgba(20, 20, 20, .82);--ri-sidepanel-open-btn-bg-hover: #27282b7e;--ri-sidepanel-border: rgba(255, 255, 255, .06);--ri-sidepanel-divider: rgba(255, 255, 255, .04);--ri-sidepanel-border-strong: rgba(255, 255, 255, .08);--ri-sidepanel-border-active: rgba(255, 255, 255, .18);--ri-sidepanel-shadow-left: 4px 0 24px rgba(0, 0, 0, .35);--ri-sidepanel-shadow-right: -4px 0 24px rgba(0, 0, 0, .35);--ri-sidepanel-text: var(--ri-databinding-text, #f1f5f9);--ri-sidepanel-text-emphasis: var(--ri-databinding-text-hover, #cbd5e1);--ri-sidepanel-text-muted: var(--ri-databinding-text-muted, #94a3b8);--ri-sidepanel-text-subtle: var(--ri-databinding-text-subtle, #64748b);--ri-sidepanel-placeholder: var(--ri-databinding-text-faint, #475569);--ri-sidepanel-surface: rgba(255, 255, 255, .05);--ri-sidepanel-surface-hover: rgba(255, 255, 255, .1);--ri-sidepanel-accent: #3b82f6;--ri-sidepanel-accent-soft: rgba(59, 130, 246, .12);--ri-databinding-bg: #111318;--ri-databinding-border: rgba(255, 255, 255, .06);--ri-databinding-border-strong: rgba(255, 255, 255, .08);--ri-databinding-border-hover: rgba(255, 255, 255, .15);--ri-databinding-shadow: 4px 0 24px rgba(0, 0, 0, .35);--ri-databinding-font-family: "Inter", "Segoe UI", sans-serif;--ri-databinding-mono-font-family: "JetBrains Mono", "Fira Code", "Menlo", monospace;--ri-databinding-text: #f1f5f9;--ri-databinding-text-muted: #94a3b8;--ri-databinding-text-subtle: #64748b;--ri-databinding-text-faint: #475569;--ri-databinding-text-hover: #cbd5e1;--ri-databinding-surface: rgba(255, 255, 255, .03);--ri-databinding-surface-hover: rgba(255, 255, 255, .06);--ri-databinding-accent: #93c5fd;--ri-databinding-accent-glow: rgba(147, 197, 253, .8);--ri-databinding-accent-border: rgba(96, 165, 250, .55);--ri-databinding-accent-gradient: linear-gradient( 135deg, #1e3a8a 0%, #1d4ed8 60%, #2563eb 100% );--ri-databinding-accent-gradient-active: linear-gradient( 135deg, #1e3a8a 0%, #1e40af 100% );display:flex;flex-direction:row;width:100%;height:100%;min-height:0;overflow:hidden;background:var(--ri-viewer-bg);position:relative;color:var(--ri-viewer-text);font-family:var(--ri-font-family);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility;font-synthesis:none}.ri-viewer:fullscreen{width:100vw;height:100vh;max-width:none;max-height:none;margin:0}.ri-viewer *{box-sizing:border-box}.ri-viewerLeft{display:flex;flex:1;min-height:0;min-width:0;position:relative}.ri-viewerRight{display:flex;flex-shrink:0;min-width:0}.ri-panel{width:280px;min-height:0;background:var(--ri-panel-bg);border-right:1px solid var(--ri-panel-border);display:flex;flex-direction:column;padding:20px;overflow-y:auto;flex-shrink:0;transition:margin-left .3s ease,transform .3s ease}.ri-panel--open{transform:translate(0);margin-left:0}.ri-panel--closed{transform:translate(-100%);margin-left:-280px}.ri-panelHeader{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:12px}.ri-panelTitle{margin:0;font-size:15px;font-weight:700;color:var(--ri-panel-title);line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ri-closeButton{border:0;background:transparent;color:var(--ri-panel-subtle-text);font-size:22px;line-height:1;padding:0;cursor:pointer;flex-shrink:0;transition:color .2s ease}.ri-closeButton:hover{color:var(--ri-panel-muted-text)}.ri-json{margin:0 0 16px;padding:12px;background:var(--ri-panel-surface);border:1px solid var(--ri-panel-surface-border);border-radius:12px;font-size:12px;line-height:1.55;color:var(--ri-panel-button-text);overflow-x:auto;white-space:pre-wrap;word-break:break-word}.ri-divider{border-top:1px solid var(--ri-panel-border);margin-bottom:12px}.ri-sectionLabel{margin-bottom:8px;font-size:11px;font-weight:700;color:var(--ri-panel-subtle-text);text-transform:uppercase;letter-spacing:.16em}.ri-actionList{display:flex;flex-direction:column;gap:8px}.ri-actionButton{width:100%;border-radius:8px;border:1px solid var(--ri-panel-surface-border);background:var(--ri-panel-surface);color:var(--ri-panel-button-text);padding:10px 12px;text-align:left;font-size:14px;line-height:1.4;cursor:pointer;transition:background-color .2s ease,border-color .2s ease,color .2s ease}.ri-actionButton:hover{background:var(--ri-panel-surface-hover);border-color:var(--ri-panel-border)}.ri-actionButton--active{background:var(--ri-panel-accent);border-color:var(--ri-panel-accent);color:var(--ri-panel-accent-contrast)}.ri-actionButton--active:hover{background:var(--ri-panel-accent);border-color:var(--ri-panel-accent)}.ri-canvasArea{flex:1 1 auto;position:relative;min-width:0}.ri-canvasArea--measuring{cursor:crosshair}.ri-canvasArea canvas{opacity:1;transition:opacity .18s ease}.ri-canvasArea--positioning canvas{opacity:0;transition:none}.ri-bindingsMismatchBanner{position:absolute;top:12px;left:50%;transform:translate(-50%);z-index:20;display:flex;align-items:center;gap:8px;padding:7px 12px 7px 10px;border-radius:8px;background:#1e1400e0;border:1px solid rgba(251,191,36,.35);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);color:#fbbf24;font-size:12px;font-weight:500;line-height:1.4;white-space:nowrap;pointer-events:auto;max-width:calc(100% - 32px);white-space:normal;text-align:center}.ri-bindingsMismatchBanner__icon{flex-shrink:0}.ri-bindingsMismatchBanner__dismiss{flex-shrink:0;display:flex;align-items:center;justify-content:center;margin-left:4px;padding:2px;background:none;border:none;border-radius:4px;color:#fbbf24b3;cursor:pointer;transition:color .15s ease,background .15s ease}.ri-bindingsMismatchBanner__dismiss:hover{color:#fbbf24;background:#fbbf241f}.ri-measureTools,.ri-uvCheckerTools{position:absolute;top:16px;left:16px;z-index:10;display:flex;gap:8px;align-items:center}.ri-measureButton{width:34px;height:34px;padding:0;background:#141414d1;border:1px solid rgba(255,255,255,.12);color:#ffffffbf;border-radius:8px;cursor:pointer;display:flex;align-items:center;justify-content:center;touch-action:manipulation;user-select:none;-webkit-tap-highlight-color:transparent;backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);transition:background .15s ease,color .15s ease,border-color .15s ease}.ri-measureButton:hover{background:#282828eb;color:#fff;border-color:#ffffff40}.ri-measureButton:active{background:#38dbf0;color:#06343c;border-color:#38dbf0}.ri-measureButton--active{background:#22d3ee;border-color:#22d3ee;color:#06343c}.ri-measureButton--active:hover{background:#38dbf0;color:#06343c}.ri-measureHint{padding:6px 10px;border-radius:8px;font-size:12px;line-height:1.35;color:#fff;background:#141414d1;border:1px solid rgba(255,255,255,.12);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);white-space:normal}.ri-measureTools{align-items:flex-start;flex-direction:column;max-width:min(540px,calc(100% - 32px))}.ri-measureToolbarRow{display:flex;align-items:center;flex-wrap:wrap;gap:6px}.ri-measureSelect,.ri-measureFinish{height:34px;padding:0 8px;border:1px solid rgba(255,255,255,.2);border-radius:8px;background:#242424;color:#fff;font:inherit;font-size:12px;cursor:pointer}.ri-measureFinish{background:#22d3ee;color:#06343c}.ri-measureHint--error{color:#facc15}.ri-measureButton:disabled,.ri-measureFinish:disabled{opacity:.4;cursor:not-allowed}.ri-measureSelect:focus-visible,.ri-measureFinish:focus-visible,.ri-measureButton:focus-visible{outline:2px solid #22d3ee;outline-offset:2px}.ri-measureDot.ri-measureDot--snapped{background:#facc15}.ri-measureSnapTarget{width:16px;height:16px;border:2px solid #facc15;background:#facc1533;box-shadow:0 0 0 1px #000;pointer-events:none}.ri-measureSnapLabel{position:absolute;top:22px;left:0;padding:3px 6px;border-radius:4px;background:#facc15;color:#06343c;font-size:12px;pointer-events:none}.ri-explodeTools{position:absolute;top:16px;left:16px;z-index:10;display:flex;gap:8px;align-items:center}.ri-explodeSlider{display:flex;align-items:center;gap:8px;height:34px;padding:0 12px;background:#141414d1;border:1px solid rgba(255,255,255,.12);border-radius:8px;backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px)}.ri-explodeSlider input[type=range]{width:120px;accent-color:#22d3ee;cursor:pointer}.ri-sectionTools{position:absolute;top:16px;left:16px;z-index:10;display:flex;gap:8px;align-items:center}.ri-sectionPanel{display:flex;align-items:center;gap:8px;height:34px;padding:0 6px;background:#141414d1;border:1px solid rgba(255,255,255,.12);border-radius:8px;backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px)}.ri-sectionPanel input[type=range]{width:110px;accent-color:#22d3ee;cursor:pointer}.ri-sectionAxes{display:flex;gap:2px}.ri-sectionAxis{display:inline-flex;align-items:center;justify-content:center;min-width:24px;height:24px;padding:0 6px;font-size:12px;font-weight:600;color:#ffffffbf;background:transparent;border:none;border-radius:6px;cursor:pointer}.ri-sectionAxis:hover{color:#fff;background:#ffffff14}.ri-sectionAxis--active,.ri-sectionAxis--active:hover{background:#22d3ee;color:#06343c}.ri-sectionAxis:focus-visible{outline:2px solid #22d3ee;outline-offset:1px}.ri-decalControl{padding:12px}.ri-decalPosition{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px 0}.ri-decalPosition__label{font-size:13px;font-weight:600}.ri-decalPosition__hint{font-size:11px;opacity:.65;margin-top:4px;max-width:160px}.ri-decalPosition__pad{display:grid;grid-template:repeat(3,30px) / repeat(3,30px);gap:3px;flex-shrink:0}.ri-decalPosition__button{touch-action:none;user-select:none;display:flex;align-items:center;justify-content:center;border:1px solid rgba(148,163,184,.25);border-radius:7px;color:inherit;background:#94a3b81a;cursor:pointer}.ri-decalPosition__button:hover{background:#38bdf833}.ri-decalPosition__button:active{background:#38bdf859}.ri-decalPosition__button:focus-visible{outline:2px solid #38bdf8;outline-offset:2px}.ri-decalPosition__button--up{grid-area:1 / 2}.ri-decalPosition__button--left{grid-area:2 / 1}.ri-decalPosition__button--right{grid-area:2 / 3}.ri-decalPosition__button--down{grid-area:3 / 2}.ri-decalControl__row{display:flex;align-items:center;gap:8px;margin-bottom:8px}.ri-decalControl__input{flex:1;min-width:0;height:34px;padding:0 10px;font:inherit;font-size:13px;color:var(--ri-databinding-text, #f1f5f9);background:#00000040;border:1px solid var(--ri-databinding-border-strong, rgba(255, 255, 255, .08));border-radius:8px}.ri-decalControl__input:focus-visible,.ri-decalControl__chip:focus-visible{outline:2px solid #22d3ee;outline-offset:1px}.ri-decalControl__color{flex-shrink:0;width:34px;height:34px;padding:2px;background:transparent;border:1px solid var(--ri-databinding-border-strong, rgba(255, 255, 255, .08));border-radius:8px;cursor:pointer}.ri-decalControl .ri-uploadButton:disabled{opacity:.5;cursor:not-allowed}.ri-decalControl__hint{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-top:10px;padding:8px 10px;font-size:12px;line-height:1.35;border-radius:8px;border:1px solid rgba(34,211,238,.35);background:#22d3ee14}.ri-decalControl__list{display:flex;flex-wrap:wrap;gap:6px;margin-top:10px}.ri-decalControl__chip{max-width:100%;padding:4px 10px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12px;color:var(--ri-databinding-text, #f1f5f9);background:var(--ri-databinding-surface-hover, rgba(255, 255, 255, .06));border:1px solid var(--ri-databinding-border-strong, rgba(255, 255, 255, .08));border-radius:999px;cursor:pointer}.ri-decalControl__chip--active{background:#22d3ee;border-color:#22d3ee;color:#06343c}.ri-decalControl__editor{margin-top:10px;padding-top:10px;border-top:1px solid var(--ri-databinding-border-strong, rgba(255, 255, 255, .08))}.ri-decalControl__slider{display:grid;grid-template-columns:38px minmax(0,1fr);align-items:center;gap:8px;margin-bottom:6px;font-size:12px;color:var(--ri-databinding-text-muted, #94a3b8)}.ri-decalControl__slider input{width:100%;accent-color:#22d3ee;cursor:pointer}.ri-bottomStack{position:absolute;bottom:12px;left:50%;transform:translate(-50%);z-index:10;display:flex;flex-direction:column;align-items:center;gap:8px;max-width:calc(100% - 24px)}.ri-bottomStack--aboveButtons{bottom:var(--ri-bottom-stack-offset, 56px)}.ri-recordingOverlay{position:absolute;inset:0;z-index:200;display:flex;align-items:flex-end;justify-content:center;padding:0 12px 72px;cursor:wait}.ri-isolationPill{display:flex;align-items:center;gap:10px;max-width:100%;padding:4px 4px 4px 12px;background:#141414d1;border:1px solid rgba(255,255,255,.12);border-radius:10px;backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);color:#ffffffd9;font-size:13px}.ri-isolationPill__label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ri-isolationPill__button{flex-shrink:0;height:28px;padding:0 12px;font-size:13px;font-weight:600;color:#06343c;background:#22d3ee;border:none;border-radius:7px;cursor:pointer}.ri-isolationPill__button:hover{background:#38dbf0}.ri-isolationPill__button:focus-visible{outline:2px solid #fff;outline-offset:1px}.ri-variantPicker{display:flex;gap:4px;max-width:100%;padding:4px;overflow-x:auto;scrollbar-width:none;background:#141414d1;border:1px solid rgba(255,255,255,.12);border-radius:10px;backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px)}.ri-variantPicker::-webkit-scrollbar{display:none}.ri-variantPicker__option{flex-shrink:0;height:28px;padding:0 12px;font-size:13px;font-weight:500;white-space:nowrap;color:#ffffffbf;background:transparent;border:1px solid transparent;border-radius:7px;cursor:pointer;touch-action:manipulation;user-select:none;-webkit-tap-highlight-color:transparent;transition:background .15s ease,color .15s ease}.ri-variantPicker__option:hover{color:#fff;background:#ffffff14}.ri-variantPicker__option--active,.ri-variantPicker__option--active:hover{background:#22d3ee;color:#06343c}.ri-variantPicker__option:focus-visible{outline:2px solid #22d3ee;outline-offset:1px}.ri-cinematicTools{position:absolute;left:16px;z-index:10;display:flex;gap:8px;align-items:center}.ri-measureDot{width:10px;height:10px;border-radius:50%;background:#22d3ee;border:2px solid #fff;box-shadow:0 0 0 1px #0006;pointer-events:none}.ri-measureLabel{padding:3px 7px;border-radius:6px;font-size:12px;font-weight:600;line-height:1;white-space:nowrap;color:#06343c;background:#22d3ee;box-shadow:0 1px 4px #00000059;pointer-events:none;user-select:none}.ri-xrTools{position:absolute;left:16px;z-index:10;display:flex;gap:8px;align-items:center}.ri-xrButton{display:inline-flex;align-items:center;gap:8px;height:34px;padding:0 10px;font-size:13px;font-weight:500;color:#fff;background:#141414d1;border:1px solid rgba(255,255,255,.16);border-radius:8px;cursor:pointer;touch-action:manipulation;user-select:none;-webkit-tap-highlight-color:transparent;backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);transition:background .15s ease,border-color .15s ease}.ri-xrButton:hover{background:#282828eb;border-color:#ffffff4d}.ri-mobileHandoffBackdrop{position:absolute;z-index:30;inset:0;display:grid;place-items:center;padding:20px;background:#020617ad;backdrop-filter:blur(5px);-webkit-backdrop-filter:blur(5px)}.ri-mobileHandoffDialog{position:relative;display:flex;width:min(100%,300px);flex-direction:column;align-items:center;padding:16px;text-align:center;color:#e2e8f0;background:#0f172a;border:1px solid rgba(148,163,184,.3);border-radius:16px;box-shadow:0 24px 80px #00000080}.ri-mobileHandoffDialog>svg{color:#67e8f9}.ri-mobileHandoffDialog h2{margin:12px 0 0;font-size:18px;line-height:1.25;color:#fff}.ri-mobileHandoffDialog p{margin:8px 0 16px;font-size:13px;line-height:1.5;color:#cbd5e1}.ri-mobileHandoffQr{display:grid;place-items:center;padding:10px;background:#fff;border-radius:10px}.ri-mobileHandoffDialog a{margin-top:16px;font-size:13px;font-weight:600;color:#a5f3fc;text-decoration:underline;text-underline-offset:3px}.ri-mobileHandoffClose{position:absolute;top:10px;right:10px;display:grid;width:30px;height:30px;place-items:center;padding:0;color:#cbd5e1;background:transparent;border:0;border-radius:6px;cursor:pointer}.ri-mobileHandoffClose:hover{color:#fff;background:#ffffff1a}.ri-arHintOverlay{position:absolute;top:18px;left:50%;transform:translate(-50%);z-index:10;width:min(calc(100% - 32px),360px);pointer-events:none}.ri-arHint{margin:0 auto;width:fit-content;max-width:100%;padding:6px 12px;font-size:11px;font-weight:500;line-height:1.2;text-align:center;color:#ffffffeb;background:#14141494;border:1px solid rgba(255,255,255,.12);border-radius:999px;user-select:none;backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px)}.ri-arOverlay{position:absolute;bottom:24px;left:50%;transform:translate(-50%);z-index:10;width:min(calc(100% - 32px),420px);pointer-events:none}.ri-arControls{display:flex;flex-direction:column;align-items:center;gap:10px}.ri-arStatus,.ri-arActionButton{max-width:100%;padding:8px 16px;font-size:13px;font-weight:600;line-height:1.3;text-align:center;white-space:nowrap;color:#fff;background:#141414d1;border:1px solid rgba(255,255,255,.16);border-radius:19px;user-select:none;backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px)}.ri-arStatus{pointer-events:none}.ri-arActionButton{display:inline-flex;align-items:center;justify-content:center;gap:6px;cursor:pointer;pointer-events:auto;touch-action:manipulation;-webkit-tap-highlight-color:transparent;transition:background .15s ease,border-color .15s ease,color .15s ease,transform .15s ease}.ri-arActionButton svg{flex-shrink:0}.ri-arActionButton:hover{background:#282828eb;border-color:#ffffff4d}.ri-arActionButton:active{transform:scale(.98)}.ri-arActionButton--primary{color:#06343c;background:#22d3ee;border-color:transparent;box-shadow:0 1px 4px #00000059}.ri-arActionButton--primary:hover{background:#67e8f9;border-color:transparent}.ri-arActionButton.ri-arActionButton--active,.ri-arActionButton[aria-pressed=true],.ri-arActionButton.ri-arActionButton--active:hover,.ri-arActionButton[aria-pressed=true]:hover,.ri-arActionButton.ri-arActionButton--active:active,.ri-arActionButton[aria-pressed=true]:active{color:#06343c;background:#22d3ee;border-color:transparent;box-shadow:0 1px 4px #00000059}.ri-hiddenInput{display:none}.ri-popover{position:absolute;z-index:50;background:#fff;border:1px solid #e5e7eb;border-radius:16px;box-shadow:0 24px 48px #0f172a2e;color:#111827}.ri-popover--inline{position:static;z-index:auto;width:100%;border-radius:10px;box-shadow:none}.ri-popover--inline .react-colorful{width:100%}.ri-popover--inline{background:var(--ri-databinding-surface, rgba(255, 255, 255, .03));border-color:var(--ri-databinding-border-strong, rgba(255, 255, 255, .08));color:var(--ri-databinding-text, #f1f5f9)}.ri-popover--inline .ri-popoverHeader{border-bottom-color:var( --ri-databinding-border-strong, rgba(255, 255, 255, .08) )}.ri-popover--inline .ri-popoverLabel,.ri-popover--inline .ri-colorCode{color:var(--ri-databinding-text-muted, #94a3b8)}.ri-popover--inline .ri-secondaryButton{background:var(--ri-databinding-surface-hover, rgba(255, 255, 255, .06));border-color:var(--ri-databinding-border-strong, rgba(255, 255, 255, .08));color:var(--ri-databinding-text, #f1f5f9)}.ri-popover--inline .ri-secondaryButton:hover{background:#ffffff1f}.ri-popover--inline .ri-previewFrame{border-color:var(--ri-databinding-border-strong, rgba(255, 255, 255, .08))}.ri-popover--inline .ri-emptyState{border-color:var(--ri-databinding-border-hover, rgba(255, 255, 255, .15));color:var(--ri-databinding-text-subtle, #64748b)}.ri-popover--inline .ri-uploadButton{background:var(--ri-databinding-accent-gradient, #2563eb);color:#fff}.ri-popover--inline .ri-uploadButton:hover{background:var(--ri-databinding-accent-gradient-active, #1d4ed8)}.ri-popover--inline .ri-removeButton{background:transparent;border-color:var(--ri-databinding-border-strong, rgba(255, 255, 255, .08));color:var(--ri-databinding-text-muted, #94a3b8)}.ri-popover--inline .ri-removeButton:hover{background:var(--ri-databinding-surface-hover, rgba(255, 255, 255, .06))}.ri-popover--inline .ri-formatHint{color:var(--ri-databinding-text-subtle, #64748b)}.ri-popoverHeader{padding:12px 16px}.ri-popoverLabel{margin:0 0 8px;font-size:11px;font-weight:700;color:#6b7280;text-transform:uppercase;letter-spacing:.16em}.ri-inlineRow{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-top:8px}.ri-colorCode{font-size:12px;color:#9ca3af;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;text-transform:uppercase}.ri-secondaryButton{border:1px solid #e5e7eb;background:#f3f4f6;color:#374151;border-radius:8px;padding:6px 10px;font-size:12px;cursor:pointer;transition:background-color .2s ease}.ri-secondaryButton:hover{background:#e5e7eb}.ri-materialBody{display:flex;flex-direction:column;gap:12px;padding-left:12px;padding-right:12px;padding-bottom:12px}.ri-previewFrame{position:relative;height:112px;border-radius:12px;overflow:hidden;border:1px solid #e5e7eb}.ri-previewImage{width:100%;height:100%;object-fit:cover;display:block}.ri-previewCaption{position:absolute;left:0;right:0;bottom:0;background:#0006;padding:4px 8px;color:#fff;font-size:10px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ri-emptyState{height:112px;border-radius:12px;border:2px dashed #e5e7eb;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;color:#d1d5db;text-align:center}.ri-uploadButton{width:100%;border:0;border-radius:10px;background:#111827;color:#fff;padding:10px 12px;font-size:12px;font-weight:600;cursor:pointer;transition:background-color .2s ease}.ri-uploadButton:hover{background:#374151}.ri-removeButton{width:100%;border-radius:10px;border:1px solid #e5e7eb;background:#fff;color:#6b7280;padding:8px 12px;font-size:12px;cursor:pointer;transition:background-color .2s ease}.ri-removeButton:hover{background:#f9fafb}.ri-formatHint{margin:0;text-align:center;font-size:10px;color:#d1d5db}.ri-texturePosition{display:flex;flex-direction:column;gap:8px;padding-top:8px;border-top:1px solid #e5e7eb}.ri-texturePositionLabel{margin:0;font-size:11px;font-weight:600;color:#6b7280}.ri-texturePositionGrid{display:grid;grid-template-columns:1fr 1fr;gap:8px}.ri-texturePositionField{display:flex;flex-direction:column;gap:4px;font-size:11px;color:#6b7280}.ri-texturePositionField--full{grid-column:1 / -1}.ri-texturePositionField input[type=number]{width:100%;border-radius:8px;border:1px solid #e5e7eb;background:#fff;color:#111827;padding:6px 8px;font-size:12px}.ri-texturePositionSliderRow{display:flex;align-items:center;gap:8px}.ri-texturePositionSliderRow input[type=range]{flex:1}.ri-texturePositionSliderRow input[type=number]{width:56px;border-radius:8px;border:1px solid #e5e7eb;background:#fff;color:#111827;padding:6px 8px;font-size:12px}.ri-texturePositionHint{margin:0;font-size:11px;line-height:1.4;color:#9ca3af}.ri-popover--inline .ri-texturePosition{border-color:var(--ri-databinding-border-strong, rgba(255, 255, 255, .08))}.ri-popover--inline .ri-texturePositionLabel,.ri-popover--inline .ri-texturePositionField,.ri-popover--inline .ri-texturePositionHint{color:var(--ri-databinding-text-muted, #94a3b8)}.ri-popover--inline .ri-texturePositionField input[type=number],.ri-popover--inline .ri-texturePositionSliderRow input[type=number]{background:var(--ri-databinding-surface-hover, rgba(255, 255, 255, .06));border-color:var(--ri-databinding-border-strong, rgba(255, 255, 255, .08));color:var(--ri-databinding-text, #e2e8f0)}.ri-buttonContainer{display:flex;justify-content:space-between;align-items:center;gap:8px;position:absolute;bottom:12px;left:12px;right:12px;z-index:10}.ri-tourControls{display:flex;gap:6px;align-items:center;flex-shrink:0}.ri-rightControls{display:flex;gap:6px;align-items:center;flex-shrink:0;margin-left:auto}.ri-rightControls:only-child{margin-left:auto}.ri-navButtonSingle,.ri-tourButton,.ri-resetButton,.ri-downloadButton{height:34px;background:#141414d1;border:1px solid rgba(255,255,255,.12);color:#ffffffbf!important;border-radius:8px;backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);cursor:pointer;transition:background .15s ease,color .15s ease,border-color .15s ease,transform .15s ease;user-select:none;-webkit-tap-highlight-color:transparent}.ri-navButtonSingle:hover:not(:disabled),.ri-tourButton:hover:not(:disabled),.ri-resetButton:hover:not(:disabled){background:#282828eb;color:#fff;border-color:#ffffff40}.ri-navButtonSingle:active:not(:disabled),.ri-tourButton:active:not(:disabled),.ri-resetButton:active:not(:disabled){background:#38dbf0;color:#06343c;border-color:#38dbf0}.ri-navButtonSingle:disabled,.ri-tourButton:disabled,.ri-resetButton:disabled{opacity:.45;cursor:not-allowed}.ri-navButtonSingle{padding:0 16px;font-size:13px;font-weight:500;display:flex;align-items:center;gap:8px;white-space:nowrap}.ri-tourButton{padding:0 12px;font-size:13px;font-weight:500;display:flex;align-items:center;gap:4px;white-space:nowrap}.ri-tourButton svg{width:15px;height:15px;flex-shrink:0}.ri-tourButton--stop{border-color:#f446;color:#ff6b6b}.ri-tourButton--stop:hover:not(:disabled){background:#ff444426;border-color:#f449;color:#ff6b6b}.ri-tourButton--stop:active:not(:disabled){background:#f44;color:#fff;border-color:#f44}.ri-tourButton--next{border-color:#38dbf04d;color:#38dbf0}.ri-tourButton--next:hover:not(:disabled){background:#38dbf01f;border-color:#38dbf080;color:#38dbf0}.ri-tourButton--next:active:not(:disabled){background:#38dbf0;color:#06343c;border-color:#38dbf0}.mv-rightControls{position:absolute;bottom:5px;right:5px;z-index:10000;display:flex;align-items:center;gap:5px;pointer-events:auto}.mv-resetButton,.mv-fullscreenButton,.mv-controllersButton,.mv-downloadButton{height:34px;display:inline-flex;align-items:center;justify-content:center;gap:6px;border:1px solid rgba(255,255,255,.12);border-radius:8px;background:#141414d1;color:#ffffffbf;font-size:13px;font-weight:500;white-space:nowrap;cursor:pointer;user-select:none;-webkit-tap-highlight-color:transparent;backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);transition:background .15s ease,color .15s ease,border-color .15s ease,transform .15s ease,opacity .15s ease}.mv-resetButton:hover:not(:disabled),.mv-fullscreenButton:hover:not(:disabled),.mv-controllersButton:hover:not(:disabled),.mv-downloadButton:hover:not(:disabled){background:#282828eb;color:#fff;border-color:#ffffff40}.mv-resetButton:active:not(:disabled),.mv-fullscreenButton:active:not(:disabled),.mv-controllersButton:active:not(:disabled),.mv-downloadButton:active:not(:disabled){background:#38dbf0;color:#06343c;border-color:#38dbf0}.mv-resetButton:disabled,.mv-fullscreenButton:disabled,.mv-controllersButton:disabled,.mv-downloadButton:disabled{opacity:.45;cursor:not-allowed}.mv-resetButton:focus-visible,.mv-fullscreenButton:focus-visible,.mv-controllersButton:focus-visible,.mv-downloadButton:focus-visible{outline:2px solid rgba(255,255,255,.5);outline-offset:2px}.mv-resetButton,.mv-fullscreenButton{width:34px;padding:0;flex-shrink:0}.mv-resetButton svg,.mv-fullscreenButton svg{width:15px;height:15px;flex-shrink:0;pointer-events:none}.mv-fullscreenWrapper{display:inline-flex}.mv-fullscreenError{position:absolute;bottom:calc(100% + 8px);right:0;width:240px;max-width:calc(100vw - 20px);padding:10px 12px;border:1px solid rgba(255,255,255,.14);border-radius:8px;background:#141414f2;color:#fff;font-size:12px;line-height:1.5}.mv-controllersWrapper{position:relative;display:inline-flex;flex-direction:column;align-items:stretch}.mv-controllersButton{width:34px;padding:0;flex-shrink:0}.mv-controllersButton svg{width:15px;height:15px;flex-shrink:0;pointer-events:none}.mv-controllersMenu{position:absolute;bottom:calc(100% + 6px);right:0;min-width:168px;display:flex;flex-direction:column;padding:6px;border:1px solid rgba(255,255,255,.14);border-radius:10px;background:#141414eb;box-shadow:0 16px 32px #0f172a66;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);z-index:100;animation:mv-menuReveal .12s ease}.mv-controllersMenuItem{display:flex;align-items:center;gap:9px;width:100%;padding:9px 12px;border:none;border-radius:6px;background:transparent;color:#fff;font-size:13px;font-weight:400;text-align:left;white-space:nowrap;cursor:pointer;transition:background .1s ease,color .1s ease}.mv-controllersMenuItem:hover:not(:disabled){background:#ffffff1a}.mv-controllersMenuItem--active{background:#38dbf026;color:#38dbf0;font-weight:600}.mv-controllersMenuItem--active:hover{background:#38dbf038}.mv-downloadWrapper{position:relative;display:inline-flex;flex-direction:column;align-items:stretch}.mv-downloadButton{padding:0 16px;flex-shrink:0}.mv-downloadButton svg{width:15px;height:15px;flex-shrink:0;pointer-events:none}.mv-downloadButton__spinner{display:inline-block;width:13px;height:13px;border:2px solid rgba(255,255,255,.3);border-top-color:#fff;border-radius:50%;animation:mv-spin .7s linear infinite;flex-shrink:0}.mv-downloadMenu{position:absolute;bottom:calc(100% + 6px);right:0;min-width:168px;display:flex;flex-direction:column;padding:6px;border:1px solid rgba(255,255,255,.14);border-radius:10px;background:#141414eb;box-shadow:0 16px 32px #0f172a66;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);overflow:hidden;z-index:100;animation:mv-menuReveal .12s ease}.mv-downloadMenuItem{display:flex;align-items:center;gap:9px;width:100%;padding:10px 14px;border:none;border-radius:6px;background:transparent;color:#fff;font-size:13px;font-weight:400;text-align:left;white-space:nowrap;cursor:pointer;transition:background .1s ease}.mv-downloadMenuItem:hover:not(:disabled){background:#ffffff1a}.mv-downloadMenuItem:disabled{opacity:.4;cursor:not-allowed}.mv-downloadMenuItem select{margin-left:auto;padding:4px 6px;border:1px solid rgba(255,255,255,.2);border-radius:4px;background:#242424;color:#fff;font:inherit}.mv-downloadMenuDivider{height:1px;margin:0 10px;background:#ffffff1a}.mv-downloadMenuNotice{max-width:220px;padding:8px 14px 11px;color:#fca5a5;font-size:11px;line-height:1.4}@keyframes mv-menuReveal{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes mv-spin{to{transform:rotate(360deg)}}@media(max-width:768px){.mv-rightControls{flex-wrap:wrap;gap:6px}.mv-downloadButton{padding:0 10px;font-size:12px}}@media(max-width:480px){.mv-downloadButton{padding:0 10px;font-size:12px}.mv-downloadButton span{display:none}}.ri-annotationMarker{position:relative;width:36px;height:36px;border-radius:50%;background:#141414d1;border:2px solid rgba(255,255,255,.9);color:#fff;display:flex;align-items:center;justify-content:center;font-size:14px;font-weight:700;cursor:pointer;z-index:20;user-select:none;box-shadow:0 2px 8px #00000073;pointer-events:auto;transition:opacity .3s ease,transform .3s ease}.ri-annotationMarker:hover{transform:scale(1.08);box-shadow:0 12px 28px #0f172a2e;background:#282828eb}.ri-annotationPopup{position:absolute;width:min(270px,calc(100vw - 32px));background:#141414d9;border:1px solid rgba(255,255,255,.12);border-radius:16px;padding:16px;z-index:30;display:flex;flex-direction:column;gap:12px;box-shadow:0 24px 48px #0f172a2e;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px)}.ri-annotationInput,.ri-annotationTextarea{width:100%;border:1px solid rgba(255,255,255,.12);background:#ffffff0d;color:#e5e7eb;border-radius:10px;padding:10px 12px;outline:none;font-family:inherit;transition:border-color .2s ease,box-shadow .2s ease}.ri-annotationInput{font-size:14px;font-weight:500}.ri-annotationTextarea{font-size:13px;resize:vertical;min-height:110px}.ri-annotationInput:focus,.ri-annotationTextarea:focus{border-color:#38dbf0;box-shadow:0 0 0 3px #38dbf01f}.ri-annotationActions{display:flex;align-items:center;gap:10px}.ri-annotationOkBtn{border:0;border-radius:8px;background:#38dbf0cc;color:#06343c;padding:8px 18px;font-size:13px;font-weight:600;cursor:pointer;transition:background-color .2s ease,opacity .2s ease}.ri-annotationOkBtn:hover:not(:disabled){background:#38dbf0}.ri-annotationOkBtn:disabled,.ri-annotationOkBtn.disabled{opacity:.5;cursor:not-allowed}.ri-annotationCancelBtn{border:1px solid rgba(255,255,255,.12);background:transparent;color:#9ca3af;border-radius:8px;padding:8px 12px;font-size:13px;cursor:pointer;transition:background-color .2s ease,border-color .2s ease}.ri-annotationCancelBtn:hover{background:#ffffff0d;border-color:#fff3}.ri-annotationIcons{margin-left:auto;display:flex;align-items:center;gap:12px;color:#9ca3af}.ri-annotationIcons svg{flex-shrink:0}.ri-viewAnnotationPopup{position:relative;background:#141414d9;border:1px solid rgba(255,255,255,.12);border-radius:8px;padding:12px 16px;min-width:200px;max-width:min(280px,calc(100vw - 48px));box-shadow:0 8px 24px #00000080;pointer-events:auto;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);animation:ri-viewAnnotationFadeIn .15s ease-out;margin-left:24px;margin-top:-20px;isolation:isolate;z-index:1000}.ri-viewAnnotationClose{background:transparent;border:none;color:#b7bdc6;cursor:pointer;font-size:18px;padding:0 4px;transition:color .2s;line-height:1}.ri-viewAnnotationClose:hover{color:#e2e8f0}.ri-viewAnnotationDescription{margin:0;color:#cbd5e1;font-size:13px;line-height:1.4;word-wrap:break-word}@keyframes ri-viewAnnotationFadeIn{0%{opacity:0;transform:translateY(-6px) scale(.96)}to{opacity:1;transform:translateY(0) scale(1)}}.ri-annotationNavSingle{position:absolute;bottom:120px;left:50%;transform:translate(-50%);z-index:10;display:flex;flex-direction:column;align-items:center;gap:10px;pointer-events:none}.ri-annotationNavSingle>*{pointer-events:auto}.ri-navBadge{background:#ffffff1a;padding:2px 10px;border-radius:4px;font-size:12px;font-weight:400;color:#ffffffb3}.ri-annotationTitleHint{background:#000000b3;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);color:#fff;padding:8px 20px;border-radius:8px;font-size:13px;border:1px solid rgba(255,255,255,.08);text-align:center;max-width:350px;animation:slideUp .3s ease}.ri-annotationHintTitle{font-weight:600;color:#e5e7eb}.ri-annotationHintDesc{font-size:12px;opacity:.6;margin-top:2px;color:#d1d5db}@keyframes slideUp{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.ri-canvasArea .bb-loadingOverlay{position:absolute;inset:0;z-index:12;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:16px;padding:24px;text-align:center;border-radius:14px;background:#0f172a75;backdrop-filter:blur(1px)}.ri-canvasArea .bb-loadingSpinner{width:40px;height:40px;border-radius:999px;border:3px solid rgba(226,232,240,.24);border-top-color:#93c5fd;animation:bb-spin .8s linear infinite}.ri-canvasArea .bb-loadingMessage{max-width:320px;color:#f7f8f9;font-size:13px;font-weight:600;line-height:1.5}.ri-canvasArea .bb-loadingProgressRow{display:flex;align-items:center;gap:8px;width:100%;max-width:240px}.ri-canvasArea .bb-loadingProgress{flex:1;height:6px;border-radius:999px;background:#e2e8f03d;overflow:hidden}.ri-canvasArea .bb-loadingProgress__bar{height:100%;border-radius:inherit;background:#93c5fd}.ri-canvasArea .bb-loadingProgress__label{flex-shrink:0;min-width:34px;text-align:right;color:#f7f8f9;font-size:12px;font-weight:600;font-variant-numeric:tabular-nums}.ri-largeModelBanner{position:absolute;top:12px;left:50%;transform:translate(-50%);z-index:20;display:flex;align-items:center;gap:8px;padding:7px 12px 7px 10px;border-radius:8px;background:#1e1400e0;border:1px solid rgba(251,191,36,.35);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);color:#fbbf24;font-size:12px;font-weight:500;line-height:1.4;pointer-events:auto;max-width:calc(100% - 32px);white-space:normal;text-align:center}.ri-largeModelBanner--offset{top:64px}.ri-largeModelBanner__icon{flex-shrink:0}.ri-largeModelBanner__dismiss{flex-shrink:0;display:flex;align-items:center;justify-content:center;margin-left:4px;padding:2px;background:none;border:none;border-radius:4px;color:#fbbf24b3;cursor:pointer;transition:color .15s ease,background .15s ease}.ri-largeModelBanner__dismiss:hover{color:#fbbf24;background:#fbbf241f}.ri-uvCheckerBanner{position:absolute;top:12px;right:12px;z-index:20;display:flex;align-items:center;gap:8px;max-width:min(360px,calc(100% - 24px));padding:7px 11px;border:1px solid rgba(244,114,182,.4);border-radius:8px;background:#280a23e6;color:#f9a8d4;font-size:12px;font-weight:500;line-height:1.4;text-align:left;pointer-events:none;backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px)}.ri-uvCheckerBanner__icon{flex-shrink:0}@media(max-width:768px){.ri-xrTools{gap:6px}.ri-xrButton{height:34px;gap:6px;padding:0 8px;font-size:11px}.ri-xrButton svg{width:14px;height:14px}.ri-xrButtonPrefix{display:none}.ri-annotationNavSingle{bottom:100px}.ri-navButtonSingle{padding:8px 20px;font-size:13px;min-width:110px}.ri-annotationTitleHint{padding:6px 14px;font-size:12px;max-width:250px}.ri-viewAnnotationPopup{min-width:160px;max-width:220px;padding:10px 12px}.ri-viewAnnotationTitle{font-size:13px}.ri-viewAnnotationDescription{font-size:12px}.ri-buttonContainer{flex-wrap:wrap;gap:6px}.ri-tourControls,.ri-rightControls{flex-wrap:wrap}}@media(max-width:480px){.ri-xrTools{gap:5px}.ri-xrButton{height:34px;gap:5px;font-size:10px}.ri-xrButton svg{width:13px;height:13px}.ri-annotationNavSingle{bottom:80px}.ri-navButtonSingle{padding:6px 16px;font-size:12px;min-width:90px;gap:6px}.ri-annotationTitleHint{padding:4px 10px;font-size:11px;max-width:200px}.ri-navBadge{font-size:10px;padding:1px 6px}.ri-tourButton{padding:0 8px;font-size:12px}.ri-tourButton span{display:none}.ri-downloadButton{padding:0 10px;font-size:12px}.ri-downloadButton span{display:none}}.ri-contextRecovery{position:absolute;inset:0;z-index:20000;display:flex;align-items:center;justify-content:center;padding:20px;background:#0c0e12e6}.ri-contextRecovery__card{width:min(380px,100%);padding:24px;border:1px solid rgba(255,255,255,.14);border-radius:12px;background:#1c1c1d;color:#f3f4f6;box-shadow:0 18px 42px #0000004d}.ri-contextRecovery__card h2{margin:12px 0 8px;font-size:18px;line-height:1.3}.ri-contextRecovery__card p{margin:0 0 18px;color:#b8bec9;font-size:14px;line-height:1.6}.ri-contextRecovery__card button{display:inline-flex;align-items:center;gap:8px;padding:9px 12px;border:1px solid rgba(255,255,255,.25);border-radius:8px;background:#f3f4f6;color:#111827;font:inherit;font-size:13px;font-weight:600;cursor:pointer}.ri-contextRecovery__card button:hover:not(:disabled){background:#fff}.ri-contextRecovery__card button:focus-visible{outline:2px solid #38dbf0;outline-offset:3px}.ri-contextRecovery__card button:disabled{opacity:.5;cursor:wait}.ri-loadError{position:absolute;inset:0;z-index:5;display:flex;align-items:center;justify-content:center;padding:16px;pointer-events:none}.ri-loadError__card{display:flex;flex-direction:column;gap:8px;width:min(460px,100%);padding:18px 22px;border-radius:10px;color:var(--ri-license-overlay-error-text, #c0392b);background:var(--ri-license-overlay-error-bg, rgba(255, 245, 244, .96));border:1px solid var(--ri-license-overlay-error-border, rgba(192, 57, 43, .2));box-shadow:0 18px 42px #0f172a1f;pointer-events:auto}.ri-loadError__header{display:flex;align-items:center;gap:8px}.ri-loadError__title{font-size:14px;font-weight:700;line-height:1.3}.ri-loadError__detail{margin:0;font-size:13px;line-height:1.5;color:var(--ri-license-overlay-text, #374151)}.ri-loadError__source,.ri-loadError__technical{margin:0;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;line-height:1.45;overflow-wrap:anywhere;color:var(--ri-license-overlay-text, #374151);opacity:.75}.ri-loadError__technical{opacity:.55}.ri-overlay{position:absolute;inset:0;z-index:5;pointer-events:none}.ri-overlay>*{pointer-events:auto}.ri-license-overlay{display:flex;flex-direction:column;gap:10px;min-width:min(420px,calc(100% - 32px));max-width:min(460px,calc(100% - 32px));padding:20px 28px;border-radius:10px;color:var(--ri-license-overlay-text, #374151);background:var(--ri-license-overlay-bg, rgba(0, 0, 0, .04));border:1px solid var(--ri-license-overlay-border, rgba(0, 0, 0, .08));box-shadow:0 18px 42px #0f172a14}.ri-license-overlay__header{display:flex;align-items:center;gap:10px}.ri-license-overlay__statusDot{width:10px;height:10px;border-radius:999px;background:currentColor;opacity:.7;flex-shrink:0}.ri-license-overlay__icon{flex-shrink:0}.ri-license-overlay__title{font-size:14px;font-weight:700;line-height:1.2}.ri-license-overlay__message{margin:0;font-size:14px;font-weight:500;line-height:1.5}.ri-license-overlay--error{color:var(--ri-license-overlay-error-text, #c0392b);background:var(--ri-license-overlay-error-bg, rgba(192, 57, 43, .06));border:1px solid var(--ri-license-overlay-error-border, rgba(192, 57, 43, .2))}.ri-annotationMarker--hovered{transform:scale(1.08);box-shadow:0 12px 28px #0f172a2e;background:#282828eb}.ri-viewAnnotationHeader{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}.ri-viewAnnotationTitle{margin:0;color:#e2e8f0;font-size:14px;font-weight:600}.mc__wrapper{position:absolute;bottom:-10px;left:50%;transform:translate(-50%);display:flex;flex-direction:column;align-items:center;z-index:100}.mc__dpad{display:flex;flex-direction:column;align-items:center;gap:2px;margin-bottom:20px}.mc__middle-row{display:flex;align-items:center;gap:2px}.mc__joystick{width:60px;height:60px;flex-shrink:0;background:radial-gradient(circle at 40% 35%,#ffffff12,#0000008c);border-radius:50%;border:1.5px solid rgba(255,255,255,.15);position:relative;cursor:grab;touch-action:none;transition:border-color .2s ease,box-shadow .2s ease;margin:4px;box-shadow:0 4px 16px #00000080,0 0 0 4px #ffffff08}.mc__joystick:hover{border-color:#ffffff47;box-shadow:0 4px 20px #0000008c,0 0 0 4px #4285f414}.mc__joystick:active{cursor:grabbing;border-color:#4285f499;box-shadow:0 2px 12px #00000080,0 0 4px #4285f426}.mc__knob{position:absolute;top:50%;left:50%;width:34px;height:34px;margin-left:-17px;margin-top:-17px;background:linear-gradient(145deg,#5a9bf5,#1a66d9);border-radius:50%;cursor:grab;box-shadow:0 3px 10px #1a66d980,0 1px #ffffff40 inset;transition:transform .04s linear,box-shadow .1s ease;border:1.5px solid rgba(255,255,255,.45)}.mc__joystick:active .mc__knob{box-shadow:0 2px 16px #4285f4b3,0 1px #ffffff40 inset;animation:pulse .6s ease infinite}.mc__arrow{padding:0;margin:0;background:transparent;border:none;border-radius:0;box-shadow:none;outline:none;-webkit-appearance:none;appearance:none;cursor:pointer;display:flex;align-items:center;justify-content:center;touch-action:manipulation;user-select:none;-webkit-tap-highlight-color:transparent;transition:transform .1s ease,filter .15s ease;overflow:visible}.mc__arrow svg{display:block!important;pointer-events:none!important;user-select:none!important;-webkit-user-select:none!important;overflow:visible!important}.mc__arrow--up{margin-bottom:2px}.mc__arrow--up:hover{transform:scale(1.15) translateY(-2px);filter:drop-shadow(0 4px 12px rgba(66,133,244,.8))}.mc__arrow--up:active{transform:scale(.92) translateY(2px)}.mc__arrow--down{margin-top:2px}.mc__arrow--down:hover{transform:scale(1.15) translateY(2px);filter:drop-shadow(0 -4px 12px rgba(66,133,244,.8))}.mc__arrow--down:active{transform:scale(.92) translateY(-2px)}.mc__arrow--left{margin-right:2px}.mc__arrow--left:hover{transform:scale(1.15) translate(-2px);filter:drop-shadow(4px 0 12px rgba(66,133,244,.8))}.mc__arrow--left:active{transform:scale(.92) translate(2px)}.mc__arrow--right{margin-left:2px}.mc__arrow--right:hover{transform:scale(1.15) translate(2px);filter:drop-shadow(-4px 0 12px rgba(66,133,244,.8))}.mc__arrow--right:active{transform:scale(.92) translate(-2px)}@keyframes pulse{0%,to{box-shadow:0 2px 16px #4285f499,0 1px #ffffff40 inset;opacity:.85}50%{box-shadow:0 4px 24px #4285f4f2,0 1px #ffffff40 inset;opacity:1}}@media(max-width:768px){.mc__wrapper{bottom:-5px}.mc__joystick{width:68px;height:68px}.mc__knob{width:30px;height:30px;margin-left:-15px;margin-top:-15px}.mc__arrow--up:hover{transform:scale(1.1) translateY(-1px)}.mc__arrow--down:hover{transform:scale(1.1) translateY(1px)}.mc__arrow--left:hover{transform:scale(1.1) translate(-1px)}.mc__arrow--right:hover{transform:scale(1.1) translate(1px)}}@media(max-width:480px){.mc__joystick{width:56px;height:56px}.mc__knob{width:26px;height:26px;margin-left:-13px;margin-top:-13px}.mc__arrow--up{margin-bottom:1px}.mc__arrow--down{margin-top:1px}.mc__arrow--left{margin-right:1px}.mc__arrow--right{margin-left:1px}}@media(hover:none){.mc__arrow:hover{transform:none!important;filter:none!important}.mc__arrow:active{transform:scale(.92)!important}}.left-panel{width:280px;min-height:0;background:var(--ri-databinding-bg, #111318);border-right:1px solid var(--ri-databinding-border, rgba(255, 255, 255, .06));display:flex;flex-direction:column;padding:24px 18px;overflow-y:auto;font-family:var( --ri-databinding-font-family, "Inter", "Segoe UI", sans-serif );flex-shrink:0;transition:margin-left .45s cubic-bezier(.4,0,.2,1);box-shadow:var(--ri-databinding-shadow, 4px 0 24px rgba(0, 0, 0, .35))}.left-panel--open{margin-left:0}.left-panel--closed{margin-left:-280px}.left-panel::-webkit-scrollbar{width:4px}.left-panel::-webkit-scrollbar-track{background:transparent}.left-panel::-webkit-scrollbar-thumb{background:var(--ri-databinding-border-strong, rgba(255, 255, 255, .08));border-radius:4px}.left-panel__header{display:flex;align-items:center;justify-content:space-between;margin-bottom:16px;padding-bottom:14px;border-bottom:1px solid var(--ri-databinding-border-strong, rgba(255, 255, 255, .08))}.left-panel__title{font-size:14px;font-weight:600;color:var(--ri-databinding-text, #f1f5f9);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-right:8px;margin:0;letter-spacing:.02em}.left-panel__close-btn{width:26px;height:26px;display:flex;align-items:center;justify-content:center;background:var(--ri-databinding-surface, rgba(255, 255, 255, .03));border:1px solid var(--ri-databinding-border-strong, rgba(255, 255, 255, .08));border-radius:6px;color:var(--ri-databinding-text-subtle, #64748b);font-size:13px;flex-shrink:0;cursor:pointer;transition:background .15s ease,color .15s ease,border-color .15s ease}.left-panel__close-btn:hover{background:var(--ri-databinding-surface-hover, rgba(255, 255, 255, .06));color:var(--ri-databinding-text-hover, #cbd5e1);border-color:var(--ri-databinding-border-hover, rgba(255, 255, 255, .15))}.left-panel__data{padding:12px 6px;background:var(--ri-databinding-surface, rgba(255, 255, 255, .03));border:1px solid var(--ri-databinding-border-strong, rgba(255, 255, 255, .08));border-radius:10px;font-size:11px;font-family:var( --ri-databinding-mono-font-family, "JetBrains Mono", "Fira Code", "Menlo", monospace );color:var(--ri-databinding-text-muted, #94a3b8);line-height:1.7;overflow-x:auto;margin-bottom:18px}.left-panel__divider{border:none;border-top:1px solid var(--ri-databinding-border, rgba(255, 255, 255, .06));margin-bottom:16px}.left-panel__actions-label{font-size:10px;font-weight:600;color:var(--ri-databinding-text-faint, #475569);text-transform:uppercase;letter-spacing:.12em;margin-bottom:10px}.left-panel__actions-list{display:flex;flex-direction:column;gap:6px}.left-panel__action-extra{display:grid;grid-template-rows:0fr;opacity:0;margin-top:0;transition:grid-template-rows .28s cubic-bezier(.4,0,.2,1),opacity .2s ease,margin-top .28s cubic-bezier(.4,0,.2,1)}.left-panel__action-extra--open{grid-template-rows:1fr;opacity:1;margin-top:4px}.left-panel__action-extra-inner{overflow:hidden;min-height:0}.left-panel__action-btn{position:relative;padding:9px 14px;border-radius:8px;text-align:left;font-size:13px;font-weight:500;cursor:pointer;overflow:hidden;border:1px solid var(--ri-databinding-border-strong, rgba(255, 255, 255, .08));background:var(--ri-databinding-surface, rgba(255, 255, 255, .03));color:var(--ri-databinding-text-muted, #94a3b8);letter-spacing:.01em}.left-panel__action-btn:active{transform:scale(.97)}.left-panel__action-btn--active:before{content:"";position:absolute;left:0;top:20%;bottom:20%;width:3px;background:var(--ri-databinding-accent, #93c5fd);border-radius:0 3px 3px 0;box-shadow:0 0 8px var(--ri-databinding-accent-glow, rgba(147, 197, 253, .8))}.left-panel__action-btn--active:hover{background:var( --ri-databinding-accent-gradient, linear-gradient(135deg, #1e3a8a 0%, #1d4ed8 60%, #2563eb 100%) );border-color:var(--ri-databinding-accent-border, rgba(96, 165, 250, .55))}.left-panel__action-btn--active:active{transform:scale(.97);background:var( --ri-databinding-accent-gradient-active, linear-gradient(135deg, #1e3a8a 0%, #1e40af 100%) )}.left-panel__data{display:flex;flex-direction:column;gap:2px;margin-bottom:18px}.left-panel__data-row{display:flex;align-items:baseline;justify-content:space-between;gap:10px;padding:7px 10px;border-radius:7px;background:var(--ri-databinding-surface, rgba(255, 255, 255, .03));border:1px solid transparent;transition:background .15s ease,border-color .15s ease}.left-panel__data-row:hover{background:var(--ri-databinding-surface-hover, rgba(255, 255, 255, .06));border-color:var(--ri-databinding-border-strong, rgba(255, 255, 255, .08))}.left-panel__data-key{font-size:11px;font-weight:600;color:var(--ri-databinding-text-faint, #475569);text-transform:uppercase;letter-spacing:.07em;white-space:nowrap;flex-shrink:0}.left-panel__data-value{font-size:12px;font-family:var( --ri-databinding-mono-font-family, "JetBrains Mono", "Fira Code", "Menlo", monospace );text-align:right;overflow-wrap:anywhere;word-break:break-word;min-width:0}.left-panel__data-group{display:flex;flex-direction:column;gap:2px;padding:7px 10px;border-radius:7px;background:var(--ri-databinding-surface, rgba(255, 255, 255, .03));border:1px solid transparent;transition:background .15s ease,border-color .15s ease}.left-panel__data-group:hover{background:var(--ri-databinding-surface-hover, rgba(255, 255, 255, .06));border-color:var(--ri-databinding-border-strong, rgba(255, 255, 255, .08))}.left-panel__data-children{display:flex;flex-direction:column;gap:2px;margin-top:4px;padding-left:10px;border-left:1px solid var(--ri-databinding-border-strong, rgba(255, 255, 255, .08))}.left-panel__data-children .left-panel__data-row,.left-panel__data-children .left-panel__data-group{padding:3px 0;background:transparent;border-color:transparent}.left-panel__data-children .left-panel__data-row:hover,.left-panel__data-children .left-panel__data-group:hover{background:transparent}@media(max-width:900px){.left-panel{width:50vw}.left-panel--open{margin-left:0}.left-panel--closed{margin-left:-50vw}.left-panel{padding:18px 12px}.left-panel__data-row{flex-direction:column;align-items:stretch;gap:2px;padding:6px 8px}.left-panel__data-group{padding:6px 8px}.left-panel__data-value{text-align:left;font-size:11.5px}.left-panel__data-children{padding-left:8px}}.ri-sidepanel-wrap{height:100%;transition:width .45s cubic-bezier(.4,0,.2,1);overflow:visible}.ri-sidepanel-wrap--open{width:300px;flex-shrink:0}.ri-sidepanel-wrap--closed{width:0;flex-shrink:0;overflow:hidden}.ri-sidepanel__open-btn{position:absolute;top:12px;right:12px;display:flex;align-items:center;gap:7px;padding:7px 13px;border-radius:7px;border:1px solid var(--ri-sidepanel-border-strong, rgba(255, 255, 255, .08));background:var(--ri-sidepanel-open-btn-bg, rgba(20, 20, 20, .82));cursor:pointer;font-size:13px;font-weight:500;color:var(--ri-sidepanel-text-muted, #94a3b8);z-index:190;transition:background .15s}.ri-sidepanel__open-btn:hover{background:var(--ri-sidepanel-open-btn-bg-hover, #27282b7e)}.ri-sidepanel{position:absolute;top:0;right:0;width:300px;height:100%;background:var(--ri-sidepanel-bg, #141824);display:flex;flex-direction:column;font-family:var( --ri-sidepanel-font-family, Inter, "Segoe UI", Helvetica, Arial, sans-serif );transform:translate(100%);transition:transform .45s cubic-bezier(.4,0,.2,1);z-index:200;border-left:1px solid var(--ri-sidepanel-border, rgba(255, 255, 255, .06));box-shadow:var(--ri-sidepanel-shadow-right, -4px 0 24px rgba(0, 0, 0, .35))}.ri-sidepanel--open{transform:translate(0)}.ri-sidepanel--closed{transform:translate(100%)}.ri-sidepanel__header{padding:24px 20px 16px;border-bottom:1px solid var(--ri-sidepanel-border-strong, rgba(255, 255, 255, .08))}.ri-sidepanel__header-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:4px}.ri-sidepanel__eyebrow{font-size:10px;font-weight:700;letter-spacing:.12em;color:var(--ri-sidepanel-text-subtle, #64748b);text-transform:uppercase}.ri-sidepanel__title{font-size:22px;font-weight:700;color:var(--ri-sidepanel-text, #f1f5f9);margin:0;line-height:1.2}.ri-sidepanel__close-btn{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:8px;border:1px solid var(--ri-sidepanel-border-strong, rgba(255, 255, 255, .08));background:var(--ri-sidepanel-surface, rgba(255, 255, 255, .05));cursor:pointer;color:var(--ri-sidepanel-text-muted, #94a3b8);transition:background .15s,color .15s;flex-shrink:0}.ri-sidepanel__close-btn:hover{background:var(--ri-sidepanel-surface-hover, rgba(255, 255, 255, .1));color:var(--ri-sidepanel-text, #f1f5f9)}.ri-sidepanel__search-wrap{padding:14px 16px;border-bottom:1px solid var(--ri-sidepanel-border-strong, rgba(255, 255, 255, .08))}.ri-sidepanel__search{width:100%;padding:10px 14px;border-radius:10px;border:1px solid var(--ri-sidepanel-border-strong, rgba(255, 255, 255, .08));background:var(--ri-sidepanel-surface, rgba(255, 255, 255, .05));color:var(--ri-sidepanel-text, #e2e8f0);font-size:13px;outline:none;box-sizing:border-box;transition:border-color .15s,background .15s}.ri-sidepanel__search::placeholder{color:var(--ri-sidepanel-placeholder, #475569)}.ri-sidepanel__search:focus{border-color:var(--ri-sidepanel-border-active, rgba(255, 255, 255, .18));background:var(--ri-sidepanel-surface-hover, rgba(255, 255, 255, .08))}.ri-sidepanel__list{display:flex;flex-direction:column;padding:10px 0;overflow-y:auto;flex:1}.ri-sidepanel__list::-webkit-scrollbar{width:4px}.ri-sidepanel__list::-webkit-scrollbar-track{background:transparent}.ri-sidepanel__list::-webkit-scrollbar-thumb{background:var(--ri-sidepanel-surface-hover, rgba(255, 255, 255, .1));border-radius:4px}.ri-sidepanel__row{display:flex;justify-content:space-between;padding:12px 20px;cursor:pointer;width:100%;border:none;background:transparent;color:inherit;font:inherit;text-align:left;appearance:none;-webkit-appearance:none;transition:background .12s;border-bottom:1px solid var(--ri-sidepanel-divider, rgba(255, 255, 255, .04))}.ri-sidepanel__row:hover,.ri-sidepanel__row--hovered{background:var(--ri-sidepanel-surface, rgba(255, 255, 255, .05))}.ri-sidepanel__row--selected{background:var(--ri-sidepanel-accent-soft, rgba(59, 130, 246, .12))}.ri-sidepanel__label{font-size:14px;font-weight:600;color:var(--ri-sidepanel-text-muted, #94a3b8);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ri-sidepanel__label--hovered,.ri-sidepanel__label--selected{color:var(--ri-sidepanel-text-emphasis, #ffffff)}.ri-sidepanel__meta{font-size:12px;color:var(--ri-sidepanel-text-muted, #94a3b8);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ri-sidepanel__vis-btn{display:flex;align-items:center;flex-shrink:0;cursor:pointer;background:none;border:none;padding:0;margin-left:10px}.ri-sidepanel__checkbox{width:16px;height:16px;border-radius:4px;border:1.5px solid var(--ri-sidepanel-border-active, rgba(255, 255, 255, .2));background:transparent;display:flex;align-items:center;justify-content:center;transition:background .15s,border-color .15s}.ri-sidepanel__checkbox--checked{background:var(--ri-sidepanel-accent, #3b82f6);border-color:var(--ri-sidepanel-accent, #3b82f6)}@media(max-width:900px){.ri-sidepanel-wrap--open,.ri-sidepanel{width:50vw}}.ri-sidepanel__isolate-btn{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:22px;height:22px;margin-left:auto;padding:0;border:none;border-radius:5px;background:none;color:var(--ri-sidepanel-muted, rgba(255, 255, 255, .5));cursor:pointer;opacity:0;transition:opacity .15s ease,color .15s ease}.ri-sidepanel__row:hover .ri-sidepanel__isolate-btn,.ri-sidepanel__row--hovered .ri-sidepanel__isolate-btn,.ri-sidepanel__isolate-btn:focus-visible,.ri-sidepanel__isolate-btn--active{opacity:1}@media(hover:none){.ri-sidepanel__isolate-btn{opacity:1}}.ri-sidepanel__isolate-btn:hover{color:var(--ri-sidepanel-text, #fff)}.ri-sidepanel__isolate-btn--active,.ri-sidepanel__isolate-btn--active:hover{color:var(--ri-sidepanel-accent, #3b82f6)}.ri-sidepanel__row--setAside .ri-sidepanel__label{opacity:.45}.bb-loadingOverlay{position:absolute;inset:0;z-index:5;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:16px;padding:24px;text-align:center;border-radius:14px;background:#f8fafcd1;backdrop-filter:blur(2px)}.bb-loadingSpinner{width:40px;height:40px;border-radius:999px;border:3px solid rgba(148,163,184,.3);border-top-color:#2563eb;animation:bb-spin .8s linear infinite}@keyframes bb-spin{to{transform:rotate(360deg)}}.bb-loadingProgressRow{display:flex;align-items:center;gap:8px;width:100%;max-width:240px}.bb-loadingProgress{flex:1;height:6px;border-radius:999px;background:#94a3b84d;overflow:hidden}.bb-loadingProgress__bar{height:100%;border-radius:inherit;background:#2563eb;transition:width .15s ease-out}.bb-loadingProgress__label{flex-shrink:0;min-width:34px;text-align:right;color:#475569;font-size:12px;font-weight:600;font-variant-numeric:tabular-nums}.bb-loadingMessage{max-width:320px;color:#475569;font-size:13px;font-weight:600;line-height:1.5}
|
package/dist/index.d.mts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
|
-
import {
|
|
3
|
-
export { A as
|
|
4
|
-
import {
|
|
5
|
-
export { A as AnimationAction, a as AnimationActionEffect, b as AnimationLoopMode, C as CameraAction,
|
|
2
|
+
import { l as ModelViewerProps, r as ViewerCameraProps, t as ViewerReadyState, b as CaptureImageOptions, c as CaptureVideoOptions, U as UseViewerCameraOptions } from './ModelViewer-Bj-KjiDL.mjs';
|
|
3
|
+
export { A as AnnotationMarker, C as CameraControllerType, a as CameraLimits, d as CinematicConfig, e as CinematicWaypoint, f as CustomObjectBindingDataPanelProps, g as CustomSceneObjectsPanelProps, D as DecalMoveTarget, G as GroupedModelViewerProps, H as HomeCameraState, M as MODEL_VIEWER_PRESETS, h as ModelViewerControlsOptions, i as ModelViewerDecoderOptions, j as ModelViewerPerfOptions, k as ModelViewerPreset, m as ModelViewerTilesOptions, n as ModelViewerToolsOptions, o as ModelViewerUiOptions, p as ModelViewerXrOptions, q as MouseControllerPosition, O as ObjectTransformSpace, P as PerformanceProfile, T as TexturePositioningControls, V as ViewerCameraPreset, s as ViewerEngagementEvent, X as XRScaleMode, u as useViewerCamera } from './ModelViewer-Bj-KjiDL.mjs';
|
|
4
|
+
import { o as ObjectBinding, z as ObjectBindingTarget, v as ObjectBindingPatch, B as BindingEdit, s as ObjectBindingMaterial, H as ObjectBindingTextureSlot, F as ObjectBindingTextureChannel, J as ObjectBindingTransform, r as ObjectBindingDecal, Z as SceneConfig, $ as SceneConfigPatch, a2 as SceneLight, a3 as SceneLightAttachment, am as ViewerIsolation, p as ObjectBindingAction, n as ObjectActionEvent, aj as ViewerAnimationsProps, an as ViewerObjectInfo, al as ViewerCameraState } from './objectCatalog-BIeXURoq.mjs';
|
|
5
|
+
export { A as AnimationAction, a as AnimationActionEffect, b as AnimationClipInfo, c as AnimationClipState, d as AnimationClipStatus, e as AnimationControls, f as AnimationLoopMode, g as AnimationPlayOptions, h as AnimationPlaybackState, C as CameraAction, i as CameraActionEffect, D as DEFAULT_SCENE_CONFIG, j as DEFAULT_SECTION_CONFIG, k as DeepPartial, E as EnvironmentPreset, G as GlitchModeName, I as IsolatedObjectBindings, l as IsolationActionEffect, K as KernelSizeName, M as MATERIAL_BLENDING_MODES, m as MATERIAL_SIDES, O as ObjectActionEffect, q as ObjectBindingCameraState, t as ObjectBindingMaterialBlendingMode, u as ObjectBindingMaterialSide, w as ObjectBindingSelector, x as ObjectBindingStatus, y as ObjectBindingStyle, L as ObjectBindingType, N as ObjectBindingsActionEffect, P as ObjectPointerEvent, Q as ObjectSurfacePoint, R as RampTypeName, S as SceneAnimationClipConfig, T as SceneAnimationConfig, U as SceneAnnotationMarker, V as SceneBackgroundConfig, W as SceneCameraConfig, X as SceneCinematicConfig, Y as SceneCinematicWaypoint, _ as SceneConfigActionEffect, a0 as SceneEnvironmentConfig, a1 as SceneGroundShadowConfig, a4 as SceneLightType, a5 as SceneLightingConfig, a6 as SceneModelConfig, a7 as SceneModelRenderer, a8 as ScenePostProcessingConfig, a9 as SceneSectionAxis, aa as SceneSectionConfig, ab as SceneShadowConfig, ac as SceneStyleColorScale, ad as SceneStyleCondition, ae as SceneStylePulse, af as SceneStyleRule, ag as SceneWireframeConfig, ah as StyledObjectBindings, ai as StyledObjectPulse, ak as ViewerCameraConfig, ao as VisibilityActionEffect, ap as applyIsolation, aq as applyStyleRules, ar as colorScaleValue, as as isolatedBindingKeys, at as material, au as patchBindings, av as patchSceneConfig, aw as selectBindingKeys, ax as selectBindings, ay as useViewerAnimations } from './objectCatalog-BIeXURoq.mjs';
|
|
6
6
|
import { SceneLightInput } from './utils.mjs';
|
|
7
7
|
export { ACTION_CATALOG, ActionCatalogEntry, ActionHandling, ObjectBindingActionId, ObjectBindingKey, buildBindingsFromNodes, createDefaultBinding, defineObjectBindings, findCatalogAction, inferType, sceneLight } from './utils.mjs';
|
|
8
|
-
import { V as ViewerModelBounds, a as ViewerModelInfo } from './modelInfo-
|
|
9
|
-
export { M as ModelFormat } from './modelInfo-
|
|
8
|
+
import { V as ViewerModelBounds, a as ViewerModelInfo } from './modelInfo-DnkmTGMd.mjs';
|
|
9
|
+
export { M as ModelFormat } from './modelInfo-DnkmTGMd.mjs';
|
|
10
10
|
import '@react-three/drei';
|
|
11
11
|
import 'three';
|
|
12
12
|
|
|
@@ -30,6 +30,15 @@ type ObjectBindingsController = {
|
|
|
30
30
|
setTransform: (target: ObjectBindingTarget, transform: ObjectBindingTransform) => void;
|
|
31
31
|
resetTransform: (target: ObjectBindingTarget) => void;
|
|
32
32
|
updateMetadata: (target: ObjectBindingTarget, metadata: Record<string, unknown>) => void;
|
|
33
|
+
/**
|
|
34
|
+
* Prints an image or text on the target objects and returns the decal's id
|
|
35
|
+
* (the one passed, or a generated one).
|
|
36
|
+
*/
|
|
37
|
+
addDecal: (target: ObjectBindingTarget, decal: Omit<ObjectBindingDecal, "id"> & {
|
|
38
|
+
id?: string;
|
|
39
|
+
}) => string;
|
|
40
|
+
updateDecal: (target: ObjectBindingTarget, decalId: string, patch: Partial<Omit<ObjectBindingDecal, "id">>) => void;
|
|
41
|
+
removeDecal: (target: ObjectBindingTarget, decalId: string) => void;
|
|
33
42
|
selectObjectBindings: (target: ObjectBindingTarget) => ObjectBinding[];
|
|
34
43
|
selectObjectBindingIds: (target: ObjectBindingTarget) => string[];
|
|
35
44
|
hiddenObjects: HiddenObjectsState;
|
|
@@ -78,15 +87,40 @@ type SceneLightsController = {
|
|
|
78
87
|
*/
|
|
79
88
|
declare function useSceneConfig(initialSceneConfig: SceneConfig | (() => SceneConfig)): SceneConfigController;
|
|
80
89
|
|
|
90
|
+
type ViewerIsolationProps = {
|
|
91
|
+
/** The current isolation, or `null` when every object shows normally. */
|
|
92
|
+
isolation: ViewerIsolation | null;
|
|
93
|
+
/** Focuses on the target's objects, ghosting (or hiding) the rest. */
|
|
94
|
+
isolate: (target: ObjectBindingTarget, options?: Omit<ViewerIsolation, "target">) => void;
|
|
95
|
+
clearIsolation: () => void;
|
|
96
|
+
/** Pass to `ModelViewer`'s `onIsolationChange`. */
|
|
97
|
+
handleIsolationChange: (isolation: ViewerIsolation | null) => void;
|
|
98
|
+
};
|
|
99
|
+
/**
|
|
100
|
+
* State for `ModelViewer`'s `isolation` prop:
|
|
101
|
+
*
|
|
102
|
+
* ```tsx
|
|
103
|
+
* const isolation = useViewerIsolation();
|
|
104
|
+
* <ModelViewer
|
|
105
|
+
* isolation={isolation.isolation}
|
|
106
|
+
* onIsolationChange={isolation.handleIsolationChange}
|
|
107
|
+
* />;
|
|
108
|
+
* isolation.isolate({ group: "engine" });
|
|
109
|
+
* ```
|
|
110
|
+
*/
|
|
111
|
+
declare function useViewerIsolation(initialIsolation?: ViewerIsolation | null): ViewerIsolationProps;
|
|
112
|
+
|
|
81
113
|
type ViewerActionBindingsController = Pick<ObjectBindingsController, "objectBindings" | "updateObjectBindings" | "showObject" | "hideObject" | "toggleObjectVisibility">;
|
|
82
114
|
type ViewerActionSceneController = Pick<SceneConfigController, "updateSceneConfig">;
|
|
83
115
|
type ViewerActionCameraController = Pick<ViewerCameraProps, "focusObject" | "fitScene" | "resetView" | "setCameraTarget" | "setCameraState">;
|
|
84
116
|
type ViewerActionAnimationController = Pick<ViewerAnimationsProps, "play" | "pause" | "stop" | "setSpeed" | "seek">;
|
|
117
|
+
type ViewerActionIsolationController = Pick<ViewerIsolationProps, "handleIsolationChange">;
|
|
85
118
|
type ViewerActionsOptions = {
|
|
86
119
|
bindings: ViewerActionBindingsController;
|
|
87
120
|
scene?: ViewerActionSceneController;
|
|
88
121
|
camera?: ViewerActionCameraController;
|
|
89
122
|
animations?: ViewerActionAnimationController;
|
|
123
|
+
isolation?: ViewerActionIsolationController;
|
|
90
124
|
onAction?: (event: ObjectActionEvent) => void | Promise<void>;
|
|
91
125
|
};
|
|
92
126
|
type ViewerActionsProps = {
|
|
@@ -98,7 +132,7 @@ type ViewerActionsProps = {
|
|
|
98
132
|
* Resolves object actions and executes their declarative binding, scene,
|
|
99
133
|
* visibility, camera, and animation effects in declaration order.
|
|
100
134
|
*/
|
|
101
|
-
declare function useViewerActions({ bindings, scene, camera, animations, onAction, }: ViewerActionsOptions): ViewerActionsProps;
|
|
135
|
+
declare function useViewerActions({ bindings, scene, camera, animations, isolation, onAction, }: ViewerActionsOptions): ViewerActionsProps;
|
|
102
136
|
|
|
103
137
|
type ViewerReadyHandler = (viewer: ViewerReadyState) => void;
|
|
104
138
|
type ViewerReadyConsumer = ViewerReadyHandler | {
|
|
@@ -111,6 +145,8 @@ type ViewerConnectionController = {
|
|
|
111
145
|
getViewer: () => ViewerReadyState | null;
|
|
112
146
|
/** Captures the connected viewer, or rejects when it is not ready yet. */
|
|
113
147
|
captureImage: (options?: CaptureImageOptions) => Promise<string>;
|
|
148
|
+
/** Records the connected viewer, or rejects when not ready/unsupported. */
|
|
149
|
+
captureVideo: (options?: CaptureVideoOptions) => Promise<Blob>;
|
|
114
150
|
/** Requests a frame from the connected viewer. */
|
|
115
151
|
invalidate: () => boolean;
|
|
116
152
|
};
|
|
@@ -255,6 +291,11 @@ type ViewerModelProps = {
|
|
|
255
291
|
error: unknown;
|
|
256
292
|
bounds: ViewerModelBounds | null;
|
|
257
293
|
objectCount: number;
|
|
294
|
+
/**
|
|
295
|
+
* The model's glTF material variants, by name; empty when it has none. Show
|
|
296
|
+
* one by setting `sceneConfig.model.materialVariant`.
|
|
297
|
+
*/
|
|
298
|
+
materialVariants: string[];
|
|
258
299
|
/**
|
|
259
300
|
* Every bindable object in the model (see `ViewerObjectInfo`). Filled by
|
|
260
301
|
* `handleObjectCatalog`, so pass that to `ModelViewer`'s `onObjectCatalog`.
|
|
@@ -292,7 +333,8 @@ type UseViewerOptions = {
|
|
|
292
333
|
onLoadError?: (error: unknown) => void;
|
|
293
334
|
};
|
|
294
335
|
/** The ModelViewer props that connect it to `useViewer`; spread them onto it. */
|
|
295
|
-
type UseViewerProps = Required<Pick<ModelViewerProps, "onObjectBindingsChange" | "selectedObject" | "onObjectSelect" | "onObjectHover" | "onCameraChange" | "onViewerReady" | "onModelLoaded" | "onLoadError" | "onObjectCatalog" | "onAnimationsReady" | "onAction">> & {
|
|
336
|
+
type UseViewerProps = Required<Pick<ModelViewerProps, "onObjectBindingsChange" | "selectedObject" | "onObjectSelect" | "onObjectHover" | "onCameraChange" | "onViewerReady" | "onModelLoaded" | "onLoadError" | "onObjectCatalog" | "onAnimationsReady" | "onAction" | "onIsolationChange">> & {
|
|
337
|
+
isolation: ModelViewerProps["isolation"];
|
|
296
338
|
objectBindings: Record<string, ObjectBinding>;
|
|
297
339
|
sceneConfig?: SceneConfig;
|
|
298
340
|
onSceneConfigChange: (config: SceneConfig) => void;
|
|
@@ -308,8 +350,10 @@ type UseViewerResult = {
|
|
|
308
350
|
animations: ViewerAnimationsProps;
|
|
309
351
|
actions: ViewerActionsProps;
|
|
310
352
|
scene: SceneConfigController;
|
|
353
|
+
/** Focus on some objects, ghosting or hiding the rest. */
|
|
354
|
+
isolation: ViewerIsolationProps;
|
|
311
355
|
effects: ViewerEffectsController;
|
|
312
|
-
/** The live viewer, image capture and redraw requests. */
|
|
356
|
+
/** The live viewer, image/video capture and redraw requests. */
|
|
313
357
|
connection: ViewerConnectionController;
|
|
314
358
|
};
|
|
315
359
|
/**
|
|
@@ -350,4 +394,4 @@ type ShareableViewerStateProps = {
|
|
|
350
394
|
};
|
|
351
395
|
declare function useShareableViewerState({ cameraState, setCameraState, objectBindings, onObjectBindingsChange, selectedObjectBinding, setSelectedObjectBinding, paramKey, debounceMs, autoSync, }: UseShareableViewerStateOptions): ShareableViewerStateProps;
|
|
352
396
|
|
|
353
|
-
export { BindingEdit, CaptureImageOptions, type HiddenObjectsState, PublicModelViewer as ModelViewer, ModelViewerProps, ObjectActionEvent, ObjectBinding, ObjectBindingAction, ObjectBindingMaterial, ObjectBindingPatch, ObjectBindingTarget, ObjectBindingTextureChannel, ObjectBindingTextureSlot, ObjectBindingTransform, type ObjectBindingsController, type RuntimeMaterialPatch, type RuntimeMaterialRanges, type RuntimePointLightOptions, type RuntimePointLightPatch, type RuntimeTransformPatch, type RuntimeTransformRanges, SceneConfig, type SceneConfigController, SceneConfigPatch, type SceneConfigUpdate, SceneLight, SceneLightAttachment, SceneLightInput, type SceneLightPatch, type SceneLightsController, type ShareableViewerStateProps, type UseShareableViewerStateOptions, UseViewerCameraOptions, type UseViewerEffectsOptions, type UseViewerOptions, type UseViewerProps, type UseViewerResult, type ViewerActionAnimationController, type ViewerActionBindingsController, type ViewerActionCameraController, type ViewerActionSceneController, type ViewerActionsOptions, type ViewerActionsProps, ViewerAnimationsProps, ViewerCameraProps, ViewerCameraState, type ViewerConnectionController, type ViewerEffectChannels, type ViewerEffectEasing, type ViewerEffectRange, type ViewerEffectTarget, type ViewerEffectsController, type ViewerFlickerOptions, type ViewerHoverProps, type ViewerLightEffectChannel, type ViewerMaterialEffectChannel, ViewerModelBounds, ViewerModelInfo, type ViewerModelProps, ViewerObjectInfo, type ViewerPulseOptions, type ViewerReadyConsumer, type ViewerReadyHandler, ViewerReadyState, type ViewerSelectionProps, type ViewerTimelineOptions, type ViewerTimelineStep, type ViewerTransformEffectChannel, type ViewerTransitionOptions, type ViewerVector3, useObjectBinding, useObjectBindingIds, useObjectBindings, useSceneConfig, useShareableViewerState, useViewer, useViewerActions, useViewerConnection, useViewerEffects, useViewerHover, useViewerModel, useViewerSelection };
|
|
397
|
+
export { BindingEdit, CaptureImageOptions, CaptureVideoOptions, type HiddenObjectsState, PublicModelViewer as ModelViewer, ModelViewerProps, ObjectActionEvent, ObjectBinding, ObjectBindingAction, ObjectBindingDecal, ObjectBindingMaterial, ObjectBindingPatch, ObjectBindingTarget, ObjectBindingTextureChannel, ObjectBindingTextureSlot, ObjectBindingTransform, type ObjectBindingsController, type RuntimeMaterialPatch, type RuntimeMaterialRanges, type RuntimePointLightOptions, type RuntimePointLightPatch, type RuntimeTransformPatch, type RuntimeTransformRanges, SceneConfig, type SceneConfigController, SceneConfigPatch, type SceneConfigUpdate, SceneLight, SceneLightAttachment, SceneLightInput, type SceneLightPatch, type SceneLightsController, type ShareableViewerStateProps, type UseShareableViewerStateOptions, UseViewerCameraOptions, type UseViewerEffectsOptions, type UseViewerOptions, type UseViewerProps, type UseViewerResult, type ViewerActionAnimationController, type ViewerActionBindingsController, type ViewerActionCameraController, type ViewerActionIsolationController, type ViewerActionSceneController, type ViewerActionsOptions, type ViewerActionsProps, ViewerAnimationsProps, ViewerCameraProps, ViewerCameraState, type ViewerConnectionController, type ViewerEffectChannels, type ViewerEffectEasing, type ViewerEffectRange, type ViewerEffectTarget, type ViewerEffectsController, type ViewerFlickerOptions, type ViewerHoverProps, ViewerIsolation, type ViewerIsolationProps, type ViewerLightEffectChannel, type ViewerMaterialEffectChannel, ViewerModelBounds, ViewerModelInfo, type ViewerModelProps, ViewerObjectInfo, type ViewerPulseOptions, type ViewerReadyConsumer, type ViewerReadyHandler, ViewerReadyState, type ViewerSelectionProps, type ViewerTimelineOptions, type ViewerTimelineStep, type ViewerTransformEffectChannel, type ViewerTransitionOptions, type ViewerVector3, useObjectBinding, useObjectBindingIds, useObjectBindings, useSceneConfig, useShareableViewerState, useViewer, useViewerActions, useViewerConnection, useViewerEffects, useViewerHover, useViewerIsolation, useViewerModel, useViewerSelection };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
|
-
import {
|
|
3
|
-
export { A as
|
|
4
|
-
import {
|
|
5
|
-
export { A as AnimationAction, a as AnimationActionEffect, b as AnimationLoopMode, C as CameraAction,
|
|
2
|
+
import { l as ModelViewerProps, r as ViewerCameraProps, t as ViewerReadyState, b as CaptureImageOptions, c as CaptureVideoOptions, U as UseViewerCameraOptions } from './ModelViewer-BkQ73y6N.js';
|
|
3
|
+
export { A as AnnotationMarker, C as CameraControllerType, a as CameraLimits, d as CinematicConfig, e as CinematicWaypoint, f as CustomObjectBindingDataPanelProps, g as CustomSceneObjectsPanelProps, D as DecalMoveTarget, G as GroupedModelViewerProps, H as HomeCameraState, M as MODEL_VIEWER_PRESETS, h as ModelViewerControlsOptions, i as ModelViewerDecoderOptions, j as ModelViewerPerfOptions, k as ModelViewerPreset, m as ModelViewerTilesOptions, n as ModelViewerToolsOptions, o as ModelViewerUiOptions, p as ModelViewerXrOptions, q as MouseControllerPosition, O as ObjectTransformSpace, P as PerformanceProfile, T as TexturePositioningControls, V as ViewerCameraPreset, s as ViewerEngagementEvent, X as XRScaleMode, u as useViewerCamera } from './ModelViewer-BkQ73y6N.js';
|
|
4
|
+
import { o as ObjectBinding, z as ObjectBindingTarget, v as ObjectBindingPatch, B as BindingEdit, s as ObjectBindingMaterial, H as ObjectBindingTextureSlot, F as ObjectBindingTextureChannel, J as ObjectBindingTransform, r as ObjectBindingDecal, Z as SceneConfig, $ as SceneConfigPatch, a2 as SceneLight, a3 as SceneLightAttachment, am as ViewerIsolation, p as ObjectBindingAction, n as ObjectActionEvent, aj as ViewerAnimationsProps, an as ViewerObjectInfo, al as ViewerCameraState } from './objectCatalog-BIeXURoq.js';
|
|
5
|
+
export { A as AnimationAction, a as AnimationActionEffect, b as AnimationClipInfo, c as AnimationClipState, d as AnimationClipStatus, e as AnimationControls, f as AnimationLoopMode, g as AnimationPlayOptions, h as AnimationPlaybackState, C as CameraAction, i as CameraActionEffect, D as DEFAULT_SCENE_CONFIG, j as DEFAULT_SECTION_CONFIG, k as DeepPartial, E as EnvironmentPreset, G as GlitchModeName, I as IsolatedObjectBindings, l as IsolationActionEffect, K as KernelSizeName, M as MATERIAL_BLENDING_MODES, m as MATERIAL_SIDES, O as ObjectActionEffect, q as ObjectBindingCameraState, t as ObjectBindingMaterialBlendingMode, u as ObjectBindingMaterialSide, w as ObjectBindingSelector, x as ObjectBindingStatus, y as ObjectBindingStyle, L as ObjectBindingType, N as ObjectBindingsActionEffect, P as ObjectPointerEvent, Q as ObjectSurfacePoint, R as RampTypeName, S as SceneAnimationClipConfig, T as SceneAnimationConfig, U as SceneAnnotationMarker, V as SceneBackgroundConfig, W as SceneCameraConfig, X as SceneCinematicConfig, Y as SceneCinematicWaypoint, _ as SceneConfigActionEffect, a0 as SceneEnvironmentConfig, a1 as SceneGroundShadowConfig, a4 as SceneLightType, a5 as SceneLightingConfig, a6 as SceneModelConfig, a7 as SceneModelRenderer, a8 as ScenePostProcessingConfig, a9 as SceneSectionAxis, aa as SceneSectionConfig, ab as SceneShadowConfig, ac as SceneStyleColorScale, ad as SceneStyleCondition, ae as SceneStylePulse, af as SceneStyleRule, ag as SceneWireframeConfig, ah as StyledObjectBindings, ai as StyledObjectPulse, ak as ViewerCameraConfig, ao as VisibilityActionEffect, ap as applyIsolation, aq as applyStyleRules, ar as colorScaleValue, as as isolatedBindingKeys, at as material, au as patchBindings, av as patchSceneConfig, aw as selectBindingKeys, ax as selectBindings, ay as useViewerAnimations } from './objectCatalog-BIeXURoq.js';
|
|
6
6
|
import { SceneLightInput } from './utils.js';
|
|
7
7
|
export { ACTION_CATALOG, ActionCatalogEntry, ActionHandling, ObjectBindingActionId, ObjectBindingKey, buildBindingsFromNodes, createDefaultBinding, defineObjectBindings, findCatalogAction, inferType, sceneLight } from './utils.js';
|
|
8
|
-
import { V as ViewerModelBounds, a as ViewerModelInfo } from './modelInfo-
|
|
9
|
-
export { M as ModelFormat } from './modelInfo-
|
|
8
|
+
import { V as ViewerModelBounds, a as ViewerModelInfo } from './modelInfo-DnkmTGMd.js';
|
|
9
|
+
export { M as ModelFormat } from './modelInfo-DnkmTGMd.js';
|
|
10
10
|
import '@react-three/drei';
|
|
11
11
|
import 'three';
|
|
12
12
|
|
|
@@ -30,6 +30,15 @@ type ObjectBindingsController = {
|
|
|
30
30
|
setTransform: (target: ObjectBindingTarget, transform: ObjectBindingTransform) => void;
|
|
31
31
|
resetTransform: (target: ObjectBindingTarget) => void;
|
|
32
32
|
updateMetadata: (target: ObjectBindingTarget, metadata: Record<string, unknown>) => void;
|
|
33
|
+
/**
|
|
34
|
+
* Prints an image or text on the target objects and returns the decal's id
|
|
35
|
+
* (the one passed, or a generated one).
|
|
36
|
+
*/
|
|
37
|
+
addDecal: (target: ObjectBindingTarget, decal: Omit<ObjectBindingDecal, "id"> & {
|
|
38
|
+
id?: string;
|
|
39
|
+
}) => string;
|
|
40
|
+
updateDecal: (target: ObjectBindingTarget, decalId: string, patch: Partial<Omit<ObjectBindingDecal, "id">>) => void;
|
|
41
|
+
removeDecal: (target: ObjectBindingTarget, decalId: string) => void;
|
|
33
42
|
selectObjectBindings: (target: ObjectBindingTarget) => ObjectBinding[];
|
|
34
43
|
selectObjectBindingIds: (target: ObjectBindingTarget) => string[];
|
|
35
44
|
hiddenObjects: HiddenObjectsState;
|
|
@@ -78,15 +87,40 @@ type SceneLightsController = {
|
|
|
78
87
|
*/
|
|
79
88
|
declare function useSceneConfig(initialSceneConfig: SceneConfig | (() => SceneConfig)): SceneConfigController;
|
|
80
89
|
|
|
90
|
+
type ViewerIsolationProps = {
|
|
91
|
+
/** The current isolation, or `null` when every object shows normally. */
|
|
92
|
+
isolation: ViewerIsolation | null;
|
|
93
|
+
/** Focuses on the target's objects, ghosting (or hiding) the rest. */
|
|
94
|
+
isolate: (target: ObjectBindingTarget, options?: Omit<ViewerIsolation, "target">) => void;
|
|
95
|
+
clearIsolation: () => void;
|
|
96
|
+
/** Pass to `ModelViewer`'s `onIsolationChange`. */
|
|
97
|
+
handleIsolationChange: (isolation: ViewerIsolation | null) => void;
|
|
98
|
+
};
|
|
99
|
+
/**
|
|
100
|
+
* State for `ModelViewer`'s `isolation` prop:
|
|
101
|
+
*
|
|
102
|
+
* ```tsx
|
|
103
|
+
* const isolation = useViewerIsolation();
|
|
104
|
+
* <ModelViewer
|
|
105
|
+
* isolation={isolation.isolation}
|
|
106
|
+
* onIsolationChange={isolation.handleIsolationChange}
|
|
107
|
+
* />;
|
|
108
|
+
* isolation.isolate({ group: "engine" });
|
|
109
|
+
* ```
|
|
110
|
+
*/
|
|
111
|
+
declare function useViewerIsolation(initialIsolation?: ViewerIsolation | null): ViewerIsolationProps;
|
|
112
|
+
|
|
81
113
|
type ViewerActionBindingsController = Pick<ObjectBindingsController, "objectBindings" | "updateObjectBindings" | "showObject" | "hideObject" | "toggleObjectVisibility">;
|
|
82
114
|
type ViewerActionSceneController = Pick<SceneConfigController, "updateSceneConfig">;
|
|
83
115
|
type ViewerActionCameraController = Pick<ViewerCameraProps, "focusObject" | "fitScene" | "resetView" | "setCameraTarget" | "setCameraState">;
|
|
84
116
|
type ViewerActionAnimationController = Pick<ViewerAnimationsProps, "play" | "pause" | "stop" | "setSpeed" | "seek">;
|
|
117
|
+
type ViewerActionIsolationController = Pick<ViewerIsolationProps, "handleIsolationChange">;
|
|
85
118
|
type ViewerActionsOptions = {
|
|
86
119
|
bindings: ViewerActionBindingsController;
|
|
87
120
|
scene?: ViewerActionSceneController;
|
|
88
121
|
camera?: ViewerActionCameraController;
|
|
89
122
|
animations?: ViewerActionAnimationController;
|
|
123
|
+
isolation?: ViewerActionIsolationController;
|
|
90
124
|
onAction?: (event: ObjectActionEvent) => void | Promise<void>;
|
|
91
125
|
};
|
|
92
126
|
type ViewerActionsProps = {
|
|
@@ -98,7 +132,7 @@ type ViewerActionsProps = {
|
|
|
98
132
|
* Resolves object actions and executes their declarative binding, scene,
|
|
99
133
|
* visibility, camera, and animation effects in declaration order.
|
|
100
134
|
*/
|
|
101
|
-
declare function useViewerActions({ bindings, scene, camera, animations, onAction, }: ViewerActionsOptions): ViewerActionsProps;
|
|
135
|
+
declare function useViewerActions({ bindings, scene, camera, animations, isolation, onAction, }: ViewerActionsOptions): ViewerActionsProps;
|
|
102
136
|
|
|
103
137
|
type ViewerReadyHandler = (viewer: ViewerReadyState) => void;
|
|
104
138
|
type ViewerReadyConsumer = ViewerReadyHandler | {
|
|
@@ -111,6 +145,8 @@ type ViewerConnectionController = {
|
|
|
111
145
|
getViewer: () => ViewerReadyState | null;
|
|
112
146
|
/** Captures the connected viewer, or rejects when it is not ready yet. */
|
|
113
147
|
captureImage: (options?: CaptureImageOptions) => Promise<string>;
|
|
148
|
+
/** Records the connected viewer, or rejects when not ready/unsupported. */
|
|
149
|
+
captureVideo: (options?: CaptureVideoOptions) => Promise<Blob>;
|
|
114
150
|
/** Requests a frame from the connected viewer. */
|
|
115
151
|
invalidate: () => boolean;
|
|
116
152
|
};
|
|
@@ -255,6 +291,11 @@ type ViewerModelProps = {
|
|
|
255
291
|
error: unknown;
|
|
256
292
|
bounds: ViewerModelBounds | null;
|
|
257
293
|
objectCount: number;
|
|
294
|
+
/**
|
|
295
|
+
* The model's glTF material variants, by name; empty when it has none. Show
|
|
296
|
+
* one by setting `sceneConfig.model.materialVariant`.
|
|
297
|
+
*/
|
|
298
|
+
materialVariants: string[];
|
|
258
299
|
/**
|
|
259
300
|
* Every bindable object in the model (see `ViewerObjectInfo`). Filled by
|
|
260
301
|
* `handleObjectCatalog`, so pass that to `ModelViewer`'s `onObjectCatalog`.
|
|
@@ -292,7 +333,8 @@ type UseViewerOptions = {
|
|
|
292
333
|
onLoadError?: (error: unknown) => void;
|
|
293
334
|
};
|
|
294
335
|
/** The ModelViewer props that connect it to `useViewer`; spread them onto it. */
|
|
295
|
-
type UseViewerProps = Required<Pick<ModelViewerProps, "onObjectBindingsChange" | "selectedObject" | "onObjectSelect" | "onObjectHover" | "onCameraChange" | "onViewerReady" | "onModelLoaded" | "onLoadError" | "onObjectCatalog" | "onAnimationsReady" | "onAction">> & {
|
|
336
|
+
type UseViewerProps = Required<Pick<ModelViewerProps, "onObjectBindingsChange" | "selectedObject" | "onObjectSelect" | "onObjectHover" | "onCameraChange" | "onViewerReady" | "onModelLoaded" | "onLoadError" | "onObjectCatalog" | "onAnimationsReady" | "onAction" | "onIsolationChange">> & {
|
|
337
|
+
isolation: ModelViewerProps["isolation"];
|
|
296
338
|
objectBindings: Record<string, ObjectBinding>;
|
|
297
339
|
sceneConfig?: SceneConfig;
|
|
298
340
|
onSceneConfigChange: (config: SceneConfig) => void;
|
|
@@ -308,8 +350,10 @@ type UseViewerResult = {
|
|
|
308
350
|
animations: ViewerAnimationsProps;
|
|
309
351
|
actions: ViewerActionsProps;
|
|
310
352
|
scene: SceneConfigController;
|
|
353
|
+
/** Focus on some objects, ghosting or hiding the rest. */
|
|
354
|
+
isolation: ViewerIsolationProps;
|
|
311
355
|
effects: ViewerEffectsController;
|
|
312
|
-
/** The live viewer, image capture and redraw requests. */
|
|
356
|
+
/** The live viewer, image/video capture and redraw requests. */
|
|
313
357
|
connection: ViewerConnectionController;
|
|
314
358
|
};
|
|
315
359
|
/**
|
|
@@ -350,4 +394,4 @@ type ShareableViewerStateProps = {
|
|
|
350
394
|
};
|
|
351
395
|
declare function useShareableViewerState({ cameraState, setCameraState, objectBindings, onObjectBindingsChange, selectedObjectBinding, setSelectedObjectBinding, paramKey, debounceMs, autoSync, }: UseShareableViewerStateOptions): ShareableViewerStateProps;
|
|
352
396
|
|
|
353
|
-
export { BindingEdit, CaptureImageOptions, type HiddenObjectsState, PublicModelViewer as ModelViewer, ModelViewerProps, ObjectActionEvent, ObjectBinding, ObjectBindingAction, ObjectBindingMaterial, ObjectBindingPatch, ObjectBindingTarget, ObjectBindingTextureChannel, ObjectBindingTextureSlot, ObjectBindingTransform, type ObjectBindingsController, type RuntimeMaterialPatch, type RuntimeMaterialRanges, type RuntimePointLightOptions, type RuntimePointLightPatch, type RuntimeTransformPatch, type RuntimeTransformRanges, SceneConfig, type SceneConfigController, SceneConfigPatch, type SceneConfigUpdate, SceneLight, SceneLightAttachment, SceneLightInput, type SceneLightPatch, type SceneLightsController, type ShareableViewerStateProps, type UseShareableViewerStateOptions, UseViewerCameraOptions, type UseViewerEffectsOptions, type UseViewerOptions, type UseViewerProps, type UseViewerResult, type ViewerActionAnimationController, type ViewerActionBindingsController, type ViewerActionCameraController, type ViewerActionSceneController, type ViewerActionsOptions, type ViewerActionsProps, ViewerAnimationsProps, ViewerCameraProps, ViewerCameraState, type ViewerConnectionController, type ViewerEffectChannels, type ViewerEffectEasing, type ViewerEffectRange, type ViewerEffectTarget, type ViewerEffectsController, type ViewerFlickerOptions, type ViewerHoverProps, type ViewerLightEffectChannel, type ViewerMaterialEffectChannel, ViewerModelBounds, ViewerModelInfo, type ViewerModelProps, ViewerObjectInfo, type ViewerPulseOptions, type ViewerReadyConsumer, type ViewerReadyHandler, ViewerReadyState, type ViewerSelectionProps, type ViewerTimelineOptions, type ViewerTimelineStep, type ViewerTransformEffectChannel, type ViewerTransitionOptions, type ViewerVector3, useObjectBinding, useObjectBindingIds, useObjectBindings, useSceneConfig, useShareableViewerState, useViewer, useViewerActions, useViewerConnection, useViewerEffects, useViewerHover, useViewerModel, useViewerSelection };
|
|
397
|
+
export { BindingEdit, CaptureImageOptions, CaptureVideoOptions, type HiddenObjectsState, PublicModelViewer as ModelViewer, ModelViewerProps, ObjectActionEvent, ObjectBinding, ObjectBindingAction, ObjectBindingDecal, ObjectBindingMaterial, ObjectBindingPatch, ObjectBindingTarget, ObjectBindingTextureChannel, ObjectBindingTextureSlot, ObjectBindingTransform, type ObjectBindingsController, type RuntimeMaterialPatch, type RuntimeMaterialRanges, type RuntimePointLightOptions, type RuntimePointLightPatch, type RuntimeTransformPatch, type RuntimeTransformRanges, SceneConfig, type SceneConfigController, SceneConfigPatch, type SceneConfigUpdate, SceneLight, SceneLightAttachment, SceneLightInput, type SceneLightPatch, type SceneLightsController, type ShareableViewerStateProps, type UseShareableViewerStateOptions, UseViewerCameraOptions, type UseViewerEffectsOptions, type UseViewerOptions, type UseViewerProps, type UseViewerResult, type ViewerActionAnimationController, type ViewerActionBindingsController, type ViewerActionCameraController, type ViewerActionIsolationController, type ViewerActionSceneController, type ViewerActionsOptions, type ViewerActionsProps, ViewerAnimationsProps, ViewerCameraProps, ViewerCameraState, type ViewerConnectionController, type ViewerEffectChannels, type ViewerEffectEasing, type ViewerEffectRange, type ViewerEffectTarget, type ViewerEffectsController, type ViewerFlickerOptions, type ViewerHoverProps, ViewerIsolation, type ViewerIsolationProps, type ViewerLightEffectChannel, type ViewerMaterialEffectChannel, ViewerModelBounds, ViewerModelInfo, type ViewerModelProps, ViewerObjectInfo, type ViewerPulseOptions, type ViewerReadyConsumer, type ViewerReadyHandler, ViewerReadyState, type ViewerSelectionProps, type ViewerTimelineOptions, type ViewerTimelineStep, type ViewerTransformEffectChannel, type ViewerTransitionOptions, type ViewerVector3, useObjectBinding, useObjectBindingIds, useObjectBindings, useSceneConfig, useShareableViewerState, useViewer, useViewerActions, useViewerConnection, useViewerEffects, useViewerHover, useViewerIsolation, useViewerModel, useViewerSelection };
|