@volter/editor-core 0.5.57
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/BUNDLED_NOTICES +1527 -0
- package/LICENSE +686 -0
- package/LICENSE-APACHE +202 -0
- package/NOTICE +18 -0
- package/README.md +24 -0
- package/dist/build/chunk-JS4D4XZ3.js +175 -0
- package/dist/build/chunk-JS4D4XZ3.js.map +7 -0
- package/dist/build/vite-plugin-product-contributions.js +100 -0
- package/dist/build/vite-plugin-product-contributions.js.map +7 -0
- package/dist/build/vite-plugin-shared-react.js +25 -0
- package/dist/build/vite-plugin-shared-react.js.map +7 -0
- package/dist/build/vite-plugin-shared-three.js +86 -0
- package/dist/build/vite-plugin-shared-three.js.map +7 -0
- package/dist/server/chunk-KMJC7AGO.js +98 -0
- package/dist/server/chunk-KMJC7AGO.js.map +7 -0
- package/dist/server/chunk-PSILUMGS.js +46 -0
- package/dist/server/chunk-PSILUMGS.js.map +7 -0
- package/dist/server/frame-proxy.js +255 -0
- package/dist/server/frame-proxy.js.map +7 -0
- package/dist/server/open-browser.js +53 -0
- package/dist/server/open-browser.js.map +7 -0
- package/dist/server/process-shutdown.js +127 -0
- package/dist/server/process-shutdown.js.map +7 -0
- package/dist/server/session-registry.js +141 -0
- package/dist/server/session-registry.js.map +7 -0
- package/dist/server/spawn-opener.js +11 -0
- package/dist/server/spawn-opener.js.map +7 -0
- package/dist/server/worktree-identity.js +11 -0
- package/dist/server/worktree-identity.js.map +7 -0
- package/dist-server/packaged.mjs +88816 -0
- package/package.json +118 -0
- package/scripts/build-plugins.mjs +14 -0
- package/scripts/build-server.mjs +26 -0
- package/scripts/build-session.mjs +9 -0
- package/server/account-credentials.ts +60 -0
- package/server/account-service.ts +1434 -0
- package/server/adapter-region-includes.ts +47 -0
- package/server/asset-catalog-v2.ts +175 -0
- package/server/asset-history-snapshots.ts +196 -0
- package/server/asset-ledger-store.ts +195 -0
- package/server/asset-library-routes.ts +1595 -0
- package/server/blender-wasm-artifact.ts +430 -0
- package/server/boot-timings.ts +106 -0
- package/server/canonical-path.ts +50 -0
- package/server/checkout-workspace-preflight.ts +349 -0
- package/server/cloud-asset-catalog.ts +158 -0
- package/server/coding-inference-launch.ts +237 -0
- package/server/collaboration-account-client.ts +202 -0
- package/server/collaboration-attribution.ts +122 -0
- package/server/collaboration-session.ts +934 -0
- package/server/comfyui-bridge.ts +248 -0
- package/server/console-ledger.ts +499 -0
- package/server/creation-site-transform.ts +304 -0
- package/server/creation-site-write.ts +648 -0
- package/server/data-file-serialize.ts +158 -0
- package/server/editor-brand-html.ts +72 -0
- package/server/editor-control-socket.ts +366 -0
- package/server/editor-server-options.ts +190 -0
- package/server/editor-server.ts +1483 -0
- package/server/editor-sse.ts +352 -0
- package/server/engine-provenance.ts +169 -0
- package/server/engine-source-restart.ts +117 -0
- package/server/frame-bridge.ts +115 -0
- package/server/frame-proxy.ts +490 -0
- package/server/frame-workbench.ts +259 -0
- package/server/frontend-handoff.ts +229 -0
- package/server/game-globals-shadow.ts +113 -0
- package/server/gameplay-session-retention.ts +149 -0
- package/server/gameplay-sessions.ts +123 -0
- package/server/generation-jobs.ts +201 -0
- package/server/generation-reconciler.ts +137 -0
- package/server/generative-execution-context.ts +59 -0
- package/server/git-workflow.ts +612 -0
- package/server/harness-chat-caller.ts +36 -0
- package/server/harness-chat-service.ts +1681 -0
- package/server/idle-shutdown.ts +170 -0
- package/server/js-profiling-policy.ts +52 -0
- package/server/launcher-settings.ts +84 -0
- package/server/local-asset-catalog.ts +410 -0
- package/server/managed-account-defaults.ts +22 -0
- package/server/mock-control-plane.ts +540 -0
- package/server/model-import-conversion.ts +345 -0
- package/server/native-credential-store.ts +162 -0
- package/server/open-browser.ts +118 -0
- package/server/packaged.ts +1192 -0
- package/server/play-stall.ts +126 -0
- package/server/process-shutdown.ts +218 -0
- package/server/product-presets.ts +55 -0
- package/server/project-build-artifact.ts +95 -0
- package/server/project-components.ts +100 -0
- package/server/project-dependency-invalidation.ts +114 -0
- package/server/project-file-scan.ts +235 -0
- package/server/project-hmr-files.ts +215 -0
- package/server/project-install-roots.ts +210 -0
- package/server/project-kinds.ts +71 -0
- package/server/project-mcp-servers.ts +82 -0
- package/server/project-module-freshness.ts +109 -0
- package/server/project-module-instance.ts +375 -0
- package/server/project-optimize-deps-entries.ts +827 -0
- package/server/project-output-writer.ts +679 -0
- package/server/project-package-origin.ts +63 -0
- package/server/project-root-surface.ts +831 -0
- package/server/project-scratch-path.ts +47 -0
- package/server/project-script-hmr.ts +619 -0
- package/server/project-serving-plugins.ts +236 -0
- package/server/project-tools.ts +653 -0
- package/server/project-validation.ts +250 -0
- package/server/project-verbs.ts +127 -0
- package/server/project-view.ts +52 -0
- package/server/project-watch.ts +1134 -0
- package/server/project-work-coordinator.ts +288 -0
- package/server/provider-credentials.ts +331 -0
- package/server/recent-projects-store.ts +98 -0
- package/server/redact-secrets.ts +71 -0
- package/server/repository-presence.ts +267 -0
- package/server/routes/account.ts +357 -0
- package/server/routes/agents.ts +60 -0
- package/server/routes/assets.ts +154 -0
- package/server/routes/build.ts +13 -0
- package/server/routes/collaboration.ts +595 -0
- package/server/routes/configurations.ts +419 -0
- package/server/routes/context.ts +264 -0
- package/server/routes/control-plane.ts +1811 -0
- package/server/routes/logs.ts +272 -0
- package/server/routes/project-identity.ts +302 -0
- package/server/routes/project-open.ts +429 -0
- package/server/routes/project-source.ts +686 -0
- package/server/routes/project-state.ts +383 -0
- package/server/routes/relay.ts +1029 -0
- package/server/routes/route-helpers.ts +29 -0
- package/server/routes/served-modules.ts +138 -0
- package/server/routes/session-tabs.ts +196 -0
- package/server/routes/settings.ts +121 -0
- package/server/routes/share-control.ts +486 -0
- package/server/routes/themes.ts +116 -0
- package/server/routes/tools.ts +230 -0
- package/server/routes/worktrees.ts +595 -0
- package/server/scoped-game-css.ts +461 -0
- package/server/server-utils.ts +1194 -0
- package/server/session-product.ts +112 -0
- package/server/session-registry.ts +230 -0
- package/server/share-claims.ts +138 -0
- package/server/share-host.ts +526 -0
- package/server/share-session-gateway.ts +1362 -0
- package/server/share-tunnel.ts +123 -0
- package/server/spawn-opener.ts +74 -0
- package/server/support/play/log-format.ts +76 -0
- package/server/support/play/session-record.ts +199 -0
- package/server/support/project/build-discipline.ts +718 -0
- package/server/support/project/inspection-node.ts +119 -0
- package/server/support/project/log-naming.ts +54 -0
- package/server/support/project/provenance.ts +290 -0
- package/server/support/project/run-name.ts +18 -0
- package/server/support/project/session-journal.ts +830 -0
- package/server/support/project/shared.ts +327 -0
- package/server/tab-bootstrap.ts +62 -0
- package/server/tab-heartbeat.ts +477 -0
- package/server/tab-lifecycle.ts +550 -0
- package/server/tab-presence.ts +1508 -0
- package/server/team-agent-mirror.ts +95 -0
- package/server/twin-auth.ts +138 -0
- package/server/vendored-lock-recorder.ts +968 -0
- package/server/worktree-identity.ts +121 -0
- package/server/worktree-management.ts +398 -0
- package/server/worktree-retention.d.mts +13 -0
- package/server/worktree-retention.mjs +205 -0
- package/src/EditorContext.tsx +169 -0
- package/src/account.ts +333 -0
- package/src/action-registry.ts +532 -0
- package/src/active-product.ts +74 -0
- package/src/active-project.ts +155 -0
- package/src/adapter-editor-config.ts +25 -0
- package/src/adapter-observation.ts +49 -0
- package/src/animation/stage-transport.ts +379 -0
- package/src/animation/three-clips-subject.ts +172 -0
- package/src/api/asset-library-wire.ts +45 -0
- package/src/api/assets.ts +365 -0
- package/src/api/base.ts +10 -0
- package/src/api/build.ts +99 -0
- package/src/api/git-wire.ts +56 -0
- package/src/api/logs.ts +92 -0
- package/src/api/project-identity.ts +74 -0
- package/src/api/project-open.ts +355 -0
- package/src/api/project-source.ts +162 -0
- package/src/api/project-state.ts +107 -0
- package/src/api/relay.ts +268 -0
- package/src/api/settings.ts +36 -0
- package/src/api/themes.ts +45 -0
- package/src/api/worktrees.ts +257 -0
- package/src/asset-compare-core.ts +171 -0
- package/src/asset-compare.ts +294 -0
- package/src/asset-editor-context.tsx +100 -0
- package/src/asset-events.ts +97 -0
- package/src/asset-inspector-actions.ts +87 -0
- package/src/asset-preview-framing.ts +357 -0
- package/src/asset-preview.ts +2802 -0
- package/src/asset-selection-viewer-registry.ts +113 -0
- package/src/asset-selection.ts +133 -0
- package/src/asset-workflow/asset-capabilities.ts +344 -0
- package/src/asset-workflow/asset-import-jobs.ts +106 -0
- package/src/asset-workflow/asset-ledger-backend.ts +126 -0
- package/src/asset-workflow/asset-ledger.ts +156 -0
- package/src/asset-workflow/asset-materialization-report.ts +140 -0
- package/src/asset-workflow/asset-pack-manifest.ts +320 -0
- package/src/asset-workflow/asset-types.ts +142 -0
- package/src/asset-workflow/asset-workflow-quality.ts +61 -0
- package/src/asset-workflow/audio-preview-player.ts +193 -0
- package/src/asset-workflow/audio-waveform.ts +22 -0
- package/src/asset-workflow/cloud-asset-client.ts +263 -0
- package/src/asset-workflow/folder-preview.ts +345 -0
- package/src/asset-workflow/hosted-asset-materialization.ts +236 -0
- package/src/asset-workflow/image-view-scale.ts +32 -0
- package/src/asset-workflow/import-contract.ts +124 -0
- package/src/asset-workflow/ledger-write-lock.ts +244 -0
- package/src/asset-workflow/model-inspection.ts +818 -0
- package/src/asset-workflow/pixi-spritesheet.ts +197 -0
- package/src/asset-workflow/preview-resource-lifetime.ts +44 -0
- package/src/asset-workflow/project-asset-commands.ts +23 -0
- package/src/asset-workflow/project-asset-health.ts +139 -0
- package/src/asset-workflow/project-asset-operations.ts +154 -0
- package/src/asset-workflow/project-asset-roots.ts +68 -0
- package/src/asset-workflow/project-content.ts +288 -0
- package/src/asset-workflow/project-source-index.ts +550 -0
- package/src/asset-workflow/thumbnail-system.ts +256 -0
- package/src/authoring/active-adapter.ts +199 -0
- package/src/authoring/active-systems.ts +422 -0
- package/src/authoring/adapter-key.ts +18 -0
- package/src/authoring/authoring-asset-url.ts +27 -0
- package/src/authoring/bootstrap-state.ts +49 -0
- package/src/authoring/boundary-authoring-adapter.ts +184 -0
- package/src/authoring/breakpoint-state.ts +43 -0
- package/src/authoring/canvas-scene-guides.ts +76 -0
- package/src/authoring/component-instance-root.ts +171 -0
- package/src/authoring/composite-authoring-adapter.ts +2110 -0
- package/src/authoring/consumer-actions.ts +520 -0
- package/src/authoring/css-numeric-style.ts +97 -0
- package/src/authoring/design-time-layers.ts +849 -0
- package/src/authoring/design-time-mount-registry.ts +235 -0
- package/src/authoring/design-time-settle.ts +343 -0
- package/src/authoring/edit-mode-authoring.ts +619 -0
- package/src/authoring/eyedropper-session.ts +60 -0
- package/src/authoring/instance-source-menu-register.ts +13 -0
- package/src/authoring/instance-source-menu.ts +135 -0
- package/src/authoring/layered-pick.ts +183 -0
- package/src/authoring/live-gesture-lock.ts +50 -0
- package/src/authoring/live-object-transform.ts +62 -0
- package/src/authoring/mount-failure-report.ts +154 -0
- package/src/authoring/mounted-root-subjects.ts +144 -0
- package/src/authoring/no-authoring-adapter.ts +55 -0
- package/src/authoring/null-inspection-subjects.tsx +75 -0
- package/src/authoring/object3d-document-persistence.ts +106 -0
- package/src/authoring/object3d-document-session-registry.ts +120 -0
- package/src/authoring/object3d-document-session.ts +1326 -0
- package/src/authoring/object3d-gesture-controller.ts +113 -0
- package/src/authoring/panel-authoring.ts +121 -0
- package/src/authoring/prefab-instance-inspector-section.tsx +237 -0
- package/src/authoring/prefab-instance-section-model.ts +55 -0
- package/src/authoring/project-authoring-session.ts +105 -0
- package/src/authoring/provenance.ts +99 -0
- package/src/authoring/quarks-particle-systems.ts +19 -0
- package/src/authoring/react-canvas-navigation.ts +255 -0
- package/src/authoring/react-design-canvas-style.ts +20 -0
- package/src/authoring/react-story-board.ts +937 -0
- package/src/authoring/selection-scope.ts +195 -0
- package/src/authoring/shell-document-ops.ts +169 -0
- package/src/authoring/shell-object3d-document-write-policy.ts +108 -0
- package/src/authoring/shell-viewport-policy.ts +48 -0
- package/src/authoring/source-object3d-authoring-adapter.ts +526 -0
- package/src/authoring/stories-scope.ts +35 -0
- package/src/authoring/story-board-chrome-fit.ts +107 -0
- package/src/authoring/story-board-presentation.ts +111 -0
- package/src/authoring/three-projection-core.ts +226 -0
- package/src/authoring/viewport-pick-context.ts +40 -0
- package/src/authoring/viewport-raycast.ts +240 -0
- package/src/authoring/viewport-tool-context.ts +73 -0
- package/src/authoring/world-canvas-viewport-state.ts +35 -0
- package/src/authoring/world-hidden-viewport.ts +152 -0
- package/src/authoring/world-pan-state.ts +198 -0
- package/src/authoring/world-session-state.ts +101 -0
- package/src/authoring/write-pipe.ts +173 -0
- package/src/availability-tick.ts +66 -0
- package/src/bitmap-label.ts +120 -0
- package/src/blender-tab-metrics.ts +161 -0
- package/src/board-open-actions.ts +20 -0
- package/src/boot-routing.ts +391 -0
- package/src/build-identity.ts +15 -0
- package/src/bytes-codec.ts +62 -0
- package/src/camera-authoring.ts +175 -0
- package/src/cancellation-reason.ts +58 -0
- package/src/canvas-preview-frames.ts +482 -0
- package/src/capture-camera-pose.ts +77 -0
- package/src/chrome-registry.ts +159 -0
- package/src/chrome-slot-registry.ts +91 -0
- package/src/collaboration-client.ts +264 -0
- package/src/collaboration-presence.ts +41 -0
- package/src/command-dispatch.ts +19 -0
- package/src/command-listener.ts +2743 -0
- package/src/command-registry.ts +70 -0
- package/src/component-board-registry.ts +205 -0
- package/src/component-states-registry.ts +200 -0
- package/src/components/AgentPresentationNotice.tsx +75 -0
- package/src/components/AlignToolbar.tsx +204 -0
- package/src/components/AppRoot.tsx +394 -0
- package/src/components/ApplicationMenus.tsx +415 -0
- package/src/components/AssetBrowser.tsx +2843 -0
- package/src/components/AssetEditorShell.tsx +216 -0
- package/src/components/AssetInspectorToolSection.tsx +124 -0
- package/src/components/BoardRulers.tsx +354 -0
- package/src/components/CameraInfo.tsx +81 -0
- package/src/components/CanvasSceneViewport.tsx +556 -0
- package/src/components/CapabilityCoverageSection.tsx +185 -0
- package/src/components/CenterDocuments.tsx +22 -0
- package/src/components/ChromeSlot.tsx +20 -0
- package/src/components/CodeView.tsx +470 -0
- package/src/components/CollaborationHeaderControl.css +74 -0
- package/src/components/CompactInspectorCard.tsx +190 -0
- package/src/components/CompactInspectorShell.tsx +39 -0
- package/src/components/ConsolePanel.css +55 -0
- package/src/components/ConsolePanel.tsx +270 -0
- package/src/components/DefaultEditorLayout.tsx +106 -0
- package/src/components/DocumentHeaderStrip.tsx +96 -0
- package/src/components/DocumentShelfRail.tsx +45 -0
- package/src/components/DocumentThumbnail.tsx +345 -0
- package/src/components/EditorLeaseGuard.tsx +372 -0
- package/src/components/ErrorBanner.tsx +123 -0
- package/src/components/FolderPreviewTile.tsx +159 -0
- package/src/components/GameHierarchy.tsx +3842 -0
- package/src/components/GameplaySessionTimeline.tsx +295 -0
- package/src/components/InspectionProjection.tsx +968 -0
- package/src/components/Inspector.tsx +233 -0
- package/src/components/InspectorCanvasPreview.tsx +35 -0
- package/src/components/InspectorFieldsSection.tsx +290 -0
- package/src/components/InspectorObjectPreview.tsx +57 -0
- package/src/components/InspectorStoriesSection.tsx +92 -0
- package/src/components/InspectorToolSection.tsx +96 -0
- package/src/components/InspectorTransformSection.tsx +245 -0
- package/src/components/LightExplorerPanel.tsx +433 -0
- package/src/components/MediaProperties.tsx +145 -0
- package/src/components/NonThreeAuthoringBootstrap.tsx +19 -0
- package/src/components/Object3DDocumentToolbar.css +100 -0
- package/src/components/Object3DDocumentToolbar.tsx +454 -0
- package/src/components/Object3DDocumentViewport.tsx +58 -0
- package/src/components/ProjectHeader.css +617 -0
- package/src/components/ProjectHeader.tsx +328 -0
- package/src/components/ProjectLayout.tsx +249 -0
- package/src/components/ReactCanvasControls.tsx +284 -0
- package/src/components/RootSelectionOverlay.tsx +3162 -0
- package/src/components/RootTextEditor.tsx +79 -0
- package/src/components/SaveStatus.tsx +70 -0
- package/src/components/StageHost.tsx +1954 -0
- package/src/components/StageOverlays.tsx +21 -0
- package/src/components/StartupErrorScreen.tsx +76 -0
- package/src/components/StartupLoadingScreen.tsx +65 -0
- package/src/components/StatsOverlay.tsx +78 -0
- package/src/components/SurfaceStateOverlay.tsx +24 -0
- package/src/components/ToolContributionSurfaces.tsx +65 -0
- package/src/components/ToolHost.tsx +370 -0
- package/src/components/ToolObject3DPreview.tsx +39 -0
- package/src/components/Toolbar.tsx +595 -0
- package/src/components/TransientHint.tsx +44 -0
- package/src/components/TransportStrip.tsx +174 -0
- package/src/components/VersionControlSection.tsx +470 -0
- package/src/components/VgaiLogo.css +83 -0
- package/src/components/VgaiLogo.tsx +35 -0
- package/src/components/ViewportControlsHint.tsx +60 -0
- package/src/components/ViewportFurniture.tsx +401 -0
- package/src/components/ViewportOverlay.tsx +145 -0
- package/src/components/ViewportOverlaysMenu.tsx +153 -0
- package/src/components/ViewportShadingMenu.tsx +300 -0
- package/src/components/ViewportViewMenu.tsx +101 -0
- package/src/components/WorkspaceDocumentSurface.tsx +204 -0
- package/src/components/WorkspaceUtilitySurface.tsx +22 -0
- package/src/components/WorktreeSwitcher.css +239 -0
- package/src/components/WorktreeSwitcher.tsx +890 -0
- package/src/components/account-documents.tsx +1162 -0
- package/src/components/asset-documents.tsx +812 -0
- package/src/components/asset-editor-persistence.ts +216 -0
- package/src/components/asset-selection-section.tsx +535 -0
- package/src/components/asset-thumbnails.tsx +312 -0
- package/src/components/asset-viewers/AudioViewer.tsx +201 -0
- package/src/components/asset-viewers/EntityModelDocument.tsx +122 -0
- package/src/components/asset-viewers/EnvironmentAssetDocument.tsx +440 -0
- package/src/components/asset-viewers/GenericJsonViewer.tsx +102 -0
- package/src/components/asset-viewers/ImageViewer.tsx +300 -0
- package/src/components/asset-viewers/JsonAssetDocument.tsx +93 -0
- package/src/components/asset-viewers/LiveModuleDocument.tsx +417 -0
- package/src/components/asset-viewers/LutAssetDocument.tsx +444 -0
- package/src/components/asset-viewers/ModelAssetDocument.tsx +105 -0
- package/src/components/asset-viewers/Object3DPreview.tsx +359 -0
- package/src/components/asset-viewers/OnlineAssetDetail.tsx +421 -0
- package/src/components/asset-viewers/PasteboardModuleDocument.tsx +67 -0
- package/src/components/asset-viewers/QuarksAssetDocument.tsx +526 -0
- package/src/components/asset-viewers/ShaderAssetDocument.tsx +743 -0
- package/src/components/asset-viewers/SourceAssetViewer.tsx +281 -0
- package/src/components/asset-viewers/SpritesheetSpriteView.tsx +102 -0
- package/src/components/asset-viewers/VideoViewer.tsx +101 -0
- package/src/components/asset-viewers/shader-source.ts +144 -0
- package/src/components/asset-workflow.css +731 -0
- package/src/components/board-guides.ts +150 -0
- package/src/components/compact-inspector.css +539 -0
- package/src/components/core-utilities.tsx +90 -0
- package/src/components/editor-notifications.css +40 -0
- package/src/components/engine-workspace.css +274 -0
- package/src/components/inspector-preview-section.tsx +238 -0
- package/src/components/inspector-property-grouping.ts +64 -0
- package/src/components/inspector-revert-label.ts +20 -0
- package/src/components/inspector-selection.ts +42 -0
- package/src/components/inspector-stories-gating.ts +171 -0
- package/src/components/inspector-transform-subject.ts +11 -0
- package/src/components/inspector-transform.ts +75 -0
- package/src/components/kind-documents.tsx +500 -0
- package/src/components/palette-action-publisher.tsx +140 -0
- package/src/components/primitives/DraftColorInput.tsx +74 -0
- package/src/components/product-shell.css +1829 -0
- package/src/components/project-tool-documents.tsx +410 -0
- package/src/components/scene-documents.tsx +223 -0
- package/src/components/stage-keyboard.tsx +37 -0
- package/src/components/stage-overlay-set.tsx +107 -0
- package/src/components/stage-presence-markers.ts +478 -0
- package/src/components/standard-viewport-dressing.ts +417 -0
- package/src/components/status-contributions.tsx +403 -0
- package/src/components/tool-documents.tsx +309 -0
- package/src/components/tool-schema-form.tsx +262 -0
- package/src/components/use-after-paint.ts +41 -0
- package/src/components/use-project-image-assets.ts +86 -0
- package/src/components/viewport-header-controls.css +90 -0
- package/src/components/viewport-surface-status.tsx +55 -0
- package/src/components/workspace-history.ts +32 -0
- package/src/components/workspace-static-panel-registry.tsx +152 -0
- package/src/components/workspace-surfaces.css +621 -0
- package/src/components/world-documents.tsx +586 -0
- package/src/components/world-overlay-gestures.ts +1694 -0
- package/src/composite-screenshot.ts +1641 -0
- package/src/console-sync.ts +131 -0
- package/src/constraint-helper.ts +338 -0
- package/src/content-entry-source-registry.ts +184 -0
- package/src/coverage/authoring-seam-evidence.ts +300 -0
- package/src/coverage/canvas-reveal.ts +192 -0
- package/src/coverage/design-time-surfaces.ts +101 -0
- package/src/coverage/live-seam-evidence.ts +11 -0
- package/src/coverage/ontology-invariants.ts +466 -0
- package/src/coverage/session-vitals.ts +501 -0
- package/src/coverage/system-seam-evidence.ts +72 -0
- package/src/crash-null-boundary.ts +36 -0
- package/src/creation-site-edit.ts +1479 -0
- package/src/creation-site-registry.ts +160 -0
- package/src/delegate-harness-registry.ts +143 -0
- package/src/document-context-registry.ts +177 -0
- package/src/document-open-registry.ts +200 -0
- package/src/document-preview-source.ts +20 -0
- package/src/document-renderer-session.ts +138 -0
- package/src/editor-api.ts +46 -0
- package/src/editor-chrome-capture.ts +139 -0
- package/src/editor-commands.ts +164 -0
- package/src/editor-console.ts +563 -0
- package/src/editor-current-view.ts +82 -0
- package/src/editor-document-probe.ts +881 -0
- package/src/editor-git-client.ts +115 -0
- package/src/editor-host-door.ts +462 -0
- package/src/editor-hotkeys.ts +842 -0
- package/src/editor-lease-view.ts +39 -0
- package/src/editor-lease.ts +415 -0
- package/src/editor-mode.ts +19 -0
- package/src/editor-notifications.ts +140 -0
- package/src/editor-presence.ts +563 -0
- package/src/editor-presentation-activity.ts +50 -0
- package/src/editor-presentation-notice.ts +42 -0
- package/src/editor-runtime.tsx +145 -0
- package/src/editor-server-response.ts +86 -0
- package/src/editor-session-attribution.ts +75 -0
- package/src/editor-session-mode.ts +54 -0
- package/src/editor-shell-store.ts +1304 -0
- package/src/editor-state-facets.ts +74 -0
- package/src/editor-styles.css +33 -0
- package/src/editor-view-presentation.ts +810 -0
- package/src/editor-viewport.ts +5302 -0
- package/src/entity-lod.ts +31 -0
- package/src/entity-object.ts +91 -0
- package/src/files/file-provider.ts +62 -0
- package/src/files/project-files.ts +264 -0
- package/src/finders/index.ts +136 -0
- package/src/finders/scenes-from-entrypoint-selection.ts +387 -0
- package/src/frame/bridge.tsx +1408 -0
- package/src/frame/product.ts +77 -0
- package/src/gameplay-dom-recording.ts +319 -0
- package/src/gameplay-export-state.ts +14 -0
- package/src/gameplay-replay.ts +417 -0
- package/src/gameplay-session-time.ts +9 -0
- package/src/gameplay-sessions.ts +204 -0
- package/src/harness-chat-types.ts +253 -0
- package/src/hierarchy-component-marks.ts +298 -0
- package/src/hierarchy-drop.ts +91 -0
- package/src/hierarchy-expansion-state.ts +80 -0
- package/src/hierarchy-header-slot.ts +52 -0
- package/src/hierarchy-internals.ts +197 -0
- package/src/hierarchy-kind-icon.ts +217 -0
- package/src/hierarchy-mark-reader.ts +73 -0
- package/src/hierarchy-menu-registry.ts +67 -0
- package/src/hierarchy-node-rows.ts +307 -0
- package/src/hierarchy-panel-view.ts +280 -0
- package/src/hierarchy-projection.ts +76 -0
- package/src/hierarchy-row-cache.ts +243 -0
- package/src/hierarchy-row-model.ts +308 -0
- package/src/hierarchy-rows.ts +11 -0
- package/src/hierarchy-walk.ts +86 -0
- package/src/history/editor-session.ts +25 -0
- package/src/history/history-commands.ts +147 -0
- package/src/history/history-delegate.ts +163 -0
- package/src/history/history-limit-notices.ts +43 -0
- package/src/history/history-service.ts +1173 -0
- package/src/history/persistence-coordinator.ts +35 -0
- package/src/history/project-file-history.ts +386 -0
- package/src/history/project-root-history-backends.ts +139 -0
- package/src/history/resource-registry.ts +209 -0
- package/src/history/snapshot-store.ts +103 -0
- package/src/history/source-history-backend.ts +546 -0
- package/src/history/types.ts +124 -0
- package/src/hmr-registration-group.ts +67 -0
- package/src/hmr-stable-react-context.ts +23 -0
- package/src/hotkeys.ts +188 -0
- package/src/inference-diagnostics.ts +69 -0
- package/src/initial-project.ts +80 -0
- package/src/inspection/active-subject.ts +578 -0
- package/src/inspection/active-surface.ts +142 -0
- package/src/inspection/compose.ts +1064 -0
- package/src/inspection/display.ts +170 -0
- package/src/inspection/document-subject.ts +109 -0
- package/src/inspection/game-subject.ts +85 -0
- package/src/inspection/model.ts +542 -0
- package/src/inspection/null-subject.ts +115 -0
- package/src/inspection/serialize.ts +357 -0
- package/src/inspection/use-active-inspection.ts +180 -0
- package/src/inspector-presentation.ts +201 -0
- package/src/inspector-section-registry.ts +221 -0
- package/src/instance-source-actions.ts +163 -0
- package/src/instanced-presentation.ts +164 -0
- package/src/js-heap.ts +71 -0
- package/src/key-actions.ts +91 -0
- package/src/keymap-presets.ts +401 -0
- package/src/layout-policy.ts +31 -0
- package/src/learn-links.ts +73 -0
- package/src/light-explorer-model.ts +134 -0
- package/src/live-canvas-frame.ts +55 -0
- package/src/live-document.ts +279 -0
- package/src/live-module-source.ts +230 -0
- package/src/live-session-registry.ts +220 -0
- package/src/live-transition.ts +633 -0
- package/src/manifest-project.ts +107 -0
- package/src/model-thumbnail.ts +523 -0
- package/src/native-selection-style.ts +202 -0
- package/src/object3d-document-write-policy.ts +137 -0
- package/src/packaged-runtime.ts +108 -0
- package/src/palettes/maya.palette.json +57 -0
- package/src/palettes/substance.palette.json +57 -0
- package/src/pasteboard-module.ts +81 -0
- package/src/performance-profiler.ts +367 -0
- package/src/performance-sources.ts +69 -0
- package/src/play-boot-phase.ts +145 -0
- package/src/presentation-surface.ts +248 -0
- package/src/project-adapter.ts +1143 -0
- package/src/project-asset-refresh.ts +26 -0
- package/src/project-declaration-refresh.ts +31 -0
- package/src/project-local-state.ts +118 -0
- package/src/project-manager.ts +243 -0
- package/src/project-module-changes.ts +163 -0
- package/src/project-module-split.ts +266 -0
- package/src/project-provenance.ts +115 -0
- package/src/project-ready.ts +42 -0
- package/src/project-session-reset.ts +67 -0
- package/src/project-shape.ts +68 -0
- package/src/project-tool-discovery.ts +66 -0
- package/src/project-tools.ts +107 -0
- package/src/project-work-types.ts +149 -0
- package/src/projection/three.ts +898 -0
- package/src/projection/types.ts +44 -0
- package/src/readiness.ts +113 -0
- package/src/reflection-probe-helper.ts +142 -0
- package/src/reported-play-state.ts +90 -0
- package/src/resolve-relative-specifier.ts +33 -0
- package/src/scene-document-plan.ts +315 -0
- package/src/scene-framing.ts +315 -0
- package/src/scene-live-open.ts +210 -0
- package/src/scene-view-fog.ts +89 -0
- package/src/scoped-game-css.ts +152 -0
- package/src/session-orphan-record.ts +193 -0
- package/src/session-tombstone.ts +126 -0
- package/src/settings/settings-provider.ts +82 -0
- package/src/settings-store.ts +345 -0
- package/src/shared-view-restore.ts +42 -0
- package/src/shell-store-door.ts +45 -0
- package/src/source-conflict.ts +122 -0
- package/src/spatial-handle-visuals.ts +332 -0
- package/src/stage-context.ts +341 -0
- package/src/stage-store-registry.ts +63 -0
- package/src/stale-chunk-recovery.ts +34 -0
- package/src/state-report-deferral.ts +73 -0
- package/src/storage/host-files-storage.ts +97 -0
- package/src/storage/http-storage.ts +174 -0
- package/src/storage/index.ts +75 -0
- package/src/storage/mem-storage.ts +149 -0
- package/src/storage/path-lock.ts +44 -0
- package/src/storage/paths.ts +26 -0
- package/src/storage/types.ts +116 -0
- package/src/stories/StoryComponentThumbnail.tsx +184 -0
- package/src/stories/StoryPreviewMount.tsx +306 -0
- package/src/stories/component-content-source.tsx +106 -0
- package/src/stories/component-states-source.ts +78 -0
- package/src/stories/compose-project-stories.ts +255 -0
- package/src/stories/pixi-story-model.ts +30 -0
- package/src/stories/prefabs-finder.ts +54 -0
- package/src/stories/prefabs-from-stories.ts +182 -0
- package/src/stories/project-story-discovery.ts +78 -0
- package/src/stories/project-story-regions.ts +24 -0
- package/src/stories/story-actions.ts +54 -0
- package/src/stories/story-capture-command.ts +124 -0
- package/src/stories/story-capture.ts +584 -0
- package/src/stories/story-declared-medium.ts +126 -0
- package/src/stories/story-discovery.ts +176 -0
- package/src/stories/story-document-openers.ts +36 -0
- package/src/stories/story-dom-runtime.ts +78 -0
- package/src/stories/story-grouping.ts +111 -0
- package/src/stories/story-lane.ts +88 -0
- package/src/stories/story-mount-turn.ts +27 -0
- package/src/stories/story-opener.ts +260 -0
- package/src/stories/story-pixi-preview.ts +408 -0
- package/src/stories/story-presentation.ts +215 -0
- package/src/stories/story-registry.ts +517 -0
- package/src/stories/story-three-preview.ts +807 -0
- package/src/stories/three-story-model.ts +96 -0
- package/src/story-three-preview-runtime.ts +56 -0
- package/src/surface-keyboard.ts +112 -0
- package/src/surface-state.ts +124 -0
- package/src/tab-bootstrap.js +628 -0
- package/src/tab-census.ts +198 -0
- package/src/tab-lifecycle-client.ts +196 -0
- package/src/theme-library.ts +844 -0
- package/src/theme-preference.ts +378 -0
- package/src/theme.css +3437 -0
- package/src/three-viewport/bone-selection-highlight.ts +119 -0
- package/src/three-viewport/camera-fit.ts +41 -0
- package/src/three-viewport/interactive-renderer.ts +132 -0
- package/src/three-viewport/selection-brackets.ts +310 -0
- package/src/three-viewport/selection-outline.ts +183 -0
- package/src/three-viewport/skeleton-helper.ts +61 -0
- package/src/three-viewport/source-color.ts +167 -0
- package/src/three-viewport/studio-environment.ts +96 -0
- package/src/three-viewport-presentation.ts +23 -0
- package/src/tool-contribution-play.ts +74 -0
- package/src/tool-loader.ts +1798 -0
- package/src/transform-mode-request.ts +57 -0
- package/src/transient-hint.ts +78 -0
- package/src/trigger-volume-helper.ts +116 -0
- package/src/ui-source/adapter-region-includes.ts +241 -0
- package/src/ui-source/ensure-import.ts +132 -0
- package/src/ui-source/file-region-resolver.ts +302 -0
- package/src/ui-source/inspect.ts +775 -0
- package/src/ui-source/oid-transform.ts +1845 -0
- package/src/ui-source/plan-csf-story.ts +196 -0
- package/src/ui-source/plan-extract-component.ts +421 -0
- package/src/ui-source/plan-fork-component.ts +621 -0
- package/src/ui-source/plan-named-style.ts +95 -0
- package/src/ui-source/plan-source-edit.ts +353 -0
- package/src/ui-source/r3f-contract-resolver.ts +327 -0
- package/src/ui-source/r3f-diagnostic-index.ts +165 -0
- package/src/ui-source/r3f-environment-binding.ts +133 -0
- package/src/ui-source/r3f-joint-binding.ts +251 -0
- package/src/ui-source/r3f-lod-binding.ts +91 -0
- package/src/ui-source/r3f-particle-binding.ts +235 -0
- package/src/ui-source/r3f-physics-binding.ts +483 -0
- package/src/ui-source/r3f-project-contracts.ts +444 -0
- package/src/ui-source/relative-import-specifier.ts +34 -0
- package/src/ui-source/reparent-guard.ts +544 -0
- package/src/ui-source/source-edit-request.ts +97 -0
- package/src/ui-source/source-write-backend.ts +618 -0
- package/src/ui-source/syntactic-prop-specs.ts +296 -0
- package/src/ui-source/tier-source-write-backend.ts +279 -0
- package/src/ui-source/ts-ast.ts +171 -0
- package/src/ui-source/utility-class-support.ts +169 -0
- package/src/ui-source/write-component-default.ts +133 -0
- package/src/ui-source/writer.ts +1989 -0
- package/src/viewport-activation-timings.ts +840 -0
- package/src/viewport-authoring-policy.ts +186 -0
- package/src/viewport-controls-hint.ts +57 -0
- package/src/viewport-door.ts +237 -0
- package/src/viewport-shading-boundary.ts +12 -0
- package/src/vite-error-surface.ts +141 -0
- package/src/wait-until.ts +37 -0
- package/src/workspace-areas.ts +156 -0
- package/src/workspace-aux-commands.ts +11 -0
- package/src/workspace-available-documents.ts +127 -0
- package/src/workspace-core-utilities.ts +31 -0
- package/src/workspace-document-ids.ts +59 -0
- package/src/workspace-document-registry.ts +612 -0
- package/src/workspace-document-restore.ts +145 -0
- package/src/workspace-host-commands.ts +141 -0
- package/src/workspace-persistence-gate.ts +40 -0
- package/src/workspace-play-utilities.ts +44 -0
- package/src/workspace-presets.ts +425 -0
- package/src/workspace-regions.ts +294 -0
- package/src/workspace-state-persistence.ts +536 -0
- package/src/workspace-static-panels.ts +73 -0
- package/src/workspace-status-registry.ts +121 -0
- package/src/workspace-style.ts +239 -0
- package/src/workspace-utility-commands.ts +74 -0
- package/src/workspace-utility-registry.ts +263 -0
- package/src/workspace-viewport-rect.ts +97 -0
- package/src/world-adoption.ts +115 -0
- package/src/world-document-routing.ts +104 -0
- package/vite-plugin-creation-site-write.ts +184 -0
- package/vite-plugin-creation-site.ts +80 -0
- package/vite-plugin-game-static.ts +303 -0
- package/vite-plugin-module-doorways.ts +336 -0
- package/vite-plugin-product-contributions.ts +197 -0
- package/vite-plugin-project-game-static.ts +125 -0
- package/vite-plugin-project-jsx-js.ts +65 -0
- package/vite-plugin-project-root-absolute-assets.ts +359 -0
- package/vite-plugin-shared-react.ts +420 -0
- package/vite-plugin-shared-three.ts +203 -0
- package/vite-plugin-ui-oid.ts +2106 -0
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PERSISTENT BOARD GUIDES (design ledger: snapping/guides — "persistent
|
|
3
|
+
* guides do not ship"). User-placed ruler guides on the DOM component board,
|
|
4
|
+
* in BOARD coordinates (the same space the frames are laid out in, so a
|
|
5
|
+
* guide stays put under pan/zoom).
|
|
6
|
+
*
|
|
7
|
+
* Persistence: per-project, per-document localStorage — the
|
|
8
|
+
* `device-preview.ts` idiom (keyed by `getCurrentProject().rootPath`; UI
|
|
9
|
+
* convenience, never project truth). A guide is a design AID: it has no
|
|
10
|
+
* rendered meaning in the game, so it must never be written into game
|
|
11
|
+
* source — the same reasoning that keeps the workspace layout and the device
|
|
12
|
+
* preset out of the project.
|
|
13
|
+
*
|
|
14
|
+
* The snap seam: `RootSelectionOverlay`'s gestures snap in HOST-relative
|
|
15
|
+
* space (a per-world frame inside the board), so the board registers its
|
|
16
|
+
* live transform here ({@link registerBoardGuideTransform}) and the overlay
|
|
17
|
+
* asks for guide edges in CLIENT space ({@link guideClientEdges}) to convert
|
|
18
|
+
* against its own host origin.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import { getCurrentProject } from '../project-manager';
|
|
22
|
+
|
|
23
|
+
export interface BoardGuide {
|
|
24
|
+
readonly id: string;
|
|
25
|
+
/** 'x' = vertical guide at a board X; 'y' = horizontal guide at a board Y. */
|
|
26
|
+
readonly axis: 'x' | 'y';
|
|
27
|
+
/** Board-space coordinate. */
|
|
28
|
+
readonly value: number;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const STORAGE_KEY = 'vgai:board-guides:v1';
|
|
32
|
+
|
|
33
|
+
type Stored = Record<string, Record<string, BoardGuide[]>>;
|
|
34
|
+
|
|
35
|
+
function storage(): Storage | null {
|
|
36
|
+
return typeof window === 'undefined' ? null : window.localStorage;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function projectKey(): string {
|
|
40
|
+
try {
|
|
41
|
+
return getCurrentProject()?.rootPath ?? '(no-project)';
|
|
42
|
+
} catch {
|
|
43
|
+
return '(no-project)';
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function readAll(): Stored {
|
|
48
|
+
try {
|
|
49
|
+
return JSON.parse(storage()?.getItem(STORAGE_KEY) ?? '{}') as Stored;
|
|
50
|
+
} catch {
|
|
51
|
+
return {};
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function writeAll(all: Stored): void {
|
|
56
|
+
try {
|
|
57
|
+
storage()?.setItem(STORAGE_KEY, JSON.stringify(all));
|
|
58
|
+
} catch {
|
|
59
|
+
// Quota/denied — guides silently stay session-only; the next write retries.
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const listeners = new Set<() => void>();
|
|
64
|
+
let cache: Record<string, BoardGuide[]> | null = null;
|
|
65
|
+
let nextId = Date.now() % 1_000_000;
|
|
66
|
+
|
|
67
|
+
function docs(): Record<string, BoardGuide[]> {
|
|
68
|
+
if (!cache) cache = readAll()[projectKey()] ?? {};
|
|
69
|
+
return cache;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function persist(): void {
|
|
73
|
+
const all = readAll();
|
|
74
|
+
all[projectKey()] = docs();
|
|
75
|
+
writeAll(all);
|
|
76
|
+
for (const listener of listeners) listener();
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const EMPTY_GUIDES: readonly BoardGuide[] = [];
|
|
80
|
+
|
|
81
|
+
export function boardGuides(docId: string): readonly BoardGuide[] {
|
|
82
|
+
// Referentially stable for a guide-less document: this is a
|
|
83
|
+
// `useSyncExternalStore` snapshot, and a fresh `[]` per call is an
|
|
84
|
+
// infinite re-render (measured: it crashed the whole editor surface with
|
|
85
|
+
// "Maximum update depth exceeded" on first mount).
|
|
86
|
+
return docs()[docId] ?? EMPTY_GUIDES;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export function subscribeBoardGuides(listener: () => void): () => void {
|
|
90
|
+
listeners.add(listener);
|
|
91
|
+
return () => listeners.delete(listener);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export function addBoardGuide(docId: string, axis: BoardGuide['axis'], value: number): string {
|
|
95
|
+
nextId += 1;
|
|
96
|
+
const id = `guide-${nextId}`;
|
|
97
|
+
docs()[docId] = [...boardGuides(docId), { id, axis, value }];
|
|
98
|
+
persist();
|
|
99
|
+
return id;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export function moveBoardGuide(docId: string, id: string, value: number): void {
|
|
103
|
+
docs()[docId] = boardGuides(docId).map((g) => (g.id === id ? { ...g, value } : g));
|
|
104
|
+
persist();
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export function removeBoardGuide(docId: string, id: string): void {
|
|
108
|
+
docs()[docId] = boardGuides(docId).filter((g) => g.id !== id);
|
|
109
|
+
persist();
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// --- The live board transform, for the overlay's snap conversion ---
|
|
113
|
+
|
|
114
|
+
export interface BoardGuideTransform {
|
|
115
|
+
/** The board container's client origin. */
|
|
116
|
+
readonly originX: number;
|
|
117
|
+
readonly originY: number;
|
|
118
|
+
/** The board pan/zoom (client = origin + pan + value * zoom). */
|
|
119
|
+
readonly panX: number;
|
|
120
|
+
readonly panY: number;
|
|
121
|
+
readonly zoom: number;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
let activeTransform: { docId: string; transform: BoardGuideTransform } | null = null;
|
|
125
|
+
|
|
126
|
+
/** The mounted board registers its transform (and clears it on unmount) so
|
|
127
|
+
* guide coordinates can be answered in client space. One DOM board is
|
|
128
|
+
* active at a time; a second registration simply replaces the first. */
|
|
129
|
+
export function registerBoardGuideTransform(
|
|
130
|
+
docId: string,
|
|
131
|
+
transform: BoardGuideTransform | null,
|
|
132
|
+
): void {
|
|
133
|
+
activeTransform = transform ? { docId, transform } : null;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/** Every guide of the registered board, as CLIENT-space edge coordinates —
|
|
137
|
+
* what a gesture overlay converts against its own host origin. Empty when
|
|
138
|
+
* no board is registered (nothing to snap to, honestly). */
|
|
139
|
+
export function guideClientEdges(): { x: number[]; y: number[] } {
|
|
140
|
+
if (!activeTransform) return { x: [], y: [] };
|
|
141
|
+
const { docId, transform } = activeTransform;
|
|
142
|
+
const x: number[] = [];
|
|
143
|
+
const y: number[] = [];
|
|
144
|
+
for (const guide of boardGuides(docId)) {
|
|
145
|
+
if (guide.axis === 'x')
|
|
146
|
+
x.push(transform.originX + transform.panX + guide.value * transform.zoom);
|
|
147
|
+
else y.push(transform.originY + transform.panY + guide.value * transform.zoom);
|
|
148
|
+
}
|
|
149
|
+
return { x, y };
|
|
150
|
+
}
|
|
@@ -0,0 +1,539 @@
|
|
|
1
|
+
/* The inspector's DEFAULT presentation is a NARROW COLUMN (owner, 2026-08-19):
|
|
2
|
+
* identity row, a SECTION-ICON STRIP that signposts what the subject has and
|
|
3
|
+
* jumps to a section, then the sections stacked. The `card` presentation is the
|
|
4
|
+
* space-tight fallback — a MINI card (preview, name, the same strip,
|
|
5
|
+
* open-for-edit) that collapses at the floor to a single-line PILL.
|
|
6
|
+
*
|
|
7
|
+
* This geometry is CSS rather than inline style because the strip RE-SCOPES a
|
|
8
|
+
* canonical control it does not own: the icon buttons are ghost icon buttons
|
|
9
|
+
* held one notch quieter than their resting paint. A product surface re-scopes
|
|
10
|
+
* those through the stylesheet, never by painting a `<Button>` inline.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/* The SECTION-ICON STRIP — one glyph per section, shared by the column and the
|
|
14
|
+
mini card. A horizontal, wrapping row of compact ghost icon buttons under a
|
|
15
|
+
hairline rule, so it reads as a table of contents rather than a toolbar of
|
|
16
|
+
commands. */
|
|
17
|
+
.vgai-inspector-icon-strip {
|
|
18
|
+
display: flex;
|
|
19
|
+
flex-wrap: wrap;
|
|
20
|
+
align-items: center;
|
|
21
|
+
gap: var(--vgai-space-1);
|
|
22
|
+
padding: var(--vgai-space-1) var(--vgai-space-2);
|
|
23
|
+
border-bottom: 1px solid var(--vgai-structural-divider);
|
|
24
|
+
}
|
|
25
|
+
.vgai-inspector-icon-strip .vgai-btn[data-variant="ghost"] {
|
|
26
|
+
color: var(--vgai-content-dim);
|
|
27
|
+
}
|
|
28
|
+
.vgai-inspector-icon-strip .vgai-btn[data-variant="ghost"]:hover:not(:disabled) {
|
|
29
|
+
color: var(--vgai-content-primary);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/* The PROPERTIES presentation — Blender's Properties editor: a vertical TAB
|
|
33
|
+
RAIL down the area's whole left edge, and everything else (the breadcrumb,
|
|
34
|
+
the datablock row, the one open section) in the column beside it. */
|
|
35
|
+
.vgai-inspector-properties {
|
|
36
|
+
display: flex;
|
|
37
|
+
align-items: stretch;
|
|
38
|
+
/* The rail runs the AREA's whole left edge in the reference, so the split
|
|
39
|
+
owns the full height and the identity rows live in the body beside it. */
|
|
40
|
+
min-height: 100%;
|
|
41
|
+
}
|
|
42
|
+
/* …AND `100%` OF WHAT. The line above is the intent and it was shipping as
|
|
43
|
+
prose only: driven cold 2026-09-19 in a models scaffold, the rail measured
|
|
44
|
+
68 px tall in a 698.5 px dock panel, because a percentage min-height needs
|
|
45
|
+
a definite containing block and every ancestor between here and the dock
|
|
46
|
+
panel sized to its content. The rail stopped under the second tab and the
|
|
47
|
+
column below it painted `surface-panel` — the BODY's own fill — so the
|
|
48
|
+
rail did not read as a rail at all.
|
|
49
|
+
BLENDER'S RUNS THE WHOLE COLUMN, measured on `modeling-edit-none.png` down
|
|
50
|
+
x 2849: the last tab's cell ends at device y 1322 and `#171717` continues
|
|
51
|
+
for 377 more device rows (188.5 CSS) to the bottom of the editor. Below
|
|
52
|
+
its 14 tabs there is still rail.
|
|
53
|
+
SCOPED TO THE PRESENTATION THAT ASKED FOR IT. The panel already stamps
|
|
54
|
+
`data-vgai-inspector-presentation`, so the narrow column, the mini card
|
|
55
|
+
and the pill are untouched — the other three presentations have no rail
|
|
56
|
+
to stretch and a filling scroll container would change where their
|
|
57
|
+
content sits. */
|
|
58
|
+
[data-vgai-inspector-presentation="properties"] {
|
|
59
|
+
flex: 1 1 auto;
|
|
60
|
+
/* A scroll container in a column flex parent will not shrink past its
|
|
61
|
+
content without this, which is how the panel would gain the height and
|
|
62
|
+
lose the scroll in the same edit. */
|
|
63
|
+
min-height: 0;
|
|
64
|
+
}
|
|
65
|
+
[data-vgai-inspector-presentation="properties"] > .vgai-inspector-properties-fill {
|
|
66
|
+
flex: 1 1 auto;
|
|
67
|
+
min-height: 0;
|
|
68
|
+
display: flex;
|
|
69
|
+
flex-direction: column;
|
|
70
|
+
}
|
|
71
|
+
/* THE PROPERTIES TAB RAIL, re-measured on the native 2x `modeling.png` (the
|
|
72
|
+
earlier pass read a halved frame and got the boxes wrong). Source
|
|
73
|
+
coordinates are in the 2x frame; every number below is its half:
|
|
74
|
+
|
|
75
|
+
rail column x 2845..2900 = 28 CSS px wide, filled #171717 (y=1500, below
|
|
76
|
+
the last tab — the fill the tabs sit ON, which the earlier
|
|
77
|
+
reading mistook for the tab colour)
|
|
78
|
+
a tab x 2847..2900 = 27 CSS px, so the rail's only gutter is 1 px
|
|
79
|
+
on the LEFT and a tab runs flush to the body edge;
|
|
80
|
+
y 938..985 = 24 CSS px tall, filled #1c1c1c
|
|
81
|
+
the SELECTED takes the panel's own fill and merges with the body — at
|
|
82
|
+
tab y=1017 the Modifier tab is #1c1c1c for 1 px and #2f2f2f from
|
|
83
|
+
x 2849 on, with no seam against the panel beside it
|
|
84
|
+
glyph 28x28 device = 14 CSS px, centred (x 2861..2888 inside a tab
|
|
85
|
+
at 2847..2900, y 948..975 inside 938..985)
|
|
86
|
+
gap 4 CSS px between tabs of one GROUP (y 619..624 + its two
|
|
87
|
+
1 px transitions), 11 between groups (y 548..568). We ship
|
|
88
|
+
one group, so only the 4 is spent.
|
|
89
|
+
|
|
90
|
+
RE-MEASURED 2026-09-18 down ONE COLUMN of the rail's own fill, x=2852 on
|
|
91
|
+
`modeling-edit-none.png` (the Modeling workspace in Edit Mode — the frame
|
|
92
|
+
this document is the sibling of), which reads the boxes rather than the
|
|
93
|
+
glyphs and corrects two of the numbers above:
|
|
94
|
+
|
|
95
|
+
a tab 27 CSS TALL, not 24 — `#1c1c1c` runs 54 device px per cell
|
|
96
|
+
(y 495..548, 567..620, 623..676, … , 1271..1324) on a 56 px
|
|
97
|
+
pitch, every cell the same.
|
|
98
|
+
gap 1 CSS, not 4 — the 2 device px between cells read `#1a1a1a`,
|
|
99
|
+
the exact blend of `#1c1c1c` and the rail's `#171717`, i.e.
|
|
100
|
+
a hairline, not a gutter. (The 4 came from reading a GROUP
|
|
101
|
+
boundary, which is 15 device px of rail fill plus its two
|
|
102
|
+
blend rows: 8.5 CSS. We ship one group, so it is unspent.)
|
|
103
|
+
the plate the SELECTED cell is 25 CSS, inset one pixel inside its 27:
|
|
104
|
+
`#2f2f2f` runs y 993..1042 with `#242424` single rows at 992
|
|
105
|
+
and 1043, inside a cell at 991..1044. Its LEFT corners round
|
|
106
|
+
over four device rows (x 2853 at y 992, 2851, 2850, 2849
|
|
107
|
+
from 996 on) — 2 CSS — and its right edge is flat, because
|
|
108
|
+
it merges into the body.
|
|
109
|
+
rail top the ground starts 17 device px above the first cell (y 478
|
|
110
|
+
under the editor's own header band, first cell at 495) —
|
|
111
|
+
8.5 CSS.
|
|
112
|
+
|
|
113
|
+
The rail sticks to the top of the scrolling column so a long section body
|
|
114
|
+
never scrolls the tabs away. */
|
|
115
|
+
.vgai-inspector-properties-rail {
|
|
116
|
+
display: flex;
|
|
117
|
+
flex-direction: column;
|
|
118
|
+
gap: var(--vgai-stroke-resting);
|
|
119
|
+
padding-top: var(--vgai-space-4);
|
|
120
|
+
/* The rail's only gutter is one device-independent pixel on the LEFT: a tab
|
|
121
|
+
runs flush to the body edge (x 2847..2900 inside a 2845..2900 column). */
|
|
122
|
+
padding-left: var(--vgai-stroke-resting);
|
|
123
|
+
/* The open tab's plate rounds 2 CSS px on its leading corners and nothing on
|
|
124
|
+
its trailing ones. It is named here rather than written into the rule
|
|
125
|
+
below because it is a MEASURED constant of this frame with no rung in the
|
|
126
|
+
material's shape scale (Blender rounds every widget at 4). */
|
|
127
|
+
--vgai-properties-tab-plate-radius: 2px;
|
|
128
|
+
width: 28px;
|
|
129
|
+
box-sizing: border-box;
|
|
130
|
+
background: var(--vgai-surface-shell);
|
|
131
|
+
position: sticky;
|
|
132
|
+
top: 0;
|
|
133
|
+
align-self: stretch;
|
|
134
|
+
flex: 0 0 auto;
|
|
135
|
+
}
|
|
136
|
+
/* THE GROUP SEPARATOR. `ED_buttons_tabs_list` (`space_buttons.cc:201-255`)
|
|
137
|
+
appends a `BCONTEXT_SEPARATOR` between the tool tab, the scene group
|
|
138
|
+
(Render, Output, View Layer, Scene, World), Collection, the object group
|
|
139
|
+
(Object … Material) and Texture; the rail draws it as GROUND, not as a
|
|
140
|
+
rule. Measured on `modeling-edit-none.png` down x=2852: a group boundary is
|
|
141
|
+
15 device px of the rail's own `#171717` plus its two blend rows — 8.5 CSS.
|
|
142
|
+
The rail's flex `gap` already contributes one device-independent pixel on
|
|
143
|
+
each side of this element, so it owns 6.5 of the 8.5 itself. No ink: the
|
|
144
|
+
gap IS the separator in the reference. */
|
|
145
|
+
.vgai-inspector-properties-rail-separator {
|
|
146
|
+
flex: 0 0 auto;
|
|
147
|
+
height: 6.5px;
|
|
148
|
+
}
|
|
149
|
+
/* The tab BOX, not the button's own size ramp: a Properties tab is 27x24 in
|
|
150
|
+
the frame regardless of which control height the density declares. The two
|
|
151
|
+
qualifiers are what it takes to outrank the canonical control's own box:
|
|
152
|
+
`[data-size="compact"]` sets the height and `[data-icon="true"][data-size]`
|
|
153
|
+
sets the width to the compact control height (20), which is why an earlier
|
|
154
|
+
cut of this rule left 20x20 tabs with 7 px of rail showing beside them. */
|
|
155
|
+
.vgai-inspector-properties-rail .vgai-btn[data-icon][data-size] {
|
|
156
|
+
width: 27px;
|
|
157
|
+
height: 27px;
|
|
158
|
+
min-width: 0;
|
|
159
|
+
min-height: 0;
|
|
160
|
+
padding: 0;
|
|
161
|
+
border-radius: 0;
|
|
162
|
+
}
|
|
163
|
+
.vgai-inspector-properties-rail .vgai-btn[data-variant="ghost"] {
|
|
164
|
+
color: var(--vgai-content-dim);
|
|
165
|
+
background: var(--vgai-surface-chrome);
|
|
166
|
+
}
|
|
167
|
+
.vgai-inspector-properties-rail .vgai-btn[data-variant="ghost"]:hover:not(:disabled) {
|
|
168
|
+
color: var(--vgai-content-primary);
|
|
169
|
+
}
|
|
170
|
+
/* The open tab IS the panel — Blender gives it the body's own fill so the two
|
|
171
|
+
read as one surface rather than as a lit tab. */
|
|
172
|
+
.vgai-inspector-properties-rail .vgai-btn[aria-selected="true"],
|
|
173
|
+
.vgai-inspector-properties-rail .vgai-btn[data-variant="ghost"][aria-selected="true"] {
|
|
174
|
+
color: var(--vgai-content-primary);
|
|
175
|
+
background: var(--vgai-surface-panel);
|
|
176
|
+
}
|
|
177
|
+
/* …AND IT IS A PLATE, not the whole cell: 25 CSS px inside the 27, rounded on
|
|
178
|
+
the LEFT and flat on the right where it runs into the body.
|
|
179
|
+
|
|
180
|
+
The inset is the canonical control's OWN transparent 1 px border, which
|
|
181
|
+
`.vgai-btn` already carries on every button — `background-clip: padding-box`
|
|
182
|
+
simply stops painting over it, and 27 - 2 is Blender's 25. (Clipping to the
|
|
183
|
+
CONTENT box instead paints 23: measured live, y 214..236 inside a cell at
|
|
184
|
+
211.5..238.5, because block padding would take a second pixel off each end.)
|
|
185
|
+
`border-radius` is declared on the border box and the painting area's
|
|
186
|
+
corners come out one pixel tighter, which is why the measured 2 is written
|
|
187
|
+
as 2 plus the border it loses. Specificity has to outrank the tab-box rule
|
|
188
|
+
above, which zeroes the radius. */
|
|
189
|
+
.vgai-inspector-properties-rail .vgai-btn[data-icon][data-size][aria-selected="true"] {
|
|
190
|
+
--vgai-plate-corner: calc(var(--vgai-properties-tab-plate-radius) + var(--vgai-stroke-resting));
|
|
191
|
+
background-clip: padding-box;
|
|
192
|
+
border-radius: var(--vgai-plate-corner) 0 0 var(--vgai-plate-corner);
|
|
193
|
+
}
|
|
194
|
+
/* THE RAIL'S ALPHA, and why the open tab is the exception. A category token is
|
|
195
|
+
the glyph's INK at full opacity (`theme.ts`'s category docblock); Blender's
|
|
196
|
+
own rail dims every tab but the open one. Measured on the native 2x frames,
|
|
197
|
+
the same ink at both states: the Object tab is #e09557 open
|
|
198
|
+
(`properties-object.png`, src y 522-549, over its #2f2f2f plate) and
|
|
199
|
+
#b97d4b closed (`properties-modifier.png`, same rows, over #1c1c1c) — the
|
|
200
|
+
ink at 0.80. The Modifier tab does it the other way round (#73a1ff open in
|
|
201
|
+
`properties-modifier.png`, #6286d1 closed in `properties-object.png`), and
|
|
202
|
+
the Data tab a third time (#00d3a2 / #05ae87).
|
|
203
|
+
|
|
204
|
+
Keyed on `[data-vgai-tone]` rather than on the button, so it reaches ONLY a
|
|
205
|
+
glyph whose set gives it a category: Font Awesome carries no tone, so every
|
|
206
|
+
Classic rail is byte-identical to before this rule — its tabs already
|
|
207
|
+
separate open from closed through `--vgai-content-dim`/`-primary` above,
|
|
208
|
+
which a toned glyph's own `color` overrides. */
|
|
209
|
+
.vgai-inspector-properties-rail .vgai-btn [data-vgai-tone] {
|
|
210
|
+
opacity: 0.8;
|
|
211
|
+
}
|
|
212
|
+
.vgai-inspector-properties-rail .vgai-btn[aria-selected="true"] [data-vgai-tone] {
|
|
213
|
+
opacity: 1;
|
|
214
|
+
}
|
|
215
|
+
/* THE PROPERTIES IDENTITY — Blender's two opening rows (the component's own
|
|
216
|
+
docblock carries every coordinate). There is NO rule under it: in the frames
|
|
217
|
+
the datablock row is followed by panel fill and then the first card's own top
|
|
218
|
+
edge (`properties-object.png`, y 180..199 between the row at 140..179 and
|
|
219
|
+
the card at 200).
|
|
220
|
+
|
|
221
|
+
THE INSET IS THE BODY'S, ONCE. This row sits INSIDE
|
|
222
|
+
`.vgai-inspector-properties-body`, which already spends the measured 8 CSS
|
|
223
|
+
on every side, so its own 8 doubled it: measured live before this rule, the
|
|
224
|
+
body starts at x 1450.5 and the breadcrumb's glyph landed at 1466.5 — 16 —
|
|
225
|
+
while the cards below it landed at 1458.5. The same doubling the bands unit
|
|
226
|
+
found in `InspectorToolSection.tsx`, one level up.
|
|
227
|
+
|
|
228
|
+
THE VERTICAL RHYTHM, measured on `properties-object.png` at 2x (device px,
|
|
229
|
+
halve for CSS): area header bottom 47 → breadcrumb row 68..108 (20 CSS,
|
|
230
|
+
centred on its 14 px glyph at 74..101) → datablock row 140..179 → first card
|
|
231
|
+
200. So 10.5 CSS above the breadcrumb, 16 between the two rows, 10.5 below
|
|
232
|
+
the pair. `modeling-edit-none.png`'s Modifier tab confirms the middle gap
|
|
233
|
+
from the other side: no datablock row there, and `Add Modifier` starts at
|
|
234
|
+
the same y=140. Ours ran 8 / 2 / 0. */
|
|
235
|
+
.vgai-inspector-identity[data-vgai-identity-layout="properties"] {
|
|
236
|
+
display: flex;
|
|
237
|
+
flex-direction: column;
|
|
238
|
+
gap: var(--vgai-space-8);
|
|
239
|
+
padding: var(--vgai-space-1) 0 var(--vgai-space-5);
|
|
240
|
+
}
|
|
241
|
+
/* Glyph to name, INK TO INK: `properties-modifier.png` runs the glyph out at
|
|
242
|
+
x=107 and starts `Cube` at x=127 — 20 device px, 10 CSS. Our glyph box
|
|
243
|
+
carries ~1.5 CSS of its own bearing each side, so the gap token that lands
|
|
244
|
+
on 10 is 8 (measured after: 9.5). It was 4. */
|
|
245
|
+
.vgai-inspector-breadcrumb {
|
|
246
|
+
display: flex;
|
|
247
|
+
align-items: center;
|
|
248
|
+
gap: var(--vgai-space-4);
|
|
249
|
+
min-height: var(--vgai-control-default-height);
|
|
250
|
+
}
|
|
251
|
+
/* THE CHAIN IS A NAME IN PLAIN INK. Blender's breadcrumb inks its glyph, its
|
|
252
|
+
datablock names and its `>` at 229 on every one of the three tab frames —
|
|
253
|
+
the muted grey we used belongs to the pin (155) and to nothing else on the
|
|
254
|
+
row. Tail ellipsis, like every other name in the chrome; the head-ellipsis
|
|
255
|
+
this rule carried was for the file path, which is now the row's tooltip. */
|
|
256
|
+
.vgai-inspector-breadcrumb-chain {
|
|
257
|
+
flex: 1;
|
|
258
|
+
min-width: 0;
|
|
259
|
+
overflow: hidden;
|
|
260
|
+
text-overflow: ellipsis;
|
|
261
|
+
white-space: nowrap;
|
|
262
|
+
font-size: var(--vgai-font-base);
|
|
263
|
+
color: var(--vgai-content-primary);
|
|
264
|
+
}
|
|
265
|
+
/* The datablock row is ONE composite: the wells share a border, so the pair
|
|
266
|
+
reads as a single 20 px control the way Blender's does rather than as two
|
|
267
|
+
floating boxes. */
|
|
268
|
+
.vgai-inspector-datablock {
|
|
269
|
+
display: flex;
|
|
270
|
+
align-items: stretch;
|
|
271
|
+
min-width: 0;
|
|
272
|
+
}
|
|
273
|
+
.vgai-inspector-datablock-kind {
|
|
274
|
+
display: flex;
|
|
275
|
+
flex: 0 0 auto;
|
|
276
|
+
align-items: center;
|
|
277
|
+
justify-content: center;
|
|
278
|
+
/* Blender's well is 30 CSS px on a 20 px row — wider than square, because it
|
|
279
|
+
holds a glyph AND the datablock caret. We draw no caret (nothing here
|
|
280
|
+
picks a datablock), so the width is stated as what the segment IS: the
|
|
281
|
+
row's own height plus the column the caret would occupy. */
|
|
282
|
+
min-width: calc(var(--vgai-control-default-height) + var(--vgai-space-5));
|
|
283
|
+
height: var(--vgai-control-default-height);
|
|
284
|
+
background: var(--vgai-widget-menu);
|
|
285
|
+
color: var(--vgai-content-primary);
|
|
286
|
+
border: var(--vgai-stroke-resting) solid var(--vgai-border-1);
|
|
287
|
+
border-radius: var(--vgai-radius-sm) 0 0 var(--vgai-radius-sm);
|
|
288
|
+
border-right: 0;
|
|
289
|
+
/* The well is a widget, so it takes the widget emboss like the name field
|
|
290
|
+
beside it — and it has to say so itself, because it is neither a
|
|
291
|
+
`.vgai-btn` nor an `.vgai-input`. Blender draws the pair's emboss as one
|
|
292
|
+
unbroken line (`properties-data-edit.png` y 180..181 runs the full width
|
|
293
|
+
of the row, well and field together). */
|
|
294
|
+
box-shadow: var(--vgai-widget-emboss-shadow);
|
|
295
|
+
}
|
|
296
|
+
.vgai-inspector-datablock .vgai-input,
|
|
297
|
+
.vgai-inspector-datablock [data-testid="ingest-name"] {
|
|
298
|
+
border-radius: 0 var(--vgai-radius-sm) var(--vgai-radius-sm) 0;
|
|
299
|
+
}
|
|
300
|
+
/* A READ-ONLY name still gets the well. `SubjectNameField` renders plain text
|
|
301
|
+
rather than an `<input>` there, on the standing rule that a readonly input
|
|
302
|
+
invites typing that vanishes — but Blender's datablock row always shows the
|
|
303
|
+
field, and a glyph well glued to bare text reads as a broken control rather
|
|
304
|
+
than as a name you cannot rename. Same box, no caret. */
|
|
305
|
+
.vgai-inspector-datablock [data-testid="ingest-name"][data-readonly="true"] {
|
|
306
|
+
display: flex;
|
|
307
|
+
align-items: center;
|
|
308
|
+
height: var(--vgai-control-default-height);
|
|
309
|
+
padding: 0 var(--vgai-space-3);
|
|
310
|
+
background: var(--vgai-input-surface, var(--vgai-bg-inset));
|
|
311
|
+
border: var(--vgai-stroke-resting) solid var(--vgai-input-border, var(--vgai-border-1));
|
|
312
|
+
box-sizing: border-box;
|
|
313
|
+
/* It is a `div` standing in for the field, so it restates the field's
|
|
314
|
+
paint — and the emboss is part of that paint. `--vgai-input-shadow`
|
|
315
|
+
already carries it for the real `<input>` (`theme.ts`'s
|
|
316
|
+
`inputShadowValue`); this rule reads the same token for the same reason
|
|
317
|
+
it restates `--vgai-input-surface` and `--vgai-input-border`. */
|
|
318
|
+
box-shadow: var(--vgai-input-shadow, none);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
.vgai-inspector-properties-body {
|
|
322
|
+
flex: 1 1 auto;
|
|
323
|
+
min-width: 0;
|
|
324
|
+
/* THE PANEL REGION'S INSET. Blender's Properties editor lays its panels in
|
|
325
|
+
an inset column, not flush to the area edges: measured on
|
|
326
|
+
`properties-object.png` at 2x, the Transform card's left border sits at
|
|
327
|
+
x=74 with the body starting at x=58 (16 device px = 8 CSS), its right
|
|
328
|
+
border ends at x=592 with the body ending at x=605 (13 device px = 6.5
|
|
329
|
+
CSS), and the first card's top edge is 21 device px (10.5 CSS) below the
|
|
330
|
+
datablock row. We spend the space token on all four sides rather than
|
|
331
|
+
transcribe the 6.5: that half-pixel is Blender's own scroll gutter, and
|
|
332
|
+
our column scrolls through a different mechanism. The inset lives HERE
|
|
333
|
+
rather than on the card so a section that draws bare content (no
|
|
334
|
+
sub-panels) lands on the same column as one that draws cards. */
|
|
335
|
+
padding: var(--vgai-space-4);
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
/* EVERY SECTION IN THIS REGION IS A CARD. Blender draws a Properties panel as
|
|
339
|
+
an inset rounded box — one continuous fill for its header AND its body, a
|
|
340
|
+
1 px lighter outline, 4 px corners, 2 px between boxes (measured on
|
|
341
|
+
`properties-object.png`: fill #3c3c3c over the #2f2f2f panel, outline
|
|
342
|
+
#494949 at x 74..75 / 591..592, the corner arc spanning y 200..207, and the
|
|
343
|
+
gap between the Location and Rotation cards y 1032..1035). Ours drew a
|
|
344
|
+
lifted header bar over a body that fell back to the panel — the "full-bleed
|
|
345
|
+
bar on a flush body" a fresh viewer reads as a settings list rather than as
|
|
346
|
+
Blender's panel stack.
|
|
347
|
+
|
|
348
|
+
Scoped to this presentation on purpose: the card is the PROPERTIES editor's
|
|
349
|
+
own shape in the reference (its Outliner and its viewport draw no such
|
|
350
|
+
box), and scoping it here leaves the narrow column — every other skin's
|
|
351
|
+
default, and every bounded design-system host — pixel-identical. */
|
|
352
|
+
.vgai-inspector-properties-body .vgai-section {
|
|
353
|
+
background: var(--vgai-surface-section);
|
|
354
|
+
border: var(--vgai-stroke-resting) solid var(--vgai-surface-section-edge);
|
|
355
|
+
border-radius: var(--vgai-radius-sm);
|
|
356
|
+
margin-bottom: var(--vgai-space-1);
|
|
357
|
+
overflow: hidden;
|
|
358
|
+
}
|
|
359
|
+
/* The header is part of the card, not a slab above it: one fill, and the
|
|
360
|
+
divider between stacked sections is the gap plus the outline. */
|
|
361
|
+
.vgai-inspector-properties-body .vgai-section-header {
|
|
362
|
+
background: transparent;
|
|
363
|
+
}
|
|
364
|
+
.vgai-inspector-properties-body .vgai-section:last-child {
|
|
365
|
+
margin-bottom: 0;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
/* THE PANEL COLUMN IS INSET ONCE. A contributed section's own frame
|
|
369
|
+
(`theme.css`'s `.vgai-inspector-tool-section`) adds the narrow column's
|
|
370
|
+
8 px pad, a 1 px rule and a 4 px lift — and in this presentation that
|
|
371
|
+
doubled the inset (measured live: the body starts at x 1450.5 with its own
|
|
372
|
+
8 px pad, and the first card's border still landed at 1466.5) and drew a
|
|
373
|
+
rule Blender has nowhere. Measured on `properties-object.png` at 2x: the
|
|
374
|
+
Transform card's outline sits at x 74..75 with the editor's body starting
|
|
375
|
+
at x 58 — 16 device px, 8 CSS, symmetric about the column's centre 333 —
|
|
376
|
+
and y 180..199 between the datablock row and that card is plain panel
|
|
377
|
+
fill, no rule. */
|
|
378
|
+
.vgai-inspector-properties-body .vgai-inspector-tool-section {
|
|
379
|
+
padding: 0;
|
|
380
|
+
margin-top: 0;
|
|
381
|
+
border-top: 0;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
/* THE BAND. Blender heads a panel with a chevron, its name in the UI's ONE
|
|
385
|
+
regular-weight face, and nothing else — no glyph. Measured on
|
|
386
|
+
`properties-object.png` (2x) and confirmed panel-for-panel on
|
|
387
|
+
`properties-data-edit.png`, whose Vertex Groups / Shape Keys / UV Maps are
|
|
388
|
+
this document's own panels:
|
|
389
|
+
|
|
390
|
+
title cap height 18 device px (the 'T' of Transform, x 130..145,
|
|
391
|
+
y 218..235) — 9 CSS, the SAME cap the chrome's other labels
|
|
392
|
+
measure ('A' of Add Modifier in `modeling-edit-none.png`,
|
|
393
|
+
y 578..595). So the size was never wrong; the WEIGHT was:
|
|
394
|
+
ours drew 600 where Blender's face has one weight.
|
|
395
|
+
no glyph the band holds chevron + name. Ours put a 14 px section icon
|
|
396
|
+
between them, which pushed the title from Blender's 25.5 CSS
|
|
397
|
+
off the card's fill to 48.5.
|
|
398
|
+
chevron ink x 91..110 open / 95..105 closed, i.e. 7.5..17 CSS from the
|
|
399
|
+
fill's left edge — so 4 px of lead-in before the 15 px
|
|
400
|
+
disclosure box, and 6 to the title, lands the pair at 7 and 25
|
|
401
|
+
against Blender's 7.5 and 25.5.
|
|
402
|
+
gap 4 device px of panel fill between cards (y 816..819 between
|
|
403
|
+
the Delta Transform and Relations bands) — 2 CSS. Ours drew 4,
|
|
404
|
+
because the card's own margin and the mesh panel's grid gap
|
|
405
|
+
each spent one; the card's margin is the single owner.
|
|
406
|
+
|
|
407
|
+
Not transcribed, and why: Blender's 4x2 dot GRIP at the band's right edge
|
|
408
|
+
(x 553..572, y 223..230, #909090 on a 3 CSS px pitch) is its panel-REORDER
|
|
409
|
+
handle. This stack does not reorder, and an inert handle promises a gesture
|
|
410
|
+
that does not exist. */
|
|
411
|
+
.vgai-inspector-properties-body .vgai-section-glyph {
|
|
412
|
+
display: none;
|
|
413
|
+
}
|
|
414
|
+
.vgai-inspector-properties-body .vgai-section-trigger {
|
|
415
|
+
gap: var(--vgai-space-3);
|
|
416
|
+
padding-inline: var(--vgai-space-2) var(--vgai-space-4);
|
|
417
|
+
font-weight: 400;
|
|
418
|
+
/* The band mark's INK measures 5.5x9.5 CSS in the reference (the closed
|
|
419
|
+
`>` on `properties-object.png`, x 95..105 / y 783..801 at 2x; the open
|
|
420
|
+
`v` is the same mark turned, x 91..110 / y 218..235). `DisclosureIcon`'s
|
|
421
|
+
own `xs` rung inked 4x6 here — the squat mark a 3x crop shows beside
|
|
422
|
+
Blender's. `lg` is the rung whose ink lands at 5.4x8.9; no skin that
|
|
423
|
+
declares nothing moves, because the fallback IS `xs`. */
|
|
424
|
+
--vgai-section-disclosure-size: var(--vgai-icon-lg);
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
/* The MINI card — the space-tight fallback. Preview (or kind glyph) on top,
|
|
428
|
+
then name + eye, then the icon strip, then the open-for-edit. It fills its
|
|
429
|
+
viewport-island host; the host owns WHERE it sits. */
|
|
430
|
+
.vgai-mini-inspector {
|
|
431
|
+
position: relative;
|
|
432
|
+
display: flex;
|
|
433
|
+
flex-direction: column;
|
|
434
|
+
width: 100%;
|
|
435
|
+
min-height: 0;
|
|
436
|
+
border-radius: inherit;
|
|
437
|
+
overflow-y: auto;
|
|
438
|
+
pointer-events: auto;
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
.vgai-mini-inspector-minimize {
|
|
442
|
+
position: absolute;
|
|
443
|
+
top: var(--vgai-space-1);
|
|
444
|
+
right: var(--vgai-space-1);
|
|
445
|
+
z-index: 1;
|
|
446
|
+
color: var(--vgai-content-dim);
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
/* The preview square — the primary EXPAND gesture (clicking the box restores
|
|
450
|
+
the column). A subject with no preview shows a quiet kind glyph in the same
|
|
451
|
+
footprint, so no-preview subjects do not reflow the card. */
|
|
452
|
+
.vgai-mini-inspector-preview {
|
|
453
|
+
position: relative;
|
|
454
|
+
width: 100%;
|
|
455
|
+
aspect-ratio: 1 / 1;
|
|
456
|
+
max-height: 180px;
|
|
457
|
+
display: flex;
|
|
458
|
+
align-items: center;
|
|
459
|
+
justify-content: center;
|
|
460
|
+
overflow: hidden;
|
|
461
|
+
background: var(--vgai-bg-inset);
|
|
462
|
+
color: var(--vgai-content-dim);
|
|
463
|
+
cursor: pointer;
|
|
464
|
+
}
|
|
465
|
+
.vgai-mini-inspector-preview[aria-label] {
|
|
466
|
+
cursor: pointer;
|
|
467
|
+
}
|
|
468
|
+
.vgai-mini-inspector-preview:focus-visible {
|
|
469
|
+
outline: var(--vgai-focus-ring);
|
|
470
|
+
outline-offset: -2px;
|
|
471
|
+
}
|
|
472
|
+
.vgai-mini-inspector-preview .vgai-editor-icon {
|
|
473
|
+
font-size: var(--vgai-font-xl, 24px);
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
.vgai-mini-inspector-identity {
|
|
477
|
+
display: flex;
|
|
478
|
+
align-items: center;
|
|
479
|
+
gap: var(--vgai-space-2);
|
|
480
|
+
padding: var(--vgai-space-2);
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
.vgai-mini-inspector-actions {
|
|
484
|
+
display: flex;
|
|
485
|
+
justify-content: flex-end;
|
|
486
|
+
padding: 0 var(--vgai-space-2) var(--vgai-space-2);
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
/* The PILL — the floor. One line: thumb-glyph + name + expand, plus a clear
|
|
490
|
+
affordance (the only deselect a minimized box can reach). */
|
|
491
|
+
.vgai-inspector-pill {
|
|
492
|
+
display: flex;
|
|
493
|
+
align-items: center;
|
|
494
|
+
gap: var(--vgai-space-1);
|
|
495
|
+
width: 100%;
|
|
496
|
+
height: 100%;
|
|
497
|
+
padding: var(--vgai-space-1);
|
|
498
|
+
}
|
|
499
|
+
.vgai-inspector-pill-open {
|
|
500
|
+
display: flex;
|
|
501
|
+
align-items: center;
|
|
502
|
+
gap: var(--vgai-space-2);
|
|
503
|
+
min-width: 0;
|
|
504
|
+
flex: 1;
|
|
505
|
+
height: 100%;
|
|
506
|
+
border: 0;
|
|
507
|
+
background: transparent;
|
|
508
|
+
color: var(--vgai-content-primary);
|
|
509
|
+
cursor: pointer;
|
|
510
|
+
text-align: left;
|
|
511
|
+
}
|
|
512
|
+
.vgai-inspector-pill-open:focus-visible {
|
|
513
|
+
outline: var(--vgai-focus-ring);
|
|
514
|
+
outline-offset: 2px;
|
|
515
|
+
border-radius: var(--vgai-radius-full);
|
|
516
|
+
}
|
|
517
|
+
.vgai-inspector-pill-thumb {
|
|
518
|
+
position: relative;
|
|
519
|
+
width: 42px;
|
|
520
|
+
height: 42px;
|
|
521
|
+
flex: 0 0 42px;
|
|
522
|
+
display: flex;
|
|
523
|
+
align-items: center;
|
|
524
|
+
justify-content: center;
|
|
525
|
+
overflow: hidden;
|
|
526
|
+
border-radius: var(--vgai-radius-full);
|
|
527
|
+
background: var(--vgai-bg-inset);
|
|
528
|
+
border: 1px solid var(--vgai-border-2);
|
|
529
|
+
color: var(--vgai-content-dim);
|
|
530
|
+
pointer-events: none;
|
|
531
|
+
}
|
|
532
|
+
.vgai-inspector-pill-name {
|
|
533
|
+
min-width: 0;
|
|
534
|
+
overflow: hidden;
|
|
535
|
+
text-overflow: ellipsis;
|
|
536
|
+
white-space: nowrap;
|
|
537
|
+
font-size: var(--vgai-font-md);
|
|
538
|
+
font-weight: 600;
|
|
539
|
+
}
|