@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
|
@@ -49,17 +49,14 @@
|
|
|
49
49
|
* without importing that Object3D-shaped apparatus), and is RETAINED in the
|
|
50
50
|
* document — user data is never silently dropped (AC-K4).
|
|
51
51
|
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
* editor-global undo timeline (`./undo-timeline.ts`) exactly like every
|
|
55
|
-
* other ingest/world adapter — so Ctrl+Z reaches it while it's the active
|
|
56
|
-
* session, and its entries are dropped (not misapplied) once the session
|
|
57
|
-
* ends (the route's teardown calls `unregisterUndoAdapter`).
|
|
52
|
+
* The overlay is one session-scoped JSON history resource. Exact before/after
|
|
53
|
+
* documents are journaled by HistoryService and expire when this mount ends.
|
|
58
54
|
*/
|
|
59
55
|
|
|
60
56
|
import type {
|
|
61
57
|
AuthoringAdapter,
|
|
62
58
|
AuthoringCapabilities,
|
|
59
|
+
AuthoringProvenance,
|
|
63
60
|
BoxEditProvider,
|
|
64
61
|
ColorSampleProvider,
|
|
65
62
|
DOMRectLike,
|
|
@@ -73,6 +70,7 @@ import type {
|
|
|
73
70
|
SelectionProvider,
|
|
74
71
|
} from '@engine/adapter';
|
|
75
72
|
import type { EditorStore } from '../editor-store';
|
|
73
|
+
import { JsonHistoryResource } from '../history/json-history-resource';
|
|
76
74
|
import { browserOrInlineResolver, getComputedStyleValue } from '../ui-source/inspect';
|
|
77
75
|
import {
|
|
78
76
|
cssColorToHex,
|
|
@@ -80,7 +78,6 @@ import {
|
|
|
80
78
|
numericStyleValue,
|
|
81
79
|
styleProp,
|
|
82
80
|
} from './react-world-authoring-adapter';
|
|
83
|
-
import { notifyUndoableOp, registerUndoAdapter } from './undo-timeline';
|
|
84
81
|
|
|
85
82
|
/**
|
|
86
83
|
* The minimal structural shape this adapter needs from a live DOM element —
|
|
@@ -234,9 +231,9 @@ export interface ReactDomAuthoringOptions {
|
|
|
234
231
|
destination: string;
|
|
235
232
|
}
|
|
236
233
|
|
|
237
|
-
interface
|
|
238
|
-
|
|
239
|
-
|
|
234
|
+
interface ReactDomHistoryState {
|
|
235
|
+
overlay: ReactDomOverlay;
|
|
236
|
+
styles: Record<string, Record<string, string>>;
|
|
240
237
|
}
|
|
241
238
|
|
|
242
239
|
export class ReactDomAuthoringAdapter implements AuthoringAdapter {
|
|
@@ -250,12 +247,18 @@ export class ReactDomAuthoringAdapter implements AuthoringAdapter {
|
|
|
250
247
|
persist: true,
|
|
251
248
|
};
|
|
252
249
|
|
|
250
|
+
readonly provenance: AuthoringProvenance = {
|
|
251
|
+
source: 'foreign',
|
|
252
|
+
label: 'overlay',
|
|
253
|
+
detail:
|
|
254
|
+
'Unmodified ingested React game — style edits persist to an editor overlay; the game source is never written.',
|
|
255
|
+
};
|
|
256
|
+
|
|
253
257
|
private readonly doc: ReactDomOverlay;
|
|
254
258
|
private readonly persistFn: (overlay: ReactDomOverlay) => Promise<void>;
|
|
255
259
|
private readonly destinationPath: string;
|
|
256
260
|
private dirty = false;
|
|
257
|
-
private readonly
|
|
258
|
-
private readonly redoStack: PendingUndo[] = [];
|
|
261
|
+
private readonly historyResource: JsonHistoryResource<ReactDomHistoryState> | null;
|
|
259
262
|
/** Synchronous-burst cache for `snapshot()` — see that method's doc. */
|
|
260
263
|
private snapCache: DomTree | null = null;
|
|
261
264
|
private snapInvalidationScheduled = false;
|
|
@@ -288,11 +291,22 @@ export class ReactDomAuthoringAdapter implements AuthoringAdapter {
|
|
|
288
291
|
this.doc = opts.overlay;
|
|
289
292
|
this.persistFn = opts.persist;
|
|
290
293
|
this.destinationPath = opts.destination;
|
|
291
|
-
// This adapter IS an undo/redo target the editor-global timeline
|
|
292
|
-
// dispatches to (mirrors `ReactWorldAuthoringAdapter`'s identical call) —
|
|
293
|
-
// the caller (the ingest route's teardown) unregisters it on session end.
|
|
294
|
-
registerUndoAdapter(this);
|
|
295
294
|
this.applyOverlayOnMount();
|
|
295
|
+
const history = store.projectHistory;
|
|
296
|
+
this.historyResource = history
|
|
297
|
+
? new JsonHistoryResource({
|
|
298
|
+
history,
|
|
299
|
+
kind: 'overlay',
|
|
300
|
+
scope: 'project',
|
|
301
|
+
location: opts.destination.replace(/^\//, ''),
|
|
302
|
+
displayName: opts.destination,
|
|
303
|
+
capture: () => this.captureHistoryState(),
|
|
304
|
+
restore: async (state) => {
|
|
305
|
+
this.restoreHistoryState(state);
|
|
306
|
+
await this.persistFn(this.doc);
|
|
307
|
+
},
|
|
308
|
+
})
|
|
309
|
+
: null;
|
|
296
310
|
}
|
|
297
311
|
|
|
298
312
|
/**
|
|
@@ -346,6 +360,7 @@ export class ReactDomAuthoringAdapter implements AuthoringAdapter {
|
|
|
346
360
|
return {
|
|
347
361
|
id: n.id,
|
|
348
362
|
label: labelFor(n.el, n.tag),
|
|
363
|
+
role: 'element',
|
|
349
364
|
kind: n.tag,
|
|
350
365
|
parentId: n.parentId,
|
|
351
366
|
childIds: n.childIds,
|
|
@@ -387,13 +402,6 @@ export class ReactDomAuthoringAdapter implements AuthoringAdapter {
|
|
|
387
402
|
this.doc[id] = entry;
|
|
388
403
|
}
|
|
389
404
|
|
|
390
|
-
private removeOverlayEntry(id: string, prop: string): void {
|
|
391
|
-
const entry = this.doc[id];
|
|
392
|
-
if (!entry) return;
|
|
393
|
-
delete entry[prop];
|
|
394
|
-
if (Object.keys(entry).length === 0) delete this.doc[id];
|
|
395
|
-
}
|
|
396
|
-
|
|
397
405
|
readonly hierarchy: HierarchyProvider = {
|
|
398
406
|
roots: () => {
|
|
399
407
|
const { nodes, rootIds } = this.snapshot();
|
|
@@ -443,6 +451,13 @@ export class ReactDomAuthoringAdapter implements AuthoringAdapter {
|
|
|
443
451
|
// `ReactWorldAuthoringAdapter.pickable`'s identical fix and the
|
|
444
452
|
// first-party `viewport-raycast.ts` locked-skip.
|
|
445
453
|
if (this.lockedIds.has(node.id)) continue;
|
|
454
|
+
// The host layer is pointer-events:none at rest, so computed style
|
|
455
|
+
// would make every descendant appear non-interactive. Honor only the
|
|
456
|
+
// node's own explicit declaration: a transparent full-size wrapper
|
|
457
|
+
// must not swallow picks intended for a world below it.
|
|
458
|
+
if ((node.el.style as { pointerEvents?: unknown } | undefined)?.pointerEvents === 'none') {
|
|
459
|
+
continue;
|
|
460
|
+
}
|
|
446
461
|
const rect = node.el.getBoundingClientRect?.();
|
|
447
462
|
if (!rect) continue; // no live rect (test fixture, or unmounted) — never a candidate
|
|
448
463
|
if (
|
|
@@ -574,9 +589,11 @@ export class ReactDomAuthoringAdapter implements AuthoringAdapter {
|
|
|
574
589
|
*/
|
|
575
590
|
readonly boxEdit: BoxEditProvider = {
|
|
576
591
|
begin: (id) => {
|
|
592
|
+
this.historyResource?.assertCanMutate();
|
|
577
593
|
this.boxEditSession = { id, touched: new Map(), priorInline: new Map() };
|
|
578
594
|
},
|
|
579
595
|
apply: (id, patch) => {
|
|
596
|
+
this.historyResource?.assertCanMutate();
|
|
580
597
|
const session = this.boxEditSession;
|
|
581
598
|
if (!session || session.id !== id) return; // no open gesture for this id
|
|
582
599
|
const n = this.snapshot().nodes.get(id);
|
|
@@ -626,20 +643,21 @@ export class ReactDomAuthoringAdapter implements AuthoringAdapter {
|
|
|
626
643
|
touched: Map<string, string>,
|
|
627
644
|
priorInline: Map<string, string>,
|
|
628
645
|
): void {
|
|
629
|
-
|
|
646
|
+
this.historyResource?.assertCanMutate();
|
|
647
|
+
const before = this.captureHistoryState();
|
|
648
|
+
const beforeStyles = before.styles[id] ?? {};
|
|
649
|
+
before.styles[id] = beforeStyles;
|
|
650
|
+
for (const [prop, value] of priorInline) beforeStyles[prop] = value;
|
|
651
|
+
let changed = false;
|
|
630
652
|
for (const [prop, value] of touched) {
|
|
631
|
-
|
|
632
|
-
|
|
653
|
+
changed = this.writeStyleEntry(id, prop, value) || changed;
|
|
654
|
+
}
|
|
655
|
+
if (!changed) return;
|
|
656
|
+
if (this.historyResource) {
|
|
657
|
+
void this.historyResource
|
|
658
|
+
.record(`Edit ${touched.size} Styles`, before, this.captureHistoryState())
|
|
659
|
+
.catch(() => {});
|
|
633
660
|
}
|
|
634
|
-
if (entries.length === 0) return;
|
|
635
|
-
this.pushUndo({
|
|
636
|
-
undo: () => {
|
|
637
|
-
for (let i = entries.length - 1; i >= 0; i--) entries[i]!.undo();
|
|
638
|
-
},
|
|
639
|
-
redo: () => {
|
|
640
|
-
for (const entry of entries) entry.redo();
|
|
641
|
-
},
|
|
642
|
-
});
|
|
643
661
|
}
|
|
644
662
|
|
|
645
663
|
readonly inspector: InspectorProvider = {
|
|
@@ -689,88 +707,70 @@ export class ReactDomAuthoringAdapter implements AuthoringAdapter {
|
|
|
689
707
|
};
|
|
690
708
|
|
|
691
709
|
/**
|
|
692
|
-
* T0 (spec 27 §4, B1) — the write body extracted from {@link writeStyle},
|
|
693
|
-
* the
|
|
694
|
-
* writes MULTIPLE props for one logical gesture ({@link commitBoxEdit}) can compose
|
|
695
|
-
* them into a single undo entry itself. `writeStyle` (below) is now a one-line
|
|
696
|
-
* wrapper — identical behavior for its existing single-prop caller (`inspector.set`).
|
|
710
|
+
* T0 (spec 27 §4, B1) — the write body extracted from {@link writeStyle}, returning
|
|
711
|
+
* whether the overlay changed so a multi-property box gesture can record once.
|
|
697
712
|
* `priorInlineOverride`, when given, is used as the captured PRE-gesture inline value
|
|
698
713
|
* instead of re-reading `n.el.style` — needed because `boxEdit.apply` already mutated
|
|
699
714
|
* the live inline style for preview before `end` gets here (see `boxEditSession`'s
|
|
700
715
|
* doc comment). D-K2's restore-BOTH-halves invariant (inline AND overlay) is
|
|
701
716
|
* unchanged — only WHERE `prevInline` comes from differs when an override is given.
|
|
702
717
|
*/
|
|
703
|
-
private writeStyleEntry(
|
|
704
|
-
id: string,
|
|
705
|
-
prop: string,
|
|
706
|
-
value: string,
|
|
707
|
-
priorInlineOverride?: string,
|
|
708
|
-
): PendingUndo | null {
|
|
718
|
+
private writeStyleEntry(id: string, prop: string, value: string): boolean {
|
|
709
719
|
const n = this.snapshot().nodes.get(id);
|
|
710
|
-
if (!n) return
|
|
711
|
-
const prevRaw =
|
|
712
|
-
priorInlineOverride !== undefined ? priorInlineOverride : styleProp(n.el.style, prop);
|
|
713
|
-
const prevInline = prevRaw == null ? '' : String(prevRaw);
|
|
714
|
-
const existingEntry = this.doc[id];
|
|
715
|
-
const hadOverlayEntry = existingEntry ? Object.hasOwn(existingEntry, prop) : false;
|
|
716
|
-
const prevOverlayValue = existingEntry?.[prop];
|
|
720
|
+
if (!n) return false;
|
|
717
721
|
|
|
718
722
|
this.applyStyleToElement(n.el, prop, value);
|
|
719
723
|
this.recordOverlayEntry(id, prop, value);
|
|
720
724
|
this.dirty = true;
|
|
721
725
|
this.store.notifyIngestEdit();
|
|
722
726
|
|
|
723
|
-
return
|
|
724
|
-
undo: () => {
|
|
725
|
-
// Re-resolve rather than cache the element ref — the DOM is live and
|
|
726
|
-
// may have re-rendered since this entry was pushed (same discipline
|
|
727
|
-
// as `ReactWorldAuthoringAdapter.applyStyleWrite`).
|
|
728
|
-
const cur = this.snapshot().nodes.get(id);
|
|
729
|
-
if (cur) this.applyStyleToElement(cur.el, prop, prevInline);
|
|
730
|
-
if (hadOverlayEntry) this.recordOverlayEntry(id, prop, prevOverlayValue!);
|
|
731
|
-
else this.removeOverlayEntry(id, prop);
|
|
732
|
-
this.store.notifyIngestEdit();
|
|
733
|
-
},
|
|
734
|
-
redo: () => {
|
|
735
|
-
const cur = this.snapshot().nodes.get(id);
|
|
736
|
-
if (cur) this.applyStyleToElement(cur.el, prop, value);
|
|
737
|
-
this.recordOverlayEntry(id, prop, value);
|
|
738
|
-
this.store.notifyIngestEdit();
|
|
739
|
-
},
|
|
740
|
-
};
|
|
727
|
+
return true;
|
|
741
728
|
}
|
|
742
729
|
|
|
743
730
|
/**
|
|
744
731
|
* D-K2: mutate the live element's inline style AND the overlay document,
|
|
745
|
-
*
|
|
746
|
-
* prior inline value and the prior overlay-entry state (present, absent,
|
|
747
|
-
* or a different value) — never just one half (AC-K6).
|
|
732
|
+
* then journal the complete overlay state as one session transaction.
|
|
748
733
|
*/
|
|
749
734
|
private writeStyle(id: string, prop: string, value: string): void {
|
|
750
|
-
|
|
751
|
-
|
|
735
|
+
this.historyResource?.assertCanMutate();
|
|
736
|
+
const before = this.captureHistoryState();
|
|
737
|
+
if (!this.writeStyleEntry(id, prop, value)) return;
|
|
738
|
+
if (this.historyResource) {
|
|
739
|
+
void this.historyResource
|
|
740
|
+
.record(`Set ${prop}`, before, this.captureHistoryState())
|
|
741
|
+
.catch(() => {});
|
|
742
|
+
}
|
|
752
743
|
}
|
|
753
744
|
|
|
754
|
-
|
|
755
|
-
this.
|
|
756
|
-
this.redoStack.length = 0;
|
|
757
|
-
notifyUndoableOp(this);
|
|
745
|
+
dispose(): void {
|
|
746
|
+
this.historyResource?.dispose();
|
|
758
747
|
}
|
|
759
748
|
|
|
760
|
-
|
|
761
|
-
const
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
749
|
+
private captureHistoryState(): ReactDomHistoryState {
|
|
750
|
+
const styles: ReactDomHistoryState['styles'] = {};
|
|
751
|
+
for (const [id, node] of this.snapshot().nodes) {
|
|
752
|
+
const values: Record<string, string> = {};
|
|
753
|
+
for (const { prop } of STYLE_PROPERTIES) {
|
|
754
|
+
const value = styleProp(node.el.style, prop);
|
|
755
|
+
if (value !== '') values[prop] = String(value);
|
|
756
|
+
}
|
|
757
|
+
styles[id] = values;
|
|
758
|
+
}
|
|
759
|
+
return { overlay: structuredClone(this.doc), styles };
|
|
766
760
|
}
|
|
767
761
|
|
|
768
|
-
|
|
769
|
-
const
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
762
|
+
private restoreHistoryState(state: ReactDomHistoryState): void {
|
|
763
|
+
for (const key of Object.keys(this.doc)) delete this.doc[key];
|
|
764
|
+
Object.assign(this.doc, structuredClone(state.overlay));
|
|
765
|
+
const { nodes } = this.snapshot();
|
|
766
|
+
for (const [id, node] of nodes) {
|
|
767
|
+
const values = state.styles[id] ?? {};
|
|
768
|
+
for (const { prop } of STYLE_PROPERTIES) {
|
|
769
|
+
this.applyStyleToElement(node.el, prop, values[prop] ?? '');
|
|
770
|
+
}
|
|
771
|
+
}
|
|
772
|
+
this.dirty = true;
|
|
773
|
+
this.store.notifyIngestEdit();
|
|
774
774
|
}
|
|
775
775
|
|
|
776
776
|
subscribe(listener: () => void): () => void {
|