@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
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
import type { SceneCollider, SceneEnvironment, ScenePhysics } from '@engine/scene/scene-types';
|
|
2
|
+
import {
|
|
3
|
+
Checkbox,
|
|
4
|
+
NumberInput,
|
|
5
|
+
SectionHeader,
|
|
6
|
+
Select,
|
|
7
|
+
Tooltip,
|
|
8
|
+
themeVars,
|
|
9
|
+
Vec3Input,
|
|
10
|
+
} from '../../design-system';
|
|
2
11
|
import { useEditorStore } from '../../EditorContext';
|
|
3
|
-
import {
|
|
4
|
-
import { SectionHeader } from '../primitives/SectionHeader';
|
|
5
|
-
import { Tooltip } from '../primitives/Tooltip';
|
|
6
|
-
import { Vec3Input } from '../primitives/Vec3Input';
|
|
12
|
+
import { fieldLabelStyle, groupLabelStyle, mixedStyle } from '../inspector-widgets/shared';
|
|
7
13
|
import type { SectionProps } from './multi-edit-utils';
|
|
8
14
|
import { commonBool, commonNum, commonStr, commonVec3 } from './multi-edit-utils';
|
|
9
15
|
|
|
@@ -25,20 +31,9 @@ export function PhysicsSection({ entities, ids }: SectionProps) {
|
|
|
25
31
|
const sensor = commonBool(entities, (e) => e.physics?.collider.isSensor ?? false);
|
|
26
32
|
const offset = commonVec3(entities, (e) => e.physics?.collider.offset ?? [0, 0, 0]);
|
|
27
33
|
|
|
28
|
-
const selectStyle: React.CSSProperties = {
|
|
29
|
-
width: '100%',
|
|
30
|
-
background: '#1e1e1e',
|
|
31
|
-
color: '#c5c8ce',
|
|
32
|
-
border: '1px solid #333',
|
|
33
|
-
borderRadius: 2,
|
|
34
|
-
padding: '3px 4px',
|
|
35
|
-
fontSize: 12,
|
|
36
|
-
};
|
|
37
|
-
|
|
38
34
|
const mixedSelectStyle = (isMixed: boolean): React.CSSProperties => ({
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
fontStyle: isMixed ? 'italic' : 'normal',
|
|
35
|
+
width: '100%',
|
|
36
|
+
...mixedStyle(isMixed),
|
|
42
37
|
});
|
|
43
38
|
|
|
44
39
|
const update = (partial: Partial<ScenePhysics>) => {
|
|
@@ -61,16 +56,17 @@ export function PhysicsSection({ entities, ids }: SectionProps) {
|
|
|
61
56
|
text="Dynamic: simulated, Fixed: immovable, Kinematic: scripted"
|
|
62
57
|
position="right"
|
|
63
58
|
>
|
|
64
|
-
<div style={
|
|
59
|
+
<div style={fieldLabelStyle}>Body Type</div>
|
|
65
60
|
</Tooltip>
|
|
66
|
-
<
|
|
61
|
+
<Select
|
|
62
|
+
className="vgai-select"
|
|
67
63
|
value={bodyType ?? ''}
|
|
68
64
|
onChange={(e) => update({ bodyType: e.target.value as ScenePhysics['bodyType'] })}
|
|
69
65
|
style={mixedSelectStyle(bodyType === null)}
|
|
70
66
|
>
|
|
71
67
|
{bodyType === null && (
|
|
72
68
|
<option value="" disabled>
|
|
73
|
-
|
|
69
|
+
—
|
|
74
70
|
</option>
|
|
75
71
|
)}
|
|
76
72
|
{bodyTypes.map((t) => (
|
|
@@ -78,24 +74,25 @@ export function PhysicsSection({ entities, ids }: SectionProps) {
|
|
|
78
74
|
{t}
|
|
79
75
|
</option>
|
|
80
76
|
))}
|
|
81
|
-
</
|
|
77
|
+
</Select>
|
|
82
78
|
</div>
|
|
83
79
|
<div>
|
|
84
80
|
<Tooltip text="Weight for physics simulation" position="right">
|
|
85
|
-
<div style={
|
|
81
|
+
<div style={fieldLabelStyle}>Mass</div>
|
|
86
82
|
</Tooltip>
|
|
87
83
|
<NumberInput value={mass} onChange={(v) => update({ mass: v })} step={0.1} />
|
|
88
84
|
</div>
|
|
89
85
|
<div>
|
|
90
|
-
<div style={
|
|
91
|
-
<
|
|
86
|
+
<div style={fieldLabelStyle}>Collider Type</div>
|
|
87
|
+
<Select
|
|
88
|
+
className="vgai-select"
|
|
92
89
|
value={colliderType ?? ''}
|
|
93
90
|
onChange={(e) => updateCollider({ type: e.target.value as SceneCollider['type'] })}
|
|
94
91
|
style={mixedSelectStyle(colliderType === null)}
|
|
95
92
|
>
|
|
96
93
|
{colliderType === null && (
|
|
97
94
|
<option value="" disabled>
|
|
98
|
-
|
|
95
|
+
—
|
|
99
96
|
</option>
|
|
100
97
|
)}
|
|
101
98
|
{colliderTypes.map((t) => (
|
|
@@ -103,12 +100,12 @@ export function PhysicsSection({ entities, ids }: SectionProps) {
|
|
|
103
100
|
{t}
|
|
104
101
|
</option>
|
|
105
102
|
))}
|
|
106
|
-
</
|
|
103
|
+
</Select>
|
|
107
104
|
</div>
|
|
108
105
|
{colliderType === 'cuboid' && (
|
|
109
106
|
<div>
|
|
110
107
|
<Tooltip text="Half-size from center to edge" position="right">
|
|
111
|
-
<div style={
|
|
108
|
+
<div style={fieldLabelStyle}>Half Extents</div>
|
|
112
109
|
</Tooltip>
|
|
113
110
|
<Vec3Input
|
|
114
111
|
value={commonVec3(
|
|
@@ -134,7 +131,7 @@ export function PhysicsSection({ entities, ids }: SectionProps) {
|
|
|
134
131
|
)}
|
|
135
132
|
{colliderType === 'ball' && (
|
|
136
133
|
<div>
|
|
137
|
-
<div style={
|
|
134
|
+
<div style={fieldLabelStyle}>Radius</div>
|
|
138
135
|
<NumberInput
|
|
139
136
|
value={commonNum(entities, (e) => e.physics?.collider.radius ?? 0.5)}
|
|
140
137
|
onChange={(v) => updateCollider({ radius: v })}
|
|
@@ -145,7 +142,7 @@ export function PhysicsSection({ entities, ids }: SectionProps) {
|
|
|
145
142
|
{colliderType === 'capsule' && (
|
|
146
143
|
<>
|
|
147
144
|
<div>
|
|
148
|
-
<div style={
|
|
145
|
+
<div style={fieldLabelStyle}>Radius</div>
|
|
149
146
|
<NumberInput
|
|
150
147
|
value={commonNum(entities, (e) => e.physics?.collider.radius ?? 0.25)}
|
|
151
148
|
onChange={(v) => updateCollider({ radius: v })}
|
|
@@ -153,7 +150,7 @@ export function PhysicsSection({ entities, ids }: SectionProps) {
|
|
|
153
150
|
/>
|
|
154
151
|
</div>
|
|
155
152
|
<div>
|
|
156
|
-
<div style={
|
|
153
|
+
<div style={fieldLabelStyle}>Half Height</div>
|
|
157
154
|
<NumberInput
|
|
158
155
|
value={commonNum(entities, (e) => e.physics?.collider.halfHeight ?? 0.5)}
|
|
159
156
|
onChange={(v) => updateCollider({ halfHeight: v })}
|
|
@@ -166,7 +163,7 @@ export function PhysicsSection({ entities, ids }: SectionProps) {
|
|
|
166
163
|
{/* Physics material */}
|
|
167
164
|
<div>
|
|
168
165
|
<Tooltip text="Surface friction — 0 = ice, 1+ = sticky" position="right">
|
|
169
|
-
<div style={
|
|
166
|
+
<div style={fieldLabelStyle}>Friction</div>
|
|
170
167
|
</Tooltip>
|
|
171
168
|
<NumberInput
|
|
172
169
|
value={friction}
|
|
@@ -176,7 +173,7 @@ export function PhysicsSection({ entities, ids }: SectionProps) {
|
|
|
176
173
|
</div>
|
|
177
174
|
<div>
|
|
178
175
|
<Tooltip text="Bounciness — 0 = no bounce, 1 = full bounce" position="right">
|
|
179
|
-
<div style={
|
|
176
|
+
<div style={fieldLabelStyle}>Restitution</div>
|
|
180
177
|
</Tooltip>
|
|
181
178
|
<NumberInput
|
|
182
179
|
value={restitution}
|
|
@@ -186,7 +183,7 @@ export function PhysicsSection({ entities, ids }: SectionProps) {
|
|
|
186
183
|
</div>
|
|
187
184
|
<div>
|
|
188
185
|
<Tooltip text="Mass per volume — overrides mass when set" position="right">
|
|
189
|
-
<div style={
|
|
186
|
+
<div style={fieldLabelStyle}>Density</div>
|
|
190
187
|
</Tooltip>
|
|
191
188
|
<NumberInput
|
|
192
189
|
value={density}
|
|
@@ -196,7 +193,7 @@ export function PhysicsSection({ entities, ids }: SectionProps) {
|
|
|
196
193
|
</div>
|
|
197
194
|
<div>
|
|
198
195
|
<Tooltip text="Local offset from body origin" position="right">
|
|
199
|
-
<div style={
|
|
196
|
+
<div style={fieldLabelStyle}>Collider Offset</div>
|
|
200
197
|
</Tooltip>
|
|
201
198
|
<Vec3Input
|
|
202
199
|
value={offset}
|
|
@@ -221,15 +218,17 @@ export function PhysicsSection({ entities, ids }: SectionProps) {
|
|
|
221
218
|
<div>
|
|
222
219
|
<Tooltip text="Detect overlaps without physical blocking" position="right">
|
|
223
220
|
<div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
|
|
224
|
-
<
|
|
225
|
-
|
|
221
|
+
<Checkbox
|
|
222
|
+
className="vgai-checkbox"
|
|
226
223
|
checked={sensor ?? false}
|
|
227
224
|
ref={(el) => {
|
|
228
225
|
if (el) el.indeterminate = sensor === null;
|
|
229
226
|
}}
|
|
230
227
|
onChange={(e) => updateCollider({ isSensor: e.target.checked })}
|
|
231
228
|
/>
|
|
232
|
-
<span style={{ fontSize: 11, color:
|
|
229
|
+
<span style={{ fontSize: 11, color: themeVars.content.primary }}>
|
|
230
|
+
Is Sensor (Trigger)
|
|
231
|
+
</span>
|
|
233
232
|
</div>
|
|
234
233
|
</Tooltip>
|
|
235
234
|
</div>
|
|
@@ -257,11 +256,8 @@ export function PhysicsSection({ entities, ids }: SectionProps) {
|
|
|
257
256
|
// --- Collision Layers ---
|
|
258
257
|
|
|
259
258
|
const layerLabelStyle: React.CSSProperties = {
|
|
260
|
-
|
|
261
|
-
color: '#8c8c8c',
|
|
259
|
+
...groupLabelStyle,
|
|
262
260
|
marginBottom: 2,
|
|
263
|
-
fontWeight: 700,
|
|
264
|
-
textTransform: 'uppercase',
|
|
265
261
|
marginTop: 4,
|
|
266
262
|
};
|
|
267
263
|
|
|
@@ -270,7 +266,7 @@ const layerCheckStyle: React.CSSProperties = {
|
|
|
270
266
|
alignItems: 'center',
|
|
271
267
|
gap: 4,
|
|
272
268
|
fontSize: 10,
|
|
273
|
-
color:
|
|
269
|
+
color: themeVars.content.primary,
|
|
274
270
|
};
|
|
275
271
|
|
|
276
272
|
function CollisionLayersUI({
|
|
@@ -299,8 +295,8 @@ function CollisionLayersUI({
|
|
|
299
295
|
<div style={{ display: 'flex', flexWrap: 'wrap', gap: 4 }}>
|
|
300
296
|
{layerNames.map((name, i) => (
|
|
301
297
|
<label key={`g-${name}`} style={layerCheckStyle}>
|
|
302
|
-
<
|
|
303
|
-
|
|
298
|
+
<Checkbox
|
|
299
|
+
className="vgai-checkbox"
|
|
304
300
|
checked={(groups & (1 << i)) !== 0}
|
|
305
301
|
onChange={() => toggleBit('collisionGroups', i)}
|
|
306
302
|
/>
|
|
@@ -312,8 +308,8 @@ function CollisionLayersUI({
|
|
|
312
308
|
<div style={{ display: 'flex', flexWrap: 'wrap', gap: 4 }}>
|
|
313
309
|
{layerNames.map((name, i) => (
|
|
314
310
|
<label key={`f-${name}`} style={layerCheckStyle}>
|
|
315
|
-
<
|
|
316
|
-
|
|
311
|
+
<Checkbox
|
|
312
|
+
className="vgai-checkbox"
|
|
317
313
|
checked={(filter & (1 << i)) !== 0}
|
|
318
314
|
onChange={() => toggleBit('collisionFilter', i)}
|
|
319
315
|
/>
|
|
@@ -1,31 +1,20 @@
|
|
|
1
1
|
import { DEFAULTS } from '@engine/scene/defaults';
|
|
2
2
|
import type { SceneEnvironment, ScenePostProcessing } from '@engine/scene/scene-types';
|
|
3
|
+
import {
|
|
4
|
+
Checkbox,
|
|
5
|
+
ColorInput,
|
|
6
|
+
NumberInput,
|
|
7
|
+
SectionHeader,
|
|
8
|
+
Select,
|
|
9
|
+
TextInput,
|
|
10
|
+
themeVars,
|
|
11
|
+
} from '../../design-system';
|
|
3
12
|
import { useEditorStore } from '../../EditorContext';
|
|
4
13
|
import type { EditorStore } from '../../editor-store';
|
|
5
|
-
import {
|
|
6
|
-
import { NumberInput } from '../primitives/NumberInput';
|
|
7
|
-
import { SectionHeader } from '../primitives/SectionHeader';
|
|
14
|
+
import { fieldLabelStyle, groupLabelStyle } from '../inspector-widgets/shared';
|
|
8
15
|
|
|
9
|
-
const labelStyle: React.CSSProperties =
|
|
10
|
-
const effectLabel: React.CSSProperties = {
|
|
11
|
-
fontSize: 10,
|
|
12
|
-
color: '#8c8c8c',
|
|
13
|
-
fontWeight: 700,
|
|
14
|
-
marginTop: 6,
|
|
15
|
-
};
|
|
16
|
-
const selectStyle: React.CSSProperties = {
|
|
17
|
-
width: '100%',
|
|
18
|
-
background: '#2a2d35',
|
|
19
|
-
color: '#c5c8ce',
|
|
20
|
-
border: '1px solid #3a3d45',
|
|
21
|
-
borderRadius: 3,
|
|
22
|
-
padding: '2px 4px',
|
|
23
|
-
fontSize: 11,
|
|
24
|
-
};
|
|
25
|
-
const textInputStyle: React.CSSProperties = {
|
|
26
|
-
...selectStyle,
|
|
27
|
-
boxSizing: 'border-box' as const,
|
|
28
|
-
};
|
|
16
|
+
const labelStyle: React.CSSProperties = fieldLabelStyle;
|
|
17
|
+
const effectLabel: React.CSSProperties = { ...groupLabelStyle, marginTop: 6 };
|
|
29
18
|
|
|
30
19
|
const d = DEFAULTS.postProcessing;
|
|
31
20
|
|
|
@@ -56,12 +45,12 @@ function EnabledCheckbox({
|
|
|
56
45
|
}) {
|
|
57
46
|
return (
|
|
58
47
|
<div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
|
|
59
|
-
<
|
|
60
|
-
|
|
48
|
+
<Checkbox
|
|
49
|
+
className="vgai-checkbox"
|
|
61
50
|
checked={checked}
|
|
62
51
|
onChange={(e) => updatePP(store, env, effectKey, { enabled: e.target.checked })}
|
|
63
52
|
/>
|
|
64
|
-
<span style={{ fontSize: 11, color:
|
|
53
|
+
<span style={{ fontSize: 11, color: themeVars.content.primary }}>Enabled</span>
|
|
65
54
|
</div>
|
|
66
55
|
);
|
|
67
56
|
}
|
|
@@ -112,12 +101,12 @@ function Check({
|
|
|
112
101
|
}) {
|
|
113
102
|
return (
|
|
114
103
|
<div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
|
|
115
|
-
<
|
|
116
|
-
|
|
104
|
+
<Checkbox
|
|
105
|
+
className="vgai-checkbox"
|
|
117
106
|
checked={checked}
|
|
118
107
|
onChange={(e) => updatePP(store, env, effectKey, { [field]: e.target.checked })}
|
|
119
108
|
/>
|
|
120
|
-
<span style={{ fontSize: 11, color:
|
|
109
|
+
<span style={{ fontSize: 11, color: themeVars.content.primary }}>{label}</span>
|
|
121
110
|
</div>
|
|
122
111
|
);
|
|
123
112
|
}
|
|
@@ -415,14 +404,15 @@ export function PostProcessingSection() {
|
|
|
415
404
|
<>
|
|
416
405
|
<div>
|
|
417
406
|
<div style={labelStyle}>Source Entity ID</div>
|
|
418
|
-
<
|
|
407
|
+
<TextInput
|
|
419
408
|
type="text"
|
|
420
409
|
value={pp.godRays.sourceEntity ?? ''}
|
|
421
410
|
onChange={(e) =>
|
|
422
411
|
updatePP(store, env, 'godRays', { sourceEntity: e.target.value })
|
|
423
412
|
}
|
|
424
413
|
placeholder="Entity ID of light source mesh"
|
|
425
|
-
|
|
414
|
+
className="vgai-input"
|
|
415
|
+
style={{ width: '100%' }}
|
|
426
416
|
/>
|
|
427
417
|
</div>
|
|
428
418
|
<Num
|
|
@@ -1123,7 +1113,7 @@ export function PostProcessingSection() {
|
|
|
1123
1113
|
<>
|
|
1124
1114
|
<div>
|
|
1125
1115
|
<div style={labelStyle}>Tags (comma-separated)</div>
|
|
1126
|
-
<
|
|
1116
|
+
<TextInput
|
|
1127
1117
|
type="text"
|
|
1128
1118
|
value={(pp.outline.tags ?? []).join(', ')}
|
|
1129
1119
|
onChange={(e) => {
|
|
@@ -1134,7 +1124,8 @@ export function PostProcessingSection() {
|
|
|
1134
1124
|
updatePP(store, env, 'outline', { tags });
|
|
1135
1125
|
}}
|
|
1136
1126
|
placeholder="e.g. highlighted, selected"
|
|
1137
|
-
|
|
1127
|
+
className="vgai-input"
|
|
1128
|
+
style={{ width: '100%' }}
|
|
1138
1129
|
/>
|
|
1139
1130
|
</div>
|
|
1140
1131
|
<Num
|
|
@@ -1270,16 +1261,17 @@ export function PostProcessingSection() {
|
|
|
1270
1261
|
{pp?.smaa?.enabled && (
|
|
1271
1262
|
<div>
|
|
1272
1263
|
<div style={labelStyle}>Preset</div>
|
|
1273
|
-
<
|
|
1264
|
+
<Select
|
|
1265
|
+
className="vgai-select"
|
|
1274
1266
|
value={pp.smaa.preset ?? d.smaa.preset}
|
|
1275
1267
|
onChange={(e) => updatePP(store, env, 'smaa', { preset: e.target.value })}
|
|
1276
|
-
style={
|
|
1268
|
+
style={{ width: '100%' }}
|
|
1277
1269
|
>
|
|
1278
1270
|
<option value="low">Low</option>
|
|
1279
1271
|
<option value="medium">Medium</option>
|
|
1280
1272
|
<option value="high">High</option>
|
|
1281
1273
|
<option value="ultra">Ultra</option>
|
|
1282
|
-
</
|
|
1274
|
+
</Select>
|
|
1283
1275
|
</div>
|
|
1284
1276
|
)}
|
|
1285
1277
|
</div>
|
|
@@ -1,22 +1,13 @@
|
|
|
1
1
|
import { RENDER_FEATURES, type RenderFeature } from '@engine/render/render-features';
|
|
2
2
|
import type { SceneEnvironment } from '@engine/scene/scene-types';
|
|
3
|
+
import { Checkbox, NumberInput, SectionHeader, Select, themeVars } from '../../design-system';
|
|
3
4
|
import type { EditorStore } from '../../editor-store';
|
|
4
|
-
import {
|
|
5
|
-
import { SectionHeader } from '../primitives/SectionHeader';
|
|
5
|
+
import { fieldLabelStyle } from '../inspector-widgets/shared';
|
|
6
6
|
|
|
7
|
-
const labelStyle: React.CSSProperties = { fontSize: 11, color:
|
|
8
|
-
const selectStyle: React.CSSProperties = {
|
|
9
|
-
width: '100%',
|
|
10
|
-
background: '#2a2d35',
|
|
11
|
-
color: '#c5c8ce',
|
|
12
|
-
border: '1px solid #3a3d45',
|
|
13
|
-
borderRadius: 3,
|
|
14
|
-
padding: '2px 4px',
|
|
15
|
-
fontSize: 11,
|
|
16
|
-
};
|
|
7
|
+
const labelStyle: React.CSSProperties = { fontSize: 11, color: themeVars.content.primary };
|
|
17
8
|
const noteStyle: React.CSSProperties = {
|
|
18
9
|
fontSize: 10,
|
|
19
|
-
color:
|
|
10
|
+
color: themeVars.content.muted,
|
|
20
11
|
lineHeight: 1.4,
|
|
21
12
|
marginBottom: 4,
|
|
22
13
|
};
|
|
@@ -44,8 +35,8 @@ export function RenderingSection({ store }: { store: EditorStore }) {
|
|
|
44
35
|
style={{ display: 'flex', alignItems: 'center', gap: 6 }}
|
|
45
36
|
title={feature.description}
|
|
46
37
|
>
|
|
47
|
-
<
|
|
48
|
-
|
|
38
|
+
<Checkbox
|
|
39
|
+
className="vgai-checkbox"
|
|
49
40
|
checked={current as boolean}
|
|
50
41
|
onChange={(e) => setFeature(feature.key, e.target.checked)}
|
|
51
42
|
/>
|
|
@@ -57,7 +48,7 @@ export function RenderingSection({ store }: { store: EditorStore }) {
|
|
|
57
48
|
if (feature.kind === 'number') {
|
|
58
49
|
return (
|
|
59
50
|
<div key={feature.key} title={feature.description}>
|
|
60
|
-
<div style={
|
|
51
|
+
<div style={fieldLabelStyle}>{feature.label}</div>
|
|
61
52
|
<NumberInput
|
|
62
53
|
value={current as number}
|
|
63
54
|
onChange={(v) => {
|
|
@@ -77,18 +68,19 @@ export function RenderingSection({ store }: { store: EditorStore }) {
|
|
|
77
68
|
// enum
|
|
78
69
|
return (
|
|
79
70
|
<div key={feature.key} title={feature.description}>
|
|
80
|
-
<div style={
|
|
81
|
-
<
|
|
71
|
+
<div style={fieldLabelStyle}>{feature.label}</div>
|
|
72
|
+
<Select
|
|
73
|
+
className="vgai-select"
|
|
82
74
|
value={current as string}
|
|
83
75
|
onChange={(e) => setFeature(feature.key, e.target.value)}
|
|
84
|
-
style={
|
|
76
|
+
style={{ width: '100%' }}
|
|
85
77
|
>
|
|
86
78
|
{(feature.options ?? []).map((opt) => (
|
|
87
79
|
<option key={opt} value={opt}>
|
|
88
80
|
{opt}
|
|
89
81
|
</option>
|
|
90
82
|
))}
|
|
91
|
-
</
|
|
83
|
+
</Select>
|
|
92
84
|
</div>
|
|
93
85
|
);
|
|
94
86
|
};
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
+
import { Checkbox, NumberInput, SectionHeader, Tooltip } from '../../design-system';
|
|
1
2
|
import { useEditorStore } from '../../EditorContext';
|
|
2
|
-
import {
|
|
3
|
-
import { SectionHeader } from '../primitives/SectionHeader';
|
|
4
|
-
import { Tooltip } from '../primitives/Tooltip';
|
|
3
|
+
import { fieldLabelStyle } from '../inspector-widgets/shared';
|
|
5
4
|
import type { SectionProps } from './multi-edit-utils';
|
|
6
5
|
import { commonBool, commonNum } from './multi-edit-utils';
|
|
7
6
|
|
|
@@ -18,8 +17,8 @@ export function ShadowSection({ entities, ids }: SectionProps) {
|
|
|
18
17
|
<SectionHeader label="Shadow">
|
|
19
18
|
<div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>
|
|
20
19
|
<label style={{ display: 'flex', alignItems: 'center', gap: 6, fontSize: 12 }}>
|
|
21
|
-
<
|
|
22
|
-
|
|
20
|
+
<Checkbox
|
|
21
|
+
className="vgai-checkbox"
|
|
23
22
|
checked={enabled ?? false}
|
|
24
23
|
ref={(el) => {
|
|
25
24
|
if (el) el.indeterminate = enabled === null;
|
|
@@ -36,7 +35,7 @@ export function ShadowSection({ entities, ids }: SectionProps) {
|
|
|
36
35
|
<>
|
|
37
36
|
<div>
|
|
38
37
|
<Tooltip text="Shadow resolution (higher = sharper)" position="right">
|
|
39
|
-
<div style={
|
|
38
|
+
<div style={fieldLabelStyle}>Map Size</div>
|
|
40
39
|
</Tooltip>
|
|
41
40
|
<NumberInput
|
|
42
41
|
value={mapSize}
|
|
@@ -50,7 +49,7 @@ export function ShadowSection({ entities, ids }: SectionProps) {
|
|
|
50
49
|
</div>
|
|
51
50
|
<div>
|
|
52
51
|
<Tooltip text="Reduce shadow acne artifacts" position="right">
|
|
53
|
-
<div style={
|
|
52
|
+
<div style={fieldLabelStyle}>Bias</div>
|
|
54
53
|
</Tooltip>
|
|
55
54
|
<NumberInput
|
|
56
55
|
value={bias}
|
|
@@ -64,7 +63,7 @@ export function ShadowSection({ entities, ids }: SectionProps) {
|
|
|
64
63
|
</div>
|
|
65
64
|
<div>
|
|
66
65
|
<Tooltip text="Soft shadow blur radius" position="right">
|
|
67
|
-
<div style={
|
|
66
|
+
<div style={fieldLabelStyle}>Radius</div>
|
|
68
67
|
</Tooltip>
|
|
69
68
|
<NumberInput
|
|
70
69
|
value={radius}
|
|
@@ -1,22 +1,21 @@
|
|
|
1
1
|
import type { SceneSpline } from '@engine/scene/scene-types';
|
|
2
|
+
import {
|
|
3
|
+
Button,
|
|
4
|
+
Checkbox,
|
|
5
|
+
NumberInput,
|
|
6
|
+
SectionHeader,
|
|
7
|
+
Select,
|
|
8
|
+
themeVars,
|
|
9
|
+
Vec3Input,
|
|
10
|
+
} from '../../design-system';
|
|
2
11
|
import { useEditorStore } from '../../EditorContext';
|
|
3
|
-
import {
|
|
4
|
-
import { SectionHeader } from '../primitives/SectionHeader';
|
|
5
|
-
import { Vec3Input } from '../primitives/Vec3Input';
|
|
12
|
+
import { fieldLabelStyle } from '../inspector-widgets/shared';
|
|
6
13
|
import type { SectionProps } from './multi-edit-utils';
|
|
7
14
|
import { commonBool, commonNum, commonStr } from './multi-edit-utils';
|
|
8
15
|
|
|
9
|
-
const labelStyle: React.CSSProperties =
|
|
16
|
+
const labelStyle: React.CSSProperties = fieldLabelStyle;
|
|
10
17
|
|
|
11
|
-
|
|
12
|
-
background: '#333',
|
|
13
|
-
color: '#c5c8ce',
|
|
14
|
-
border: '1px solid #444',
|
|
15
|
-
borderRadius: 3,
|
|
16
|
-
padding: '2px 6px',
|
|
17
|
-
cursor: 'pointer',
|
|
18
|
-
fontSize: 10,
|
|
19
|
-
};
|
|
18
|
+
// Shared compact chrome button (I-8/I-10) — the old per-file literal.
|
|
20
19
|
|
|
21
20
|
export function SplineSection({ entities, ids }: SectionProps) {
|
|
22
21
|
const store = useEditorStore();
|
|
@@ -69,41 +68,34 @@ export function SplineSection({ entities, ids }: SectionProps) {
|
|
|
69
68
|
{/* Curve Type */}
|
|
70
69
|
<div>
|
|
71
70
|
<div style={labelStyle}>Curve Type</div>
|
|
72
|
-
<
|
|
71
|
+
<Select
|
|
73
72
|
value={curveType ?? ''}
|
|
74
73
|
onChange={(e) =>
|
|
75
74
|
update({
|
|
76
75
|
curveType: e.target.value as SceneSpline['curveType'],
|
|
77
76
|
})
|
|
78
77
|
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
background: '#1e1e1e',
|
|
82
|
-
border: '1px solid #333',
|
|
83
|
-
borderRadius: 2,
|
|
84
|
-
color: '#c5c8ce',
|
|
85
|
-
fontSize: 11,
|
|
86
|
-
padding: '2px 4px',
|
|
87
|
-
}}
|
|
78
|
+
className="vgai-select"
|
|
79
|
+
style={{ width: '100%' }}
|
|
88
80
|
>
|
|
89
81
|
<option value="centripetal">Centripetal</option>
|
|
90
82
|
<option value="chordal">Chordal</option>
|
|
91
83
|
<option value="catmullrom">Catmull-Rom</option>
|
|
92
|
-
</
|
|
84
|
+
</Select>
|
|
93
85
|
</div>
|
|
94
86
|
|
|
95
87
|
{/* Closed */}
|
|
96
88
|
<div>
|
|
97
89
|
<div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
|
|
98
|
-
<
|
|
99
|
-
|
|
90
|
+
<Checkbox
|
|
91
|
+
className="vgai-checkbox"
|
|
100
92
|
checked={closed ?? false}
|
|
101
93
|
ref={(el) => {
|
|
102
94
|
if (el) el.indeterminate = closed === null;
|
|
103
95
|
}}
|
|
104
96
|
onChange={(e) => update({ closed: e.target.checked })}
|
|
105
97
|
/>
|
|
106
|
-
<span style={{ fontSize: 11, color:
|
|
98
|
+
<span style={{ fontSize: 11, color: themeVars.content.primary }}>Closed Loop</span>
|
|
107
99
|
</div>
|
|
108
100
|
</div>
|
|
109
101
|
|
|
@@ -133,7 +125,6 @@ export function SplineSection({ entities, ids }: SectionProps) {
|
|
|
133
125
|
style={{
|
|
134
126
|
maxHeight: 200,
|
|
135
127
|
overflowY: 'auto',
|
|
136
|
-
scrollbarWidth: 'thin',
|
|
137
128
|
display: 'flex',
|
|
138
129
|
flexDirection: 'column',
|
|
139
130
|
gap: 4,
|
|
@@ -144,7 +135,7 @@ export function SplineSection({ entities, ids }: SectionProps) {
|
|
|
144
135
|
<span
|
|
145
136
|
style={{
|
|
146
137
|
fontSize: 9,
|
|
147
|
-
color:
|
|
138
|
+
color: themeVars.content.dim,
|
|
148
139
|
width: 14,
|
|
149
140
|
textAlign: 'right',
|
|
150
141
|
flexShrink: 0,
|
|
@@ -159,30 +150,28 @@ export function SplineSection({ entities, ids }: SectionProps) {
|
|
|
159
150
|
step={0.1}
|
|
160
151
|
/>
|
|
161
152
|
</div>
|
|
162
|
-
<
|
|
153
|
+
<Button
|
|
163
154
|
type="button"
|
|
155
|
+
variant="danger"
|
|
156
|
+
size="compact"
|
|
157
|
+
aria-label={`Remove spline point ${i + 1}`}
|
|
164
158
|
onClick={() => removePoint(i)}
|
|
165
159
|
disabled={splineData.points.length <= 2}
|
|
166
|
-
style={{
|
|
167
|
-
...btnStyle,
|
|
168
|
-
padding: '1px 5px',
|
|
169
|
-
fontSize: 9,
|
|
170
|
-
opacity: splineData.points.length <= 2 ? 0.3 : 1,
|
|
171
|
-
cursor: splineData.points.length <= 2 ? 'default' : 'pointer',
|
|
172
|
-
}}
|
|
173
160
|
>
|
|
174
|
-
|
|
175
|
-
</
|
|
161
|
+
×
|
|
162
|
+
</Button>
|
|
176
163
|
</div>
|
|
177
164
|
))}
|
|
178
165
|
</div>
|
|
179
|
-
<
|
|
166
|
+
<Button
|
|
180
167
|
type="button"
|
|
168
|
+
variant="secondary"
|
|
169
|
+
size="compact"
|
|
181
170
|
onClick={addPoint}
|
|
182
|
-
style={{
|
|
171
|
+
style={{ marginTop: 4, alignSelf: 'flex-start' }}
|
|
183
172
|
>
|
|
184
173
|
+ Add Point
|
|
185
|
-
</
|
|
174
|
+
</Button>
|
|
186
175
|
</div>
|
|
187
176
|
)}
|
|
188
177
|
</div>
|