@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.
- package/BUNDLED_NOTICES +1527 -0
- package/LICENSE +686 -0
- package/LICENSE-APACHE +202 -0
- package/NOTICE +18 -0
- package/README.md +24 -0
- package/dist/build/chunk-JS4D4XZ3.js +175 -0
- package/dist/build/chunk-JS4D4XZ3.js.map +7 -0
- package/dist/build/vite-plugin-product-contributions.js +100 -0
- package/dist/build/vite-plugin-product-contributions.js.map +7 -0
- package/dist/build/vite-plugin-shared-react.js +25 -0
- package/dist/build/vite-plugin-shared-react.js.map +7 -0
- package/dist/build/vite-plugin-shared-three.js +86 -0
- package/dist/build/vite-plugin-shared-three.js.map +7 -0
- package/dist/server/chunk-KMJC7AGO.js +98 -0
- package/dist/server/chunk-KMJC7AGO.js.map +7 -0
- package/dist/server/chunk-PSILUMGS.js +46 -0
- package/dist/server/chunk-PSILUMGS.js.map +7 -0
- package/dist/server/frame-proxy.js +255 -0
- package/dist/server/frame-proxy.js.map +7 -0
- package/dist/server/open-browser.js +53 -0
- package/dist/server/open-browser.js.map +7 -0
- package/dist/server/process-shutdown.js +127 -0
- package/dist/server/process-shutdown.js.map +7 -0
- package/dist/server/session-registry.js +141 -0
- package/dist/server/session-registry.js.map +7 -0
- package/dist/server/spawn-opener.js +11 -0
- package/dist/server/spawn-opener.js.map +7 -0
- package/dist/server/worktree-identity.js +11 -0
- package/dist/server/worktree-identity.js.map +7 -0
- package/dist-server/packaged.mjs +88816 -0
- package/package.json +118 -0
- package/scripts/build-plugins.mjs +14 -0
- package/scripts/build-server.mjs +26 -0
- package/scripts/build-session.mjs +9 -0
- package/server/account-credentials.ts +60 -0
- package/server/account-service.ts +1434 -0
- package/server/adapter-region-includes.ts +47 -0
- package/server/asset-catalog-v2.ts +175 -0
- package/server/asset-history-snapshots.ts +196 -0
- package/server/asset-ledger-store.ts +195 -0
- package/server/asset-library-routes.ts +1595 -0
- package/server/blender-wasm-artifact.ts +430 -0
- package/server/boot-timings.ts +106 -0
- package/server/canonical-path.ts +50 -0
- package/server/checkout-workspace-preflight.ts +349 -0
- package/server/cloud-asset-catalog.ts +158 -0
- package/server/coding-inference-launch.ts +237 -0
- package/server/collaboration-account-client.ts +202 -0
- package/server/collaboration-attribution.ts +122 -0
- package/server/collaboration-session.ts +934 -0
- package/server/comfyui-bridge.ts +248 -0
- package/server/console-ledger.ts +499 -0
- package/server/creation-site-transform.ts +304 -0
- package/server/creation-site-write.ts +648 -0
- package/server/data-file-serialize.ts +158 -0
- package/server/editor-brand-html.ts +72 -0
- package/server/editor-control-socket.ts +366 -0
- package/server/editor-server-options.ts +190 -0
- package/server/editor-server.ts +1483 -0
- package/server/editor-sse.ts +352 -0
- package/server/engine-provenance.ts +169 -0
- package/server/engine-source-restart.ts +117 -0
- package/server/frame-bridge.ts +115 -0
- package/server/frame-proxy.ts +490 -0
- package/server/frame-workbench.ts +259 -0
- package/server/frontend-handoff.ts +229 -0
- package/server/game-globals-shadow.ts +113 -0
- package/server/gameplay-session-retention.ts +149 -0
- package/server/gameplay-sessions.ts +123 -0
- package/server/generation-jobs.ts +201 -0
- package/server/generation-reconciler.ts +137 -0
- package/server/generative-execution-context.ts +59 -0
- package/server/git-workflow.ts +612 -0
- package/server/harness-chat-caller.ts +36 -0
- package/server/harness-chat-service.ts +1681 -0
- package/server/idle-shutdown.ts +170 -0
- package/server/js-profiling-policy.ts +52 -0
- package/server/launcher-settings.ts +84 -0
- package/server/local-asset-catalog.ts +410 -0
- package/server/managed-account-defaults.ts +22 -0
- package/server/mock-control-plane.ts +540 -0
- package/server/model-import-conversion.ts +345 -0
- package/server/native-credential-store.ts +162 -0
- package/server/open-browser.ts +118 -0
- package/server/packaged.ts +1192 -0
- package/server/play-stall.ts +126 -0
- package/server/process-shutdown.ts +218 -0
- package/server/product-presets.ts +55 -0
- package/server/project-build-artifact.ts +95 -0
- package/server/project-components.ts +100 -0
- package/server/project-dependency-invalidation.ts +114 -0
- package/server/project-file-scan.ts +235 -0
- package/server/project-hmr-files.ts +215 -0
- package/server/project-install-roots.ts +210 -0
- package/server/project-kinds.ts +71 -0
- package/server/project-mcp-servers.ts +82 -0
- package/server/project-module-freshness.ts +109 -0
- package/server/project-module-instance.ts +375 -0
- package/server/project-optimize-deps-entries.ts +827 -0
- package/server/project-output-writer.ts +679 -0
- package/server/project-package-origin.ts +63 -0
- package/server/project-root-surface.ts +831 -0
- package/server/project-scratch-path.ts +47 -0
- package/server/project-script-hmr.ts +619 -0
- package/server/project-serving-plugins.ts +236 -0
- package/server/project-tools.ts +653 -0
- package/server/project-validation.ts +250 -0
- package/server/project-verbs.ts +127 -0
- package/server/project-view.ts +52 -0
- package/server/project-watch.ts +1134 -0
- package/server/project-work-coordinator.ts +288 -0
- package/server/provider-credentials.ts +331 -0
- package/server/recent-projects-store.ts +98 -0
- package/server/redact-secrets.ts +71 -0
- package/server/repository-presence.ts +267 -0
- package/server/routes/account.ts +357 -0
- package/server/routes/agents.ts +60 -0
- package/server/routes/assets.ts +154 -0
- package/server/routes/build.ts +13 -0
- package/server/routes/collaboration.ts +595 -0
- package/server/routes/configurations.ts +419 -0
- package/server/routes/context.ts +264 -0
- package/server/routes/control-plane.ts +1811 -0
- package/server/routes/logs.ts +272 -0
- package/server/routes/project-identity.ts +302 -0
- package/server/routes/project-open.ts +429 -0
- package/server/routes/project-source.ts +686 -0
- package/server/routes/project-state.ts +383 -0
- package/server/routes/relay.ts +1029 -0
- package/server/routes/route-helpers.ts +29 -0
- package/server/routes/served-modules.ts +138 -0
- package/server/routes/session-tabs.ts +196 -0
- package/server/routes/settings.ts +121 -0
- package/server/routes/share-control.ts +486 -0
- package/server/routes/themes.ts +116 -0
- package/server/routes/tools.ts +230 -0
- package/server/routes/worktrees.ts +595 -0
- package/server/scoped-game-css.ts +461 -0
- package/server/server-utils.ts +1194 -0
- package/server/session-product.ts +112 -0
- package/server/session-registry.ts +230 -0
- package/server/share-claims.ts +138 -0
- package/server/share-host.ts +526 -0
- package/server/share-session-gateway.ts +1362 -0
- package/server/share-tunnel.ts +123 -0
- package/server/spawn-opener.ts +74 -0
- package/server/support/play/log-format.ts +76 -0
- package/server/support/play/session-record.ts +199 -0
- package/server/support/project/build-discipline.ts +718 -0
- package/server/support/project/inspection-node.ts +119 -0
- package/server/support/project/log-naming.ts +54 -0
- package/server/support/project/provenance.ts +290 -0
- package/server/support/project/run-name.ts +18 -0
- package/server/support/project/session-journal.ts +830 -0
- package/server/support/project/shared.ts +327 -0
- package/server/tab-bootstrap.ts +62 -0
- package/server/tab-heartbeat.ts +477 -0
- package/server/tab-lifecycle.ts +550 -0
- package/server/tab-presence.ts +1508 -0
- package/server/team-agent-mirror.ts +95 -0
- package/server/twin-auth.ts +138 -0
- package/server/vendored-lock-recorder.ts +968 -0
- package/server/worktree-identity.ts +121 -0
- package/server/worktree-management.ts +398 -0
- package/server/worktree-retention.d.mts +13 -0
- package/server/worktree-retention.mjs +205 -0
- package/src/EditorContext.tsx +169 -0
- package/src/account.ts +333 -0
- package/src/action-registry.ts +532 -0
- package/src/active-product.ts +74 -0
- package/src/active-project.ts +155 -0
- package/src/adapter-editor-config.ts +25 -0
- package/src/adapter-observation.ts +49 -0
- package/src/animation/stage-transport.ts +379 -0
- package/src/animation/three-clips-subject.ts +172 -0
- package/src/api/asset-library-wire.ts +45 -0
- package/src/api/assets.ts +365 -0
- package/src/api/base.ts +10 -0
- package/src/api/build.ts +99 -0
- package/src/api/git-wire.ts +56 -0
- package/src/api/logs.ts +92 -0
- package/src/api/project-identity.ts +74 -0
- package/src/api/project-open.ts +355 -0
- package/src/api/project-source.ts +162 -0
- package/src/api/project-state.ts +107 -0
- package/src/api/relay.ts +268 -0
- package/src/api/settings.ts +36 -0
- package/src/api/themes.ts +45 -0
- package/src/api/worktrees.ts +257 -0
- package/src/asset-compare-core.ts +171 -0
- package/src/asset-compare.ts +294 -0
- package/src/asset-editor-context.tsx +100 -0
- package/src/asset-events.ts +97 -0
- package/src/asset-inspector-actions.ts +87 -0
- package/src/asset-preview-framing.ts +357 -0
- package/src/asset-preview.ts +2802 -0
- package/src/asset-selection-viewer-registry.ts +113 -0
- package/src/asset-selection.ts +133 -0
- package/src/asset-workflow/asset-capabilities.ts +344 -0
- package/src/asset-workflow/asset-import-jobs.ts +106 -0
- package/src/asset-workflow/asset-ledger-backend.ts +126 -0
- package/src/asset-workflow/asset-ledger.ts +156 -0
- package/src/asset-workflow/asset-materialization-report.ts +140 -0
- package/src/asset-workflow/asset-pack-manifest.ts +320 -0
- package/src/asset-workflow/asset-types.ts +142 -0
- package/src/asset-workflow/asset-workflow-quality.ts +61 -0
- package/src/asset-workflow/audio-preview-player.ts +193 -0
- package/src/asset-workflow/audio-waveform.ts +22 -0
- package/src/asset-workflow/cloud-asset-client.ts +263 -0
- package/src/asset-workflow/folder-preview.ts +345 -0
- package/src/asset-workflow/hosted-asset-materialization.ts +236 -0
- package/src/asset-workflow/image-view-scale.ts +32 -0
- package/src/asset-workflow/import-contract.ts +124 -0
- package/src/asset-workflow/ledger-write-lock.ts +244 -0
- package/src/asset-workflow/model-inspection.ts +818 -0
- package/src/asset-workflow/pixi-spritesheet.ts +197 -0
- package/src/asset-workflow/preview-resource-lifetime.ts +44 -0
- package/src/asset-workflow/project-asset-commands.ts +23 -0
- package/src/asset-workflow/project-asset-health.ts +139 -0
- package/src/asset-workflow/project-asset-operations.ts +154 -0
- package/src/asset-workflow/project-asset-roots.ts +68 -0
- package/src/asset-workflow/project-content.ts +288 -0
- package/src/asset-workflow/project-source-index.ts +550 -0
- package/src/asset-workflow/thumbnail-system.ts +256 -0
- package/src/authoring/active-adapter.ts +199 -0
- package/src/authoring/active-systems.ts +422 -0
- package/src/authoring/adapter-key.ts +18 -0
- package/src/authoring/authoring-asset-url.ts +27 -0
- package/src/authoring/bootstrap-state.ts +49 -0
- package/src/authoring/boundary-authoring-adapter.ts +184 -0
- package/src/authoring/breakpoint-state.ts +43 -0
- package/src/authoring/canvas-scene-guides.ts +76 -0
- package/src/authoring/component-instance-root.ts +171 -0
- package/src/authoring/composite-authoring-adapter.ts +2110 -0
- package/src/authoring/consumer-actions.ts +520 -0
- package/src/authoring/css-numeric-style.ts +97 -0
- package/src/authoring/design-time-layers.ts +849 -0
- package/src/authoring/design-time-mount-registry.ts +235 -0
- package/src/authoring/design-time-settle.ts +343 -0
- package/src/authoring/edit-mode-authoring.ts +619 -0
- package/src/authoring/eyedropper-session.ts +60 -0
- package/src/authoring/instance-source-menu-register.ts +13 -0
- package/src/authoring/instance-source-menu.ts +135 -0
- package/src/authoring/layered-pick.ts +183 -0
- package/src/authoring/live-gesture-lock.ts +50 -0
- package/src/authoring/live-object-transform.ts +62 -0
- package/src/authoring/mount-failure-report.ts +154 -0
- package/src/authoring/mounted-root-subjects.ts +144 -0
- package/src/authoring/no-authoring-adapter.ts +55 -0
- package/src/authoring/null-inspection-subjects.tsx +75 -0
- package/src/authoring/object3d-document-persistence.ts +106 -0
- package/src/authoring/object3d-document-session-registry.ts +120 -0
- package/src/authoring/object3d-document-session.ts +1326 -0
- package/src/authoring/object3d-gesture-controller.ts +113 -0
- package/src/authoring/panel-authoring.ts +121 -0
- package/src/authoring/prefab-instance-inspector-section.tsx +237 -0
- package/src/authoring/prefab-instance-section-model.ts +55 -0
- package/src/authoring/project-authoring-session.ts +105 -0
- package/src/authoring/provenance.ts +99 -0
- package/src/authoring/quarks-particle-systems.ts +19 -0
- package/src/authoring/react-canvas-navigation.ts +255 -0
- package/src/authoring/react-design-canvas-style.ts +20 -0
- package/src/authoring/react-story-board.ts +937 -0
- package/src/authoring/selection-scope.ts +195 -0
- package/src/authoring/shell-document-ops.ts +169 -0
- package/src/authoring/shell-object3d-document-write-policy.ts +108 -0
- package/src/authoring/shell-viewport-policy.ts +48 -0
- package/src/authoring/source-object3d-authoring-adapter.ts +526 -0
- package/src/authoring/stories-scope.ts +35 -0
- package/src/authoring/story-board-chrome-fit.ts +107 -0
- package/src/authoring/story-board-presentation.ts +111 -0
- package/src/authoring/three-projection-core.ts +226 -0
- package/src/authoring/viewport-pick-context.ts +40 -0
- package/src/authoring/viewport-raycast.ts +240 -0
- package/src/authoring/viewport-tool-context.ts +73 -0
- package/src/authoring/world-canvas-viewport-state.ts +35 -0
- package/src/authoring/world-hidden-viewport.ts +152 -0
- package/src/authoring/world-pan-state.ts +198 -0
- package/src/authoring/world-session-state.ts +101 -0
- package/src/authoring/write-pipe.ts +173 -0
- package/src/availability-tick.ts +66 -0
- package/src/bitmap-label.ts +120 -0
- package/src/blender-tab-metrics.ts +161 -0
- package/src/board-open-actions.ts +20 -0
- package/src/boot-routing.ts +391 -0
- package/src/build-identity.ts +15 -0
- package/src/bytes-codec.ts +62 -0
- package/src/camera-authoring.ts +175 -0
- package/src/cancellation-reason.ts +58 -0
- package/src/canvas-preview-frames.ts +482 -0
- package/src/capture-camera-pose.ts +77 -0
- package/src/chrome-registry.ts +159 -0
- package/src/chrome-slot-registry.ts +91 -0
- package/src/collaboration-client.ts +264 -0
- package/src/collaboration-presence.ts +41 -0
- package/src/command-dispatch.ts +19 -0
- package/src/command-listener.ts +2743 -0
- package/src/command-registry.ts +70 -0
- package/src/component-board-registry.ts +205 -0
- package/src/component-states-registry.ts +200 -0
- package/src/components/AgentPresentationNotice.tsx +75 -0
- package/src/components/AlignToolbar.tsx +204 -0
- package/src/components/AppRoot.tsx +394 -0
- package/src/components/ApplicationMenus.tsx +415 -0
- package/src/components/AssetBrowser.tsx +2843 -0
- package/src/components/AssetEditorShell.tsx +216 -0
- package/src/components/AssetInspectorToolSection.tsx +124 -0
- package/src/components/BoardRulers.tsx +354 -0
- package/src/components/CameraInfo.tsx +81 -0
- package/src/components/CanvasSceneViewport.tsx +556 -0
- package/src/components/CapabilityCoverageSection.tsx +185 -0
- package/src/components/CenterDocuments.tsx +22 -0
- package/src/components/ChromeSlot.tsx +20 -0
- package/src/components/CodeView.tsx +470 -0
- package/src/components/CollaborationHeaderControl.css +74 -0
- package/src/components/CompactInspectorCard.tsx +190 -0
- package/src/components/CompactInspectorShell.tsx +39 -0
- package/src/components/ConsolePanel.css +55 -0
- package/src/components/ConsolePanel.tsx +270 -0
- package/src/components/DefaultEditorLayout.tsx +106 -0
- package/src/components/DocumentHeaderStrip.tsx +96 -0
- package/src/components/DocumentShelfRail.tsx +45 -0
- package/src/components/DocumentThumbnail.tsx +345 -0
- package/src/components/EditorLeaseGuard.tsx +372 -0
- package/src/components/ErrorBanner.tsx +123 -0
- package/src/components/FolderPreviewTile.tsx +159 -0
- package/src/components/GameHierarchy.tsx +3842 -0
- package/src/components/GameplaySessionTimeline.tsx +295 -0
- package/src/components/InspectionProjection.tsx +968 -0
- package/src/components/Inspector.tsx +233 -0
- package/src/components/InspectorCanvasPreview.tsx +35 -0
- package/src/components/InspectorFieldsSection.tsx +290 -0
- package/src/components/InspectorObjectPreview.tsx +57 -0
- package/src/components/InspectorStoriesSection.tsx +92 -0
- package/src/components/InspectorToolSection.tsx +96 -0
- package/src/components/InspectorTransformSection.tsx +245 -0
- package/src/components/LightExplorerPanel.tsx +433 -0
- package/src/components/MediaProperties.tsx +145 -0
- package/src/components/NonThreeAuthoringBootstrap.tsx +19 -0
- package/src/components/Object3DDocumentToolbar.css +100 -0
- package/src/components/Object3DDocumentToolbar.tsx +454 -0
- package/src/components/Object3DDocumentViewport.tsx +58 -0
- package/src/components/ProjectHeader.css +617 -0
- package/src/components/ProjectHeader.tsx +328 -0
- package/src/components/ProjectLayout.tsx +249 -0
- package/src/components/ReactCanvasControls.tsx +284 -0
- package/src/components/RootSelectionOverlay.tsx +3162 -0
- package/src/components/RootTextEditor.tsx +79 -0
- package/src/components/SaveStatus.tsx +70 -0
- package/src/components/StageHost.tsx +1954 -0
- package/src/components/StageOverlays.tsx +21 -0
- package/src/components/StartupErrorScreen.tsx +76 -0
- package/src/components/StartupLoadingScreen.tsx +65 -0
- package/src/components/StatsOverlay.tsx +78 -0
- package/src/components/SurfaceStateOverlay.tsx +24 -0
- package/src/components/ToolContributionSurfaces.tsx +65 -0
- package/src/components/ToolHost.tsx +370 -0
- package/src/components/ToolObject3DPreview.tsx +39 -0
- package/src/components/Toolbar.tsx +595 -0
- package/src/components/TransientHint.tsx +44 -0
- package/src/components/TransportStrip.tsx +174 -0
- package/src/components/VersionControlSection.tsx +470 -0
- package/src/components/VgaiLogo.css +83 -0
- package/src/components/VgaiLogo.tsx +35 -0
- package/src/components/ViewportControlsHint.tsx +60 -0
- package/src/components/ViewportFurniture.tsx +401 -0
- package/src/components/ViewportOverlay.tsx +145 -0
- package/src/components/ViewportOverlaysMenu.tsx +153 -0
- package/src/components/ViewportShadingMenu.tsx +300 -0
- package/src/components/ViewportViewMenu.tsx +101 -0
- package/src/components/WorkspaceDocumentSurface.tsx +204 -0
- package/src/components/WorkspaceUtilitySurface.tsx +22 -0
- package/src/components/WorktreeSwitcher.css +239 -0
- package/src/components/WorktreeSwitcher.tsx +890 -0
- package/src/components/account-documents.tsx +1162 -0
- package/src/components/asset-documents.tsx +812 -0
- package/src/components/asset-editor-persistence.ts +216 -0
- package/src/components/asset-selection-section.tsx +535 -0
- package/src/components/asset-thumbnails.tsx +312 -0
- package/src/components/asset-viewers/AudioViewer.tsx +201 -0
- package/src/components/asset-viewers/EntityModelDocument.tsx +122 -0
- package/src/components/asset-viewers/EnvironmentAssetDocument.tsx +440 -0
- package/src/components/asset-viewers/GenericJsonViewer.tsx +102 -0
- package/src/components/asset-viewers/ImageViewer.tsx +300 -0
- package/src/components/asset-viewers/JsonAssetDocument.tsx +93 -0
- package/src/components/asset-viewers/LiveModuleDocument.tsx +417 -0
- package/src/components/asset-viewers/LutAssetDocument.tsx +444 -0
- package/src/components/asset-viewers/ModelAssetDocument.tsx +105 -0
- package/src/components/asset-viewers/Object3DPreview.tsx +359 -0
- package/src/components/asset-viewers/OnlineAssetDetail.tsx +421 -0
- package/src/components/asset-viewers/PasteboardModuleDocument.tsx +67 -0
- package/src/components/asset-viewers/QuarksAssetDocument.tsx +526 -0
- package/src/components/asset-viewers/ShaderAssetDocument.tsx +743 -0
- package/src/components/asset-viewers/SourceAssetViewer.tsx +281 -0
- package/src/components/asset-viewers/SpritesheetSpriteView.tsx +102 -0
- package/src/components/asset-viewers/VideoViewer.tsx +101 -0
- package/src/components/asset-viewers/shader-source.ts +144 -0
- package/src/components/asset-workflow.css +731 -0
- package/src/components/board-guides.ts +150 -0
- package/src/components/compact-inspector.css +539 -0
- package/src/components/core-utilities.tsx +90 -0
- package/src/components/editor-notifications.css +40 -0
- package/src/components/engine-workspace.css +274 -0
- package/src/components/inspector-preview-section.tsx +238 -0
- package/src/components/inspector-property-grouping.ts +64 -0
- package/src/components/inspector-revert-label.ts +20 -0
- package/src/components/inspector-selection.ts +42 -0
- package/src/components/inspector-stories-gating.ts +171 -0
- package/src/components/inspector-transform-subject.ts +11 -0
- package/src/components/inspector-transform.ts +75 -0
- package/src/components/kind-documents.tsx +500 -0
- package/src/components/palette-action-publisher.tsx +140 -0
- package/src/components/primitives/DraftColorInput.tsx +74 -0
- package/src/components/product-shell.css +1829 -0
- package/src/components/project-tool-documents.tsx +410 -0
- package/src/components/scene-documents.tsx +223 -0
- package/src/components/stage-keyboard.tsx +37 -0
- package/src/components/stage-overlay-set.tsx +107 -0
- package/src/components/stage-presence-markers.ts +478 -0
- package/src/components/standard-viewport-dressing.ts +417 -0
- package/src/components/status-contributions.tsx +403 -0
- package/src/components/tool-documents.tsx +309 -0
- package/src/components/tool-schema-form.tsx +262 -0
- package/src/components/use-after-paint.ts +41 -0
- package/src/components/use-project-image-assets.ts +86 -0
- package/src/components/viewport-header-controls.css +90 -0
- package/src/components/viewport-surface-status.tsx +55 -0
- package/src/components/workspace-history.ts +32 -0
- package/src/components/workspace-static-panel-registry.tsx +152 -0
- package/src/components/workspace-surfaces.css +621 -0
- package/src/components/world-documents.tsx +586 -0
- package/src/components/world-overlay-gestures.ts +1694 -0
- package/src/composite-screenshot.ts +1641 -0
- package/src/console-sync.ts +131 -0
- package/src/constraint-helper.ts +338 -0
- package/src/content-entry-source-registry.ts +184 -0
- package/src/coverage/authoring-seam-evidence.ts +300 -0
- package/src/coverage/canvas-reveal.ts +192 -0
- package/src/coverage/design-time-surfaces.ts +101 -0
- package/src/coverage/live-seam-evidence.ts +11 -0
- package/src/coverage/ontology-invariants.ts +466 -0
- package/src/coverage/session-vitals.ts +501 -0
- package/src/coverage/system-seam-evidence.ts +72 -0
- package/src/crash-null-boundary.ts +36 -0
- package/src/creation-site-edit.ts +1479 -0
- package/src/creation-site-registry.ts +160 -0
- package/src/delegate-harness-registry.ts +143 -0
- package/src/document-context-registry.ts +177 -0
- package/src/document-open-registry.ts +200 -0
- package/src/document-preview-source.ts +20 -0
- package/src/document-renderer-session.ts +138 -0
- package/src/editor-api.ts +46 -0
- package/src/editor-chrome-capture.ts +139 -0
- package/src/editor-commands.ts +164 -0
- package/src/editor-console.ts +563 -0
- package/src/editor-current-view.ts +82 -0
- package/src/editor-document-probe.ts +881 -0
- package/src/editor-git-client.ts +115 -0
- package/src/editor-host-door.ts +462 -0
- package/src/editor-hotkeys.ts +842 -0
- package/src/editor-lease-view.ts +39 -0
- package/src/editor-lease.ts +415 -0
- package/src/editor-mode.ts +19 -0
- package/src/editor-notifications.ts +140 -0
- package/src/editor-presence.ts +563 -0
- package/src/editor-presentation-activity.ts +50 -0
- package/src/editor-presentation-notice.ts +42 -0
- package/src/editor-runtime.tsx +145 -0
- package/src/editor-server-response.ts +86 -0
- package/src/editor-session-attribution.ts +75 -0
- package/src/editor-session-mode.ts +54 -0
- package/src/editor-shell-store.ts +1304 -0
- package/src/editor-state-facets.ts +74 -0
- package/src/editor-styles.css +33 -0
- package/src/editor-view-presentation.ts +810 -0
- package/src/editor-viewport.ts +5302 -0
- package/src/entity-lod.ts +31 -0
- package/src/entity-object.ts +91 -0
- package/src/files/file-provider.ts +62 -0
- package/src/files/project-files.ts +264 -0
- package/src/finders/index.ts +136 -0
- package/src/finders/scenes-from-entrypoint-selection.ts +387 -0
- package/src/frame/bridge.tsx +1408 -0
- package/src/frame/product.ts +77 -0
- package/src/gameplay-dom-recording.ts +319 -0
- package/src/gameplay-export-state.ts +14 -0
- package/src/gameplay-replay.ts +417 -0
- package/src/gameplay-session-time.ts +9 -0
- package/src/gameplay-sessions.ts +204 -0
- package/src/harness-chat-types.ts +253 -0
- package/src/hierarchy-component-marks.ts +298 -0
- package/src/hierarchy-drop.ts +91 -0
- package/src/hierarchy-expansion-state.ts +80 -0
- package/src/hierarchy-header-slot.ts +52 -0
- package/src/hierarchy-internals.ts +197 -0
- package/src/hierarchy-kind-icon.ts +217 -0
- package/src/hierarchy-mark-reader.ts +73 -0
- package/src/hierarchy-menu-registry.ts +67 -0
- package/src/hierarchy-node-rows.ts +307 -0
- package/src/hierarchy-panel-view.ts +280 -0
- package/src/hierarchy-projection.ts +76 -0
- package/src/hierarchy-row-cache.ts +243 -0
- package/src/hierarchy-row-model.ts +308 -0
- package/src/hierarchy-rows.ts +11 -0
- package/src/hierarchy-walk.ts +86 -0
- package/src/history/editor-session.ts +25 -0
- package/src/history/history-commands.ts +147 -0
- package/src/history/history-delegate.ts +163 -0
- package/src/history/history-limit-notices.ts +43 -0
- package/src/history/history-service.ts +1173 -0
- package/src/history/persistence-coordinator.ts +35 -0
- package/src/history/project-file-history.ts +386 -0
- package/src/history/project-root-history-backends.ts +139 -0
- package/src/history/resource-registry.ts +209 -0
- package/src/history/snapshot-store.ts +103 -0
- package/src/history/source-history-backend.ts +546 -0
- package/src/history/types.ts +124 -0
- package/src/hmr-registration-group.ts +67 -0
- package/src/hmr-stable-react-context.ts +23 -0
- package/src/hotkeys.ts +188 -0
- package/src/inference-diagnostics.ts +69 -0
- package/src/initial-project.ts +80 -0
- package/src/inspection/active-subject.ts +578 -0
- package/src/inspection/active-surface.ts +142 -0
- package/src/inspection/compose.ts +1064 -0
- package/src/inspection/display.ts +170 -0
- package/src/inspection/document-subject.ts +109 -0
- package/src/inspection/game-subject.ts +85 -0
- package/src/inspection/model.ts +542 -0
- package/src/inspection/null-subject.ts +115 -0
- package/src/inspection/serialize.ts +357 -0
- package/src/inspection/use-active-inspection.ts +180 -0
- package/src/inspector-presentation.ts +201 -0
- package/src/inspector-section-registry.ts +221 -0
- package/src/instance-source-actions.ts +163 -0
- package/src/instanced-presentation.ts +164 -0
- package/src/js-heap.ts +71 -0
- package/src/key-actions.ts +91 -0
- package/src/keymap-presets.ts +401 -0
- package/src/layout-policy.ts +31 -0
- package/src/learn-links.ts +73 -0
- package/src/light-explorer-model.ts +134 -0
- package/src/live-canvas-frame.ts +55 -0
- package/src/live-document.ts +279 -0
- package/src/live-module-source.ts +230 -0
- package/src/live-session-registry.ts +220 -0
- package/src/live-transition.ts +633 -0
- package/src/manifest-project.ts +107 -0
- package/src/model-thumbnail.ts +523 -0
- package/src/native-selection-style.ts +202 -0
- package/src/object3d-document-write-policy.ts +137 -0
- package/src/packaged-runtime.ts +108 -0
- package/src/palettes/maya.palette.json +57 -0
- package/src/palettes/substance.palette.json +57 -0
- package/src/pasteboard-module.ts +81 -0
- package/src/performance-profiler.ts +367 -0
- package/src/performance-sources.ts +69 -0
- package/src/play-boot-phase.ts +145 -0
- package/src/presentation-surface.ts +248 -0
- package/src/project-adapter.ts +1143 -0
- package/src/project-asset-refresh.ts +26 -0
- package/src/project-declaration-refresh.ts +31 -0
- package/src/project-local-state.ts +118 -0
- package/src/project-manager.ts +243 -0
- package/src/project-module-changes.ts +163 -0
- package/src/project-module-split.ts +266 -0
- package/src/project-provenance.ts +115 -0
- package/src/project-ready.ts +42 -0
- package/src/project-session-reset.ts +67 -0
- package/src/project-shape.ts +68 -0
- package/src/project-tool-discovery.ts +66 -0
- package/src/project-tools.ts +107 -0
- package/src/project-work-types.ts +149 -0
- package/src/projection/three.ts +898 -0
- package/src/projection/types.ts +44 -0
- package/src/readiness.ts +113 -0
- package/src/reflection-probe-helper.ts +142 -0
- package/src/reported-play-state.ts +90 -0
- package/src/resolve-relative-specifier.ts +33 -0
- package/src/scene-document-plan.ts +315 -0
- package/src/scene-framing.ts +315 -0
- package/src/scene-live-open.ts +210 -0
- package/src/scene-view-fog.ts +89 -0
- package/src/scoped-game-css.ts +152 -0
- package/src/session-orphan-record.ts +193 -0
- package/src/session-tombstone.ts +126 -0
- package/src/settings/settings-provider.ts +82 -0
- package/src/settings-store.ts +345 -0
- package/src/shared-view-restore.ts +42 -0
- package/src/shell-store-door.ts +45 -0
- package/src/source-conflict.ts +122 -0
- package/src/spatial-handle-visuals.ts +332 -0
- package/src/stage-context.ts +341 -0
- package/src/stage-store-registry.ts +63 -0
- package/src/stale-chunk-recovery.ts +34 -0
- package/src/state-report-deferral.ts +73 -0
- package/src/storage/host-files-storage.ts +97 -0
- package/src/storage/http-storage.ts +174 -0
- package/src/storage/index.ts +75 -0
- package/src/storage/mem-storage.ts +149 -0
- package/src/storage/path-lock.ts +44 -0
- package/src/storage/paths.ts +26 -0
- package/src/storage/types.ts +116 -0
- package/src/stories/StoryComponentThumbnail.tsx +184 -0
- package/src/stories/StoryPreviewMount.tsx +306 -0
- package/src/stories/component-content-source.tsx +106 -0
- package/src/stories/component-states-source.ts +78 -0
- package/src/stories/compose-project-stories.ts +255 -0
- package/src/stories/pixi-story-model.ts +30 -0
- package/src/stories/prefabs-finder.ts +54 -0
- package/src/stories/prefabs-from-stories.ts +182 -0
- package/src/stories/project-story-discovery.ts +78 -0
- package/src/stories/project-story-regions.ts +24 -0
- package/src/stories/story-actions.ts +54 -0
- package/src/stories/story-capture-command.ts +124 -0
- package/src/stories/story-capture.ts +584 -0
- package/src/stories/story-declared-medium.ts +126 -0
- package/src/stories/story-discovery.ts +176 -0
- package/src/stories/story-document-openers.ts +36 -0
- package/src/stories/story-dom-runtime.ts +78 -0
- package/src/stories/story-grouping.ts +111 -0
- package/src/stories/story-lane.ts +88 -0
- package/src/stories/story-mount-turn.ts +27 -0
- package/src/stories/story-opener.ts +260 -0
- package/src/stories/story-pixi-preview.ts +408 -0
- package/src/stories/story-presentation.ts +215 -0
- package/src/stories/story-registry.ts +517 -0
- package/src/stories/story-three-preview.ts +807 -0
- package/src/stories/three-story-model.ts +96 -0
- package/src/story-three-preview-runtime.ts +56 -0
- package/src/surface-keyboard.ts +112 -0
- package/src/surface-state.ts +124 -0
- package/src/tab-bootstrap.js +628 -0
- package/src/tab-census.ts +198 -0
- package/src/tab-lifecycle-client.ts +196 -0
- package/src/theme-library.ts +844 -0
- package/src/theme-preference.ts +378 -0
- package/src/theme.css +3437 -0
- package/src/three-viewport/bone-selection-highlight.ts +119 -0
- package/src/three-viewport/camera-fit.ts +41 -0
- package/src/three-viewport/interactive-renderer.ts +132 -0
- package/src/three-viewport/selection-brackets.ts +310 -0
- package/src/three-viewport/selection-outline.ts +183 -0
- package/src/three-viewport/skeleton-helper.ts +61 -0
- package/src/three-viewport/source-color.ts +167 -0
- package/src/three-viewport/studio-environment.ts +96 -0
- package/src/three-viewport-presentation.ts +23 -0
- package/src/tool-contribution-play.ts +74 -0
- package/src/tool-loader.ts +1798 -0
- package/src/transform-mode-request.ts +57 -0
- package/src/transient-hint.ts +78 -0
- package/src/trigger-volume-helper.ts +116 -0
- package/src/ui-source/adapter-region-includes.ts +241 -0
- package/src/ui-source/ensure-import.ts +132 -0
- package/src/ui-source/file-region-resolver.ts +302 -0
- package/src/ui-source/inspect.ts +775 -0
- package/src/ui-source/oid-transform.ts +1845 -0
- package/src/ui-source/plan-csf-story.ts +196 -0
- package/src/ui-source/plan-extract-component.ts +421 -0
- package/src/ui-source/plan-fork-component.ts +621 -0
- package/src/ui-source/plan-named-style.ts +95 -0
- package/src/ui-source/plan-source-edit.ts +353 -0
- package/src/ui-source/r3f-contract-resolver.ts +327 -0
- package/src/ui-source/r3f-diagnostic-index.ts +165 -0
- package/src/ui-source/r3f-environment-binding.ts +133 -0
- package/src/ui-source/r3f-joint-binding.ts +251 -0
- package/src/ui-source/r3f-lod-binding.ts +91 -0
- package/src/ui-source/r3f-particle-binding.ts +235 -0
- package/src/ui-source/r3f-physics-binding.ts +483 -0
- package/src/ui-source/r3f-project-contracts.ts +444 -0
- package/src/ui-source/relative-import-specifier.ts +34 -0
- package/src/ui-source/reparent-guard.ts +544 -0
- package/src/ui-source/source-edit-request.ts +97 -0
- package/src/ui-source/source-write-backend.ts +618 -0
- package/src/ui-source/syntactic-prop-specs.ts +296 -0
- package/src/ui-source/tier-source-write-backend.ts +279 -0
- package/src/ui-source/ts-ast.ts +171 -0
- package/src/ui-source/utility-class-support.ts +169 -0
- package/src/ui-source/write-component-default.ts +133 -0
- package/src/ui-source/writer.ts +1989 -0
- package/src/viewport-activation-timings.ts +840 -0
- package/src/viewport-authoring-policy.ts +186 -0
- package/src/viewport-controls-hint.ts +57 -0
- package/src/viewport-door.ts +237 -0
- package/src/viewport-shading-boundary.ts +12 -0
- package/src/vite-error-surface.ts +141 -0
- package/src/wait-until.ts +37 -0
- package/src/workspace-areas.ts +156 -0
- package/src/workspace-aux-commands.ts +11 -0
- package/src/workspace-available-documents.ts +127 -0
- package/src/workspace-core-utilities.ts +31 -0
- package/src/workspace-document-ids.ts +59 -0
- package/src/workspace-document-registry.ts +612 -0
- package/src/workspace-document-restore.ts +145 -0
- package/src/workspace-host-commands.ts +141 -0
- package/src/workspace-persistence-gate.ts +40 -0
- package/src/workspace-play-utilities.ts +44 -0
- package/src/workspace-presets.ts +425 -0
- package/src/workspace-regions.ts +294 -0
- package/src/workspace-state-persistence.ts +536 -0
- package/src/workspace-static-panels.ts +73 -0
- package/src/workspace-status-registry.ts +121 -0
- package/src/workspace-style.ts +239 -0
- package/src/workspace-utility-commands.ts +74 -0
- package/src/workspace-utility-registry.ts +263 -0
- package/src/workspace-viewport-rect.ts +97 -0
- package/src/world-adoption.ts +115 -0
- package/src/world-document-routing.ts +104 -0
- package/vite-plugin-creation-site-write.ts +184 -0
- package/vite-plugin-creation-site.ts +80 -0
- package/vite-plugin-game-static.ts +303 -0
- package/vite-plugin-module-doorways.ts +336 -0
- package/vite-plugin-product-contributions.ts +197 -0
- package/vite-plugin-project-game-static.ts +125 -0
- package/vite-plugin-project-jsx-js.ts +65 -0
- package/vite-plugin-project-root-absolute-assets.ts +359 -0
- package/vite-plugin-shared-react.ts +420 -0
- package/vite-plugin-shared-three.ts +203 -0
- 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
|
+
}
|