@vgai/editor 0.2.0 → 0.4.0-canary.20260715.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -0
- package/dist/assets/axe-C7YBtOuM.js +30 -0
- package/dist/assets/browserAll-DDtGGE48.js +1 -0
- package/dist/assets/create-runtime-DbTlBlKG.js +1 -0
- package/dist/assets/{game-BI111o5f.js → game-BE0r7DMI.js} +3 -3
- package/dist/assets/game-BdTHR2_X.js +1 -0
- package/dist/assets/{game-pt_1lQLv.js → game-C3iQGSqo.js} +1 -1
- package/dist/assets/game-CcHfYxjP.js +1 -0
- package/dist/assets/game-Cqzj_lpD.js +1 -0
- package/dist/assets/game-DSZdeCHu.js +1 -0
- package/dist/assets/game-Dch9sAPc.js +1 -0
- package/dist/assets/{game-xsOho_wg.js → game-SAFn90pA.js} +3 -3
- package/dist/assets/game-loop-DMIgSMV-.js +1 -0
- package/dist/assets/{game-source-CvidN7AB.js → game-source-Dk83w26t.js} +1 -1
- package/dist/assets/{index-Bp5cecD6.js → index-4idIsHHJ.js} +2 -2
- package/dist/assets/{index-DL7RcQ0n.js → index-C-LhOTBN.js} +1 -1
- package/dist/assets/{index-Cs8xwv3e.js → index-CDkxceqE.js} +1 -1
- package/dist/assets/index-CQEfi217.js +15412 -0
- package/dist/assets/index-Dvi-V0NE.css +1 -0
- package/dist/assets/ingest-siblings-s0P5I1Ub.js +1 -0
- package/dist/assets/mount-manifest-DXMOlF79.js +1 -0
- package/dist/assets/react-18-C9eHn8x1.js +1 -0
- package/dist/assets/webworkerAll-Fn0e-ouF.js +1 -0
- package/dist/assets/world-documents-GM0a9Kv7.js +1 -0
- package/dist/index.html +15 -13
- package/dist/ingest/racing-game/vgai.game.json +5 -4
- package/dist/ingest/simcity/vgai.game.json +5 -4
- package/dist/ingest/tanks/vgai.game.json +5 -4
- package/dist/project-scripts.bundle.js +3917 -0
- package/dist/scenes/untitled.vscn.json +2 -0
- package/dist-server/packaged.mjs +7697 -3435
- package/package.json +31 -4
- package/scripts/probe-reporter.ts +349 -0
- package/scripts/run-probe.ts +2260 -0
- package/server/asset-catalog-audit.ts +268 -0
- package/server/asset-catalog-v2.ts +146 -0
- package/server/asset-library-routes.ts +276 -58
- package/server/canonical-path.ts +1 -1
- package/server/dev.ts +148 -44
- package/server/editor-server.ts +888 -61
- package/server/editor-sse.ts +115 -4
- package/server/harness-chat-service.ts +796 -0
- package/server/local-asset-catalog.ts +157 -22
- package/server/packaged.ts +51 -21
- package/server/process-shutdown.ts +136 -0
- package/server/prod.ts +9 -6
- package/server/project-hmr-files.ts +41 -0
- package/server/project-operations.ts +343 -0
- package/server/project-optimize-deps-entries.ts +4 -4
- package/server/project-output-writer.ts +156 -0
- package/server/project-validation.ts +140 -0
- package/server/project-view.ts +8 -50
- package/server/server-utils.ts +75 -10
- package/server/session-registry.ts +12 -0
- package/src/EditorContext.tsx +107 -3
- package/src/action-registry.ts +115 -17
- package/src/adapter-resolver.ts +213 -478
- package/src/asset-events.ts +64 -1
- package/src/asset-preview.ts +906 -0
- package/src/asset-selection.ts +121 -0
- package/src/asset-workflow/asset-capabilities.ts +259 -0
- package/src/asset-workflow/asset-editor-errors.ts +46 -0
- package/src/asset-workflow/asset-import-pipeline.ts +176 -0
- package/src/asset-workflow/asset-library-query.ts +107 -0
- package/src/asset-workflow/asset-types.ts +192 -0
- package/src/asset-workflow/asset-workflow-quality.ts +65 -0
- package/src/asset-workflow/import-contract.ts +113 -0
- package/src/asset-workflow/model-conversion.ts +126 -0
- package/src/asset-workflow/model-inspection.ts +185 -0
- package/src/asset-workflow/project-asset-commands.ts +23 -0
- package/src/asset-workflow/project-asset-health.ts +153 -0
- package/src/asset-workflow/project-asset-operations.ts +119 -0
- package/src/asset-workflow/thumbnail-system.ts +172 -0
- package/src/authoring/active-systems.ts +15 -0
- package/src/authoring/boundary-authoring-adapter.ts +16 -5
- package/src/authoring/composite-authoring-adapter.ts +305 -124
- package/src/authoring/design-time-layers.ts +300 -117
- package/src/authoring/edit-mode-authoring.ts +278 -293
- package/src/authoring/embed-only-adapter.ts +4 -2
- package/src/authoring/first-party-hierarchy-menu.ts +7 -2
- package/src/authoring/first-party-inspector/AddSectionMenu.tsx +5 -12
- package/src/authoring/first-party-inspector/EnvironmentSection.tsx +53 -126
- package/src/authoring/first-party-inspector/HeaderSection.tsx +54 -65
- package/src/authoring/first-party-inspector/is-first-party-selection.ts +30 -11
- package/src/authoring/first-party-inspector/register.tsx +13 -2
- package/src/authoring/ingest-authoring-adapter.ts +142 -45
- package/src/authoring/mount-failure-report.ts +5 -5
- package/src/authoring/provenance.ts +41 -0
- package/src/authoring/react-dom-authoring-adapter.ts +92 -92
- package/src/authoring/react-inspector-section.tsx +489 -51
- package/src/authoring/react-world-authoring-adapter.ts +541 -306
- package/src/authoring/story-overlay.ts +1 -1
- package/src/authoring/story-types.ts +11 -0
- package/src/authoring/vgai-scene-authoring-adapter.ts +54 -25
- package/src/authoring/viewport-tool-context.ts +78 -0
- package/src/authoring/world-canvas-viewport-state.ts +35 -0
- package/src/authoring/world-hidden-viewport.ts +186 -0
- package/src/authoring/world-pan-state.ts +33 -17
- package/src/authoring/world-session-state.ts +1 -1
- package/src/authoring/world2d-authoring-adapter.ts +109 -52
- package/src/availability-tick.ts +56 -0
- package/src/browser-play-entry.ts +5 -5
- package/src/browser-project-scripts.ts +1 -0
- package/src/build-identity.ts +15 -0
- package/src/command-listener.ts +893 -19
- package/src/components/AlignToolbar.tsx +74 -63
- package/src/components/AppRoot.tsx +193 -26
- package/src/components/ApplicationMenus.tsx +272 -0
- package/src/components/AssetBrowser.tsx +1450 -293
- package/src/components/AssetEditorShell.tsx +141 -0
- package/src/components/AssetImportDetails.tsx +218 -0
- package/src/components/AssetLibraryPanel.tsx +14 -0
- package/src/components/CameraInfo.tsx +11 -20
- package/src/components/CenterDocuments.tsx +585 -0
- package/src/components/CommandPalette.tsx +75 -30
- package/src/components/ConsolePanel.css +55 -0
- package/src/components/ConsolePanel.tsx +57 -112
- package/src/components/DebugConsolePanel.tsx +461 -0
- package/src/components/DebuggerPanel.tsx +165 -0
- package/src/components/DefaultEditorLayout.tsx +167 -231
- package/src/components/GameHierarchy.tsx +873 -290
- package/src/components/GamePerformanceOverlay.tsx +46 -0
- package/src/components/HarnessChatPanel.tsx +2352 -0
- package/src/components/HistoryPanel.tsx +226 -0
- package/src/components/Inspector.tsx +153 -99
- package/src/components/InspectorToolSection.tsx +6 -4
- package/src/components/MountFailureBanner.tsx +31 -48
- package/src/components/NetworkSection.tsx +25 -14
- package/src/components/OnlineAssetBrowser.tsx +794 -343
- package/src/components/OverlayReportBanner.tsx +38 -64
- package/src/components/PerformancePanel.tsx +206 -0
- package/src/components/PlayBar.tsx +93 -263
- package/src/components/PrefabSaveDialog.tsx +55 -127
- package/src/components/ProjectHeader.css +60 -0
- package/src/components/ProjectHeader.tsx +170 -105
- package/src/components/ProjectScreen.tsx +246 -184
- package/src/components/ReactCanvasControls.tsx +185 -0
- package/src/components/ResolutionPicker.tsx +85 -0
- package/src/components/RootActivateDialog.tsx +39 -68
- package/src/components/SaveDialog.tsx +55 -127
- package/src/components/SaveStatus.tsx +11 -29
- package/src/components/StartupLoadingScreen.tsx +96 -0
- package/src/components/StateWatchPanel.tsx +302 -0
- package/src/components/StatsOverlay.tsx +12 -5
- package/src/components/StatusBar.tsx +64 -0
- package/src/components/ThemeManagerDialog.css +89 -0
- package/src/components/ThemeManagerDialog.tsx +371 -0
- package/src/components/ToolHost.tsx +26 -15
- package/src/components/Toolbar.tsx +117 -214
- package/src/components/VgaiVoxelLogo.tsx +89 -0
- package/src/components/ViewportOverlay.tsx +97 -172
- package/src/components/ViewportPanel.tsx +130 -31
- package/src/components/WorkspaceDock.tsx +891 -0
- package/src/components/WorldSelectionOverlay.tsx +51 -63
- package/src/components/WorldTextEditor.tsx +9 -5
- package/src/components/asset-documents.tsx +390 -0
- package/src/components/asset-editor-persistence.ts +44 -0
- package/src/components/asset-selection-section.tsx +338 -0
- package/src/components/asset-viewers/AudioViewer.tsx +73 -21
- package/src/components/asset-viewers/GenericJsonViewer.tsx +26 -11
- package/src/components/asset-viewers/ImageViewer.tsx +43 -11
- package/src/components/asset-viewers/InputMapViewer.tsx +512 -134
- package/src/components/asset-viewers/MaterialAssetEditor.tsx +540 -0
- package/src/components/asset-viewers/ModelViewer.tsx +805 -121
- package/src/components/asset-viewers/OnlineAssetDetail.tsx +177 -60
- package/src/components/asset-viewers/SourceAssetViewer.tsx +121 -0
- package/src/components/asset-workflow.css +506 -0
- package/src/components/build-documents.tsx +696 -0
- package/src/components/core-utilities.tsx +75 -0
- package/src/components/data-documents.tsx +364 -0
- package/src/components/{DataPanel.tsx → data-editor.tsx} +138 -288
- package/src/components/debugger-panel-state.ts +57 -0
- package/src/components/inspector-widgets/AlignmentGrid.tsx +8 -14
- package/src/components/inspector-widgets/BorderEditor.tsx +41 -33
- package/src/components/inspector-widgets/ColorPicker.tsx +39 -39
- package/src/components/inspector-widgets/FontPicker.tsx +13 -21
- package/src/components/inspector-widgets/GradientEditor.tsx +11 -19
- package/src/components/inspector-widgets/ScrubbableInput.tsx +6 -3
- package/src/components/inspector-widgets/ShadowEditor.tsx +20 -33
- package/src/components/inspector-widgets/shared.tsx +90 -49
- package/src/components/inspectors/AnimationSection.tsx +39 -40
- package/src/components/inspectors/AudioSection.tsx +28 -39
- package/src/components/inspectors/BoneAttachmentSection.tsx +19 -24
- package/src/components/inspectors/CameraSection.tsx +14 -23
- package/src/components/inspectors/ComponentsSection.tsx +39 -43
- package/src/components/inspectors/JointsSection.tsx +34 -43
- package/src/components/inspectors/LightSection.tsx +90 -35
- package/src/components/inspectors/MaterialSection.tsx +137 -174
- package/src/components/inspectors/MeshSection.tsx +9 -17
- package/src/components/inspectors/NavigationSection.tsx +8 -15
- package/src/components/inspectors/ParticleSection.tsx +91 -76
- package/src/components/inspectors/PhysicsSection.tsx +42 -46
- package/src/components/inspectors/PostProcessingSection.tsx +28 -36
- package/src/components/inspectors/RenderingSection.tsx +12 -20
- package/src/components/inspectors/ShadowSection.tsx +7 -8
- package/src/components/inspectors/SplineSection.tsx +31 -42
- package/src/components/inspectors/TransformSection.tsx +14 -22
- package/src/components/patterns/Dialog.tsx +95 -0
- package/src/components/patterns/Fields.tsx +44 -0
- package/src/components/patterns/List.tsx +25 -0
- package/src/components/patterns/StateSurface.tsx +40 -0
- package/src/components/patterns/Surfaces.tsx +115 -0
- package/src/components/patterns/Tabs.tsx +80 -0
- package/src/components/patterns/Toolbar.tsx +51 -0
- package/src/components/patterns/Tree.tsx +72 -0
- package/src/components/primitives/Button.tsx +46 -0
- package/src/components/primitives/ColorInput.tsx +11 -47
- package/src/components/primitives/EditorIcon.tsx +99 -0
- package/src/components/primitives/FormControls.tsx +71 -0
- package/src/components/primitives/JsonInput.tsx +15 -2
- package/src/components/primitives/Layout.tsx +100 -0
- package/src/components/primitives/Menu.tsx +105 -0
- package/src/components/primitives/NumberInput.tsx +8 -35
- package/src/components/primitives/Panel.tsx +49 -44
- package/src/components/primitives/SectionHeader.tsx +10 -28
- package/src/components/primitives/Text.tsx +46 -0
- package/src/components/primitives/Tooltip.tsx +20 -12
- package/src/components/primitives/Vec3Input.tsx +3 -0
- package/src/components/primitives/banner-tones.ts +33 -0
- package/src/components/primitives/editor-icons.ts +102 -0
- package/src/components/primitives/panel-header-styles.ts +30 -0
- package/src/components/project-operation-documents.tsx +226 -0
- package/src/components/status-contributions.tsx +175 -0
- package/src/components/story-documents-register.ts +15 -0
- package/src/components/story-documents.tsx +1185 -0
- package/src/components/tool-documents.tsx +110 -0
- package/src/components/workspace-dock.css +293 -0
- package/src/components/workspace-history.ts +33 -0
- package/src/components/world-documents.tsx +145 -0
- package/src/components/xstate-documents.tsx +209 -0
- package/src/composite-screenshot.ts +248 -0
- package/src/design-system/index.ts +70 -0
- package/src/design-system-stories/Foundation.stories.tsx +183 -0
- package/src/design-system-stories/Patterns.stories.tsx +251 -0
- package/src/design-system-stories/Workspace.stories.tsx +538 -0
- package/src/doctor/report.ts +57 -13
- package/src/editor-api.ts +295 -31
- package/src/editor-compatibility.ts +200 -0
- package/src/editor-console.ts +35 -17
- package/src/editor-hotkeys.ts +85 -33
- package/src/editor-store.ts +538 -233
- package/src/editor-viewport.ts +160 -34
- package/src/entity-factory.ts +14 -3
- package/src/gizmo-registry.ts +21 -5
- package/src/harness-chat-editor-context.ts +37 -0
- package/src/harness-chat-indicator.ts +68 -0
- package/src/harness-chat-layout.ts +53 -0
- package/src/harness-chat-lifecycle.ts +170 -0
- package/src/harness-chat-reconnect.ts +85 -0
- package/src/harness-chat-types.ts +409 -0
- package/src/hierarchy-drop.ts +50 -0
- package/src/hierarchy-expansion-state.ts +100 -0
- package/src/hierarchy-menu-registry.ts +1 -1
- package/src/hierarchy-projection.ts +76 -0
- package/src/history/editor-session.ts +21 -0
- package/src/history/history-commands.ts +147 -0
- package/src/history/history-service.ts +904 -0
- package/src/history/json-history-resource.ts +165 -0
- package/src/history/persistence-coordinator.ts +35 -0
- package/src/history/project-file-history.ts +266 -0
- package/src/history/project-root-history-backends.ts +53 -0
- package/src/history/resource-registry.ts +209 -0
- package/src/history/snapshot-store.ts +108 -0
- package/src/history/source-history-backend.ts +374 -0
- package/src/history/types.ts +100 -0
- package/src/hmr-registration-group.ts +67 -0
- package/src/hmr-stable-react-context.ts +23 -0
- package/src/hosted-example.ts +12 -2
- package/src/hotkeys.ts +89 -18
- package/src/ingest/discovery-react.ts +9 -10
- package/src/ingest/discovery.ts +4 -4
- package/src/ingest/discovery2d.ts +5 -5
- package/src/ingest/games/bloom-composer/vgai.game.json +3 -3
- package/src/ingest/games/embed-bundle/vgai.game.json +3 -3
- package/src/ingest/games/games-fps/vgai.game.json +3 -3
- package/src/ingest/games/iframe-reachable/vgai.game.json +3 -3
- package/src/ingest/games/interactive-cubes/vgai.game.json +3 -3
- package/src/ingest/games/mismatched-three/vgai.game.json +3 -3
- package/src/ingest/games/own-three-bundled/vgai.game.json +3 -3
- package/src/ingest/games/pointerlock-maze/vgai.game.json +7 -4
- package/src/ingest/games-2d/bubbo-bubbo/vgai.game.json +3 -3
- package/src/ingest/games-2d/bunnymark/vgai.game.json +3 -3
- package/src/ingest/games-2d/flappy/vgai.game.json +3 -3
- package/src/ingest/games-2d/flappy-pixi/vgai.game.json +3 -3
- package/src/ingest/games-2d/puzzling-potions/vgai.game.json +3 -3
- package/src/ingest/games-2d/tilemap-camera/vgai.game.json +3 -3
- package/src/ingest/games-react/react-rpg/vgai.game.json +3 -3
- package/src/ingest/types.ts +1 -1
- package/src/ingest-mode.ts +47 -52
- package/src/ingest-siblings.ts +23 -33
- package/src/initial-scene.ts +1 -2
- package/src/main.tsx +16 -8
- package/src/manifest-project.ts +10 -12
- package/src/model-thumbnail.ts +261 -26
- package/src/module-mode.ts +44 -50
- package/src/play-log-events.ts +26 -0
- package/src/play-mode.ts +495 -401
- package/src/play-scene-adoption.ts +23 -0
- package/src/playground/main.ts +68 -24
- package/src/playwright-shim.ts +473 -0
- package/src/project-manager.ts +90 -10
- package/src/project-operations.ts +112 -0
- package/src/project-story-discovery.ts +25 -0
- package/src/project-tool-discovery.ts +43 -0
- package/src/scene-serializer.ts +0 -6
- package/src/scene-sync.ts +7 -2
- package/src/script-loader.ts +3 -3
- package/src/skeleton-helper.ts +57 -0
- package/src/storage/seed.ts +68 -8
- package/src/stories/StoryPreviewMount.tsx +265 -0
- package/src/stories/action-stories.fixture.tsx +44 -0
- package/src/stories/button-stories.fixture.tsx +50 -0
- package/src/stories/compose-project-stories.ts +182 -0
- package/src/stories/loader-stories.fixture.tsx +53 -0
- package/src/stories/story-discovery.ts +130 -0
- package/src/stories/story-registry.ts +146 -0
- package/src/theme-css.ts +1049 -0
- package/src/theme-library.ts +238 -0
- package/src/theme-preference.ts +130 -0
- package/src/theme.ts +527 -0
- package/src/tool-loader.ts +80 -24
- package/src/ui-source/inspect.ts +27 -4
- package/src/ui-source/source-write-backend.ts +83 -22
- package/src/widgets/index.ts +9 -18
- package/src/workspace-aux-commands.ts +11 -0
- package/src/workspace-dock-controller.ts +64 -0
- package/src/workspace-document-ids.ts +5 -0
- package/src/workspace-document-registry.ts +367 -0
- package/src/workspace-state-persistence.ts +455 -0
- package/src/workspace-status-registry.ts +110 -0
- package/src/workspace-utility-commands.ts +49 -0
- package/src/workspace-utility-registry.ts +161 -0
- package/src/world-document-routing.ts +16 -0
- package/src/xstate-inspect/XStateMachineInspector.tsx +544 -0
- package/src/xstate-inspect/character-animation-machine.fixture.ts +74 -0
- package/src/xstate-inspect/use-live-actor-state.ts +39 -0
- package/src/xstate-inspect/xstate-graph.ts +265 -0
- package/src/xstate-inspect/xstate-layout.ts +76 -0
- package/src/z-index.ts +26 -0
- package/template/.claude/skills/editor/SKILL.md +129 -90
- package/template/AGENTS.md +1110 -0
- package/template/CLAUDE.md +1 -512
- package/template/IDIOMS.md +50 -0
- package/template/check-idioms.ts +706 -0
- package/template/manifest-entry-modules-plugin.ts +53 -0
- package/template/package.json +13 -4
- package/template/public/scenes/default.scn2d.json +6 -0
- package/template/public/scenes/default.vscn.json +7 -1
- package/template/public/scenes/untitled.vscn.json +10 -0
- package/template/scripts/playtest.ts +40 -0
- package/template/server/loopback.ts +75 -0
- package/template/server/rooms/arena-room.ts +69 -1
- package/template/server/rooms/game-room.ts +68 -1
- package/template/src/data/README.md +9 -4
- package/template/src/data/data-ref.ts +35 -0
- package/template/src/data/tuning.schema.ts +1 -1
- package/template/src/main.ts +41 -62
- package/template/src/manifest-entry-modules.d.ts +3 -0
- package/template/src/operations/README.md +88 -0
- package/template/src/runtime/pixi-adapter.ts +24 -0
- package/template/src/scripts/components/data-spinner.ts +43 -2
- package/template/src/scripts/components/spin-lap-math.ts +27 -0
- package/template/src/tools/README.md +5 -3
- package/template/src/tools/example.tool.tsx +13 -7
- package/template/src/ui/Button.stories.tsx +66 -0
- package/template/src/ui/RebindPanel.tsx +2 -6
- package/template/src/ui/game.tsx +17 -0
- package/template/tests/acceptance/example.spec.ts +64 -0
- package/template/tests/logic/example.test.ts +31 -0
- package/template/tests/logic/room.test.ts +100 -0
- package/template/tests/tsconfig.json +30 -0
- package/template/validate-manifest.ts +5 -5
- package/template/validate-scenes.ts +50 -18
- package/template/vgai.game.json +20 -13
- package/template/vite.config.ts +77 -16
- package/vite-plugin-ui-oid.ts +261 -17
- package/dist/assets/CCDIKSolver-Dz-ysxZF.js +0 -1
- package/dist/assets/SelectionBox-BXsv_6aH.js +0 -1
- package/dist/assets/browser-project-scripts-DOru4L1x.js +0 -2
- package/dist/assets/browserAll-CEkWYlFk.js +0 -1
- package/dist/assets/create-runtime-DYIWr3va.js +0 -1
- package/dist/assets/data-asset-Bb9sIM7i.js +0 -5
- package/dist/assets/game-8SDZPPgH.js +0 -1
- package/dist/assets/game-CevorxyV.js +0 -1
- package/dist/assets/game-Di7XlywD.js +0 -1
- package/dist/assets/game-DjnCaw8R.js +0 -1
- package/dist/assets/game-Q9A0aXSV.js +0 -1
- package/dist/assets/index-CPVV6pjw.js +0 -1
- package/dist/assets/index-CpOnYyeD.js +0 -213
- package/dist/assets/index-Dr8H_6Rl.js +0 -1
- package/dist/assets/index-_bCaipUk.js +0 -13650
- package/dist/assets/ingest-siblings-Dz8eEqrV.js +0 -1
- package/dist/assets/mount-manifest-Bhk0ohsl.js +0 -1
- package/dist/assets/scene-query-BivAHhJu.js +0 -1
- package/dist/assets/webworkerAll-BLrH0F6F.js +0 -1
- package/dist/assets/xstate-animation-binding-1NGLmw6y.js +0 -1
- package/dist/assets/xstate.esm-BgUD33nl.js +0 -3
- package/src/authoring/scene-ui-layer.ts +0 -485
- package/src/authoring/ui-authoring-adapter.ts +0 -325
- package/src/authoring/ui-hierarchy-menu.ts +0 -40
- package/src/authoring/ui-inspector-sections.tsx +0 -156
- package/src/authoring/undo-timeline.ts +0 -145
- package/src/components/BottomPanel.tsx +0 -326
- package/src/components/BuildPanel.tsx +0 -455
- package/src/components/FolderTree.tsx +0 -179
- package/src/components/RightPanel.tsx +0 -166
- package/src/components/WorldContextMenu.tsx +0 -257
- package/src/components/asset-viewers/AssetViewer.tsx +0 -38
- package/src/ingest/games-react/react-rpg/src/ui/game-state.tsx +0 -129
- package/src/scene-ui-mode/active-scene-ui.ts +0 -58
- package/src/scene-ui-mode/scene-ui-palette-panel.tsx +0 -152
- package/src/scene-ui-mode/scene-ui-timeline-tab.tsx +0 -29
- package/src/scene-ui-mode/ui-prefab-dialog-host.tsx +0 -74
- package/src/scene-ui-mode/ui-prefab-hierarchy-menu.ts +0 -49
- package/src/scene-ui-mode/ui-prefab-io.ts +0 -76
- package/src/ui-editor/inspector.tsx +0 -563
- package/src/ui-editor/node-ops.ts +0 -266
- package/src/ui-editor/overlay.tsx +0 -380
- package/src/ui-editor/palette.tsx +0 -114
- package/src/ui-editor/react-store.ts +0 -78
- package/src/ui-editor/timeline-panel.tsx +0 -443
- package/src/ui-editor/ui-edit-store.ts +0 -552
- package/src/ui-editor/ui-prefab.ts +0 -95
- package/template/project.json +0 -9
- package/template/src/scripts/main.ts +0 -94
- package/template/src/ui/DefaultHud.tsx +0 -40
- package/template/src/ui/game-state.tsx +0 -37
- package/template/src/ui/mount-default-hud.tsx +0 -19
- package/template/src/ui/mount-ui.ts +0 -15
- package/vite-plugin-react-world-provider.ts +0 -81
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
import type {
|
|
15
15
|
AuthoringAdapter,
|
|
16
16
|
AuthoringCapabilities,
|
|
17
|
+
AuthoringProvenance,
|
|
17
18
|
EditorNode,
|
|
18
19
|
HierarchyProvider,
|
|
19
20
|
InspectorProvider,
|
|
@@ -32,7 +33,21 @@ import {
|
|
|
32
33
|
import type { PhysicsAdapter2D } from '@engine/world2d/system-adapters-2d';
|
|
33
34
|
import type { Container } from 'pixi.js';
|
|
34
35
|
import type { EditorStore } from '../editor-store';
|
|
35
|
-
import {
|
|
36
|
+
import { JsonHistoryResource } from '../history/json-history-resource';
|
|
37
|
+
|
|
38
|
+
interface World2DHistoryState {
|
|
39
|
+
overlay: Overlay2D;
|
|
40
|
+
nodes: Record<
|
|
41
|
+
string,
|
|
42
|
+
{
|
|
43
|
+
label: string;
|
|
44
|
+
alpha: number;
|
|
45
|
+
visible: boolean;
|
|
46
|
+
tint?: number;
|
|
47
|
+
transform?: Transform2DValue;
|
|
48
|
+
}
|
|
49
|
+
>;
|
|
50
|
+
}
|
|
36
51
|
|
|
37
52
|
function numToHex(n: number): string {
|
|
38
53
|
return `#${(n & 0xffffff).toString(16).padStart(6, '0')}`;
|
|
@@ -64,11 +79,22 @@ export interface World2DAuthoringOptions {
|
|
|
64
79
|
|
|
65
80
|
export class World2DAuthoringAdapter implements AuthoringAdapter {
|
|
66
81
|
readonly capabilities: AuthoringCapabilities;
|
|
82
|
+
|
|
83
|
+
// Every construction site today persists through the 2D overlay
|
|
84
|
+
// (`saveWorldOverlay`) — including first-party pixi roots: the live tree
|
|
85
|
+
// is projected directly and never written back as source.
|
|
86
|
+
readonly provenance: AuthoringProvenance = {
|
|
87
|
+
source: 'foreign',
|
|
88
|
+
label: 'overlay',
|
|
89
|
+
detail:
|
|
90
|
+
'Live 2D (PixiJS) tree projected directly — edits persist to an editor overlay, never to the game source.',
|
|
91
|
+
};
|
|
67
92
|
private readonly a2d: AuthoringAdapter2D;
|
|
68
93
|
private readonly persistFn: ((overlay: Overlay2D) => Promise<void>) | undefined;
|
|
69
94
|
/** Human-readable overlay destination (design §2) — see {@link World2DAuthoringOptions.destination}. */
|
|
70
95
|
private readonly destination: string;
|
|
71
96
|
private listeners = new Set<() => void>();
|
|
97
|
+
private readonly historyResource: JsonHistoryResource<World2DHistoryState> | null;
|
|
72
98
|
|
|
73
99
|
constructor(
|
|
74
100
|
root: Container,
|
|
@@ -93,14 +119,23 @@ export class World2DAuthoringAdapter implements AuthoringAdapter {
|
|
|
93
119
|
reparent: false,
|
|
94
120
|
persist: !!this.persistFn, // runtime-only unless a persist callback is wired
|
|
95
121
|
};
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
122
|
+
const history = store.projectHistory;
|
|
123
|
+
this.historyResource = history
|
|
124
|
+
? new JsonHistoryResource({
|
|
125
|
+
history,
|
|
126
|
+
kind: opts.persist ? 'overlay' : 'session-state',
|
|
127
|
+
scope: opts.persist ? 'project' : 'session',
|
|
128
|
+
...(opts.persist
|
|
129
|
+
? { location: (opts.destination ?? '.vgai/overlays/world2d.json').replace(/^\//, '') }
|
|
130
|
+
: { sessionId: `world2d-${crypto.randomUUID()}` }),
|
|
131
|
+
displayName: opts.destination ?? 'World 2D edits',
|
|
132
|
+
capture: () => this.captureHistoryState(),
|
|
133
|
+
restore: async (state) => {
|
|
134
|
+
this.restoreHistoryState(state);
|
|
135
|
+
if (this.persistFn) await this.persistFn(this.a2d.serializeOverlay());
|
|
136
|
+
},
|
|
137
|
+
})
|
|
138
|
+
: null;
|
|
104
139
|
}
|
|
105
140
|
|
|
106
141
|
refresh(): { count: number; sprites: number } {
|
|
@@ -161,6 +196,7 @@ export class World2DAuthoringAdapter implements AuthoringAdapter {
|
|
|
161
196
|
return {
|
|
162
197
|
id: n.id,
|
|
163
198
|
label: n.label,
|
|
199
|
+
role: 'entity',
|
|
164
200
|
kind: n.kind,
|
|
165
201
|
parentId: n.parentId,
|
|
166
202
|
childIds: n.childIds,
|
|
@@ -196,9 +232,10 @@ export class World2DAuthoringAdapter implements AuthoringAdapter {
|
|
|
196
232
|
// exact same primitives `setTransform`/`getTransform` already use (no lossy
|
|
197
233
|
// angle<->quaternion re-derivation on the undo path).
|
|
198
234
|
beginEdit: (id) => {
|
|
235
|
+
this.historyResource?.assertCanMutate();
|
|
199
236
|
const disp = this.a2d.displayObject(id);
|
|
200
237
|
if (disp && this.physics.ownerOf(disp) === 'physics') this.physics.freeze(disp);
|
|
201
|
-
this.
|
|
238
|
+
this.editStartState = this.captureHistoryState();
|
|
202
239
|
},
|
|
203
240
|
apply: (id, t) => {
|
|
204
241
|
const pos: [number, number] = [t.position[0], t.position[1]];
|
|
@@ -211,23 +248,18 @@ export class World2DAuthoringAdapter implements AuthoringAdapter {
|
|
|
211
248
|
endEdit: (id) => {
|
|
212
249
|
const disp = this.a2d.displayObject(id);
|
|
213
250
|
if (disp && this.physics.ownerOf(disp) === 'physics') this.physics.unfreeze(disp);
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
this.pushUndo({
|
|
220
|
-
undo: () => this.writeTransform(id, prev),
|
|
221
|
-
redo: () => this.writeTransform(id, next),
|
|
222
|
-
});
|
|
251
|
+
this.recordHistory(
|
|
252
|
+
`Transform ${this.a2d.node(id)?.label ?? '2D Object'}`,
|
|
253
|
+
this.editStartState,
|
|
254
|
+
);
|
|
255
|
+
this.editStartState = undefined;
|
|
223
256
|
},
|
|
224
257
|
};
|
|
225
258
|
|
|
226
259
|
/** Write a 2D transform to the live tree (+ physics body, if owned) + the
|
|
227
|
-
*
|
|
228
|
-
* `transforms.apply` (live-drag, no push) and the undo/redo thunks
|
|
229
|
-
* `endEdit` records (which DO push, exactly once, on commit). */
|
|
260
|
+
* overlay. The gesture's complete before/after state is journaled at endEdit. */
|
|
230
261
|
private writeTransform(id: string, t: Transform2DValue): void {
|
|
262
|
+
this.historyResource?.assertCanMutate();
|
|
231
263
|
const disp = this.a2d.displayObject(id);
|
|
232
264
|
if (disp && this.physics.ownerOf(disp) === 'physics') {
|
|
233
265
|
this.physics.commit(disp, t.position, t.rotation);
|
|
@@ -255,12 +287,10 @@ export class World2DAuthoringAdapter implements AuthoringAdapter {
|
|
|
255
287
|
return disp[path];
|
|
256
288
|
},
|
|
257
289
|
set: (id, path, value) => {
|
|
258
|
-
|
|
290
|
+
this.historyResource?.assertCanMutate();
|
|
291
|
+
const before = this.captureHistoryState();
|
|
259
292
|
this.writeProp(id, path, value);
|
|
260
|
-
this.
|
|
261
|
-
undo: () => this.writeProp(id, path, prev),
|
|
262
|
-
redo: () => this.writeProp(id, path, value),
|
|
263
|
-
});
|
|
293
|
+
this.recordHistory(`Set ${this.a2d.node(id)?.label ?? '2D Object'} ${path}`, before);
|
|
264
294
|
},
|
|
265
295
|
};
|
|
266
296
|
|
|
@@ -269,45 +299,72 @@ export class World2DAuthoringAdapter implements AuthoringAdapter {
|
|
|
269
299
|
private writeProp(id: string, path: string, value: unknown): void {
|
|
270
300
|
const disp = this.a2d.displayObject(id) as (Container & Record<string, unknown>) | null;
|
|
271
301
|
if (!disp) return;
|
|
272
|
-
if (path === 'name')
|
|
302
|
+
if (path === 'name') this.a2d.set(id, 'label', value as string);
|
|
273
303
|
else if (path === 'tint') this.a2d.set(id, 'tint', hexToNum(value as string));
|
|
274
304
|
else if (path === 'visible') this.a2d.set(id, 'visible', value as boolean);
|
|
305
|
+
else if (path === 'alpha') this.a2d.set(id, 'alpha', value as number);
|
|
275
306
|
else disp[path] = value;
|
|
276
307
|
this.notify();
|
|
277
308
|
}
|
|
278
309
|
|
|
279
310
|
// --- Overlay-backed undo/redo (v4 §7.1-13 — the world2d port of
|
|
280
311
|
// IngestAuthoringAdapter's "Overlay-backed undo/redo" section). ---
|
|
281
|
-
private
|
|
282
|
-
private readonly redoStack: Array<{ undo: () => void; redo: () => void }> = [];
|
|
283
|
-
private editStartTransform: Transform2DValue | undefined;
|
|
312
|
+
private editStartState: World2DHistoryState | undefined;
|
|
284
313
|
|
|
285
|
-
private
|
|
286
|
-
this.
|
|
287
|
-
|
|
288
|
-
|
|
314
|
+
private recordHistory(label: string, before: World2DHistoryState | undefined): void {
|
|
315
|
+
if (this.historyResource && before) {
|
|
316
|
+
void this.historyResource.record(label, before, this.captureHistoryState()).catch(() => {});
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
subscribe(listener: () => void): () => void {
|
|
322
|
+
this.listeners.add(listener);
|
|
323
|
+
return () => this.listeners.delete(listener);
|
|
289
324
|
}
|
|
290
325
|
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
const e = this.undoStack.pop();
|
|
295
|
-
if (!e) return false;
|
|
296
|
-
e.undo();
|
|
297
|
-
this.redoStack.push(e);
|
|
298
|
-
return true;
|
|
326
|
+
dispose(): void {
|
|
327
|
+
this.historyResource?.dispose();
|
|
328
|
+
this.listeners.clear();
|
|
299
329
|
}
|
|
300
330
|
|
|
301
|
-
|
|
302
|
-
const
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
331
|
+
private captureHistoryState(): World2DHistoryState {
|
|
332
|
+
const nodes: World2DHistoryState['nodes'] = {};
|
|
333
|
+
const visit = (id: string): void => {
|
|
334
|
+
const node = this.a2d.node(id);
|
|
335
|
+
const display = this.a2d.displayObject(id) as (Container & { tint?: number }) | null;
|
|
336
|
+
if (!node || !display) return;
|
|
337
|
+
let transform: Transform2DValue | null = null;
|
|
338
|
+
try {
|
|
339
|
+
transform = this.a2d.getTransform(id);
|
|
340
|
+
} catch {
|
|
341
|
+
// A custom adapter may expose inspectable container-like nodes without
|
|
342
|
+
// Pixi transform observables. Their non-transform fields remain journaled.
|
|
343
|
+
}
|
|
344
|
+
nodes[id] = {
|
|
345
|
+
label: display.label ?? '',
|
|
346
|
+
alpha: display.alpha,
|
|
347
|
+
visible: display.visible,
|
|
348
|
+
...('tint' in display ? { tint: display.tint } : {}),
|
|
349
|
+
...(transform ? { transform } : {}),
|
|
350
|
+
};
|
|
351
|
+
for (const childId of node.childIds) visit(childId);
|
|
352
|
+
};
|
|
353
|
+
for (const root of this.a2d.roots()) visit(root.id);
|
|
354
|
+
return { overlay: structuredClone(this.a2d.serializeOverlay()), nodes };
|
|
307
355
|
}
|
|
308
356
|
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
357
|
+
private restoreHistoryState(state: World2DHistoryState): void {
|
|
358
|
+
for (const [id, value] of Object.entries(state.nodes)) {
|
|
359
|
+
const display = this.a2d.displayObject(id) as (Container & { tint?: number }) | null;
|
|
360
|
+
if (!display) continue;
|
|
361
|
+
display.label = value.label;
|
|
362
|
+
display.alpha = value.alpha;
|
|
363
|
+
display.visible = value.visible;
|
|
364
|
+
if (value.tint !== undefined && 'tint' in display) display.tint = value.tint;
|
|
365
|
+
if (value.transform) this.a2d.setTransform(id, value.transform);
|
|
366
|
+
}
|
|
367
|
+
this.a2d.replaceOverlay(state.overlay);
|
|
368
|
+
this.notify();
|
|
312
369
|
}
|
|
313
370
|
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* W5 (workspace-shell W5-candidates, recorded by the W4 reviewer in
|
|
3
|
+
* docs/workspace-shell/W0-INVENTORY.md §7): ONE shared 250ms availability
|
|
4
|
+
* tick replacing the three independent `setInterval(…, 250)` pollers that
|
|
5
|
+
* W4 left behind (utility availability, the play-only State Watch gate, and
|
|
6
|
+
* ConnectionStatus's networking-adapter poll).
|
|
7
|
+
*
|
|
8
|
+
* These gates all watch the SAME kind of out-of-band signal — a live play
|
|
9
|
+
* session's adapters appearing/disappearing without any store/registry
|
|
10
|
+
* notification — so they don't need three timers, three wakeups, and three
|
|
11
|
+
* interleaved re-render schedules; they need one heartbeat. The interval is
|
|
12
|
+
* refcounted: it starts with the first subscriber and stops with the last,
|
|
13
|
+
* so an idle editor (none of the three consumers mounted) runs no timer at
|
|
14
|
+
* all — strictly better than the three always-on intervals it replaces.
|
|
15
|
+
*
|
|
16
|
+
* `useSyncExternalStore`-shaped on purpose: consumers subscribe + read the
|
|
17
|
+
* monotonic version, then derive their own predicate (`getActiveDebug()`,
|
|
18
|
+
* `getActiveNetworking()`, utility availability) per render.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import { useSyncExternalStore } from 'react';
|
|
22
|
+
|
|
23
|
+
const TICK_MS = 250;
|
|
24
|
+
|
|
25
|
+
let _version = 0;
|
|
26
|
+
let _intervalId: ReturnType<typeof setInterval> | null = null;
|
|
27
|
+
const _listeners = new Set<() => void>();
|
|
28
|
+
|
|
29
|
+
function onTick(): void {
|
|
30
|
+
_version++;
|
|
31
|
+
for (const fn of _listeners) fn();
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Subscribe to the shared 250ms tick. Starts the timer on first subscriber,
|
|
35
|
+
* stops it with the last. Returns unsubscribe. */
|
|
36
|
+
export function subscribeAvailabilityTick(fn: () => void): () => void {
|
|
37
|
+
_listeners.add(fn);
|
|
38
|
+
if (_intervalId === null) _intervalId = setInterval(onTick, TICK_MS);
|
|
39
|
+
return () => {
|
|
40
|
+
_listeners.delete(fn);
|
|
41
|
+
if (_listeners.size === 0 && _intervalId !== null) {
|
|
42
|
+
clearInterval(_intervalId);
|
|
43
|
+
_intervalId = null;
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** Monotonic tick counter — the `getSnapshot` for `useSyncExternalStore`. */
|
|
49
|
+
export function availabilityTickVersion(): number {
|
|
50
|
+
return _version;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** Re-render the calling component on every shared availability tick. */
|
|
54
|
+
export function useAvailabilityTick(): void {
|
|
55
|
+
useSyncExternalStore(subscribeAvailabilityTick, availabilityTickVersion);
|
|
56
|
+
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Browser play entry — a STATIC, dynamic-import-free
|
|
3
|
-
*
|
|
2
|
+
* Browser play compatibility entry — a STATIC, dynamic-import-free generic
|
|
3
|
+
* scene loader for the hosted editor build. The standalone scaffold no longer
|
|
4
|
+
* owns scene loading in setup code; this path remains for pre-bundled examples
|
|
5
|
+
* and browser-only projects that have no live manifest-module resolver.
|
|
4
6
|
*
|
|
5
7
|
* The static host has no dev server, so play mode can't `import('/@fs/.../main.ts')`.
|
|
6
8
|
* Instead this file is pre-bundled (see `scripts/bundle-project-scripts.mjs`) into a
|
|
@@ -32,9 +34,7 @@ import { setAssetPrefix } from '@engine/loader';
|
|
|
32
34
|
import type { EditorPreview, GameCleanup, GameContext } from '@engine/runtime/types';
|
|
33
35
|
import { loadScene, loadSceneFromData } from '@engine/scene/scene-loader';
|
|
34
36
|
import { applyScenePostProcessing } from '@engine/setup/setup-renderer';
|
|
35
|
-
// The generic fallback
|
|
36
|
-
// minimal) `src/scripts/registry.ts` — unrelated to example dispatch, and this
|
|
37
|
-
// migration wave does not touch the template layout (a later wave does).
|
|
37
|
+
// The generic compatibility fallback uses the template component registry.
|
|
38
38
|
import { componentRegistry, gameComponents } from '../template/src/scripts/registry';
|
|
39
39
|
import { SETUP_BY_EXAMPLE_ID } from './generated/setup-by-example.generated';
|
|
40
40
|
|
|
@@ -56,6 +56,7 @@ const BUNDLE_RUNTIME_MODULE_LOADERS: Record<string, () => Promise<unknown>> = {
|
|
|
56
56
|
'@engine/audio': () => import('@engine/audio'),
|
|
57
57
|
'@engine/data/data-asset': () => import('@engine/data/data-asset'),
|
|
58
58
|
'@engine/ecs/game-component': () => import('@engine/ecs/game-component'),
|
|
59
|
+
'@engine/react/game-state': () => import('@engine/react/game-state'),
|
|
59
60
|
'@engine/scene/scene-loader': () => import('@engine/scene/scene-loader'),
|
|
60
61
|
'@engine/scene/scene-query': () => import('@engine/scene/scene-query'),
|
|
61
62
|
'@engine/scene/user-data': () => import('@engine/scene/user-data'),
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import enginePackage from '../../engine/package.json';
|
|
2
|
+
import { GAME_MANIFEST_VERSION } from '../../engine/src/manifest/schema';
|
|
3
|
+
import editorPackage from '../package.json';
|
|
4
|
+
import type { EditorServerCompatibility } from './editor-compatibility';
|
|
5
|
+
|
|
6
|
+
/** Build-time package identity shared by browser-only editor surfaces. */
|
|
7
|
+
export const BUNDLED_EDITOR_VERSION = editorPackage.version;
|
|
8
|
+
export const BUNDLED_ENGINE_VERSION = enginePackage.version;
|
|
9
|
+
export const BUNDLED_EDITOR_COMPATIBILITY: EditorServerCompatibility = {
|
|
10
|
+
apiVersion: 1,
|
|
11
|
+
engineVersion: BUNDLED_ENGINE_VERSION,
|
|
12
|
+
manifestVersion: GAME_MANIFEST_VERSION,
|
|
13
|
+
startedAt: 'browser-build',
|
|
14
|
+
source: { state: 'current' },
|
|
15
|
+
};
|