@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
|
@@ -6,12 +6,11 @@
|
|
|
6
6
|
* format-neutral authoring contract so it works over ANY DOM-capable world
|
|
7
7
|
* (react `data-oid`, ingested `react-dom`), not just the scene-UI silo.
|
|
8
8
|
*
|
|
9
|
-
* MOUNT SITE / COORDINATES (critical
|
|
10
|
-
*
|
|
11
|
-
* `
|
|
12
|
-
*
|
|
13
|
-
* `
|
|
14
|
-
* `container.appendChild(layer)`). This component's own outer wrapper is
|
|
9
|
+
* MOUNT SITE / COORDINATES (critical): DOM worlds render this component as a
|
|
10
|
+
* child of their world document's host — the EXACT SAME DOM element
|
|
11
|
+
* `design-time-layers.ts` appends that world's `position:absolute; inset:0`
|
|
12
|
+
* layer into. The native Three scene retains a separate instance in
|
|
13
|
+
* `ViewportPanel`. This component's own outer wrapper is
|
|
15
14
|
* ALSO `position:absolute; inset:0` inside that SAME parent, so its
|
|
16
15
|
* `getBoundingClientRect()` is IDENTICAL to every world layer's — a
|
|
17
16
|
* HOST-RELATIVE rect from `RectProvider.rect(id)` (host = the owning
|
|
@@ -87,13 +86,14 @@ import {
|
|
|
87
86
|
subscribeWorldPan,
|
|
88
87
|
} from '../authoring/world-pan-state';
|
|
89
88
|
import { isWorldHidden } from '../authoring/world-session-state';
|
|
89
|
+
import { themeVars } from '../design-system';
|
|
90
90
|
import { useEditorStore } from '../EditorContext';
|
|
91
91
|
import { isIngestActive } from '../ingest-mode';
|
|
92
92
|
import { isModuleModeActive } from '../module-mode';
|
|
93
93
|
import { isPlayModeActive } from '../play-mode';
|
|
94
94
|
import { effectiveColorFromChain } from '../ui-source/inspect';
|
|
95
|
+
import { zIndex } from '../z-index';
|
|
95
96
|
import { AlignToolbar } from './AlignToolbar';
|
|
96
|
-
import { WorldContextMenu, type WorldContextMenuState } from './WorldContextMenu';
|
|
97
97
|
import { WorldTextEditor } from './WorldTextEditor';
|
|
98
98
|
import {
|
|
99
99
|
type AlignEntry,
|
|
@@ -138,14 +138,19 @@ import {
|
|
|
138
138
|
|
|
139
139
|
export { rectForId } from './world-overlay-gestures';
|
|
140
140
|
|
|
141
|
+
// ACCENT ('#0d99ff') is a third independent "selection blue" alongside the
|
|
142
|
+
// toolbar's themeVars.accent.default (`#579EFF`) and the marquee/drop-overlay's same themeVars.accent.default
|
|
143
|
+
// (EDITOR-STYLE-AUDIT.md V-19) — flagged OUT-OF-SCOPE to change without a
|
|
144
|
+
// mixed-world (React/Pixi) test project to verify against; left as-is.
|
|
141
145
|
const ACCENT = '#0d99ff';
|
|
142
|
-
/** Strictly below `
|
|
143
|
-
*
|
|
144
|
-
*
|
|
146
|
+
/** Strictly below `ToolStrip`+`ViewportOverlay`'s z1000 — mirrors
|
|
147
|
+
* `design-time-layers.ts`'s own `BASE_Z_INDEX` doc comment ("so canvas-local
|
|
148
|
+
* editing chrome is never occluded") — and strictly
|
|
145
149
|
* above the design-time layers themselves (`BASE_Z_INDEX + i`, small N),
|
|
146
150
|
* so this overlay's boxes/marquee always paint over the world content they
|
|
147
|
-
* describe.
|
|
148
|
-
|
|
151
|
+
* describe. V-12 — pure rename onto the canonical z-index scale
|
|
152
|
+
* (`zIndex.overlayLow`), same numeric value (50), no behavior change. */
|
|
153
|
+
const Z_INDEX = zIndex.overlayLow;
|
|
149
154
|
const DRAG_THRESHOLD_PX = 5;
|
|
150
155
|
|
|
151
156
|
interface Rect {
|
|
@@ -184,7 +189,7 @@ export function hasRectCapableChild(adapter: AuthoringAdapter): boolean {
|
|
|
184
189
|
* for a composite, from each VISIBLE child's own `rects` provider — the
|
|
185
190
|
* marquee's candidate pool. Walks each CHILD's OWN hierarchy
|
|
186
191
|
* (`collectAllNodeIds`), never the composite's synthetic `world:<id>`
|
|
187
|
-
* wrapper, so a group/
|
|
192
|
+
* wrapper, so a group/organization id is never a candidate. A session-hidden
|
|
188
193
|
* world (`world-session-state.ts`'s eye toggle, B1) contributes no
|
|
189
194
|
* candidates — consistent with it being invisible/unpickable.
|
|
190
195
|
*
|
|
@@ -314,7 +319,7 @@ function labelStyle(r: DOMRectLike): React.CSSProperties {
|
|
|
314
319
|
|
|
315
320
|
const HANDLE_SIZE = 10;
|
|
316
321
|
|
|
317
|
-
/** One of the 8 B2 resize handles — a small white/accent square centered on
|
|
322
|
+
/** One of the 8 B2 resize handles — a small white/themeVars.accent.default square centered on
|
|
318
323
|
* its position on the selection rect (spec:317/§5 :465). */
|
|
319
324
|
function handleStyle(center: { x: number; y: number }, cursor: string): React.CSSProperties {
|
|
320
325
|
return {
|
|
@@ -371,6 +376,12 @@ function dimensionLabelStyle(rect: DOMRectLike): React.CSSProperties {
|
|
|
371
376
|
};
|
|
372
377
|
}
|
|
373
378
|
|
|
379
|
+
// Deliberate literals (U6 census): the padding/margin band pair, their label
|
|
380
|
+
// inks, the measurement pinks (`#ff2d92`/`#ff5fa2`) and the snap-guide red
|
|
381
|
+
// (`#f24822`) below are the industry-convention CANVAS-GUIDE language (green
|
|
382
|
+
// padding / orange margin / pink measure / red snap — Figma & devtools
|
|
383
|
+
// grammar), each deliberately distinct from the chrome tokens AND from the
|
|
384
|
+
// #0d99ff canvas-selection pair so guides never read as selection or chrome.
|
|
374
385
|
const PADDING_BAND_COLOR = 'rgba(46, 204, 113, 0.25)';
|
|
375
386
|
const MARGIN_BAND_COLOR = 'rgba(230, 126, 34, 0.25)';
|
|
376
387
|
|
|
@@ -905,8 +916,6 @@ export function WorldSelectionOverlay(): React.ReactNode {
|
|
|
905
916
|
[],
|
|
906
917
|
);
|
|
907
918
|
|
|
908
|
-
// D3.a — the open canvas right-click context menu, or `null`.
|
|
909
|
-
const [contextMenu, setContextMenu] = useState<WorldContextMenuState | null>(null);
|
|
910
919
|
// D3.b — the currently-open inline text editor (double-clicked node), or
|
|
911
920
|
// `null`. `textEditRef` mirrors the state for synchronous reads from
|
|
912
921
|
// callbacks (same "ref mirrors state" convention `marqueeRef`/`setMarquee`
|
|
@@ -936,7 +945,7 @@ export function WorldSelectionOverlay(): React.ReactNode {
|
|
|
936
945
|
// commit, so whether it landed or was refused can only be learned from a
|
|
937
946
|
// LATER re-render. Stash the committed id+rect here the instant `commitTextEdit`
|
|
938
947
|
// fires; the effect below consumes it on the next store notify (`editText`
|
|
939
|
-
// calls `store.notifyIngestEdit()` unconditionally on both the success and the
|
|
948
|
+
// calls `store.notifyIngestEdit()` unconditionally on both the themeVars.semantic.success and the
|
|
940
949
|
// refusal path) and checks `text.get` — which reports `null` for a refused id
|
|
941
950
|
// (via the adapter's own `dynamicPaths` mark) — to decide whether to surface
|
|
942
951
|
// the refused indicator instead of letting the edit silently vanish.
|
|
@@ -1010,10 +1019,16 @@ export function WorldSelectionOverlay(): React.ReactNode {
|
|
|
1010
1019
|
setMarqueeState(r);
|
|
1011
1020
|
}, []);
|
|
1012
1021
|
|
|
1013
|
-
const toHostLocal = useCallback(
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1022
|
+
const toHostLocal = useCallback(
|
|
1023
|
+
(clientX: number, clientY: number): { x: number; y: number } => {
|
|
1024
|
+
const host = interactionRef.current?.getBoundingClientRect();
|
|
1025
|
+
return {
|
|
1026
|
+
x: (clientX - (host?.left ?? 0)) / pan.zoom,
|
|
1027
|
+
y: (clientY - (host?.top ?? 0)) / pan.zoom,
|
|
1028
|
+
};
|
|
1029
|
+
},
|
|
1030
|
+
[pan.zoom],
|
|
1031
|
+
);
|
|
1017
1032
|
|
|
1018
1033
|
const bumpGesture = useCallback(() => setGestureTick((t) => t + 1), []);
|
|
1019
1034
|
|
|
@@ -1205,7 +1220,7 @@ export function WorldSelectionOverlay(): React.ReactNode {
|
|
|
1205
1220
|
// literal key-HOLD state in this codebase). Matches `hotkeys.ts`'s own
|
|
1206
1221
|
// not-typing guard exactly (input/textarea/select/contentEditable) so Space
|
|
1207
1222
|
// still types a literal space character in any of those, never arming pan.
|
|
1208
|
-
// A focused `<
|
|
1223
|
+
// A focused `<Button>` is ALSO excluded so Space keeps its native
|
|
1209
1224
|
// accessible "activate the focused control" behavior instead of arming pan
|
|
1210
1225
|
// out from under it. `e.repeat` is ignored so an OS key-repeat storm is a
|
|
1211
1226
|
// single no-op transition, not thousands of redundant `preventDefault`s.
|
|
@@ -1249,6 +1264,12 @@ export function WorldSelectionOverlay(): React.ReactNode {
|
|
|
1249
1264
|
const onPointerDown = useCallback(
|
|
1250
1265
|
(e: ReactPointerEvent<HTMLDivElement>) => {
|
|
1251
1266
|
if (e.button !== 0) return;
|
|
1267
|
+
// Camera navigation is bound to the viewport container so right/middle
|
|
1268
|
+
// drags can pass through this DOM overlay. Keep left-button authoring
|
|
1269
|
+
// gestures owned here: OrbitControls captures every pointer it sees,
|
|
1270
|
+
// including left clicks, which would otherwise retarget pointerup to
|
|
1271
|
+
// the container before this overlay can finish selection/marquee/edit.
|
|
1272
|
+
e.stopPropagation();
|
|
1252
1273
|
// D4 (spec27 §8 "space-pan" row) — a press while Space is held ARMS a
|
|
1253
1274
|
// pan-drag instead of the ordinary pick/select/marquee/eyedropper flow
|
|
1254
1275
|
// below, which it skips entirely (never fights another gesture for the
|
|
@@ -1489,23 +1510,6 @@ export function WorldSelectionOverlay(): React.ReactNode {
|
|
|
1489
1510
|
setHoverId(null);
|
|
1490
1511
|
}, []);
|
|
1491
1512
|
|
|
1492
|
-
// D3.a — right-click picks the node (rule zero: through `pickTopmost`, the
|
|
1493
|
-
// SAME primitive A3's click-select uses — never `elementFromPoint`) and
|
|
1494
|
-
// opens the canvas context menu at the click point. A miss (empty space)
|
|
1495
|
-
// opens nothing.
|
|
1496
|
-
const onContextMenu = useCallback(
|
|
1497
|
-
(e: ReactMouseEvent<HTMLDivElement>) => {
|
|
1498
|
-
e.preventDefault();
|
|
1499
|
-
const hitId = pickTopmost(store, e.clientX, e.clientY);
|
|
1500
|
-
if (!hitId) {
|
|
1501
|
-
setContextMenu(null);
|
|
1502
|
-
return;
|
|
1503
|
-
}
|
|
1504
|
-
setContextMenu({ x: e.clientX, y: e.clientY, nodeId: hitId });
|
|
1505
|
-
},
|
|
1506
|
-
[store],
|
|
1507
|
-
);
|
|
1508
|
-
|
|
1509
1513
|
// D3.b — double-click picks the node and opens the inline text editor
|
|
1510
1514
|
// through `adapter.text` (owner-routed — `textForId`), rule zero: no DOM
|
|
1511
1515
|
// read of the node's own text happens here, only the contract's own
|
|
@@ -1619,7 +1623,7 @@ export function WorldSelectionOverlay(): React.ReactNode {
|
|
|
1619
1623
|
const alignEntries = computeMultiSelectionAlign(adapter, selectedIds);
|
|
1620
1624
|
|
|
1621
1625
|
// D3.c — every currently-empty container hint reachable from the active
|
|
1622
|
-
// adapter (owner-routed per child, session-hidden
|
|
1626
|
+
// adapter (owner-routed per child, session-hidden roots excluded — see
|
|
1623
1627
|
// `emptyContainerHintsFor`'s doc comment). Cached (see `emptyHintsCacheRef`
|
|
1624
1628
|
// above) so a hover-only re-render reuses the last computed hints instead
|
|
1625
1629
|
// of re-walking + re-measuring the whole tree.
|
|
@@ -1651,6 +1655,7 @@ export function WorldSelectionOverlay(): React.ReactNode {
|
|
|
1651
1655
|
// unit with the world content it describes — `undefined` at rest
|
|
1652
1656
|
// (pan=0,0) keeps this byte-identical to pre-pan markup.
|
|
1653
1657
|
transform: panTransformValue(pan),
|
|
1658
|
+
transformOrigin: '0 0',
|
|
1654
1659
|
}}
|
|
1655
1660
|
>
|
|
1656
1661
|
<div
|
|
@@ -1662,12 +1667,11 @@ export function WorldSelectionOverlay(): React.ReactNode {
|
|
|
1662
1667
|
pointerEvents: 'auto',
|
|
1663
1668
|
cursor: interactionCursor(isPanning, spaceHeld, eyedropperActive, !!marquee),
|
|
1664
1669
|
}}
|
|
1665
|
-
|
|
1670
|
+
onPointerDownCapture={onPointerDown}
|
|
1666
1671
|
onPointerMove={onPointerMove}
|
|
1667
1672
|
onPointerUp={onPointerUp}
|
|
1668
1673
|
onPointerCancel={onPointerCancel}
|
|
1669
1674
|
onPointerLeave={onPointerLeave}
|
|
1670
|
-
onContextMenu={onContextMenu}
|
|
1671
1675
|
onDoubleClick={onDoubleClick}
|
|
1672
1676
|
/>
|
|
1673
1677
|
{/* D3.c — dashed empty-container placeholders, visual hints only. */}
|
|
@@ -1683,6 +1687,7 @@ export function WorldSelectionOverlay(): React.ReactNode {
|
|
|
1683
1687
|
top: hint.rect.y,
|
|
1684
1688
|
width: hint.rect.width,
|
|
1685
1689
|
height: hint.rect.height,
|
|
1690
|
+
// text-2 at 0.7 alpha — a quiet non-interactive hint outline.
|
|
1686
1691
|
border: '1px dashed rgba(154, 160, 166, 0.7)',
|
|
1687
1692
|
boxSizing: 'border-box',
|
|
1688
1693
|
pointerEvents: 'none',
|
|
@@ -1783,9 +1788,6 @@ export function WorldSelectionOverlay(): React.ReactNode {
|
|
|
1783
1788
|
</>
|
|
1784
1789
|
)}
|
|
1785
1790
|
<D3Affordances
|
|
1786
|
-
adapter={adapter}
|
|
1787
|
-
contextMenu={contextMenu}
|
|
1788
|
-
onCloseContextMenu={() => setContextMenu(null)}
|
|
1789
1791
|
textEdit={textEdit}
|
|
1790
1792
|
onCommitTextEdit={commitTextEdit}
|
|
1791
1793
|
onCancelTextEdit={cancelTextEdit}
|
|
@@ -1898,17 +1900,14 @@ function D2Affordances(props: {
|
|
|
1898
1900
|
}
|
|
1899
1901
|
|
|
1900
1902
|
/**
|
|
1901
|
-
* D3Affordances — the D3.
|
|
1902
|
-
*
|
|
1903
|
+
* D3Affordances — the D3.b/d overlay bits (inline text editor + its refusal
|
|
1904
|
+
* indicator, eyedropper swatch), factored into its OWN
|
|
1903
1905
|
* component purely to keep `WorldSelectionOverlay`'s own cognitive
|
|
1904
1906
|
* complexity down (each is an independent, mutually-exclusive-in-practice
|
|
1905
1907
|
* conditional render — bundling them here costs the PARENT nothing beyond
|
|
1906
1908
|
* one element reference). No behavior change from having them inline.
|
|
1907
1909
|
*/
|
|
1908
1910
|
function D3Affordances(props: {
|
|
1909
|
-
adapter: AuthoringAdapter;
|
|
1910
|
-
contextMenu: WorldContextMenuState | null;
|
|
1911
|
-
onCloseContextMenu: () => void;
|
|
1912
1911
|
textEdit: { id: string; rect: DOMRectLike; initialText: string } | null;
|
|
1913
1912
|
onCommitTextEdit: (text: string) => void;
|
|
1914
1913
|
onCancelTextEdit: () => void;
|
|
@@ -1917,9 +1916,6 @@ function D3Affordances(props: {
|
|
|
1917
1916
|
eyedropperPreview: { x: number; y: number; color: string | null } | null;
|
|
1918
1917
|
}): React.ReactNode {
|
|
1919
1918
|
const {
|
|
1920
|
-
adapter,
|
|
1921
|
-
contextMenu,
|
|
1922
|
-
onCloseContextMenu,
|
|
1923
1919
|
textEdit,
|
|
1924
1920
|
onCommitTextEdit,
|
|
1925
1921
|
onCancelTextEdit,
|
|
@@ -1929,14 +1925,6 @@ function D3Affordances(props: {
|
|
|
1929
1925
|
} = props;
|
|
1930
1926
|
return (
|
|
1931
1927
|
<>
|
|
1932
|
-
{/* D3.a — canvas right-click context menu. `WorldContextMenu` portals
|
|
1933
|
-
itself to `document.body` (pan-seam fix — see its own doc comment),
|
|
1934
|
-
so unlike the other D3 affordances below it needs no
|
|
1935
|
-
`pointerEvents: 'auto'` wrapper here: it never actually mounts as a
|
|
1936
|
-
DOM descendant of this (`pointerEvents: 'none'`) overlay tree. */}
|
|
1937
|
-
{contextMenu && (
|
|
1938
|
-
<WorldContextMenu adapter={adapter} state={contextMenu} onClose={onCloseContextMenu} />
|
|
1939
|
-
)}
|
|
1940
1928
|
{/* D3.b — the inline text editor (double-click), or the loud "not
|
|
1941
1929
|
editable" refusal indicator for a dynamic/child-bearing body. */}
|
|
1942
1930
|
{textEdit && (
|
|
@@ -1959,9 +1947,9 @@ function D3Affordances(props: {
|
|
|
1959
1947
|
top: textEditRefused.rect.y,
|
|
1960
1948
|
width: Math.max(textEditRefused.rect.width, 40),
|
|
1961
1949
|
height: Math.max(textEditRefused.rect.height, 20),
|
|
1962
|
-
border:
|
|
1950
|
+
border: `2px dashed ${themeVars.semantic.danger}`,
|
|
1963
1951
|
boxSizing: 'border-box',
|
|
1964
|
-
background:
|
|
1952
|
+
background: themeVars.semantic.dangerMuted,
|
|
1965
1953
|
pointerEvents: 'none',
|
|
1966
1954
|
}}
|
|
1967
1955
|
/>
|
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
* reach of its own.
|
|
10
10
|
*/
|
|
11
11
|
import { useEffect, useRef, useState } from 'react';
|
|
12
|
+
import { themeVars } from '../design-system';
|
|
13
|
+
import { zIndex } from '../z-index';
|
|
12
14
|
|
|
13
15
|
export interface WorldTextEditorProps {
|
|
14
16
|
rect: { x: number; y: number; width: number; height: number };
|
|
@@ -69,17 +71,19 @@ export function WorldTextEditor({
|
|
|
69
71
|
width: Math.max(rect.width, 40),
|
|
70
72
|
height: Math.max(rect.height, 20),
|
|
71
73
|
boxSizing: 'border-box',
|
|
72
|
-
zIndex:
|
|
74
|
+
zIndex: zIndex.overlayLow,
|
|
73
75
|
pointerEvents: 'auto',
|
|
74
76
|
resize: 'none',
|
|
75
77
|
font: 'inherit',
|
|
76
|
-
fontSize:
|
|
78
|
+
fontSize: 'var(--vgai-font-lg)',
|
|
77
79
|
lineHeight: 1.3,
|
|
78
80
|
padding: 2,
|
|
79
|
-
|
|
81
|
+
// D-8: dark input convention (was a bright white light-mode box over
|
|
82
|
+
// the all-dark app) + D-4: the canonical themeVars.accent.default, not one-off #0d99ff.
|
|
83
|
+
border: `2px solid ${themeVars.accent.default}`,
|
|
80
84
|
outline: 'none',
|
|
81
|
-
background:
|
|
82
|
-
color:
|
|
85
|
+
background: themeVars.surface.inset,
|
|
86
|
+
color: themeVars.content.primary,
|
|
83
87
|
}}
|
|
84
88
|
/>
|
|
85
89
|
);
|