@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,617 @@
1
+ .vgai-project-header {
2
+ position: relative;
3
+ display: flex;
4
+ height: var(--vgai-command-bar-height);
5
+ flex: 0 0 auto;
6
+ align-items: center;
7
+ /* THE SHELL BANDS INSET THEIR CONTENT 6, at both ends, and two independent
8
+ measurements on Blender 5.2 agree to the pixel: the app mark's ink starts
9
+ at CSS 6.0 in `topbar.png`, and the first mouse hint's glyph starts at CSS
10
+ 6.0 in `modeling.png`'s status bar — the band at the other end of the same
11
+ window. The trailing edge is the same number from the other side: the
12
+ ViewLayer selector's outer border sits at CSS 1722.75 of 1728, so 5.25.
13
+ `space-4` (8) put our right cluster 2.75 too far in from an edge a person
14
+ throws the pointer at; `space-3` is 6. */
15
+ padding: 0 var(--vgai-space-3);
16
+ color: var(--vgai-content-primary);
17
+ /* THE SHELL, not chrome. The top bar is the window's own outermost band —
18
+ measured in Blender 5.2 it is #171717, the same value as the status bar
19
+ at the other end of the window, while an AREA header (which our document
20
+ toolbar already matches) is #343434. `surface-chrome` painted it #1c1c1c
21
+ under the Blender skin, one step too light, which cost the bar its job of
22
+ framing everything between the two shell bands. */
23
+ background: var(--vgai-surface-shell);
24
+ /* The seam under the shell band is an AREA seam, not a widget outline, so
25
+ it takes `boundary.area` — measured in Blender 5.2 as a DARK groove
26
+ (#151515) where ours drew a light #3c3c3c hairline, i.e. the inversion
27
+ that made the window read as bright grout between tiles. It keeps the
28
+ hairline WIDTH: `modeling.png` y 48..52 is 5 device px (2.5 CSS) of
29
+ groove against a #171717 top bar two levels off it, so there is nothing
30
+ there to cut — only an interior area-to-area seam is widened (see
31
+ `workspace-dock.css`'s sash). */
32
+ border-bottom: var(--vgai-stroke-resting) solid var(--vgai-boundary-area);
33
+ font-size: var(--vgai-font-base);
34
+ pointer-events: auto;
35
+ user-select: none;
36
+ box-sizing: border-box;
37
+ }
38
+ .vgai-project-header-left {
39
+ position: relative;
40
+ display: flex;
41
+ min-width: 0;
42
+ flex: 1;
43
+ /* The column spans the band so the tab strip can take the plate geometry
44
+ measured above (top at 2, height 22) while every other child keeps the
45
+ 20px control height it had when the column was content-sized. */
46
+ align-self: stretch;
47
+ align-items: center;
48
+ }
49
+ /* THE BAND'S LEADING GLYPH — Blender's app-mark slot, transcribed.
50
+ Measured on `topbar.png` at native 2x: the mark's INK runs device x 12..43
51
+ (CSS 6.0..21.5 — 16.0 wide, 13.0 tall), i.e. it starts at the band's own
52
+ 6px inset with NO button padding in front of it, and the first menu word's
53
+ ink follows at CSS 32.0. The whole-frame read's "32 CSS px app mark at
54
+ inset 6.0 … menu words at 60" was that 32-DEVICE-px width read as CSS; the
55
+ frame says 16 and 32.
56
+
57
+ So: no padding, no pill, no chevron, and the glyph left-aligned in its box
58
+ so its ink begins at the inset instead of one padding-width inside it.
59
+ `.vgai-menu-trigger`'s 8px inline padding is what put our leading ink at
60
+ 14.5.
61
+
62
+ TWO CLASSES, not one, and the second is load-bearing: `.vgai-menu-trigger`
63
+ in theme.css declares `padding: 0 var(--vgai-space-4)` at the SAME
64
+ specificity and lands LATER in the cascade than this sheet, so the
65
+ single-class version of this rule lost silently — measured, not reasoned:
66
+ the glyph stayed at x 14.0 with `padding: 0` resolving correctly on that
67
+ very element. Same failure the tab-strip divider hit (PR #7341). */
68
+ .vgai-menu-trigger.vgai-project-trigger {
69
+ position: relative;
70
+ display: flex;
71
+ /* 14, not 16: the glyph's own svg is 1.25em wide (17.5 at this skin's 14px
72
+ icon rung) and letterboxes its square viewBox to a 14x14 drawing, so a
73
+ 16px box would centre a 14px ink and start it at 7.0. At 14 the ink's
74
+ left edge IS the box's, i.e. the band's 6.0 inset — measured, not
75
+ reasoned. */
76
+ width: 14px;
77
+ min-width: 0;
78
+ align-items: center;
79
+ justify-content: flex-start;
80
+ padding: 0;
81
+ overflow: visible;
82
+ white-space: nowrap;
83
+ }
84
+ /* IDENTITY'S READABLE HOME (see ProjectHeader.tsx): the glyph's menu opens on
85
+ the project's own name, the row Blender keeps in the OS title bar. */
86
+ .vgai-project-menu-name {
87
+ display: block;
88
+ max-width: 320px;
89
+ padding: var(--vgai-space-3) var(--vgai-space-4) var(--vgai-space-1);
90
+ }
91
+
92
+ /* THE ROW OF WORDS IS ONE INK, and it is the bar's loudest. Measured on
93
+ Blender 5.2's `topbar.png` at native 2x: the app mark and every menu word —
94
+ File, Edit, Render, Window, Help — plateau at #d8d8d8 (216), while the
95
+ Scene and ViewLayer field labels at the other end of the same bar plateau
96
+ at #e5e5e5 (229) and the INACTIVE workspace tab at #979797 (151). Three
97
+ levels, and the ordering is what matters: menu words sit ABOVE the palette's
98
+ `content.muted` (#c2c2c2 / 194, which is measured as the OUTLINER ROW's ink
99
+ — theme.css), not level with it.
100
+
101
+ THE 216 HAS A HOME NOW. It was recorded here as a homeless measured ink and
102
+ an override to `content.primary` stood in for it; the palette inventory
103
+ settled the member (`content.menu`), and the word rule moved to
104
+ `.vgai-menu-trigger` itself in theme.css — which is where the split lived,
105
+ because the area header's words inherited the base ink and only this end
106
+ was overridden. Nothing here paints a menu word any more.
107
+
108
+ WHAT STAYS: the trailing GHOST BUTTONS, which are not menu words. Blender's
109
+ far end of the top bar carries the Scene and ViewLayer field labels at
110
+ #e5e5e5 (229), and `content.primary` is that ink. */
111
+ .vgai-project-header-right .vgai-btn[data-variant="ghost"] {
112
+ color: var(--vgai-content-primary);
113
+ }
114
+
115
+ /* NOTHING IN BLENDER'S TOP BAR IS BOLD. The project name rendered at
116
+ `variant="label"`'s weight 600 — the single heaviest text in the window —
117
+ where Blender's heaviest top-bar text is its ACTIVE workspace tab at
118
+ regular weight and 255 ink. Same correction, and the same reason, as the
119
+ Properties panel bands (weight 600 -> 400, PR #7241: cap height was already
120
+ right and the WEIGHT was the whole difference). The variant keeps its size
121
+ rung; only the weight is overridden, and only here. Scoped to the whole
122
+ leading cluster rather than the project trigger alone: the name itself is
123
+ a glyph now, and the next label that lands in this band must not reopen
124
+ the defect. */
125
+ .vgai-project-header-left .vgai-text[data-variant="label"] {
126
+ font-weight: 400;
127
+ }
128
+ .vgai-project-app-menus,
129
+ .vgai-project-transport {
130
+ flex: 0 0 auto;
131
+ }
132
+ .vgai-project-menu {
133
+ position: absolute;
134
+ top: 100%;
135
+ left: 0;
136
+ min-width: 190px;
137
+ margin-top: var(--vgai-space-1);
138
+ }
139
+ .vgai-project-path {
140
+ display: block;
141
+ max-width: 320px;
142
+ padding: var(--vgai-space-2) var(--vgai-space-4);
143
+ }
144
+ .vgai-project-versions {
145
+ display: grid;
146
+ grid-template-columns: 1fr auto;
147
+ gap: var(--vgai-space-2) var(--vgai-space-6);
148
+ padding: var(--vgai-space-3) var(--vgai-space-4) var(--vgai-space-4);
149
+ color: var(--vgai-content-dim);
150
+ font-size: var(--vgai-font-sm);
151
+ }
152
+ .vgai-project-header-right {
153
+ min-width: 0;
154
+ flex: 1;
155
+ gap: var(--vgai-space-2);
156
+ }
157
+
158
+ /* A narrow editor is still a full editor. Keep menu and transport controls
159
+ at their normal size, giving them rows instead of overlapping columns. */
160
+ @media (max-width: 680px) {
161
+ .vgai-project-header {
162
+ height: auto;
163
+ min-height: var(--vgai-command-bar-height);
164
+ flex-wrap: wrap;
165
+ gap: var(--vgai-space-2) var(--vgai-space-4);
166
+ padding-block: 4px;
167
+ }
168
+ .vgai-project-header-left {
169
+ flex: 1 1 100%;
170
+ }
171
+ /* The cluster used to take `flex: 1; justify-content: space-between` here,
172
+ spreading the glyph, the switcher and the menu words across the full row.
173
+ It was written before the WORKSPACE TAB STRIP shared that row, and a
174
+ growable-and-shrinkable cluster beside the strip is exactly the squeeze
175
+ the rule below this media block exists to stop — so the cluster is
176
+ content-sized at every width now and the strip takes what is left. */
177
+ .vgai-project-header-right {
178
+ flex: 1 1 auto;
179
+ flex-wrap: wrap;
180
+ }
181
+ }
182
+
183
+ /* Runtime telemetry is one compact header instrument: instantaneous audio
184
+ magnitude uses discrete VU segments, while performance uses a historical
185
+ line. Shape carries the distinction even without semantic color. */
186
+ .vgai-header-telemetry {
187
+ min-width: 0;
188
+ flex: 0 0 auto;
189
+ overflow: visible;
190
+ }
191
+
192
+ .vgai-header-telemetry-button.vgai-btn {
193
+ min-width: 0;
194
+ /* THE LITERAL THAT OUTRANKED THE MATERIAL. A hard 28px made the telemetry
195
+ capsule the only member of the top bar that is not control height, so it
196
+ overhung a 26px bar by 2px and the right cluster read as loose islands
197
+ instead of one row. Every other control in this bar takes the skin's
198
+ compact height (Blender's skin sets all three to 20). */
199
+ height: var(--vgai-control-compact-height);
200
+ gap: var(--vgai-space-2);
201
+ padding-inline: var(--vgai-space-2);
202
+ font-variant-numeric: tabular-nums;
203
+ }
204
+
205
+ .vgai-header-audio {
206
+ position: relative;
207
+ }
208
+
209
+ .vgai-audio-vu {
210
+ display: flex;
211
+ width: 34px;
212
+ height: 12px;
213
+ align-items: stretch;
214
+ gap: var(--vgai-space-1);
215
+ }
216
+
217
+ .vgai-audio-vu > i {
218
+ width: 2px;
219
+ flex: 1 1 0;
220
+ border-radius: 1px;
221
+ background: var(--vgai-boundary-strong);
222
+ }
223
+
224
+ .vgai-header-audio[data-available="true"] .vgai-audio-vu > i[data-filled="true"] {
225
+ background: var(--vgai-accent);
226
+ }
227
+
228
+ .vgai-header-audio[data-muted="true"] .vgai-audio-vu > i[data-filled="true"] {
229
+ background: var(--vgai-content-muted);
230
+ }
231
+
232
+ .vgai-header-performance {
233
+ border-left: var(--vgai-stroke-resting) solid var(--vgai-boundary-default);
234
+ }
235
+
236
+ .vgai-header-performance svg {
237
+ display: block;
238
+ overflow: visible;
239
+ }
240
+
241
+ .vgai-performance-graph {
242
+ border-radius: var(--vgai-radius-sm);
243
+ background: color-mix(in srgb, var(--vgai-surface-panel) 72%, transparent);
244
+ }
245
+
246
+ .vgai-performance-budget {
247
+ stroke: var(--vgai-boundary-strong);
248
+ stroke-dasharray: 2 2;
249
+ stroke-width: 1;
250
+ }
251
+
252
+ .vgai-performance-sparkline {
253
+ fill: none;
254
+ stroke: var(--vgai-accent);
255
+ stroke-linecap: round;
256
+ stroke-linejoin: round;
257
+ stroke-width: 1.5;
258
+ vector-effect: non-scaling-stroke;
259
+ }
260
+
261
+ .vgai-header-performance[data-performance-tone="warning"] .vgai-performance-sparkline,
262
+ .vgai-header-performance[data-performance-tone="warning"] .vgai-header-fps {
263
+ color: var(--vgai-warn);
264
+ stroke: var(--vgai-warn);
265
+ }
266
+
267
+ .vgai-header-performance[data-performance-tone="danger"] .vgai-performance-sparkline,
268
+ .vgai-header-performance[data-performance-tone="danger"] .vgai-header-fps {
269
+ color: var(--vgai-danger);
270
+ stroke: var(--vgai-danger);
271
+ }
272
+
273
+ .vgai-performance-readout {
274
+ display: grid;
275
+ min-width: 48px;
276
+ line-height: 1.05;
277
+ text-align: right;
278
+ }
279
+
280
+ .vgai-header-fps {
281
+ color: var(--vgai-content-primary);
282
+ font-family: var(--vgai-font-mono);
283
+ font-size: var(--vgai-font-sm);
284
+ font-weight: 600;
285
+ }
286
+
287
+ .vgai-header-frame-ms {
288
+ color: var(--vgai-content-dim);
289
+ font-family: var(--vgai-font-mono);
290
+ font-size: var(--vgai-font-xs);
291
+ }
292
+
293
+ @media (max-width: 1120px) {
294
+ .vgai-header-performance svg,
295
+ .vgai-audio-vu {
296
+ display: none;
297
+ }
298
+ }
299
+ /* Cluster wrappers (P6-U3): pure layout in bars chrome — the left wrapper
300
+ reproduces .vgai-project-header-left's stretch flex row exactly (no
301
+ align-items, so children keep stretching to the tallest sibling), the
302
+ right one reproduces the parent Inline's centered row + space-2 gap the
303
+ buttons used to get from .vgai-project-header-right directly. They exist
304
+ so islands chrome has a content-sized element to turn into a glass
305
+ island (the flex:1 side COLUMNS must keep their width — W5's transport
306
+ centering depends on the equal-flex geometry). */
307
+ .vgai-project-header-cluster {
308
+ display: flex;
309
+ min-width: 0;
310
+ }
311
+ /* THE MENU WORDS KEEP THEIR OWN WIDTH, AND THE TAB STRIP SCROLLS — Blender's
312
+ own top bar, transcribed.
313
+
314
+ MEASURED on the model editor release at 1280 CSS px: `Help` ran x 258..298
315
+ and the `Model` workspace tab x 268..320, a 30px overlap; at 1728 the same
316
+ pair had a 17px gap. The cause is here and not in the strip: this cluster
317
+ took flex's default `0 1 auto`, so the leading column's squeeze SHRANK ITS
318
+ BOX while `.vgai-project-app-menus` inside it kept `flex: 0 0 auto` and
319
+ simply overflowed — the tabs were then laid out against a box narrower than
320
+ the words it contained.
321
+
322
+ Blender never squeezes its menus: its top bar keeps File…Help at full width
323
+ and SCROLLS the workspace tab row when the window is too narrow for both.
324
+ So the cluster never shrinks (here) and the strip takes the remainder and
325
+ scrolls (`.vgai-workspace-tabs` below). No JS, no measurement, no state —
326
+ two flex declarations and the browser's own overflow. */
327
+ .vgai-project-header-left .vgai-project-header-cluster {
328
+ flex: 0 0 auto;
329
+ }
330
+ .vgai-project-header-right .vgai-project-header-cluster {
331
+ align-items: center;
332
+ gap: var(--vgai-space-2);
333
+ }
334
+ /* P6-U3 — islands chrome: no header BAR. The row keeps its
335
+ --vgai-command-bar-height slot (the dock geometry below depends on it)
336
+ but loses fill/border and all pointer
337
+ handling; the three clusters become 38px glass islands hung 8px from the
338
+ top edge (the P6 reference toolbar geometry — they overhang the 36px row
339
+ into the workspace, which is why the row is lifted to the sticky tier
340
+ like the bottom bar). Island material arrives via the shared
341
+ .vgai-chrome-island rule in theme.css. */
342
+ [data-vgai-chrome="islands"] .vgai-project-header {
343
+ z-index: var(--vgai-z-sticky);
344
+ align-items: flex-start;
345
+ padding-top: var(--vgai-space-4);
346
+ background: transparent;
347
+ border-bottom-color: transparent;
348
+ pointer-events: none;
349
+ }
350
+ /* FULL-BLEED (owner: "black bar at the top in glass FLOAT mode"): the
351
+ transparent row must not consume layout height with nothing behind it —
352
+ it OVERLAYS the workspace, so the scene runs edge-to-edge underneath the
353
+ islands (the macOS model: content under floating chrome). The shell
354
+ column reflows the dock to the top. Scoped to a BACKDROP document
355
+ (U5 regression fix, spec 69 case D): in a tiled arrangement under glass the
356
+ grid columns own the full workspace height, and an absolute header overlay
357
+ buried their top tab strips — a drag on the Inspector tab pressed the
358
+ header's Export island instead. Tiles + islands keeps the in-flow
359
+ transparent row. */
360
+ [data-vgai-chrome="islands"]
361
+ .vgai-editor-shell:has(.vgai-workspace-dock[data-vgai-backdrop])
362
+ .vgai-project-header {
363
+ position: absolute;
364
+ top: 0;
365
+ left: 0;
366
+ right: 0;
367
+ }
368
+ [data-vgai-chrome="islands"] .vgai-project-header .vgai-chrome-island {
369
+ height: 38px;
370
+ align-items: center;
371
+ padding: 0 var(--vgai-space-3);
372
+ }
373
+ /* The project dropdown anchors to the left flex COLUMN (a sibling of the
374
+ island, so the island's backdrop-filter never becomes its backdrop
375
+ root); the column sits under the row's pointer-events:none and must
376
+ restore its own. */
377
+ [data-vgai-chrome="islands"] .vgai-project-menu {
378
+ pointer-events: auto;
379
+ }
380
+
381
+ /* Play-mode chrome dissolve (play-transition.ts): runtime telemetry is the
382
+ one persistent part of the command header. The row still collapses so the
383
+ game is full-bleed; its authoring/transport/account clusters dissolve, while
384
+ the telemetry escapes as a fixed compact instrument. Edge reveal restores
385
+ the real header and returns telemetry to its ordinary trailing position. */
386
+ .vgai-project-header {
387
+ transition: margin-top var(--vgai-duration-slow) var(--vgai-ease-standard);
388
+ }
389
+ [data-vgai-play-chrome="hidden"] .vgai-project-header {
390
+ margin-top: calc(-1 * var(--vgai-command-bar-height));
391
+ background: transparent;
392
+ border-bottom-color: transparent;
393
+ pointer-events: none;
394
+ transition: margin-top var(--vgai-duration-base) var(--vgai-ease-standard);
395
+ }
396
+ [data-vgai-play-chrome="hidden"] .vgai-project-header-left,
397
+ [data-vgai-play-chrome="hidden"] .vgai-project-transport,
398
+ [data-vgai-play-chrome="hidden"] .vgai-project-header-right > :not(.vgai-header-telemetry) {
399
+ transform: translateY(calc(-100% - 12px));
400
+ opacity: 0;
401
+ visibility: hidden;
402
+ pointer-events: none;
403
+ transition:
404
+ transform var(--vgai-duration-base) var(--vgai-ease-standard),
405
+ opacity var(--vgai-duration-base) var(--vgai-ease-standard) 100ms,
406
+ visibility 0s linear 280ms;
407
+ }
408
+ [data-vgai-play-chrome="hidden"] .vgai-header-telemetry {
409
+ position: fixed;
410
+ top: 12px;
411
+ right: 12px;
412
+ z-index: var(--vgai-z-sticky);
413
+ height: 32px;
414
+ padding: 0 var(--vgai-space-2);
415
+ border: var(--vgai-stroke-resting) solid var(--vgai-boundary-default);
416
+ border-radius: var(--vgai-radius-lg);
417
+ background: var(--vgai-surface-chrome);
418
+ box-shadow: var(--vgai-shadow-sm);
419
+ pointer-events: auto;
420
+ }
421
+ [data-vgai-play-chrome="hidden"][data-vgai-play-revealed] .vgai-project-header {
422
+ margin-top: 0;
423
+ /* Restores the resting paint above — keep the two in step. */
424
+ background: var(--vgai-surface-shell);
425
+ border-bottom-color: var(--vgai-boundary-default);
426
+ pointer-events: auto;
427
+ transition: margin-top var(--vgai-duration-base) var(--vgai-ease-standard);
428
+ }
429
+ [data-vgai-play-chrome="hidden"][data-vgai-play-revealed] .vgai-project-header-left,
430
+ [data-vgai-play-chrome="hidden"][data-vgai-play-revealed] .vgai-project-transport,
431
+ [data-vgai-play-chrome="hidden"][data-vgai-play-revealed]
432
+ .vgai-project-header-right
433
+ > :not(.vgai-header-telemetry) {
434
+ transform: none;
435
+ opacity: 1;
436
+ visibility: visible;
437
+ pointer-events: auto;
438
+ transition:
439
+ transform var(--vgai-duration-base) var(--vgai-ease-standard),
440
+ opacity var(--vgai-duration-fast) var(--vgai-ease-standard),
441
+ visibility 0s;
442
+ }
443
+ [data-vgai-play-chrome="hidden"][data-vgai-play-revealed] .vgai-header-telemetry {
444
+ position: static;
445
+ height: auto;
446
+ padding: 0;
447
+ border: 0;
448
+ border-radius: 0;
449
+ background: transparent;
450
+ box-shadow: none;
451
+ }
452
+ @media (prefers-reduced-motion: reduce) {
453
+ .vgai-project-header,
454
+ [data-vgai-play-chrome="hidden"] .vgai-project-header,
455
+ [data-vgai-play-chrome="hidden"] .vgai-project-header-left,
456
+ [data-vgai-play-chrome="hidden"] .vgai-project-transport,
457
+ [data-vgai-play-chrome="hidden"] .vgai-project-header-right > * {
458
+ transition: none;
459
+ }
460
+ }
461
+
462
+ /* The workspace tab strip (Blender's top bar) — a region a style turns on
463
+ (`workspaceTabs`); the active tab wears the panel surface and joins the
464
+ area below it, the rest sit quiet in the bar. */
465
+ /* The rule between the menu words and the workspace tabs. Blender sets it 16px
466
+ past `Help`'s ink — 8px of the button's own padding plus 8 — and the tabs
467
+ begin 8px after it. */
468
+ /* TWO CLASSES, not one, and the second is load-bearing: `.vgai-divider`'s own
469
+ `background` in theme.css is the same specificity and lands LATER in the
470
+ cascade than this sheet, so a single-class rule here lost silently (driven
471
+ and measured: the token resolved to #2e2e2e on this very element while the
472
+ computed background stayed 60). */
473
+ .vgai-divider.vgai-project-menu-rule {
474
+ align-self: center;
475
+ margin-inline: var(--vgai-space-4);
476
+ /* A DIVIDER'S RULE IS NOT A WIDGET'S OUTLINE. `.vgai-divider` paints
477
+ `boundary.default`, and in this bar that is LIGHTER than the tab strip it
478
+ borders. Measured on `topbar.png` at native 2x: the rule sits at x
479
+ 488..489, y 6..45 — 2 device px wide, 40 tall, a flat #2e2e2e (46) with no
480
+ AA ramp on either side, between the bar's 23 and the strip's 28, where
481
+ ours drew 60. `boundary.divider` is optional and falls back to
482
+ `boundary.default` in the emitter, so every other skin is bit-identical;
483
+ this is the one site that reads it, because it is the one divider the
484
+ reference frames photograph (see theme.ts). */
485
+ background: var(--vgai-boundary-divider);
486
+ }
487
+ .vgai-workspace-tabs {
488
+ display: flex;
489
+ /* Blender's tab strip sits on a band one step lighter than the shell bar it
490
+ is embedded in (#1c1c1c over #171717), which is what separates the
491
+ workspace region from the window frame. */
492
+ background: var(--vgai-surface-chrome);
493
+ /* THE PLATE IS 22 AND THE ACTIVE TAB IS INSET 1, the residue the hairline
494
+ measurement below recorded and did not take. Measured on `topbar.png` at
495
+ native 2x, reading down columns through the strip: the plate fills device
496
+ rows 4..47 — 44 rows, 22 CSS, top at CSS 2.0 — and the ACTIVE tab's 47
497
+ slab fills rows 6..45, 40 rows / 20 CSS, inset 2 device px (1 CSS) at top
498
+ AND bottom. Ours was a 20 CSS plate with the slab flush inside it, which
499
+ is why the emboss hairline under the strip sat 1 CSS px high in the bar
500
+ and the active tab touched the plate's edges where Blender leaves a line
501
+ of plate showing above and below it.
502
+
503
+ The height is explicit (not `stretch`) because the left COLUMN is content
504
+ -height: it holds 20px controls, so stretching gave the strip 20. The
505
+ column keeps its own children centered (`align-items: center` below) and
506
+ this one item is pulled to the band's top with the measured 2px of bar
507
+ above it. */
508
+ height: 22px;
509
+ align-items: center;
510
+ align-self: flex-start;
511
+ /* `space-1` is the grid's 2, and the measured 2 device rows of bar above
512
+ Blender's plate; the skin's own grid owns it in any other skin. */
513
+ margin-top: var(--vgai-space-1);
514
+ /* THE STRIP TAKES WHAT IS LEFT AND SCROLLS — the other half of the rule at
515
+ `.vgai-project-header-left .vgai-project-header-cluster` above, and
516
+ Blender's own answer to a top bar too narrow for its menus AND its
517
+ workspaces: the menu row keeps full width, the tab row scrolls.
518
+ `flex: 1 1 0` (not `auto`) so the strip's own content width never pushes
519
+ the row wider than the column, and `min-width: 0` so it may actually
520
+ shrink to the remainder — a flex item's `auto` minimum is its content.
521
+ Vertical wheel over an element that can only scroll horizontally scrolls
522
+ it horizontally, which is the whole interaction; there is no handler. */
523
+ flex: 1 1 0;
524
+ min-width: 0;
525
+ overflow-x: auto;
526
+ overflow-y: hidden;
527
+ /* The scrollbar is suppressed BELOW, at two classes — see that rule. */
528
+ /* THE HAIRLINE UNDER THE PLATE, and it is the EMBOSS — no new member.
529
+ Measured on `topbar.png` at native 2x, reading down a column through the
530
+ strip (x 560, 1000, 2100 all agree): the strip's plate fills device rows
531
+ 4..47 at 28, then rows 48..49 are a flat 19 with no AA ramp, then the
532
+ bar's own 23 at 50 and the area seam's 21 at 51. Two device rows of one
533
+ value is 1 CSS px.
534
+
535
+ WHICH MEMBER IS 19? Not `boundary.area` (#151515, 21) and not
536
+ `boundary.divider` (#2e2e2e, 46) — the two this strip already borders.
537
+ It is the same line Blender lays under a WIDGET: at x 3000 in the same
538
+ frame, under a top-bar control on the same 23 backdrop, rows 46..47 read
539
+ 19 as well. So this is `widget.emboss`'s own role — the 1 CSS px
540
+ translucent black under a raised thing — on a fifth backdrop, and the
541
+ rule that draws it already exists.
542
+
543
+ THE RESIDUE, stated rather than fitted away: our declared 0.142 (36/255)
544
+ composites over 23 to 20, one level lighter than Blender's 19. Adding
545
+ this backdrop to the four solved on `EditorTheme.color.widget.emboss`
546
+ makes the alpha system EMPTY — 23→19 needs α > 0.152 while 52→45 needs
547
+ α ≤ 0.1442 — so no single byte serves all five and the declared value
548
+ stays. This is the same +1 that docblock already names for a widget
549
+ sitting on a panel band.
550
+
551
+ A SECOND RESIDUE this measurement found and did NOT take: Blender's
552
+ strip plate is 44 device rows (22 CSS) with the active tab's 47 slab
553
+ INSET 2 device px at top and bottom; ours is 40 rows (20 CSS) with the
554
+ slab flush. The hairline is correct relative to its own plate in both,
555
+ so ours sits 1 CSS px higher in the bar than Blender's. That is the
556
+ plate's geometry, not this rule's. */
557
+ box-shadow: var(--vgai-widget-emboss-shadow);
558
+ }
559
+ /* NO SCROLLBAR, the way Blender's tab row has none: the strip is 22px of plate
560
+ and a bar across it eats the tabs.
561
+
562
+ THREE CLASSES, and the count is ARITHMETIC, not superstition. theme.css's
563
+ scrollbar policy is
564
+ `.vgai-editor-theme :where(*):not([data-vgai-world-surface], [data-vgai-world-surface] *)`:
565
+ `:where()` contributes nothing, but `:not()` takes the specificity of its most
566
+ specific ARGUMENT — `[data-vgai-world-surface] *` is (0,1,0) — so the whole
567
+ selector is (0,2,0), and it lands LATER in the cascade than this sheet. One
568
+ class lost; two classes TIED and lost; three wins.
569
+
570
+ MEASURED at each step, never reasoned: with one class and with two, the strip
571
+ computed `scrollbar-width: thin` and its `clientHeight` was 11 against a 22px
572
+ box — an 11px bar inside the plate, which re-centred the 20px tabs 5.5px too
573
+ high (tab y -3 at 1280 against 2.5 at 1728, where the row does not overflow
574
+ and no bar appears at all).
575
+
576
+ BOTH SPELLINGS: the standard property is what Chrome and Firefox honour, and
577
+ the WebKit pseudo-element is for engines that have only it — Chrome ignores
578
+ the pseudo-element once `scrollbar-width` is a keyword, which is why the
579
+ pseudo-element alone was never going to be enough. */
580
+ .vgai-project-header .vgai-project-header-left .vgai-workspace-tabs {
581
+ scrollbar-width: none;
582
+ }
583
+ .vgai-project-header .vgai-project-header-left .vgai-workspace-tabs::-webkit-scrollbar {
584
+ display: none;
585
+ }
586
+ .vgai-workspace-tab {
587
+ appearance: none;
588
+ border: 0;
589
+ margin: 0;
590
+ /* A TAB IS ITS OWN WIDTH. The strip scrolls now (above), and a shrinkable
591
+ tab would compress the row instead of letting it overflow — which is the
592
+ squeeze one level in, with the same reading: a workspace's slab is as wide
593
+ as its word. */
594
+ flex: 0 0 auto;
595
+ /* Blender's tab labels sit 9.5px in from each slab edge (measured: the
596
+ `Modeling` slab is 65px wide around a 46px word). */
597
+ height: var(--vgai-control-compact-height);
598
+ padding: 0 var(--vgai-space-5);
599
+ background: transparent;
600
+ /* An UNSELECTED workspace is quiet. Measured: Blender's inactive tab ink is
601
+ #979797 — the palette's `content/dim` (#969696) to within a channel step —
602
+ against #d8d8d8 for the menu words beside them. `content/muted` (#c2c2c2)
603
+ made every workspace read as loud as the menus. */
604
+ color: var(--vgai-content-dim);
605
+ font: inherit;
606
+ font-size: var(--vgai-font-base);
607
+ white-space: nowrap;
608
+ border-radius: var(--vgai-radius-sm) var(--vgai-radius-sm) 0 0;
609
+ cursor: default;
610
+ }
611
+ .vgai-workspace-tab:hover {
612
+ color: var(--vgai-content-primary);
613
+ }
614
+ .vgai-workspace-tab[aria-selected="true"] {
615
+ background: var(--vgai-surface-panel);
616
+ color: var(--vgai-content-primary);
617
+ }