@volter/sdk 0.0.0-stage → 0.5.203
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/LICENSE +202 -0
- package/NOTICE +20 -0
- package/README.md +38 -3
- package/package.json +510 -4
- package/src/account.ts +210 -0
- package/src/chrome.ts +88 -0
- package/src/client.ts +1646 -0
- package/src/commands.ts +66 -0
- package/src/contributions.ts +619 -0
- package/src/css-numeric-style.ts +97 -0
- package/src/document-probe.ts +282 -0
- package/src/editor-view.ts +225 -0
- package/src/extension.ts +40 -0
- package/src/generations.ts +178 -0
- package/src/host.ts +1157 -0
- package/src/http-transport.browser.ts +14 -0
- package/src/http-transport.node.ts +19 -0
- package/src/index.ts +131 -0
- package/src/kit/CapabilityCoverageSection.tsx +185 -0
- package/src/kit/account-client.ts +333 -0
- package/src/kit/action-registry.ts +317 -0
- package/src/kit/active-product.ts +76 -0
- package/src/kit/active-project.ts +155 -0
- package/src/kit/adapter-editor-config.ts +25 -0
- package/src/kit/adapter-module.ts +7 -0
- package/src/kit/adapter-observation.ts +49 -0
- package/src/kit/animation/animation-clock.ts +479 -0
- package/src/kit/animation/stage-transport.ts +385 -0
- package/src/kit/api/assets.ts +365 -0
- package/src/kit/api/project-open.ts +355 -0
- package/src/kit/api/project-source.ts +180 -0
- package/src/kit/api/project-state.ts +110 -0
- package/src/kit/api/relay.ts +270 -0
- package/src/kit/api/themes.ts +45 -0
- package/src/kit/api-asset-library-wire.ts +45 -0
- package/src/kit/api-base.ts +10 -0
- package/src/kit/api-build.ts +99 -0
- package/src/kit/api-git-wire.ts +56 -0
- package/src/kit/api-logs.ts +92 -0
- package/src/kit/api-project-identity.ts +74 -0
- package/src/kit/api-settings.ts +36 -0
- package/src/kit/api-worktrees.ts +205 -0
- package/src/kit/asset-capabilities.ts +344 -0
- package/src/kit/asset-compare-core.ts +171 -0
- package/src/kit/asset-editor-context.tsx +101 -0
- package/src/kit/asset-events.ts +96 -0
- package/src/kit/asset-inspector-actions.ts +87 -0
- package/src/kit/asset-selection-viewer-registry.ts +113 -0
- package/src/kit/asset-selection.ts +146 -0
- package/src/kit/asset-thumbnails.ts +25 -0
- package/src/kit/asset-viewers.ts +115 -0
- package/src/kit/asset-workflow/asset-import-jobs.ts +106 -0
- package/src/kit/asset-workflow/asset-ledger-backend.ts +126 -0
- package/src/kit/asset-workflow/asset-ledger.ts +156 -0
- package/src/kit/asset-workflow/asset-materialization-report.ts +140 -0
- package/src/kit/asset-workflow/asset-pack-manifest.ts +320 -0
- package/src/kit/asset-workflow/asset-types.ts +142 -0
- package/src/kit/asset-workflow/audio-preview-player.ts +193 -0
- package/src/kit/asset-workflow/audio-waveform.ts +22 -0
- package/src/kit/asset-workflow/cloud-asset-client.ts +263 -0
- package/src/kit/asset-workflow/hosted-asset-materialization.ts +236 -0
- package/src/kit/asset-workflow/image-view-scale.ts +31 -0
- package/src/kit/asset-workflow/import-contract.ts +124 -0
- package/src/kit/asset-workflow/ledger-write-lock.ts +244 -0
- package/src/kit/asset-workflow/pixi-spritesheet.ts +197 -0
- package/src/kit/asset-workflow/preview-resource-lifetime.ts +44 -0
- package/src/kit/asset-workflow/project-asset-commands.ts +20 -0
- package/src/kit/asset-workflow/project-content.ts +288 -0
- package/src/kit/asset-workflow/project-source-index.ts +545 -0
- package/src/kit/asset-workflow/thumbnail-system.ts +256 -0
- package/src/kit/authoring/active-adapter.ts +200 -0
- package/src/kit/authoring/active-systems.ts +422 -0
- package/src/kit/authoring/adapter-key.ts +18 -0
- package/src/kit/authoring/authoring-asset-url.ts +27 -0
- package/src/kit/authoring/bootstrap-state.ts +49 -0
- package/src/kit/authoring/boundary-authoring-adapter.ts +189 -0
- package/src/kit/authoring/canvas-scene-guides.ts +84 -0
- package/src/kit/authoring/composite-authoring-adapter.ts +2109 -0
- package/src/kit/authoring/consumer-actions.ts +531 -0
- package/src/kit/authoring/design-time-layers.ts +852 -0
- package/src/kit/authoring/design-time-mount-registry.ts +244 -0
- package/src/kit/authoring/edit-mode-authoring.ts +637 -0
- package/src/kit/authoring/empty-project-authoring.ts +22 -0
- package/src/kit/authoring/instance-source-menu.ts +135 -0
- package/src/kit/authoring/layered-pick.ts +185 -0
- package/src/kit/authoring/mounted-root-subjects.ts +146 -0
- package/src/kit/authoring/no-authoring-adapter.ts +59 -0
- package/src/kit/authoring/object3d-document-persistence.ts +122 -0
- package/src/kit/authoring/panel-authoring.ts +121 -0
- package/src/kit/authoring/project-authoring-session.ts +105 -0
- package/src/kit/authoring/provenance.ts +99 -0
- package/src/kit/authoring/react-canvas-navigation.ts +259 -0
- package/src/kit/authoring/react-design-canvas-style.ts +20 -0
- package/src/kit/authoring/react-story-board.ts +917 -0
- package/src/kit/authoring/selection-scope.ts +195 -0
- package/src/kit/authoring/shell-document-ops.ts +169 -0
- package/src/kit/authoring/story-board-chrome-fit.ts +107 -0
- package/src/kit/authoring/story-board-presentation.ts +111 -0
- package/src/kit/authoring/three-root.ts +67 -0
- package/src/kit/authoring/viewport-tool-context.ts +73 -0
- package/src/kit/authoring/viewport-tool-owner.ts +38 -0
- package/src/kit/authoring/world-session-state.ts +101 -0
- package/src/kit/authoring-seam-evidence.ts +300 -0
- package/src/kit/availability-tick.ts +66 -0
- package/src/kit/bitmap-label.ts +120 -0
- package/src/kit/boot-routing.ts +392 -0
- package/src/kit/breakpoint-state.ts +43 -0
- package/src/kit/build-identity.ts +16 -0
- package/src/kit/bytes-codec.ts +62 -0
- package/src/kit/cancellation-reason.ts +58 -0
- package/src/kit/canvas-frames.ts +88 -0
- package/src/kit/capture-camera-pose.ts +77 -0
- package/src/kit/capture-size.ts +88 -0
- package/src/kit/chrome-registry.ts +159 -0
- package/src/kit/chrome-slot-registry.ts +91 -0
- package/src/kit/collaboration-client.ts +264 -0
- package/src/kit/collaboration-presence.ts +41 -0
- package/src/kit/command-dispatch.ts +19 -0
- package/src/kit/command-listener.ts +2182 -0
- package/src/kit/command-registry.ts +71 -0
- package/src/kit/component-board-registry.ts +205 -0
- package/src/kit/component-states-registry.ts +199 -0
- package/src/kit/components/AlignToolbar.tsx +204 -0
- package/src/kit/components/ApplicationMenus.tsx +372 -0
- package/src/kit/components/AssetEditorShell.tsx +216 -0
- package/src/kit/components/AssetInspectorToolSection.tsx +124 -0
- package/src/kit/components/BoardRulers.tsx +354 -0
- package/src/kit/components/CanvasAddNodeDialogs.tsx +529 -0
- package/src/kit/components/CanvasSceneViewport.tsx +1195 -0
- package/src/kit/components/ChromeSlot.tsx +20 -0
- package/src/kit/components/CodeView.tsx +470 -0
- package/src/kit/components/CompactInspectorShell.tsx +39 -0
- package/src/kit/components/ConsolePanel.tsx +273 -0
- package/src/kit/components/GameplaySessionTimeline.tsx +295 -0
- package/src/kit/components/InspectionProjection.tsx +932 -0
- package/src/kit/components/Inspector.tsx +270 -0
- package/src/kit/components/InspectorCanvasPreview.tsx +35 -0
- package/src/kit/components/InspectorFieldsSection.tsx +290 -0
- package/src/kit/components/InspectorStoriesSection.tsx +92 -0
- package/src/kit/components/InspectorToolSection.tsx +96 -0
- package/src/kit/components/InspectorTransformSection.tsx +245 -0
- package/src/kit/components/LightExplorerPanel.tsx +433 -0
- package/src/kit/components/MediaProperties.tsx +145 -0
- package/src/kit/components/ProjectHeader.tsx +328 -0
- package/src/kit/components/ReactCanvasControls.tsx +358 -0
- package/src/kit/components/RootSelectionOverlay.tsx +3688 -0
- package/src/kit/components/RootTextEditor.tsx +79 -0
- package/src/kit/components/SaveStatus.tsx +70 -0
- package/src/kit/components/SurfaceCrashBoundary.tsx +105 -0
- package/src/kit/components/SurfaceStateOverlay.tsx +24 -0
- package/src/kit/components/ToolContributionSurfaces.tsx +49 -0
- package/src/kit/components/ToolHost.tsx +380 -0
- package/src/kit/components/Toolbar.tsx +811 -0
- package/src/kit/components/TransientHint.tsx +44 -0
- package/src/kit/components/VersionControlSection.tsx +470 -0
- package/src/kit/components/ViewportOverlaysMenu.tsx +177 -0
- package/src/kit/components/VolterLogo.tsx +18 -0
- package/src/kit/components/WorktreeSwitcher.tsx +712 -0
- package/src/kit/components/account-documents.tsx +1162 -0
- package/src/kit/components/asset-documents.tsx +794 -0
- package/src/kit/components/asset-editor-persistence.ts +216 -0
- package/src/kit/components/asset-selection-section.tsx +545 -0
- package/src/kit/components/asset-thumbnails.tsx +307 -0
- package/src/kit/components/asset-viewers/AudioViewer.tsx +201 -0
- package/src/kit/components/asset-viewers/GenericJsonViewer.tsx +102 -0
- package/src/kit/components/asset-viewers/ImageViewer.tsx +300 -0
- package/src/kit/components/asset-viewers/JsonAssetDocument.tsx +98 -0
- package/src/kit/components/asset-viewers/OnlineAssetDetail.tsx +426 -0
- package/src/kit/components/asset-viewers/SourceAssetViewer.tsx +356 -0
- package/src/kit/components/asset-viewers/SpritesheetSpriteView.tsx +102 -0
- package/src/kit/components/asset-viewers/VideoViewer.tsx +101 -0
- package/src/kit/components/asset-viewers/shader-source.ts +144 -0
- package/src/kit/components/board-guides.ts +150 -0
- package/src/kit/components/canvas-scene-hotkeys.ts +37 -0
- package/src/kit/components/canvas-temporary-pivot.ts +34 -0
- package/src/kit/components/core-utilities.tsx +94 -0
- package/src/kit/components/inspector-preview-section.tsx +223 -0
- package/src/kit/components/inspector-revert-label.ts +20 -0
- package/src/kit/components/inspector-selection.ts +42 -0
- package/src/kit/components/inspector-stories-gating.ts +171 -0
- package/src/kit/components/inspector-transform-subject.ts +11 -0
- package/src/kit/components/inspector-transform.ts +88 -0
- package/src/kit/components/kind-documents.tsx +544 -0
- package/src/kit/components/primitives/DraftColorInput.tsx +74 -0
- package/src/kit/components/project-tool-documents.tsx +402 -0
- package/src/kit/components/scene-documents.tsx +221 -0
- package/src/kit/components/status-contributions.tsx +407 -0
- package/src/kit/components/tool-documents.tsx +302 -0
- package/src/kit/components/tool-schema-form.tsx +262 -0
- package/src/kit/components/use-after-paint.ts +41 -0
- package/src/kit/components/use-project-image-assets.ts +86 -0
- package/src/kit/components/workspace-history.ts +32 -0
- package/src/kit/components/world-documents.tsx +570 -0
- package/src/kit/components/world-overlay-gestures.ts +1939 -0
- package/src/kit/composite-screenshot.ts +2238 -0
- package/src/kit/content-entry-source-registry.ts +184 -0
- package/src/kit/contribution-surfaces.ts +48 -0
- package/src/kit/coverage/canvas-reveal.ts +192 -0
- package/src/kit/coverage/design-time-surfaces.ts +101 -0
- package/src/kit/coverage/ontology-invariants.ts +466 -0
- package/src/kit/coverage/session-vitals.ts +503 -0
- package/src/kit/crash-null-boundary.ts +36 -0
- package/src/kit/creation-site-edit.ts +1491 -0
- package/src/kit/creation-site-registry.ts +160 -0
- package/src/kit/delegate-harness-registry.ts +134 -0
- package/src/kit/document-areas.ts +70 -0
- package/src/kit/document-context-registry.ts +193 -0
- package/src/kit/document-open-registry.ts +200 -0
- package/src/kit/document-play-extension.ts +221 -0
- package/src/kit/document-preview-source.ts +20 -0
- package/src/kit/document-renderer-session.ts +138 -0
- package/src/kit/document-stage-sessions.ts +26 -0
- package/src/kit/document-viewports.ts +120 -0
- package/src/kit/editor-api.ts +46 -0
- package/src/kit/editor-chrome-capture.ts +136 -0
- package/src/kit/editor-commands.ts +176 -0
- package/src/kit/editor-console.ts +580 -0
- package/src/kit/editor-current-view.ts +56 -0
- package/src/kit/editor-document-probe.ts +1166 -0
- package/src/kit/editor-git-client.ts +115 -0
- package/src/kit/editor-hotkeys.ts +728 -0
- package/src/kit/editor-lease-view.ts +39 -0
- package/src/kit/editor-lease.ts +415 -0
- package/src/kit/editor-mode.ts +19 -0
- package/src/kit/editor-notifications.ts +140 -0
- package/src/kit/editor-presence.ts +563 -0
- package/src/kit/editor-presentation-activity.ts +58 -0
- package/src/kit/editor-presentation-notice.ts +42 -0
- package/src/kit/editor-runtime.tsx +147 -0
- package/src/kit/editor-server-response.ts +86 -0
- package/src/kit/editor-session-attribution.ts +85 -0
- package/src/kit/editor-session-mode.ts +54 -0
- package/src/kit/editor-state-facets.ts +74 -0
- package/src/kit/editor-view-presentation.ts +777 -0
- package/src/kit/environment-images.ts +58 -0
- package/src/kit/eyedropper-session.ts +60 -0
- package/src/kit/files/file-provider.ts +62 -0
- package/src/kit/files/project-files.ts +270 -0
- package/src/kit/finders/index.ts +137 -0
- package/src/kit/finders/scenes-from-entrypoint-selection.ts +387 -0
- package/src/kit/frame/frame-parts.ts +30 -0
- package/src/kit/framed-document-capture.ts +34 -0
- package/src/kit/game-globals-prelude.ts +143 -0
- package/src/kit/game-surface-defaults.ts +33 -0
- package/src/kit/gameplay-dom-recording.ts +318 -0
- package/src/kit/gameplay-export-state.ts +14 -0
- package/src/kit/gameplay-replay.ts +417 -0
- package/src/kit/gameplay-session-time.ts +9 -0
- package/src/kit/gameplay-sessions.ts +204 -0
- package/src/kit/hierarchy-component-marks.ts +298 -0
- package/src/kit/hierarchy-internals.ts +197 -0
- package/src/kit/hierarchy-kind-icon.ts +217 -0
- package/src/kit/hierarchy-menu-registry.ts +67 -0
- package/src/kit/hierarchy-node-rows.ts +307 -0
- package/src/kit/hierarchy-panel-view.ts +280 -0
- package/src/kit/hierarchy-projection.ts +76 -0
- package/src/kit/hierarchy-row-media.ts +45 -0
- package/src/kit/hierarchy-row-model.ts +308 -0
- package/src/kit/hierarchy-rows.ts +11 -0
- package/src/kit/hierarchy-walk.ts +86 -0
- package/src/kit/history/editor-session.ts +25 -0
- package/src/kit/history/history-commands.ts +147 -0
- package/src/kit/history/history-delegate.ts +187 -0
- package/src/kit/history/history-limit-notices.ts +43 -0
- package/src/kit/history/history-service.ts +1189 -0
- package/src/kit/history/persistence-coordinator.ts +35 -0
- package/src/kit/history/project-file-history.ts +386 -0
- package/src/kit/history/project-root-history-backends.ts +139 -0
- package/src/kit/history/resource-registry.ts +209 -0
- package/src/kit/history/snapshot-store.ts +103 -0
- package/src/kit/history/source-history-backend.ts +546 -0
- package/src/kit/history-types.ts +124 -0
- package/src/kit/hmr-registration-group.ts +67 -0
- package/src/kit/hmr-stable-react-context.ts +23 -0
- package/src/kit/hotkeys.ts +190 -0
- package/src/kit/inference-diagnostics.ts +69 -0
- package/src/kit/initial-project.ts +80 -0
- package/src/kit/inspection/active-subject.ts +571 -0
- package/src/kit/inspection/active-surface.ts +142 -0
- package/src/kit/inspection/compose-subject.ts +1055 -0
- package/src/kit/inspection/compose.ts +7 -0
- package/src/kit/inspection/display.ts +171 -0
- package/src/kit/inspection/document-subject.ts +109 -0
- package/src/kit/inspection/game-subject.ts +85 -0
- package/src/kit/inspection/null-subject.ts +119 -0
- package/src/kit/inspection/serialize.ts +357 -0
- package/src/kit/inspection/use-active-inspection.ts +180 -0
- package/src/kit/inspection-model.ts +542 -0
- package/src/kit/inspection-node-media.ts +58 -0
- package/src/kit/inspector-presentation.ts +203 -0
- package/src/kit/inspector-property-grouping.ts +64 -0
- package/src/kit/inspector-section-registry.ts +221 -0
- package/src/kit/instance-source-actions.ts +163 -0
- package/src/kit/js-heap.ts +71 -0
- package/src/kit/key-actions.ts +91 -0
- package/src/kit/keymap-presets.ts +428 -0
- package/src/kit/layout-policy.ts +31 -0
- package/src/kit/light-explorer-model.ts +134 -0
- package/src/kit/live-canvas-frame.ts +55 -0
- package/src/kit/live-document.ts +296 -0
- package/src/kit/live-gesture-lock.ts +50 -0
- package/src/kit/live-seam-evidence.ts +11 -0
- package/src/kit/live-session-registry.ts +220 -0
- package/src/kit/live-transition.ts +391 -0
- package/src/kit/manifest-project.ts +107 -0
- package/src/kit/module-fetch-diagnosis.ts +192 -0
- package/src/kit/mount-failure-report.ts +154 -0
- package/src/kit/native-selection-style.ts +497 -0
- package/src/kit/object3d-document-write-policy.ts +137 -0
- package/src/kit/packaged-runtime.ts +108 -0
- package/src/kit/palettes/maya.palette.json +57 -0
- package/src/kit/palettes/substance.palette.json +57 -0
- package/src/kit/performance-profiler.ts +367 -0
- package/src/kit/performance-sources.ts +69 -0
- package/src/kit/photograph-notice.ts +141 -0
- package/src/kit/play-boot-phase.ts +166 -0
- package/src/kit/play-camera-flight.ts +35 -0
- package/src/kit/png-encode.worker.ts +26 -0
- package/src/kit/presentation-surface.ts +248 -0
- package/src/kit/product-command.ts +90 -0
- package/src/kit/project-adapter.ts +1140 -0
- package/src/kit/project-asset-refresh.ts +23 -0
- package/src/kit/project-asset-roots.ts +68 -0
- package/src/kit/project-local-state.ts +151 -0
- package/src/kit/project-manager.ts +243 -0
- package/src/kit/project-module-changes.ts +201 -0
- package/src/kit/project-module-split.ts +270 -0
- package/src/kit/project-play-layers.ts +25 -0
- package/src/kit/project-provenance.ts +115 -0
- package/src/kit/project-ready.ts +42 -0
- package/src/kit/project-shape.ts +68 -0
- package/src/kit/project-tools.ts +107 -0
- package/src/kit/projection-types.ts +44 -0
- package/src/kit/readiness.ts +113 -0
- package/src/kit/renderer-resource-counts.ts +27 -0
- package/src/kit/reported-play-state.ts +90 -0
- package/src/kit/resolve-contributed-command.ts +14 -0
- package/src/kit/resolve-relative-specifier.ts +33 -0
- package/src/kit/retained-document-states.ts +91 -0
- package/src/kit/scene-document-plan.ts +320 -0
- package/src/kit/scene-live-open.ts +210 -0
- package/src/kit/scoped-game-css.ts +152 -0
- package/src/kit/served-url.ts +5 -0
- package/src/kit/session-close.ts +17 -0
- package/src/kit/session-tombstone.ts +127 -0
- package/src/kit/settings/settings-provider.ts +82 -0
- package/src/kit/settings-store.ts +348 -0
- package/src/kit/shell-document-state.ts +27 -0
- package/src/kit/shell-store-door.ts +45 -0
- package/src/kit/shell-store.ts +722 -0
- package/src/kit/source-conflict.ts +122 -0
- package/src/kit/stage-context.ts +377 -0
- package/src/kit/stage-invalidation.ts +25 -0
- package/src/kit/stage-store-registry.ts +69 -0
- package/src/kit/startup-failure.ts +80 -0
- package/src/kit/state-report-deferral.ts +73 -0
- package/src/kit/storage/host-files-storage.ts +97 -0
- package/src/kit/storage/http-storage.ts +174 -0
- package/src/kit/storage/index.ts +75 -0
- package/src/kit/storage/mem-storage.ts +158 -0
- package/src/kit/storage/path-lock.ts +44 -0
- package/src/kit/storage/paths.ts +26 -0
- package/src/kit/storage-types.ts +127 -0
- package/src/kit/stories/StoryPreviewMount.tsx +306 -0
- package/src/kit/stories/compose-project-stories.ts +255 -0
- package/src/kit/stories/prefabs-finder.ts +54 -0
- package/src/kit/stories/prefabs-from-stories.ts +182 -0
- package/src/kit/stories/project-story-regions.ts +24 -0
- package/src/kit/stories/story-capture.ts +579 -0
- package/src/kit/stories/story-declared-medium.ts +126 -0
- package/src/kit/stories/story-discovery.ts +176 -0
- package/src/kit/stories/story-dom-runtime.ts +78 -0
- package/src/kit/stories/story-grouping.ts +111 -0
- package/src/kit/stories/story-mount-turn.ts +27 -0
- package/src/kit/stories/story-presentation.ts +215 -0
- package/src/kit/stories/story-preview-component.ts +7 -0
- package/src/kit/stories/story-registry.ts +530 -0
- package/src/kit/stories-scope.ts +35 -0
- package/src/kit/story-document-openers.ts +36 -0
- package/src/kit/story-thumbnails.ts +47 -0
- package/src/kit/surface-keyboard.ts +101 -0
- package/src/kit/surface-state.ts +135 -0
- package/src/kit/system-seam-evidence.ts +72 -0
- package/src/kit/tab-census.ts +202 -0
- package/src/kit/tab-lifecycle-client.ts +227 -0
- package/src/kit/theme-library.ts +897 -0
- package/src/kit/theme-preference.ts +429 -0
- package/src/kit/three-viewport-presentation.ts +23 -0
- package/src/kit/tool-contribution-play.ts +74 -0
- package/src/kit/tool-loader.ts +1918 -0
- package/src/kit/transform-mode-request.ts +66 -0
- package/src/kit/transient-hint.ts +78 -0
- package/src/kit/transport-strip.tsx +174 -0
- package/src/kit/ui-source/adapter-region-includes.ts +238 -0
- package/src/kit/ui-source/file-region-resolver.ts +302 -0
- package/src/kit/ui-source/inspect.ts +775 -0
- package/src/kit/ui-source/source-write-backend.ts +605 -0
- package/src/kit/ui-source/tier-source-write-backend.ts +279 -0
- package/src/kit/user-local-state.ts +105 -0
- package/src/kit/viewport-activation-timings.ts +840 -0
- package/src/kit/viewport-editor-controls.ts +22 -0
- package/src/kit/viewport-presentation.ts +668 -0
- package/src/kit/viewport-surface-status.tsx +55 -0
- package/src/kit/wait-until.ts +37 -0
- package/src/kit/worker-call-metrics.ts +166 -0
- package/src/kit/workspace-areas.ts +191 -0
- package/src/kit/workspace-aux-commands.ts +11 -0
- package/src/kit/workspace-available-documents.ts +142 -0
- package/src/kit/workspace-core-utilities.ts +31 -0
- package/src/kit/workspace-document-ids.ts +59 -0
- package/src/kit/workspace-document-registry.ts +624 -0
- package/src/kit/workspace-document-restore.ts +146 -0
- package/src/kit/workspace-host-commands.ts +141 -0
- package/src/kit/workspace-persistence-gate.ts +40 -0
- package/src/kit/workspace-play-utilities.ts +44 -0
- package/src/kit/workspace-presets.ts +446 -0
- package/src/kit/workspace-regions.ts +276 -0
- package/src/kit/workspace-static-panels.ts +73 -0
- package/src/kit/workspace-status-registry.ts +121 -0
- package/src/kit/workspace-storage.ts +35 -0
- package/src/kit/workspace-style.ts +226 -0
- package/src/kit/workspace-utility-commands.ts +74 -0
- package/src/kit/workspace-utility-registry.ts +263 -0
- package/src/kit/world-adoption-event.ts +23 -0
- package/src/kit/world-adoption.ts +115 -0
- package/src/kit/world-canvas-viewport-state.ts +35 -0
- package/src/kit/world-document-routing.ts +104 -0
- package/src/kit/world-pan-state.ts +198 -0
- package/src/kit/write-pipe.ts +173 -0
- package/src/layout-arrangements.ts +5 -0
- package/src/layouts.tsx +108 -0
- package/src/looks.ts +16 -0
- package/src/project/output-roots.ts +73 -0
- package/src/project/tab-census.ts +155 -0
- package/src/project-tool-catalog.ts +104 -0
- package/src/selection.tsx +107 -0
- package/src/services.ts +18 -0
- package/src/session/build-report.ts +22 -0
- package/src/session/collaboration-types.ts +262 -0
- package/src/session/command-table.ts +327 -0
- package/src/session/discovery.ts +100 -0
- package/src/session/editor-brand.ts +48 -0
- package/src/session/editor-compatibility.ts +317 -0
- package/src/session/editor-control-lifecycle.ts +68 -0
- package/src/session/editor-control-protocol.ts +5 -0
- package/src/session/entrypoint-selection-readers.ts +66 -0
- package/src/session/entrypoint-selection-source.ts +120 -0
- package/src/session/game-css-scope.ts +30 -0
- package/src/session/hosted-attachment.ts +225 -0
- package/src/session/limited-view.ts +82 -0
- package/src/session/product-create.ts +24 -0
- package/src/session/product-locator.ts +478 -0
- package/src/session/project-module-url.ts +242 -0
- package/src/session/project-serving.ts +164 -0
- package/src/session/project-upgrade.ts +403 -0
- package/src/session/registry-format.ts +210 -0
- package/src/session/relative-path-guard.ts +56 -0
- package/src/session/scoped-game-css.ts +461 -0
- package/src/session/source-glob.ts +15 -0
- package/src/session/tool-contribution-convention.ts +123 -0
- package/src/session/workbench-locator.ts +712 -0
- package/src/session.ts +41 -0
- package/src/share.ts +160 -0
- package/src/source-analysis.ts +28 -0
- package/src/source-authoring.ts +439 -0
- package/src/tools/errors.ts +91 -0
- package/src/tools/provider-execution.ts +70 -0
- package/src/tools/registry.ts +341 -0
- package/src/tools/types.ts +159 -0
- package/src/transport.ts +100 -0
- package/src/types.ts +1693 -0
- package/src/views.ts +164 -0
- package/src/widgets/design-system.ts +93 -0
- package/src/widgets/editor-appearance.ts +151 -0
- package/src/widgets/editor-material.ts +83 -0
- package/src/widgets/icon-set-registry.ts +105 -0
- package/src/widgets/index.ts +71 -0
- package/src/widgets/inspector-widgets/AlignmentGrid.tsx +182 -0
- package/src/widgets/inspector-widgets/AssetSlotPicker.tsx +123 -0
- package/src/widgets/inspector-widgets/BorderEditor.tsx +309 -0
- package/src/widgets/inspector-widgets/ColorPicker.tsx +549 -0
- package/src/widgets/inspector-widgets/CurveEditor.tsx +359 -0
- package/src/widgets/inspector-widgets/FilterEditor.tsx +108 -0
- package/src/widgets/inspector-widgets/FontPicker.tsx +191 -0
- package/src/widgets/inspector-widgets/GradientEditor.tsx +623 -0
- package/src/widgets/inspector-widgets/ScrubbableInput.tsx +180 -0
- package/src/widgets/inspector-widgets/ShadowEditor.tsx +319 -0
- package/src/widgets/inspector-widgets/color-utils.ts +201 -0
- package/src/widgets/inspector-widgets/curve-utils.ts +212 -0
- package/src/widgets/inspector-widgets/index.ts +25 -0
- package/src/widgets/inspector-widgets/shared.tsx +140 -0
- package/src/widgets/interactive-edit-scope.ts +33 -0
- package/src/widgets/patterns/Dialog.tsx +140 -0
- package/src/widgets/patterns/Fields.tsx +44 -0
- package/src/widgets/patterns/List.tsx +25 -0
- package/src/widgets/patterns/StateSurface.tsx +40 -0
- package/src/widgets/patterns/Surfaces.tsx +122 -0
- package/src/widgets/patterns/Tabs.tsx +80 -0
- package/src/widgets/patterns/Toolbar.tsx +72 -0
- package/src/widgets/patterns/Tree.tsx +72 -0
- package/src/widgets/primitives/AnchoredMenu.tsx +260 -0
- package/src/widgets/primitives/Button.tsx +62 -0
- package/src/widgets/primitives/ColorInput.tsx +78 -0
- package/src/widgets/primitives/DraftTextInput.tsx +63 -0
- package/src/widgets/primitives/EditorIcon.tsx +157 -0
- package/src/widgets/primitives/FormControls.tsx +88 -0
- package/src/widgets/primitives/HoverPreview.tsx +96 -0
- package/src/widgets/primitives/JsonInput.tsx +113 -0
- package/src/widgets/primitives/Layout.tsx +100 -0
- package/src/widgets/primitives/Menu.tsx +161 -0
- package/src/widgets/primitives/NumberInput.tsx +169 -0
- package/src/widgets/primitives/Panel.tsx +80 -0
- package/src/widgets/primitives/SectionHeader.tsx +77 -0
- package/src/widgets/primitives/Text.tsx +54 -0
- package/src/widgets/primitives/ThemeRootPortal.tsx +52 -0
- package/src/widgets/primitives/Tooltip.tsx +204 -0
- package/src/widgets/primitives/Vec3Input.tsx +70 -0
- package/src/widgets/primitives/banner-tones.ts +32 -0
- package/src/widgets/primitives/clamp-to-viewport.ts +44 -0
- package/src/widgets/primitives/editor-icons.ts +254 -0
- package/src/widgets/primitives/panel-header-styles.ts +42 -0
- package/src/widgets/theme.ts +2841 -0
- package/src/widgets/z-index.ts +25 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** Renders whatever a package registered for a chrome slot
|
|
2
|
+
* (`chrome-slot-registry.ts`), and nothing when nothing did. */
|
|
3
|
+
|
|
4
|
+
import { useSyncExternalStore } from 'react';
|
|
5
|
+
import {
|
|
6
|
+
chromeSlotFillers,
|
|
7
|
+
chromeSlotRegistryVersion,
|
|
8
|
+
subscribeChromeSlots,
|
|
9
|
+
} from '../chrome-slot-registry';
|
|
10
|
+
|
|
11
|
+
export function ChromeSlot({ slot }: { readonly slot: string }) {
|
|
12
|
+
useSyncExternalStore(subscribeChromeSlots, chromeSlotRegistryVersion, chromeSlotRegistryVersion);
|
|
13
|
+
return (
|
|
14
|
+
<>
|
|
15
|
+
{chromeSlotFillers(slot).map((filler) => (
|
|
16
|
+
<filler.Content key={filler.owner} />
|
|
17
|
+
))}
|
|
18
|
+
</>
|
|
19
|
+
);
|
|
20
|
+
}
|
|
@@ -0,0 +1,470 @@
|
|
|
1
|
+
import { themeVars } from '@volter/sdk/widgets';
|
|
2
|
+
import { useEffect, useRef, useState } from 'react';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The editor's ONE read-only code display surface (CodeMirror 6).
|
|
6
|
+
*
|
|
7
|
+
* Every door that opens a project's own source text renders through this —
|
|
8
|
+
* `SourceAssetViewer`'s text route and the generic JSON viewer today. It is a
|
|
9
|
+
* VIEWER: `EditorState.readOnly` + `EditorView.editable(false)`, so nothing
|
|
10
|
+
* here ever writes a game's file. Doors that already own an editing surface
|
|
11
|
+
* keep theirs.
|
|
12
|
+
*
|
|
13
|
+
* ## Why the pieces are imported individually, not `codemirror`
|
|
14
|
+
*
|
|
15
|
+
* The `codemirror` meta-package exports exactly three things — `EditorView`,
|
|
16
|
+
* `basicSetup`, `minimalSetup` — and its own docblock says that the moment you
|
|
17
|
+
* want to configure precisely, you compose the sub-packages yourself. We do:
|
|
18
|
+
* `basicSetup` bundles autocompletion, close-brackets, undo history, lint and
|
|
19
|
+
* ACTIVE-LINE highlighting, all of which are either inert or wrong in a
|
|
20
|
+
* viewer, and it is explicitly not customizable.
|
|
21
|
+
*
|
|
22
|
+
* ## Why it is lazy
|
|
23
|
+
*
|
|
24
|
+
* CodeMirror + the JS/JSON grammars are ~400 kB of source that only a user who
|
|
25
|
+
* opens a source or JSON asset ever needs, so the whole kit sits behind a
|
|
26
|
+
* dynamic import (same reason `game-realm-page.ts` defers postcss). Until the
|
|
27
|
+
* chunk lands the raw text renders in a plain `<pre>`, so content is never
|
|
28
|
+
* withheld waiting on a network round trip — a long file is readable
|
|
29
|
+
* immediately and simply gains highlighting a beat later.
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
export type CodeViewLanguage = 'typescript' | 'json' | 'text';
|
|
33
|
+
|
|
34
|
+
const LANGUAGE_BY_EXTENSION: Readonly<Record<string, CodeViewLanguage>> = {
|
|
35
|
+
ts: 'typescript',
|
|
36
|
+
tsx: 'typescript',
|
|
37
|
+
mts: 'typescript',
|
|
38
|
+
cts: 'typescript',
|
|
39
|
+
js: 'typescript',
|
|
40
|
+
jsx: 'typescript',
|
|
41
|
+
mjs: 'typescript',
|
|
42
|
+
cjs: 'typescript',
|
|
43
|
+
json: 'json',
|
|
44
|
+
jsonc: 'json',
|
|
45
|
+
json5: 'json',
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
/** Language for a file path's extension; anything unrecognized reads as text. */
|
|
49
|
+
export function codeViewLanguage(path: string): CodeViewLanguage {
|
|
50
|
+
const name = path.split('/').pop() ?? path;
|
|
51
|
+
const dot = name.lastIndexOf('.');
|
|
52
|
+
if (dot < 0) return 'text';
|
|
53
|
+
return LANGUAGE_BY_EXTENSION[name.slice(dot + 1).toLowerCase()] ?? 'text';
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
type CodeMirrorKit = {
|
|
57
|
+
readonly state: typeof import('@codemirror/state');
|
|
58
|
+
readonly view: typeof import('@codemirror/view');
|
|
59
|
+
readonly language: typeof import('@codemirror/language');
|
|
60
|
+
readonly search: typeof import('@codemirror/search');
|
|
61
|
+
readonly commands: typeof import('@codemirror/commands');
|
|
62
|
+
readonly javascript: typeof import('@codemirror/lang-javascript');
|
|
63
|
+
readonly json: typeof import('@codemirror/lang-json');
|
|
64
|
+
readonly oneDark: typeof import('@codemirror/theme-one-dark');
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
let kitPromise: Promise<CodeMirrorKit> | null = null;
|
|
68
|
+
|
|
69
|
+
/** Loads (once per session) the CodeMirror chunk shared by every code view. */
|
|
70
|
+
function loadCodeMirror(): Promise<CodeMirrorKit> {
|
|
71
|
+
kitPromise ??= Promise.all([
|
|
72
|
+
import('@codemirror/state'),
|
|
73
|
+
import('@codemirror/view'),
|
|
74
|
+
import('@codemirror/language'),
|
|
75
|
+
import('@codemirror/search'),
|
|
76
|
+
import('@codemirror/commands'),
|
|
77
|
+
import('@codemirror/lang-javascript'),
|
|
78
|
+
import('@codemirror/lang-json'),
|
|
79
|
+
import('@codemirror/theme-one-dark'),
|
|
80
|
+
]).then(([state, view, language, search, commands, javascript, json, oneDark]) => ({
|
|
81
|
+
state,
|
|
82
|
+
view,
|
|
83
|
+
language,
|
|
84
|
+
search,
|
|
85
|
+
commands,
|
|
86
|
+
javascript,
|
|
87
|
+
json,
|
|
88
|
+
oneDark,
|
|
89
|
+
}));
|
|
90
|
+
return kitPromise;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function cssLength(value: number | string): string {
|
|
94
|
+
return typeof value === 'number' ? `${value}px` : value;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Chrome drawn from the editor's OWN theme variables — every editor theme is
|
|
99
|
+
* dark, so one-dark supplies the token ramp (`oneDarkHighlightStyle`) while the
|
|
100
|
+
* surface, gutter, selection, and search-panel colors come from `themeVars` so
|
|
101
|
+
* the view sits inside a panel without announcing itself as foreign chrome.
|
|
102
|
+
* The background is deliberately transparent: the calling door owns its well.
|
|
103
|
+
*/
|
|
104
|
+
/**
|
|
105
|
+
* A PERCENTAGE `maxHeight` means "fill the box you are in".
|
|
106
|
+
*
|
|
107
|
+
* CodeMirror sizes itself to its content unless the editor element is given a
|
|
108
|
+
* definite height, so `max-height: 100%` on the scroller alone resolves against
|
|
109
|
+
* an auto-height ancestor and does nothing. A percentage therefore also puts a
|
|
110
|
+
* `height` on `.cm-editor` (and on the host element), which is CodeMirror's own
|
|
111
|
+
* documented spelling for a filling editor. A pixel `maxHeight` keeps the
|
|
112
|
+
* flow-to-content behaviour every existing caller relies on.
|
|
113
|
+
*/
|
|
114
|
+
function fillsItsBox(maxHeight: number | string | undefined): maxHeight is string {
|
|
115
|
+
return typeof maxHeight === 'string' && maxHeight.trim().endsWith('%');
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/** Source updates are transactions, so their cue follows the same document. */
|
|
119
|
+
function changedSourceRange(previous: string, value: string) {
|
|
120
|
+
let from = 0;
|
|
121
|
+
while (from < previous.length && from < value.length && previous[from] === value[from]) from++;
|
|
122
|
+
let oldEnd = previous.length;
|
|
123
|
+
let newEnd = value.length;
|
|
124
|
+
while (oldEnd > from && newEnd > from && previous[oldEnd - 1] === value[newEnd - 1]) {
|
|
125
|
+
oldEnd--;
|
|
126
|
+
newEnd--;
|
|
127
|
+
}
|
|
128
|
+
return { from, oldEnd, newEnd };
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const SOURCE_CHANGE_DURATION_MS = 1800;
|
|
132
|
+
const sourceChangeBackground = `color-mix(in srgb, ${themeVars.semantic.warning} 42%, transparent)`;
|
|
133
|
+
const sourceChangeLineBackground = `color-mix(in srgb, ${themeVars.semantic.warning} 18%, transparent)`;
|
|
134
|
+
|
|
135
|
+
function createChangeHighlight(kit: CodeMirrorKit) {
|
|
136
|
+
// Deleted text has no surviving range. Mark its boundary without coloring
|
|
137
|
+
// an unchanged neighbour or adding width to the source line.
|
|
138
|
+
class DeletionCue extends kit.view.WidgetType {
|
|
139
|
+
constructor(readonly revision: number) {
|
|
140
|
+
super();
|
|
141
|
+
}
|
|
142
|
+
eq(other: DeletionCue) {
|
|
143
|
+
return this.revision === other.revision;
|
|
144
|
+
}
|
|
145
|
+
toDOM() {
|
|
146
|
+
const element = document.createElement('span');
|
|
147
|
+
element.className = `cm-source-deletion cm-source-change cm-source-change-${this.revision % 2}`;
|
|
148
|
+
element.setAttribute('aria-hidden', 'true');
|
|
149
|
+
return element;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
const mark = kit.state.StateEffect.define<{
|
|
153
|
+
from: number;
|
|
154
|
+
to: number;
|
|
155
|
+
revision: number;
|
|
156
|
+
} | null>();
|
|
157
|
+
const field = kit.state.StateField.define<import('@codemirror/view').DecorationSet>({
|
|
158
|
+
create: () => kit.view.Decoration.none,
|
|
159
|
+
update(decorations, transaction) {
|
|
160
|
+
let next = decorations.map(transaction.changes);
|
|
161
|
+
for (const effect of transaction.effects) {
|
|
162
|
+
if (!effect.is(mark)) continue;
|
|
163
|
+
if (!effect.value) {
|
|
164
|
+
next = kit.view.Decoration.none;
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
const { from, to, revision } = effect.value;
|
|
168
|
+
const decoration =
|
|
169
|
+
from === to
|
|
170
|
+
? kit.view.Decoration.widget({ widget: new DeletionCue(revision), side: -1 }).range(
|
|
171
|
+
from,
|
|
172
|
+
)
|
|
173
|
+
: kit.view.Decoration.mark({
|
|
174
|
+
class: `cm-source-change cm-source-change-${revision % 2}`,
|
|
175
|
+
}).range(from, to);
|
|
176
|
+
next = kit.view.Decoration.set([decoration]);
|
|
177
|
+
}
|
|
178
|
+
return next;
|
|
179
|
+
},
|
|
180
|
+
provide: (value) => kit.view.EditorView.decorations.from(value),
|
|
181
|
+
});
|
|
182
|
+
return { mark, field };
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
function codeViewTheme(
|
|
186
|
+
kit: CodeMirrorKit,
|
|
187
|
+
fontSize: number,
|
|
188
|
+
maxHeight: number | string | undefined,
|
|
189
|
+
) {
|
|
190
|
+
return kit.view.EditorView.theme(
|
|
191
|
+
{
|
|
192
|
+
'&': {
|
|
193
|
+
color: themeVars.content.primary,
|
|
194
|
+
backgroundColor: 'transparent',
|
|
195
|
+
fontSize: `${fontSize}px`,
|
|
196
|
+
...(fillsItsBox(maxHeight) ? { height: cssLength(maxHeight) } : {}),
|
|
197
|
+
},
|
|
198
|
+
'&.cm-focused': { outline: 'none' },
|
|
199
|
+
'.cm-content': {
|
|
200
|
+
fontFamily: themeVars.typography.mono,
|
|
201
|
+
padding: '2px 0',
|
|
202
|
+
caretColor: 'transparent',
|
|
203
|
+
},
|
|
204
|
+
'.cm-scroller': {
|
|
205
|
+
fontFamily: themeVars.typography.mono,
|
|
206
|
+
lineHeight: '1.5',
|
|
207
|
+
overflow: 'auto',
|
|
208
|
+
...(maxHeight === undefined ? {} : { maxHeight: cssLength(maxHeight) }),
|
|
209
|
+
},
|
|
210
|
+
'.cm-gutters': {
|
|
211
|
+
backgroundColor: 'transparent',
|
|
212
|
+
color: themeVars.content.dim,
|
|
213
|
+
border: 'none',
|
|
214
|
+
userSelect: 'none',
|
|
215
|
+
},
|
|
216
|
+
'.cm-lineNumbers .cm-gutterElement': { padding: '0 8px 0 4px', minWidth: '2ch' },
|
|
217
|
+
'.cm-content ::selection': { backgroundColor: themeVars.selection.background },
|
|
218
|
+
'.cm-panels': {
|
|
219
|
+
backgroundColor: themeVars.surface.raised,
|
|
220
|
+
color: themeVars.content.primary,
|
|
221
|
+
border: 'none',
|
|
222
|
+
fontFamily: themeVars.typography.sans,
|
|
223
|
+
},
|
|
224
|
+
'.cm-panels.cm-panels-top': { borderBottom: `1px solid ${themeVars.boundary.default}` },
|
|
225
|
+
'.cm-textfield': {
|
|
226
|
+
backgroundColor: themeVars.surface.inset,
|
|
227
|
+
color: themeVars.content.primary,
|
|
228
|
+
border: `1px solid ${themeVars.boundary.default}`,
|
|
229
|
+
borderRadius: themeVars.shape.small,
|
|
230
|
+
},
|
|
231
|
+
'.cm-button': {
|
|
232
|
+
backgroundColor: themeVars.surface.raised,
|
|
233
|
+
backgroundImage: 'none',
|
|
234
|
+
color: themeVars.content.primary,
|
|
235
|
+
border: `1px solid ${themeVars.boundary.default}`,
|
|
236
|
+
borderRadius: themeVars.shape.small,
|
|
237
|
+
},
|
|
238
|
+
'.cm-searchMatch': { backgroundColor: themeVars.accent.muted },
|
|
239
|
+
'.cm-searchMatch.cm-searchMatch-selected': {
|
|
240
|
+
backgroundColor: themeVars.accent.default,
|
|
241
|
+
color: themeVars.content.onAccent,
|
|
242
|
+
},
|
|
243
|
+
'.cm-source-change': {
|
|
244
|
+
backgroundColor: sourceChangeBackground,
|
|
245
|
+
borderRadius: '2px',
|
|
246
|
+
},
|
|
247
|
+
'.cm-line:has(.cm-source-change)': {
|
|
248
|
+
backgroundColor: sourceChangeLineBackground,
|
|
249
|
+
},
|
|
250
|
+
'.cm-source-change, .cm-line:has(.cm-source-change)': {
|
|
251
|
+
animationDuration: `${SOURCE_CHANGE_DURATION_MS}ms`,
|
|
252
|
+
animationTimingFunction: 'ease-out',
|
|
253
|
+
animationFillMode: 'forwards',
|
|
254
|
+
},
|
|
255
|
+
'.cm-source-deletion': {
|
|
256
|
+
display: 'inline-block',
|
|
257
|
+
width: '0',
|
|
258
|
+
position: 'relative',
|
|
259
|
+
},
|
|
260
|
+
'.cm-source-deletion::after': {
|
|
261
|
+
content: '""',
|
|
262
|
+
position: 'absolute',
|
|
263
|
+
left: '-2px',
|
|
264
|
+
bottom: '0',
|
|
265
|
+
width: '4px',
|
|
266
|
+
height: '1em',
|
|
267
|
+
backgroundColor: 'inherit',
|
|
268
|
+
borderRadius: '2px',
|
|
269
|
+
},
|
|
270
|
+
'.cm-source-change-0': { animationName: 'volter-source-change-even' },
|
|
271
|
+
'.cm-source-change-1': { animationName: 'volter-source-change-odd' },
|
|
272
|
+
'.cm-line:has(.cm-source-change-0)': { animationName: 'volter-source-line-even' },
|
|
273
|
+
'.cm-line:has(.cm-source-change-1)': { animationName: 'volter-source-line-odd' },
|
|
274
|
+
'@keyframes volter-source-line-even': {
|
|
275
|
+
'0%, 40%': { backgroundColor: sourceChangeLineBackground },
|
|
276
|
+
'100%': { backgroundColor: 'transparent' },
|
|
277
|
+
},
|
|
278
|
+
'@keyframes volter-source-line-odd': {
|
|
279
|
+
'0%, 40%': { backgroundColor: sourceChangeLineBackground },
|
|
280
|
+
'100%': { backgroundColor: 'transparent' },
|
|
281
|
+
},
|
|
282
|
+
'@keyframes volter-source-change-even': {
|
|
283
|
+
'0%, 40%': { backgroundColor: sourceChangeBackground },
|
|
284
|
+
'100%': { backgroundColor: 'transparent' },
|
|
285
|
+
},
|
|
286
|
+
'@keyframes volter-source-change-odd': {
|
|
287
|
+
'0%, 40%': { backgroundColor: sourceChangeBackground },
|
|
288
|
+
'100%': { backgroundColor: 'transparent' },
|
|
289
|
+
},
|
|
290
|
+
'@media (prefers-reduced-motion: reduce)': {
|
|
291
|
+
'.cm-source-change, .cm-line:has(.cm-source-change)': { animation: 'none' },
|
|
292
|
+
},
|
|
293
|
+
'.cm-matchingBracket, &.cm-focused .cm-matchingBracket': {
|
|
294
|
+
backgroundColor: themeVars.neutralOverlay.active,
|
|
295
|
+
outline: `1px solid ${themeVars.boundary.strong}`,
|
|
296
|
+
},
|
|
297
|
+
},
|
|
298
|
+
{ dark: true },
|
|
299
|
+
);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
function codeViewExtensions(
|
|
303
|
+
kit: CodeMirrorKit,
|
|
304
|
+
language: CodeViewLanguage,
|
|
305
|
+
fontSize: number,
|
|
306
|
+
maxHeight: number | string | undefined,
|
|
307
|
+
) {
|
|
308
|
+
const languageExtension =
|
|
309
|
+
language === 'typescript'
|
|
310
|
+
? [kit.javascript.javascript({ typescript: true, jsx: true })]
|
|
311
|
+
: language === 'json'
|
|
312
|
+
? [kit.json.json()]
|
|
313
|
+
: [];
|
|
314
|
+
return [
|
|
315
|
+
kit.view.lineNumbers(),
|
|
316
|
+
kit.view.highlightSpecialChars(),
|
|
317
|
+
kit.language.bracketMatching(),
|
|
318
|
+
kit.language.syntaxHighlighting(kit.oneDark.oneDarkHighlightStyle),
|
|
319
|
+
kit.search.search({ top: true }),
|
|
320
|
+
kit.view.keymap.of([...kit.commands.standardKeymap, ...kit.search.searchKeymap]),
|
|
321
|
+
kit.view.EditorView.lineWrapping,
|
|
322
|
+
// A viewer, twice over: the state refuses writes and the view is not
|
|
323
|
+
// editable. Selection and copy still work; `tabindex` keeps the view
|
|
324
|
+
// focusable so mod-f reaches the search keymap.
|
|
325
|
+
kit.state.EditorState.readOnly.of(true),
|
|
326
|
+
kit.view.EditorView.editable.of(false),
|
|
327
|
+
kit.view.EditorView.contentAttributes.of({ tabindex: '0' }),
|
|
328
|
+
...languageExtension,
|
|
329
|
+
codeViewTheme(kit, fontSize, maxHeight),
|
|
330
|
+
];
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
export function CodeView({
|
|
334
|
+
value,
|
|
335
|
+
language,
|
|
336
|
+
fontSize = 11,
|
|
337
|
+
maxHeight,
|
|
338
|
+
ariaLabel,
|
|
339
|
+
followChanges = false,
|
|
340
|
+
}: {
|
|
341
|
+
readonly value: string;
|
|
342
|
+
readonly language: CodeViewLanguage;
|
|
343
|
+
readonly fontSize?: number;
|
|
344
|
+
readonly maxHeight?: number | string;
|
|
345
|
+
readonly ariaLabel?: string;
|
|
346
|
+
/** Reveal externally changed source without taking keyboard focus. */
|
|
347
|
+
readonly followChanges?: boolean;
|
|
348
|
+
}) {
|
|
349
|
+
const hostRef = useRef<HTMLDivElement>(null);
|
|
350
|
+
const viewRef = useRef<import('@codemirror/view').EditorView | null>(null);
|
|
351
|
+
const highlightRef = useRef<ReturnType<typeof createChangeHighlight> | null>(null);
|
|
352
|
+
const highlightTimer = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
353
|
+
const revisionRef = useRef(0);
|
|
354
|
+
const valueRef = useRef(value);
|
|
355
|
+
valueRef.current = value;
|
|
356
|
+
const [kit, setKit] = useState<CodeMirrorKit | null>(null);
|
|
357
|
+
const [loadFailed, setLoadFailed] = useState(false);
|
|
358
|
+
|
|
359
|
+
useEffect(() => {
|
|
360
|
+
let cancelled = false;
|
|
361
|
+
void loadCodeMirror().then(
|
|
362
|
+
(loaded) => {
|
|
363
|
+
if (!cancelled) setKit(loaded);
|
|
364
|
+
},
|
|
365
|
+
() => {
|
|
366
|
+
// A viewer that cannot load its highlighter still shows the code: the
|
|
367
|
+
// plain-text fallback below stays, and says why rather than pretending
|
|
368
|
+
// an unhighlighted file is the finished view.
|
|
369
|
+
if (!cancelled) setLoadFailed(true);
|
|
370
|
+
},
|
|
371
|
+
);
|
|
372
|
+
return () => {
|
|
373
|
+
cancelled = true;
|
|
374
|
+
};
|
|
375
|
+
}, []);
|
|
376
|
+
|
|
377
|
+
useEffect(() => {
|
|
378
|
+
const host = hostRef.current;
|
|
379
|
+
if (!host || !kit) return;
|
|
380
|
+
const highlight = createChangeHighlight(kit);
|
|
381
|
+
const view = new kit.view.EditorView({
|
|
382
|
+
parent: host,
|
|
383
|
+
state: kit.state.EditorState.create({
|
|
384
|
+
doc: valueRef.current,
|
|
385
|
+
extensions: [codeViewExtensions(kit, language, fontSize, maxHeight), highlight.field],
|
|
386
|
+
}),
|
|
387
|
+
});
|
|
388
|
+
viewRef.current = view;
|
|
389
|
+
highlightRef.current = highlight;
|
|
390
|
+
return () => {
|
|
391
|
+
if (highlightTimer.current !== null) clearTimeout(highlightTimer.current);
|
|
392
|
+
highlightTimer.current = null;
|
|
393
|
+
highlightRef.current = null;
|
|
394
|
+
viewRef.current = null;
|
|
395
|
+
view.destroy();
|
|
396
|
+
};
|
|
397
|
+
}, [kit, language, fontSize, maxHeight]);
|
|
398
|
+
|
|
399
|
+
useEffect(() => {
|
|
400
|
+
const view = viewRef.current;
|
|
401
|
+
if (!view) return;
|
|
402
|
+
// Use CodeMirror's line endings for both sides of the diff. Its document
|
|
403
|
+
// offsets do not include the extra carriage returns in Windows files.
|
|
404
|
+
const nextValue = view.state.toText(value).toString();
|
|
405
|
+
const previous = view.state.doc.toString();
|
|
406
|
+
if (previous === nextValue) return;
|
|
407
|
+
const { from, oldEnd, newEnd } = changedSourceRange(previous, nextValue);
|
|
408
|
+
const changes = view.state.changes({ from, to: oldEnd, insert: nextValue.slice(from, newEnd) });
|
|
409
|
+
const highlight = highlightRef.current;
|
|
410
|
+
const effects: import('@codemirror/state').StateEffect<unknown>[] = [];
|
|
411
|
+
if (followChanges && kit && highlight) {
|
|
412
|
+
const point = view.coordsAtPos(from);
|
|
413
|
+
const viewport = view.scrollDOM.getBoundingClientRect();
|
|
414
|
+
const visible =
|
|
415
|
+
point &&
|
|
416
|
+
point.top >= viewport.top &&
|
|
417
|
+
point.bottom <= viewport.bottom &&
|
|
418
|
+
point.left >= viewport.left &&
|
|
419
|
+
point.right <= viewport.right;
|
|
420
|
+
// Preserve the reading position explicitly for a visible edit, including
|
|
421
|
+
// when replacement text changes line wrapping. Reveal only unseen edits.
|
|
422
|
+
const scroll = visible
|
|
423
|
+
? view.scrollSnapshot().map(changes)
|
|
424
|
+
: kit.view.EditorView.scrollIntoView(from, { y: 'nearest', x: 'nearest' });
|
|
425
|
+
if (scroll) effects.push(scroll);
|
|
426
|
+
effects.push(highlight.mark.of({ from, to: newEnd, revision: ++revisionRef.current }));
|
|
427
|
+
} else if (highlight) {
|
|
428
|
+
effects.push(highlight.mark.of(null));
|
|
429
|
+
}
|
|
430
|
+
view.dispatch({ changes, effects });
|
|
431
|
+
if (highlightTimer.current !== null) clearTimeout(highlightTimer.current);
|
|
432
|
+
highlightTimer.current = null;
|
|
433
|
+
if (followChanges && highlight) {
|
|
434
|
+
highlightTimer.current = setTimeout(() => {
|
|
435
|
+
if (viewRef.current === view) view.dispatch({ effects: highlight.mark.of(null) });
|
|
436
|
+
highlightTimer.current = null;
|
|
437
|
+
}, SOURCE_CHANGE_DURATION_MS);
|
|
438
|
+
}
|
|
439
|
+
}, [value, followChanges, kit]);
|
|
440
|
+
|
|
441
|
+
const fill = fillsItsBox(maxHeight) ? { height: '100%', minHeight: 0 } : {};
|
|
442
|
+
if (!kit) {
|
|
443
|
+
return (
|
|
444
|
+
<div role="group" aria-label={ariaLabel} style={{ minWidth: 0, ...fill }}>
|
|
445
|
+
{loadFailed && (
|
|
446
|
+
<div style={{ color: themeVars.semantic.warning, fontSize: 10, marginBottom: 4 }}>
|
|
447
|
+
Syntax highlighting failed to load — showing plain text.
|
|
448
|
+
</div>
|
|
449
|
+
)}
|
|
450
|
+
<pre
|
|
451
|
+
style={{
|
|
452
|
+
margin: 0,
|
|
453
|
+
fontFamily: themeVars.typography.mono,
|
|
454
|
+
fontSize,
|
|
455
|
+
lineHeight: 1.5,
|
|
456
|
+
color: themeVars.content.primary,
|
|
457
|
+
whiteSpace: 'pre-wrap',
|
|
458
|
+
wordBreak: 'break-word',
|
|
459
|
+
overflow: 'auto',
|
|
460
|
+
...(maxHeight === undefined ? {} : { maxHeight: cssLength(maxHeight) }),
|
|
461
|
+
...(fillsItsBox(maxHeight) ? { height: cssLength(maxHeight) } : {}),
|
|
462
|
+
}}
|
|
463
|
+
>
|
|
464
|
+
{value}
|
|
465
|
+
</pre>
|
|
466
|
+
</div>
|
|
467
|
+
);
|
|
468
|
+
}
|
|
469
|
+
return <div ref={hostRef} role="group" aria-label={ariaLabel} style={{ minWidth: 0, ...fill }} />;
|
|
470
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The viewport host's handle into the MINI card (`inspector-presentation.ts`):
|
|
3
|
+
* the one action a projected mini card needs from its physical home — collapse
|
|
4
|
+
* to the pill. The host (`components/CompactInspectorCard.tsx`) provides it; a
|
|
5
|
+
* bounded design-system host provides none, so the card renders without a
|
|
6
|
+
* minimize control.
|
|
7
|
+
*
|
|
8
|
+
* The mini card and pill chrome itself lives with the projections in
|
|
9
|
+
* `components/InspectionProjection.tsx` — this module is only the context seam
|
|
10
|
+
* between them and the viewport host.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { createContext, type ReactNode, useContext } from 'react';
|
|
14
|
+
|
|
15
|
+
interface CompactInspectorHostActions {
|
|
16
|
+
readonly minimize: () => void;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const CompactInspectorHostContext = createContext<CompactInspectorHostActions | null>(null);
|
|
20
|
+
|
|
21
|
+
export function CompactInspectorHostProvider({
|
|
22
|
+
actions,
|
|
23
|
+
children,
|
|
24
|
+
}: {
|
|
25
|
+
readonly actions: CompactInspectorHostActions;
|
|
26
|
+
readonly children: ReactNode;
|
|
27
|
+
}) {
|
|
28
|
+
return (
|
|
29
|
+
<CompactInspectorHostContext.Provider value={actions}>
|
|
30
|
+
{children}
|
|
31
|
+
</CompactInspectorHostContext.Provider>
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** The mini card's handle to its viewport host — `null` in a bounded host,
|
|
36
|
+
* where there is nothing to minimize into. */
|
|
37
|
+
export function useCompactInspectorHost(): CompactInspectorHostActions | null {
|
|
38
|
+
return useContext(CompactInspectorHostContext);
|
|
39
|
+
}
|