@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
|
@@ -24,11 +24,13 @@ const EMBED_ID = 'embed:root';
|
|
|
24
24
|
export function makeEmbedOnlyAdapter(store: EditorStore, label: string): AuthoringAdapter {
|
|
25
25
|
const node: EditorNode = {
|
|
26
26
|
id: EMBED_ID,
|
|
27
|
-
label
|
|
27
|
+
label,
|
|
28
|
+
secondaryLabel: 'Embed only',
|
|
29
|
+
role: 'boundary',
|
|
28
30
|
kind: 'object',
|
|
29
31
|
parentId: null,
|
|
30
32
|
childIds: [],
|
|
31
|
-
flags: { runtimeOnly: true, locked: true },
|
|
33
|
+
flags: { runtimeOnly: true, locked: true, readOnly: true },
|
|
32
34
|
};
|
|
33
35
|
const hierarchy: HierarchyProvider = {
|
|
34
36
|
roots: () => [node],
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
*/
|
|
19
19
|
|
|
20
20
|
import { resolveUrl } from '@engine/loader';
|
|
21
|
+
import { themeVars } from '../design-system';
|
|
21
22
|
import { registerHierarchyMenuItems } from '../hierarchy-menu-registry';
|
|
22
23
|
|
|
23
24
|
// Prefab Unpack/Open/Save-as — not yet contract-expressible (StructureProvider
|
|
@@ -48,7 +49,9 @@ registerHierarchyMenuItems(
|
|
|
48
49
|
},
|
|
49
50
|
{
|
|
50
51
|
label: 'Open Prefab',
|
|
51
|
-
|
|
52
|
+
// L-9 — was `#60a5fa`, a one-off blue that clashed with the app's real
|
|
53
|
+
// accent (`#579EFF`) rendered right beside it (Rename/Duplicate/Delete).
|
|
54
|
+
color: themeVars.accent.default,
|
|
52
55
|
action: () => {
|
|
53
56
|
window.dispatchEvent(
|
|
54
57
|
new CustomEvent('editor:open-asset', { detail: { path: prefabPath } }),
|
|
@@ -60,7 +63,9 @@ registerHierarchyMenuItems(
|
|
|
60
63
|
return [
|
|
61
64
|
{
|
|
62
65
|
label: 'Save as Prefab...',
|
|
63
|
-
|
|
66
|
+
// L-9 — was `#60a5fa`, a one-off blue that clashed with the app's real
|
|
67
|
+
// accent (`#579EFF`) rendered right beside it (Rename/Duplicate/Delete).
|
|
68
|
+
color: themeVars.accent.default,
|
|
64
69
|
action: () => {
|
|
65
70
|
window.dispatchEvent(
|
|
66
71
|
new CustomEvent('editor:save-as-prefab', {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Select } from '../../design-system';
|
|
1
2
|
/**
|
|
2
3
|
* First-party "+ Add Section…" menu (C2, docs/unified-world-editor/26-
|
|
3
4
|
* unified-editor-spec.md §4 C2) — verbatim from the deleted
|
|
@@ -76,7 +77,7 @@ export function AddSectionMenu({ entities, ids }: SectionProps) {
|
|
|
76
77
|
|
|
77
78
|
return (
|
|
78
79
|
<div style={{ padding: '6px 8px' }}>
|
|
79
|
-
<
|
|
80
|
+
<Select
|
|
80
81
|
onChange={(e) => {
|
|
81
82
|
const item = available.find((i) => i.label === e.target.value);
|
|
82
83
|
if (item) {
|
|
@@ -93,16 +94,8 @@ export function AddSectionMenu({ entities, ids }: SectionProps) {
|
|
|
93
94
|
e.target.value = '';
|
|
94
95
|
}}
|
|
95
96
|
value=""
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
background: '#333',
|
|
99
|
-
color: '#c5c8ce',
|
|
100
|
-
border: '1px solid #444',
|
|
101
|
-
borderRadius: 3,
|
|
102
|
-
fontSize: 11,
|
|
103
|
-
padding: '3px 4px',
|
|
104
|
-
cursor: 'pointer',
|
|
105
|
-
}}
|
|
97
|
+
className="vgai-select"
|
|
98
|
+
style={{ width: '100%' }}
|
|
106
99
|
>
|
|
107
100
|
<option value="" disabled>
|
|
108
101
|
+ Add Section...
|
|
@@ -112,7 +105,7 @@ export function AddSectionMenu({ entities, ids }: SectionProps) {
|
|
|
112
105
|
{item.label}
|
|
113
106
|
</option>
|
|
114
107
|
))}
|
|
115
|
-
</
|
|
108
|
+
</Select>
|
|
116
109
|
</div>
|
|
117
110
|
);
|
|
118
111
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Button, Select, TextInput } from '../../design-system';
|
|
1
2
|
/**
|
|
2
3
|
* First-party scene Environment inspector (C2, docs/unified-world-editor/
|
|
3
4
|
* 26-unified-editor-spec.md §4 C2) — the deselect-state panel: Scene name/
|
|
@@ -18,30 +19,17 @@ import type {
|
|
|
18
19
|
ScenePhysicsSettings,
|
|
19
20
|
SceneToneMapping,
|
|
20
21
|
} from '@engine/scene/scene-types';
|
|
22
|
+
import { fieldLabelStyle } from '../../components/inspector-widgets/shared';
|
|
21
23
|
import { PostProcessingSection } from '../../components/inspectors/PostProcessingSection';
|
|
22
24
|
import { RenderingSection } from '../../components/inspectors/RenderingSection';
|
|
23
|
-
import { ColorInput } from '../../
|
|
24
|
-
import { NumberInput } from '../../components/primitives/NumberInput';
|
|
25
|
-
import { SectionHeader } from '../../components/primitives/SectionHeader';
|
|
25
|
+
import { ColorInput, NumberInput, SectionHeader, themeVars } from '../../design-system';
|
|
26
26
|
import { useEditorStore } from '../../EditorContext';
|
|
27
27
|
import type { EditorStore } from '../../editor-store';
|
|
28
28
|
import type { InspectorSectionProps } from '../../inspector-section-registry';
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
background: '#333',
|
|
32
|
-
color: '#c5c8ce',
|
|
33
|
-
border: '1px solid #444',
|
|
34
|
-
borderRadius: 3,
|
|
35
|
-
padding: '3px 8px',
|
|
36
|
-
cursor: 'pointer',
|
|
37
|
-
fontSize: 11,
|
|
38
|
-
};
|
|
30
|
+
// Shared chrome button (I-8/I-10) — the old per-file literal.
|
|
39
31
|
|
|
40
|
-
const labelStyle: React.CSSProperties =
|
|
41
|
-
fontSize: 11,
|
|
42
|
-
color: '#8c8c8c',
|
|
43
|
-
marginBottom: 2,
|
|
44
|
-
};
|
|
32
|
+
const labelStyle: React.CSSProperties = fieldLabelStyle;
|
|
45
33
|
|
|
46
34
|
const fogTypes = ['linear', 'exponential'] as const;
|
|
47
35
|
|
|
@@ -55,20 +43,18 @@ export function EnvironmentSection(_props: InspectorSectionProps) {
|
|
|
55
43
|
<div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>
|
|
56
44
|
<div>
|
|
57
45
|
<div style={labelStyle}>Name</div>
|
|
58
|
-
<
|
|
46
|
+
<TextInput
|
|
59
47
|
value={store.sceneName}
|
|
48
|
+
onFocus={() => store.beginInteractiveEdit('Rename Scene')}
|
|
60
49
|
onChange={(e) => {
|
|
61
50
|
store.setSceneName(e.target.value);
|
|
62
51
|
}}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
border: '1px solid #333',
|
|
67
|
-
borderRadius: 2,
|
|
68
|
-
color: '#c5c8ce',
|
|
69
|
-
fontSize: 12,
|
|
70
|
-
padding: '3px 6px',
|
|
52
|
+
onBlur={() => store.endInteractiveEdit()}
|
|
53
|
+
onKeyDown={(e) => {
|
|
54
|
+
if (e.key === 'Enter') e.currentTarget.blur();
|
|
71
55
|
}}
|
|
56
|
+
className="vgai-input"
|
|
57
|
+
style={{ width: '100%' }}
|
|
72
58
|
/>
|
|
73
59
|
</div>
|
|
74
60
|
<div>
|
|
@@ -85,7 +71,7 @@ export function EnvironmentSection(_props: InspectorSectionProps) {
|
|
|
85
71
|
<div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>
|
|
86
72
|
<div>
|
|
87
73
|
<div style={labelStyle}>HDR / Image Path</div>
|
|
88
|
-
<
|
|
74
|
+
<TextInput
|
|
89
75
|
value={env.skybox ?? ''}
|
|
90
76
|
onChange={(e) => {
|
|
91
77
|
if (e.target.value) {
|
|
@@ -96,15 +82,8 @@ export function EnvironmentSection(_props: InspectorSectionProps) {
|
|
|
96
82
|
}
|
|
97
83
|
}}
|
|
98
84
|
placeholder="/assets/env/sky.hdr"
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
background: '#1e1e1e',
|
|
102
|
-
border: '1px solid #333',
|
|
103
|
-
borderRadius: 2,
|
|
104
|
-
color: '#c5c8ce',
|
|
105
|
-
fontSize: 12,
|
|
106
|
-
padding: '3px 6px',
|
|
107
|
-
}}
|
|
85
|
+
className="vgai-input"
|
|
86
|
+
style={{ width: '100%' }}
|
|
108
87
|
/>
|
|
109
88
|
</div>
|
|
110
89
|
<div>
|
|
@@ -116,16 +95,16 @@ export function EnvironmentSection(_props: InspectorSectionProps) {
|
|
|
116
95
|
/>
|
|
117
96
|
</div>
|
|
118
97
|
{env.skybox && (
|
|
119
|
-
<
|
|
98
|
+
<Button
|
|
120
99
|
type="button"
|
|
121
|
-
|
|
100
|
+
size="compact"
|
|
122
101
|
onClick={() => {
|
|
123
102
|
const { skybox: _s, envMapIntensity: _i, ...rest } = env;
|
|
124
103
|
store.setEnvironment(rest as SceneEnvironment);
|
|
125
104
|
}}
|
|
126
105
|
>
|
|
127
106
|
Remove Skybox
|
|
128
|
-
</
|
|
107
|
+
</Button>
|
|
129
108
|
)}
|
|
130
109
|
</div>
|
|
131
110
|
</SectionHeader>
|
|
@@ -162,7 +141,7 @@ export function EnvironmentSection(_props: InspectorSectionProps) {
|
|
|
162
141
|
<div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>
|
|
163
142
|
<div>
|
|
164
143
|
<div style={labelStyle}>Type</div>
|
|
165
|
-
<
|
|
144
|
+
<Select
|
|
166
145
|
value={env.fog?.type ?? 'linear'}
|
|
167
146
|
onChange={(e) =>
|
|
168
147
|
store.updateEnvironment({
|
|
@@ -173,22 +152,15 @@ export function EnvironmentSection(_props: InspectorSectionProps) {
|
|
|
173
152
|
},
|
|
174
153
|
})
|
|
175
154
|
}
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
background: '#1e1e1e',
|
|
179
|
-
border: '1px solid #333',
|
|
180
|
-
borderRadius: 2,
|
|
181
|
-
color: '#c5c8ce',
|
|
182
|
-
fontSize: 11,
|
|
183
|
-
padding: '2px 4px',
|
|
184
|
-
}}
|
|
155
|
+
className="vgai-select"
|
|
156
|
+
style={{ width: '100%' }}
|
|
185
157
|
>
|
|
186
158
|
{fogTypes.map((t) => (
|
|
187
159
|
<option key={t} value={t}>
|
|
188
160
|
{t}
|
|
189
161
|
</option>
|
|
190
162
|
))}
|
|
191
|
-
</
|
|
163
|
+
</Select>
|
|
192
164
|
</div>
|
|
193
165
|
<div>
|
|
194
166
|
<div style={labelStyle}>Color</div>
|
|
@@ -258,16 +230,16 @@ export function EnvironmentSection(_props: InspectorSectionProps) {
|
|
|
258
230
|
</div>
|
|
259
231
|
)}
|
|
260
232
|
{env.fog && (
|
|
261
|
-
<
|
|
233
|
+
<Button
|
|
262
234
|
type="button"
|
|
263
|
-
|
|
235
|
+
size="compact"
|
|
264
236
|
onClick={() => {
|
|
265
237
|
const { fog: _fog, ...rest } = env;
|
|
266
238
|
store.setEnvironment(rest as SceneEnvironment);
|
|
267
239
|
}}
|
|
268
240
|
>
|
|
269
241
|
Remove Fog
|
|
270
|
-
</
|
|
242
|
+
</Button>
|
|
271
243
|
)}
|
|
272
244
|
</div>
|
|
273
245
|
</SectionHeader>
|
|
@@ -276,7 +248,7 @@ export function EnvironmentSection(_props: InspectorSectionProps) {
|
|
|
276
248
|
<div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>
|
|
277
249
|
<div>
|
|
278
250
|
<div style={labelStyle}>Mode</div>
|
|
279
|
-
<
|
|
251
|
+
<Select
|
|
280
252
|
value={env.toneMapping?.mode ?? DEFAULTS.toneMapping.mode}
|
|
281
253
|
onChange={(e) =>
|
|
282
254
|
store.updateEnvironment({
|
|
@@ -286,22 +258,15 @@ export function EnvironmentSection(_props: InspectorSectionProps) {
|
|
|
286
258
|
},
|
|
287
259
|
})
|
|
288
260
|
}
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
background: '#1e1e1e',
|
|
292
|
-
border: '1px solid #333',
|
|
293
|
-
borderRadius: 2,
|
|
294
|
-
color: '#c5c8ce',
|
|
295
|
-
fontSize: 11,
|
|
296
|
-
padding: '2px 4px',
|
|
297
|
-
}}
|
|
261
|
+
className="vgai-select"
|
|
262
|
+
style={{ width: '100%' }}
|
|
298
263
|
>
|
|
299
264
|
{(['none', 'linear', 'reinhard', 'cineon', 'aces', 'agx'] as const).map((m) => (
|
|
300
265
|
<option key={m} value={m}>
|
|
301
266
|
{m}
|
|
302
267
|
</option>
|
|
303
268
|
))}
|
|
304
|
-
</
|
|
269
|
+
</Select>
|
|
305
270
|
</div>
|
|
306
271
|
<div>
|
|
307
272
|
<div style={labelStyle}>Exposure</div>
|
|
@@ -361,52 +326,29 @@ function CollisionLayerEditor({ store }: { store: EditorStore }) {
|
|
|
361
326
|
<div style={{ display: 'flex', flexDirection: 'column', gap: 4 }}>
|
|
362
327
|
{layers.map((name, i) => (
|
|
363
328
|
<div key={i} style={{ display: 'flex', alignItems: 'center', gap: 4 }}>
|
|
364
|
-
<span
|
|
365
|
-
|
|
329
|
+
<span
|
|
330
|
+
style={{ fontSize: 10, color: themeVars.content.muted, width: 16, textAlign: 'right' }}
|
|
331
|
+
>
|
|
332
|
+
{i}
|
|
333
|
+
</span>
|
|
334
|
+
<TextInput
|
|
335
|
+
className="vgai-input"
|
|
366
336
|
value={name}
|
|
367
337
|
onChange={(e) => renameLayer(i, e.target.value)}
|
|
368
|
-
style={{
|
|
369
|
-
flex: 1,
|
|
370
|
-
background: '#1e1e1e',
|
|
371
|
-
border: '1px solid #333',
|
|
372
|
-
borderRadius: 2,
|
|
373
|
-
color: '#c5c8ce',
|
|
374
|
-
fontSize: 11,
|
|
375
|
-
padding: '2px 4px',
|
|
376
|
-
}}
|
|
338
|
+
style={{ flex: 1 }}
|
|
377
339
|
/>
|
|
378
|
-
<button
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
style={{
|
|
382
|
-
background: 'none',
|
|
383
|
-
border: 'none',
|
|
384
|
-
color: '#666',
|
|
385
|
-
cursor: 'pointer',
|
|
386
|
-
fontSize: 11,
|
|
387
|
-
padding: '0 4px',
|
|
388
|
-
}}
|
|
389
|
-
>
|
|
390
|
-
x
|
|
391
|
-
</button>
|
|
340
|
+
<Button type="button" onClick={() => removeLayer(i)} variant="ghost" size="compact">
|
|
341
|
+
×
|
|
342
|
+
</Button>
|
|
392
343
|
</div>
|
|
393
344
|
))}
|
|
394
345
|
{layers.length < 16 && (
|
|
395
|
-
<button
|
|
396
|
-
type="button"
|
|
397
|
-
onClick={addLayer}
|
|
398
|
-
style={{
|
|
399
|
-
...btnStyle,
|
|
400
|
-
fontSize: 10,
|
|
401
|
-
padding: '2px 6px',
|
|
402
|
-
alignSelf: 'flex-start',
|
|
403
|
-
}}
|
|
404
|
-
>
|
|
346
|
+
<Button type="button" onClick={addLayer} style={{ alignSelf: 'flex-start' }}>
|
|
405
347
|
+ Add Layer
|
|
406
|
-
</
|
|
348
|
+
</Button>
|
|
407
349
|
)}
|
|
408
350
|
{layers.length === 0 && (
|
|
409
|
-
<div style={{ fontSize: 10, color:
|
|
351
|
+
<div style={{ fontSize: 10, color: themeVars.content.dim, fontStyle: 'italic' }}>
|
|
410
352
|
No collision layers defined. Add layers to enable per-entity collision filtering.
|
|
411
353
|
</div>
|
|
412
354
|
)}
|
|
@@ -507,41 +449,26 @@ function NavigationBakeSection({ store }: { store: EditorStore }) {
|
|
|
507
449
|
/>
|
|
508
450
|
</div>
|
|
509
451
|
<div style={{ display: 'flex', gap: 4, marginTop: 4 }}>
|
|
510
|
-
<
|
|
452
|
+
<Button
|
|
511
453
|
type="button"
|
|
454
|
+
variant={stale ? 'success' : 'primary'}
|
|
455
|
+
size="compact"
|
|
512
456
|
onClick={() => window.dispatchEvent(new CustomEvent('editor:bake-navmesh'))}
|
|
513
|
-
style={{
|
|
514
|
-
flex: 1,
|
|
515
|
-
background: stale ? '#3a5f1e' : '#333',
|
|
516
|
-
color: '#c5c8ce',
|
|
517
|
-
border: `1px solid ${stale ? '#5a8f2e' : '#444'}`,
|
|
518
|
-
borderRadius: 3,
|
|
519
|
-
padding: '4px 8px',
|
|
520
|
-
cursor: 'pointer',
|
|
521
|
-
fontSize: 11,
|
|
522
|
-
fontWeight: 600,
|
|
523
|
-
}}
|
|
457
|
+
style={{ flex: 1 }}
|
|
524
458
|
>
|
|
525
459
|
{stale ? 'Bake NavMesh *' : 'Bake NavMesh'}
|
|
526
|
-
</
|
|
527
|
-
<
|
|
460
|
+
</Button>
|
|
461
|
+
<Button
|
|
528
462
|
type="button"
|
|
463
|
+
variant="secondary"
|
|
464
|
+
size="compact"
|
|
529
465
|
onClick={() => window.dispatchEvent(new CustomEvent('editor:clear-navmesh'))}
|
|
530
|
-
style={{
|
|
531
|
-
background: '#333',
|
|
532
|
-
color: '#c5c8ce',
|
|
533
|
-
border: '1px solid #444',
|
|
534
|
-
borderRadius: 3,
|
|
535
|
-
padding: '4px 8px',
|
|
536
|
-
cursor: 'pointer',
|
|
537
|
-
fontSize: 11,
|
|
538
|
-
}}
|
|
539
466
|
>
|
|
540
467
|
Clear
|
|
541
|
-
</
|
|
468
|
+
</Button>
|
|
542
469
|
</div>
|
|
543
470
|
{stale && (
|
|
544
|
-
<div style={{ fontSize: 10, color:
|
|
471
|
+
<div style={{ fontSize: 10, color: themeVars.semantic.warning, marginTop: 2 }}>
|
|
545
472
|
Scene changed since last bake
|
|
546
473
|
</div>
|
|
547
474
|
)}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Button, TextInput } from '../../design-system';
|
|
1
2
|
/**
|
|
2
3
|
* First-party HeaderSection (C2, docs/unified-world-editor/26-unified-
|
|
3
4
|
* editor-spec.md §4 C2) — entity name field, multi-select header, prefab
|
|
@@ -13,25 +14,18 @@
|
|
|
13
14
|
|
|
14
15
|
import { resolveUrl } from '@engine/loader';
|
|
15
16
|
import { faXmark } from '@fortawesome/free-solid-svg-icons';
|
|
16
|
-
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
17
17
|
import { useEffect, useState } from 'react';
|
|
18
18
|
import { getActiveAuthoring } from '../../authoring/active-adapter';
|
|
19
19
|
import { resolveNameCommit } from '../../components/entity-name-commit';
|
|
20
|
+
import { popoverStyle } from '../../components/inspector-widgets/shared';
|
|
20
21
|
import type { SectionProps } from '../../components/inspectors/multi-edit-utils';
|
|
22
|
+
import { EditorIcon, themeVars } from '../../design-system';
|
|
21
23
|
import { useEditorStore } from '../../EditorContext';
|
|
22
24
|
import type { EditorStore } from '../../editor-store';
|
|
23
25
|
|
|
24
26
|
type Entity = SectionProps['entities'][number];
|
|
25
27
|
|
|
26
|
-
|
|
27
|
-
background: '#333',
|
|
28
|
-
color: '#c5c8ce',
|
|
29
|
-
border: '1px solid #444',
|
|
30
|
-
borderRadius: 3,
|
|
31
|
-
padding: '3px 8px',
|
|
32
|
-
cursor: 'pointer',
|
|
33
|
-
fontSize: 11,
|
|
34
|
-
};
|
|
28
|
+
// Shared compact chrome button (I-8/I-10) — the old per-file literal.
|
|
35
29
|
|
|
36
30
|
/**
|
|
37
31
|
* Entity name field — local draft state, commits (and thus pushes an undo
|
|
@@ -66,7 +60,7 @@ function EntityNameField({
|
|
|
66
60
|
};
|
|
67
61
|
|
|
68
62
|
return (
|
|
69
|
-
<
|
|
63
|
+
<TextInput
|
|
70
64
|
value={draft}
|
|
71
65
|
onChange={(e) => setDraft(e.target.value)}
|
|
72
66
|
onBlur={commit}
|
|
@@ -79,16 +73,8 @@ function EntityNameField({
|
|
|
79
73
|
(e.target as HTMLInputElement).blur();
|
|
80
74
|
}
|
|
81
75
|
}}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
background: '#1e1e1e',
|
|
85
|
-
color: '#c5c8ce',
|
|
86
|
-
border: '1px solid #333',
|
|
87
|
-
borderRadius: 2,
|
|
88
|
-
padding: '4px 6px',
|
|
89
|
-
fontSize: 13,
|
|
90
|
-
fontWeight: 600,
|
|
91
|
-
}}
|
|
76
|
+
className="vgai-input"
|
|
77
|
+
style={{ width: '100%', padding: '4px 6px', fontSize: 13, fontWeight: 600 }}
|
|
92
78
|
/>
|
|
93
79
|
);
|
|
94
80
|
}
|
|
@@ -102,15 +88,25 @@ export function HeaderSection({ entities, ids }: SectionProps) {
|
|
|
102
88
|
<>
|
|
103
89
|
{/* Entity name — single entity only */}
|
|
104
90
|
{!multi && (
|
|
105
|
-
<div style={{ padding: '8px', borderBottom:
|
|
91
|
+
<div style={{ padding: '8px', borderBottom: `1px solid ${themeVars.boundary.default}` }}>
|
|
106
92
|
<EntityNameField key={entity.id} store={store} entityId={entity.id!} name={entity.name} />
|
|
107
93
|
</div>
|
|
108
94
|
)}
|
|
109
95
|
|
|
110
96
|
{/* Multi-entity header */}
|
|
111
97
|
{multi && (
|
|
112
|
-
<div
|
|
113
|
-
|
|
98
|
+
<div
|
|
99
|
+
style={{
|
|
100
|
+
padding: '8px',
|
|
101
|
+
borderBottom: `1px solid ${themeVars.boundary.default}`,
|
|
102
|
+
// I-16: same info-banner band the prefab/material-ref banners use,
|
|
103
|
+
// so a multi-selection reads with real visual weight.
|
|
104
|
+
background: themeVars.accent.muted,
|
|
105
|
+
}}
|
|
106
|
+
>
|
|
107
|
+
<div style={{ fontWeight: 600, fontSize: 13, color: themeVars.content.primary }}>
|
|
108
|
+
{ids.length} entities selected
|
|
109
|
+
</div>
|
|
114
110
|
</div>
|
|
115
111
|
)}
|
|
116
112
|
|
|
@@ -119,18 +115,22 @@ export function HeaderSection({ entities, ids }: SectionProps) {
|
|
|
119
115
|
<div
|
|
120
116
|
style={{
|
|
121
117
|
padding: '6px 8px',
|
|
122
|
-
borderBottom:
|
|
123
|
-
|
|
118
|
+
borderBottom: `1px solid ${themeVars.boundary.default}`,
|
|
119
|
+
// Info-banner tint band — deliberate literal (no tinted-panel
|
|
120
|
+
// token slot); text/buttons reconciled onto text-1/themeVars.accent.default (I-5).
|
|
121
|
+
background: themeVars.accent.muted,
|
|
124
122
|
display: 'flex',
|
|
125
123
|
alignItems: 'center',
|
|
126
124
|
gap: 6,
|
|
127
125
|
}}
|
|
128
126
|
>
|
|
129
|
-
<span style={{ fontSize: 11, color:
|
|
127
|
+
<span style={{ fontSize: 11, color: themeVars.content.primary, fontWeight: 600 }}>
|
|
128
|
+
Prefab
|
|
129
|
+
</span>
|
|
130
130
|
<span
|
|
131
131
|
style={{
|
|
132
132
|
fontSize: 10,
|
|
133
|
-
color:
|
|
133
|
+
color: themeVars.accent.default,
|
|
134
134
|
flex: 1,
|
|
135
135
|
overflow: 'hidden',
|
|
136
136
|
textOverflow: 'ellipsis',
|
|
@@ -140,9 +140,10 @@ export function HeaderSection({ entities, ids }: SectionProps) {
|
|
|
140
140
|
>
|
|
141
141
|
{entity.prefab.split('/').pop()?.replace('.prefab.json', '')}
|
|
142
142
|
</span>
|
|
143
|
-
<
|
|
143
|
+
<Button
|
|
144
144
|
type="button"
|
|
145
|
-
|
|
145
|
+
variant="outline"
|
|
146
|
+
size="compact"
|
|
146
147
|
onClick={() => {
|
|
147
148
|
window.dispatchEvent(
|
|
148
149
|
new CustomEvent('editor:open-asset', { detail: { path: entity.prefab } }),
|
|
@@ -150,10 +151,9 @@ export function HeaderSection({ entities, ids }: SectionProps) {
|
|
|
150
151
|
}}
|
|
151
152
|
>
|
|
152
153
|
Open
|
|
153
|
-
</
|
|
154
|
-
<
|
|
154
|
+
</Button>
|
|
155
|
+
<Button
|
|
155
156
|
type="button"
|
|
156
|
-
style={{ ...btnStyle, fontSize: 10, padding: '2px 6px' }}
|
|
157
157
|
onClick={async () => {
|
|
158
158
|
try {
|
|
159
159
|
const res = await fetch(resolveUrl(entity.prefab!));
|
|
@@ -167,7 +167,7 @@ export function HeaderSection({ entities, ids }: SectionProps) {
|
|
|
167
167
|
}}
|
|
168
168
|
>
|
|
169
169
|
Unpack
|
|
170
|
-
</
|
|
170
|
+
</Button>
|
|
171
171
|
</div>
|
|
172
172
|
)}
|
|
173
173
|
|
|
@@ -196,9 +196,11 @@ function TagsSection({ entity, store }: { entity: Entity; store: EditorStore })
|
|
|
196
196
|
};
|
|
197
197
|
|
|
198
198
|
return (
|
|
199
|
-
<div
|
|
199
|
+
<div
|
|
200
|
+
style={{ padding: '4px 8px 6px', borderBottom: `1px solid ${themeVars.boundary.default}` }}
|
|
201
|
+
>
|
|
200
202
|
<div style={{ display: 'flex', alignItems: 'center', gap: 4, flexWrap: 'wrap' }}>
|
|
201
|
-
<span style={{ fontSize: 10, color:
|
|
203
|
+
<span style={{ fontSize: 10, color: themeVars.content.muted, fontWeight: 600 }}>Tags</span>
|
|
202
204
|
{tags.map((tag) => (
|
|
203
205
|
<span
|
|
204
206
|
key={tag}
|
|
@@ -206,12 +208,14 @@ function TagsSection({ entity, store }: { entity: Entity; store: EditorStore })
|
|
|
206
208
|
display: 'inline-flex',
|
|
207
209
|
alignItems: 'center',
|
|
208
210
|
gap: 2,
|
|
209
|
-
background:
|
|
210
|
-
border:
|
|
211
|
-
|
|
211
|
+
background: themeVars.surface.raised,
|
|
212
|
+
border: `1px solid ${themeVars.boundary.strong}`,
|
|
213
|
+
// radius-lg: at chip height this still reads as a pill, without
|
|
214
|
+
// keeping the one-off radius-10 outlier (I-23; §3 mapping).
|
|
215
|
+
borderRadius: themeVars.shape.large,
|
|
212
216
|
padding: '1px 6px',
|
|
213
217
|
fontSize: 10,
|
|
214
|
-
color:
|
|
218
|
+
color: themeVars.content.primary,
|
|
215
219
|
}}
|
|
216
220
|
>
|
|
217
221
|
{tag}
|
|
@@ -224,7 +228,7 @@ function TagsSection({ entity, store }: { entity: Entity; store: EditorStore })
|
|
|
224
228
|
}}
|
|
225
229
|
style={{ cursor: 'pointer', opacity: 0.6, fontSize: 9, marginLeft: 2 }}
|
|
226
230
|
>
|
|
227
|
-
<
|
|
231
|
+
<EditorIcon icon={faXmark} />
|
|
228
232
|
</span>
|
|
229
233
|
</span>
|
|
230
234
|
))}
|
|
@@ -238,7 +242,7 @@ function TagsSection({ entity, store }: { entity: Entity; store: EditorStore })
|
|
|
238
242
|
}}
|
|
239
243
|
style={{
|
|
240
244
|
fontSize: 10,
|
|
241
|
-
color:
|
|
245
|
+
color: themeVars.accent.default,
|
|
242
246
|
cursor: 'pointer',
|
|
243
247
|
padding: '1px 4px',
|
|
244
248
|
}}
|
|
@@ -249,7 +253,7 @@ function TagsSection({ entity, store }: { entity: Entity; store: EditorStore })
|
|
|
249
253
|
</div>
|
|
250
254
|
{showInput && (
|
|
251
255
|
<div style={{ marginTop: 4, position: 'relative' }}>
|
|
252
|
-
<
|
|
256
|
+
<TextInput
|
|
253
257
|
autoFocus
|
|
254
258
|
value={inputValue}
|
|
255
259
|
onChange={(e) => setInputValue(e.target.value)}
|
|
@@ -269,35 +273,25 @@ function TagsSection({ entity, store }: { entity: Entity; store: EditorStore })
|
|
|
269
273
|
setShowInput(false);
|
|
270
274
|
}}
|
|
271
275
|
placeholder="Add tag..."
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
background: '#1e1e1e',
|
|
275
|
-
border: '1px solid #579EFF',
|
|
276
|
-
borderRadius: 3,
|
|
277
|
-
color: '#c5c8ce',
|
|
278
|
-
fontSize: 11,
|
|
279
|
-
padding: '2px 6px',
|
|
280
|
-
outline: 'none',
|
|
281
|
-
}}
|
|
276
|
+
className="vgai-input"
|
|
277
|
+
style={{ width: '100%', borderColor: themeVars.accent.default }}
|
|
282
278
|
/>
|
|
283
279
|
{inputValue && suggestions.length > 0 && (
|
|
284
280
|
<div
|
|
285
281
|
style={{
|
|
282
|
+
...popoverStyle,
|
|
286
283
|
position: 'absolute',
|
|
287
284
|
top: '100%',
|
|
288
285
|
left: 0,
|
|
289
286
|
right: 0,
|
|
290
|
-
|
|
291
|
-
border: '1px solid #444',
|
|
292
|
-
borderRadius: 3,
|
|
293
|
-
zIndex: 100,
|
|
287
|
+
zIndex: 'var(--vgai-z-dropdown)',
|
|
294
288
|
maxHeight: 100,
|
|
295
289
|
overflowY: 'auto',
|
|
296
|
-
scrollbarWidth: 'none',
|
|
297
290
|
}}
|
|
298
291
|
>
|
|
299
292
|
{suggestions.slice(0, 5).map((s) => (
|
|
300
293
|
<div
|
|
294
|
+
className="vgai-selectable"
|
|
301
295
|
key={s}
|
|
302
296
|
onMouseDown={(e) => {
|
|
303
297
|
e.preventDefault();
|
|
@@ -307,14 +301,9 @@ function TagsSection({ entity, store }: { entity: Entity; store: EditorStore })
|
|
|
307
301
|
style={{
|
|
308
302
|
padding: '3px 8px',
|
|
309
303
|
fontSize: 11,
|
|
310
|
-
color:
|
|
304
|
+
color: themeVars.content.primary,
|
|
311
305
|
cursor: 'pointer',
|
|
312
|
-
|
|
313
|
-
onMouseEnter={(e) => {
|
|
314
|
-
(e.currentTarget as HTMLDivElement).style.background = '#3a3a3a';
|
|
315
|
-
}}
|
|
316
|
-
onMouseLeave={(e) => {
|
|
317
|
-
(e.currentTarget as HTMLDivElement).style.background = 'transparent';
|
|
306
|
+
borderRadius: themeVars.shape.small,
|
|
318
307
|
}}
|
|
319
308
|
>
|
|
320
309
|
{s}
|