@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,621 @@
1
+ /* THE DOCUMENT SURFACE, and every pane the editor portals into a part of the
2
+ * workbench: the document box, its header strip, its shelf rail, the utility
3
+ * panel portal, the workspace-task overlay, and the play-transition chrome
4
+ * classes `live-transition.ts` adds and removes.
5
+ *
6
+ * WHAT IS NOT HERE is the ARRANGEMENT. Groups, sashes, tab strips, splits and
7
+ * the grid they live in are the workbench's, and the workbench draws them;
8
+ * this file dresses only what the editor itself renders INSIDE a part it was
9
+ * handed. Every rule below was measured against a real surface, and the
10
+ * measurement is in its own comment.
11
+ *
12
+ * The `vgai-dock-*` class names are the editor's own document classes and the
13
+ * fork's skin CSS keys on the same names, so they are a two-repository wire
14
+ * rather than a private spelling.
15
+ */
16
+
17
+ /* Workspace tasks (Account today) preserve the live authored subject behind
18
+ them in Glass + Floating. They are not fake viewport documents: the same
19
+ descriptor remains a normal center tab in Classic/Docked. */
20
+ .vgai-workspace-task-overlay {
21
+ position: absolute;
22
+ top: 72px;
23
+ bottom: 64px;
24
+ left: 50%;
25
+ z-index: var(--vgai-z-modal);
26
+ width: min(760px, calc(100% - 96px));
27
+ min-height: 320px;
28
+ overflow: hidden;
29
+ transform: translateX(-50%);
30
+ display: flex;
31
+ flex-direction: column;
32
+ border: var(--vgai-stroke-resting) solid var(--vgai-boundary-default);
33
+ border-radius: var(--vgai-radius-lg);
34
+ box-shadow: var(--vgai-shadow-lg);
35
+ }
36
+
37
+ .vgai-workspace-task-overlay-header {
38
+ min-height: var(--vgai-panel-header-height);
39
+ box-sizing: border-box;
40
+ display: flex;
41
+ align-items: center;
42
+ justify-content: space-between;
43
+ gap: var(--vgai-space-3);
44
+ padding: var(--vgai-space-1) var(--vgai-space-3);
45
+ color: var(--vgai-content-primary);
46
+ font-size: var(--vgai-font-md);
47
+ font-weight: 650;
48
+ }
49
+
50
+ .vgai-workspace-task-overlay-body,
51
+ .vgai-workspace-task-overlay-body > .vgai-dock-document {
52
+ min-height: 0;
53
+ flex: 1;
54
+ }
55
+
56
+ @media (max-width: 720px) {
57
+ .vgai-workspace-task-overlay {
58
+ top: 56px;
59
+ bottom: 52px;
60
+ width: calc(100% - 32px);
61
+ }
62
+ }
63
+
64
+ .vgai-dock-panel,
65
+ .vgai-dock-document,
66
+ .vgai-dock-document-content {
67
+ min-width: 0;
68
+ min-height: 0;
69
+ width: 100%;
70
+ height: 100%;
71
+ }
72
+
73
+ /* Interior wrappers paint NOTHING (liquid-glass productization, report
74
+ §2.31 interior-background audit): the surface a pane is drawn INTO
75
+ already carries the theme's panel color, so a
76
+ second `--vgai-bg-1` here double-tints translucent themes and occludes
77
+ the glass surface. Opaque themes keep their look because the group
78
+ surface carries the fill — for every theme. */
79
+ .vgai-dock-panel,
80
+ .vgai-dock-document,
81
+ .vgai-dock-document-content {
82
+ display: flex;
83
+ flex-direction: column;
84
+ overflow: hidden;
85
+ pointer-events: auto;
86
+ }
87
+
88
+ /* THE CONTENT BOX IS A DOCUMENT'S CONTAINING BLOCK. A document body that
89
+ positions itself absolutely (the Asset Lab 3D stage: `inset: -12` to bleed
90
+ under the panel padding) resolves against the nearest POSITIONED ancestor.
91
+ With no `position` here that ancestor was the whole document box — header
92
+ strip included — so a document with a host toolbar painted its stage OVER
93
+ the strip (measured 2026-09-03 on the mesh document: the strip sat at
94
+ y=66 in the DOM and the stage's canvas at y=54, covering it; the chrome
95
+ capture showed the 3D pill exactly where the header should be). Positioned,
96
+ the content box is the frame a document's absolute children fill, and the
97
+ host's strip stays the host's. */
98
+ .vgai-dock-document-content {
99
+ position: relative;
100
+ }
101
+
102
+ .vgai-dock-document-toolbar {
103
+ flex: 0 0 auto;
104
+ display: flex;
105
+ align-items: center;
106
+ gap: var(--vgai-space-2);
107
+ min-height: var(--vgai-local-toolbar-height);
108
+ /* A document's header is a step above its panel, the way Blender's area
109
+ header sits a step above its area. */
110
+ background: var(--vgai-surface-header);
111
+ border-bottom: var(--vgai-stroke-resting) solid var(--vgai-structural-divider);
112
+ pointer-events: auto;
113
+ }
114
+
115
+ /* THE SHELF RAIL — the host's second region (`DocumentShelfRail`): a
116
+ vertical rail over the leading edge of the content box, the geometry the
117
+ scene viewport's own transform strip used (`.vgai-viewport-toolbar-left`)
118
+ generalized to every document. Absolute inside the positioned content box,
119
+ so it never covers the header strip and the stage keeps its size. */
120
+ .vgai-dock-document-shelf {
121
+ position: absolute;
122
+ left: var(--vgai-space-4);
123
+ top: var(--vgai-viewport-overlay-top, var(--vgai-space-4));
124
+ z-index: calc(var(--vgai-z-dropdown, 1000) - 1);
125
+ isolation: isolate;
126
+ display: flex;
127
+ flex-direction: column;
128
+ align-items: flex-start;
129
+ gap: var(--vgai-space-2);
130
+ pointer-events: auto;
131
+ }
132
+
133
+ /* Blender's toolbar is ONE column: the transform strip stacks its buttons
134
+ when it rides the rail (it lays them in a row over the stage otherwise),
135
+ and the RAIL is the panel — the strip and the document's own operators
136
+ drop their own borders and fills so the column reads as one. */
137
+ .vgai-dock-document-shelf .vgai-floating-toolbar,
138
+ .vgai-dock-document-shelf .vgai-floating-toolbar > * {
139
+ display: flex;
140
+ flex-direction: column;
141
+ align-items: stretch;
142
+ }
143
+
144
+ /* Blender's tool shelf is a FIXED-WIDTH region, not a card that grows to its
145
+ widest tool. RE-MEASURED 2026-09-18 in `modeling-edit-none.png` (2x, halved)
146
+ by reading the pixel columns and rows rather than the picture: what the
147
+ earlier reading took for a 38 px region FILL is the BUTTON — the dark 39-lum
148
+ box runs x 22..97 (38 CSS px of fill, one 1 px border each side) and its
149
+ rows run 765..830 (33 CSS px of fill inside the same border), with the
150
+ viewport's own 63-lum grey showing through the 7 CSS px between one button
151
+ and the next. So Blender's tool is 38 wide x ~34 tall of fill in a 40x35 box, and
152
+ the rail carries no fill of its own between them (our panel is this repo's
153
+ own decision, recorded in `a11f55c529`, and left standing here).
154
+
155
+ Overriding the control-height variables HERE resizes exactly this rail's
156
+ buttons — they already read them — without touching the same controls
157
+ anywhere else; the ToolStrip also draws in a ROW over the scene viewport,
158
+ where the size is that surface's. The size is a var with a fallback because
159
+ it wants a density home (`EditorDensity.chrome`, beside `treeRow`) the way
160
+ every other chrome measurement has one — `theme.ts` is being edited by
161
+ another unit, so the token is CONSUMED here and declared nowhere yet. */
162
+ .vgai-dock-document-shelf:not(:empty) {
163
+ /* No panel: Blender's tool shelf paints nothing BETWEEN its groups — the
164
+ viewport shows through there. Each TOOL, though, is an opaque widget:
165
+ re-measured 2026-09-18 on the native 2x frame (`modeling-edit-none.png`,
166
+ row y=400) the box runs x 20..99 as 2 px of #3c3c3c border, 76 px of
167
+ #272727 fill, 2 px of border — i.e. at 1x a 40 px box of
168
+ `--vgai-widget-menu` inside a one-pixel boundary. See the tool rule
169
+ below for the fill and the pitch. */
170
+ --vgai-control-compact-height: var(--vgai-tool-size, 36px);
171
+ --vgai-control-default-height: var(--vgai-tool-size, 36px);
172
+ --vgai-control-comfortable-height: var(--vgai-tool-size, 36px);
173
+ /* Blender's operator glyph inks 20x20 CSS px (extrude 20x23 — the lifted
174
+ slab is taller). These glyphs ink at ~1.1 of their em box, so the rail's
175
+ rung is the chrome's LARGEST (`--vgai-icon-2xl`, 18 under Blender's
176
+ density) and the two rungs the rail's strips ask for resolve to it here.
177
+ The call sites keep their own rung so the row-over-the-stage ToolStrip is
178
+ untouched; a rail control that wants a small glyph (the snap popover's
179
+ caret, `xs`) still gets one. */
180
+ --vgai-tool-glyph-size: var(--vgai-icon-2xl);
181
+ --vgai-icon-sm: var(--vgai-tool-glyph-size);
182
+ --vgai-icon-md: var(--vgai-tool-glyph-size);
183
+ /* The rail is EXACTLY one tool wide: the tool's own boundary is inside its
184
+ border box now, so nothing is added for it here — a rail wider than its
185
+ tools showed a sliver of viewport down both sides of the column. */
186
+ width: var(--vgai-tool-width, 40px);
187
+ align-items: stretch;
188
+ }
189
+
190
+ /* One TOOL, stated once: every icon button on the rail is the shelf's tool
191
+ size, whatever shape its own surface gave it. The transform strip's
192
+ segments are `control + 12px` wide because a ROW of them reads as a
193
+ segmented capsule; in a column that extra width is what made the strip's
194
+ buttons 28 px against the mesh operators' 34 in the same rail. */
195
+ .vgai-dock-document-shelf .vgai-btn[data-icon="true"][data-size],
196
+ .vgai-dock-document-shelf .vgai-floating-toolbar .vgai-btn[data-icon="true"][data-shape] {
197
+ width: var(--vgai-tool-width, 40px);
198
+ height: var(--vgai-tool-size, 36px);
199
+ }
200
+
201
+ /* The strip's own inline padding is ROW geometry — in the column it inset the
202
+ tools 4 px each side of a 38 px rail (measured live through
203
+ `document-script`: the strip computed `0px 4px`, its tooltip anchors 30 px,
204
+ and every tool stretched to that). The rail IS the panel, so the strip
205
+ contributes no inset of its own. */
206
+ .vgai-dock-document-shelf .vgai-toolbar.vgai-floating-toolbar {
207
+ padding-inline: 0;
208
+ }
209
+
210
+ /* A SPLIT tool (snap and its settings) is still ONE column wide. Blender's
211
+ rail is a single column and its "there is more here" is a corner triangle,
212
+ never a second button beside the first — measured live, at the tool's own
213
+ width the pair ran 68 px across a 38 px rail and the caret hung outside it.
214
+ The primary takes the tool's width less a caret sliver. */
215
+ .vgai-dock-document-shelf .vgai-split-button {
216
+ width: var(--vgai-tool-width, 40px);
217
+ }
218
+ /* Its two halves are wrapped in tooltip anchors, so the flex items are those
219
+ spans, not the buttons — and the buttons inside them take the span's width
220
+ rather than the tool's. */
221
+ .vgai-dock-document-shelf .vgai-split-button > * {
222
+ min-width: 0;
223
+ flex: 1 1 auto;
224
+ }
225
+ .vgai-dock-document-shelf .vgai-split-button > * + * {
226
+ flex: 0 0 13px;
227
+ }
228
+ .vgai-dock-document-shelf .vgai-split-button .vgai-btn[data-icon="true"][data-size] {
229
+ width: auto;
230
+ min-width: 0;
231
+ }
232
+
233
+ /* THE TOOL'S OWN SURFACE. Blender's rail tool is not a ghost: measured at 2x
234
+ in `modeling-edit-none.png` (row y=400, and column x=25 down the strip) the
235
+ resting box is an opaque #272727 fill — `--vgai-widget-menu`, the same fill
236
+ its menu buttons take — inside a 1 px #3c3c3c boundary. Ours drew nothing
237
+ but a near-invisible border, which is why the rail read as glyphs scattered
238
+ on the viewport instead of a toolbar. The pressed tool keeps the accent it
239
+ already paints (`aria-pressed`), so this rule stands aside for it. */
240
+ /* …and its GLYPH is full-strength ink, not the ghost button's muted one.
241
+ MEASURED at 2x in `modeling-edit-none.png`, x 40..200 down the rail: every
242
+ glyph in the column peaks at (227,227,227)/(228,228,228) — the select,
243
+ move, rotate and scale tools EXACTLY as much as the six operator marks, so
244
+ this is the rail's ink and not a property of the marks' drawings. The same
245
+ frame set puts Blender's TEXT at the same place (viewport header 229,
246
+ outliner labels 229, properties 229), which is the finding: Blender does
247
+ not draw icons brighter than words — it draws both at its primary ink, and
248
+ ours drew the rail at `content.muted` #c2c2c2, 33 levels down. #c2c2c2 is
249
+ a real Blender ink, just the DIM one (the outliner's secondary labels). */
250
+ .vgai-dock-document-shelf
251
+ .vgai-btn[data-variant="ghost"]:not([aria-pressed="true"]):not(:disabled) {
252
+ background: var(--vgai-widget-menu);
253
+ border-color: var(--vgai-boundary-default);
254
+ color: var(--vgai-content-primary);
255
+ }
256
+ .vgai-dock-document-shelf
257
+ .vgai-btn[data-variant="ghost"]:not([aria-pressed="true"]):not(:disabled):hover {
258
+ background: var(--vgai-widget-menu-hover);
259
+ }
260
+
261
+ /* CORRECTED against the frame's own button borders (`modeling-edit-none.png`,
262
+ column x=25 at 2x: fills at 326..390, 393..460, 463..530, 533..599 with a
263
+ 2 px border between them, then 16 px of plain viewport at 310..325 and
264
+ 600..615): inside a GROUP Blender's pitch is 35 CSS px and the box is 35 —
265
+ the tools are CONTIGUOUS, separated only by the one pixel of border they
266
+ share. The 7-8 px of viewport this file first recorded between two tools is
267
+ the gap between GROUPS, and it appears exactly four times in a nine-tool
268
+ rail. So a strip's own gap is ZERO and the group gap is what the divider
269
+ and the shelf spend. */
270
+ .vgai-dock-document-shelf .vgai-floating-toolbar {
271
+ gap: 0;
272
+ }
273
+ /* Contiguous means ONE border between two tools, not two — in EVERY strip the
274
+ rail carries, which is what `.vgai-document-shelf-tools` is: a contribution's
275
+ own column of operators (`@vgai/blender`'s Model document, whose own
276
+ comment already said the host states this pitch once and here). Listed here
277
+ rather than restated there, because the pitch is the RAIL's: measured live
278
+ before this line existed, the transform group ran at Blender's 35 and the
279
+ six mesh operators below it at 36, two rhythms in one column. */
280
+ .vgai-dock-document-shelf :is(.vgai-floating-toolbar, .vgai-document-shelf-tools) > * + * {
281
+ margin-block-start: calc(-1 * var(--vgai-stroke-resting));
282
+ }
283
+ /* A divider inside the rail IS the group gap. The strip draws it as a 1x16
284
+ vertical rule because it was authored for a ROW; in the column Blender
285
+ shows plain viewport there, so it becomes empty height. */
286
+ .vgai-dock-document-shelf .vgai-toolbar-divider {
287
+ width: 100%;
288
+ height: var(--vgai-tool-gap, var(--vgai-space-1));
289
+ background: none;
290
+ border: 0;
291
+ margin-block-start: 0;
292
+ }
293
+ /* …and so is the space between the rail's own groups. */
294
+ .vgai-dock-document-shelf {
295
+ gap: var(--vgai-tool-gap, var(--vgai-space-2));
296
+ }
297
+
298
+ .vgai-dock-document-shelf .vgai-floating-toolbar {
299
+ padding: 0;
300
+ border: 0;
301
+ border-radius: 0;
302
+ background: none;
303
+ box-shadow: none;
304
+ backdrop-filter: none;
305
+ -webkit-backdrop-filter: none;
306
+ }
307
+
308
+ /* EVERY GROUP CASTS THE WIDGET EMBOSS, and it lands under the GROUP — which
309
+ is what `theme.css`'s emboss rule already says in prose ("Only stacked
310
+ widgets in one group escape the rule entirely… the emboss lands under the
311
+ GROUP") and what this rail is the first surface to actually paint.
312
+ MEASURED on `modeling-edit-none.png` at native 2x: the two rows under group
313
+ 1's bottom border (device y 313-314, x 24..96) read luminance 53 against the
314
+ viewport's own 63, with the columns outside the group's width and the rows
315
+ beside its left and right edges untouched — bottom only, one CSS px, no
316
+ blur. `--vgai-widget-emboss-shadow` composites its 36/255 black over 63 to
317
+ 54, one level off the frame, so this is the same token and not a second
318
+ number; a look that names no emboss resolves it to `none` and paints
319
+ exactly what it painted before.
320
+
321
+ TWO THINGS DECIDE THE SELECTOR, both measured live through the command
322
+ door across three cold boots rather than read off the cascade.
323
+
324
+ It has to be the rail's DIRECT children. A contributed shelf arrives inside
325
+ `ToolHost`'s wrapper, and that wrapper is `overflow: auto` — put the shadow
326
+ on the contribution's own column two levels down and the wrapper CLIPS it,
327
+ because the two boxes end on the same pixel (207..453 both, the last
328
+ button's bottom). Computed style said `rgba(0,0,0,0.14) 0 1px 0` and the
329
+ capture showed nothing under the group; that gap is what named the clip.
330
+
331
+ And `> *` alone is one class, which loses BOTH ways: to the reset a dozen
332
+ lines above (`.vgai-dock-document-shelf .vgai-floating-toolbar {
333
+ box-shadow: none }`, two classes) on specificity, and to `theme.css`'s
334
+ `.vgai-floating-toolbar { box-shadow: var(--vgai-island-shadow, …) }` on
335
+ ORDER, because this sheet is imported BEFORE `theme.css` —
336
+ `editor-styles.css` says so and prescribes exactly this remedy, scoping the
337
+ rule under your own root. The rail's `role="toolbar"` is that root's own
338
+ declaration (`DocumentShelfRail.tsx`), not a specificity trick. */
339
+ .vgai-dock-document-shelf[role="toolbar"] > * {
340
+ box-shadow: var(--vgai-widget-emboss-shadow);
341
+ }
342
+
343
+ /* A viewport toolbar that used to position ITSELF over the stage sits
344
+ in-flow once the rail carries it: the rail is the positioned thing now. */
345
+ .vgai-dock-document-shelf .vgai-viewport-toolbar {
346
+ position: static;
347
+ }
348
+
349
+ /* The document's OWN header keeps the leading, full-width part of the row,
350
+ so a header that right-aligns its controls (the Game document's) still
351
+ reaches the trailing edge when it is alone; the host's 3D controls, when
352
+ present, take only their content width beside it. */
353
+ .vgai-dock-document-toolbar-own {
354
+ flex: 1 1 auto;
355
+ min-width: 0;
356
+ }
357
+
358
+ /* THE HEADER'S TRANSFORM CONTROLS (`TransformHeaderControls`) — orientation,
359
+ pivot, snap and transform options, which are HEADER controls in Blender's 3D
360
+ viewport and rode our tool shelf until 2026-09-18. Like the 3D controls
361
+ beside them these are a plain in-flow group inside the strip, so they drop
362
+ the toolbar recipe's own band (its bottom rule) and keep only the
363
+ grouping.
364
+
365
+ The GAP is measured, not chosen: on the native 2x `modeling.png` at row
366
+ y=62 Blender's four wells (orientation x 1171..1322, pivot 1335..1396, snap
367
+ 1409..1510, proportional editing 1523..1624) are separated by exactly 12
368
+ device px of bare header — 6 CSS px, which is `space-3`. Compounded with
369
+ `.vgai-toolbar` because theme.css declares the recipe LATER at the same
370
+ specificity (the precedent is `Object3DDocumentToolbar.css`'s own header
371
+ note): measured through `editor.document.query`, the uncompounded rule lost
372
+ and the row computed `gap: 4px`. Only the two declarations that WIN are
373
+ here: the compact recipe's own `padding-inline` and `min-height` outrank
374
+ even the compound (an attribute selector on top of the class), and both are
375
+ right for this row anyway — 4px of inset separates the cluster from the 3D
376
+ controls beside it, and the min-height already resolves to the density's
377
+ 20px control. */
378
+ .vgai-toolbar.vgai-transform-header-controls {
379
+ flex: 0 0 auto;
380
+ gap: var(--vgai-space-3);
381
+ border: 0;
382
+ }
383
+
384
+ .vgai-toolbar.vgai-transform-header-controls > * {
385
+ flex: 0 0 auto;
386
+ }
387
+
388
+ /* The orientation dropdown carries its LABEL, the way Blender's `Global v`
389
+ does (`Toolbar.tsx`'s `TransformOrientationButton` has the measurement).
390
+ Same three-part row as the model toolbar's own labelled triggers beside it:
391
+ glyph, word, chevron. */
392
+ .vgai-transform-orientation-trigger {
393
+ display: inline-flex;
394
+ align-items: center;
395
+ gap: var(--vgai-space-1);
396
+ white-space: nowrap;
397
+ }
398
+ /* Apple-style material assignment for persistent, text-heavy tool panels.
399
+ Clear glass remains the compact navigation/control material; Hierarchy,
400
+ Inspector, Assets, Agent, and utility panels use ONE Regular surface at
401
+ their portal host. Regular applies the theme's strongest frost plus a
402
+ low-alpha, continuously sampled luminosity correction: dark scenery is
403
+ lifted and bright scenery is dimmed without an opaque panel fill.
404
+ The portal IS the host now: a utility is rendered into one element the
405
+ frame handed over, so the material is assigned to that element directly. */
406
+ [data-vgai-chrome="islands"] .vgai-regular-panel-portal {
407
+ color: var(--vgai-content-primary);
408
+ text-shadow: var(--vgai-content-text-shadow, none);
409
+ background: var(
410
+ --vgai-glass-regular-panel-adaptive-bg,
411
+ var(--vgai-glass-regular-panel-bg, var(--vgai-surface-panel))
412
+ );
413
+ backdrop-filter: var(--vgai-glass-regular-panel-backdrop-filter, none);
414
+ -webkit-backdrop-filter: var(--vgai-glass-regular-panel-backdrop-filter, none);
415
+ border-color: color-mix(in srgb, var(--vgai-content-primary) 22%, transparent);
416
+ }
417
+ /* The Regular host already owns the 24px body frost. Semantic content floors
418
+ get the stronger adaptive luminosity correction, not a nested glass/filter
419
+ layer. The host's SVG chain still deepens blur toward the glass body. */
420
+ [data-vgai-chrome="islands"] .vgai-regular-panel-portal .vgai-content-frost {
421
+ background: var(
422
+ --vgai-glass-regular-content-adaptive-bg,
423
+ var(--vgai-content-frost-bg, transparent)
424
+ );
425
+ backdrop-filter: none;
426
+ -webkit-backdrop-filter: none;
427
+ }
428
+
429
+ /* A utility is always mounted and lives in a render portal, so that portal
430
+ owns the Regular material. Utility content may still use
431
+ EditorSurface for layout, but it must not repaint an opaque panel over that
432
+ shared adaptive host. */
433
+ .vgai-regular-panel-portal > .vgai-surface {
434
+ background: transparent;
435
+ }
436
+ .vgai-dock-document,
437
+ .vgai-dock-document-content,
438
+ .vgai-dock-document-toolbar {
439
+ background: transparent;
440
+ }
441
+
442
+ /* ---- Play-mode entry/exit transition (play-transition.ts). ----------------
443
+ The chrome dissolve is pure GPU compositing (opacity/transform/filter) on
444
+ the chrome elements; no layout animates — a part leaves layout only AFTER
445
+ it is invisible. Material stays the
446
+ theme's own glass vocabulary (the elements already carry the card/group
447
+ paint); the dissolve only thins it to nothing: a brief brightness bloom,
448
+ blur ramp, slight scale-down, and a short slide toward the panel's own
449
+ nearest edge (--vgai-play-dx/dy, assigned per element by
450
+ `live-transition.ts` with a per-edge stagger). */
451
+
452
+ @keyframes vgai-play-dissolve {
453
+ 0% {
454
+ opacity: 1;
455
+ transform: none;
456
+ filter: blur(0) brightness(1);
457
+ }
458
+ 42% {
459
+ opacity: 1;
460
+ transform: translate(var(--vgai-play-dx, 0px), var(--vgai-play-dy, 0px)) scale(0.985);
461
+ filter: blur(2px) brightness(1.06);
462
+ }
463
+ 100% {
464
+ opacity: 0;
465
+ transform: translate(var(--vgai-play-dx, 0px), var(--vgai-play-dy, 0px)) scale(0.985);
466
+ filter: blur(8px) brightness(1);
467
+ }
468
+ }
469
+
470
+ @keyframes vgai-play-materialize {
471
+ 0% {
472
+ opacity: 0;
473
+ transform: translate(var(--vgai-play-dx, 0px), var(--vgai-play-dy, 0px)) scale(0.985);
474
+ filter: blur(6px) brightness(1.02);
475
+ }
476
+ 100% {
477
+ opacity: 1;
478
+ transform: none;
479
+ filter: blur(0) brightness(1);
480
+ }
481
+ }
482
+
483
+ .vgai-play-chrome-exit,
484
+ .vgai-play-chrome-enter {
485
+ --vgai-play-dx: 0px;
486
+ --vgai-play-dy: 0px;
487
+ --vgai-play-stagger: 0ms;
488
+ }
489
+
490
+ /* The DURATIONS below are not written here. `play-transition.ts` owns them
491
+ (`PLAY_DISSOLVE_MS` / `PLAY_MATERIALIZE_MS` / `PLAY_CROSSFADE_MS`) because
492
+ the same numbers are its JS timers, and publishes them onto the document
493
+ element when the dock installs — the same way `--vgai-play-stagger` below
494
+ already arrives from `PLAY_DISSOLVE_STAGGER_MS`. There is no fallback on
495
+ purpose: a fallback would be the second copy this removes, and nothing can
496
+ add these classes before the module that publishes the properties is live. */
497
+ .vgai-play-chrome-exit {
498
+ animation: vgai-play-dissolve var(--vgai-play-dissolve-duration) var(--vgai-ease-standard) both;
499
+ animation-delay: var(--vgai-play-stagger, 0ms);
500
+ pointer-events: none;
501
+ }
502
+
503
+ /* Re-materialize immediately: entrance is deliberately unstaggered so an
504
+ explicit reveal never waits behind the cinematic play-entry cadence. */
505
+ .vgai-play-chrome-enter {
506
+ animation: vgai-play-materialize var(--vgai-play-materialize-duration) var(--vgai-ease-standard)
507
+ both;
508
+ }
509
+
510
+ /* ---- Non-dock chrome dissolve + GLOBAL edge reveal. While play owns the
511
+ screen the THEME ROOT carries `data-vgai-play-chrome="hidden"`: the Game
512
+ document toolbar (Device/resolution/shading/stats island), the
513
+ capture-frame button, and the bottom bar (status + session tray) dissolve
514
+ with the rest of the chrome. A pointer dwell at ANY screen edge sets
515
+ `data-vgai-play-revealed` on the theme root and ALL of it slides back in
516
+ together — alongside the project header (ProjectHeader.css) and the panel
517
+ overlays above. `visibility` gates interactivity so hidden chrome can
518
+ never swallow game input. */
519
+ .vgai-dock-document-toolbar,
520
+ .vgai-editor-bottom-bar {
521
+ transition:
522
+ transform var(--vgai-duration-slow) var(--vgai-ease-standard),
523
+ opacity var(--vgai-duration-slow) var(--vgai-ease-standard);
524
+ }
525
+ [data-vgai-play-chrome="hidden"] .vgai-dock-document-toolbar:not([data-runtime-toolbar]) {
526
+ opacity: 0;
527
+ visibility: hidden;
528
+ transform: translateY(-10px);
529
+ pointer-events: none;
530
+ transition:
531
+ transform var(--vgai-duration-base) var(--vgai-ease-standard),
532
+ opacity var(--vgai-duration-base) var(--vgai-ease-standard) 100ms,
533
+ visibility 0s linear 280ms;
534
+ }
535
+ [data-vgai-play-chrome="hidden"] .vgai-editor-bottom-bar {
536
+ opacity: 0;
537
+ visibility: hidden;
538
+ transform: translateY(calc(100% + 8px));
539
+ pointer-events: none;
540
+ transition:
541
+ transform var(--vgai-duration-base) var(--vgai-ease-standard),
542
+ opacity var(--vgai-duration-base) var(--vgai-ease-standard) 100ms,
543
+ visibility 0s linear 280ms;
544
+ }
545
+ [data-vgai-play-chrome="hidden"][data-vgai-play-revealed] .vgai-dock-document-toolbar,
546
+ [data-vgai-play-chrome="hidden"][data-vgai-play-revealed] .vgai-editor-bottom-bar {
547
+ opacity: 1;
548
+ visibility: visible;
549
+ transform: none;
550
+ pointer-events: auto;
551
+ transition:
552
+ transform var(--vgai-duration-base) var(--vgai-ease-standard),
553
+ opacity var(--vgai-duration-fast) var(--vgai-ease-standard),
554
+ visibility 0s;
555
+ }
556
+
557
+ /* ---- Restart-required pill. An unsafe script edit during play flips the
558
+ transport's Restart Game button to primary — but the transport is
559
+ dissolved, so the state needs a surface of its own while the chrome is
560
+ concealed. Same treatment-driven island material as every toolstrip
561
+ (PlayPanelOverlays adds the island classes); this block only places it
562
+ and gates its visibility. Deliberately subtle: small type, secondary
563
+ ink, a soft drop-in. When the chrome is revealed the header's own
564
+ Restart button is the affordance, so the pill yields. */
565
+ .vgai-glass-island.vgai-play-restart-pill {
566
+ position: fixed;
567
+ top: 14px;
568
+ left: 50%;
569
+ z-index: 40;
570
+ display: none;
571
+ align-items: center;
572
+ gap: var(--vgai-space-2);
573
+ padding: 6px 14px;
574
+ border-radius: var(--vgai-radius-full);
575
+ font: inherit;
576
+ font-size: var(--vgai-font-md);
577
+ line-height: var(--vgai-leading-tight);
578
+ color: var(--vgai-content-muted);
579
+ cursor: pointer;
580
+ }
581
+ /* Scoped to the THEME root: the dock root carries the play-chrome flag too
582
+ but never the reveal attribute, so an unscoped :not() would match it and
583
+ keep the pill up over the revealed chrome. */
584
+ .vgai-editor-theme[data-vgai-play-chrome="hidden"]:not([data-vgai-play-revealed])
585
+ .vgai-glass-island.vgai-play-restart-pill {
586
+ display: flex;
587
+ animation: vgai-restart-pill-in var(--vgai-duration-slow) var(--vgai-ease-standard) both;
588
+ }
589
+ .vgai-glass-island.vgai-play-restart-pill:hover {
590
+ color: var(--vgai-content-primary);
591
+ }
592
+ @keyframes vgai-restart-pill-in {
593
+ from {
594
+ opacity: 0;
595
+ transform: translate(-50%, -8px);
596
+ }
597
+ to {
598
+ opacity: 1;
599
+ transform: translate(-50%, 0);
600
+ }
601
+ }
602
+
603
+ /* Reduced motion: every play-transition animation collapses to an instant
604
+ state change with the same end state. */
605
+ @media (prefers-reduced-motion: reduce) {
606
+ .vgai-play-chrome-exit,
607
+ .vgai-play-chrome-enter,
608
+ .vgai-editor-theme[data-vgai-play-chrome="hidden"]:not([data-vgai-play-revealed])
609
+ .vgai-glass-island.vgai-play-restart-pill {
610
+ animation: none;
611
+ }
612
+ .vgai-play-chrome-exit {
613
+ opacity: 0;
614
+ }
615
+ .vgai-dock-document-toolbar,
616
+ .vgai-editor-bottom-bar,
617
+ [data-vgai-play-chrome="hidden"] .vgai-dock-document-toolbar,
618
+ [data-vgai-play-chrome="hidden"] .vgai-editor-bottom-bar {
619
+ transition: none;
620
+ }
621
+ }