machinaos 0.0.76 → 0.0.78
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/README.md +143 -107
- package/client/dist/assets/ActionBar-Du2MSFSz.js +1 -0
- package/client/dist/assets/ApiKeyInput-k2LBmBjb.js +1 -0
- package/client/dist/assets/ApiKeyPanel-C_bV9U0X.js +1 -0
- package/client/dist/assets/ApiUsageSection-CmVfwZzL.js +1 -0
- package/client/dist/assets/EmailPanel-CeKIMGu-.js +1 -0
- package/client/dist/assets/OAuthPanel-KA3t3Q2K.js +1 -0
- package/client/dist/assets/QrPairingPanel-NgNpJNuk.js +1 -0
- package/client/dist/assets/RateLimitSection-Du5YNVIA.js +1 -0
- package/client/dist/assets/StatusCard-DNLyayXc.js +1 -0
- package/client/dist/assets/index-DQ0nwhec.js +257 -0
- package/client/dist/assets/index-DxmbVskS.css +1 -0
- package/client/dist/assets/vendor-flow-CZmBvHRo.js +1 -0
- package/client/dist/assets/vendor-icons-CVrPjN2Q.js +22 -0
- package/client/dist/assets/vendor-markdown-CRou3yQ5.js +62 -0
- package/client/dist/assets/vendor-misc-C4VxKHs5.js +1 -0
- package/client/dist/assets/vendor-query-SzWcOU0G.js +1 -0
- package/client/dist/assets/vendor-radix-Dnos29jG.js +56 -0
- package/client/dist/assets/vendor-react-DvWIbVx0.js +1 -0
- package/client/dist/index.html +37 -3
- package/client/index.html +28 -1
- package/client/package.json +44 -40
- package/client/src/App.tsx +2 -0
- package/client/src/Dashboard.tsx +157 -45
- package/client/src/ParameterPanel.tsx +3 -5
- package/client/src/adapters/nodeSpecToDescription.ts +1 -0
- package/client/src/assets/icons/NodeIcon.tsx +32 -0
- package/client/src/assets/icons/index.ts +4 -0
- package/client/src/assets/icons/stripe.svg +1 -0
- package/client/src/assets/icons/themedGlyphs.ts +404 -0
- package/client/src/components/AIAgentNode.tsx +77 -53
- package/client/src/components/GenericNode.tsx +34 -52
- package/client/src/components/OutputPanel.tsx +64 -147
- package/client/src/components/ParameterRenderer.tsx +5 -3
- package/client/src/components/SkillEditorModal.tsx +9 -18
- package/client/src/components/SquareNode.tsx +97 -115
- package/client/src/components/StartNode.tsx +32 -42
- package/client/src/components/SvgFilterDefs.tsx +54 -0
- package/client/src/components/TeamMonitorNode.tsx +12 -14
- package/client/src/components/ToolkitNode.tsx +35 -60
- package/client/src/components/TriggerNode.tsx +43 -77
- package/client/src/components/__tests__/CredentialsModal.test.tsx +49 -45
- package/client/src/components/credentials/CredentialsModal.tsx +98 -30
- package/client/src/components/credentials/CredentialsPalette.tsx +73 -5
- package/client/src/components/credentials/catalogueAdapter.ts +17 -1
- package/client/src/components/credentials/panels/ApiKeyPanel.tsx +102 -37
- package/client/src/components/credentials/panels/EmailPanel.tsx +7 -19
- package/client/src/components/credentials/panels/OAuthPanel.tsx +5 -1
- package/client/src/components/credentials/panels/QrPairingPanel.tsx +1 -3
- package/client/src/components/credentials/primitives/ActionBar.tsx +7 -11
- package/client/src/components/credentials/primitives/OAuthConnect.tsx +19 -28
- package/client/src/components/credentials/sections/ProviderDefaultsSection.tsx +24 -3
- package/client/src/components/credentials/types.ts +12 -2
- package/client/src/components/credentials/useCredentialPanel.ts +43 -19
- package/client/src/components/icons/AIProviderIcons.tsx +16 -0
- package/client/src/components/onboarding/OnboardingWizard.tsx +23 -63
- package/client/src/components/onboarding/nodeRoleClasses.ts +23 -0
- package/client/src/components/onboarding/steps/CanvasStep.tsx +15 -21
- package/client/src/components/onboarding/steps/ConceptsStep.tsx +2 -11
- package/client/src/components/onboarding/steps/GetStartedStep.tsx +2 -10
- package/client/src/components/parameterPanel/InputSection.tsx +9 -7
- package/client/src/components/parameterPanel/MasterSkillEditor.tsx +84 -198
- package/client/src/components/parameterPanel/MiddleSection.tsx +57 -80
- package/client/src/components/parameterPanel/ToolSchemaEditor.tsx +31 -25
- package/client/src/components/parameterPanel/__tests__/InputSection.test.tsx +7 -2
- package/client/src/components/ui/AIResultModal.tsx +1 -1
- package/client/src/components/ui/CollapsibleSection.tsx +9 -5
- package/client/src/components/ui/CommandPalette.tsx +147 -0
- package/client/src/components/ui/CommandPaletteHost.tsx +189 -0
- package/client/src/components/ui/ComponentItem.tsx +13 -7
- package/client/src/components/ui/ComponentPalette.tsx +24 -13
- package/client/src/components/ui/ConsolePanel.tsx +19 -11
- package/client/src/components/ui/DropCap.tsx +28 -0
- package/client/src/components/ui/EditableNodeLabel.tsx +10 -2
- package/client/src/components/ui/InputNodesPanel.tsx +1 -1
- package/client/src/components/ui/Modal.tsx +38 -6
- package/client/src/components/ui/OutputDisplayPanel.tsx +1 -1
- package/client/src/components/ui/SettingsPanel.tsx +42 -13
- package/client/src/components/ui/StatusBar.tsx +108 -0
- package/client/src/components/ui/ThemeSwitcher.tsx +109 -0
- package/client/src/components/ui/TopToolbar.tsx +42 -25
- package/client/src/components/ui/WorkflowSidebar.tsx +32 -16
- package/client/src/components/ui/action-button.tsx +40 -15
- package/client/src/components/ui/button.tsx +24 -1
- package/client/src/components/ui/dropdown-menu.tsx +24 -2
- package/client/src/components/ui/input.tsx +19 -2
- package/client/src/components/ui/select.tsx +15 -0
- package/client/src/components/ui/textarea.tsx +15 -2
- package/client/src/contexts/AuthContext.tsx +148 -109
- package/client/src/contexts/ThemeContext.tsx +93 -17
- package/client/src/contexts/WebSocketContext.tsx +373 -206
- package/client/src/contexts/__tests__/AuthContext.test.tsx +221 -0
- package/client/src/hooks/__tests__/useDragVariable.test.ts +7 -1
- package/client/src/hooks/__tests__/useWorkflowOpsListener.test.ts +142 -0
- package/client/src/hooks/useAppTheme.ts +209 -7
- package/client/src/hooks/useAutoSkillEdges.ts +7 -2
- package/client/src/hooks/useCatalogueQuery.ts +67 -1
- package/client/src/hooks/useDragVariable.ts +1 -1
- package/client/src/hooks/useNodeAllowlist.ts +115 -8
- package/client/src/hooks/useOnboarding.ts +20 -8
- package/client/src/hooks/useParameterPanel.ts +2 -1
- package/client/src/hooks/useReactFlowNodes.ts +2 -1
- package/client/src/hooks/useSound.ts +185 -0
- package/client/src/hooks/useWorkflowManagement.ts +6 -8
- package/client/src/hooks/useWorkflowOpsListener.ts +90 -0
- package/client/src/index.css +65 -3
- package/client/src/lib/__tests__/connectionConfig.test.ts +91 -0
- package/client/src/lib/aiModelProviders.ts +8 -0
- package/client/src/lib/connectionConfig.ts +107 -0
- package/client/src/lib/queryPersist.ts +13 -5
- package/client/src/lib/sound.ts +393 -0
- package/client/src/main.tsx +20 -0
- package/client/src/store/useAppStore.ts +26 -0
- package/client/src/styles/canvasAnimations.ts +37 -36
- package/client/src/styles/theme.ts +36 -20
- package/client/src/test/setup.ts +1 -0
- package/client/src/themes/atomic.css +253 -0
- package/client/src/themes/base.css +373 -0
- package/client/src/themes/cyber.css +890 -0
- package/client/src/themes/dark.css +70 -0
- package/client/src/themes/edo.css +246 -0
- package/client/src/themes/greek.css +293 -0
- package/client/src/themes/light.css +78 -0
- package/client/src/themes/plague.css +253 -0
- package/client/src/themes/renaissance.css +727 -0
- package/client/src/themes/rot.css +249 -0
- package/client/src/themes/steampunk.css +272 -0
- package/client/src/themes/surveillance.css +289 -0
- package/client/src/themes/wasteland.css +250 -0
- package/client/src/types/INodeProperties.ts +5 -0
- package/client/src/types/NodeTypes.ts +11 -1
- package/client/src/types/__tests__/cloudEvents.test.ts +99 -0
- package/client/src/types/cloudEvents.ts +78 -0
- package/client/src/vite-env.d.ts +7 -0
- package/client/tsconfig.json +1 -1
- package/client/vite.config.js +62 -2
- package/install.ps1 +1 -1
- package/install.sh +1 -1
- package/machina/commands/build.py +51 -7
- package/machina/pyproject.toml +4 -0
- package/machina/supervisor.py +12 -2
- package/machina/tree.py +71 -21
- package/package.json +4 -4
- package/scripts/install.js +16 -1
- package/server/config/ai_cli_providers.json +54 -0
- package/server/config/credential_providers.json +109 -2
- package/server/config/llm_defaults.json +24 -0
- package/server/config/model_registry.json +338 -499
- package/server/config/node_allowlist.json +16 -1
- package/server/config/pricing.json +8 -0
- package/server/constants.py +38 -15
- package/server/core/container.py +2 -2
- package/server/core/credentials_database.py +35 -2
- package/server/core/logging.py +4 -3
- package/server/main.py +99 -13
- package/server/models/node_metadata.py +1 -0
- package/server/nodejs/package.json +8 -6
- package/server/nodejs/src/index.ts +22 -5
- package/server/nodes/README.md +31 -4
- package/server/nodes/agent/_inline.py +2 -0
- package/server/nodes/agent/_specialized.py +6 -3
- package/server/nodes/agent/ai_agent.py +13 -3
- package/server/nodes/agent/chat_agent.py +6 -3
- package/server/nodes/agent/claude_code_agent.py +287 -75
- package/server/nodes/agent/codex_agent.py +239 -0
- package/server/nodes/agent/deep_agent.py +3 -3
- package/server/nodes/agent/rlm_agent.py +3 -3
- package/server/nodes/android/__init__.py +31 -1
- package/server/nodes/android/_base.py +9 -5
- package/server/{services/android_service.py → nodes/android/_dispatcher.py} +2 -2
- package/server/nodes/android/_handlers.py +154 -0
- package/server/nodes/android/_option_loaders.py +44 -0
- package/server/nodes/android/_refresh.py +127 -0
- package/server/{services/android → nodes/android/_relay}/client.py +4 -4
- package/server/{routers/android.py → nodes/android/_router.py} +27 -8
- package/server/nodes/browser/browser.py +2 -2
- package/server/nodes/code/_base.py +6 -2
- package/server/nodes/code/_claude_code.py +134 -0
- package/server/nodes/document/embedding_generator.py +3 -3
- package/server/nodes/document/http_scraper.py +3 -3
- package/server/nodes/document/vector_store.py +5 -5
- package/server/nodes/email/__init__.py +11 -1
- package/server/nodes/email/_filters.py +21 -0
- package/server/{services/himalaya_service.py → nodes/email/_himalaya.py} +6 -10
- package/server/{services/email_service.py → nodes/email/_service.py} +9 -13
- package/server/nodes/email/email_read.py +1 -1
- package/server/nodes/email/email_receive.py +54 -5
- package/server/nodes/email/email_send.py +1 -1
- package/server/nodes/filesystem/shell.py +24 -1
- package/server/nodes/google/__init__.py +55 -1
- package/server/{services/handlers/google_auth.py → nodes/google/_auth_helper.py} +8 -5
- package/server/nodes/google/_base.py +2 -2
- package/server/nodes/google/_credentials.py +5 -5
- package/server/nodes/google/_filters.py +25 -0
- package/server/nodes/google/_handlers.py +57 -0
- package/server/{services/google_oauth.py → nodes/google/_oauth.py} +195 -162
- package/server/nodes/google/_option_loaders.py +107 -0
- package/server/nodes/google/_refresh.py +66 -0
- package/server/nodes/google/_router.py +131 -0
- package/server/nodes/google/gmail_receive.py +41 -4
- package/server/nodes/groups.py +1 -0
- package/server/nodes/location/_credentials.py +45 -1
- package/server/{services/maps.py → nodes/location/_service.py} +18 -3
- package/server/nodes/location/gmaps_create.py +4 -4
- package/server/nodes/location/gmaps_locations.py +4 -4
- package/server/nodes/location/gmaps_nearby_places.py +4 -4
- package/server/nodes/model/_base.py +8 -3
- package/server/nodes/model/_credentials.py +96 -8
- package/server/nodes/model/_local_validator.py +345 -0
- package/server/nodes/model/lmstudio_chat_model.py +23 -0
- package/server/nodes/model/ollama_chat_model.py +25 -0
- package/server/nodes/proxy/_usage.py +2 -2
- package/server/nodes/proxy/proxy_config.py +14 -14
- package/server/nodes/proxy/proxy_request.py +4 -4
- package/server/nodes/scraper/_credentials.py +29 -1
- package/server/nodes/scraper/apify_actor.py +9 -9
- package/server/nodes/scraper/crawlee_scraper.py +5 -5
- package/server/nodes/search/brave_search.py +4 -0
- package/server/nodes/search/perplexity_search.py +9 -0
- package/server/nodes/search/serper_search.py +3 -0
- package/server/nodes/skill/simple_memory.py +12 -0
- package/server/nodes/social/_base.py +2 -2
- package/server/nodes/stripe/__init__.py +46 -0
- package/server/nodes/stripe/_credentials.py +33 -0
- package/server/nodes/stripe/_handlers.py +270 -0
- package/server/nodes/stripe/_install.py +127 -0
- package/server/nodes/stripe/_source.py +174 -0
- package/server/nodes/stripe/stripe_action.py +81 -0
- package/server/nodes/stripe/stripe_receive.py +92 -0
- package/server/nodes/telegram/_credentials.py +52 -1
- package/server/nodes/telegram/_handlers.py +19 -18
- package/server/nodes/telegram/_service.py +134 -32
- package/server/nodes/telegram/telegram_send.py +5 -6
- package/server/nodes/text/file_handler.py +2 -2
- package/server/nodes/text/text_generator.py +2 -2
- package/server/nodes/tool/agent_builder.py +630 -0
- package/server/nodes/tool/task_manager.py +144 -2
- package/server/nodes/twitter/__init__.py +38 -1
- package/server/nodes/twitter/_base.py +7 -7
- package/server/nodes/twitter/_credentials.py +1 -1
- package/server/nodes/twitter/_filters.py +37 -0
- package/server/nodes/twitter/_handlers.py +77 -0
- package/server/nodes/twitter/_oauth.py +124 -0
- package/server/nodes/twitter/_refresh.py +78 -0
- package/server/nodes/twitter/_router.py +29 -0
- package/server/nodes/twitter/twitter_receive.py +4 -0
- package/server/nodes/visuals.json +64 -19
- package/server/nodes/whatsapp/__init__.py +45 -5
- package/server/nodes/whatsapp/_base.py +3 -3
- package/server/nodes/whatsapp/_filters.py +137 -0
- package/server/nodes/whatsapp/_handlers.py +167 -0
- package/server/nodes/whatsapp/_option_loaders.py +68 -0
- package/server/nodes/whatsapp/_refresh.py +62 -0
- package/server/nodes/whatsapp/_runtime.py +1 -1
- package/server/pyproject.toml +29 -7
- package/server/routers/schemas.py +2 -2
- package/server/routers/webhook.py +26 -9
- package/server/routers/websocket.py +149 -810
- package/server/services/ai.py +89 -8
- package/server/services/auth.py +220 -43
- package/server/services/claude_oauth.py +126 -100
- package/server/services/cli_agent/__init__.py +78 -0
- package/server/services/cli_agent/_handlers.py +237 -0
- package/server/services/cli_agent/config.py +112 -0
- package/server/services/cli_agent/factory.py +48 -0
- package/server/services/cli_agent/lockfile.py +141 -0
- package/server/services/cli_agent/mcp_server.py +482 -0
- package/server/services/cli_agent/protocol.py +173 -0
- package/server/services/cli_agent/providers/__init__.py +9 -0
- package/server/services/cli_agent/providers/anthropic_claude.py +419 -0
- package/server/services/cli_agent/providers/google_gemini.py +80 -0
- package/server/services/cli_agent/providers/openai_codex.py +310 -0
- package/server/services/cli_agent/service.py +607 -0
- package/server/services/cli_agent/session.py +618 -0
- package/server/services/cli_agent/types.py +227 -0
- package/server/services/cli_agent/workflow_tools.py +233 -0
- package/server/services/credential_registry.py +26 -1
- package/server/services/deployment/manager.py +26 -145
- package/server/services/deployment/poll_registry.py +59 -0
- package/server/services/event_waiter.py +76 -246
- package/server/services/events/__init__.py +54 -0
- package/server/services/events/cli.py +78 -0
- package/server/services/events/daemon.py +163 -0
- package/server/services/events/envelope.py +281 -0
- package/server/services/events/lifecycle.py +99 -0
- package/server/services/events/oauth_lifecycle.py +534 -0
- package/server/services/events/polling.py +60 -0
- package/server/services/events/push.py +36 -0
- package/server/services/events/source.py +63 -0
- package/server/services/events/triggers.py +118 -0
- package/server/services/events/verifiers/__init__.py +25 -0
- package/server/services/events/verifiers/base.py +28 -0
- package/server/services/events/verifiers/github.py +25 -0
- package/server/services/events/verifiers/hmac_basic.py +32 -0
- package/server/services/events/verifiers/standard_webhooks.py +47 -0
- package/server/services/events/verifiers/stripe.py +42 -0
- package/server/services/events/webhook.py +105 -0
- package/server/services/handlers/tools.py +28 -186
- package/server/services/llm/config.py +7 -0
- package/server/services/llm/factory.py +8 -2
- package/server/services/memory/__init__.py +52 -0
- package/server/services/memory/jsonl.py +80 -0
- package/server/services/memory/markdown.py +65 -0
- package/server/services/memory/state.py +112 -0
- package/server/services/memory/vector_store.py +40 -0
- package/server/services/model_registry.py +76 -0
- package/server/services/node_allowlist.py +71 -15
- package/server/services/node_executor.py +2 -2
- package/server/services/node_output_schemas.py +21 -10
- package/server/services/node_spec.py +1 -1
- package/server/services/oauth_utils.py +1 -1
- package/server/services/plugin/__init__.py +2 -0
- package/server/services/plugin/base.py +44 -2
- package/server/services/plugin/credential.py +288 -1
- package/server/services/plugin/deps.py +105 -0
- package/server/services/plugin/edge_walker.py +12 -4
- package/server/services/plugin/oauth.py +381 -0
- package/server/services/plugin/polling.py +247 -0
- package/server/services/plugin/registry.py +145 -0
- package/server/services/plugin/singleton.py +65 -0
- package/server/services/plugin/ws.py +81 -0
- package/server/services/process_service.py +31 -2
- package/server/services/status_broadcaster.py +155 -238
- package/server/services/temporal/workflow.py +7 -7
- package/server/services/workflow.py +21 -3
- package/server/services/ws_handler_registry.py +111 -28
- package/server/skills/GUIDE.md +16 -1
- package/server/skills/assistant/agent-builder-skill/SKILL.md +166 -0
- package/server/skills/payments_agent/stripe-skill/SKILL.md +306 -0
- package/server/tests/credentials/test_auth_service.py +16 -9
- package/server/tests/credentials/test_credential_broadcasts.py +219 -0
- package/server/tests/credentials/test_google_oauth.py +6 -6
- package/server/tests/credentials/test_oauth_utils.py +1 -1
- package/server/tests/credentials/test_twitter_oauth.py +2 -2
- package/server/tests/credentials/test_websocket_handlers.py +44 -20
- package/server/tests/llm/test_factory.py +1 -0
- package/server/tests/llm/test_wiring.py +5 -1
- package/server/tests/nodes/_compat.py +24 -24
- package/server/tests/nodes/test_agent_builder.py +439 -0
- package/server/tests/nodes/test_ai_tools.py +18 -14
- package/server/tests/nodes/test_code_fs_process.py +17 -8
- package/server/tests/nodes/test_email.py +10 -9
- package/server/tests/nodes/test_google_workspace.py +2 -2
- package/server/tests/nodes/test_specialized_agents.py +100 -53
- package/server/tests/nodes/test_stripe_plugin.py +293 -0
- package/server/tests/nodes/test_telegram_social.py +4 -4
- package/server/tests/nodes/test_twitter.py +1 -1
- package/server/tests/nodes/test_web_automation.py +2 -2
- package/server/tests/nodes/test_whatsapp.py +9 -9
- package/server/tests/services/cli_agent/__init__.py +0 -0
- package/server/tests/services/cli_agent/test_mcp_server.py +432 -0
- package/server/tests/services/cli_agent/test_providers.py +358 -0
- package/server/tests/services/cli_agent/test_service.py +298 -0
- package/server/tests/services/memory/__init__.py +0 -0
- package/server/tests/services/memory/test_jsonl.py +188 -0
- package/server/tests/services/test_events.py +333 -0
- package/server/tests/test_node_spec.py +56 -16
- package/server/tests/test_plugin_helpers.py +116 -0
- package/server/tests/test_plugin_self_containment.py +486 -0
- package/server/tests/test_status_broadcasts.py +425 -0
- package/workflows/{AI Assistant_workflow-1777421105154-0m4snkzjf.json → AI Assistant_workflow-1778504793388-ou1m1tz2x.json } +70 -266
- package/workflows/{AI Employee_workflow-1777720598005-u4cm858dv.json → AI Employee_example_workflow-1777720598005-u4cm858dv.json } +112 -112
- package/workflows/Claude Assistant_workflow-1778380124051-mdibn807c.json +709 -0
- package/client/dist/assets/ActionBar-vzPpSR77.js +0 -1
- package/client/dist/assets/ApiKeyInput-Ds7AKFe8.js +0 -1
- package/client/dist/assets/ApiKeyPanel-gfblELep.js +0 -1
- package/client/dist/assets/ApiUsageSection-BMNWTe2r.js +0 -1
- package/client/dist/assets/EmailPanel-B1Om64p5.js +0 -1
- package/client/dist/assets/OAuthPanel-CXyQYGBz.js +0 -1
- package/client/dist/assets/QrPairingPanel-BgNuI1we.js +0 -1
- package/client/dist/assets/RateLimitSection-YYK8sx1T.js +0 -1
- package/client/dist/assets/StatusCard-DuYA5hJR.js +0 -1
- package/client/dist/assets/index-D9tZfgvi.js +0 -363
- package/client/dist/assets/index-al7snTkG.css +0 -1
- package/client/src/components/credentials/providers.tsx +0 -177
- package/server/routers/google.py +0 -277
- package/server/routers/maps.py +0 -142
- package/server/routers/twitter.py +0 -365
- package/server/services/claude_code_service.py +0 -106
- package/server/services/memory.py +0 -159
- package/server/services/node_option_loaders/__init__.py +0 -77
- package/server/services/node_option_loaders/android_loaders.py +0 -55
- package/server/services/node_option_loaders/google_loaders.py +0 -97
- package/server/services/node_option_loaders/whatsapp_loaders.py +0 -69
- package/server/services/twitter_oauth.py +0 -411
- package/server/services/websocket_client.py +0 -29
- /package/server/{services/android → nodes/android/_relay}/__init__.py +0 -0
- /package/server/{services/android → nodes/android/_relay}/broadcaster.py +0 -0
- /package/server/{services/android → nodes/android/_relay}/manager.py +0 -0
- /package/server/{services/android → nodes/android/_relay}/protocol.py +0 -0
- /package/server/{services/browser_service.py → nodes/browser/_service.py} +0 -0
- /package/server/{services/whatsapp_service.py → nodes/whatsapp/_service.py} +0 -0
- /package/server/skills/{task_agent → assistant}/write-todos-skill/SKILL.md +0 -0
|
@@ -0,0 +1,890 @@
|
|
|
1
|
+
/* ============================================================================
|
|
2
|
+
* themes/cyber.css — Neuromancer night market / pirated terminal popup.
|
|
3
|
+
*
|
|
4
|
+
* Defines the full new-contract token block AND overrides the shadcn
|
|
5
|
+
* HSL-triplet tokens so existing Tailwind utilities retint correctly.
|
|
6
|
+
*
|
|
7
|
+
* Palette: void (#050010), neon magenta (#f51eb6), neon cyan (#1dd9e5),
|
|
8
|
+
* neon green (#26d97a). HSL triplets are conversions of the same hex
|
|
9
|
+
* values.
|
|
10
|
+
*
|
|
11
|
+
* Decorative layers (scanlines, CRT flicker, grid backplane, neon glow)
|
|
12
|
+
* are deferred to Phase 3 fan-out.
|
|
13
|
+
*
|
|
14
|
+
* Source: design_handoff_machinaos_themes/themes/cyber.css.
|
|
15
|
+
* ============================================================================ */
|
|
16
|
+
|
|
17
|
+
:root[data-theme="cyber"] {
|
|
18
|
+
/* ── New contract — full colour values ────────────────────────────── */
|
|
19
|
+
|
|
20
|
+
/* Surfaces */
|
|
21
|
+
--bg-app: #050010;
|
|
22
|
+
--bg-panel: #0a0420;
|
|
23
|
+
--bg-canvas: #03000a;
|
|
24
|
+
--bg-elevated: #15103a;
|
|
25
|
+
--bg-input: #0a0420;
|
|
26
|
+
--bg-hover: rgba(245, 30, 182, 0.14);
|
|
27
|
+
--bg-active: rgba(245, 30, 182, 0.20);
|
|
28
|
+
--bg-overlay: rgba(5, 0, 16, 0.85);
|
|
29
|
+
|
|
30
|
+
/* Borders */
|
|
31
|
+
--border-default: #2a1f50;
|
|
32
|
+
--border-strong: #f51eb6;
|
|
33
|
+
--border-focus: #1dd9e5;
|
|
34
|
+
--ornament-frame: none;
|
|
35
|
+
|
|
36
|
+
/* Foreground */
|
|
37
|
+
--fg-default: #f0e0ff;
|
|
38
|
+
--fg-muted: #a090c0;
|
|
39
|
+
--fg-faint: #6a5a8a;
|
|
40
|
+
--fg-on-accent: #050010;
|
|
41
|
+
--fg-on-success: #050010;
|
|
42
|
+
--fg-on-danger: #f5e0ea;
|
|
43
|
+
--fg-on-warning: #050010;
|
|
44
|
+
|
|
45
|
+
/* Theme-specific neon accents */
|
|
46
|
+
--neon-cyan: #1dd9e5;
|
|
47
|
+
--neon-magenta: #f51eb6;
|
|
48
|
+
--neon-yellow: #ffd028;
|
|
49
|
+
--neon-green: #26d97a;
|
|
50
|
+
|
|
51
|
+
/* Type — Major Mono Display + JetBrains Mono everywhere */
|
|
52
|
+
--font-display: 'Major Mono Display', 'Audiowide', monospace;
|
|
53
|
+
--font-body: 'JetBrains Mono', 'Fira Code', ui-monospace, monospace;
|
|
54
|
+
--font-mono: 'JetBrains Mono', monospace;
|
|
55
|
+
--type-scale-base: 13px;
|
|
56
|
+
--type-tracking-display: 0.18em;
|
|
57
|
+
--type-uppercase: uppercase;
|
|
58
|
+
|
|
59
|
+
/* Geometry — sharp corners everywhere */
|
|
60
|
+
--radius-sm: 0;
|
|
61
|
+
--radius-md: 0;
|
|
62
|
+
--radius-lg: 0;
|
|
63
|
+
--radius-pill: 0;
|
|
64
|
+
|
|
65
|
+
/* Motion — fast, mechanical (steps easing for hard on/off) */
|
|
66
|
+
--ease-default: steps(4, end);
|
|
67
|
+
--ease-emphasis: steps(8, end);
|
|
68
|
+
--dur-fast: 60ms;
|
|
69
|
+
--dur-default: 120ms;
|
|
70
|
+
--dur-slow: 240ms;
|
|
71
|
+
--motion-style: glitch;
|
|
72
|
+
--sound-pack: terminal;
|
|
73
|
+
|
|
74
|
+
/* Wave 30: high-contrast executing-node pulse colour. Neon cyan
|
|
75
|
+
* reads vividly against the near-black canvas backplane. */
|
|
76
|
+
--node-pulse-color: var(--neon-cyan);
|
|
77
|
+
|
|
78
|
+
/* Cursor — crosshair targeting reticle (upstream design handoff) */
|
|
79
|
+
--cursor-default: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'><g stroke='%23f51eb6' stroke-width='1.2' fill='none'><path d='M12 2 L12 8 M12 16 L12 22 M2 12 L8 12 M16 12 L22 12'/><circle cx='12' cy='12' r='3'/><circle cx='12' cy='12' r='1' fill='%231dd9e5'/></g></svg>") 12 12, crosshair;
|
|
80
|
+
--cursor-pointer: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'><g stroke='%23f51eb6' stroke-width='1.5' fill='none'><rect x='3' y='3' width='18' height='18'/><rect x='8' y='8' width='8' height='8' fill='%231dd9e5'/></g></svg>") 12 12, pointer;
|
|
81
|
+
|
|
82
|
+
/* Canvas backplane — magnetic-tape grid (24px cells, neon magenta + cyan) */
|
|
83
|
+
--canvas-grid:
|
|
84
|
+
repeating-linear-gradient(0deg, transparent 0 23px, rgba(245, 30, 182, 0.10) 23px 24px),
|
|
85
|
+
repeating-linear-gradient(90deg, transparent 0 23px, rgba(29, 217, 229, 0.10) 23px 24px);
|
|
86
|
+
--canvas-grid-opacity: 1;
|
|
87
|
+
|
|
88
|
+
--scrollbar-track: #0a0420;
|
|
89
|
+
--scrollbar-thumb: #f51eb6;
|
|
90
|
+
|
|
91
|
+
/* ── Shadcn HSL-triplet bridge ───────────────────────────────────── */
|
|
92
|
+
|
|
93
|
+
--background: 247 100% 4%; /* #050010 */
|
|
94
|
+
--foreground: 267 100% 94%; /* #f0e0ff */
|
|
95
|
+
--card: 247 57% 15%; /* #15103a */
|
|
96
|
+
--card-foreground: 267 100% 94%;
|
|
97
|
+
--popover: 253 80% 7%; /* #0a0420 */
|
|
98
|
+
--popover-foreground: 267 100% 94%;
|
|
99
|
+
|
|
100
|
+
--primary: 316 92% 54%; /* #f51eb6 neon magenta */
|
|
101
|
+
--primary-foreground: 247 100% 4%;
|
|
102
|
+
--secondary: 253 80% 7%; /* panel */
|
|
103
|
+
--secondary-foreground: 267 100% 94%;
|
|
104
|
+
--muted: 253 80% 7%;
|
|
105
|
+
--muted-foreground: 260 25% 66%; /* #a090c0 */
|
|
106
|
+
--accent: 184 79% 51%; /* #1dd9e5 neon cyan */
|
|
107
|
+
--accent-foreground: 247 100% 4%;
|
|
108
|
+
|
|
109
|
+
--destructive: 347 100% 56%; /* #ff2050 */
|
|
110
|
+
--destructive-foreground: 0 0% 100%;
|
|
111
|
+
--success: 147 71% 50%; /* #26d97a neon green */
|
|
112
|
+
--warning: 46 100% 58%; /* #ffd028 neon yellow */
|
|
113
|
+
--info: 184 79% 51%; /* neon cyan */
|
|
114
|
+
|
|
115
|
+
--border: 253 44% 22%; /* #2a1f50 */
|
|
116
|
+
--input: 253 44% 22%;
|
|
117
|
+
--ring: 184 79% 51%; /* cyan focus */
|
|
118
|
+
|
|
119
|
+
/* Action role tokens — neon equivalents */
|
|
120
|
+
--action-run: 147 71% 50%; /* neon green */
|
|
121
|
+
--action-run-soft: 147 71% 50% / 0.15;
|
|
122
|
+
--action-run-hover: 147 71% 50% / 0.30;
|
|
123
|
+
--action-run-border: 147 71% 50% / 0.7;
|
|
124
|
+
|
|
125
|
+
--action-stop: 347 100% 56%; /* danger red */
|
|
126
|
+
--action-stop-soft: 347 100% 56% / 0.15;
|
|
127
|
+
--action-stop-hover: 347 100% 56% / 0.30;
|
|
128
|
+
--action-stop-border: 347 100% 56% / 0.7;
|
|
129
|
+
|
|
130
|
+
--action-save: 184 79% 51%; /* neon cyan */
|
|
131
|
+
--action-save-soft: 184 79% 51% / 0.15;
|
|
132
|
+
--action-save-hover: 184 79% 51% / 0.30;
|
|
133
|
+
--action-save-border: 184 79% 51% / 0.7;
|
|
134
|
+
|
|
135
|
+
--action-config: 46 100% 58%; /* neon yellow */
|
|
136
|
+
--action-config-soft: 46 100% 58% / 0.15;
|
|
137
|
+
--action-config-hover: 46 100% 58% / 0.30;
|
|
138
|
+
--action-config-border: 46 100% 58% / 0.7;
|
|
139
|
+
|
|
140
|
+
--action-secret: 316 92% 54%; /* neon magenta */
|
|
141
|
+
--action-secret-soft: 316 92% 54% / 0.15;
|
|
142
|
+
--action-secret-hover: 316 92% 54% / 0.30;
|
|
143
|
+
--action-secret-border: 316 92% 54% / 0.7;
|
|
144
|
+
|
|
145
|
+
--action-tools: 316 92% 54%; /* magenta */
|
|
146
|
+
--action-tools-soft: 316 92% 54% / 0.15;
|
|
147
|
+
--action-tools-hover: 316 92% 54% / 0.30;
|
|
148
|
+
--action-tools-border: 316 92% 54% / 0.7;
|
|
149
|
+
|
|
150
|
+
/* Stronger tint alpha — neon brand colours need more presence on void */
|
|
151
|
+
--tint-soft: 16%;
|
|
152
|
+
--tint-border: 50%;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/* ── Body void background ────────────────────────────────────────────── */
|
|
156
|
+
|
|
157
|
+
:root[data-theme="cyber"] body {
|
|
158
|
+
background:
|
|
159
|
+
radial-gradient(ellipse at 20% 30%, rgba(245, 30, 182, 0.12), transparent 40%),
|
|
160
|
+
radial-gradient(ellipse at 80% 70%, rgba(29, 217, 229, 0.08), transparent 40%),
|
|
161
|
+
url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='400' height='400'><filter id='n'><feTurbulence baseFrequency='2' numOctaves='1' seed='3'/><feColorMatrix values='0 0 0 0 1 0 0 0 0 0.4 0 0 0 0 1 0 0 0 0.04 0'/></filter><rect width='400' height='400' filter='url(%23n)'/></svg>"),
|
|
162
|
+
var(--bg-app);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/* ::selection — neon highlight */
|
|
166
|
+
:root[data-theme="cyber"] ::selection {
|
|
167
|
+
background: #f51eb6;
|
|
168
|
+
color: #050010;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/* Cyber scrollbars — neon thumbs with glow */
|
|
172
|
+
:root[data-theme="cyber"] ::-webkit-scrollbar-thumb {
|
|
173
|
+
background: #f51eb6;
|
|
174
|
+
box-shadow: 0 0 6px #f51eb6;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/* ── Per-component decorations (Wave 16 port from handoff) ─── */
|
|
178
|
+
|
|
179
|
+
/* CRT flicker on whole frame */
|
|
180
|
+
@keyframes cyber-flicker {
|
|
181
|
+
0%, 92%, 100% { opacity: 1; }
|
|
182
|
+
93% { opacity: 0.88; }
|
|
183
|
+
94% { opacity: 1; }
|
|
184
|
+
96% { opacity: 0.94; }
|
|
185
|
+
97% { opacity: 1; }
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/* Rolling scanline */
|
|
189
|
+
@keyframes cyber-roll {
|
|
190
|
+
0% { transform: translateY(-100%); }
|
|
191
|
+
100% { transform: translateY(100vh); }
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/* Blinking elements (LED, status pip, cmdk arrow) */
|
|
195
|
+
@keyframes cyber-blink {
|
|
196
|
+
0%, 49% { opacity: 1; }
|
|
197
|
+
50%, 100% { opacity: 0.4; }
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/* Glitch on hover */
|
|
201
|
+
@keyframes cyber-glitch {
|
|
202
|
+
0%, 100% { transform: translateX(0); text-shadow: 0 0 4px var(--neon-magenta), 0 0 12px var(--neon-magenta), 1px 0 0 var(--neon-cyan); }
|
|
203
|
+
20% { transform: translateX(-2px); text-shadow: 2px 0 var(--neon-cyan), -2px 0 var(--neon-magenta); }
|
|
204
|
+
40% { transform: translateX(2px); text-shadow: -2px 0 var(--neon-cyan), 2px 0 var(--neon-magenta); }
|
|
205
|
+
60% { transform: translateX(-1px); }
|
|
206
|
+
80% { transform: translateX(1px); }
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/* ─── SCANLINES OVERLAY across the whole app ─── */
|
|
210
|
+
:root[data-theme="cyber"] .app-frame {
|
|
211
|
+
box-shadow:
|
|
212
|
+
inset 0 0 0 1px var(--neon-magenta),
|
|
213
|
+
inset 0 0 0 4px var(--bg-app),
|
|
214
|
+
inset 0 0 0 5px var(--neon-cyan),
|
|
215
|
+
0 0 80px rgba(245, 30, 182, 0.4);
|
|
216
|
+
position: relative;
|
|
217
|
+
animation: cyber-flicker 5s linear infinite;
|
|
218
|
+
}
|
|
219
|
+
:root[data-theme="cyber"] .app-frame::after {
|
|
220
|
+
content: '';
|
|
221
|
+
position: absolute; inset: 0;
|
|
222
|
+
background: repeating-linear-gradient(0deg, transparent 0 2px, rgba(0,0,0,0.25) 2px 3px);
|
|
223
|
+
pointer-events: none;
|
|
224
|
+
z-index: 1000;
|
|
225
|
+
mix-blend-mode: multiply;
|
|
226
|
+
}
|
|
227
|
+
:root[data-theme="cyber"] .app-frame::before {
|
|
228
|
+
content: ''; position: absolute; left: 0; right: 0; height: 80px;
|
|
229
|
+
background: linear-gradient(180deg, transparent, rgba(245, 30, 182, 0.15), transparent);
|
|
230
|
+
pointer-events: none; z-index: 1001;
|
|
231
|
+
animation: cyber-roll 8s linear infinite;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/* ─── PANELS with circuit-board border lights ─── */
|
|
235
|
+
:root[data-theme="cyber"] .toolbar,
|
|
236
|
+
:root[data-theme="cyber"] .sidebar,
|
|
237
|
+
:root[data-theme="cyber"] .palette,
|
|
238
|
+
:root[data-theme="cyber"] .chat {
|
|
239
|
+
background:
|
|
240
|
+
linear-gradient(180deg, rgba(245, 30, 182, 0.04), transparent 60px),
|
|
241
|
+
var(--bg-panel);
|
|
242
|
+
position: relative;
|
|
243
|
+
}
|
|
244
|
+
:root[data-theme="cyber"] .toolbar { border-bottom: 1px solid var(--neon-magenta); box-shadow: 0 1px 12px rgba(245, 30, 182, 0.5); }
|
|
245
|
+
:root[data-theme="cyber"] .sidebar { border-right: 1px solid var(--neon-magenta); box-shadow: 1px 0 12px rgba(245, 30, 182, 0.3); }
|
|
246
|
+
:root[data-theme="cyber"] .palette { border-left: 1px solid var(--neon-cyan); box-shadow: -1px 0 12px rgba(29, 217, 229, 0.3); }
|
|
247
|
+
:root[data-theme="cyber"] .chat { border-top: 1px solid var(--neon-cyan); box-shadow: 0 -1px 12px rgba(29, 217, 229, 0.3); }
|
|
248
|
+
|
|
249
|
+
/* ─── CANVAS — magnetic-tape grid with horizon ─── */
|
|
250
|
+
:root[data-theme="cyber"] .canvas {
|
|
251
|
+
background:
|
|
252
|
+
radial-gradient(ellipse at 50% 100%, rgba(245, 30, 182, 0.25), transparent 60%),
|
|
253
|
+
linear-gradient(180deg, transparent 0%, transparent 50%, rgba(29, 217, 229, 0.04) 50%, rgba(29, 217, 229, 0.08) 100%),
|
|
254
|
+
linear-gradient(rgba(245, 30, 182, 0.08) 1px, transparent 1px),
|
|
255
|
+
linear-gradient(90deg, rgba(29, 217, 229, 0.08) 1px, transparent 1px),
|
|
256
|
+
var(--bg-canvas);
|
|
257
|
+
background-size: auto, auto, 24px 24px, 24px 24px, auto;
|
|
258
|
+
position: relative;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/* Perspective grid floor — sits below React Flow nodes (which carry their
|
|
262
|
+
* own z-index from React Flow internals). pointer-events:none so the
|
|
263
|
+
* decoration never captures clicks meant for nodes/edges underneath. */
|
|
264
|
+
:root[data-theme="cyber"] .canvas::before {
|
|
265
|
+
content: ''; position: absolute; left: 0; right: 0; bottom: 0; height: 50%;
|
|
266
|
+
background:
|
|
267
|
+
linear-gradient(180deg, transparent, rgba(245, 30, 182, 0.10) 80%),
|
|
268
|
+
repeating-linear-gradient(180deg, transparent 0 20px, rgba(29, 217, 229, 0.4) 20px 21px);
|
|
269
|
+
transform: perspective(300px) rotateX(60deg);
|
|
270
|
+
transform-origin: bottom;
|
|
271
|
+
pointer-events: none;
|
|
272
|
+
opacity: 0.4;
|
|
273
|
+
z-index: 0;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/* Floating "SIGNAL LOST" status text — sits above the perspective floor
|
|
277
|
+
* but pointer-events:none keeps it from intercepting interaction. */
|
|
278
|
+
:root[data-theme="cyber"] .canvas::after {
|
|
279
|
+
content: '◆ SIGNAL ◆ NIGHT_MARKET.7 ◆ 03:47:22';
|
|
280
|
+
position: absolute; top: 12px; right: 16px;
|
|
281
|
+
font-family: var(--font-mono);
|
|
282
|
+
font-size: 10px;
|
|
283
|
+
color: var(--neon-cyan);
|
|
284
|
+
letter-spacing: 0.2em;
|
|
285
|
+
text-shadow: 0 0 4px var(--neon-cyan);
|
|
286
|
+
pointer-events: none;
|
|
287
|
+
animation: cyber-blink 1.6s steps(2) infinite;
|
|
288
|
+
z-index: 1;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/* ─── BUTTONS — neon outline ─── */
|
|
292
|
+
:root[data-theme="cyber"] .btn {
|
|
293
|
+
background: transparent;
|
|
294
|
+
border: 1px solid var(--neon-cyan);
|
|
295
|
+
color: var(--neon-cyan);
|
|
296
|
+
font-family: var(--font-body);
|
|
297
|
+
letter-spacing: 0.14em;
|
|
298
|
+
text-transform: uppercase;
|
|
299
|
+
font-size: 11px; font-weight: 600;
|
|
300
|
+
padding: 7px 14px;
|
|
301
|
+
text-shadow: 0 0 4px currentColor;
|
|
302
|
+
box-shadow: 0 0 8px rgba(29, 217, 229, 0.3), inset 0 0 8px rgba(29, 217, 229, 0.1);
|
|
303
|
+
position: relative;
|
|
304
|
+
transition: none;
|
|
305
|
+
}
|
|
306
|
+
:root[data-theme="cyber"] .btn::before {
|
|
307
|
+
content: '> '; opacity: 0; transition: opacity var(--dur-fast);
|
|
308
|
+
}
|
|
309
|
+
:root[data-theme="cyber"] .btn:hover {
|
|
310
|
+
color: var(--neon-magenta);
|
|
311
|
+
border-color: var(--neon-magenta);
|
|
312
|
+
background: rgba(245, 30, 182, 0.10);
|
|
313
|
+
box-shadow: 0 0 16px var(--neon-magenta), inset 0 0 12px rgba(245, 30, 182, 0.2);
|
|
314
|
+
}
|
|
315
|
+
:root[data-theme="cyber"] .btn:hover::before { opacity: 1; }
|
|
316
|
+
|
|
317
|
+
/* ─── INPUTS — terminal entry ─── */
|
|
318
|
+
:root[data-theme="cyber"] .input {
|
|
319
|
+
background: rgba(0,0,0,0.4);
|
|
320
|
+
border: 1px solid var(--border-default);
|
|
321
|
+
color: var(--neon-cyan);
|
|
322
|
+
font-family: var(--font-mono);
|
|
323
|
+
font-size: 12px;
|
|
324
|
+
caret-color: var(--neon-magenta);
|
|
325
|
+
text-shadow: 0 0 3px var(--neon-cyan);
|
|
326
|
+
padding: 7px 10px 7px 22px;
|
|
327
|
+
}
|
|
328
|
+
:root[data-theme="cyber"] .input:focus {
|
|
329
|
+
outline: none;
|
|
330
|
+
border-color: var(--neon-magenta);
|
|
331
|
+
box-shadow: 0 0 0 1px var(--neon-magenta), 0 0 16px rgba(245, 30, 182, 0.5);
|
|
332
|
+
}
|
|
333
|
+
:root[data-theme="cyber"] .input::placeholder { color: var(--fg-faint); }
|
|
334
|
+
|
|
335
|
+
/* prompt prefix */
|
|
336
|
+
:root[data-theme="cyber"] .input { background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'><path d='M2 2 L6 6 L2 10' fill='none' stroke='%23f51eb6' stroke-width='1.5'/></svg>"); background-repeat: no-repeat; background-position: 7px center; background-size: 10px; }
|
|
337
|
+
|
|
338
|
+
/* ─── ROWS — scan-bracket on hover ─── */
|
|
339
|
+
:root[data-theme="cyber"] .row {
|
|
340
|
+
font-family: var(--font-mono);
|
|
341
|
+
font-size: 12px;
|
|
342
|
+
color: var(--fg-muted);
|
|
343
|
+
padding: 6px 10px;
|
|
344
|
+
position: relative;
|
|
345
|
+
border-left: 2px solid transparent;
|
|
346
|
+
transition: color var(--dur-fast) steps(2), border-color var(--dur-fast), background var(--dur-fast);
|
|
347
|
+
}
|
|
348
|
+
:root[data-theme="cyber"] .row:hover {
|
|
349
|
+
color: var(--neon-magenta);
|
|
350
|
+
background: var(--bg-hover);
|
|
351
|
+
border-left-color: var(--neon-magenta);
|
|
352
|
+
text-shadow: 0 0 4px var(--neon-magenta);
|
|
353
|
+
}
|
|
354
|
+
:root[data-theme="cyber"] .row:hover::after {
|
|
355
|
+
content: ' ◀'; color: var(--neon-magenta);
|
|
356
|
+
position: absolute; right: 8px; top: 50%; transform: translateY(-50%);
|
|
357
|
+
animation: cyber-blink 0.6s steps(2) infinite;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
/* ─── NODES — chrome terminals with neon underglow ─── */
|
|
361
|
+
:root[data-theme="cyber"] .node {
|
|
362
|
+
background: linear-gradient(180deg, var(--bg-elevated), var(--bg-panel));
|
|
363
|
+
border: 1px solid var(--neon-cyan);
|
|
364
|
+
font-family: var(--font-display);
|
|
365
|
+
font-size: 10px;
|
|
366
|
+
letter-spacing: 0.16em;
|
|
367
|
+
text-transform: uppercase;
|
|
368
|
+
color: var(--neon-cyan);
|
|
369
|
+
padding: 10px 14px;
|
|
370
|
+
text-shadow: 0 0 4px currentColor;
|
|
371
|
+
box-shadow:
|
|
372
|
+
0 0 0 1px var(--bg-app),
|
|
373
|
+
0 0 16px rgba(29, 217, 229, 0.4),
|
|
374
|
+
inset 0 0 12px rgba(29, 217, 229, 0.1);
|
|
375
|
+
position: relative;
|
|
376
|
+
clip-path: polygon(0 0, calc(100% - 8px) 0, 100% 8px, 100% 100%, 8px 100%, 0 calc(100% - 8px));
|
|
377
|
+
transition: none;
|
|
378
|
+
}
|
|
379
|
+
/* Wave 30.3: TriggerNode is `.sq-node.node-trigger` (square topology
|
|
380
|
+
after W26.A) — the visible square is `.sq-node-box`, not the outer
|
|
381
|
+
`.sq-node` wrapper which spans icon + label. The earlier W26.B bare
|
|
382
|
+
`.node-trigger` selector also fired on the outer wrapper, painting
|
|
383
|
+
a 1px ring + 16px green halo around the whole thing (icon AND label
|
|
384
|
+
area), reading as a phantom extra border. Now scoped to
|
|
385
|
+
`.sq-node.node-trigger .sq-node-box` only — the green neon strictly
|
|
386
|
+
outlines the icon-square. AIAgentNode remains rectangular
|
|
387
|
+
(`.node.node-agent`), unaffected. */
|
|
388
|
+
:root[data-theme="cyber"] .sq-node.node-trigger .sq-node-box { border-color: var(--neon-green); color: var(--neon-green); box-shadow: 0 0 0 1px var(--bg-app), 0 0 16px rgba(38, 217, 122, 0.5), inset 0 0 12px rgba(38, 217, 122, 0.1); }
|
|
389
|
+
:root[data-theme="cyber"] .node-agent { border-color: var(--neon-magenta); color: var(--neon-magenta); box-shadow: 0 0 0 1px var(--bg-app), 0 0 16px rgba(245, 30, 182, 0.6), inset 0 0 12px rgba(245, 30, 182, 0.15); }
|
|
390
|
+
|
|
391
|
+
/* corner LED */
|
|
392
|
+
:root[data-theme="cyber"] .node::before {
|
|
393
|
+
content: ''; position: absolute; top: 4px; left: 4px;
|
|
394
|
+
width: 4px; height: 4px;
|
|
395
|
+
background: currentColor;
|
|
396
|
+
box-shadow: 0 0 6px currentColor;
|
|
397
|
+
animation: cyber-blink 1.4s steps(2) infinite;
|
|
398
|
+
}
|
|
399
|
+
:root[data-theme="cyber"] .node:hover {
|
|
400
|
+
box-shadow:
|
|
401
|
+
0 0 0 1px var(--bg-app),
|
|
402
|
+
0 0 24px currentColor,
|
|
403
|
+
inset 0 0 16px rgba(255, 255, 255, 0.1);
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
/* edges glow */
|
|
407
|
+
:root[data-theme="cyber"] .edge path {
|
|
408
|
+
stroke: var(--neon-magenta) !important;
|
|
409
|
+
filter: drop-shadow(0 0 4px var(--neon-magenta));
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
/* ─── SQUARE NODES — terminal modules ─── */
|
|
413
|
+
:root[data-theme="cyber"] .sq-node-box {
|
|
414
|
+
background: linear-gradient(180deg, rgba(245,30,182,0.10), rgba(0,0,0,0.6));
|
|
415
|
+
border: 1px solid var(--neon-magenta);
|
|
416
|
+
border-radius: 0;
|
|
417
|
+
box-shadow:
|
|
418
|
+
inset 0 0 0 1px rgba(0,0,0,0.6),
|
|
419
|
+
0 0 12px rgba(245,30,182,0.4);
|
|
420
|
+
color: var(--neon-magenta);
|
|
421
|
+
text-shadow: 0 0 4px currentColor;
|
|
422
|
+
}
|
|
423
|
+
:root[data-theme="cyber"] .sq-node.selected .sq-node-box {
|
|
424
|
+
border-color: var(--neon-cyan);
|
|
425
|
+
color: var(--neon-cyan);
|
|
426
|
+
box-shadow:
|
|
427
|
+
inset 0 0 0 1px rgba(0,0,0,0.6),
|
|
428
|
+
0 0 0 1px var(--neon-cyan),
|
|
429
|
+
0 0 20px var(--neon-cyan);
|
|
430
|
+
animation: cyber-blink 1.6s steps(2) infinite;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
/* Wave 29: Cyber executing nodes pulse with the cyber-blink keyframe
|
|
434
|
+
* (steps animation = digital strobe), not the smooth node-pulse default.
|
|
435
|
+
* Targets BOTH React Flow's wrapper class and our data-attribute so
|
|
436
|
+
* either drives the animation. Higher specificity than base.css's
|
|
437
|
+
* generic .react-flow__node.executing .sq-node-box rule, so this wins. */
|
|
438
|
+
/* Wave 30.1: dedicated executing-pulse keyframe that animates
|
|
439
|
+
* BOX-SHADOW only — not opacity. The original `cyber-blink`
|
|
440
|
+
* keyframe (used for LED, status pip, cmdk arrow) animates
|
|
441
|
+
* opacity 1 → 0.4, which when applied to whole nodes faded the
|
|
442
|
+
* entire node icon + content. This keyframe pulses the neon glow
|
|
443
|
+
* intensity while the node body stays solid. Steps(2) timing
|
|
444
|
+
* preserves the digital strobe character. */
|
|
445
|
+
@keyframes cyber-pulse-exec {
|
|
446
|
+
0%, 49% {
|
|
447
|
+
box-shadow:
|
|
448
|
+
0 0 0 2px var(--neon-cyan),
|
|
449
|
+
0 0 32px 4px var(--neon-cyan),
|
|
450
|
+
0 0 64px 16px color-mix(in srgb, var(--neon-cyan) 35%, transparent),
|
|
451
|
+
inset 0 0 18px rgba(29, 217, 229, 0.3);
|
|
452
|
+
}
|
|
453
|
+
50%, 100% {
|
|
454
|
+
box-shadow:
|
|
455
|
+
0 0 0 2px var(--neon-cyan),
|
|
456
|
+
0 0 14px 2px color-mix(in srgb, var(--neon-cyan) 55%, transparent),
|
|
457
|
+
0 0 28px 6px color-mix(in srgb, var(--neon-cyan) 15%, transparent),
|
|
458
|
+
inset 0 0 8px rgba(29, 217, 229, 0.12);
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
:root[data-theme="cyber"] .sq-node[data-executing] .sq-node-box,
|
|
463
|
+
:root[data-theme="cyber"] .react-flow__node.executing .sq-node-box,
|
|
464
|
+
:root[data-theme="cyber"] .react-flow__node.executing .node {
|
|
465
|
+
animation: cyber-pulse-exec 1.6s steps(2) infinite;
|
|
466
|
+
border-color: var(--neon-cyan);
|
|
467
|
+
}
|
|
468
|
+
:root[data-theme="cyber"] .sq-node-pip {
|
|
469
|
+
border-radius: 0;
|
|
470
|
+
width: 8px; height: 8px;
|
|
471
|
+
box-shadow: 0 0 6px currentColor;
|
|
472
|
+
}
|
|
473
|
+
:root[data-theme="cyber"] .sq-node-gear {
|
|
474
|
+
background: var(--bg-app);
|
|
475
|
+
border: 1px solid var(--neon-cyan);
|
|
476
|
+
color: var(--neon-cyan);
|
|
477
|
+
border-radius: 0;
|
|
478
|
+
text-shadow: 0 0 3px currentColor;
|
|
479
|
+
}
|
|
480
|
+
:root[data-theme="cyber"] .sq-node-handle {
|
|
481
|
+
border-radius: 0;
|
|
482
|
+
background: var(--neon-magenta);
|
|
483
|
+
border-color: var(--neon-magenta);
|
|
484
|
+
box-shadow: 0 0 4px var(--neon-magenta);
|
|
485
|
+
}
|
|
486
|
+
:root[data-theme="cyber"] .sq-node-handle.out { background: var(--neon-cyan); border-color: var(--neon-cyan); box-shadow: 0 0 4px var(--neon-cyan); }
|
|
487
|
+
:root[data-theme="cyber"] .sq-node-label {
|
|
488
|
+
font-family: var(--font-mono);
|
|
489
|
+
text-transform: uppercase;
|
|
490
|
+
letter-spacing: 0.14em;
|
|
491
|
+
color: var(--neon-cyan);
|
|
492
|
+
text-shadow: 0 0 3px currentColor;
|
|
493
|
+
font-size: 10px;
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
/* ─── CATEGORIES — system blocks ─── */
|
|
497
|
+
:root[data-theme="cyber"] .cat {
|
|
498
|
+
background: rgba(0,0,0,0.4);
|
|
499
|
+
border: 1px solid var(--border-default);
|
|
500
|
+
border-radius: 0;
|
|
501
|
+
}
|
|
502
|
+
:root[data-theme="cyber"] .cat-head {
|
|
503
|
+
border-bottom: 1px solid var(--neon-magenta);
|
|
504
|
+
background: rgba(245,30,182,0.06);
|
|
505
|
+
}
|
|
506
|
+
:root[data-theme="cyber"] .cat-tile {
|
|
507
|
+
background: rgba(0,0,0,0.5);
|
|
508
|
+
border: 1px solid var(--cat-color, var(--neon-magenta));
|
|
509
|
+
color: var(--cat-color, var(--neon-magenta));
|
|
510
|
+
border-radius: 0;
|
|
511
|
+
box-shadow: 0 0 6px currentColor;
|
|
512
|
+
}
|
|
513
|
+
:root[data-theme="cyber"] .cat-name {
|
|
514
|
+
font-family: var(--font-display);
|
|
515
|
+
letter-spacing: 0.18em;
|
|
516
|
+
text-transform: uppercase;
|
|
517
|
+
color: var(--neon-magenta);
|
|
518
|
+
text-shadow: 0 0 4px currentColor;
|
|
519
|
+
}
|
|
520
|
+
:root[data-theme="cyber"] .cat-count {
|
|
521
|
+
background: var(--bg-app);
|
|
522
|
+
border: 1px solid var(--neon-cyan);
|
|
523
|
+
color: var(--neon-cyan);
|
|
524
|
+
border-radius: 0;
|
|
525
|
+
text-shadow: 0 0 3px currentColor;
|
|
526
|
+
}
|
|
527
|
+
:root[data-theme="cyber"] .cat-chev {
|
|
528
|
+
color: var(--neon-magenta);
|
|
529
|
+
text-shadow: 0 0 4px currentColor;
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
/* ─── COMP ITEMS ─── */
|
|
533
|
+
:root[data-theme="cyber"] .comp {
|
|
534
|
+
background: rgba(0,0,0,0.5);
|
|
535
|
+
border: 1px solid var(--border-default);
|
|
536
|
+
border-radius: 0;
|
|
537
|
+
position: relative;
|
|
538
|
+
}
|
|
539
|
+
:root[data-theme="cyber"] .comp::before {
|
|
540
|
+
content: ''; position: absolute; left: 0; top: 0; bottom: 0; width: 2px;
|
|
541
|
+
background: var(--cat-color, var(--neon-magenta));
|
|
542
|
+
opacity: 0.6;
|
|
543
|
+
}
|
|
544
|
+
:root[data-theme="cyber"] .comp:hover {
|
|
545
|
+
border-color: var(--cat-color, var(--neon-magenta));
|
|
546
|
+
background: rgba(245,30,182,0.08);
|
|
547
|
+
box-shadow: 0 0 12px rgba(245,30,182,0.3);
|
|
548
|
+
}
|
|
549
|
+
:root[data-theme="cyber"] .comp-ico {
|
|
550
|
+
background: rgba(0,0,0,0.6);
|
|
551
|
+
border: 1px solid var(--cat-color, var(--neon-magenta));
|
|
552
|
+
color: var(--cat-color, var(--neon-magenta));
|
|
553
|
+
border-radius: 0;
|
|
554
|
+
box-shadow: 0 0 6px currentColor;
|
|
555
|
+
}
|
|
556
|
+
:root[data-theme="cyber"] .comp-name {
|
|
557
|
+
font-family: var(--font-display);
|
|
558
|
+
letter-spacing: 0.10em;
|
|
559
|
+
text-transform: uppercase;
|
|
560
|
+
color: var(--neon-cyan);
|
|
561
|
+
text-shadow: 0 0 3px currentColor;
|
|
562
|
+
}
|
|
563
|
+
:root[data-theme="cyber"] .comp-desc {
|
|
564
|
+
font-family: var(--font-mono);
|
|
565
|
+
color: var(--fg-muted);
|
|
566
|
+
}
|
|
567
|
+
:root[data-theme="cyber"] .comp-grip { color: var(--neon-magenta); }
|
|
568
|
+
|
|
569
|
+
/* ─── MENU POP ─── */
|
|
570
|
+
:root[data-theme="cyber"] .menu-pop {
|
|
571
|
+
background: rgba(10,4,32,0.98);
|
|
572
|
+
border: 1px solid var(--neon-magenta);
|
|
573
|
+
border-radius: 0;
|
|
574
|
+
box-shadow:
|
|
575
|
+
inset 0 0 0 1px var(--bg-app),
|
|
576
|
+
inset 0 0 0 2px var(--neon-cyan),
|
|
577
|
+
0 0 30px rgba(245,30,182,0.4);
|
|
578
|
+
}
|
|
579
|
+
:root[data-theme="cyber"] .menu-pop-item {
|
|
580
|
+
font-family: var(--font-mono);
|
|
581
|
+
font-size: 12px;
|
|
582
|
+
color: var(--neon-cyan);
|
|
583
|
+
text-shadow: 0 0 3px currentColor;
|
|
584
|
+
}
|
|
585
|
+
:root[data-theme="cyber"] .menu-pop-item::before { content: '> '; opacity: 0.5; }
|
|
586
|
+
:root[data-theme="cyber"] .menu-pop-item:hover {
|
|
587
|
+
background: var(--bg-active);
|
|
588
|
+
color: var(--neon-magenta);
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
/* ─── SETTINGS SECTIONS ─── */
|
|
592
|
+
:root[data-theme="cyber"] .settings-section {
|
|
593
|
+
background: rgba(0,0,0,0.4);
|
|
594
|
+
border: 1px solid var(--neon-magenta);
|
|
595
|
+
border-radius: 0;
|
|
596
|
+
position: relative;
|
|
597
|
+
}
|
|
598
|
+
:root[data-theme="cyber"] .settings-section::before {
|
|
599
|
+
content: ''; position: absolute; left: 0; top: 0; right: 0; height: 2px;
|
|
600
|
+
background: var(--neon-magenta);
|
|
601
|
+
box-shadow: 0 0 8px var(--neon-magenta);
|
|
602
|
+
}
|
|
603
|
+
:root[data-theme="cyber"] .settings-section h3 {
|
|
604
|
+
color: var(--neon-cyan);
|
|
605
|
+
font-family: var(--font-display);
|
|
606
|
+
letter-spacing: 0.16em;
|
|
607
|
+
text-transform: uppercase;
|
|
608
|
+
text-shadow: 0 0 4px currentColor;
|
|
609
|
+
border-bottom: 1px solid var(--border-default);
|
|
610
|
+
padding-bottom: 8px;
|
|
611
|
+
}
|
|
612
|
+
:root[data-theme="cyber"] .settings-section h3::before { content: '◆ '; color: var(--neon-magenta); }
|
|
613
|
+
:root[data-theme="cyber"] .settings-summary {
|
|
614
|
+
background: rgba(0,0,0,0.6);
|
|
615
|
+
border: 1px solid var(--neon-cyan);
|
|
616
|
+
font-family: var(--font-mono);
|
|
617
|
+
color: var(--neon-cyan);
|
|
618
|
+
text-shadow: 0 0 3px currentColor;
|
|
619
|
+
border-radius: 0;
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
/* ─── CRED CARDS ─── */
|
|
623
|
+
:root[data-theme="cyber"] .cred-card {
|
|
624
|
+
background: rgba(0,0,0,0.5);
|
|
625
|
+
border: 1px solid var(--cred-color, var(--neon-magenta));
|
|
626
|
+
border-radius: 0;
|
|
627
|
+
box-shadow: 0 0 12px color-mix(in srgb, var(--cred-color, var(--neon-magenta)) 25%, transparent);
|
|
628
|
+
}
|
|
629
|
+
:root[data-theme="cyber"] .cred-card-head {
|
|
630
|
+
background: rgba(245,30,182,0.08);
|
|
631
|
+
border-bottom: 1px solid var(--cred-color, var(--neon-magenta));
|
|
632
|
+
}
|
|
633
|
+
:root[data-theme="cyber"] .cred-card .name {
|
|
634
|
+
font-family: var(--font-display);
|
|
635
|
+
letter-spacing: 0.18em;
|
|
636
|
+
text-transform: uppercase;
|
|
637
|
+
color: var(--cred-color, var(--neon-magenta));
|
|
638
|
+
text-shadow: 0 0 4px currentColor;
|
|
639
|
+
}
|
|
640
|
+
:root[data-theme="cyber"] .cred-tag {
|
|
641
|
+
font-family: var(--font-mono);
|
|
642
|
+
letter-spacing: 0.10em;
|
|
643
|
+
text-transform: uppercase;
|
|
644
|
+
border-radius: 0;
|
|
645
|
+
text-shadow: 0 0 3px currentColor;
|
|
646
|
+
font-size: 9px;
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
/* Credential rows — connection traces */
|
|
650
|
+
:root[data-theme="cyber"] .cred-row {
|
|
651
|
+
background: rgba(0, 0, 0, 0.4);
|
|
652
|
+
border: 1px solid var(--border-default);
|
|
653
|
+
border-radius: 0;
|
|
654
|
+
position: relative;
|
|
655
|
+
}
|
|
656
|
+
:root[data-theme="cyber"] .cred-row::before {
|
|
657
|
+
content: ''; position: absolute; left: 0; top: 0; bottom: 0; width: 2px;
|
|
658
|
+
background: var(--neon-magenta);
|
|
659
|
+
box-shadow: 0 0 6px var(--neon-magenta);
|
|
660
|
+
}
|
|
661
|
+
:root[data-theme="cyber"] .cred-row .name {
|
|
662
|
+
font-family: var(--font-display);
|
|
663
|
+
letter-spacing: 0.16em;
|
|
664
|
+
color: var(--neon-cyan);
|
|
665
|
+
text-shadow: 0 0 3px currentColor;
|
|
666
|
+
font-size: 11px;
|
|
667
|
+
}
|
|
668
|
+
:root[data-theme="cyber"] .cred-row .badge {
|
|
669
|
+
font-family: var(--font-mono);
|
|
670
|
+
font-size: 9px;
|
|
671
|
+
letter-spacing: 0.1em;
|
|
672
|
+
text-transform: uppercase;
|
|
673
|
+
border-radius: 0;
|
|
674
|
+
text-shadow: 0 0 3px currentColor;
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
/* ─── PARAMETER PANEL COLS ─── */
|
|
678
|
+
:root[data-theme="cyber"] .param-col {
|
|
679
|
+
background: rgba(0,0,0,0.4);
|
|
680
|
+
border-right: 1px solid var(--neon-magenta);
|
|
681
|
+
}
|
|
682
|
+
:root[data-theme="cyber"] .param-col-head {
|
|
683
|
+
background: rgba(245,30,182,0.10);
|
|
684
|
+
border-bottom: 1px solid var(--neon-magenta);
|
|
685
|
+
font-family: var(--font-display);
|
|
686
|
+
color: var(--neon-cyan);
|
|
687
|
+
letter-spacing: 0.16em;
|
|
688
|
+
text-transform: uppercase;
|
|
689
|
+
text-shadow: 0 0 3px currentColor;
|
|
690
|
+
}
|
|
691
|
+
:root[data-theme="cyber"] .json-block {
|
|
692
|
+
background: rgba(0,0,0,0.7);
|
|
693
|
+
border: 1px solid var(--border-default);
|
|
694
|
+
font-family: var(--font-mono);
|
|
695
|
+
color: var(--neon-green);
|
|
696
|
+
text-shadow: 0 0 3px currentColor;
|
|
697
|
+
border-radius: 0;
|
|
698
|
+
}
|
|
699
|
+
:root[data-theme="cyber"] .json-key { color: var(--neon-cyan); text-shadow: 0 0 3px currentColor; }
|
|
700
|
+
:root[data-theme="cyber"] .json-str { color: var(--neon-green); }
|
|
701
|
+
:root[data-theme="cyber"] .json-num { color: var(--neon-yellow); text-shadow: 0 0 3px currentColor; }
|
|
702
|
+
|
|
703
|
+
/* ─── CHAT TABS ─── */
|
|
704
|
+
:root[data-theme="cyber"] .chat-tab {
|
|
705
|
+
font-family: var(--font-display);
|
|
706
|
+
letter-spacing: 0.14em;
|
|
707
|
+
text-transform: uppercase;
|
|
708
|
+
font-size: 10px;
|
|
709
|
+
border-radius: 0;
|
|
710
|
+
color: var(--fg-muted);
|
|
711
|
+
}
|
|
712
|
+
:root[data-theme="cyber"] .chat-tab.active {
|
|
713
|
+
background: var(--neon-magenta);
|
|
714
|
+
color: var(--bg-app);
|
|
715
|
+
text-shadow: none;
|
|
716
|
+
box-shadow: 0 0 8px var(--neon-magenta);
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
/* ─── CHAT MESSAGES — DM transmission ─── */
|
|
720
|
+
:root[data-theme="cyber"] .chat-msg {
|
|
721
|
+
font-family: var(--font-mono);
|
|
722
|
+
font-size: 12px;
|
|
723
|
+
border-radius: 0;
|
|
724
|
+
position: relative;
|
|
725
|
+
}
|
|
726
|
+
:root[data-theme="cyber"] .chat-msg-user {
|
|
727
|
+
background: rgba(245, 30, 182, 0.15);
|
|
728
|
+
color: var(--neon-magenta);
|
|
729
|
+
border: 1px solid var(--neon-magenta);
|
|
730
|
+
text-shadow: 0 0 3px currentColor;
|
|
731
|
+
box-shadow: 0 0 8px rgba(245, 30, 182, 0.3);
|
|
732
|
+
}
|
|
733
|
+
:root[data-theme="cyber"] .chat-msg-user::before { content: '> USER:: '; opacity: 0.6; }
|
|
734
|
+
:root[data-theme="cyber"] .chat-msg-bot {
|
|
735
|
+
background: rgba(29, 217, 229, 0.08);
|
|
736
|
+
color: var(--neon-cyan);
|
|
737
|
+
border: 1px solid var(--neon-cyan);
|
|
738
|
+
text-shadow: 0 0 3px currentColor;
|
|
739
|
+
}
|
|
740
|
+
:root[data-theme="cyber"] .chat-msg-bot::before { content: '< NODE:: '; opacity: 0.6; }
|
|
741
|
+
|
|
742
|
+
/* ─── THEME SWITCHER ─── */
|
|
743
|
+
:root[data-theme="cyber"] .theme-switcher {
|
|
744
|
+
background: rgba(10, 4, 32, 0.95);
|
|
745
|
+
border: 1px solid var(--neon-magenta);
|
|
746
|
+
box-shadow: 0 0 16px rgba(245, 30, 182, 0.5);
|
|
747
|
+
}
|
|
748
|
+
:root[data-theme="cyber"] .theme-switcher button {
|
|
749
|
+
font-family: var(--font-display);
|
|
750
|
+
text-shadow: 0 0 4px currentColor;
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
/* ─── EMPTY STATE ─── */
|
|
754
|
+
:root[data-theme="cyber"] .empty-state .glyph {
|
|
755
|
+
font-family: var(--font-display);
|
|
756
|
+
font-size: 64px;
|
|
757
|
+
color: var(--neon-magenta);
|
|
758
|
+
text-shadow: 0 0 16px var(--neon-magenta);
|
|
759
|
+
}
|
|
760
|
+
|
|
761
|
+
/* ─── STATUS BAR — system console ─── */
|
|
762
|
+
:root[data-theme="cyber"] .statusbar {
|
|
763
|
+
background: rgba(5, 0, 16, 0.95);
|
|
764
|
+
border-top: 1px solid var(--neon-magenta);
|
|
765
|
+
box-shadow: 0 -1px 12px rgba(245, 30, 182, 0.3);
|
|
766
|
+
font-family: var(--font-mono);
|
|
767
|
+
color: var(--neon-cyan);
|
|
768
|
+
text-shadow: 0 0 3px currentColor;
|
|
769
|
+
letter-spacing: 0.08em;
|
|
770
|
+
}
|
|
771
|
+
:root[data-theme="cyber"] .statusbar .pip {
|
|
772
|
+
background: var(--neon-green);
|
|
773
|
+
box-shadow: 0 0 8px var(--neon-green);
|
|
774
|
+
animation: cyber-blink 1.4s steps(2) infinite;
|
|
775
|
+
border-radius: 0;
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
/* ─── MODAL — terminal popup ─── */
|
|
779
|
+
/* Wave 31.1: do NOT redeclare `position` here. The Modal component
|
|
780
|
+
* already sets `position: fixed` via Tailwind (Modal.tsx line 99), and
|
|
781
|
+
* Cyber's previous `position: relative` overrode it (selector
|
|
782
|
+
* specificity — :root[data-theme="cyber"] .modal beats a single-class
|
|
783
|
+
* .fixed utility), pulling the modal out of fixed positioning into
|
|
784
|
+
* normal document flow. The result was the parameter panel rendering
|
|
785
|
+
* off-screen / not visible under Cyber. The `.modal::before` scanline
|
|
786
|
+
* pseudo-element below uses `position: absolute; inset: 0` which
|
|
787
|
+
* anchors to the modal's fixed position fine — no positioning context
|
|
788
|
+
* needs to be declared here. */
|
|
789
|
+
:root[data-theme="cyber"] .modal {
|
|
790
|
+
background:
|
|
791
|
+
linear-gradient(180deg, rgba(245, 30, 182, 0.06), transparent 60px),
|
|
792
|
+
var(--bg-panel);
|
|
793
|
+
border: 1px solid var(--neon-magenta);
|
|
794
|
+
border-radius: 0;
|
|
795
|
+
box-shadow:
|
|
796
|
+
inset 0 0 0 1px var(--bg-app),
|
|
797
|
+
inset 0 0 0 2px var(--neon-cyan),
|
|
798
|
+
0 0 60px rgba(245, 30, 182, 0.5),
|
|
799
|
+
0 30px 80px rgba(0, 0, 0, 0.8);
|
|
800
|
+
}
|
|
801
|
+
:root[data-theme="cyber"] .modal::before {
|
|
802
|
+
content: ''; position: absolute; inset: 0;
|
|
803
|
+
background: repeating-linear-gradient(0deg, transparent 0 2px, rgba(0,0,0,0.2) 2px 3px);
|
|
804
|
+
pointer-events: none; mix-blend-mode: multiply;
|
|
805
|
+
}
|
|
806
|
+
:root[data-theme="cyber"] .modal-head {
|
|
807
|
+
border-bottom: 1px solid var(--neon-magenta);
|
|
808
|
+
background: linear-gradient(180deg, rgba(245, 30, 182, 0.12), transparent);
|
|
809
|
+
padding: 14px 18px;
|
|
810
|
+
}
|
|
811
|
+
:root[data-theme="cyber"] .modal-title {
|
|
812
|
+
color: var(--neon-magenta);
|
|
813
|
+
text-shadow: 0 0 4px currentColor;
|
|
814
|
+
font-family: var(--font-display);
|
|
815
|
+
}
|
|
816
|
+
:root[data-theme="cyber"] .modal-title::before { content: '◆ '; }
|
|
817
|
+
:root[data-theme="cyber"] .modal-foot {
|
|
818
|
+
border-top: 1px solid var(--border-default);
|
|
819
|
+
}
|
|
820
|
+
:root[data-theme="cyber"] .field label {
|
|
821
|
+
color: var(--neon-cyan);
|
|
822
|
+
text-shadow: 0 0 3px currentColor;
|
|
823
|
+
}
|
|
824
|
+
:root[data-theme="cyber"] .field label::before { content: '> '; opacity: 0.6; }
|
|
825
|
+
|
|
826
|
+
/* ─── COMMAND PALETTE — root terminal ─── */
|
|
827
|
+
:root[data-theme="cyber"] .cmdk {
|
|
828
|
+
background: rgba(10, 4, 32, 0.98);
|
|
829
|
+
border: 1px solid var(--neon-magenta);
|
|
830
|
+
border-radius: 0;
|
|
831
|
+
box-shadow:
|
|
832
|
+
inset 0 0 0 2px var(--bg-app),
|
|
833
|
+
inset 0 0 0 3px var(--neon-cyan),
|
|
834
|
+
0 0 60px rgba(245, 30, 182, 0.6);
|
|
835
|
+
}
|
|
836
|
+
:root[data-theme="cyber"] .cmdk input {
|
|
837
|
+
font-family: var(--font-mono);
|
|
838
|
+
font-size: 14px;
|
|
839
|
+
background: transparent;
|
|
840
|
+
color: var(--neon-magenta);
|
|
841
|
+
border-bottom: 1px solid var(--neon-magenta);
|
|
842
|
+
padding-left: 30px;
|
|
843
|
+
background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'><path d='M2 2 L6 6 L2 10' fill='none' stroke='%23f51eb6' stroke-width='1.5'/></svg>");
|
|
844
|
+
background-repeat: no-repeat;
|
|
845
|
+
background-position: 14px center;
|
|
846
|
+
background-size: 12px;
|
|
847
|
+
text-shadow: 0 0 4px currentColor;
|
|
848
|
+
caret-color: var(--neon-magenta);
|
|
849
|
+
}
|
|
850
|
+
:root[data-theme="cyber"] .cmdk input::placeholder { color: var(--fg-faint); }
|
|
851
|
+
:root[data-theme="cyber"] .cmdk-item {
|
|
852
|
+
font-family: var(--font-mono);
|
|
853
|
+
font-size: 12px;
|
|
854
|
+
border-radius: 0;
|
|
855
|
+
color: var(--fg-muted);
|
|
856
|
+
border-left: 2px solid transparent;
|
|
857
|
+
padding-left: 8px;
|
|
858
|
+
}
|
|
859
|
+
:root[data-theme="cyber"] .cmdk-item.active {
|
|
860
|
+
background: var(--bg-active);
|
|
861
|
+
color: var(--neon-magenta);
|
|
862
|
+
border-left-color: var(--neon-magenta);
|
|
863
|
+
text-shadow: 0 0 4px currentColor;
|
|
864
|
+
}
|
|
865
|
+
:root[data-theme="cyber"] .cmdk-item.active::after {
|
|
866
|
+
content: ' ◀'; margin-left: auto;
|
|
867
|
+
color: var(--neon-magenta);
|
|
868
|
+
animation: cyber-blink 0.6s steps(2) infinite;
|
|
869
|
+
}
|
|
870
|
+
:root[data-theme="cyber"] .cmdk-item kbd {
|
|
871
|
+
background: rgba(0,0,0,0.4);
|
|
872
|
+
border: 1px solid var(--neon-cyan);
|
|
873
|
+
color: var(--neon-cyan);
|
|
874
|
+
font-family: var(--font-mono);
|
|
875
|
+
border-radius: 0;
|
|
876
|
+
text-shadow: 0 0 3px currentColor;
|
|
877
|
+
}
|
|
878
|
+
|
|
879
|
+
/* Headings — neon glow + glitch on hover */
|
|
880
|
+
:root[data-theme="cyber"] .v-display {
|
|
881
|
+
font-family: var(--font-display);
|
|
882
|
+
letter-spacing: var(--type-tracking-display);
|
|
883
|
+
text-transform: uppercase;
|
|
884
|
+
color: var(--neon-magenta);
|
|
885
|
+
text-shadow:
|
|
886
|
+
0 0 4px var(--neon-magenta),
|
|
887
|
+
0 0 12px var(--neon-magenta),
|
|
888
|
+
1px 0 0 var(--neon-cyan);
|
|
889
|
+
}
|
|
890
|
+
:root[data-theme="cyber"] .v-display:hover { animation: cyber-glitch 0.4s steps(8); }
|