@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,1829 @@
1
+ /* ------------------------------------------------------------------------- *
2
+ * Product shell — the shared visual language for every NON-editor surface:
3
+ * the startup splash, the project screen (home / new-project / error), and
4
+ * the account document. The editor's dense chrome scale (11px base) is right
5
+ * for panels but not for product pages; this file layers a roomier product
6
+ * rhythm on top of the SAME runtime theme variables, so custom themes and
7
+ * the high-contrast theme keep working everywhere.
8
+ *
9
+ * Every rule here is confined to these surfaces one of two ways: generic
10
+ * class names (`.vgai-chip`, `.vgai-meter`, …) are anchored under a scope
11
+ * class (`.vgai-shell` / `.vgai-splash` / `.vgai-account`), and everything
12
+ * else uses class names in the reserved `.vgai-shell-*` / `.vgai-splash-*` /
13
+ * `.vgai-account-*` namespace, which only product-surface markup may use.
14
+ * Either way, no rule can leak into editor panels or game worlds.
15
+ * ------------------------------------------------------------------------- */
16
+
17
+ .vgai-shell,
18
+ .vgai-splash,
19
+ .vgai-account {
20
+ /* Product-scale tokens (derived from, not replacing, the theme tokens). */
21
+ --vgai-shell-radius: 12px;
22
+ --vgai-shell-radius-sm: 8px;
23
+ --vgai-shell-font-xs: 11px;
24
+ --vgai-shell-font-sm: 12px;
25
+ --vgai-shell-font-base: 13px;
26
+ --vgai-shell-font-md: 14px;
27
+ --vgai-shell-font-lg: 16px;
28
+ --vgai-shell-font-xl: 20px;
29
+ /* §1-R cinematic hero title: 36px/650, tight tracking. */
30
+ --vgai-shell-font-display: 36px;
31
+ --vgai-shell-line: 1.55;
32
+ --vgai-shell-card-highlight: inset 0 1px 0 rgb(255 255 255 / 5%);
33
+ --vgai-shell-ease: cubic-bezier(0.2, 0.85, 0.25, 1);
34
+ }
35
+
36
+ /* ------------------------------------------------------------------------- */
37
+ /* Page scaffold */
38
+ /* ------------------------------------------------------------------------- */
39
+
40
+ .vgai-shell {
41
+ position: absolute;
42
+ inset: 0;
43
+ overflow: auto;
44
+ color: var(--vgai-content-primary);
45
+ /* §1-R cinematic canvas: near-black, DERIVED from the theme shell tone so
46
+ * custom themes keep steering the hue while the product surface stays in
47
+ * the moody #0b0d10 band (Epic launcher canvas, darker than pass 2). */
48
+ background: color-mix(in srgb, var(--vgai-surface-shell) 42%, black);
49
+ font-size: var(--vgai-shell-font-base);
50
+ line-height: var(--vgai-shell-line);
51
+ pointer-events: auto;
52
+ -webkit-font-smoothing: antialiased;
53
+ }
54
+
55
+ /* Cinematic backdrop (§1-R): accent-tinted radial KEY LIGHT top-center over
56
+ * the content area, a faint cool counter-bloom, and an edge VIGNETTE — the
57
+ * canvas reads as a lit stage, not a flat grey page. */
58
+ .vgai-shell::before {
59
+ content: "";
60
+ position: fixed;
61
+ inset: 0;
62
+ background:
63
+ radial-gradient(
64
+ 1150px 640px at 50% -16%,
65
+ color-mix(in srgb, var(--vgai-accent) 22%, transparent),
66
+ transparent 62%
67
+ ),
68
+ radial-gradient(720px 420px at 50% -4%, rgb(255 255 255 / 5%), transparent 58%),
69
+ radial-gradient(
70
+ 900px 560px at -12% 112%,
71
+ color-mix(in srgb, var(--vgai-accent) 5%, transparent),
72
+ transparent 55%
73
+ ),
74
+ radial-gradient(135% 105% at 50% 40%, transparent 50%, rgb(0 0 0 / 50%) 100%);
75
+ pointer-events: none;
76
+ }
77
+
78
+ /* Faint dot grid, fading below the key light. */
79
+ .vgai-shell::after {
80
+ content: "";
81
+ position: fixed;
82
+ inset: 0;
83
+ background-image: radial-gradient(rgb(255 255 255 / 5%) 1px, transparent 1px);
84
+ background-size: 26px 26px;
85
+ mask-image: linear-gradient(180deg, rgb(0 0 0 / 65%), transparent 52%);
86
+ pointer-events: none;
87
+ }
88
+
89
+ .vgai-shell-container {
90
+ position: relative;
91
+ z-index: var(--vgai-z-base);
92
+ width: 100%;
93
+ /* Content column per spec: ~1040–1120px, centered (border-box, so the
94
+ * 40px side padding leaves a 1040px content column). */
95
+ max-width: 1120px;
96
+ margin: 0 auto;
97
+ padding: 0 40px 96px;
98
+ box-sizing: border-box;
99
+ }
100
+
101
+ /* ------------------------------------------------------------------------- */
102
+ /* Header */
103
+ /* ------------------------------------------------------------------------- */
104
+
105
+ .vgai-shell-header {
106
+ display: flex;
107
+ align-items: center;
108
+ justify-content: space-between;
109
+ gap: var(--vgai-space-8);
110
+ min-height: 72px;
111
+ margin-bottom: 40px;
112
+ }
113
+
114
+ .vgai-shell .vgai-btn.vgai-shell-brand {
115
+ display: inline-flex;
116
+ height: auto;
117
+ align-items: center;
118
+ gap: var(--vgai-space-5);
119
+ padding: var(--vgai-space-2) var(--vgai-space-3);
120
+ margin-left: -6px;
121
+ }
122
+
123
+ .vgai-shell-brand-mark {
124
+ display: grid;
125
+ place-items: center;
126
+ width: 30px;
127
+ height: 30px;
128
+ }
129
+
130
+ .vgai-shell-wordmark {
131
+ color: var(--vgai-content-primary);
132
+ font-size: 15px;
133
+ font-weight: var(--vgai-font-weight-bold);
134
+ letter-spacing: 0.22em;
135
+ }
136
+
137
+ .vgai-shell-header-actions {
138
+ display: flex;
139
+ align-items: center;
140
+ gap: var(--vgai-space-4);
141
+ }
142
+
143
+ /* Account pill in the header. */
144
+ .vgai-shell .vgai-btn.vgai-shell-account-pill {
145
+ height: 32px;
146
+ padding: 0 14px;
147
+ border-radius: var(--vgai-radius-full);
148
+ font-size: var(--vgai-shell-font-sm);
149
+ }
150
+
151
+ /* ------------------------------------------------------------------------- */
152
+ /* Hero */
153
+ /* ------------------------------------------------------------------------- */
154
+
155
+ .vgai-shell-hero {
156
+ display: flex;
157
+ align-items: flex-end;
158
+ justify-content: space-between;
159
+ gap: var(--vgai-space-10);
160
+ margin-bottom: 32px;
161
+ flex-wrap: wrap;
162
+ }
163
+
164
+ /* §1-R: large cinematic title over the key light — 36px/650, tight tracking,
165
+ * with a whisper of top light caught in the glyphs. */
166
+ .vgai-shell-hero-heading {
167
+ margin: 0;
168
+ font-size: var(--vgai-shell-font-display);
169
+ font-weight: 650;
170
+ letter-spacing: -0.03em;
171
+ line-height: var(--vgai-leading-snug);
172
+ color: #fff;
173
+ text-shadow: 0 2px 24px color-mix(in srgb, var(--vgai-accent) 24%, transparent);
174
+ }
175
+
176
+ .vgai-shell-hero-actions {
177
+ display: flex;
178
+ align-items: center;
179
+ gap: var(--vgai-space-5);
180
+ }
181
+
182
+ /* Version / metadata chip (used on both the project shell and the account
183
+ * document, so it is anchored under both scopes). */
184
+ .vgai-shell .vgai-chip,
185
+ .vgai-account .vgai-chip {
186
+ display: inline-flex;
187
+ width: fit-content;
188
+ align-items: center;
189
+ gap: var(--vgai-space-3);
190
+ height: 22px;
191
+ padding: 0 var(--vgai-space-5);
192
+ color: var(--vgai-content-muted);
193
+ background: var(--vgai-surface-inset);
194
+ border: 1px solid var(--vgai-boundary-default);
195
+ border-radius: var(--vgai-radius-full);
196
+ font-family: var(--vgai-font-mono);
197
+ font-size: var(--vgai-shell-font-xs);
198
+ letter-spacing: 0.02em;
199
+ white-space: nowrap;
200
+ box-sizing: border-box;
201
+ }
202
+
203
+ /* Technical/monospace labels (version strings, kbd hints, file badges) are
204
+ * TAGS — small rounded rectangles — never pills. Monospace text inside a
205
+ * full capsule reads as a database-cylinder icon; Vercel/GitHub render
206
+ * technical tags as small rounded rects. */
207
+ .vgai-shell .vgai-chip[data-variant="tag"],
208
+ .vgai-account .vgai-chip[data-variant="tag"] {
209
+ padding: 0 7px;
210
+ border-radius: var(--vgai-radius-sm);
211
+ }
212
+
213
+ .vgai-shell .vgai-chip[data-tone="accent"],
214
+ .vgai-account .vgai-chip[data-tone="accent"] {
215
+ color: var(--vgai-accent);
216
+ background: var(--vgai-accent-muted);
217
+ border-color: transparent;
218
+ }
219
+
220
+ .vgai-shell .vgai-chip[data-tone="success"],
221
+ .vgai-account .vgai-chip[data-tone="success"] {
222
+ color: var(--vgai-success);
223
+ background: var(--vgai-success-muted);
224
+ border-color: transparent;
225
+ }
226
+
227
+ .vgai-shell .vgai-chip[data-tone="warn"],
228
+ .vgai-account .vgai-chip[data-tone="warn"] {
229
+ color: var(--vgai-warn);
230
+ background: var(--vgai-warn-muted);
231
+ border-color: transparent;
232
+ }
233
+
234
+ /* ------------------------------------------------------------------------- */
235
+ /* Hero-scale buttons (className extensions of the canonical .vgai-btn) */
236
+ /* ------------------------------------------------------------------------- */
237
+
238
+ .vgai-shell .vgai-btn.vgai-shell-cta {
239
+ height: 32px;
240
+ padding: 0 14px;
241
+ border-radius: var(--vgai-shell-radius-sm);
242
+ font-size: var(--vgai-shell-font-base);
243
+ font-weight: var(--vgai-font-weight-semibold);
244
+ }
245
+
246
+ /* Primary actions carry the cinematic hero-CTA material at every size —
247
+ * saturated accent, specular top light, real DARK elevation shadow (never a
248
+ * color glow: spec §"Shared language" rule 2 still bans the dated blue button
249
+ * bloom). Same recipe as the account primaries, so Create Project / Retry /
250
+ * Reopen read as one confident button system across the shell. */
251
+ .vgai-shell .vgai-btn[data-variant="primary"],
252
+ .vgai-account .vgai-btn[data-variant="primary"] {
253
+ color: #fff;
254
+ background:
255
+ linear-gradient(180deg, rgb(255 255 255 / 14%), rgb(255 255 255 / 0%) 52%),
256
+ color-mix(in srgb, var(--vgai-accent) 76%, #1d4ed8);
257
+ border: 1px solid color-mix(in srgb, var(--vgai-accent) 74%, white 8%);
258
+ box-shadow:
259
+ inset 0 1px 0 rgb(255 255 255 / 22%),
260
+ 0 1px 2px rgb(0 0 0 / 40%),
261
+ 0 6px 16px rgb(0 0 0 / 32%);
262
+ }
263
+
264
+ .vgai-shell .vgai-btn[data-variant="primary"]:hover:not(:disabled),
265
+ .vgai-account .vgai-btn[data-variant="primary"]:hover:not(:disabled) {
266
+ filter: brightness(1.09);
267
+ box-shadow:
268
+ inset 0 1px 0 rgb(255 255 255 / 32%),
269
+ 0 2px 4px rgb(0 0 0 / 42%),
270
+ 0 8px 22px rgb(0 0 0 / 42%);
271
+ }
272
+
273
+ /* §1-R hero CTA scale: ONE saturated primary with a specular top light + a
274
+ * real elevation shadow (dark, not a color glow), beside a ghost "Open". */
275
+ .vgai-shell .vgai-btn.vgai-shell-cta-hero {
276
+ height: 38px;
277
+ padding: 0 18px;
278
+ gap: var(--vgai-space-4);
279
+ border-radius: 9px;
280
+ font-size: var(--vgai-font-lg);
281
+ }
282
+
283
+ .vgai-shell .vgai-btn.vgai-shell-cta-hero[data-variant="primary"] {
284
+ color: #fff;
285
+ background:
286
+ linear-gradient(180deg, rgb(255 255 255 / 14%), rgb(255 255 255 / 0%) 52%),
287
+ color-mix(in srgb, var(--vgai-accent) 76%, #1d4ed8);
288
+ border: 1px solid color-mix(in srgb, var(--vgai-accent) 74%, white 8%);
289
+ box-shadow:
290
+ inset 0 1px 0 rgb(255 255 255 / 22%),
291
+ 0 1px 2px rgb(0 0 0 / 45%),
292
+ 0 8px 20px rgb(0 0 0 / 40%);
293
+ }
294
+
295
+ .vgai-shell .vgai-btn.vgai-shell-cta-hero[data-variant="primary"]:hover:not(:disabled) {
296
+ filter: brightness(1.09);
297
+ box-shadow:
298
+ inset 0 1px 0 rgb(255 255 255 / 32%),
299
+ 0 2px 4px rgb(0 0 0 / 45%),
300
+ 0 12px 28px rgb(0 0 0 / 50%);
301
+ }
302
+
303
+ /* Product-scale focus ring: 2px accent, offset 2 (spec §"Shared language"
304
+ * rule 6) — the editor chrome's 1px ring is too faint at page scale. */
305
+ .vgai-shell .vgai-btn:focus-visible,
306
+ .vgai-shell .vgai-input:focus-visible,
307
+ .vgai-shell .vgai-select:focus-visible,
308
+ .vgai-account .vgai-btn:focus-visible,
309
+ .vgai-account .vgai-input:focus-visible,
310
+ .vgai-account .vgai-select:focus-visible {
311
+ outline: var(--vgai-focus-ring);
312
+ outline-offset: 2px;
313
+ }
314
+
315
+ /* Quiet ghost CTA needs a legible resting state at product scale. */
316
+ .vgai-shell .vgai-btn.vgai-shell-cta[data-variant="ghost"] {
317
+ color: var(--vgai-content-muted);
318
+ }
319
+
320
+ .vgai-shell .vgai-btn.vgai-shell-cta[data-variant="ghost"]:hover:not(:disabled) {
321
+ color: var(--vgai-content-primary);
322
+ }
323
+
324
+ /* ------------------------------------------------------------------------- */
325
+ /* Cards + sections */
326
+ /* ------------------------------------------------------------------------- */
327
+
328
+ /* Elevated panel on the lit canvas — the hub/account material: a step
329
+ * lighter than the near-black stage, a soft top light caught along the upper
330
+ * edge, and a REAL elevation shadow (same recipe as .vgai-account-card, so
331
+ * the wizard and the sign-in card read as one panel system). */
332
+ .vgai-shell-card {
333
+ position: relative;
334
+ padding: 28px;
335
+ background:
336
+ linear-gradient(180deg, rgb(255 255 255 / 5%), rgb(255 255 255 / 0%) 44%),
337
+ color-mix(in srgb, white 3%, var(--vgai-surface-panel));
338
+ border: 1px solid rgb(255 255 255 / 9%);
339
+ border-radius: var(--vgai-shell-radius);
340
+ box-shadow:
341
+ inset 0 1px 0 rgb(255 255 255 / 8%),
342
+ 0 1px 2px rgb(0 0 0 / 45%),
343
+ 0 20px 48px rgb(0 0 0 / 46%);
344
+ box-sizing: border-box;
345
+ }
346
+
347
+ .vgai-shell-section {
348
+ margin-bottom: 36px;
349
+ }
350
+
351
+ .vgai-shell-section-label {
352
+ display: flex;
353
+ align-items: center;
354
+ gap: var(--vgai-space-4);
355
+ margin-bottom: 14px;
356
+ color: var(--vgai-content-dim);
357
+ font-size: var(--vgai-shell-font-xs);
358
+ font-weight: var(--vgai-font-weight-semibold);
359
+ letter-spacing: 0.09em;
360
+ text-transform: uppercase;
361
+ }
362
+
363
+ .vgai-shell-section-label::after {
364
+ content: "";
365
+ flex: 1;
366
+ height: 1px;
367
+ background: linear-gradient(90deg, var(--vgai-boundary-default), transparent);
368
+ }
369
+
370
+ /* Circle at one digit, pill past it: fixed height, min-width equal to the
371
+ * height, and border-box sizing so the horizontal padding only widens the
372
+ * badge once the content outgrows the 18px circle. */
373
+ .vgai-shell-count {
374
+ display: inline-grid;
375
+ place-items: center;
376
+ min-width: 18px;
377
+ height: 18px;
378
+ padding: 0 5px;
379
+ color: var(--vgai-content-muted);
380
+ background: var(--vgai-surface-raised);
381
+ border-radius: var(--vgai-radius-full);
382
+ font-size: var(--vgai-font-sm);
383
+ font-weight: var(--vgai-font-weight-semibold);
384
+ letter-spacing: 0;
385
+ box-sizing: border-box;
386
+ }
387
+
388
+ /* ------------------------------------------------------------------------- */
389
+ /* Empty state */
390
+ /* ------------------------------------------------------------------------- */
391
+
392
+ /* §1-R: NO boxed panel — the key-lit canvas itself is the empty state. A
393
+ * key-lit angular mark floats over the stage, one line, two CTAs. */
394
+ .vgai-shell-empty {
395
+ display: flex;
396
+ flex-direction: column;
397
+ align-items: center;
398
+ gap: var(--vgai-space-4);
399
+ padding: 72px 32px 64px;
400
+ text-align: center;
401
+ }
402
+
403
+ /* The mark sits IN the key light: local accent bloom + a soft ground shadow
404
+ * below it so it reads as an object on the stage, not a pasted icon. */
405
+ .vgai-shell-empty-mark {
406
+ position: relative;
407
+ display: grid;
408
+ place-items: center;
409
+ padding: 18px;
410
+ }
411
+
412
+ .vgai-shell-empty-mark::before {
413
+ content: "";
414
+ position: absolute;
415
+ inset: -46px;
416
+ background: radial-gradient(
417
+ closest-side,
418
+ color-mix(in srgb, var(--vgai-accent) 22%, transparent),
419
+ transparent 74%
420
+ );
421
+ border-radius: var(--vgai-radius-full);
422
+ pointer-events: none;
423
+ }
424
+
425
+ .vgai-shell-empty-mark::after {
426
+ content: "";
427
+ position: absolute;
428
+ bottom: -10px;
429
+ width: 96px;
430
+ height: 18px;
431
+ background: radial-gradient(closest-side, rgb(0 0 0 / 55%), transparent 75%);
432
+ border-radius: var(--vgai-radius-full);
433
+ pointer-events: none;
434
+ }
435
+
436
+ .vgai-shell-empty-title {
437
+ margin: 14px 0 0;
438
+ color: var(--vgai-content-primary);
439
+ font-size: 22px;
440
+ font-weight: 650;
441
+ letter-spacing: -0.02em;
442
+ }
443
+
444
+ .vgai-shell-empty-actions {
445
+ display: flex;
446
+ gap: var(--vgai-space-5);
447
+ margin-top: 18px;
448
+ }
449
+
450
+ /* ------------------------------------------------------------------------- */
451
+ /* Page footer — the version corner tag (§1-R) */
452
+ /* ------------------------------------------------------------------------- */
453
+
454
+ .vgai-shell-footer {
455
+ display: flex;
456
+ justify-content: flex-end;
457
+ margin-top: 72px;
458
+ }
459
+
460
+ .vgai-shell-footer .vgai-chip {
461
+ height: 20px;
462
+ padding: 0 7px;
463
+ color: color-mix(in srgb, var(--vgai-content-dim) 72%, transparent);
464
+ background: rgb(255 255 255 / 3%);
465
+ border-color: rgb(255 255 255 / 7%);
466
+ font-size: var(--vgai-font-sm);
467
+ }
468
+
469
+ /* ------------------------------------------------------------------------- */
470
+ /* Notices (info strip, e.g. browser/OPFS storage note) */
471
+ /* ------------------------------------------------------------------------- */
472
+
473
+ .vgai-shell-notice {
474
+ display: flex;
475
+ align-items: center;
476
+ flex-wrap: wrap;
477
+ gap: var(--vgai-space-6);
478
+ padding: var(--vgai-space-6) var(--vgai-space-8);
479
+ margin-bottom: var(--vgai-space-12);
480
+ color: var(--vgai-content-muted);
481
+ background: var(--vgai-accent-muted);
482
+ border: 1px solid color-mix(in srgb, var(--vgai-accent) 18%, transparent);
483
+ border-radius: var(--vgai-shell-radius-sm);
484
+ font-size: var(--vgai-shell-font-sm);
485
+ }
486
+
487
+ .vgai-shell-notice-icon {
488
+ color: var(--vgai-accent);
489
+ }
490
+
491
+ /* ------------------------------------------------------------------------- */
492
+ /* Error card (startup failures and inline action errors) */
493
+ /* ------------------------------------------------------------------------- */
494
+
495
+ /* The alert sits ON the lit stage as an elevated panel — same material as
496
+ * .vgai-shell-card but with the top light tinted toward the danger hue, so
497
+ * failure still reads cinematic, not bureaucratic. */
498
+ .vgai-shell .vgai-error-card {
499
+ display: flex;
500
+ gap: var(--vgai-space-8);
501
+ align-items: flex-start;
502
+ padding: 22px 24px;
503
+ margin-bottom: 28px;
504
+ background:
505
+ linear-gradient(
506
+ 180deg,
507
+ color-mix(in srgb, var(--vgai-danger) 7%, rgb(255 255 255 / 3%)),
508
+ rgb(255 255 255 / 0%) 46%
509
+ ),
510
+ color-mix(in srgb, white 3%, var(--vgai-surface-panel));
511
+ border: 1px solid color-mix(in srgb, var(--vgai-danger) 28%, rgb(255 255 255 / 8%));
512
+ border-radius: var(--vgai-shell-radius);
513
+ box-shadow:
514
+ inset 0 1px 0 color-mix(in srgb, var(--vgai-danger) 20%, rgb(255 255 255 / 8%)),
515
+ 0 1px 2px rgb(0 0 0 / 45%),
516
+ 0 20px 48px rgb(0 0 0 / 46%);
517
+ }
518
+
519
+ /* Startup failure page: the canvas key light itself shifts to a red-tinted
520
+ * key (the page is "lit for the scene"), vignette intact. Attribute-scoped so
521
+ * only the dedicated error surface re-lights — inline action errors on the
522
+ * hub keep the accent key light behind the grid. */
523
+ /* Startup failure is a composed hero moment, not a full-bleed banner: the
524
+ * alert holds a centered ~880px column under the red key light. Inline action
525
+ * errors (hub view) keep the content column's full width above the grid. */
526
+ .vgai-shell[data-testid="project-detection-error"] .vgai-error-card {
527
+ max-width: 880px;
528
+ margin-inline: auto;
529
+ }
530
+
531
+ /* The startup-failure page has no hub to navigate back to yet, so its brand is
532
+ * a static mark rather than the header BUTTON the hub renders — it still needs
533
+ * the brand row's layout. */
534
+ .vgai-shell .vgai-shell-brand-static {
535
+ display: inline-flex;
536
+ align-items: center;
537
+ gap: var(--vgai-space-5);
538
+ }
539
+
540
+ /* Everything on the failure page belongs to the SAME centered column the alert
541
+ * holds — the served-project note and the way out, not just the card. */
542
+ .vgai-shell[data-testid="project-detection-error"] .vgai-shell-notice,
543
+ .vgai-shell[data-testid="project-detection-error"] .vgai-startup-error-actions {
544
+ max-width: 880px;
545
+ margin-inline: auto;
546
+ }
547
+
548
+ .vgai-shell[data-testid="project-detection-error"]::before {
549
+ background:
550
+ radial-gradient(
551
+ 1150px 640px at 50% -16%,
552
+ color-mix(in srgb, var(--vgai-danger) 15%, transparent),
553
+ transparent 62%
554
+ ),
555
+ radial-gradient(720px 420px at 50% -4%, rgb(255 255 255 / 4%), transparent 58%),
556
+ radial-gradient(
557
+ 900px 560px at -12% 112%,
558
+ color-mix(in srgb, var(--vgai-danger) 4%, transparent),
559
+ transparent 55%
560
+ ),
561
+ radial-gradient(135% 105% at 50% 40%, transparent 50%, rgb(0 0 0 / 52%) 100%);
562
+ }
563
+
564
+ /* Warning glyph in a red-tinted ROUNDED-SQUARE tile (GitHub/Vercel alert
565
+ * anatomy) — a circle here reads as a status dot, not a container. */
566
+ .vgai-shell .vgai-error-card-icon {
567
+ display: grid;
568
+ place-items: center;
569
+ flex: none;
570
+ width: 34px;
571
+ height: 34px;
572
+ margin-top: var(--vgai-space-1);
573
+ color: var(--vgai-danger);
574
+ background:
575
+ linear-gradient(180deg, rgb(255 255 255 / 8%), transparent 55%), var(--vgai-danger-muted);
576
+ border: 1px solid color-mix(in srgb, var(--vgai-danger) 34%, transparent);
577
+ border-radius: var(--vgai-shell-radius-sm);
578
+ box-shadow: 0 0 18px color-mix(in srgb, var(--vgai-danger) 22%, transparent);
579
+ font-size: var(--vgai-shell-font-base);
580
+ box-sizing: border-box;
581
+ }
582
+
583
+ .vgai-shell .vgai-error-card-body {
584
+ flex: 1;
585
+ min-width: 0;
586
+ }
587
+
588
+ .vgai-shell .vgai-error-card-title {
589
+ margin: 0 0 var(--vgai-space-2);
590
+ color: var(--vgai-content-primary);
591
+ font-size: 15px;
592
+ font-weight: var(--vgai-font-weight-semibold);
593
+ letter-spacing: -0.01em;
594
+ line-height: var(--vgai-leading-normal);
595
+ }
596
+
597
+ .vgai-shell .vgai-error-card-guidance {
598
+ margin: 0 0 var(--vgai-space-4);
599
+ color: var(--vgai-content-muted);
600
+ font-size: var(--vgai-shell-font-base);
601
+ }
602
+
603
+ /* Monospace detail on a darker inset, scrollable past ~9 lines so a long
604
+ * stack trace can never push the actions off-screen. */
605
+ .vgai-shell .vgai-error-card-message {
606
+ max-height: 176px;
607
+ padding: var(--vgai-space-5) var(--vgai-space-6);
608
+ overflow: auto;
609
+ color: var(--vgai-danger);
610
+ background: color-mix(in srgb, black 30%, var(--vgai-surface-inset));
611
+ border: 1px solid var(--vgai-boundary-default);
612
+ border-radius: var(--vgai-shell-radius-sm);
613
+ font-family: var(--vgai-font-mono);
614
+ font-size: var(--vgai-shell-font-sm);
615
+ line-height: 1.6;
616
+ overflow-wrap: anywhere;
617
+ white-space: pre-wrap;
618
+ }
619
+
620
+ .vgai-shell .vgai-error-card-recovery-label {
621
+ margin: 14px 0 6px;
622
+ color: var(--vgai-content-dim);
623
+ font-size: var(--vgai-shell-font-xs);
624
+ font-weight: var(--vgai-font-weight-semibold);
625
+ letter-spacing: 0.09em;
626
+ text-transform: uppercase;
627
+ }
628
+
629
+ .vgai-shell .vgai-error-card-command {
630
+ display: flex;
631
+ align-items: center;
632
+ gap: var(--vgai-space-4);
633
+ padding: 8px 8px 8px 14px;
634
+ background: var(--vgai-surface-inset);
635
+ border: 1px solid var(--vgai-boundary-strong);
636
+ border-radius: var(--vgai-shell-radius-sm);
637
+ }
638
+
639
+ .vgai-shell .vgai-error-card-command > code {
640
+ flex: 1;
641
+ color: var(--vgai-content-primary);
642
+ font-family: var(--vgai-font-mono);
643
+ font-size: var(--vgai-shell-font-sm);
644
+ overflow-wrap: anywhere;
645
+ }
646
+
647
+ .vgai-shell .vgai-error-card-actions {
648
+ display: flex;
649
+ gap: var(--vgai-space-5);
650
+ margin-top: 14px;
651
+ }
652
+
653
+ /* ------------------------------------------------------------------------- */
654
+ /* Startup splash */
655
+ /* ------------------------------------------------------------------------- */
656
+
657
+ /* Boot is a cinematic moment matching the hub empty state: the same
658
+ * near-black key-lit canvas, the angular mark blooming IN the key light over a
659
+ * ground shadow, a tracked wordmark, one glowing accent progress line, ONE
660
+ * status line. */
661
+ .vgai-splash {
662
+ position: absolute;
663
+ inset: 0;
664
+ display: grid;
665
+ place-items: center;
666
+ background: color-mix(in srgb, var(--vgai-surface-shell) 42%, black);
667
+ color: var(--vgai-content-primary);
668
+ pointer-events: auto;
669
+ overflow: hidden;
670
+ }
671
+
672
+ /* Key light centered ON the mark (not top-of-page: the splash's subject sits
673
+ * mid-frame), soft white core, edge vignette. */
674
+ .vgai-splash::before {
675
+ content: "";
676
+ position: absolute;
677
+ inset: 0;
678
+ background:
679
+ radial-gradient(
680
+ 1000px 640px at 50% 34%,
681
+ color-mix(in srgb, var(--vgai-accent) 18%, transparent),
682
+ transparent 62%
683
+ ),
684
+ radial-gradient(520px 340px at 50% 40%, rgb(255 255 255 / 5%), transparent 60%),
685
+ radial-gradient(135% 105% at 50% 45%, transparent 48%, rgb(0 0 0 / 55%) 100%);
686
+ pointer-events: none;
687
+ }
688
+
689
+ /* Faint dot grid fading out under the key light — same fabric as the hub. */
690
+ .vgai-splash::after {
691
+ content: "";
692
+ position: absolute;
693
+ inset: 0;
694
+ background-image: radial-gradient(rgb(255 255 255 / 4%) 1px, transparent 1px);
695
+ background-size: 26px 26px;
696
+ mask-image: radial-gradient(640px 420px at 50% 40%, rgb(0 0 0 / 80%), transparent 78%);
697
+ pointer-events: none;
698
+ }
699
+
700
+ .vgai-splash-stack {
701
+ position: relative;
702
+ display: flex;
703
+ flex-direction: column;
704
+ align-items: center;
705
+ gap: var(--vgai-space-8);
706
+ min-width: 260px;
707
+ animation: vgai-shell-rise 600ms var(--vgai-shell-var(--vgai-ease-standard)) both;
708
+ }
709
+
710
+ .vgai-splash-logo {
711
+ position: relative;
712
+ display: grid;
713
+ place-items: center;
714
+ width: 72px;
715
+ height: 72px;
716
+ margin-bottom: var(--vgai-space-3);
717
+ }
718
+
719
+ /* Accent bloom around the mark + soft ground shadow beneath it — the same
720
+ * object-on-a-stage treatment as the hub empty state's mark. */
721
+ .vgai-splash-logo::before {
722
+ content: "";
723
+ position: absolute;
724
+ inset: -42px;
725
+ background: radial-gradient(
726
+ closest-side,
727
+ color-mix(in srgb, var(--vgai-accent) 24%, transparent),
728
+ transparent 74%
729
+ );
730
+ border-radius: var(--vgai-radius-full);
731
+ }
732
+
733
+ .vgai-splash-logo::after {
734
+ content: "";
735
+ position: absolute;
736
+ bottom: -12px;
737
+ width: 84px;
738
+ height: 16px;
739
+ background: radial-gradient(closest-side, rgb(0 0 0 / 55%), transparent 75%);
740
+ border-radius: var(--vgai-radius-full);
741
+ }
742
+
743
+ /* Tracked wordmark — catches a whisper of the key light, like the hub title. */
744
+ .vgai-splash-title {
745
+ color: rgb(255 255 255 / 88%);
746
+ font-size: var(--vgai-font-xl);
747
+ font-weight: var(--vgai-font-weight-semibold);
748
+ letter-spacing: 0.3em;
749
+ text-indent: 0.3em; /* recenters tracked uppercase (trailing tracking) */
750
+ text-transform: uppercase;
751
+ text-shadow: 0 1px 18px color-mix(in srgb, var(--vgai-accent) 30%, transparent);
752
+ }
753
+
754
+ /* Thin accent sweep with a subtle ambient glow — progress is STATE, the one
755
+ * place the accent may bloom (same doctrine as the account meter). The glow
756
+ * lives on the track (the sweep is clipped by overflow, so a shadow on the
757
+ * bar itself would be cropped to the 2px line). */
758
+ .vgai-splash-progress {
759
+ position: relative;
760
+ width: 232px;
761
+ height: 3px;
762
+ margin-top: var(--vgai-space-3);
763
+ overflow: hidden;
764
+ background: color-mix(in srgb, var(--vgai-accent) 14%, rgb(255 255 255 / 5%));
765
+ border-radius: var(--vgai-radius-full);
766
+ box-shadow: 0 0 18px color-mix(in srgb, var(--vgai-accent) 38%, transparent);
767
+ }
768
+
769
+ .vgai-splash-progress::after {
770
+ content: "";
771
+ position: absolute;
772
+ inset: 0;
773
+ width: 52%;
774
+ background: linear-gradient(
775
+ 90deg,
776
+ transparent,
777
+ color-mix(in srgb, var(--vgai-accent) 80%, white),
778
+ transparent
779
+ );
780
+ border-radius: inherit;
781
+ animation: vgai-splash-sweep 1.4s ease-in-out infinite;
782
+ }
783
+
784
+ .vgai-splash-status {
785
+ color: var(--vgai-content-dim);
786
+ font-size: var(--vgai-shell-font-sm);
787
+ letter-spacing: 0.01em;
788
+ }
789
+
790
+ /* The patient-wait explanation under the status line: quieter than the status
791
+ itself, and narrow enough to read as a sentence rather than a banner. */
792
+ .vgai-splash-note {
793
+ max-width: 42ch;
794
+ color: var(--vgai-content-dim);
795
+ font-size: var(--vgai-shell-font-xs, var(--vgai-shell-font-sm));
796
+ line-height: var(--vgai-leading-relaxed);
797
+ text-align: center;
798
+ opacity: 0.8;
799
+ }
800
+
801
+ @keyframes vgai-splash-sweep {
802
+ from {
803
+ transform: translateX(-110%);
804
+ }
805
+
806
+ to {
807
+ transform: translateX(360%);
808
+ }
809
+ }
810
+
811
+ /* ------------------------------------------------------------------------- */
812
+ /* Entrance motion */
813
+ /* ------------------------------------------------------------------------- */
814
+
815
+ .vgai-shell-rise {
816
+ animation: vgai-shell-rise 480ms var(--vgai-shell-var(--vgai-ease-standard)) both;
817
+ }
818
+
819
+ .vgai-shell-rise[data-rise="2"] {
820
+ animation-delay: 60ms;
821
+ }
822
+
823
+ .vgai-shell-rise[data-rise="3"] {
824
+ animation-delay: 120ms;
825
+ }
826
+
827
+ .vgai-shell-rise[data-rise="4"] {
828
+ animation-delay: 180ms;
829
+ }
830
+
831
+ @keyframes vgai-shell-rise {
832
+ from {
833
+ opacity: 0;
834
+ transform: translateY(10px);
835
+ }
836
+
837
+ to {
838
+ opacity: 1;
839
+ transform: translateY(0);
840
+ }
841
+ }
842
+
843
+ /* ------------------------------------------------------------------------- */
844
+ /* Account page */
845
+ /* ------------------------------------------------------------------------- */
846
+
847
+ .vgai-account {
848
+ font-size: var(--vgai-shell-font-base);
849
+ line-height: var(--vgai-shell-line);
850
+ }
851
+
852
+ /* When the account document is hosted inside the editor workspace it needs
853
+ * its own scroll + centering AND its own cinematic canvas — the same key-lit
854
+ * near-black stage the shell paints (key light, counter-bloom, vignette),
855
+ * carried in the background stack because a dock panel cannot host the
856
+ * shell's fixed-position pseudo layers. Inside the product shell the shell
857
+ * provides all of it, so the nested rule strips this back off. */
858
+ .vgai-account {
859
+ height: 100%;
860
+ padding: 32px 40px 64px;
861
+ overflow: auto;
862
+ box-sizing: border-box;
863
+ color: var(--vgai-content-primary);
864
+ background:
865
+ radial-gradient(
866
+ 1000px 560px at 50% -10%,
867
+ color-mix(in srgb, var(--vgai-accent) 20%, transparent),
868
+ transparent 62%
869
+ ),
870
+ radial-gradient(640px 380px at 50% -2%, rgb(255 255 255 / 5%), transparent 58%),
871
+ radial-gradient(135% 105% at 50% 40%, transparent 50%, rgb(0 0 0 / 45%) 100%),
872
+ color-mix(in srgb, var(--vgai-surface-shell) 42%, black);
873
+ }
874
+
875
+ .vgai-shell .vgai-account {
876
+ height: auto;
877
+ padding: 0;
878
+ overflow: visible;
879
+ background: none;
880
+ }
881
+
882
+ /* U6.5 F13 — Regular backing for the WORKSPACE-hosted account document.
883
+ * Under islands+floating the center document renders over the live scene
884
+ * with transparent interiors, so the sign-in page's text sat directly on
885
+ * the game (audit shot 16: white-on-white sign-in). A text-heavy CONTENT
886
+ * surface gets the Regular-material floor (owner adjudication: keep the
887
+ * frost, floor the interiors — same family as .vgai-menu / the F3 tray
888
+ * popout): the self-sufficient regular bg + strong frost, statically
889
+ * paired with the `-on-bright` ink ramp (mirrors normal inks for
890
+ * non-adaptive themes). Scoped to the dock-document host, so the
891
+ * product-shell-hosted account page (opaque shell behind) and bars themes
892
+ * paint byte-identically. */
893
+ [data-vgai-chrome="islands"] .vgai-dock-document-content .vgai-account {
894
+ --vgai-content-primary: var(--vgai-content-primary-on-bright);
895
+ --vgai-content-muted: var(--vgai-content-muted-on-bright);
896
+ --vgai-content-dim: var(--vgai-content-dim-on-bright);
897
+ --vgai-content-text-shadow: var(--vgai-content-text-shadow-on-bright);
898
+ --vgai-content-frost-bg: var(--vgai-content-frost-bg-on-bright);
899
+ --vgai-text-1: var(--vgai-content-primary);
900
+ --vgai-text-2: var(--vgai-content-muted);
901
+ --vgai-text-3: var(--vgai-content-dim);
902
+ text-shadow: var(--vgai-content-text-shadow, none);
903
+ background: var(--vgai-glass-regular-bg, var(--vgai-surface-panel));
904
+ backdrop-filter: var(--vgai-glass-regular-backdrop-filter, none);
905
+ -webkit-backdrop-filter: var(--vgai-glass-regular-backdrop-filter, none);
906
+ }
907
+
908
+ /* The centered workspace-task host already owns the one Regular material.
909
+ * Do not stack a second opaque/frosted account surface inside it. */
910
+ [data-vgai-chrome="islands"]
911
+ .vgai-workspace-task-overlay
912
+ .vgai-dock-document-content
913
+ .vgai-account {
914
+ background: transparent;
915
+ backdrop-filter: none;
916
+ -webkit-backdrop-filter: none;
917
+ }
918
+ /* Interior cards/wells re-tint from currentColor so they read as quiet
919
+ * sections on the Regular surface on either ink side (tooltip kbd idiom —
920
+ * their authored fills assumed the dark panel family). */
921
+ [data-vgai-chrome="islands"] .vgai-dock-document-content .vgai-account .vgai-account-card {
922
+ background: color-mix(in srgb, currentColor 5%, transparent);
923
+ border-color: color-mix(in srgb, currentColor 18%, transparent);
924
+ box-shadow: none;
925
+ }
926
+
927
+ /* Signed-in settings column. Linear-style: one narrow left-anchored stack —
928
+ * the account view inherits the shell's 1120px column, so the constraint
929
+ * lives HERE, inside the account's own markup. */
930
+ .vgai-account-stack {
931
+ max-width: 720px;
932
+ margin: 0 auto;
933
+ display: flex;
934
+ flex-direction: column;
935
+ gap: var(--vgai-space-10);
936
+ }
937
+
938
+ /* Identity header (§3-R): a player-profile hero ON the lit canvas — no boxed
939
+ * card. 56px specular avatar catching the key light, email at display weight,
940
+ * plan pill beside it, mode as a micro-label. Sign out stays a quiet button on
941
+ * the right — session exit is an identity concern, not a billing action. */
942
+ .vgai-account-identity {
943
+ display: flex;
944
+ align-items: center;
945
+ gap: var(--vgai-space-8);
946
+ padding: var(--vgai-space-3) var(--vgai-space-1) var(--vgai-space-5);
947
+ margin-bottom: var(--vgai-space-3);
948
+ }
949
+
950
+ .vgai-account-avatar {
951
+ display: grid;
952
+ place-items: center;
953
+ flex: none;
954
+ width: 56px;
955
+ height: 56px;
956
+ color: var(--vgai-content-on-accent);
957
+ background:
958
+ linear-gradient(180deg, rgb(255 255 255 / 24%), transparent 55%),
959
+ linear-gradient(
960
+ 135deg,
961
+ color-mix(in srgb, var(--vgai-accent) 88%, white),
962
+ color-mix(in srgb, var(--vgai-accent) 68%, black)
963
+ );
964
+ border-radius: var(--vgai-radius-full);
965
+ font-size: 22px;
966
+ font-weight: var(--vgai-font-weight-semibold);
967
+ letter-spacing: 0.02em;
968
+ text-transform: uppercase;
969
+ box-shadow:
970
+ inset 0 1px 0 rgb(255 255 255 / 30%),
971
+ 0 0 0 1px rgb(255 255 255 / 10%),
972
+ 0 6px 18px rgb(0 0 0 / 45%),
973
+ 0 0 32px color-mix(in srgb, var(--vgai-accent) 26%, transparent);
974
+ }
975
+
976
+ .vgai-account-identity-main {
977
+ flex: 1;
978
+ min-width: 0;
979
+ }
980
+
981
+ .vgai-account-identity-row {
982
+ display: flex;
983
+ align-items: center;
984
+ flex-wrap: wrap;
985
+ gap: var(--vgai-space-2) var(--vgai-space-5);
986
+ }
987
+
988
+ .vgai-account-identity-email {
989
+ margin: 0;
990
+ color: #fff;
991
+ font-size: 20px;
992
+ font-weight: 650;
993
+ letter-spacing: -0.02em;
994
+ line-height: var(--vgai-leading-snug);
995
+ overflow-wrap: anywhere;
996
+ text-shadow: 0 2px 18px color-mix(in srgb, var(--vgai-accent) 22%, transparent);
997
+ }
998
+
999
+ .vgai-account-plan-chips {
1000
+ display: inline-flex;
1001
+ align-items: center;
1002
+ flex-wrap: wrap;
1003
+ gap: var(--vgai-space-4);
1004
+ }
1005
+
1006
+ .vgai-account-identity-note {
1007
+ margin: 3px 0 0;
1008
+ color: var(--vgai-content-dim);
1009
+ font-size: var(--vgai-shell-font-xs);
1010
+ font-weight: var(--vgai-font-weight-semibold);
1011
+ letter-spacing: 0.08em;
1012
+ text-transform: uppercase;
1013
+ }
1014
+
1015
+ .vgai-account .vgai-btn.vgai-account-signout {
1016
+ flex: none;
1017
+ color: var(--vgai-content-muted);
1018
+ }
1019
+
1020
+ .vgai-account .vgai-btn.vgai-account-signout:hover:not(:disabled) {
1021
+ color: var(--vgai-content-primary);
1022
+ }
1023
+
1024
+ /* Shell chips are monospace because they carry machine values (versions,
1025
+ * ports). Account chips carry prose ("Free plan", "0 reserved") and read as
1026
+ * unpolished in mono — override inside the account surface only. */
1027
+ .vgai-account .vgai-chip {
1028
+ height: 24px;
1029
+ padding: 0 var(--vgai-space-5);
1030
+ font-weight: var(--vgai-font-weight-semibold);
1031
+ letter-spacing: 0;
1032
+ }
1033
+
1034
+ /* Sign-in composition (§4-R): a cinematic moment. The key-lit angular mark
1035
+ * floats on the CANVAS above a centered 400px card (hub empty-state anatomy);
1036
+ * value bullets stay demoted below, provider panel subordinate at full stack
1037
+ * width. */
1038
+ .vgai-account-signin-stack {
1039
+ display: flex;
1040
+ flex-direction: column;
1041
+ align-items: center;
1042
+ gap: var(--vgai-space-10);
1043
+ max-width: 720px;
1044
+ margin: 0 auto;
1045
+ padding-top: var(--vgai-space-8);
1046
+ }
1047
+
1048
+ .vgai-account-signin-stack > .vgai-provider-connections {
1049
+ width: 100%;
1050
+ box-sizing: border-box;
1051
+ }
1052
+
1053
+ .vgai-account-signin-hero {
1054
+ display: flex;
1055
+ flex-direction: column;
1056
+ align-items: center;
1057
+ gap: var(--vgai-space-2);
1058
+ padding-top: var(--vgai-space-10);
1059
+ text-align: center;
1060
+ }
1061
+
1062
+ /* The mark sits IN the key light — local accent bloom behind it and a soft
1063
+ * ground shadow beneath, so it reads as an object on the stage. */
1064
+ .vgai-account-signin-mark {
1065
+ position: relative;
1066
+ display: grid;
1067
+ place-items: center;
1068
+ padding: var(--vgai-space-8);
1069
+ }
1070
+
1071
+ .vgai-account-signin-mark::before {
1072
+ content: "";
1073
+ position: absolute;
1074
+ inset: -54px;
1075
+ background: radial-gradient(
1076
+ closest-side,
1077
+ color-mix(in srgb, var(--vgai-accent) 28%, transparent),
1078
+ transparent 76%
1079
+ );
1080
+ border-radius: var(--vgai-radius-full);
1081
+ pointer-events: none;
1082
+ }
1083
+
1084
+ .vgai-account-signin-mark::after {
1085
+ content: "";
1086
+ position: absolute;
1087
+ bottom: -8px;
1088
+ width: 84px;
1089
+ height: 16px;
1090
+ background: radial-gradient(closest-side, rgb(0 0 0 / 55%), transparent 75%);
1091
+ border-radius: var(--vgai-radius-full);
1092
+ pointer-events: none;
1093
+ }
1094
+
1095
+ .vgai-account-signin-card {
1096
+ display: flex;
1097
+ flex-direction: column;
1098
+ gap: var(--vgai-space-8);
1099
+ width: min(400px, 100%);
1100
+ padding: 28px;
1101
+ box-sizing: border-box;
1102
+ }
1103
+
1104
+ .vgai-account-signin-title {
1105
+ margin: var(--vgai-space-5) 0 0;
1106
+ color: #fff;
1107
+ font-size: var(--vgai-font-heading);
1108
+ font-weight: 650;
1109
+ letter-spacing: -0.02em;
1110
+ line-height: var(--vgai-leading-snug);
1111
+ text-shadow: 0 2px 24px color-mix(in srgb, var(--vgai-accent) 24%, transparent);
1112
+ }
1113
+
1114
+ /* Account primaries carry the hub hero-CTA material — saturated accent with a
1115
+ * specular top light and a modest elevation shadow (compact primaries like
1116
+ * "Upgrade to Creator" share it at their own size). */
1117
+ .vgai-account .vgai-btn[data-variant="primary"] {
1118
+ color: #fff;
1119
+ background:
1120
+ linear-gradient(180deg, rgb(255 255 255 / 14%), rgb(255 255 255 / 0%) 52%),
1121
+ color-mix(in srgb, var(--vgai-accent) 76%, #1d4ed8);
1122
+ border: 1px solid color-mix(in srgb, var(--vgai-accent) 74%, white 8%);
1123
+ box-shadow:
1124
+ inset 0 1px 0 rgb(255 255 255 / 22%),
1125
+ 0 1px 2px rgb(0 0 0 / 40%),
1126
+ 0 6px 16px rgb(0 0 0 / 32%);
1127
+ }
1128
+
1129
+ .vgai-account .vgai-btn[data-variant="primary"]:hover:not(:disabled) {
1130
+ filter: brightness(1.09);
1131
+ box-shadow:
1132
+ inset 0 1px 0 rgb(255 255 255 / 32%),
1133
+ 0 2px 4px rgb(0 0 0 / 42%),
1134
+ 0 8px 22px rgb(0 0 0 / 42%);
1135
+ }
1136
+
1137
+ /* Sign-in primary at hero-CTA scale. */
1138
+ .vgai-account-signin-card .vgai-btn[data-variant="primary"] {
1139
+ width: 100%;
1140
+ height: 38px;
1141
+ border-radius: 9px;
1142
+ font-size: var(--vgai-shell-font-base);
1143
+ font-weight: var(--vgai-font-weight-semibold);
1144
+ }
1145
+
1146
+ /* Value bullets: outside the card, muted 13px with check glyphs. */
1147
+ .vgai-account-signin-points {
1148
+ display: flex;
1149
+ flex-direction: column;
1150
+ gap: var(--vgai-space-4);
1151
+ width: min(400px, 100%);
1152
+ margin: 0;
1153
+ padding: 0 var(--vgai-space-2);
1154
+ list-style: none;
1155
+ color: var(--vgai-content-dim);
1156
+ font-size: var(--vgai-shell-font-base);
1157
+ box-sizing: border-box;
1158
+ }
1159
+
1160
+ .vgai-account-signin-points li {
1161
+ display: flex;
1162
+ align-items: baseline;
1163
+ gap: var(--vgai-space-5);
1164
+ }
1165
+
1166
+ .vgai-account-signin-points li::before {
1167
+ content: "✓";
1168
+ flex: none;
1169
+ color: var(--vgai-success);
1170
+ font-size: var(--vgai-shell-font-sm);
1171
+ font-weight: var(--vgai-font-weight-semibold);
1172
+ }
1173
+
1174
+ /* Field composition shared across account forms. */
1175
+ .vgai-account .vgai-field {
1176
+ display: flex;
1177
+ flex-direction: column;
1178
+ gap: 7px;
1179
+ }
1180
+
1181
+ .vgai-account .vgai-field-label {
1182
+ color: var(--vgai-content-muted);
1183
+ font-size: var(--vgai-shell-font-sm);
1184
+ font-weight: var(--vgai-font-weight-semibold);
1185
+ }
1186
+
1187
+ .vgai-account .vgai-input,
1188
+ .vgai-account .vgai-select {
1189
+ height: 34px;
1190
+ padding: 0 var(--vgai-space-6);
1191
+ border-radius: var(--vgai-shell-radius-sm);
1192
+ font-size: var(--vgai-shell-font-base);
1193
+ }
1194
+
1195
+ .vgai-account .vgai-select {
1196
+ padding-right: 30px;
1197
+ }
1198
+
1199
+ .vgai-account-help {
1200
+ margin: 0;
1201
+ color: var(--vgai-content-dim);
1202
+ font-size: var(--vgai-shell-font-sm);
1203
+ line-height: var(--vgai-leading-relaxed);
1204
+ }
1205
+
1206
+ /* Info strip: quiet blue tint + icon (mirrors .vgai-shell-notice anatomy so
1207
+ * the mock/authorization notes read as information, not as warnings). */
1208
+ /* Info strip demoted to a CAPTION (§4-R terse chrome): icon + one dim line,
1209
+ * no banner box — a boxed notice was the card's first read, ahead of the
1210
+ * form it annotates. */
1211
+ .vgai-account-infostrip {
1212
+ display: flex;
1213
+ align-items: flex-start;
1214
+ gap: var(--vgai-space-4);
1215
+ padding: 0 var(--vgai-space-1);
1216
+ color: var(--vgai-content-dim);
1217
+ font-size: var(--vgai-shell-font-xs);
1218
+ line-height: var(--vgai-leading-relaxed);
1219
+ text-align: left;
1220
+ }
1221
+
1222
+ .vgai-account-infostrip-icon {
1223
+ flex: none;
1224
+ margin-top: var(--vgai-space-1);
1225
+ color: color-mix(in srgb, var(--vgai-accent) 70%, var(--vgai-content-dim));
1226
+ }
1227
+
1228
+ /* Section cards — the hub's material: a step lighter than the near-black
1229
+ * canvas, a soft top light caught along the upper edge, and a REAL elevation
1230
+ * shadow so panels sit ON the lit stage instead of floating as flat grey
1231
+ * rectangles with hairlines. */
1232
+ .vgai-account-card {
1233
+ padding: var(--vgai-space-12);
1234
+ background:
1235
+ linear-gradient(180deg, rgb(255 255 255 / 5%), rgb(255 255 255 / 0%) 44%),
1236
+ color-mix(in srgb, white 3%, var(--vgai-surface-panel));
1237
+ border: 1px solid rgb(255 255 255 / 9%);
1238
+ border-radius: var(--vgai-shell-radius);
1239
+ box-shadow:
1240
+ inset 0 1px 0 rgb(255 255 255 / 8%),
1241
+ 0 1px 2px rgb(0 0 0 / 45%),
1242
+ 0 20px 48px rgb(0 0 0 / 46%);
1243
+ box-sizing: border-box;
1244
+ }
1245
+
1246
+ .vgai-account-card-title {
1247
+ margin: 0 0 var(--vgai-space-2);
1248
+ color: var(--vgai-content-primary);
1249
+ font-size: var(--vgai-shell-font-md);
1250
+ font-weight: var(--vgai-font-weight-semibold);
1251
+ letter-spacing: -0.005em;
1252
+ }
1253
+
1254
+ .vgai-account-card-sub {
1255
+ margin: 0 0 var(--vgai-space-8);
1256
+ color: var(--vgai-content-dim);
1257
+ font-size: var(--vgai-shell-font-sm);
1258
+ max-width: 560px;
1259
+ }
1260
+
1261
+ /* Card header row: title left, the context's one primary action right. The
1262
+ * plan upgrade lives HERE (GitHub billing pattern) because the number that
1263
+ * motivates it is directly underneath — a bottom action row divorces the
1264
+ * action from its evidence. */
1265
+ .vgai-account-card-head {
1266
+ display: flex;
1267
+ align-items: center;
1268
+ justify-content: space-between;
1269
+ gap: var(--vgai-space-6);
1270
+ }
1271
+
1272
+ .vgai-account-card-head .vgai-account-card-title {
1273
+ margin: 0;
1274
+ }
1275
+
1276
+ /* Credits figure: large-but-not-jumbo (24/600) per spec §3 — a balance is
1277
+ * glanceable state, not a marketing headline. */
1278
+ .vgai-account-credit-figure {
1279
+ display: flex;
1280
+ align-items: baseline;
1281
+ gap: var(--vgai-space-4);
1282
+ margin: var(--vgai-space-5) 0 var(--vgai-space-6);
1283
+ }
1284
+
1285
+ .vgai-account-credit-number {
1286
+ color: #fff;
1287
+ font-size: 28px;
1288
+ font-weight: 650;
1289
+ letter-spacing: -0.02em;
1290
+ line-height: var(--vgai-leading-tight);
1291
+ font-variant-numeric: tabular-nums;
1292
+ }
1293
+
1294
+ .vgai-account-credit-unit {
1295
+ color: var(--vgai-content-dim);
1296
+ font-size: var(--vgai-shell-font-sm);
1297
+ }
1298
+
1299
+ /* Pill meter on a recessed track. Two segments: used = lit accent with a
1300
+ * soft glow (the one place the accent may bloom — it is state, not a
1301
+ * button), reserved = translucent accent right after it; the legend dots
1302
+ * below map 1:1 onto the segments. Over-quota flips fill AND glow to the
1303
+ * danger hue. */
1304
+ .vgai-account .vgai-meter {
1305
+ position: relative;
1306
+ height: 8px;
1307
+ margin: var(--vgai-space-1) 0 var(--vgai-space-5);
1308
+ overflow: hidden;
1309
+ background: rgb(0 0 0 / 38%);
1310
+ border-radius: var(--vgai-radius-full);
1311
+ box-shadow:
1312
+ inset 0 1px 2px rgb(0 0 0 / 50%),
1313
+ inset 0 0 0 1px rgb(255 255 255 / 5%);
1314
+ box-sizing: border-box;
1315
+ }
1316
+
1317
+ .vgai-account .vgai-meter-fill {
1318
+ position: absolute;
1319
+ inset: 0 auto 0 0;
1320
+ background: linear-gradient(
1321
+ 180deg,
1322
+ color-mix(in srgb, var(--vgai-accent) 78%, white),
1323
+ var(--vgai-accent)
1324
+ );
1325
+ border-radius: inherit;
1326
+ box-shadow: 0 0 12px color-mix(in srgb, var(--vgai-accent) 55%, transparent);
1327
+ transition: width var(--vgai-duration-slow) var(--vgai-shell-var(--vgai-ease-standard));
1328
+ }
1329
+
1330
+ .vgai-account .vgai-meter-fill[data-part="reserved"] {
1331
+ background: color-mix(in srgb, var(--vgai-accent) 38%, transparent);
1332
+ box-shadow: none;
1333
+ }
1334
+
1335
+ .vgai-account .vgai-meter[data-state="over"] .vgai-meter-fill {
1336
+ background: linear-gradient(
1337
+ 180deg,
1338
+ color-mix(in srgb, var(--vgai-danger) 80%, white),
1339
+ var(--vgai-danger)
1340
+ );
1341
+ box-shadow: 0 0 12px color-mix(in srgb, var(--vgai-danger) 55%, transparent);
1342
+ }
1343
+
1344
+ .vgai-account-cycle-line {
1345
+ margin: 0 0 var(--vgai-space-6);
1346
+ color: var(--vgai-content-dim);
1347
+ font-size: var(--vgai-shell-font-sm);
1348
+ font-variant-numeric: tabular-nums;
1349
+ }
1350
+
1351
+ /* Danger, not warn: the meter's over-quota fill is already the danger hue, so
1352
+ * the "over allowance" callout speaks in the same family — one alarm, one hue. */
1353
+ .vgai-account-cycle-over {
1354
+ color: var(--vgai-danger);
1355
+ font-weight: var(--vgai-font-weight-semibold);
1356
+ }
1357
+
1358
+ /* 12px dot legend (replaces the former three pill chips — deferred from U0:
1359
+ * three counters in capsules read as three unrelated tags, not one budget). */
1360
+ .vgai-account-legend {
1361
+ display: flex;
1362
+ align-items: center;
1363
+ flex-wrap: wrap;
1364
+ gap: var(--vgai-space-3) var(--vgai-space-8);
1365
+ }
1366
+
1367
+ .vgai-account-legend-item {
1368
+ display: inline-flex;
1369
+ align-items: center;
1370
+ gap: 7px;
1371
+ color: var(--vgai-content-muted);
1372
+ font-size: var(--vgai-shell-font-sm);
1373
+ font-variant-numeric: tabular-nums;
1374
+ }
1375
+
1376
+ .vgai-account-legend-dot {
1377
+ flex: none;
1378
+ width: 8px;
1379
+ height: 8px;
1380
+ border-radius: var(--vgai-radius-full);
1381
+ box-sizing: border-box;
1382
+ }
1383
+
1384
+ .vgai-account-legend-item[data-part="used"] .vgai-account-legend-dot {
1385
+ background: var(--vgai-accent);
1386
+ }
1387
+
1388
+ /* Over-quota: the "used" dot maps 1:1 onto the meter's fill, and that fill has
1389
+ * flipped to danger — the dot follows so the legend never shows accent under a
1390
+ * red bar. 35%/85% states keep the accent dot. */
1391
+ .vgai-account-legend[data-state="over"] .vgai-account-legend-item[data-part="used"]
1392
+ .vgai-account-legend-dot {
1393
+ background: var(--vgai-danger);
1394
+ }
1395
+
1396
+ .vgai-account-legend-item[data-part="reserved"] .vgai-account-legend-dot {
1397
+ background: color-mix(in srgb, var(--vgai-accent) 38%, transparent);
1398
+ }
1399
+
1400
+ /* Purchased is a supply figure, not a meter segment — outlined, not filled. */
1401
+ .vgai-account-legend-item[data-part="purchased"] .vgai-account-legend-dot {
1402
+ background: transparent;
1403
+ border: 1px solid var(--vgai-boundary-strong);
1404
+ }
1405
+
1406
+ .vgai-account-expiry {
1407
+ margin-top: var(--vgai-space-5);
1408
+ }
1409
+
1410
+ /* Billing actions: quiet row inside the Usage card, separated by a hairline —
1411
+ * they act on the balance shown above, so they stay in its card. */
1412
+ .vgai-account-card-footer {
1413
+ display: flex;
1414
+ align-items: center;
1415
+ flex-wrap: wrap;
1416
+ gap: var(--vgai-space-4);
1417
+ margin-top: 18px;
1418
+ padding-top: 14px;
1419
+ border-top: 1px solid rgb(255 255 255 / 7%);
1420
+ }
1421
+
1422
+ /* Destructive plan action: quiet until hover/confirm (spec shared rule 2). */
1423
+ .vgai-account .vgai-btn.vgai-account-quiet-danger {
1424
+ color: var(--vgai-content-dim);
1425
+ }
1426
+
1427
+ .vgai-account .vgai-btn.vgai-account-quiet-danger:hover:not(:disabled) {
1428
+ color: var(--vgai-danger);
1429
+ background: var(--vgai-danger-muted);
1430
+ }
1431
+
1432
+ /* Provider connections. */
1433
+ .vgai-account-providers-header {
1434
+ display: flex;
1435
+ align-items: flex-start;
1436
+ justify-content: space-between;
1437
+ gap: var(--vgai-space-8);
1438
+ }
1439
+
1440
+ /* The connected-count is a status pill, not prose: it must never wrap. Below
1441
+ * the 860px collapse the header squeezed it onto two lines, orphaning
1442
+ * "connected" under a dot aligned to "0". */
1443
+ .vgai-account-providers-header .vgai-status-dot {
1444
+ flex-shrink: 0;
1445
+ white-space: nowrap;
1446
+ }
1447
+
1448
+ .vgai-account-provider-list {
1449
+ display: flex;
1450
+ flex-direction: column;
1451
+ margin-top: var(--vgai-space-2);
1452
+ border-top: 1px solid rgb(255 255 255 / 7%);
1453
+ }
1454
+
1455
+ .vgai-account-provider {
1456
+ display: flex;
1457
+ align-items: center;
1458
+ gap: var(--vgai-space-8);
1459
+ padding: 14px 2px;
1460
+ border-top: 1px solid rgb(255 255 255 / 7%);
1461
+ }
1462
+
1463
+ .vgai-account-provider:first-child {
1464
+ border-top: 0;
1465
+ }
1466
+
1467
+ .vgai-account-provider-monogram {
1468
+ display: grid;
1469
+ place-items: center;
1470
+ flex: none;
1471
+ width: 38px;
1472
+ height: 38px;
1473
+ color: var(--vgai-content-primary);
1474
+ background:
1475
+ linear-gradient(180deg, rgb(255 255 255 / 6%), transparent 60%), var(--vgai-surface-raised);
1476
+ border: 1px solid var(--vgai-boundary-default);
1477
+ border-radius: 10px;
1478
+ font-size: var(--vgai-shell-font-md);
1479
+ font-weight: var(--vgai-font-weight-semibold);
1480
+ }
1481
+
1482
+ .vgai-account-provider[data-configured="true"] .vgai-account-provider-monogram {
1483
+ color: var(--vgai-accent);
1484
+ border-color: rgb(87 158 255 / 35%);
1485
+ background:
1486
+ linear-gradient(180deg, rgb(87 158 255 / 12%), transparent 70%), var(--vgai-surface-raised);
1487
+ }
1488
+
1489
+ .vgai-account-provider-main {
1490
+ flex: 1;
1491
+ min-width: 0;
1492
+ display: flex;
1493
+ flex-direction: column;
1494
+ gap: var(--vgai-space-1);
1495
+ }
1496
+
1497
+ .vgai-account-provider-name {
1498
+ display: flex;
1499
+ align-items: center;
1500
+ gap: var(--vgai-space-4);
1501
+ color: var(--vgai-content-primary);
1502
+ font-size: var(--vgai-shell-font-base);
1503
+ font-weight: var(--vgai-font-weight-semibold);
1504
+ }
1505
+
1506
+ /* Connected state: green dot before the masked key (spec §3). */
1507
+ .vgai-account-provider-dot {
1508
+ flex: none;
1509
+ width: 6px;
1510
+ height: 6px;
1511
+ background: var(--vgai-success);
1512
+ border-radius: var(--vgai-radius-full);
1513
+ }
1514
+
1515
+ .vgai-account-provider-key {
1516
+ color: var(--vgai-content-dim);
1517
+ font-family: var(--vgai-font-mono);
1518
+ font-size: var(--vgai-shell-font-xs);
1519
+ }
1520
+
1521
+ .vgai-account-provider-source {
1522
+ color: var(--vgai-content-dim);
1523
+ font-size: var(--vgai-shell-font-xs);
1524
+ }
1525
+
1526
+ .vgai-account-provider-warning {
1527
+ color: var(--vgai-warn);
1528
+ font-size: var(--vgai-shell-font-xs);
1529
+ }
1530
+
1531
+ .vgai-account-provider-actions {
1532
+ display: flex;
1533
+ align-items: center;
1534
+ gap: var(--vgai-space-4);
1535
+ }
1536
+
1537
+ .vgai-account-provider-form {
1538
+ display: flex;
1539
+ flex-direction: column;
1540
+ gap: var(--vgai-space-6);
1541
+ width: min(360px, 48%);
1542
+ }
1543
+
1544
+ .vgai-account-provider-form .vgai-tool-actions,
1545
+ .vgai-account-provider-form-actions {
1546
+ display: flex;
1547
+ gap: var(--vgai-space-4);
1548
+ }
1549
+
1550
+ /* Status dot chip. */
1551
+ .vgai-account .vgai-status-dot {
1552
+ display: inline-flex;
1553
+ align-items: center;
1554
+ gap: var(--vgai-space-3);
1555
+ color: var(--vgai-content-dim);
1556
+ font-size: var(--vgai-shell-font-xs);
1557
+ font-weight: var(--vgai-font-weight-regular);
1558
+ }
1559
+
1560
+ .vgai-account .vgai-status-dot::before {
1561
+ content: "";
1562
+ width: 6px;
1563
+ height: 6px;
1564
+ background: var(--vgai-content-dim);
1565
+ border-radius: var(--vgai-radius-full);
1566
+ }
1567
+
1568
+ .vgai-account .vgai-status-dot[data-state="on"] {
1569
+ color: var(--vgai-success);
1570
+ }
1571
+
1572
+ .vgai-account .vgai-status-dot[data-state="on"]::before {
1573
+ background: var(--vgai-success);
1574
+ box-shadow: 0 0 6px var(--vgai-success);
1575
+ }
1576
+
1577
+ /* Spend controls — switch rows. */
1578
+ .vgai-account-switch-row {
1579
+ display: flex;
1580
+ align-items: flex-start;
1581
+ gap: 14px;
1582
+ padding: 14px 0;
1583
+ border-top: 1px solid rgb(255 255 255 / 7%);
1584
+ cursor: pointer;
1585
+ }
1586
+
1587
+ .vgai-account-switch-row:first-of-type {
1588
+ border-top: 0;
1589
+ }
1590
+
1591
+ .vgai-account-switch-copy {
1592
+ display: flex;
1593
+ flex-direction: column;
1594
+ gap: var(--vgai-space-1);
1595
+ }
1596
+
1597
+ .vgai-account-switch-copy > strong {
1598
+ color: var(--vgai-content-primary);
1599
+ font-size: var(--vgai-shell-font-base);
1600
+ font-weight: var(--vgai-font-weight-semibold);
1601
+ }
1602
+
1603
+ .vgai-account-switch-copy > small {
1604
+ color: var(--vgai-content-dim);
1605
+ font-size: var(--vgai-shell-font-sm);
1606
+ }
1607
+
1608
+ /* Checkbox → switch, scoped to account switch rows only. Off-state track is
1609
+ * recessed into the panel; the checked capsule carries the accent with a
1610
+ * specular top light, matching the primary-button material. */
1611
+ .vgai-account-switch-row .vgai-checkbox {
1612
+ appearance: none;
1613
+ flex: none;
1614
+ width: 34px;
1615
+ height: 20px;
1616
+ margin: 1px 0 0;
1617
+ background: rgb(0 0 0 / 30%);
1618
+ border: 1px solid rgb(255 255 255 / 14%);
1619
+ border-radius: var(--vgai-radius-full);
1620
+ cursor: pointer;
1621
+ position: relative;
1622
+ box-shadow: inset 0 1px 2px rgb(0 0 0 / 35%);
1623
+ transition:
1624
+ background 160ms var(--vgai-ease-standard),
1625
+ border-color 160ms var(--vgai-ease-standard);
1626
+ }
1627
+
1628
+ .vgai-account-switch-row .vgai-checkbox::after {
1629
+ content: "";
1630
+ position: absolute;
1631
+ top: 2px;
1632
+ left: 2px;
1633
+ width: 14px;
1634
+ height: 14px;
1635
+ background: var(--vgai-content-muted);
1636
+ border-radius: var(--vgai-radius-full);
1637
+ transition:
1638
+ transform 160ms var(--vgai-shell-var(--vgai-ease-standard)),
1639
+ background 160ms var(--vgai-ease-standard);
1640
+ }
1641
+
1642
+ .vgai-account-switch-row .vgai-checkbox:checked {
1643
+ background:
1644
+ linear-gradient(180deg, rgb(255 255 255 / 20%), rgb(255 255 255 / 0%) 55%), var(--vgai-accent);
1645
+ border-color: color-mix(in srgb, var(--vgai-accent) 80%, white 10%);
1646
+ box-shadow: 0 0 10px color-mix(in srgb, var(--vgai-accent) 35%, transparent);
1647
+ }
1648
+
1649
+ .vgai-account-switch-row .vgai-checkbox:checked::after {
1650
+ transform: translateX(14px);
1651
+ background: var(--vgai-content-on-accent);
1652
+ }
1653
+
1654
+ /* Spec rule 6: interactive account controls share the buttons' 2px accent
1655
+ * ring — the global 1px --vgai-focus-ring is too quiet on a 32px capsule.
1656
+ * Scoped to the account switch only; editor checkboxes keep the global ring. */
1657
+ .vgai-account-switch-row .vgai-checkbox:focus-visible {
1658
+ outline: var(--vgai-focus-ring);
1659
+ outline-offset: 2px;
1660
+ }
1661
+
1662
+ .vgai-account-policy-fields {
1663
+ display: grid;
1664
+ grid-template-columns: repeat(3, minmax(0, 1fr));
1665
+ gap: 14px;
1666
+ margin-left: 48px;
1667
+ padding: var(--vgai-space-2) 0 var(--vgai-space-6);
1668
+ }
1669
+
1670
+ /* Both nested field groups belong to the switch directly above them, so they
1671
+ * align to the switch's COPY column rather than the row's left edge. */
1672
+ .vgai-account-limit-field {
1673
+ max-width: 320px;
1674
+ margin-left: 48px;
1675
+ padding: 4px 0 14px;
1676
+ }
1677
+
1678
+ /* Usage list. */
1679
+ .vgai-account-usage {
1680
+ display: flex;
1681
+ flex-direction: column;
1682
+ margin-top: var(--vgai-space-2);
1683
+ }
1684
+
1685
+ .vgai-account-usage-row {
1686
+ display: flex;
1687
+ align-items: center;
1688
+ justify-content: space-between;
1689
+ gap: var(--vgai-space-8);
1690
+ padding: 11px 2px;
1691
+ border-top: 1px solid rgb(255 255 255 / 7%);
1692
+ font-size: var(--vgai-shell-font-base);
1693
+ }
1694
+
1695
+ .vgai-account-usage-row:first-child {
1696
+ border-top: 0;
1697
+ }
1698
+
1699
+ .vgai-account-usage-row > span {
1700
+ color: var(--vgai-content-muted);
1701
+ }
1702
+
1703
+ .vgai-account-usage-row > strong {
1704
+ color: var(--vgai-content-primary);
1705
+ font-variant-numeric: tabular-nums;
1706
+ font-weight: var(--vgai-font-weight-semibold);
1707
+ }
1708
+
1709
+ /* Numeric field + unit suffix (spend controls). */
1710
+ .vgai-account-input-suffix {
1711
+ display: flex;
1712
+ align-items: center;
1713
+ gap: var(--vgai-space-4);
1714
+ }
1715
+
1716
+ .vgai-account-input-suffix .vgai-input {
1717
+ flex: 1;
1718
+ min-width: 0;
1719
+ }
1720
+
1721
+ .vgai-account-suffix {
1722
+ flex: none;
1723
+ color: var(--vgai-content-dim);
1724
+ font-size: var(--vgai-shell-font-sm);
1725
+ }
1726
+
1727
+ /* Status toast strip. P6-U6 (inventory row d-3): in-card zone FROSTS — the
1728
+ * translucent chrome fill gains the theme's content-frost blur ('none' for
1729
+ * every non-frost theme, byte-identical paint). */
1730
+ .vgai-account-status {
1731
+ display: flex;
1732
+ align-items: center;
1733
+ gap: var(--vgai-space-5);
1734
+ padding: var(--vgai-space-6) var(--vgai-space-8);
1735
+ color: var(--vgai-content-primary);
1736
+ background: var(--vgai-surface-chrome);
1737
+ backdrop-filter: var(--vgai-content-frost-filter, none);
1738
+ -webkit-backdrop-filter: var(--vgai-content-frost-filter, none);
1739
+ border: 1px solid var(--vgai-boundary-strong);
1740
+ border-radius: var(--vgai-shell-radius-sm);
1741
+ font-size: var(--vgai-shell-font-sm);
1742
+ animation: vgai-shell-rise var(--vgai-duration-slow) var(--vgai-shell-var(--vgai-ease-standard))
1743
+ both;
1744
+ }
1745
+
1746
+ .vgai-account-status::before {
1747
+ content: "";
1748
+ flex: none;
1749
+ width: 6px;
1750
+ height: 6px;
1751
+ background: var(--vgai-accent);
1752
+ border-radius: var(--vgai-radius-full);
1753
+ }
1754
+
1755
+ /* Device-code panel. Solid hairline inset — dashed borders are reserved for
1756
+ * genuine drop targets (spec shared rule 1). P6-U6 (inventory row d-3):
1757
+ * frosts in-card like the toast strip above. */
1758
+ .vgai-account-device-code {
1759
+ display: flex;
1760
+ flex-direction: column;
1761
+ gap: var(--vgai-space-3);
1762
+ padding: 14px 16px;
1763
+ background: var(--vgai-surface-inset);
1764
+ backdrop-filter: var(--vgai-content-frost-filter, none);
1765
+ -webkit-backdrop-filter: var(--vgai-content-frost-filter, none);
1766
+ border: 1px solid var(--vgai-boundary-strong);
1767
+ border-radius: var(--vgai-shell-radius-sm);
1768
+ text-align: center;
1769
+ }
1770
+
1771
+ .vgai-account-device-code > strong {
1772
+ color: var(--vgai-content-primary);
1773
+ font-family: var(--vgai-font-mono);
1774
+ font-size: 22px;
1775
+ letter-spacing: 0.28em;
1776
+ }
1777
+
1778
+ .vgai-account-device-code > span {
1779
+ color: var(--vgai-content-dim);
1780
+ font-size: var(--vgai-shell-font-sm);
1781
+ }
1782
+
1783
+ /* ------------------------------------------------------------------------- */
1784
+ /* Responsive + reduced motion */
1785
+ /* ------------------------------------------------------------------------- */
1786
+
1787
+ @media (max-width: 860px) {
1788
+ .vgai-shell-container {
1789
+ padding: 0 20px 64px;
1790
+ }
1791
+
1792
+ .vgai-account-identity {
1793
+ flex-wrap: wrap;
1794
+ }
1795
+
1796
+ .vgai-account-policy-fields {
1797
+ grid-template-columns: minmax(0, 1fr);
1798
+ margin-left: 0;
1799
+ }
1800
+
1801
+ .vgai-account-limit-field {
1802
+ margin-left: 0;
1803
+ }
1804
+
1805
+ .vgai-shell-hero {
1806
+ align-items: flex-start;
1807
+ flex-direction: column;
1808
+ }
1809
+ }
1810
+
1811
+ @media (prefers-reduced-motion: reduce) {
1812
+ .vgai-shell-rise,
1813
+ .vgai-splash-stack,
1814
+ .vgai-account-status {
1815
+ animation: none;
1816
+ }
1817
+
1818
+ .vgai-splash-progress::after {
1819
+ animation: none;
1820
+ width: 100%;
1821
+ background: var(--vgai-accent-muted);
1822
+ }
1823
+
1824
+ .vgai-account .vgai-meter-fill,
1825
+ .vgai-account-switch-row .vgai-checkbox,
1826
+ .vgai-account-switch-row .vgai-checkbox::after {
1827
+ transition: none;
1828
+ }
1829
+ }