@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,461 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SCOPED GAME CSS — a foreign game's page-level stylesheet, rewritten so it
|
|
3
|
+
* paints only inside a container the host designates, and nothing else.
|
|
4
|
+
*
|
|
5
|
+
* The problem this exists for, stated as it was measured: the vendored pmndrs
|
|
6
|
+
* `racing-game` keeps its HUD's whole layout in `src/styles.css` — `.clock`,
|
|
7
|
+
* `.speed`, `.leaderboard`, plus `html, body, #root { width: 100vw; height:
|
|
8
|
+
* 100vh }` and a `body` background/colour/font. That sheet cannot be loaded
|
|
9
|
+
* into the editor's document: its `html`/`body`/`*`/`button` rules would
|
|
10
|
+
* restyle the EDITOR (its own canvases are sized by exactly those page rules).
|
|
11
|
+
* So the host shim deliberately never imported it, and every surface that
|
|
12
|
+
* shows the game's DOM — the UI board's story cards, the ingest surface in
|
|
13
|
+
* Play — rendered the HUD with zero layout. That was a recorded host-capability
|
|
14
|
+
* gap, not a game defect. This module closes it.
|
|
15
|
+
*
|
|
16
|
+
* ## The mechanism: native CSS `@scope`, not selector prefixing
|
|
17
|
+
*
|
|
18
|
+
* The whole sheet is wrapped in `@scope (<scopeSelector>) { … }`. The browser
|
|
19
|
+
* then matches every rule inside it ONLY against the scope root and its
|
|
20
|
+
* descendants — `.a .b`, `>` combinators, `:hover`, `::before`, `:is()`,
|
|
21
|
+
* attribute selectors, counters and anything CSS grows later, all with the
|
|
22
|
+
* engine's own semantics and with the sheet's internal cascade order intact.
|
|
23
|
+
*
|
|
24
|
+
* The alternative — parsing every selector and prefixing it with the container
|
|
25
|
+
* — was rejected because it means REIMPLEMENTING selector semantics: `*` would
|
|
26
|
+
* stop matching the container itself, specificity would silently shift by one
|
|
27
|
+
* class, and every future selector syntax is a new bug. `@scope` moves all of
|
|
28
|
+
* that into the engine that will render it. It is Baseline-available (Chrome
|
|
29
|
+
* 118+, Safari 17.4+, Firefox 128+) and the editor is a current-Chrome surface;
|
|
30
|
+
* `CSSScopeRule` is the feature detection the client half uses so a browser
|
|
31
|
+
* without it reports an honest note instead of leaking the sheet.
|
|
32
|
+
*
|
|
33
|
+
* What `@scope` does NOT do, and is therefore the entire remaining transform:
|
|
34
|
+
*
|
|
35
|
+
* 1. **Page-level selectors go inert.** `html`, `body` and `:root` are
|
|
36
|
+
* ANCESTORS of the scope root, so inside `@scope` they can never match — the
|
|
37
|
+
* `body { color: white }` that makes the HUD legible would silently vanish.
|
|
38
|
+
* Every such compound is rewritten to `:scope`, and runs of `:scope` left
|
|
39
|
+
* adjacent by that rewrite (`html body` → `:scope :scope`) collapse to one.
|
|
40
|
+
* The scope container's own BOX is not taken from the game: the host sets
|
|
41
|
+
* width/height/position inline on it (a story frame's `content`, the ingest
|
|
42
|
+
* `#container`), and an inline declaration beats any rule in this sheet — so
|
|
43
|
+
* `width: 100vw` arrives, loses, and costs nothing.
|
|
44
|
+
* 2. **Non-scopable at-rules must be hoisted.** `@keyframes`, `@font-face`,
|
|
45
|
+
* `@import` and friends define global names rather than matching elements;
|
|
46
|
+
* they are lifted out of the `@scope` block and emitted ahead of it.
|
|
47
|
+
* Keyframe names are deliberately NOT namespaced: measured on this repo,
|
|
48
|
+
* all 17 of the editor's own `@keyframes` are `vgai-`-prefixed while
|
|
49
|
+
* racing's two are `boostBlink`/`hideSoundIcon`, so the collision the
|
|
50
|
+
* namespacing would prevent does not exist — and buying it would require a
|
|
51
|
+
* correct `animation` shorthand rewriter, which is real machinery paid for
|
|
52
|
+
* with nothing.
|
|
53
|
+
* 3. **Relative `url()`s would resolve against the EDITOR's page.** They are
|
|
54
|
+
* rebased onto the stylesheet's own served URL, so a game asset request goes
|
|
55
|
+
* where the game meant it to.
|
|
56
|
+
*
|
|
57
|
+
* The game's bytes on disk are never touched: this runs at serve time, over a
|
|
58
|
+
* copy read out of the vendored tree, which is what keeps
|
|
59
|
+
* `vendor/games/verify-unaltered.mjs` green.
|
|
60
|
+
*/
|
|
61
|
+
|
|
62
|
+
import { GAME_CSS_SCOPE_SELECTOR } from '@volter/editor-sdk/session/game-css-scope';
|
|
63
|
+
import postcss, { type AtRule } from 'postcss';
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* At-rules whose block holds ordinary style rules and therefore stays INSIDE
|
|
67
|
+
* the `@scope` wrapper — conditional groups plus `@layer`'s block form. Every
|
|
68
|
+
* other at-rule defines a global name (`@keyframes`, `@font-face`,
|
|
69
|
+
* `@property`, `@counter-style`) or is a header directive (`@import`,
|
|
70
|
+
* `@charset`, `@namespace`) and is hoisted ahead of the wrapper.
|
|
71
|
+
*/
|
|
72
|
+
const SCOPABLE_AT_RULES = new Set(['media', 'supports', 'container', 'layer', 'scope']);
|
|
73
|
+
|
|
74
|
+
/** At-rules that must precede every other rule in the emitted sheet. */
|
|
75
|
+
const HEADER_AT_RULES = new Set(['charset', 'import', 'namespace']);
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* A compound selector whose type/pseudo part addresses the PAGE rather than an
|
|
79
|
+
* element inside it. Anchored at the compound's start; the negative lookahead
|
|
80
|
+
* keeps `bodyguard`/`html-frame` (real class-free custom element names) out.
|
|
81
|
+
*/
|
|
82
|
+
const PAGE_COMPOUND = /^(html|body|:root)(?![\w-])/i;
|
|
83
|
+
|
|
84
|
+
/** Any character that can start a top-level combinator run. */
|
|
85
|
+
const COMBINATOR_CHAR = /[\s>+~]/;
|
|
86
|
+
|
|
87
|
+
export interface ScopeGameCssOptions {
|
|
88
|
+
/** The stylesheet's own bytes, exactly as read from disk. */
|
|
89
|
+
readonly css: string;
|
|
90
|
+
/** Selector the emitted `@scope` block is rooted at, e.g. `[data-x]`. */
|
|
91
|
+
readonly scopeSelector: string;
|
|
92
|
+
/**
|
|
93
|
+
* Root-relative URL path the stylesheet itself is served at (e.g.
|
|
94
|
+
* `/@fs/…/styles.css`) — the base every relative `url()` in it is rebased
|
|
95
|
+
* onto. Omitted, `url()`s are left untouched: a caller with no served
|
|
96
|
+
* identity for the sheet has nothing honest to rebase against.
|
|
97
|
+
*/
|
|
98
|
+
readonly styleSheetPath?: string;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Origin the rebase arithmetic borrows. `URL` cannot resolve against a
|
|
103
|
+
* relative base, and the emitted url must stay ORIGIN-RELATIVE — a served game
|
|
104
|
+
* asset is on whatever origin the editor is on, and baking one in would break
|
|
105
|
+
* the moment a session moves port.
|
|
106
|
+
*/
|
|
107
|
+
const REBASE_ORIGIN = 'http://vgai.invalid';
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Rewrite one stylesheet so it applies only inside `scopeSelector`. Pure: no
|
|
111
|
+
* disk, no network, no globals — the whole point is that the interesting half
|
|
112
|
+
* of this feature is testable against racing's real `styles.css` offline.
|
|
113
|
+
*/
|
|
114
|
+
export function scopeGameCss({ css, scopeSelector, styleSheetPath }: ScopeGameCssOptions): string {
|
|
115
|
+
const root = postcss.parse(css, { from: undefined });
|
|
116
|
+
|
|
117
|
+
if (styleSheetPath !== undefined) {
|
|
118
|
+
root.walkDecls((decl) => {
|
|
119
|
+
const rebased = rebaseUrls(decl.value, styleSheetPath);
|
|
120
|
+
if (rebased !== decl.value) decl.value = rebased;
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Hoist BEFORE selectors are rewritten: a `@keyframes` block's children are
|
|
125
|
+
// ordinary postcss `Rule`s whose "selectors" are `from`/`to`/`50%`, and
|
|
126
|
+
// rewriting those would be nonsense. Lifting them out first means the
|
|
127
|
+
// selector walk below cannot see them at all.
|
|
128
|
+
const hoisted: AtRule[] = [];
|
|
129
|
+
root.each((node) => {
|
|
130
|
+
if (node.type !== 'atrule') return;
|
|
131
|
+
if (SCOPABLE_AT_RULES.has(node.name.replace(/^-\w+-/, '').toLowerCase())) return;
|
|
132
|
+
hoisted.push(node);
|
|
133
|
+
});
|
|
134
|
+
for (const node of hoisted) node.remove();
|
|
135
|
+
|
|
136
|
+
root.walkRules((rule) => {
|
|
137
|
+
const rewritten = dedupeSelectors(rule.selectors.map(rewritePageSelector));
|
|
138
|
+
if (rewritten.length > 0) rule.selectors = rewritten;
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
// RESPONSIVE PREVIEW (design ledger: breakpoints — the beat-Figma move).
|
|
142
|
+
// Every game surface shares the one editor window, so a width `@media` in
|
|
143
|
+
// game CSS can never fire per-frame: a 375px story frame would still take
|
|
144
|
+
// the desktop styles. Rewriting width/height-only media conditions into
|
|
145
|
+
// `@container` queries — with every scope root made a size container
|
|
146
|
+
// below — means the frame's OWN width answers the query: a phone-preset
|
|
147
|
+
// frame actually applies the game's phone styles, live, next to a desktop
|
|
148
|
+
// frame applying the desktop ones. Serve-time only: the source (and any
|
|
149
|
+
// exported build) keeps real `@media` truth. Conditions with any
|
|
150
|
+
// non-dimensional feature (prefers-*, hover, print, …) are left as
|
|
151
|
+
// `@media` — rewriting them would be a lie, not a preview.
|
|
152
|
+
root.walkAtRules('media', (at) => {
|
|
153
|
+
const condition = containerConditionForMedia(at.params);
|
|
154
|
+
if (condition === null) return;
|
|
155
|
+
at.name = 'container';
|
|
156
|
+
at.params = condition;
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
const scoped = postcss.atRule({
|
|
160
|
+
name: 'scope',
|
|
161
|
+
params: `(${scopeSelector})`,
|
|
162
|
+
nodes: [],
|
|
163
|
+
raws: { before: '\n', afterName: ' ', between: ' ', after: '\n' },
|
|
164
|
+
});
|
|
165
|
+
scoped.append(root.nodes.map((node) => node.clone()));
|
|
166
|
+
// The container-query half of the responsive preview: the scope root IS the
|
|
167
|
+
// frame content, so it is the container the rewritten queries resolve
|
|
168
|
+
// against. Appended last, so a game's own `:scope` styling never wins the
|
|
169
|
+
// container-type back.
|
|
170
|
+
scoped.append(
|
|
171
|
+
postcss.rule({
|
|
172
|
+
selector: ':scope',
|
|
173
|
+
nodes: [postcss.decl({ prop: 'container-type', value: 'inline-size' })],
|
|
174
|
+
raws: { before: '\n', between: ' ', after: ' ' },
|
|
175
|
+
}),
|
|
176
|
+
);
|
|
177
|
+
root.removeAll();
|
|
178
|
+
// The first node inside a freshly-built block carries whatever `before` raw
|
|
179
|
+
// it had at the old top level (an empty string, for the very first rule of a
|
|
180
|
+
// file) — which would emit `@scope (…) {* { … }` on one line.
|
|
181
|
+
if (scoped.first) scoped.first.raws.before = '\n';
|
|
182
|
+
|
|
183
|
+
const header = hoisted.filter((node) => HEADER_AT_RULES.has(node.name.toLowerCase()));
|
|
184
|
+
const globals = hoisted.filter((node) => !HEADER_AT_RULES.has(node.name.toLowerCase()));
|
|
185
|
+
const out = postcss.root();
|
|
186
|
+
for (const node of [...header, ...globals]) out.append(node);
|
|
187
|
+
out.append(scoped);
|
|
188
|
+
return out.toString();
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Replace every page-level compound in one selector with `:scope`, then
|
|
193
|
+
* collapse the adjacent duplicates that produces.
|
|
194
|
+
*
|
|
195
|
+
* `body` → `:scope`; `body.loading .x` → `:scope.loading .x`; `html body #root`
|
|
196
|
+
* → `:scope #root`. A selector with no page compound comes back untouched, so
|
|
197
|
+
* the overwhelming majority of a game's rules pass through byte-for-byte.
|
|
198
|
+
*/
|
|
199
|
+
export function rewritePageSelector(selector: string): string {
|
|
200
|
+
const compounds = splitCompounds(selector);
|
|
201
|
+
let sawPageCompound = false;
|
|
202
|
+
const mapped = compounds.map((part) => {
|
|
203
|
+
if (part.combinator) return part;
|
|
204
|
+
if (!PAGE_COMPOUND.test(part.text)) return part;
|
|
205
|
+
sawPageCompound = true;
|
|
206
|
+
return { ...part, text: part.text.replace(PAGE_COMPOUND, ':scope') };
|
|
207
|
+
});
|
|
208
|
+
if (!sawPageCompound) return selector;
|
|
209
|
+
return collapseScopeRuns(mapped)
|
|
210
|
+
.map((part) => part.text)
|
|
211
|
+
.join('');
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
interface SelectorPart {
|
|
215
|
+
readonly text: string;
|
|
216
|
+
readonly combinator: boolean;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Split a complex selector into alternating compound / combinator parts,
|
|
221
|
+
* ignoring anything inside `(…)`, `[…]` or a string — so `:is(a, b) > c` and
|
|
222
|
+
* `[title="a b"]` survive intact.
|
|
223
|
+
*/
|
|
224
|
+
function splitCompounds(selector: string): SelectorPart[] {
|
|
225
|
+
const parts: SelectorPart[] = [];
|
|
226
|
+
let depth = 0;
|
|
227
|
+
let quote: string | null = null;
|
|
228
|
+
let buffer = '';
|
|
229
|
+
const flush = (combinator: boolean): void => {
|
|
230
|
+
if (buffer.length > 0) parts.push({ text: buffer, combinator });
|
|
231
|
+
buffer = '';
|
|
232
|
+
};
|
|
233
|
+
for (let i = 0; i < selector.length; i += 1) {
|
|
234
|
+
const ch = selector[i]!;
|
|
235
|
+
if (quote) {
|
|
236
|
+
buffer += ch;
|
|
237
|
+
if (ch === quote && selector[i - 1] !== '\\') quote = null;
|
|
238
|
+
continue;
|
|
239
|
+
}
|
|
240
|
+
if (ch === '"' || ch === "'") {
|
|
241
|
+
quote = ch;
|
|
242
|
+
buffer += ch;
|
|
243
|
+
continue;
|
|
244
|
+
}
|
|
245
|
+
if (ch === '(' || ch === '[') depth += 1;
|
|
246
|
+
else if (ch === ')' || ch === ']') depth -= 1;
|
|
247
|
+
if (depth === 0 && COMBINATOR_CHAR.test(ch)) {
|
|
248
|
+
// Consume the whole run of combinator characters and whitespace.
|
|
249
|
+
let run = '';
|
|
250
|
+
let j = i;
|
|
251
|
+
while (j < selector.length && COMBINATOR_CHAR.test(selector[j]!)) {
|
|
252
|
+
run += selector[j]!;
|
|
253
|
+
j += 1;
|
|
254
|
+
}
|
|
255
|
+
flush(false);
|
|
256
|
+
parts.push({ text: run, combinator: true });
|
|
257
|
+
i = j - 1;
|
|
258
|
+
continue;
|
|
259
|
+
}
|
|
260
|
+
buffer += ch;
|
|
261
|
+
}
|
|
262
|
+
flush(false);
|
|
263
|
+
return parts;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* `:scope :scope .x` → `:scope .x`. Only a DESCENDANT run collapses: `:scope >
|
|
268
|
+
* :scope` names a real (and, after the rewrite, unsatisfiable) relationship,
|
|
269
|
+
* and silently flattening it would change what the author asked for.
|
|
270
|
+
*/
|
|
271
|
+
function collapseScopeRuns(parts: readonly SelectorPart[]): SelectorPart[] {
|
|
272
|
+
const out: SelectorPart[] = [];
|
|
273
|
+
for (const part of parts) {
|
|
274
|
+
const previousCombinator = out.at(-1);
|
|
275
|
+
const previousCompound = out.at(-2);
|
|
276
|
+
if (
|
|
277
|
+
part.text === ':scope' &&
|
|
278
|
+
previousCombinator?.combinator === true &&
|
|
279
|
+
previousCombinator.text.trim() === '' &&
|
|
280
|
+
previousCompound?.text === ':scope'
|
|
281
|
+
) {
|
|
282
|
+
out.pop();
|
|
283
|
+
continue;
|
|
284
|
+
}
|
|
285
|
+
out.push(part);
|
|
286
|
+
}
|
|
287
|
+
return out;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/** `:scope, :scope, #root` → `:scope, #root`; order of first appearance kept. */
|
|
291
|
+
function dedupeSelectors(selectors: readonly string[]): string[] {
|
|
292
|
+
const seen = new Set<string>();
|
|
293
|
+
const out: string[] = [];
|
|
294
|
+
for (const selector of selectors) {
|
|
295
|
+
const key = selector.trim();
|
|
296
|
+
if (key.length === 0 || seen.has(key)) continue;
|
|
297
|
+
seen.add(key);
|
|
298
|
+
out.push(key);
|
|
299
|
+
}
|
|
300
|
+
return out;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* Rebase every relative `url()` in one declaration value onto `basePath` (a
|
|
305
|
+
* root-relative served path), emitting a root-relative url. Absolute urls,
|
|
306
|
+
* protocol-relative urls, root-relative urls, `data:`/`blob:` payloads and
|
|
307
|
+
* bare fragments are left exactly as authored — rebasing any of those would
|
|
308
|
+
* change what the sheet requests.
|
|
309
|
+
*/
|
|
310
|
+
export function rebaseUrls(value: string, basePath: string): string {
|
|
311
|
+
return value.replace(
|
|
312
|
+
/\burl\(\s*(?:"([^"]*)"|'([^']*)'|([^)'"\s]*))\s*\)/gi,
|
|
313
|
+
(whole, doubleQuoted?: string, singleQuoted?: string, bare?: string) => {
|
|
314
|
+
const target = doubleQuoted ?? singleQuoted ?? bare ?? '';
|
|
315
|
+
if (target.length === 0) return whole;
|
|
316
|
+
if (/^(?:[a-z][a-z0-9+.-]*:|\/\/|\/|#)/i.test(target)) return whole;
|
|
317
|
+
try {
|
|
318
|
+
const resolved = new URL(target, `${REBASE_ORIGIN}${basePath}`);
|
|
319
|
+
return `url("${resolved.pathname}${resolved.search}${resolved.hash}")`;
|
|
320
|
+
} catch {
|
|
321
|
+
return whole;
|
|
322
|
+
}
|
|
323
|
+
},
|
|
324
|
+
);
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
// ---------------------------------------------------------------------------
|
|
328
|
+
// The project's declared sheets, and the honest verdict about them
|
|
329
|
+
// ---------------------------------------------------------------------------
|
|
330
|
+
|
|
331
|
+
/** What one root declared, read straight off the raw manifest. */
|
|
332
|
+
interface DeclaredStyles {
|
|
333
|
+
/** Project-root-relative paths, manifest order, de-duplicated. */
|
|
334
|
+
readonly paths: string[];
|
|
335
|
+
/**
|
|
336
|
+
* True when a root mounts a game whose own page this host replaced — an
|
|
337
|
+
* `{ ingest }` adapter. It is the one case where "this project declares no
|
|
338
|
+
* stylesheet" is EVIDENCE of a gap rather than a normal fact: the game had a
|
|
339
|
+
* page, the host shim is standing in for it, and page-level CSS is precisely
|
|
340
|
+
* what a shim cannot carry. A first-party project has no page to lose, so it
|
|
341
|
+
* is never told anything.
|
|
342
|
+
*/
|
|
343
|
+
readonly replacesGamePage: boolean;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
/** Read `roots[].styles` and the ingest verdict off a parsed manifest. */
|
|
347
|
+
export function declaredGameStyles(manifest: unknown): DeclaredStyles {
|
|
348
|
+
const roots = (manifest as { roots?: unknown } | null)?.roots;
|
|
349
|
+
const paths: string[] = [];
|
|
350
|
+
let replacesGamePage = false;
|
|
351
|
+
if (!Array.isArray(roots)) return { paths, replacesGamePage };
|
|
352
|
+
for (const root of roots) {
|
|
353
|
+
if (!root || typeof root !== 'object') continue;
|
|
354
|
+
const record = root as { styles?: unknown; adapter?: unknown };
|
|
355
|
+
const adapter = record.adapter;
|
|
356
|
+
if (adapter && typeof adapter === 'object' && 'ingest' in adapter) replacesGamePage = true;
|
|
357
|
+
if (!Array.isArray(record.styles)) continue;
|
|
358
|
+
for (const entry of record.styles) {
|
|
359
|
+
if (typeof entry === 'string' && entry.length > 0 && !paths.includes(entry))
|
|
360
|
+
paths.push(entry);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
return { paths, replacesGamePage };
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
/** One declared sheet, as the caller's I/O found it. */
|
|
367
|
+
export interface LoadedStyleSheet {
|
|
368
|
+
/** The bytes on disk, untouched. */
|
|
369
|
+
readonly css: string;
|
|
370
|
+
/** Root-relative path the sheet is served at — the `url()` rebase base. */
|
|
371
|
+
readonly servedPath: string;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
/** What the editor client is handed for the open project. */
|
|
375
|
+
export interface ScopedGameStyles {
|
|
376
|
+
/** The concatenated, scoped stylesheet — `''` when there is nothing to serve. */
|
|
377
|
+
readonly css: string;
|
|
378
|
+
/** The declared paths that were actually read, in emission order. */
|
|
379
|
+
readonly sources: string[];
|
|
380
|
+
/**
|
|
381
|
+
* Non-null when the host KNOWS a surface showing this game's DOM will be
|
|
382
|
+
* missing page-level styling, phrased for the person looking at that surface.
|
|
383
|
+
* Null is not "everything is fine" in general — it is "this host has no
|
|
384
|
+
* evidence of a gap", which for a first-party project is the ordinary state.
|
|
385
|
+
*/
|
|
386
|
+
readonly note: string | null;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
/**
|
|
390
|
+
* Turn the open project's manifest into the stylesheet its game surfaces need.
|
|
391
|
+
*
|
|
392
|
+
* Pure over its `readStyleSheet` callback so the whole decision — which paths,
|
|
393
|
+
* what gets scoped, and what the surfaces are told when it cannot be done — is
|
|
394
|
+
* testable with no disk and no server.
|
|
395
|
+
*/
|
|
396
|
+
export function buildScopedGameStyles(options: {
|
|
397
|
+
readonly manifest: unknown;
|
|
398
|
+
readonly readStyleSheet: (projectRelativePath: string) => LoadedStyleSheet | null;
|
|
399
|
+
}): ScopedGameStyles {
|
|
400
|
+
const { paths, replacesGamePage } = declaredGameStyles(options.manifest);
|
|
401
|
+
|
|
402
|
+
if (paths.length === 0) {
|
|
403
|
+
return {
|
|
404
|
+
css: '',
|
|
405
|
+
sources: [],
|
|
406
|
+
note: replacesGamePage
|
|
407
|
+
? 'unstyled — this project ingests a game whose page-level stylesheet it never declared. ' +
|
|
408
|
+
'Add it as `styles` on that root in vgai.project.json and the editor will serve it ' +
|
|
409
|
+
'scoped to the game.'
|
|
410
|
+
: null,
|
|
411
|
+
};
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
const chunks: string[] = [];
|
|
415
|
+
const sources: string[] = [];
|
|
416
|
+
const missing: string[] = [];
|
|
417
|
+
for (const path of paths) {
|
|
418
|
+
const sheet = options.readStyleSheet(path);
|
|
419
|
+
if (!sheet) {
|
|
420
|
+
missing.push(path);
|
|
421
|
+
continue;
|
|
422
|
+
}
|
|
423
|
+
sources.push(path);
|
|
424
|
+
chunks.push(
|
|
425
|
+
scopeGameCss({
|
|
426
|
+
css: sheet.css,
|
|
427
|
+
scopeSelector: GAME_CSS_SCOPE_SELECTOR,
|
|
428
|
+
styleSheetPath: sheet.servedPath,
|
|
429
|
+
}),
|
|
430
|
+
);
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
return {
|
|
434
|
+
css: chunks.join('\n'),
|
|
435
|
+
sources,
|
|
436
|
+
note:
|
|
437
|
+
missing.length === 0
|
|
438
|
+
? null
|
|
439
|
+
: `unstyled — declared stylesheet${missing.length === 1 ? '' : 's'} ` +
|
|
440
|
+
`${missing.map((path) => `\`${path}\``).join(', ')} could not be read from this project.`,
|
|
441
|
+
};
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
/**
|
|
445
|
+
* The `@container` condition equivalent to a width/height-only `@media`
|
|
446
|
+
* prelude, or null when the prelude uses anything else (media types other
|
|
447
|
+
* than screen/all, `not`, commas, non-dimensional features) — those stay
|
|
448
|
+
* `@media`, honestly window-scoped. Handles both the colon form
|
|
449
|
+
* `(max-width: 600px)` and the range form `(width <= 600px)`.
|
|
450
|
+
*/
|
|
451
|
+
export function containerConditionForMedia(params: string): string | null {
|
|
452
|
+
let p = params.trim();
|
|
453
|
+
p = p.replace(/^only\s+/i, '');
|
|
454
|
+
p = p.replace(/^(screen|all)\s+and\s+/i, '');
|
|
455
|
+
if (/^(screen|all)$/i.test(p)) return null; // type-only prelude — nothing to query
|
|
456
|
+
if (/,|\bnot\b|\bor\b/i.test(p)) return null;
|
|
457
|
+
const terms = p.split(/\s+and\s+/i);
|
|
458
|
+
const dimensional = /^\(\s*((min-|max-)?(width|height)\s*:|(width|height)\s*[<>=])[^()]*\)$/i;
|
|
459
|
+
if (!terms.every((term) => dimensional.test(term.trim()))) return null;
|
|
460
|
+
return p;
|
|
461
|
+
}
|