@volter/editor-core 0.5.57

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.
Files changed (719) hide show
  1. package/BUNDLED_NOTICES +1527 -0
  2. package/LICENSE +686 -0
  3. package/LICENSE-APACHE +202 -0
  4. package/NOTICE +18 -0
  5. package/README.md +24 -0
  6. package/dist/build/chunk-JS4D4XZ3.js +175 -0
  7. package/dist/build/chunk-JS4D4XZ3.js.map +7 -0
  8. package/dist/build/vite-plugin-product-contributions.js +100 -0
  9. package/dist/build/vite-plugin-product-contributions.js.map +7 -0
  10. package/dist/build/vite-plugin-shared-react.js +25 -0
  11. package/dist/build/vite-plugin-shared-react.js.map +7 -0
  12. package/dist/build/vite-plugin-shared-three.js +86 -0
  13. package/dist/build/vite-plugin-shared-three.js.map +7 -0
  14. package/dist/server/chunk-KMJC7AGO.js +98 -0
  15. package/dist/server/chunk-KMJC7AGO.js.map +7 -0
  16. package/dist/server/chunk-PSILUMGS.js +46 -0
  17. package/dist/server/chunk-PSILUMGS.js.map +7 -0
  18. package/dist/server/frame-proxy.js +255 -0
  19. package/dist/server/frame-proxy.js.map +7 -0
  20. package/dist/server/open-browser.js +53 -0
  21. package/dist/server/open-browser.js.map +7 -0
  22. package/dist/server/process-shutdown.js +127 -0
  23. package/dist/server/process-shutdown.js.map +7 -0
  24. package/dist/server/session-registry.js +141 -0
  25. package/dist/server/session-registry.js.map +7 -0
  26. package/dist/server/spawn-opener.js +11 -0
  27. package/dist/server/spawn-opener.js.map +7 -0
  28. package/dist/server/worktree-identity.js +11 -0
  29. package/dist/server/worktree-identity.js.map +7 -0
  30. package/dist-server/packaged.mjs +88816 -0
  31. package/package.json +118 -0
  32. package/scripts/build-plugins.mjs +14 -0
  33. package/scripts/build-server.mjs +26 -0
  34. package/scripts/build-session.mjs +9 -0
  35. package/server/account-credentials.ts +60 -0
  36. package/server/account-service.ts +1434 -0
  37. package/server/adapter-region-includes.ts +47 -0
  38. package/server/asset-catalog-v2.ts +175 -0
  39. package/server/asset-history-snapshots.ts +196 -0
  40. package/server/asset-ledger-store.ts +195 -0
  41. package/server/asset-library-routes.ts +1595 -0
  42. package/server/blender-wasm-artifact.ts +430 -0
  43. package/server/boot-timings.ts +106 -0
  44. package/server/canonical-path.ts +50 -0
  45. package/server/checkout-workspace-preflight.ts +349 -0
  46. package/server/cloud-asset-catalog.ts +158 -0
  47. package/server/coding-inference-launch.ts +237 -0
  48. package/server/collaboration-account-client.ts +202 -0
  49. package/server/collaboration-attribution.ts +122 -0
  50. package/server/collaboration-session.ts +934 -0
  51. package/server/comfyui-bridge.ts +248 -0
  52. package/server/console-ledger.ts +499 -0
  53. package/server/creation-site-transform.ts +304 -0
  54. package/server/creation-site-write.ts +648 -0
  55. package/server/data-file-serialize.ts +158 -0
  56. package/server/editor-brand-html.ts +72 -0
  57. package/server/editor-control-socket.ts +366 -0
  58. package/server/editor-server-options.ts +190 -0
  59. package/server/editor-server.ts +1483 -0
  60. package/server/editor-sse.ts +352 -0
  61. package/server/engine-provenance.ts +169 -0
  62. package/server/engine-source-restart.ts +117 -0
  63. package/server/frame-bridge.ts +115 -0
  64. package/server/frame-proxy.ts +490 -0
  65. package/server/frame-workbench.ts +259 -0
  66. package/server/frontend-handoff.ts +229 -0
  67. package/server/game-globals-shadow.ts +113 -0
  68. package/server/gameplay-session-retention.ts +149 -0
  69. package/server/gameplay-sessions.ts +123 -0
  70. package/server/generation-jobs.ts +201 -0
  71. package/server/generation-reconciler.ts +137 -0
  72. package/server/generative-execution-context.ts +59 -0
  73. package/server/git-workflow.ts +612 -0
  74. package/server/harness-chat-caller.ts +36 -0
  75. package/server/harness-chat-service.ts +1681 -0
  76. package/server/idle-shutdown.ts +170 -0
  77. package/server/js-profiling-policy.ts +52 -0
  78. package/server/launcher-settings.ts +84 -0
  79. package/server/local-asset-catalog.ts +410 -0
  80. package/server/managed-account-defaults.ts +22 -0
  81. package/server/mock-control-plane.ts +540 -0
  82. package/server/model-import-conversion.ts +345 -0
  83. package/server/native-credential-store.ts +162 -0
  84. package/server/open-browser.ts +118 -0
  85. package/server/packaged.ts +1192 -0
  86. package/server/play-stall.ts +126 -0
  87. package/server/process-shutdown.ts +218 -0
  88. package/server/product-presets.ts +55 -0
  89. package/server/project-build-artifact.ts +95 -0
  90. package/server/project-components.ts +100 -0
  91. package/server/project-dependency-invalidation.ts +114 -0
  92. package/server/project-file-scan.ts +235 -0
  93. package/server/project-hmr-files.ts +215 -0
  94. package/server/project-install-roots.ts +210 -0
  95. package/server/project-kinds.ts +71 -0
  96. package/server/project-mcp-servers.ts +82 -0
  97. package/server/project-module-freshness.ts +109 -0
  98. package/server/project-module-instance.ts +375 -0
  99. package/server/project-optimize-deps-entries.ts +827 -0
  100. package/server/project-output-writer.ts +679 -0
  101. package/server/project-package-origin.ts +63 -0
  102. package/server/project-root-surface.ts +831 -0
  103. package/server/project-scratch-path.ts +47 -0
  104. package/server/project-script-hmr.ts +619 -0
  105. package/server/project-serving-plugins.ts +236 -0
  106. package/server/project-tools.ts +653 -0
  107. package/server/project-validation.ts +250 -0
  108. package/server/project-verbs.ts +127 -0
  109. package/server/project-view.ts +52 -0
  110. package/server/project-watch.ts +1134 -0
  111. package/server/project-work-coordinator.ts +288 -0
  112. package/server/provider-credentials.ts +331 -0
  113. package/server/recent-projects-store.ts +98 -0
  114. package/server/redact-secrets.ts +71 -0
  115. package/server/repository-presence.ts +267 -0
  116. package/server/routes/account.ts +357 -0
  117. package/server/routes/agents.ts +60 -0
  118. package/server/routes/assets.ts +154 -0
  119. package/server/routes/build.ts +13 -0
  120. package/server/routes/collaboration.ts +595 -0
  121. package/server/routes/configurations.ts +419 -0
  122. package/server/routes/context.ts +264 -0
  123. package/server/routes/control-plane.ts +1811 -0
  124. package/server/routes/logs.ts +272 -0
  125. package/server/routes/project-identity.ts +302 -0
  126. package/server/routes/project-open.ts +429 -0
  127. package/server/routes/project-source.ts +686 -0
  128. package/server/routes/project-state.ts +383 -0
  129. package/server/routes/relay.ts +1029 -0
  130. package/server/routes/route-helpers.ts +29 -0
  131. package/server/routes/served-modules.ts +138 -0
  132. package/server/routes/session-tabs.ts +196 -0
  133. package/server/routes/settings.ts +121 -0
  134. package/server/routes/share-control.ts +486 -0
  135. package/server/routes/themes.ts +116 -0
  136. package/server/routes/tools.ts +230 -0
  137. package/server/routes/worktrees.ts +595 -0
  138. package/server/scoped-game-css.ts +461 -0
  139. package/server/server-utils.ts +1194 -0
  140. package/server/session-product.ts +112 -0
  141. package/server/session-registry.ts +230 -0
  142. package/server/share-claims.ts +138 -0
  143. package/server/share-host.ts +526 -0
  144. package/server/share-session-gateway.ts +1362 -0
  145. package/server/share-tunnel.ts +123 -0
  146. package/server/spawn-opener.ts +74 -0
  147. package/server/support/play/log-format.ts +76 -0
  148. package/server/support/play/session-record.ts +199 -0
  149. package/server/support/project/build-discipline.ts +718 -0
  150. package/server/support/project/inspection-node.ts +119 -0
  151. package/server/support/project/log-naming.ts +54 -0
  152. package/server/support/project/provenance.ts +290 -0
  153. package/server/support/project/run-name.ts +18 -0
  154. package/server/support/project/session-journal.ts +830 -0
  155. package/server/support/project/shared.ts +327 -0
  156. package/server/tab-bootstrap.ts +62 -0
  157. package/server/tab-heartbeat.ts +477 -0
  158. package/server/tab-lifecycle.ts +550 -0
  159. package/server/tab-presence.ts +1508 -0
  160. package/server/team-agent-mirror.ts +95 -0
  161. package/server/twin-auth.ts +138 -0
  162. package/server/vendored-lock-recorder.ts +968 -0
  163. package/server/worktree-identity.ts +121 -0
  164. package/server/worktree-management.ts +398 -0
  165. package/server/worktree-retention.d.mts +13 -0
  166. package/server/worktree-retention.mjs +205 -0
  167. package/src/EditorContext.tsx +169 -0
  168. package/src/account.ts +333 -0
  169. package/src/action-registry.ts +532 -0
  170. package/src/active-product.ts +74 -0
  171. package/src/active-project.ts +155 -0
  172. package/src/adapter-editor-config.ts +25 -0
  173. package/src/adapter-observation.ts +49 -0
  174. package/src/animation/stage-transport.ts +379 -0
  175. package/src/animation/three-clips-subject.ts +172 -0
  176. package/src/api/asset-library-wire.ts +45 -0
  177. package/src/api/assets.ts +365 -0
  178. package/src/api/base.ts +10 -0
  179. package/src/api/build.ts +99 -0
  180. package/src/api/git-wire.ts +56 -0
  181. package/src/api/logs.ts +92 -0
  182. package/src/api/project-identity.ts +74 -0
  183. package/src/api/project-open.ts +355 -0
  184. package/src/api/project-source.ts +162 -0
  185. package/src/api/project-state.ts +107 -0
  186. package/src/api/relay.ts +268 -0
  187. package/src/api/settings.ts +36 -0
  188. package/src/api/themes.ts +45 -0
  189. package/src/api/worktrees.ts +257 -0
  190. package/src/asset-compare-core.ts +171 -0
  191. package/src/asset-compare.ts +294 -0
  192. package/src/asset-editor-context.tsx +100 -0
  193. package/src/asset-events.ts +97 -0
  194. package/src/asset-inspector-actions.ts +87 -0
  195. package/src/asset-preview-framing.ts +357 -0
  196. package/src/asset-preview.ts +2802 -0
  197. package/src/asset-selection-viewer-registry.ts +113 -0
  198. package/src/asset-selection.ts +133 -0
  199. package/src/asset-workflow/asset-capabilities.ts +344 -0
  200. package/src/asset-workflow/asset-import-jobs.ts +106 -0
  201. package/src/asset-workflow/asset-ledger-backend.ts +126 -0
  202. package/src/asset-workflow/asset-ledger.ts +156 -0
  203. package/src/asset-workflow/asset-materialization-report.ts +140 -0
  204. package/src/asset-workflow/asset-pack-manifest.ts +320 -0
  205. package/src/asset-workflow/asset-types.ts +142 -0
  206. package/src/asset-workflow/asset-workflow-quality.ts +61 -0
  207. package/src/asset-workflow/audio-preview-player.ts +193 -0
  208. package/src/asset-workflow/audio-waveform.ts +22 -0
  209. package/src/asset-workflow/cloud-asset-client.ts +263 -0
  210. package/src/asset-workflow/folder-preview.ts +345 -0
  211. package/src/asset-workflow/hosted-asset-materialization.ts +236 -0
  212. package/src/asset-workflow/image-view-scale.ts +32 -0
  213. package/src/asset-workflow/import-contract.ts +124 -0
  214. package/src/asset-workflow/ledger-write-lock.ts +244 -0
  215. package/src/asset-workflow/model-inspection.ts +818 -0
  216. package/src/asset-workflow/pixi-spritesheet.ts +197 -0
  217. package/src/asset-workflow/preview-resource-lifetime.ts +44 -0
  218. package/src/asset-workflow/project-asset-commands.ts +23 -0
  219. package/src/asset-workflow/project-asset-health.ts +139 -0
  220. package/src/asset-workflow/project-asset-operations.ts +154 -0
  221. package/src/asset-workflow/project-asset-roots.ts +68 -0
  222. package/src/asset-workflow/project-content.ts +288 -0
  223. package/src/asset-workflow/project-source-index.ts +550 -0
  224. package/src/asset-workflow/thumbnail-system.ts +256 -0
  225. package/src/authoring/active-adapter.ts +199 -0
  226. package/src/authoring/active-systems.ts +422 -0
  227. package/src/authoring/adapter-key.ts +18 -0
  228. package/src/authoring/authoring-asset-url.ts +27 -0
  229. package/src/authoring/bootstrap-state.ts +49 -0
  230. package/src/authoring/boundary-authoring-adapter.ts +184 -0
  231. package/src/authoring/breakpoint-state.ts +43 -0
  232. package/src/authoring/canvas-scene-guides.ts +76 -0
  233. package/src/authoring/component-instance-root.ts +171 -0
  234. package/src/authoring/composite-authoring-adapter.ts +2110 -0
  235. package/src/authoring/consumer-actions.ts +520 -0
  236. package/src/authoring/css-numeric-style.ts +97 -0
  237. package/src/authoring/design-time-layers.ts +849 -0
  238. package/src/authoring/design-time-mount-registry.ts +235 -0
  239. package/src/authoring/design-time-settle.ts +343 -0
  240. package/src/authoring/edit-mode-authoring.ts +619 -0
  241. package/src/authoring/eyedropper-session.ts +60 -0
  242. package/src/authoring/instance-source-menu-register.ts +13 -0
  243. package/src/authoring/instance-source-menu.ts +135 -0
  244. package/src/authoring/layered-pick.ts +183 -0
  245. package/src/authoring/live-gesture-lock.ts +50 -0
  246. package/src/authoring/live-object-transform.ts +62 -0
  247. package/src/authoring/mount-failure-report.ts +154 -0
  248. package/src/authoring/mounted-root-subjects.ts +144 -0
  249. package/src/authoring/no-authoring-adapter.ts +55 -0
  250. package/src/authoring/null-inspection-subjects.tsx +75 -0
  251. package/src/authoring/object3d-document-persistence.ts +106 -0
  252. package/src/authoring/object3d-document-session-registry.ts +120 -0
  253. package/src/authoring/object3d-document-session.ts +1326 -0
  254. package/src/authoring/object3d-gesture-controller.ts +113 -0
  255. package/src/authoring/panel-authoring.ts +121 -0
  256. package/src/authoring/prefab-instance-inspector-section.tsx +237 -0
  257. package/src/authoring/prefab-instance-section-model.ts +55 -0
  258. package/src/authoring/project-authoring-session.ts +105 -0
  259. package/src/authoring/provenance.ts +99 -0
  260. package/src/authoring/quarks-particle-systems.ts +19 -0
  261. package/src/authoring/react-canvas-navigation.ts +255 -0
  262. package/src/authoring/react-design-canvas-style.ts +20 -0
  263. package/src/authoring/react-story-board.ts +937 -0
  264. package/src/authoring/selection-scope.ts +195 -0
  265. package/src/authoring/shell-document-ops.ts +169 -0
  266. package/src/authoring/shell-object3d-document-write-policy.ts +108 -0
  267. package/src/authoring/shell-viewport-policy.ts +48 -0
  268. package/src/authoring/source-object3d-authoring-adapter.ts +526 -0
  269. package/src/authoring/stories-scope.ts +35 -0
  270. package/src/authoring/story-board-chrome-fit.ts +107 -0
  271. package/src/authoring/story-board-presentation.ts +111 -0
  272. package/src/authoring/three-projection-core.ts +226 -0
  273. package/src/authoring/viewport-pick-context.ts +40 -0
  274. package/src/authoring/viewport-raycast.ts +240 -0
  275. package/src/authoring/viewport-tool-context.ts +73 -0
  276. package/src/authoring/world-canvas-viewport-state.ts +35 -0
  277. package/src/authoring/world-hidden-viewport.ts +152 -0
  278. package/src/authoring/world-pan-state.ts +198 -0
  279. package/src/authoring/world-session-state.ts +101 -0
  280. package/src/authoring/write-pipe.ts +173 -0
  281. package/src/availability-tick.ts +66 -0
  282. package/src/bitmap-label.ts +120 -0
  283. package/src/blender-tab-metrics.ts +161 -0
  284. package/src/board-open-actions.ts +20 -0
  285. package/src/boot-routing.ts +391 -0
  286. package/src/build-identity.ts +15 -0
  287. package/src/bytes-codec.ts +62 -0
  288. package/src/camera-authoring.ts +175 -0
  289. package/src/cancellation-reason.ts +58 -0
  290. package/src/canvas-preview-frames.ts +482 -0
  291. package/src/capture-camera-pose.ts +77 -0
  292. package/src/chrome-registry.ts +159 -0
  293. package/src/chrome-slot-registry.ts +91 -0
  294. package/src/collaboration-client.ts +264 -0
  295. package/src/collaboration-presence.ts +41 -0
  296. package/src/command-dispatch.ts +19 -0
  297. package/src/command-listener.ts +2743 -0
  298. package/src/command-registry.ts +70 -0
  299. package/src/component-board-registry.ts +205 -0
  300. package/src/component-states-registry.ts +200 -0
  301. package/src/components/AgentPresentationNotice.tsx +75 -0
  302. package/src/components/AlignToolbar.tsx +204 -0
  303. package/src/components/AppRoot.tsx +394 -0
  304. package/src/components/ApplicationMenus.tsx +415 -0
  305. package/src/components/AssetBrowser.tsx +2843 -0
  306. package/src/components/AssetEditorShell.tsx +216 -0
  307. package/src/components/AssetInspectorToolSection.tsx +124 -0
  308. package/src/components/BoardRulers.tsx +354 -0
  309. package/src/components/CameraInfo.tsx +81 -0
  310. package/src/components/CanvasSceneViewport.tsx +556 -0
  311. package/src/components/CapabilityCoverageSection.tsx +185 -0
  312. package/src/components/CenterDocuments.tsx +22 -0
  313. package/src/components/ChromeSlot.tsx +20 -0
  314. package/src/components/CodeView.tsx +470 -0
  315. package/src/components/CollaborationHeaderControl.css +74 -0
  316. package/src/components/CompactInspectorCard.tsx +190 -0
  317. package/src/components/CompactInspectorShell.tsx +39 -0
  318. package/src/components/ConsolePanel.css +55 -0
  319. package/src/components/ConsolePanel.tsx +270 -0
  320. package/src/components/DefaultEditorLayout.tsx +106 -0
  321. package/src/components/DocumentHeaderStrip.tsx +96 -0
  322. package/src/components/DocumentShelfRail.tsx +45 -0
  323. package/src/components/DocumentThumbnail.tsx +345 -0
  324. package/src/components/EditorLeaseGuard.tsx +372 -0
  325. package/src/components/ErrorBanner.tsx +123 -0
  326. package/src/components/FolderPreviewTile.tsx +159 -0
  327. package/src/components/GameHierarchy.tsx +3842 -0
  328. package/src/components/GameplaySessionTimeline.tsx +295 -0
  329. package/src/components/InspectionProjection.tsx +968 -0
  330. package/src/components/Inspector.tsx +233 -0
  331. package/src/components/InspectorCanvasPreview.tsx +35 -0
  332. package/src/components/InspectorFieldsSection.tsx +290 -0
  333. package/src/components/InspectorObjectPreview.tsx +57 -0
  334. package/src/components/InspectorStoriesSection.tsx +92 -0
  335. package/src/components/InspectorToolSection.tsx +96 -0
  336. package/src/components/InspectorTransformSection.tsx +245 -0
  337. package/src/components/LightExplorerPanel.tsx +433 -0
  338. package/src/components/MediaProperties.tsx +145 -0
  339. package/src/components/NonThreeAuthoringBootstrap.tsx +19 -0
  340. package/src/components/Object3DDocumentToolbar.css +100 -0
  341. package/src/components/Object3DDocumentToolbar.tsx +454 -0
  342. package/src/components/Object3DDocumentViewport.tsx +58 -0
  343. package/src/components/ProjectHeader.css +617 -0
  344. package/src/components/ProjectHeader.tsx +328 -0
  345. package/src/components/ProjectLayout.tsx +249 -0
  346. package/src/components/ReactCanvasControls.tsx +284 -0
  347. package/src/components/RootSelectionOverlay.tsx +3162 -0
  348. package/src/components/RootTextEditor.tsx +79 -0
  349. package/src/components/SaveStatus.tsx +70 -0
  350. package/src/components/StageHost.tsx +1954 -0
  351. package/src/components/StageOverlays.tsx +21 -0
  352. package/src/components/StartupErrorScreen.tsx +76 -0
  353. package/src/components/StartupLoadingScreen.tsx +65 -0
  354. package/src/components/StatsOverlay.tsx +78 -0
  355. package/src/components/SurfaceStateOverlay.tsx +24 -0
  356. package/src/components/ToolContributionSurfaces.tsx +65 -0
  357. package/src/components/ToolHost.tsx +370 -0
  358. package/src/components/ToolObject3DPreview.tsx +39 -0
  359. package/src/components/Toolbar.tsx +595 -0
  360. package/src/components/TransientHint.tsx +44 -0
  361. package/src/components/TransportStrip.tsx +174 -0
  362. package/src/components/VersionControlSection.tsx +470 -0
  363. package/src/components/VgaiLogo.css +83 -0
  364. package/src/components/VgaiLogo.tsx +35 -0
  365. package/src/components/ViewportControlsHint.tsx +60 -0
  366. package/src/components/ViewportFurniture.tsx +401 -0
  367. package/src/components/ViewportOverlay.tsx +145 -0
  368. package/src/components/ViewportOverlaysMenu.tsx +153 -0
  369. package/src/components/ViewportShadingMenu.tsx +300 -0
  370. package/src/components/ViewportViewMenu.tsx +101 -0
  371. package/src/components/WorkspaceDocumentSurface.tsx +204 -0
  372. package/src/components/WorkspaceUtilitySurface.tsx +22 -0
  373. package/src/components/WorktreeSwitcher.css +239 -0
  374. package/src/components/WorktreeSwitcher.tsx +890 -0
  375. package/src/components/account-documents.tsx +1162 -0
  376. package/src/components/asset-documents.tsx +812 -0
  377. package/src/components/asset-editor-persistence.ts +216 -0
  378. package/src/components/asset-selection-section.tsx +535 -0
  379. package/src/components/asset-thumbnails.tsx +312 -0
  380. package/src/components/asset-viewers/AudioViewer.tsx +201 -0
  381. package/src/components/asset-viewers/EntityModelDocument.tsx +122 -0
  382. package/src/components/asset-viewers/EnvironmentAssetDocument.tsx +440 -0
  383. package/src/components/asset-viewers/GenericJsonViewer.tsx +102 -0
  384. package/src/components/asset-viewers/ImageViewer.tsx +300 -0
  385. package/src/components/asset-viewers/JsonAssetDocument.tsx +93 -0
  386. package/src/components/asset-viewers/LiveModuleDocument.tsx +417 -0
  387. package/src/components/asset-viewers/LutAssetDocument.tsx +444 -0
  388. package/src/components/asset-viewers/ModelAssetDocument.tsx +105 -0
  389. package/src/components/asset-viewers/Object3DPreview.tsx +359 -0
  390. package/src/components/asset-viewers/OnlineAssetDetail.tsx +421 -0
  391. package/src/components/asset-viewers/PasteboardModuleDocument.tsx +67 -0
  392. package/src/components/asset-viewers/QuarksAssetDocument.tsx +526 -0
  393. package/src/components/asset-viewers/ShaderAssetDocument.tsx +743 -0
  394. package/src/components/asset-viewers/SourceAssetViewer.tsx +281 -0
  395. package/src/components/asset-viewers/SpritesheetSpriteView.tsx +102 -0
  396. package/src/components/asset-viewers/VideoViewer.tsx +101 -0
  397. package/src/components/asset-viewers/shader-source.ts +144 -0
  398. package/src/components/asset-workflow.css +731 -0
  399. package/src/components/board-guides.ts +150 -0
  400. package/src/components/compact-inspector.css +539 -0
  401. package/src/components/core-utilities.tsx +90 -0
  402. package/src/components/editor-notifications.css +40 -0
  403. package/src/components/engine-workspace.css +274 -0
  404. package/src/components/inspector-preview-section.tsx +238 -0
  405. package/src/components/inspector-property-grouping.ts +64 -0
  406. package/src/components/inspector-revert-label.ts +20 -0
  407. package/src/components/inspector-selection.ts +42 -0
  408. package/src/components/inspector-stories-gating.ts +171 -0
  409. package/src/components/inspector-transform-subject.ts +11 -0
  410. package/src/components/inspector-transform.ts +75 -0
  411. package/src/components/kind-documents.tsx +500 -0
  412. package/src/components/palette-action-publisher.tsx +140 -0
  413. package/src/components/primitives/DraftColorInput.tsx +74 -0
  414. package/src/components/product-shell.css +1829 -0
  415. package/src/components/project-tool-documents.tsx +410 -0
  416. package/src/components/scene-documents.tsx +223 -0
  417. package/src/components/stage-keyboard.tsx +37 -0
  418. package/src/components/stage-overlay-set.tsx +107 -0
  419. package/src/components/stage-presence-markers.ts +478 -0
  420. package/src/components/standard-viewport-dressing.ts +417 -0
  421. package/src/components/status-contributions.tsx +403 -0
  422. package/src/components/tool-documents.tsx +309 -0
  423. package/src/components/tool-schema-form.tsx +262 -0
  424. package/src/components/use-after-paint.ts +41 -0
  425. package/src/components/use-project-image-assets.ts +86 -0
  426. package/src/components/viewport-header-controls.css +90 -0
  427. package/src/components/viewport-surface-status.tsx +55 -0
  428. package/src/components/workspace-history.ts +32 -0
  429. package/src/components/workspace-static-panel-registry.tsx +152 -0
  430. package/src/components/workspace-surfaces.css +621 -0
  431. package/src/components/world-documents.tsx +586 -0
  432. package/src/components/world-overlay-gestures.ts +1694 -0
  433. package/src/composite-screenshot.ts +1641 -0
  434. package/src/console-sync.ts +131 -0
  435. package/src/constraint-helper.ts +338 -0
  436. package/src/content-entry-source-registry.ts +184 -0
  437. package/src/coverage/authoring-seam-evidence.ts +300 -0
  438. package/src/coverage/canvas-reveal.ts +192 -0
  439. package/src/coverage/design-time-surfaces.ts +101 -0
  440. package/src/coverage/live-seam-evidence.ts +11 -0
  441. package/src/coverage/ontology-invariants.ts +466 -0
  442. package/src/coverage/session-vitals.ts +501 -0
  443. package/src/coverage/system-seam-evidence.ts +72 -0
  444. package/src/crash-null-boundary.ts +36 -0
  445. package/src/creation-site-edit.ts +1479 -0
  446. package/src/creation-site-registry.ts +160 -0
  447. package/src/delegate-harness-registry.ts +143 -0
  448. package/src/document-context-registry.ts +177 -0
  449. package/src/document-open-registry.ts +200 -0
  450. package/src/document-preview-source.ts +20 -0
  451. package/src/document-renderer-session.ts +138 -0
  452. package/src/editor-api.ts +46 -0
  453. package/src/editor-chrome-capture.ts +139 -0
  454. package/src/editor-commands.ts +164 -0
  455. package/src/editor-console.ts +563 -0
  456. package/src/editor-current-view.ts +82 -0
  457. package/src/editor-document-probe.ts +881 -0
  458. package/src/editor-git-client.ts +115 -0
  459. package/src/editor-host-door.ts +462 -0
  460. package/src/editor-hotkeys.ts +842 -0
  461. package/src/editor-lease-view.ts +39 -0
  462. package/src/editor-lease.ts +415 -0
  463. package/src/editor-mode.ts +19 -0
  464. package/src/editor-notifications.ts +140 -0
  465. package/src/editor-presence.ts +563 -0
  466. package/src/editor-presentation-activity.ts +50 -0
  467. package/src/editor-presentation-notice.ts +42 -0
  468. package/src/editor-runtime.tsx +145 -0
  469. package/src/editor-server-response.ts +86 -0
  470. package/src/editor-session-attribution.ts +75 -0
  471. package/src/editor-session-mode.ts +54 -0
  472. package/src/editor-shell-store.ts +1304 -0
  473. package/src/editor-state-facets.ts +74 -0
  474. package/src/editor-styles.css +33 -0
  475. package/src/editor-view-presentation.ts +810 -0
  476. package/src/editor-viewport.ts +5302 -0
  477. package/src/entity-lod.ts +31 -0
  478. package/src/entity-object.ts +91 -0
  479. package/src/files/file-provider.ts +62 -0
  480. package/src/files/project-files.ts +264 -0
  481. package/src/finders/index.ts +136 -0
  482. package/src/finders/scenes-from-entrypoint-selection.ts +387 -0
  483. package/src/frame/bridge.tsx +1408 -0
  484. package/src/frame/product.ts +77 -0
  485. package/src/gameplay-dom-recording.ts +319 -0
  486. package/src/gameplay-export-state.ts +14 -0
  487. package/src/gameplay-replay.ts +417 -0
  488. package/src/gameplay-session-time.ts +9 -0
  489. package/src/gameplay-sessions.ts +204 -0
  490. package/src/harness-chat-types.ts +253 -0
  491. package/src/hierarchy-component-marks.ts +298 -0
  492. package/src/hierarchy-drop.ts +91 -0
  493. package/src/hierarchy-expansion-state.ts +80 -0
  494. package/src/hierarchy-header-slot.ts +52 -0
  495. package/src/hierarchy-internals.ts +197 -0
  496. package/src/hierarchy-kind-icon.ts +217 -0
  497. package/src/hierarchy-mark-reader.ts +73 -0
  498. package/src/hierarchy-menu-registry.ts +67 -0
  499. package/src/hierarchy-node-rows.ts +307 -0
  500. package/src/hierarchy-panel-view.ts +280 -0
  501. package/src/hierarchy-projection.ts +76 -0
  502. package/src/hierarchy-row-cache.ts +243 -0
  503. package/src/hierarchy-row-model.ts +308 -0
  504. package/src/hierarchy-rows.ts +11 -0
  505. package/src/hierarchy-walk.ts +86 -0
  506. package/src/history/editor-session.ts +25 -0
  507. package/src/history/history-commands.ts +147 -0
  508. package/src/history/history-delegate.ts +163 -0
  509. package/src/history/history-limit-notices.ts +43 -0
  510. package/src/history/history-service.ts +1173 -0
  511. package/src/history/persistence-coordinator.ts +35 -0
  512. package/src/history/project-file-history.ts +386 -0
  513. package/src/history/project-root-history-backends.ts +139 -0
  514. package/src/history/resource-registry.ts +209 -0
  515. package/src/history/snapshot-store.ts +103 -0
  516. package/src/history/source-history-backend.ts +546 -0
  517. package/src/history/types.ts +124 -0
  518. package/src/hmr-registration-group.ts +67 -0
  519. package/src/hmr-stable-react-context.ts +23 -0
  520. package/src/hotkeys.ts +188 -0
  521. package/src/inference-diagnostics.ts +69 -0
  522. package/src/initial-project.ts +80 -0
  523. package/src/inspection/active-subject.ts +578 -0
  524. package/src/inspection/active-surface.ts +142 -0
  525. package/src/inspection/compose.ts +1064 -0
  526. package/src/inspection/display.ts +170 -0
  527. package/src/inspection/document-subject.ts +109 -0
  528. package/src/inspection/game-subject.ts +85 -0
  529. package/src/inspection/model.ts +542 -0
  530. package/src/inspection/null-subject.ts +115 -0
  531. package/src/inspection/serialize.ts +357 -0
  532. package/src/inspection/use-active-inspection.ts +180 -0
  533. package/src/inspector-presentation.ts +201 -0
  534. package/src/inspector-section-registry.ts +221 -0
  535. package/src/instance-source-actions.ts +163 -0
  536. package/src/instanced-presentation.ts +164 -0
  537. package/src/js-heap.ts +71 -0
  538. package/src/key-actions.ts +91 -0
  539. package/src/keymap-presets.ts +401 -0
  540. package/src/layout-policy.ts +31 -0
  541. package/src/learn-links.ts +73 -0
  542. package/src/light-explorer-model.ts +134 -0
  543. package/src/live-canvas-frame.ts +55 -0
  544. package/src/live-document.ts +279 -0
  545. package/src/live-module-source.ts +230 -0
  546. package/src/live-session-registry.ts +220 -0
  547. package/src/live-transition.ts +633 -0
  548. package/src/manifest-project.ts +107 -0
  549. package/src/model-thumbnail.ts +523 -0
  550. package/src/native-selection-style.ts +202 -0
  551. package/src/object3d-document-write-policy.ts +137 -0
  552. package/src/packaged-runtime.ts +108 -0
  553. package/src/palettes/maya.palette.json +57 -0
  554. package/src/palettes/substance.palette.json +57 -0
  555. package/src/pasteboard-module.ts +81 -0
  556. package/src/performance-profiler.ts +367 -0
  557. package/src/performance-sources.ts +69 -0
  558. package/src/play-boot-phase.ts +145 -0
  559. package/src/presentation-surface.ts +248 -0
  560. package/src/project-adapter.ts +1143 -0
  561. package/src/project-asset-refresh.ts +26 -0
  562. package/src/project-declaration-refresh.ts +31 -0
  563. package/src/project-local-state.ts +118 -0
  564. package/src/project-manager.ts +243 -0
  565. package/src/project-module-changes.ts +163 -0
  566. package/src/project-module-split.ts +266 -0
  567. package/src/project-provenance.ts +115 -0
  568. package/src/project-ready.ts +42 -0
  569. package/src/project-session-reset.ts +67 -0
  570. package/src/project-shape.ts +68 -0
  571. package/src/project-tool-discovery.ts +66 -0
  572. package/src/project-tools.ts +107 -0
  573. package/src/project-work-types.ts +149 -0
  574. package/src/projection/three.ts +898 -0
  575. package/src/projection/types.ts +44 -0
  576. package/src/readiness.ts +113 -0
  577. package/src/reflection-probe-helper.ts +142 -0
  578. package/src/reported-play-state.ts +90 -0
  579. package/src/resolve-relative-specifier.ts +33 -0
  580. package/src/scene-document-plan.ts +315 -0
  581. package/src/scene-framing.ts +315 -0
  582. package/src/scene-live-open.ts +210 -0
  583. package/src/scene-view-fog.ts +89 -0
  584. package/src/scoped-game-css.ts +152 -0
  585. package/src/session-orphan-record.ts +193 -0
  586. package/src/session-tombstone.ts +126 -0
  587. package/src/settings/settings-provider.ts +82 -0
  588. package/src/settings-store.ts +345 -0
  589. package/src/shared-view-restore.ts +42 -0
  590. package/src/shell-store-door.ts +45 -0
  591. package/src/source-conflict.ts +122 -0
  592. package/src/spatial-handle-visuals.ts +332 -0
  593. package/src/stage-context.ts +341 -0
  594. package/src/stage-store-registry.ts +63 -0
  595. package/src/stale-chunk-recovery.ts +34 -0
  596. package/src/state-report-deferral.ts +73 -0
  597. package/src/storage/host-files-storage.ts +97 -0
  598. package/src/storage/http-storage.ts +174 -0
  599. package/src/storage/index.ts +75 -0
  600. package/src/storage/mem-storage.ts +149 -0
  601. package/src/storage/path-lock.ts +44 -0
  602. package/src/storage/paths.ts +26 -0
  603. package/src/storage/types.ts +116 -0
  604. package/src/stories/StoryComponentThumbnail.tsx +184 -0
  605. package/src/stories/StoryPreviewMount.tsx +306 -0
  606. package/src/stories/component-content-source.tsx +106 -0
  607. package/src/stories/component-states-source.ts +78 -0
  608. package/src/stories/compose-project-stories.ts +255 -0
  609. package/src/stories/pixi-story-model.ts +30 -0
  610. package/src/stories/prefabs-finder.ts +54 -0
  611. package/src/stories/prefabs-from-stories.ts +182 -0
  612. package/src/stories/project-story-discovery.ts +78 -0
  613. package/src/stories/project-story-regions.ts +24 -0
  614. package/src/stories/story-actions.ts +54 -0
  615. package/src/stories/story-capture-command.ts +124 -0
  616. package/src/stories/story-capture.ts +584 -0
  617. package/src/stories/story-declared-medium.ts +126 -0
  618. package/src/stories/story-discovery.ts +176 -0
  619. package/src/stories/story-document-openers.ts +36 -0
  620. package/src/stories/story-dom-runtime.ts +78 -0
  621. package/src/stories/story-grouping.ts +111 -0
  622. package/src/stories/story-lane.ts +88 -0
  623. package/src/stories/story-mount-turn.ts +27 -0
  624. package/src/stories/story-opener.ts +260 -0
  625. package/src/stories/story-pixi-preview.ts +408 -0
  626. package/src/stories/story-presentation.ts +215 -0
  627. package/src/stories/story-registry.ts +517 -0
  628. package/src/stories/story-three-preview.ts +807 -0
  629. package/src/stories/three-story-model.ts +96 -0
  630. package/src/story-three-preview-runtime.ts +56 -0
  631. package/src/surface-keyboard.ts +112 -0
  632. package/src/surface-state.ts +124 -0
  633. package/src/tab-bootstrap.js +628 -0
  634. package/src/tab-census.ts +198 -0
  635. package/src/tab-lifecycle-client.ts +196 -0
  636. package/src/theme-library.ts +844 -0
  637. package/src/theme-preference.ts +378 -0
  638. package/src/theme.css +3437 -0
  639. package/src/three-viewport/bone-selection-highlight.ts +119 -0
  640. package/src/three-viewport/camera-fit.ts +41 -0
  641. package/src/three-viewport/interactive-renderer.ts +132 -0
  642. package/src/three-viewport/selection-brackets.ts +310 -0
  643. package/src/three-viewport/selection-outline.ts +183 -0
  644. package/src/three-viewport/skeleton-helper.ts +61 -0
  645. package/src/three-viewport/source-color.ts +167 -0
  646. package/src/three-viewport/studio-environment.ts +96 -0
  647. package/src/three-viewport-presentation.ts +23 -0
  648. package/src/tool-contribution-play.ts +74 -0
  649. package/src/tool-loader.ts +1798 -0
  650. package/src/transform-mode-request.ts +57 -0
  651. package/src/transient-hint.ts +78 -0
  652. package/src/trigger-volume-helper.ts +116 -0
  653. package/src/ui-source/adapter-region-includes.ts +241 -0
  654. package/src/ui-source/ensure-import.ts +132 -0
  655. package/src/ui-source/file-region-resolver.ts +302 -0
  656. package/src/ui-source/inspect.ts +775 -0
  657. package/src/ui-source/oid-transform.ts +1845 -0
  658. package/src/ui-source/plan-csf-story.ts +196 -0
  659. package/src/ui-source/plan-extract-component.ts +421 -0
  660. package/src/ui-source/plan-fork-component.ts +621 -0
  661. package/src/ui-source/plan-named-style.ts +95 -0
  662. package/src/ui-source/plan-source-edit.ts +353 -0
  663. package/src/ui-source/r3f-contract-resolver.ts +327 -0
  664. package/src/ui-source/r3f-diagnostic-index.ts +165 -0
  665. package/src/ui-source/r3f-environment-binding.ts +133 -0
  666. package/src/ui-source/r3f-joint-binding.ts +251 -0
  667. package/src/ui-source/r3f-lod-binding.ts +91 -0
  668. package/src/ui-source/r3f-particle-binding.ts +235 -0
  669. package/src/ui-source/r3f-physics-binding.ts +483 -0
  670. package/src/ui-source/r3f-project-contracts.ts +444 -0
  671. package/src/ui-source/relative-import-specifier.ts +34 -0
  672. package/src/ui-source/reparent-guard.ts +544 -0
  673. package/src/ui-source/source-edit-request.ts +97 -0
  674. package/src/ui-source/source-write-backend.ts +618 -0
  675. package/src/ui-source/syntactic-prop-specs.ts +296 -0
  676. package/src/ui-source/tier-source-write-backend.ts +279 -0
  677. package/src/ui-source/ts-ast.ts +171 -0
  678. package/src/ui-source/utility-class-support.ts +169 -0
  679. package/src/ui-source/write-component-default.ts +133 -0
  680. package/src/ui-source/writer.ts +1989 -0
  681. package/src/viewport-activation-timings.ts +840 -0
  682. package/src/viewport-authoring-policy.ts +186 -0
  683. package/src/viewport-controls-hint.ts +57 -0
  684. package/src/viewport-door.ts +237 -0
  685. package/src/viewport-shading-boundary.ts +12 -0
  686. package/src/vite-error-surface.ts +141 -0
  687. package/src/wait-until.ts +37 -0
  688. package/src/workspace-areas.ts +156 -0
  689. package/src/workspace-aux-commands.ts +11 -0
  690. package/src/workspace-available-documents.ts +127 -0
  691. package/src/workspace-core-utilities.ts +31 -0
  692. package/src/workspace-document-ids.ts +59 -0
  693. package/src/workspace-document-registry.ts +612 -0
  694. package/src/workspace-document-restore.ts +145 -0
  695. package/src/workspace-host-commands.ts +141 -0
  696. package/src/workspace-persistence-gate.ts +40 -0
  697. package/src/workspace-play-utilities.ts +44 -0
  698. package/src/workspace-presets.ts +425 -0
  699. package/src/workspace-regions.ts +294 -0
  700. package/src/workspace-state-persistence.ts +536 -0
  701. package/src/workspace-static-panels.ts +73 -0
  702. package/src/workspace-status-registry.ts +121 -0
  703. package/src/workspace-style.ts +239 -0
  704. package/src/workspace-utility-commands.ts +74 -0
  705. package/src/workspace-utility-registry.ts +263 -0
  706. package/src/workspace-viewport-rect.ts +97 -0
  707. package/src/world-adoption.ts +115 -0
  708. package/src/world-document-routing.ts +104 -0
  709. package/vite-plugin-creation-site-write.ts +184 -0
  710. package/vite-plugin-creation-site.ts +80 -0
  711. package/vite-plugin-game-static.ts +303 -0
  712. package/vite-plugin-module-doorways.ts +336 -0
  713. package/vite-plugin-product-contributions.ts +197 -0
  714. package/vite-plugin-project-game-static.ts +125 -0
  715. package/vite-plugin-project-jsx-js.ts +65 -0
  716. package/vite-plugin-project-root-absolute-assets.ts +359 -0
  717. package/vite-plugin-shared-react.ts +420 -0
  718. package/vite-plugin-shared-three.ts +203 -0
  719. package/vite-plugin-ui-oid.ts +2106 -0
@@ -0,0 +1,461 @@
1
+ /**
2
+ * SCOPED GAME CSS — a foreign game's page-level stylesheet, rewritten so it
3
+ * paints only inside a container the host designates, and nothing else.
4
+ *
5
+ * The problem this exists for, stated as it was measured: the vendored pmndrs
6
+ * `racing-game` keeps its HUD's whole layout in `src/styles.css` — `.clock`,
7
+ * `.speed`, `.leaderboard`, plus `html, body, #root { width: 100vw; height:
8
+ * 100vh }` and a `body` background/colour/font. That sheet cannot be loaded
9
+ * into the editor's document: its `html`/`body`/`*`/`button` rules would
10
+ * restyle the EDITOR (its own canvases are sized by exactly those page rules).
11
+ * So the host shim deliberately never imported it, and every surface that
12
+ * shows the game's DOM — the UI board's story cards, the ingest surface in
13
+ * Play — rendered the HUD with zero layout. That was a recorded host-capability
14
+ * gap, not a game defect. This module closes it.
15
+ *
16
+ * ## The mechanism: native CSS `@scope`, not selector prefixing
17
+ *
18
+ * The whole sheet is wrapped in `@scope (<scopeSelector>) { … }`. The browser
19
+ * then matches every rule inside it ONLY against the scope root and its
20
+ * descendants — `.a .b`, `>` combinators, `:hover`, `::before`, `:is()`,
21
+ * attribute selectors, counters and anything CSS grows later, all with the
22
+ * engine's own semantics and with the sheet's internal cascade order intact.
23
+ *
24
+ * The alternative — parsing every selector and prefixing it with the container
25
+ * — was rejected because it means REIMPLEMENTING selector semantics: `*` would
26
+ * stop matching the container itself, specificity would silently shift by one
27
+ * class, and every future selector syntax is a new bug. `@scope` moves all of
28
+ * that into the engine that will render it. It is Baseline-available (Chrome
29
+ * 118+, Safari 17.4+, Firefox 128+) and the editor is a current-Chrome surface;
30
+ * `CSSScopeRule` is the feature detection the client half uses so a browser
31
+ * without it reports an honest note instead of leaking the sheet.
32
+ *
33
+ * What `@scope` does NOT do, and is therefore the entire remaining transform:
34
+ *
35
+ * 1. **Page-level selectors go inert.** `html`, `body` and `:root` are
36
+ * ANCESTORS of the scope root, so inside `@scope` they can never match — the
37
+ * `body { color: white }` that makes the HUD legible would silently vanish.
38
+ * Every such compound is rewritten to `:scope`, and runs of `:scope` left
39
+ * adjacent by that rewrite (`html body` → `:scope :scope`) collapse to one.
40
+ * The scope container's own BOX is not taken from the game: the host sets
41
+ * width/height/position inline on it (a story frame's `content`, the ingest
42
+ * `#container`), and an inline declaration beats any rule in this sheet — so
43
+ * `width: 100vw` arrives, loses, and costs nothing.
44
+ * 2. **Non-scopable at-rules must be hoisted.** `@keyframes`, `@font-face`,
45
+ * `@import` and friends define global names rather than matching elements;
46
+ * they are lifted out of the `@scope` block and emitted ahead of it.
47
+ * Keyframe names are deliberately NOT namespaced: measured on this repo,
48
+ * all 17 of the editor's own `@keyframes` are `vgai-`-prefixed while
49
+ * racing's two are `boostBlink`/`hideSoundIcon`, so the collision the
50
+ * namespacing would prevent does not exist — and buying it would require a
51
+ * correct `animation` shorthand rewriter, which is real machinery paid for
52
+ * with nothing.
53
+ * 3. **Relative `url()`s would resolve against the EDITOR's page.** They are
54
+ * rebased onto the stylesheet's own served URL, so a game asset request goes
55
+ * where the game meant it to.
56
+ *
57
+ * The game's bytes on disk are never touched: this runs at serve time, over a
58
+ * copy read out of the vendored tree, which is what keeps
59
+ * `vendor/games/verify-unaltered.mjs` green.
60
+ */
61
+
62
+ import { GAME_CSS_SCOPE_SELECTOR } from '@volter/editor-sdk/session/game-css-scope';
63
+ import postcss, { type AtRule } from 'postcss';
64
+
65
+ /**
66
+ * At-rules whose block holds ordinary style rules and therefore stays INSIDE
67
+ * the `@scope` wrapper — conditional groups plus `@layer`'s block form. Every
68
+ * other at-rule defines a global name (`@keyframes`, `@font-face`,
69
+ * `@property`, `@counter-style`) or is a header directive (`@import`,
70
+ * `@charset`, `@namespace`) and is hoisted ahead of the wrapper.
71
+ */
72
+ const SCOPABLE_AT_RULES = new Set(['media', 'supports', 'container', 'layer', 'scope']);
73
+
74
+ /** At-rules that must precede every other rule in the emitted sheet. */
75
+ const HEADER_AT_RULES = new Set(['charset', 'import', 'namespace']);
76
+
77
+ /**
78
+ * A compound selector whose type/pseudo part addresses the PAGE rather than an
79
+ * element inside it. Anchored at the compound's start; the negative lookahead
80
+ * keeps `bodyguard`/`html-frame` (real class-free custom element names) out.
81
+ */
82
+ const PAGE_COMPOUND = /^(html|body|:root)(?![\w-])/i;
83
+
84
+ /** Any character that can start a top-level combinator run. */
85
+ const COMBINATOR_CHAR = /[\s>+~]/;
86
+
87
+ export interface ScopeGameCssOptions {
88
+ /** The stylesheet's own bytes, exactly as read from disk. */
89
+ readonly css: string;
90
+ /** Selector the emitted `@scope` block is rooted at, e.g. `[data-x]`. */
91
+ readonly scopeSelector: string;
92
+ /**
93
+ * Root-relative URL path the stylesheet itself is served at (e.g.
94
+ * `/@fs/…/styles.css`) — the base every relative `url()` in it is rebased
95
+ * onto. Omitted, `url()`s are left untouched: a caller with no served
96
+ * identity for the sheet has nothing honest to rebase against.
97
+ */
98
+ readonly styleSheetPath?: string;
99
+ }
100
+
101
+ /**
102
+ * Origin the rebase arithmetic borrows. `URL` cannot resolve against a
103
+ * relative base, and the emitted url must stay ORIGIN-RELATIVE — a served game
104
+ * asset is on whatever origin the editor is on, and baking one in would break
105
+ * the moment a session moves port.
106
+ */
107
+ const REBASE_ORIGIN = 'http://vgai.invalid';
108
+
109
+ /**
110
+ * Rewrite one stylesheet so it applies only inside `scopeSelector`. Pure: no
111
+ * disk, no network, no globals — the whole point is that the interesting half
112
+ * of this feature is testable against racing's real `styles.css` offline.
113
+ */
114
+ export function scopeGameCss({ css, scopeSelector, styleSheetPath }: ScopeGameCssOptions): string {
115
+ const root = postcss.parse(css, { from: undefined });
116
+
117
+ if (styleSheetPath !== undefined) {
118
+ root.walkDecls((decl) => {
119
+ const rebased = rebaseUrls(decl.value, styleSheetPath);
120
+ if (rebased !== decl.value) decl.value = rebased;
121
+ });
122
+ }
123
+
124
+ // Hoist BEFORE selectors are rewritten: a `@keyframes` block's children are
125
+ // ordinary postcss `Rule`s whose "selectors" are `from`/`to`/`50%`, and
126
+ // rewriting those would be nonsense. Lifting them out first means the
127
+ // selector walk below cannot see them at all.
128
+ const hoisted: AtRule[] = [];
129
+ root.each((node) => {
130
+ if (node.type !== 'atrule') return;
131
+ if (SCOPABLE_AT_RULES.has(node.name.replace(/^-\w+-/, '').toLowerCase())) return;
132
+ hoisted.push(node);
133
+ });
134
+ for (const node of hoisted) node.remove();
135
+
136
+ root.walkRules((rule) => {
137
+ const rewritten = dedupeSelectors(rule.selectors.map(rewritePageSelector));
138
+ if (rewritten.length > 0) rule.selectors = rewritten;
139
+ });
140
+
141
+ // RESPONSIVE PREVIEW (design ledger: breakpoints — the beat-Figma move).
142
+ // Every game surface shares the one editor window, so a width `@media` in
143
+ // game CSS can never fire per-frame: a 375px story frame would still take
144
+ // the desktop styles. Rewriting width/height-only media conditions into
145
+ // `@container` queries — with every scope root made a size container
146
+ // below — means the frame's OWN width answers the query: a phone-preset
147
+ // frame actually applies the game's phone styles, live, next to a desktop
148
+ // frame applying the desktop ones. Serve-time only: the source (and any
149
+ // exported build) keeps real `@media` truth. Conditions with any
150
+ // non-dimensional feature (prefers-*, hover, print, …) are left as
151
+ // `@media` — rewriting them would be a lie, not a preview.
152
+ root.walkAtRules('media', (at) => {
153
+ const condition = containerConditionForMedia(at.params);
154
+ if (condition === null) return;
155
+ at.name = 'container';
156
+ at.params = condition;
157
+ });
158
+
159
+ const scoped = postcss.atRule({
160
+ name: 'scope',
161
+ params: `(${scopeSelector})`,
162
+ nodes: [],
163
+ raws: { before: '\n', afterName: ' ', between: ' ', after: '\n' },
164
+ });
165
+ scoped.append(root.nodes.map((node) => node.clone()));
166
+ // The container-query half of the responsive preview: the scope root IS the
167
+ // frame content, so it is the container the rewritten queries resolve
168
+ // against. Appended last, so a game's own `:scope` styling never wins the
169
+ // container-type back.
170
+ scoped.append(
171
+ postcss.rule({
172
+ selector: ':scope',
173
+ nodes: [postcss.decl({ prop: 'container-type', value: 'inline-size' })],
174
+ raws: { before: '\n', between: ' ', after: ' ' },
175
+ }),
176
+ );
177
+ root.removeAll();
178
+ // The first node inside a freshly-built block carries whatever `before` raw
179
+ // it had at the old top level (an empty string, for the very first rule of a
180
+ // file) — which would emit `@scope (…) {* { … }` on one line.
181
+ if (scoped.first) scoped.first.raws.before = '\n';
182
+
183
+ const header = hoisted.filter((node) => HEADER_AT_RULES.has(node.name.toLowerCase()));
184
+ const globals = hoisted.filter((node) => !HEADER_AT_RULES.has(node.name.toLowerCase()));
185
+ const out = postcss.root();
186
+ for (const node of [...header, ...globals]) out.append(node);
187
+ out.append(scoped);
188
+ return out.toString();
189
+ }
190
+
191
+ /**
192
+ * Replace every page-level compound in one selector with `:scope`, then
193
+ * collapse the adjacent duplicates that produces.
194
+ *
195
+ * `body` → `:scope`; `body.loading .x` → `:scope.loading .x`; `html body #root`
196
+ * → `:scope #root`. A selector with no page compound comes back untouched, so
197
+ * the overwhelming majority of a game's rules pass through byte-for-byte.
198
+ */
199
+ export function rewritePageSelector(selector: string): string {
200
+ const compounds = splitCompounds(selector);
201
+ let sawPageCompound = false;
202
+ const mapped = compounds.map((part) => {
203
+ if (part.combinator) return part;
204
+ if (!PAGE_COMPOUND.test(part.text)) return part;
205
+ sawPageCompound = true;
206
+ return { ...part, text: part.text.replace(PAGE_COMPOUND, ':scope') };
207
+ });
208
+ if (!sawPageCompound) return selector;
209
+ return collapseScopeRuns(mapped)
210
+ .map((part) => part.text)
211
+ .join('');
212
+ }
213
+
214
+ interface SelectorPart {
215
+ readonly text: string;
216
+ readonly combinator: boolean;
217
+ }
218
+
219
+ /**
220
+ * Split a complex selector into alternating compound / combinator parts,
221
+ * ignoring anything inside `(…)`, `[…]` or a string — so `:is(a, b) > c` and
222
+ * `[title="a b"]` survive intact.
223
+ */
224
+ function splitCompounds(selector: string): SelectorPart[] {
225
+ const parts: SelectorPart[] = [];
226
+ let depth = 0;
227
+ let quote: string | null = null;
228
+ let buffer = '';
229
+ const flush = (combinator: boolean): void => {
230
+ if (buffer.length > 0) parts.push({ text: buffer, combinator });
231
+ buffer = '';
232
+ };
233
+ for (let i = 0; i < selector.length; i += 1) {
234
+ const ch = selector[i]!;
235
+ if (quote) {
236
+ buffer += ch;
237
+ if (ch === quote && selector[i - 1] !== '\\') quote = null;
238
+ continue;
239
+ }
240
+ if (ch === '"' || ch === "'") {
241
+ quote = ch;
242
+ buffer += ch;
243
+ continue;
244
+ }
245
+ if (ch === '(' || ch === '[') depth += 1;
246
+ else if (ch === ')' || ch === ']') depth -= 1;
247
+ if (depth === 0 && COMBINATOR_CHAR.test(ch)) {
248
+ // Consume the whole run of combinator characters and whitespace.
249
+ let run = '';
250
+ let j = i;
251
+ while (j < selector.length && COMBINATOR_CHAR.test(selector[j]!)) {
252
+ run += selector[j]!;
253
+ j += 1;
254
+ }
255
+ flush(false);
256
+ parts.push({ text: run, combinator: true });
257
+ i = j - 1;
258
+ continue;
259
+ }
260
+ buffer += ch;
261
+ }
262
+ flush(false);
263
+ return parts;
264
+ }
265
+
266
+ /**
267
+ * `:scope :scope .x` → `:scope .x`. Only a DESCENDANT run collapses: `:scope >
268
+ * :scope` names a real (and, after the rewrite, unsatisfiable) relationship,
269
+ * and silently flattening it would change what the author asked for.
270
+ */
271
+ function collapseScopeRuns(parts: readonly SelectorPart[]): SelectorPart[] {
272
+ const out: SelectorPart[] = [];
273
+ for (const part of parts) {
274
+ const previousCombinator = out.at(-1);
275
+ const previousCompound = out.at(-2);
276
+ if (
277
+ part.text === ':scope' &&
278
+ previousCombinator?.combinator === true &&
279
+ previousCombinator.text.trim() === '' &&
280
+ previousCompound?.text === ':scope'
281
+ ) {
282
+ out.pop();
283
+ continue;
284
+ }
285
+ out.push(part);
286
+ }
287
+ return out;
288
+ }
289
+
290
+ /** `:scope, :scope, #root` → `:scope, #root`; order of first appearance kept. */
291
+ function dedupeSelectors(selectors: readonly string[]): string[] {
292
+ const seen = new Set<string>();
293
+ const out: string[] = [];
294
+ for (const selector of selectors) {
295
+ const key = selector.trim();
296
+ if (key.length === 0 || seen.has(key)) continue;
297
+ seen.add(key);
298
+ out.push(key);
299
+ }
300
+ return out;
301
+ }
302
+
303
+ /**
304
+ * Rebase every relative `url()` in one declaration value onto `basePath` (a
305
+ * root-relative served path), emitting a root-relative url. Absolute urls,
306
+ * protocol-relative urls, root-relative urls, `data:`/`blob:` payloads and
307
+ * bare fragments are left exactly as authored — rebasing any of those would
308
+ * change what the sheet requests.
309
+ */
310
+ export function rebaseUrls(value: string, basePath: string): string {
311
+ return value.replace(
312
+ /\burl\(\s*(?:"([^"]*)"|'([^']*)'|([^)'"\s]*))\s*\)/gi,
313
+ (whole, doubleQuoted?: string, singleQuoted?: string, bare?: string) => {
314
+ const target = doubleQuoted ?? singleQuoted ?? bare ?? '';
315
+ if (target.length === 0) return whole;
316
+ if (/^(?:[a-z][a-z0-9+.-]*:|\/\/|\/|#)/i.test(target)) return whole;
317
+ try {
318
+ const resolved = new URL(target, `${REBASE_ORIGIN}${basePath}`);
319
+ return `url("${resolved.pathname}${resolved.search}${resolved.hash}")`;
320
+ } catch {
321
+ return whole;
322
+ }
323
+ },
324
+ );
325
+ }
326
+
327
+ // ---------------------------------------------------------------------------
328
+ // The project's declared sheets, and the honest verdict about them
329
+ // ---------------------------------------------------------------------------
330
+
331
+ /** What one root declared, read straight off the raw manifest. */
332
+ interface DeclaredStyles {
333
+ /** Project-root-relative paths, manifest order, de-duplicated. */
334
+ readonly paths: string[];
335
+ /**
336
+ * True when a root mounts a game whose own page this host replaced — an
337
+ * `{ ingest }` adapter. It is the one case where "this project declares no
338
+ * stylesheet" is EVIDENCE of a gap rather than a normal fact: the game had a
339
+ * page, the host shim is standing in for it, and page-level CSS is precisely
340
+ * what a shim cannot carry. A first-party project has no page to lose, so it
341
+ * is never told anything.
342
+ */
343
+ readonly replacesGamePage: boolean;
344
+ }
345
+
346
+ /** Read `roots[].styles` and the ingest verdict off a parsed manifest. */
347
+ export function declaredGameStyles(manifest: unknown): DeclaredStyles {
348
+ const roots = (manifest as { roots?: unknown } | null)?.roots;
349
+ const paths: string[] = [];
350
+ let replacesGamePage = false;
351
+ if (!Array.isArray(roots)) return { paths, replacesGamePage };
352
+ for (const root of roots) {
353
+ if (!root || typeof root !== 'object') continue;
354
+ const record = root as { styles?: unknown; adapter?: unknown };
355
+ const adapter = record.adapter;
356
+ if (adapter && typeof adapter === 'object' && 'ingest' in adapter) replacesGamePage = true;
357
+ if (!Array.isArray(record.styles)) continue;
358
+ for (const entry of record.styles) {
359
+ if (typeof entry === 'string' && entry.length > 0 && !paths.includes(entry))
360
+ paths.push(entry);
361
+ }
362
+ }
363
+ return { paths, replacesGamePage };
364
+ }
365
+
366
+ /** One declared sheet, as the caller's I/O found it. */
367
+ export interface LoadedStyleSheet {
368
+ /** The bytes on disk, untouched. */
369
+ readonly css: string;
370
+ /** Root-relative path the sheet is served at — the `url()` rebase base. */
371
+ readonly servedPath: string;
372
+ }
373
+
374
+ /** What the editor client is handed for the open project. */
375
+ export interface ScopedGameStyles {
376
+ /** The concatenated, scoped stylesheet — `''` when there is nothing to serve. */
377
+ readonly css: string;
378
+ /** The declared paths that were actually read, in emission order. */
379
+ readonly sources: string[];
380
+ /**
381
+ * Non-null when the host KNOWS a surface showing this game's DOM will be
382
+ * missing page-level styling, phrased for the person looking at that surface.
383
+ * Null is not "everything is fine" in general — it is "this host has no
384
+ * evidence of a gap", which for a first-party project is the ordinary state.
385
+ */
386
+ readonly note: string | null;
387
+ }
388
+
389
+ /**
390
+ * Turn the open project's manifest into the stylesheet its game surfaces need.
391
+ *
392
+ * Pure over its `readStyleSheet` callback so the whole decision — which paths,
393
+ * what gets scoped, and what the surfaces are told when it cannot be done — is
394
+ * testable with no disk and no server.
395
+ */
396
+ export function buildScopedGameStyles(options: {
397
+ readonly manifest: unknown;
398
+ readonly readStyleSheet: (projectRelativePath: string) => LoadedStyleSheet | null;
399
+ }): ScopedGameStyles {
400
+ const { paths, replacesGamePage } = declaredGameStyles(options.manifest);
401
+
402
+ if (paths.length === 0) {
403
+ return {
404
+ css: '',
405
+ sources: [],
406
+ note: replacesGamePage
407
+ ? 'unstyled — this project ingests a game whose page-level stylesheet it never declared. ' +
408
+ 'Add it as `styles` on that root in vgai.project.json and the editor will serve it ' +
409
+ 'scoped to the game.'
410
+ : null,
411
+ };
412
+ }
413
+
414
+ const chunks: string[] = [];
415
+ const sources: string[] = [];
416
+ const missing: string[] = [];
417
+ for (const path of paths) {
418
+ const sheet = options.readStyleSheet(path);
419
+ if (!sheet) {
420
+ missing.push(path);
421
+ continue;
422
+ }
423
+ sources.push(path);
424
+ chunks.push(
425
+ scopeGameCss({
426
+ css: sheet.css,
427
+ scopeSelector: GAME_CSS_SCOPE_SELECTOR,
428
+ styleSheetPath: sheet.servedPath,
429
+ }),
430
+ );
431
+ }
432
+
433
+ return {
434
+ css: chunks.join('\n'),
435
+ sources,
436
+ note:
437
+ missing.length === 0
438
+ ? null
439
+ : `unstyled — declared stylesheet${missing.length === 1 ? '' : 's'} ` +
440
+ `${missing.map((path) => `\`${path}\``).join(', ')} could not be read from this project.`,
441
+ };
442
+ }
443
+
444
+ /**
445
+ * The `@container` condition equivalent to a width/height-only `@media`
446
+ * prelude, or null when the prelude uses anything else (media types other
447
+ * than screen/all, `not`, commas, non-dimensional features) — those stay
448
+ * `@media`, honestly window-scoped. Handles both the colon form
449
+ * `(max-width: 600px)` and the range form `(width <= 600px)`.
450
+ */
451
+ export function containerConditionForMedia(params: string): string | null {
452
+ let p = params.trim();
453
+ p = p.replace(/^only\s+/i, '');
454
+ p = p.replace(/^(screen|all)\s+and\s+/i, '');
455
+ if (/^(screen|all)$/i.test(p)) return null; // type-only prelude — nothing to query
456
+ if (/,|\bnot\b|\bor\b/i.test(p)) return null;
457
+ const terms = p.split(/\s+and\s+/i);
458
+ const dimensional = /^\(\s*((min-|max-)?(width|height)\s*:|(width|height)\s*[<>=])[^()]*\)$/i;
459
+ if (!terms.every((term) => dimensional.test(term.trim()))) return null;
460
+ return p;
461
+ }