@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
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* E3 (spec §11 E3, docs/AI-NATIVE-AUTHORING-IMPLEMENTATION-SPEC.md) — pure,
|
|
3
|
+
* UI-free extraction of a renderable node/edge graph from a real XState v5
|
|
4
|
+
* machine. No separate graph format is persisted anywhere (E3's own AC): this
|
|
5
|
+
* module reads `machine.root` (a `StateNode`) and its `.states`/`.on`/
|
|
6
|
+
* `.always`/`.meta` directly, every time it's called — the "graph" is just a
|
|
7
|
+
* derived view, recomputed from the live machine configuration.
|
|
8
|
+
*
|
|
9
|
+
* ## Which xstate v5 accessors this uses, and why
|
|
10
|
+
*
|
|
11
|
+
* Confirmed against the installed `xstate@5.32.4` (`node_modules/xstate/dist/
|
|
12
|
+
* declarations/src/StateNode.d.ts`) and by instrumenting the real
|
|
13
|
+
* `characterAnimationMachine` (examples/third-person/src/components.ts) at
|
|
14
|
+
* runtime:
|
|
15
|
+
*
|
|
16
|
+
* - `StateNode.states: Record<string, StateNode>` — child state nodes,
|
|
17
|
+
* walked recursively for nested/compound machines. Absent (`{}`) on atomic
|
|
18
|
+
* leaves.
|
|
19
|
+
* - `StateNode.id` — the full dotted id (e.g. `"character-animation.idle"`),
|
|
20
|
+
* used as this module's node id throughout (stable, globally unique within
|
|
21
|
+
* one machine).
|
|
22
|
+
* - `StateNode.on: TransitionDefinitionMap` — a `Record<eventType,
|
|
23
|
+
* TransitionDefinition[]>` of this state's OWN event-triggered transitions
|
|
24
|
+
* (does NOT include ancestor/root `on` handlers with no target on this
|
|
25
|
+
* node, and does NOT include `always` — confirmed by probing the real
|
|
26
|
+
* machine: `idle.on` has only `JUMP`, not the root-level `UPDATE`).
|
|
27
|
+
* - `StateNode.always: TransitionDefinition[] | undefined` — eventless
|
|
28
|
+
* ("always"/guarded-every-microstep) transitions, kept SEPARATE from `.on`
|
|
29
|
+
* by xstate itself; each has `eventType: ''`. Rendered as edges labeled
|
|
30
|
+
* "always" rather than an event name.
|
|
31
|
+
* - `TransitionDefinition.target: readonly StateNode[] | undefined` —
|
|
32
|
+
* resolved target state node(s) (already-resolved, not a string to
|
|
33
|
+
* re-parse); `undefined` for an internal/actionless transition (no target
|
|
34
|
+
* state change) — those are skipped as edges (nothing to point an arrow at).
|
|
35
|
+
* - `TransitionDefinition.guard` — a string (named guard), a `{type, params}`
|
|
36
|
+
* object (parameterized named guard), or a plain predicate function
|
|
37
|
+
* (`(args, params) => boolean`, the common case for hand-authored
|
|
38
|
+
* machines like `characterAnimationMachine`, which uses inline
|
|
39
|
+
* `({ context }) => context.speed > 0.1` arrows). `guardLabel` below
|
|
40
|
+
* normalizes all three to a short display string.
|
|
41
|
+
* - `StateNode.meta?: any` — read here only to detect `meta.animation`
|
|
42
|
+
* presence; actual parsing/validation is delegated to
|
|
43
|
+
* `collectMachineAnimationMeta`/`clipNamesOf` (E1,
|
|
44
|
+
* `@engine/animation/xstate-animation-meta`) — this module does not
|
|
45
|
+
* duplicate that validation.
|
|
46
|
+
* - `StateNode.type: 'atomic' | 'compound' | 'parallel' | 'final' |
|
|
47
|
+
* 'history'` — surfaced per node so the panel can show it (a compound/
|
|
48
|
+
* parallel state has children; the graph still renders it as its own node
|
|
49
|
+
* PLUS its children as separate nodes with a parent edge implied by
|
|
50
|
+
* nesting depth, not a literal drawn edge).
|
|
51
|
+
*
|
|
52
|
+
* No `getStateNodes()` call is needed here: that xstate helper resolves the
|
|
53
|
+
* set of state nodes ACTIVE for one `StateValue` (a snapshot-shaped query).
|
|
54
|
+
* This module wants the machine's full STATIC configuration (every declared
|
|
55
|
+
* state, reachable or not, active or not) — a plain recursive walk of
|
|
56
|
+
* `.states` from `machine.root` is the correct and sufficient tool for that.
|
|
57
|
+
*/
|
|
58
|
+
|
|
59
|
+
import type {
|
|
60
|
+
clipNamesOf as ClipNamesOfFn,
|
|
61
|
+
collectMachineAnimationMeta as CollectMachineAnimationMetaFn,
|
|
62
|
+
MachineAnimationMetaEntry,
|
|
63
|
+
} from '@engine/animation/xstate-animation-meta';
|
|
64
|
+
import type { AnyStateMachine, AnyStateNode, StateValue } from 'xstate';
|
|
65
|
+
import { getStateNodes } from 'xstate';
|
|
66
|
+
|
|
67
|
+
export interface XStateGraphNode {
|
|
68
|
+
/** Full dotted state id, e.g. `"character-animation.locomotion"`. */
|
|
69
|
+
id: string;
|
|
70
|
+
/** The relative key, e.g. `"locomotion"`. */
|
|
71
|
+
key: string;
|
|
72
|
+
/** Dotted id of the immediate parent state node, or `null` for the root. */
|
|
73
|
+
parentId: string | null;
|
|
74
|
+
/** Depth from the root (root = 0), used by the layered layout. */
|
|
75
|
+
depth: number;
|
|
76
|
+
type: 'atomic' | 'compound' | 'parallel' | 'final' | 'history';
|
|
77
|
+
/** True for the machine's single configured initial leaf-path state at each level. */
|
|
78
|
+
isInitial: boolean;
|
|
79
|
+
/** Raw `meta` object as authored (e.g. `{ animation: {...} }`), if any. */
|
|
80
|
+
meta: Record<string, unknown> | undefined;
|
|
81
|
+
/** Parsed animation meta for this state, if `meta.animation` validated successfully. */
|
|
82
|
+
animation: MachineAnimationMetaEntry | undefined;
|
|
83
|
+
/** `clipNamesOf(animation.meta)` when `animation` is present. */
|
|
84
|
+
clipNames: string[];
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export interface XStateGraphEdge {
|
|
88
|
+
/** Stable synthetic id for React `key` props: `${source}--${eventLabel}--${target}--${index}`. */
|
|
89
|
+
id: string;
|
|
90
|
+
source: string;
|
|
91
|
+
target: string;
|
|
92
|
+
/** The triggering event name, or `'always'` for eventless transitions. */
|
|
93
|
+
eventLabel: string;
|
|
94
|
+
/** `true` for an `always` (eventless) transition. */
|
|
95
|
+
isEventless: boolean;
|
|
96
|
+
/** Normalized guard display label, or `undefined` when the transition is unguarded. */
|
|
97
|
+
guardLabel: string | undefined;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export interface XStateGraph {
|
|
101
|
+
machineId: string;
|
|
102
|
+
nodes: XStateGraphNode[];
|
|
103
|
+
edges: XStateGraphEdge[];
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/** True for a plain, non-empty object (guards against `null`/arrays passing `typeof === 'object'`). */
|
|
107
|
+
function isPlainObject(v: unknown): v is Record<string, unknown> {
|
|
108
|
+
return typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Normalize an xstate v5 `TransitionDefinition['guard']` to a short display
|
|
113
|
+
* label. Handles the three shapes xstate allows (confirmed above):
|
|
114
|
+
* - a string → the guard name verbatim (`"someNamedGuard"`).
|
|
115
|
+
* - a `{ type, params? }` object → `.type` (a parameterized named guard).
|
|
116
|
+
* - a function → its `.name` when xstate/JS gave it a real one (property-
|
|
117
|
+
* shorthand functions like `guard: someNamedFn` keep their declared name),
|
|
118
|
+
* otherwise (the common inline-arrow case, e.g.
|
|
119
|
+
* `({ context }) => context.speed > 0.1`) fall back to a truncated
|
|
120
|
+
* `.toString()` of the function body so the condition is still legible
|
|
121
|
+
* rather than showing a useless generic "guard" (xstate's own destructured-
|
|
122
|
+
* param naming quirk: an arrow assigned to an object property named
|
|
123
|
+
* `guard` is named `"guard"` by the JS engine itself, which conveys
|
|
124
|
+
* nothing — confirmed by probing the real `characterAnimationMachine`).
|
|
125
|
+
*/
|
|
126
|
+
export function guardLabel(guard: unknown): string | undefined {
|
|
127
|
+
if (guard == null) return undefined;
|
|
128
|
+
if (typeof guard === 'string') return guard;
|
|
129
|
+
if (typeof guard === 'function') {
|
|
130
|
+
const name = guard.name;
|
|
131
|
+
if (name && name !== 'guard' && name !== 'anonymous') return name;
|
|
132
|
+
const src = guard.toString().replace(/\s+/g, ' ').trim();
|
|
133
|
+
return src.length > 60 ? `${src.slice(0, 57)}...` : src;
|
|
134
|
+
}
|
|
135
|
+
if (isPlainObject(guard) && typeof guard['type'] === 'string') {
|
|
136
|
+
return guard['type'];
|
|
137
|
+
}
|
|
138
|
+
return '(guard)';
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/** Every dotted-id descendant state node of `node`, depth-first, including `node` itself. */
|
|
142
|
+
function* walkStateNodes(
|
|
143
|
+
node: AnyStateNode,
|
|
144
|
+
parentId: string | null,
|
|
145
|
+
depth: number,
|
|
146
|
+
): Generator<{
|
|
147
|
+
node: AnyStateNode;
|
|
148
|
+
parentId: string | null;
|
|
149
|
+
depth: number;
|
|
150
|
+
}> {
|
|
151
|
+
yield { node, parentId, depth };
|
|
152
|
+
for (const child of Object.values(node.states)) {
|
|
153
|
+
yield* walkStateNodes(child, node.id, depth + 1);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/** True iff `node` is the configured initial child of its parent (root-relative; always true for the root itself). */
|
|
158
|
+
function isInitialChild(node: AnyStateNode): boolean {
|
|
159
|
+
const parent = node.parent;
|
|
160
|
+
if (!parent) return true;
|
|
161
|
+
if (parent.type !== 'compound') return false; // parallel/atomic parents have no single "initial" child
|
|
162
|
+
return parent.initial?.target?.some((t) => t.id === node.id) ?? false;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* One state node's outgoing edges: its own event-triggered (`on`) transitions
|
|
167
|
+
* plus its eventless (`always`) transitions — kept as a separate helper from
|
|
168
|
+
* {@link buildXStateGraph} purely to keep that function's cognitive
|
|
169
|
+
* complexity low; the logic is unchanged from a single inline loop.
|
|
170
|
+
*/
|
|
171
|
+
function edgesFromNode(node: AnyStateNode, nextEdgeId: () => number): XStateGraphEdge[] {
|
|
172
|
+
const edges: XStateGraphEdge[] = [];
|
|
173
|
+
for (const [eventType, defs] of Object.entries(node.on)) {
|
|
174
|
+
for (const def of defs) {
|
|
175
|
+
for (const target of def.target ?? []) {
|
|
176
|
+
edges.push({
|
|
177
|
+
id: `${node.id}--${eventType}--${target.id}--${nextEdgeId()}`,
|
|
178
|
+
source: node.id,
|
|
179
|
+
target: target.id,
|
|
180
|
+
eventLabel: eventType,
|
|
181
|
+
isEventless: false,
|
|
182
|
+
guardLabel: guardLabel(def.guard),
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
for (const def of node.always ?? []) {
|
|
188
|
+
for (const target of def.target ?? []) {
|
|
189
|
+
edges.push({
|
|
190
|
+
id: `${node.id}--always--${target.id}--${nextEdgeId()}`,
|
|
191
|
+
source: node.id,
|
|
192
|
+
target: target.id,
|
|
193
|
+
eventLabel: 'always',
|
|
194
|
+
isEventless: true,
|
|
195
|
+
guardLabel: guardLabel(def.guard),
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return edges;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Extract a renderable {@link XStateGraph} from a real XState machine.
|
|
204
|
+
* Accepts `AnyStateMachine` (what `setup(...).createMachine(...)` and
|
|
205
|
+
* `createMachine(...)` both return) — works for the shipped
|
|
206
|
+
* `characterAnimationMachine` and any other hand-authored machine.
|
|
207
|
+
*
|
|
208
|
+
* `collectMachineAnimationMeta`/`clipNamesOf` are passed in rather than
|
|
209
|
+
* imported directly so this module (and its tests) never need
|
|
210
|
+
* `@vgai/engine`'s Zod validation to be duplicated or re-mocked — see the
|
|
211
|
+
* call sites in `components/xstate-documents.tsx`, which pass the real
|
|
212
|
+
* functions.
|
|
213
|
+
*/
|
|
214
|
+
export function buildXStateGraph(
|
|
215
|
+
machine: AnyStateMachine,
|
|
216
|
+
collectMachineAnimationMeta: typeof CollectMachineAnimationMetaFn,
|
|
217
|
+
clipNamesOf: typeof ClipNamesOfFn,
|
|
218
|
+
): XStateGraph {
|
|
219
|
+
const root = machine.root;
|
|
220
|
+
const animationByStateId = new Map(
|
|
221
|
+
collectMachineAnimationMeta(root).map((entry) => [entry.stateId, entry]),
|
|
222
|
+
);
|
|
223
|
+
|
|
224
|
+
const nodes: XStateGraphNode[] = [];
|
|
225
|
+
const edges: XStateGraphEdge[] = [];
|
|
226
|
+
let edgeSeq = 0;
|
|
227
|
+
const nextEdgeId = () => edgeSeq++;
|
|
228
|
+
|
|
229
|
+
for (const { node, parentId, depth } of walkStateNodes(root, null, 0)) {
|
|
230
|
+
const animation = animationByStateId.get(node.id);
|
|
231
|
+
nodes.push({
|
|
232
|
+
id: node.id,
|
|
233
|
+
key: node.key,
|
|
234
|
+
parentId,
|
|
235
|
+
depth,
|
|
236
|
+
type: node.type,
|
|
237
|
+
isInitial: isInitialChild(node),
|
|
238
|
+
meta: isPlainObject(node.meta) ? node.meta : undefined,
|
|
239
|
+
animation,
|
|
240
|
+
clipNames: animation ? clipNamesOf(animation.meta) : [],
|
|
241
|
+
});
|
|
242
|
+
edges.push(...edgesFromNode(node, nextEdgeId));
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
return { machineId: root.id, nodes, edges };
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* The full state ids XState reports as ACTIVE for a given snapshot value —
|
|
250
|
+
* every ancestor plus the leaf (e.g. a snapshot in `"locomotion"` reports
|
|
251
|
+
* both `"character-animation"` and `"character-animation.locomotion"`).
|
|
252
|
+
*
|
|
253
|
+
* Uses xstate's own `getStateNodes(rootNode, stateValue)` (`xstate` package
|
|
254
|
+
* root export, confirmed present in the installed v5.32.4 and exercised
|
|
255
|
+
* directly against a real machine) rather than `snapshot.getMeta()` —
|
|
256
|
+
* `getMeta()` only returns states that declare a `meta` object at all
|
|
257
|
+
* (confirmed by probing a real machine: a meta-less compound ancestor is
|
|
258
|
+
* silently absent from `getMeta()`'s keys even while active), which would
|
|
259
|
+
* under-highlight the graph for any machine with meta-less parent/compound
|
|
260
|
+
* states. `getStateNodes` returns the complete active set regardless of
|
|
261
|
+
* whether a node has `meta`.
|
|
262
|
+
*/
|
|
263
|
+
export function activeStateIdsOf(machine: AnyStateMachine, stateValue: StateValue): string[] {
|
|
264
|
+
return getStateNodes(machine.root, stateValue).map((n) => n.id);
|
|
265
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* E3 — a deterministic, dependency-free layered layout for an
|
|
3
|
+
* {@link XStateGraph}. No graph-layout library exists in this repo (checked:
|
|
4
|
+
* no reactflow/dagre/elkjs/d3 in `packages/editor/package.json` or the root
|
|
5
|
+
* manifest) and the spec explicitly says a fancy graph engine is not
|
|
6
|
+
* required ("a simple deterministic layout is fine — grid/columns by depth").
|
|
7
|
+
*
|
|
8
|
+
* Layout rule: one COLUMN per state-tree depth (root=0, its children=1,
|
|
9
|
+
* grandchildren=2, …) — this both (a) reads naturally for the shallow
|
|
10
|
+
* machines XState animation binding targets (§5.6's examples are 1-2 levels
|
|
11
|
+
* deep) and (b) guarantees a parent is always positioned before/left-of its
|
|
12
|
+
* children, which keeps nesting legible even before any edges are drawn.
|
|
13
|
+
* Within a column, nodes are stacked top-to-bottom in the machine's own
|
|
14
|
+
* declaration order (`StateNode.order` is xstate's own deterministic
|
|
15
|
+
* document-order counter) — so the layout is 100% a pure function of the
|
|
16
|
+
* machine, not randomized/force-simulated, and is stable across renders
|
|
17
|
+
* (required for a sane React key/position diff and for tests to assert
|
|
18
|
+
* exact pixel positions).
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import type { XStateGraph, XStateGraphNode } from './xstate-graph';
|
|
22
|
+
|
|
23
|
+
export interface LayoutNode {
|
|
24
|
+
node: XStateGraphNode;
|
|
25
|
+
x: number;
|
|
26
|
+
y: number;
|
|
27
|
+
width: number;
|
|
28
|
+
height: number;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface XStateLayout {
|
|
32
|
+
nodes: LayoutNode[];
|
|
33
|
+
positionById: Map<string, LayoutNode>;
|
|
34
|
+
width: number;
|
|
35
|
+
height: number;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const COLUMN_WIDTH = 220;
|
|
39
|
+
const COLUMN_GAP = 100;
|
|
40
|
+
const ROW_HEIGHT = 64;
|
|
41
|
+
const ROW_GAP = 24;
|
|
42
|
+
const NODE_WIDTH = 180;
|
|
43
|
+
const MARGIN = 24;
|
|
44
|
+
|
|
45
|
+
/** Lay out a graph's nodes into depth-based columns, declaration order within each column. */
|
|
46
|
+
export function layoutXStateGraph(graph: XStateGraph): XStateLayout {
|
|
47
|
+
const byDepth = new Map<number, XStateGraphNode[]>();
|
|
48
|
+
for (const node of graph.nodes) {
|
|
49
|
+
const bucket = byDepth.get(node.depth);
|
|
50
|
+
if (bucket) bucket.push(node);
|
|
51
|
+
else byDepth.set(node.depth, [node]);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const nodes: LayoutNode[] = [];
|
|
55
|
+
const positionById = new Map<string, LayoutNode>();
|
|
56
|
+
let maxDepth = 0;
|
|
57
|
+
let maxRows = 0;
|
|
58
|
+
|
|
59
|
+
for (const [depth, column] of byDepth) {
|
|
60
|
+
maxDepth = Math.max(maxDepth, depth);
|
|
61
|
+
maxRows = Math.max(maxRows, column.length);
|
|
62
|
+
const x = MARGIN + depth * (COLUMN_WIDTH + COLUMN_GAP);
|
|
63
|
+
column.forEach((node, row) => {
|
|
64
|
+
const y = MARGIN + row * (ROW_HEIGHT + ROW_GAP);
|
|
65
|
+
const laidOut: LayoutNode = { node, x, y, width: NODE_WIDTH, height: ROW_HEIGHT };
|
|
66
|
+
nodes.push(laidOut);
|
|
67
|
+
positionById.set(node.id, laidOut);
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const width = MARGIN * 2 + (maxDepth + 1) * COLUMN_WIDTH + maxDepth * COLUMN_GAP;
|
|
72
|
+
const height =
|
|
73
|
+
MARGIN * 2 + Math.max(1, maxRows) * ROW_HEIGHT + Math.max(0, maxRows - 1) * ROW_GAP;
|
|
74
|
+
|
|
75
|
+
return { nodes, positionById, width, height };
|
|
76
|
+
}
|
package/src/z-index.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical z-index scale (editor-style-polish U0,
|
|
3
|
+
* `roadmaps/editor-style-polish/EDITOR-STYLE-AUDIT.md` §3 "Z-index scale").
|
|
4
|
+
* Replaces the ungoverned 1..10000 range (4 orders of magnitude, 2 sites
|
|
5
|
+
* typed as strings) with named tiers. Re-exported from `theme.ts`; kept as
|
|
6
|
+
* its own module too so a call site that only needs stacking order doesn't
|
|
7
|
+
* have to import the whole token set.
|
|
8
|
+
*
|
|
9
|
+
* `designTimeLayers` is deliberately NOT given a single number here —
|
|
10
|
+
* `authoring/design-time-layers.ts`'s `BASE_Z_INDEX` is already a real,
|
|
11
|
+
* scoped constant for that tier and is left as-is per the audit.
|
|
12
|
+
*/
|
|
13
|
+
export const zIndex = {
|
|
14
|
+
/** Default stacking (no explicit z-index needed). */
|
|
15
|
+
base: 0,
|
|
16
|
+
/** World-selection / text-edit / align-toolbar tier (absorbs 20/50/60/70). */
|
|
17
|
+
overlayLow: 50,
|
|
18
|
+
/** Dropdown / popover tier (absorbs the flat `100` used almost everywhere). */
|
|
19
|
+
dropdown: 100,
|
|
20
|
+
/** Sticky chrome tier (absorbs 200/999/1000, and the stray string `'999'`). */
|
|
21
|
+
sticky: 1000,
|
|
22
|
+
/** Toast tier. */
|
|
23
|
+
toast: 9999,
|
|
24
|
+
/** Modal tier — already consistent across all dialog components. */
|
|
25
|
+
modal: 10000,
|
|
26
|
+
} as const;
|