diff --git a/config/api.py b/config/api.py
index 6aced9b6..8d8715bd 100644
--- a/config/api.py
+++ b/config/api.py
@@ -2,7 +2,7 @@
模型的 API 端点 / 密钥 / 模型 ID 现已统一由 ``config/custom_models.json``
(经 ``config/model_profiles.py`` 解析为模型档案)描述,并在运行时通过
-``DeepSeekClient.apply_profile`` 注入。旧的 ``AGENT_API_BASE_URL`` /
+``APIClient.apply_profile`` 注入。旧的 ``AGENT_API_BASE_URL`` /
``AGENT_API_KEY`` / ``AGENT_MODEL_ID``(以及 THINKING / TITLE 三件套)属于早期
把模型逻辑硬编码在程序里的残留,已移除。没有任何可用模型时,
``model_profiles.get_default_model_key`` 会直接报错提示去配置模型。
diff --git a/core/__pycache__/main_terminal.cpython-312.pyc b/core/__pycache__/main_terminal.cpython-312.pyc
deleted file mode 100644
index d4ab76a9..00000000
Binary files a/core/__pycache__/main_terminal.cpython-312.pyc and /dev/null differ
diff --git a/core/__pycache__/tool_config.cpython-312.pyc b/core/__pycache__/tool_config.cpython-312.pyc
deleted file mode 100644
index 2a48077d..00000000
Binary files a/core/__pycache__/tool_config.cpython-312.pyc and /dev/null differ
diff --git a/core/__pycache__/web_terminal.cpython-312.pyc b/core/__pycache__/web_terminal.cpython-312.pyc
deleted file mode 100644
index 1a7a87b5..00000000
Binary files a/core/__pycache__/web_terminal.cpython-312.pyc and /dev/null differ
diff --git a/core/main_terminal.py b/core/main_terminal.py
index f7eadd05..4b3bf3ef 100644
--- a/core/main_terminal.py
+++ b/core/main_terminal.py
@@ -57,7 +57,7 @@ from modules.mcp_client_manager import MCPClientManager
from core.tool_config import TOOL_CATEGORIES
-from utils.api_client import DeepSeekClient
+from utils.api_client import APIClient
from utils.context_manager import ContextManager
from utils.conversation_manager import ConversationManager
from utils.host_workspace_debug import write_host_workspace_debug
@@ -98,7 +98,7 @@ class MainTerminal(MainTerminalCommandMixin, MainTerminalContextMixin, MainTermi
self.usage_tracker = usage_tracker
# 初始化组件
- self.api_client = DeepSeekClient(thinking_mode=self.thinking_mode)
+ self.api_client = APIClient(thinking_mode=self.thinking_mode)
self.api_client.project_path = project_path
self.model_key = get_default_model_key()
self.model_profile = get_model_profile(self.model_key)
diff --git a/core/main_terminal_parts/commands.py b/core/main_terminal_parts/commands.py
index 694a3ef0..fbb742fa 100644
--- a/core/main_terminal_parts/commands.py
+++ b/core/main_terminal_parts/commands.py
@@ -71,7 +71,7 @@ except ImportError:
from modules.container_monitor import collect_stats, inspect_state
from core.tool_config import TOOL_CATEGORIES
-from utils.api_client import DeepSeekClient
+from utils.api_client import APIClient
from utils.context_manager import ContextManager
from utils.tool_result_formatter import (
extract_mcp_content_for_context,
diff --git a/core/main_terminal_parts/context/base.py b/core/main_terminal_parts/context/base.py
index e6bfd550..003c6e47 100644
--- a/core/main_terminal_parts/context/base.py
+++ b/core/main_terminal_parts/context/base.py
@@ -70,7 +70,7 @@ from modules.custom_tool_executor import CustomToolExecutor
from modules.container_monitor import collect_stats, inspect_state
from core.tool_config import TOOL_CATEGORIES
-from utils.api_client import DeepSeekClient
+from utils.api_client import APIClient
from utils.context_manager import ContextManager, AUTO_SHALLOW_PLACEHOLDER
from utils.host_workspace_debug import write_host_workspace_debug
from utils.tool_result_formatter import format_tool_result_for_context
diff --git a/core/main_terminal_parts/context/conversation.py b/core/main_terminal_parts/context/conversation.py
index e3987321..4222ce8b 100644
--- a/core/main_terminal_parts/context/conversation.py
+++ b/core/main_terminal_parts/context/conversation.py
@@ -70,7 +70,7 @@ from modules.custom_tool_executor import CustomToolExecutor
from modules.container_monitor import collect_stats, inspect_state
from core.tool_config import TOOL_CATEGORIES
-from utils.api_client import DeepSeekClient
+from utils.api_client import APIClient
from utils.context_manager import ContextManager, AUTO_SHALLOW_PLACEHOLDER
from utils.host_workspace_debug import write_host_workspace_debug
from utils.tool_result_formatter import format_tool_result_for_context
diff --git a/core/main_terminal_parts/context/memory.py b/core/main_terminal_parts/context/memory.py
index 53f8e5b8..3c49e283 100644
--- a/core/main_terminal_parts/context/memory.py
+++ b/core/main_terminal_parts/context/memory.py
@@ -72,7 +72,7 @@ from modules.custom_tool_executor import CustomToolExecutor
from modules.container_monitor import collect_stats, inspect_state
from core.tool_config import TOOL_CATEGORIES
-from utils.api_client import DeepSeekClient
+from utils.api_client import APIClient
from utils.context_manager import ContextManager, AUTO_SHALLOW_PLACEHOLDER
from utils.host_workspace_debug import write_host_workspace_debug
from utils.tool_result_formatter import format_tool_result_for_context
diff --git a/core/main_terminal_parts/context/messages.py b/core/main_terminal_parts/context/messages.py
index a0dcdd19..6cc724d8 100644
--- a/core/main_terminal_parts/context/messages.py
+++ b/core/main_terminal_parts/context/messages.py
@@ -71,7 +71,7 @@ from modules.custom_tool_executor import CustomToolExecutor
from modules.container_monitor import collect_stats, inspect_state
from core.tool_config import TOOL_CATEGORIES
-from utils.api_client import DeepSeekClient
+from utils.api_client import APIClient
from utils.context_manager import ContextManager, AUTO_SHALLOW_PLACEHOLDER
from utils.host_workspace_debug import write_host_workspace_debug
from utils.tool_result_formatter import format_tool_result_for_context
diff --git a/core/main_terminal_parts/context/mode.py b/core/main_terminal_parts/context/mode.py
index 991d4348..9b3cca92 100644
--- a/core/main_terminal_parts/context/mode.py
+++ b/core/main_terminal_parts/context/mode.py
@@ -70,7 +70,7 @@ from modules.custom_tool_executor import CustomToolExecutor
from modules.container_monitor import collect_stats, inspect_state
from core.tool_config import TOOL_CATEGORIES
-from utils.api_client import DeepSeekClient
+from utils.api_client import APIClient
from utils.context_manager import ContextManager, AUTO_SHALLOW_PLACEHOLDER
from utils.host_workspace_debug import write_host_workspace_debug
from utils.tool_result_formatter import format_tool_result_for_context
diff --git a/core/main_terminal_parts/context/prompt.py b/core/main_terminal_parts/context/prompt.py
index 51bb1876..230e234b 100644
--- a/core/main_terminal_parts/context/prompt.py
+++ b/core/main_terminal_parts/context/prompt.py
@@ -70,7 +70,7 @@ from modules.custom_tool_executor import CustomToolExecutor
from modules.container_monitor import collect_stats, inspect_state
from core.tool_config import TOOL_CATEGORIES
-from utils.api_client import DeepSeekClient
+from utils.api_client import APIClient
from utils.context_manager import ContextManager, AUTO_SHALLOW_PLACEHOLDER
from utils.host_workspace_debug import write_host_workspace_debug
from utils.tool_result_formatter import format_tool_result_for_context
diff --git a/core/main_terminal_parts/tools_definition/agent_tools.py b/core/main_terminal_parts/tools_definition/agent_tools.py
index fa6fd91a..b9af9447 100644
--- a/core/main_terminal_parts/tools_definition/agent_tools.py
+++ b/core/main_terminal_parts/tools_definition/agent_tools.py
@@ -68,7 +68,7 @@ from modules.mcp_server_registry import MCPServerRegistry, build_default_mcp_cat
from modules.container_monitor import collect_stats, inspect_state
from core.tool_config import TOOL_CATEGORIES
-from utils.api_client import DeepSeekClient
+from utils.api_client import APIClient
from utils.context_manager import ContextManager
from utils.tool_result_formatter import format_tool_result_for_context
from utils.logger import setup_logger
diff --git a/core/main_terminal_parts/tools_definition/base.py b/core/main_terminal_parts/tools_definition/base.py
index eb73af18..9b1971d7 100644
--- a/core/main_terminal_parts/tools_definition/base.py
+++ b/core/main_terminal_parts/tools_definition/base.py
@@ -68,7 +68,7 @@ from modules.mcp_server_registry import MCPServerRegistry, build_default_mcp_cat
from modules.container_monitor import collect_stats, inspect_state
from core.tool_config import TOOL_CATEGORIES
-from utils.api_client import DeepSeekClient
+from utils.api_client import APIClient
from utils.context_manager import ContextManager
from utils.tool_result_formatter import format_tool_result_for_context
from utils.logger import setup_logger
diff --git a/core/main_terminal_parts/tools_definition/context_tools.py b/core/main_terminal_parts/tools_definition/context_tools.py
index 5a395580..0fcb8e07 100644
--- a/core/main_terminal_parts/tools_definition/context_tools.py
+++ b/core/main_terminal_parts/tools_definition/context_tools.py
@@ -68,7 +68,7 @@ from modules.mcp_server_registry import MCPServerRegistry, build_default_mcp_cat
from modules.container_monitor import collect_stats, inspect_state
from core.tool_config import TOOL_CATEGORIES
-from utils.api_client import DeepSeekClient
+from utils.api_client import APIClient
from utils.context_manager import ContextManager
from utils.tool_result_formatter import format_tool_result_for_context
from utils.logger import setup_logger
diff --git a/core/main_terminal_parts/tools_definition/core_tools.py b/core/main_terminal_parts/tools_definition/core_tools.py
index d24f055c..92715e5d 100644
--- a/core/main_terminal_parts/tools_definition/core_tools.py
+++ b/core/main_terminal_parts/tools_definition/core_tools.py
@@ -68,7 +68,7 @@ from modules.mcp_server_registry import MCPServerRegistry, build_default_mcp_cat
from modules.container_monitor import collect_stats, inspect_state
from core.tool_config import TOOL_CATEGORIES
-from utils.api_client import DeepSeekClient
+from utils.api_client import APIClient
from utils.context_manager import ContextManager
from utils.tool_result_formatter import format_tool_result_for_context
from utils.logger import setup_logger
diff --git a/core/main_terminal_parts/tools_definition/custom_mcp.py b/core/main_terminal_parts/tools_definition/custom_mcp.py
index 1daf1dcc..157494e6 100644
--- a/core/main_terminal_parts/tools_definition/custom_mcp.py
+++ b/core/main_terminal_parts/tools_definition/custom_mcp.py
@@ -68,7 +68,7 @@ from modules.mcp_server_registry import MCPServerRegistry, build_default_mcp_cat
from modules.container_monitor import collect_stats, inspect_state
from core.tool_config import TOOL_CATEGORIES
-from utils.api_client import DeepSeekClient
+from utils.api_client import APIClient
from utils.context_manager import ContextManager
from utils.tool_result_formatter import format_tool_result_for_context
from utils.logger import setup_logger
@@ -193,7 +193,7 @@ class ToolsDefinitionCustomMcpMixin:
self.mcp_tool_alias_map = {}
return []
try:
- tool_defs, alias_map = manager.build_openai_tools(
+ tool_defs, alias_map = manager.build_llm_tools(
ensure_discovery=True,
discovery_timeout_seconds=10,
)
diff --git a/core/main_terminal_parts/tools_definition/file_tools.py b/core/main_terminal_parts/tools_definition/file_tools.py
index fb6ffefb..800bb174 100644
--- a/core/main_terminal_parts/tools_definition/file_tools.py
+++ b/core/main_terminal_parts/tools_definition/file_tools.py
@@ -68,7 +68,7 @@ from modules.mcp_server_registry import MCPServerRegistry, build_default_mcp_cat
from modules.container_monitor import collect_stats, inspect_state
from core.tool_config import TOOL_CATEGORIES
-from utils.api_client import DeepSeekClient
+from utils.api_client import APIClient
from utils.context_manager import ContextManager
from utils.tool_result_formatter import format_tool_result_for_context
from utils.logger import setup_logger
diff --git a/core/main_terminal_parts/tools_definition/main.py b/core/main_terminal_parts/tools_definition/main.py
index 43a22ad8..c9bfc47e 100644
--- a/core/main_terminal_parts/tools_definition/main.py
+++ b/core/main_terminal_parts/tools_definition/main.py
@@ -68,7 +68,7 @@ from modules.mcp_server_registry import MCPServerRegistry, build_default_mcp_cat
from modules.container_monitor import collect_stats, inspect_state
from core.tool_config import TOOL_CATEGORIES
-from utils.api_client import DeepSeekClient
+from utils.api_client import APIClient
from utils.context_manager import ContextManager
from utils.tool_result_formatter import format_tool_result_for_context
from utils.logger import setup_logger
diff --git a/core/main_terminal_parts/tools_definition/misc_tools.py b/core/main_terminal_parts/tools_definition/misc_tools.py
index 758880df..d8fb9e3e 100644
--- a/core/main_terminal_parts/tools_definition/misc_tools.py
+++ b/core/main_terminal_parts/tools_definition/misc_tools.py
@@ -68,7 +68,7 @@ from modules.mcp_server_registry import MCPServerRegistry, build_default_mcp_cat
from modules.container_monitor import collect_stats, inspect_state
from core.tool_config import TOOL_CATEGORIES
-from utils.api_client import DeepSeekClient
+from utils.api_client import APIClient
from utils.context_manager import ContextManager
from utils.tool_result_formatter import format_tool_result_for_context
from utils.logger import setup_logger
diff --git a/core/main_terminal_parts/tools_definition/search_web_tools.py b/core/main_terminal_parts/tools_definition/search_web_tools.py
index f6495a1a..a2ebe6dc 100644
--- a/core/main_terminal_parts/tools_definition/search_web_tools.py
+++ b/core/main_terminal_parts/tools_definition/search_web_tools.py
@@ -68,7 +68,7 @@ from modules.mcp_server_registry import MCPServerRegistry, build_default_mcp_cat
from modules.container_monitor import collect_stats, inspect_state
from core.tool_config import TOOL_CATEGORIES
-from utils.api_client import DeepSeekClient
+from utils.api_client import APIClient
from utils.context_manager import ContextManager
from utils.tool_result_formatter import format_tool_result_for_context
from utils.logger import setup_logger
diff --git a/core/main_terminal_parts/tools_definition/terminal_tools.py b/core/main_terminal_parts/tools_definition/terminal_tools.py
index 15bd4c4f..4fdce0b5 100644
--- a/core/main_terminal_parts/tools_definition/terminal_tools.py
+++ b/core/main_terminal_parts/tools_definition/terminal_tools.py
@@ -68,7 +68,7 @@ from modules.mcp_server_registry import MCPServerRegistry, build_default_mcp_cat
from modules.container_monitor import collect_stats, inspect_state
from core.tool_config import TOOL_CATEGORIES
-from utils.api_client import DeepSeekClient
+from utils.api_client import APIClient
from utils.context_manager import ContextManager
from utils.tool_result_formatter import format_tool_result_for_context
from utils.logger import setup_logger
diff --git a/core/main_terminal_parts/tools_execution.py b/core/main_terminal_parts/tools_execution.py
index 16fed75f..ab712825 100644
--- a/core/main_terminal_parts/tools_execution.py
+++ b/core/main_terminal_parts/tools_execution.py
@@ -95,7 +95,7 @@ from modules.custom_tool_executor import CustomToolExecutor
from modules.container_monitor import collect_stats, inspect_state
from core.tool_config import TOOL_CATEGORIES
-from utils.api_client import DeepSeekClient
+from utils.api_client import APIClient
from utils.context_manager import ContextManager
from utils.tool_result_formatter import format_tool_result_for_context
from utils.logger import setup_logger
@@ -972,7 +972,7 @@ class MainTerminalToolsExecutionMixin:
servers = [item for item in servers if item.get("id") == server_id]
# 读取当前 alias 映射(不强制再次发现)
- _, alias_map = manager.build_openai_tools(ensure_discovery=False)
+ _, alias_map = manager.build_llm_tools(ensure_discovery=False)
aliases_by_server = {}
for alias, binding in (alias_map or {}).items():
sid = getattr(binding, "server_id", "")
diff --git a/core/main_terminal_parts/tools_policy.py b/core/main_terminal_parts/tools_policy.py
index fd569866..e37a415b 100644
--- a/core/main_terminal_parts/tools_policy.py
+++ b/core/main_terminal_parts/tools_policy.py
@@ -73,7 +73,7 @@ except ImportError:
from modules.container_monitor import collect_stats, inspect_state
from core.tool_config import TOOL_CATEGORIES
-from utils.api_client import DeepSeekClient
+from utils.api_client import APIClient
from utils.context_manager import ContextManager
from utils.tool_result_formatter import format_tool_result_for_context
from utils.logger import setup_logger
diff --git a/core/main_terminal_parts/tools_read.py b/core/main_terminal_parts/tools_read.py
index a362e0ff..06313f13 100644
--- a/core/main_terminal_parts/tools_read.py
+++ b/core/main_terminal_parts/tools_read.py
@@ -72,7 +72,7 @@ from modules.custom_tool_executor import CustomToolExecutor
from modules.container_monitor import collect_stats, inspect_state
from core.tool_config import TOOL_CATEGORIES
-from utils.api_client import DeepSeekClient
+from utils.api_client import APIClient
from utils.context_manager import ContextManager
from utils.tool_result_formatter import format_tool_result_for_context
from utils.logger import setup_logger
diff --git a/modules/__pycache__/file_manager.cpython-312.pyc b/modules/__pycache__/file_manager.cpython-312.pyc
deleted file mode 100644
index d65580a4..00000000
Binary files a/modules/__pycache__/file_manager.cpython-312.pyc and /dev/null differ
diff --git a/modules/__pycache__/gui_file_manager.cpython-312.pyc b/modules/__pycache__/gui_file_manager.cpython-312.pyc
deleted file mode 100644
index 98f4d2ec..00000000
Binary files a/modules/__pycache__/gui_file_manager.cpython-312.pyc and /dev/null differ
diff --git a/modules/__pycache__/memory_manager.cpython-312.pyc b/modules/__pycache__/memory_manager.cpython-312.pyc
deleted file mode 100644
index 70c6f5b4..00000000
Binary files a/modules/__pycache__/memory_manager.cpython-312.pyc and /dev/null differ
diff --git a/modules/__pycache__/persistent_terminal.cpython-312.pyc b/modules/__pycache__/persistent_terminal.cpython-312.pyc
deleted file mode 100644
index f1945452..00000000
Binary files a/modules/__pycache__/persistent_terminal.cpython-312.pyc and /dev/null differ
diff --git a/modules/__pycache__/search_engine.cpython-312.pyc b/modules/__pycache__/search_engine.cpython-312.pyc
deleted file mode 100644
index 697f3197..00000000
Binary files a/modules/__pycache__/search_engine.cpython-312.pyc and /dev/null differ
diff --git a/modules/__pycache__/terminal_manager.cpython-312.pyc b/modules/__pycache__/terminal_manager.cpython-312.pyc
deleted file mode 100644
index 7d051e16..00000000
Binary files a/modules/__pycache__/terminal_manager.cpython-312.pyc and /dev/null differ
diff --git a/modules/__pycache__/terminal_ops.cpython-312.pyc b/modules/__pycache__/terminal_ops.cpython-312.pyc
deleted file mode 100644
index a4f79ec3..00000000
Binary files a/modules/__pycache__/terminal_ops.cpython-312.pyc and /dev/null differ
diff --git a/modules/__pycache__/todo_manager.cpython-312.pyc b/modules/__pycache__/todo_manager.cpython-312.pyc
deleted file mode 100644
index f9f4b10f..00000000
Binary files a/modules/__pycache__/todo_manager.cpython-312.pyc and /dev/null differ
diff --git a/modules/__pycache__/user_manager.cpython-312.pyc b/modules/__pycache__/user_manager.cpython-312.pyc
deleted file mode 100644
index a1464548..00000000
Binary files a/modules/__pycache__/user_manager.cpython-312.pyc and /dev/null differ
diff --git a/modules/__pycache__/webpage_extractor.cpython-312.pyc b/modules/__pycache__/webpage_extractor.cpython-312.pyc
deleted file mode 100644
index 2cf9bd75..00000000
Binary files a/modules/__pycache__/webpage_extractor.cpython-312.pyc and /dev/null differ
diff --git a/modules/mcp_client_manager/manager.py b/modules/mcp_client_manager/manager.py
index b47c8e78..c9a77ab7 100644
--- a/modules/mcp_client_manager/manager.py
+++ b/modules/mcp_client_manager/manager.py
@@ -389,7 +389,7 @@ class MCPClientManager:
continue
yield item
- def build_openai_tools(
+ def build_llm_tools(
self,
*,
ensure_discovery: bool = True,
@@ -461,7 +461,7 @@ class MCPClientManager:
return self._latest_alias_map[tool_alias]
# 容错:从缓存动态重建一遍
- _, rebuilt = self.build_openai_tools(ensure_discovery=False)
+ _, rebuilt = self.build_llm_tools(ensure_discovery=False)
return rebuilt.get(tool_alias)
def call_tool_by_alias(
diff --git a/modules/shallow_versioning.py b/modules/shallow_versioning.py
index e8ee84c0..98462dc6 100644
--- a/modules/shallow_versioning.py
+++ b/modules/shallow_versioning.py
@@ -1,6 +1,6 @@
"""Conversation-scoped shallow file versioning for workspace edits.
-Mirrors Claude Code's file-history approach:
+Mirrors the file-history approach of mainstream AI coding tools:
- Only files touched by write_file / edit_file are tracked.
- Before each edit the current content is backed up.
- A snapshot is taken per user message, referencing the latest backup version
diff --git a/modules/sub_agent/task.py b/modules/sub_agent/task.py
index e20442c6..3e8e1bd6 100644
--- a/modules/sub_agent/task.py
+++ b/modules/sub_agent/task.py
@@ -20,7 +20,7 @@ from modules.sub_agent.toolkit import (
_format_tool_result,
_build_sub_agent_profile,
)
-from utils.api_client import DeepSeekClient
+from utils.api_client import APIClient
from utils.logger import setup_logger
if TYPE_CHECKING:
@@ -540,7 +540,7 @@ class SubAgentTask:
return True
def _build_client(self) -> tuple:
- """加载模型配置并初始化 DeepSeekClient。"""
+ """加载模型配置并初始化 APIClient。"""
config_path = self.manager.models_config_file
models: List[Dict[str, Any]] = []
default_key = ""
@@ -567,7 +567,7 @@ class SubAgentTask:
if chosen_key not in model_map:
raise RuntimeError(f"未找到可用子智能体模型配置: {config_path}")
- client = DeepSeekClient(thinking_mode=(self.thinking_mode == "thinking"), web_mode=True)
+ client = APIClient(thinking_mode=(self.thinking_mode == "thinking"), web_mode=True)
client.model_key = chosen_key
client.project_path = str(self.manager.project_path)
client.apply_profile(model_map[chosen_key])
@@ -575,7 +575,7 @@ class SubAgentTask:
async def _call_model(
self,
- client: DeepSeekClient,
+ client: APIClient,
model_key: str,
tools: List[Dict[str, Any]],
) -> tuple:
diff --git a/modules/sub_agent/toolkit.py b/modules/sub_agent/toolkit.py
index 356de3b7..6f71ba05 100644
--- a/modules/sub_agent/toolkit.py
+++ b/modules/sub_agent/toolkit.py
@@ -355,7 +355,7 @@ def _format_tool_result(name: str, raw: Any) -> str:
def _build_sub_agent_profile(model_raw: Dict[str, Any]) -> Optional[Dict[str, Any]]:
- """把 sub_agent_models.json 中的模型条目转成 DeepSeekClient.apply_profile 所需格式。"""
+ """把 sub_agent_models.json 中的模型条目转成 APIClient.apply_profile 所需格式。"""
name = str(model_raw.get("name") or model_raw.get("model_name") or model_raw.get("model") or "").strip()
url = str(_parse_env_ref(model_raw.get("url") or model_raw.get("base_url") or "") or "").strip()
api_key = str(_parse_env_ref(model_raw.get("apikey") or model_raw.get("api_key") or "") or "").strip()
diff --git a/server/app_legacy.py b/server/app_legacy.py
index d4cfe813..7e617e55 100644
--- a/server/app_legacy.py
+++ b/server/app_legacy.py
@@ -248,7 +248,7 @@ from modules.user_container_manager import UserContainerManager
from modules.usage_tracker import UsageTracker, QUOTA_DEFAULTS
from utils.tool_result_formatter import format_tool_result_for_context
from utils.conversation_manager import ConversationManager
-from utils.api_client import DeepSeekClient
+from utils.api_client import APIClient
from .files import files_bp
app = Flask(__name__, static_folder=str(PROJECT_ROOT / 'static'))
@@ -480,7 +480,7 @@ async def _generate_title_async(user_message: str) -> Optional[str]:
if not user_message:
_title_debug_log("skip_empty_user_message")
return None
- client = DeepSeekClient(thinking_mode=False, web_mode=True)
+ client = APIClient(thinking_mode=False, web_mode=True)
try:
default_model = get_default_model_key()
client.model_key = default_model
diff --git a/server/chat_flow_helpers.py b/server/chat_flow_helpers.py
index b79708de..e5361f11 100644
--- a/server/chat_flow_helpers.py
+++ b/server/chat_flow_helpers.py
@@ -10,7 +10,7 @@ from typing import Any, Dict, List, Optional
from core.web_terminal import WebTerminal
from config import LOGS_DIR
-from utils.api_client import DeepSeekClient
+from utils.api_client import APIClient
from config.model_profiles import get_default_model_key, get_model_profile
TITLE_DEBUG_DIR = Path(LOGS_DIR).expanduser().resolve() / "title_debug"
@@ -51,7 +51,7 @@ async def _generate_title_async(
_title_debug_log("skip_empty_user_message")
return None
- client = DeepSeekClient(thinking_mode=False, web_mode=True)
+ client = APIClient(thinking_mode=False, web_mode=True)
try:
default_model = get_default_model_key()
client.model_key = default_model
diff --git a/server/conversation.py b/server/conversation.py
index 9c7df6d3..11853594 100644
--- a/server/conversation.py
+++ b/server/conversation.py
@@ -57,7 +57,7 @@ from utils.perf_log import perf_log, PerfTimer
from core.web_terminal import WebTerminal
from utils.tool_result_formatter import format_tool_result_for_context
from utils.conversation_manager import ConversationManager
-from utils.api_client import DeepSeekClient
+from utils.api_client import APIClient
from .auth_helpers import api_login_required, resolve_admin_policy, get_current_user_record, get_current_username
from .context import with_terminal, get_terminal_for_sid, get_gui_manager, get_upload_guard, build_upload_error_response, ensure_conversation_loaded, reset_system_state, get_user_resources, get_or_create_usage_tracker
diff --git a/static/login.html b/static/login.html
index fdf0dd5f..9587aa21 100644
--- a/static/login.html
+++ b/static/login.html
@@ -12,11 +12,11 @@
(function () {
try {
var key = window.localStorage.getItem('agents_ui_theme');
- var theme = key === 'light' || key === 'dark' || key === 'claude' ? key : 'claude';
+ var theme = key === 'light' || key === 'dark' || key === 'classic' ? key : 'classic';
document.documentElement.setAttribute('data-theme', theme);
document.body && document.body.setAttribute('data-theme', theme);
} catch (_e) {
- document.documentElement.setAttribute('data-theme', 'claude');
+ document.documentElement.setAttribute('data-theme', 'classic');
}
})();
diff --git a/static/register.html b/static/register.html
index a1daadd9..aae8d40a 100644
--- a/static/register.html
+++ b/static/register.html
@@ -12,11 +12,11 @@
(function () {
try {
var key = window.localStorage.getItem('agents_ui_theme');
- var theme = key === 'light' || key === 'dark' || key === 'claude' ? key : 'claude';
+ var theme = key === 'light' || key === 'dark' || key === 'classic' ? key : 'classic';
document.documentElement.setAttribute('data-theme', theme);
document.body && document.body.setAttribute('data-theme', theme);
} catch (_e) {
- document.documentElement.setAttribute('data-theme', 'claude');
+ document.documentElement.setAttribute('data-theme', 'classic');
}
})();
diff --git a/static/src/admin/AdminDashboardApp.vue b/static/src/admin/AdminDashboardApp.vue
index c29dcb59..e0a80813 100644
--- a/static/src/admin/AdminDashboardApp.vue
+++ b/static/src/admin/AdminDashboardApp.vue
@@ -977,7 +977,7 @@ button {
border: none;
border-radius: 999px;
padding: 10px 18px;
- background: var(--claude-highlight);
+ background: var(--highlight);
color: #3b2f1d;
font-weight: 600;
cursor: pointer;
@@ -996,7 +996,7 @@ button:disabled {
button:not(:disabled):hover {
transform: translateY(-1px);
- background: var(--claude-accent);
+ background: var(--accent);
box-shadow: 0 8px 16px rgba(189, 93, 58, 0.25);
}
@@ -1057,7 +1057,7 @@ button:not(:disabled):hover {
border-radius: 28px;
padding: 24px;
border: 1px solid rgba(118, 103, 84, 0.35);
- box-shadow: var(--claude-shadow);
+ box-shadow: var(--shadow-card);
color: #23170b;
}
@@ -1077,7 +1077,7 @@ button:not(:disabled):hover {
.metric-card h3 {
margin: 0;
font-size: 13px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
letter-spacing: 0.08em;
}
@@ -1126,7 +1126,7 @@ button:not(:disabled):hover {
font-size: 12px;
letter-spacing: 0.08em;
text-transform: uppercase;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.token-card strong {
@@ -1160,7 +1160,7 @@ button:not(:disabled):hover {
.token-breakdown-header span {
font-size: 12px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.token-table-wrapper {
@@ -1195,7 +1195,7 @@ button:not(:disabled):hover {
.token-empty {
margin: 0;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 13px;
}
@@ -1214,7 +1214,7 @@ button:not(:disabled):hover {
.leader-card h3 {
margin: 0 0 10px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 14px;
}
@@ -1234,7 +1234,7 @@ button:not(:disabled):hover {
}
.leader-card .muted {
- color: var(--claude-muted);
+ color: var(--text-muted);
}
.table-wrapper {
@@ -1274,7 +1274,7 @@ th {
.status-badge.online {
background: rgba(118, 176, 134, 0.18);
- color: var(--claude-success);
+ color: var(--state-success);
}
.status-badge.offline {
@@ -1284,12 +1284,12 @@ th {
.status-badge.warning {
background: rgba(217, 152, 69, 0.2);
- color: var(--claude-warning);
+ color: var(--state-warning);
}
.status-badge.danger {
background: rgba(189, 93, 58, 0.18);
- color: var(--claude-accent-strong);
+ color: var(--accent-strong);
}
.progress-bar {
@@ -1302,7 +1302,7 @@ th {
.progress-bar span {
display: block;
height: 100%;
- background: linear-gradient(90deg, var(--claude-highlight), var(--claude-accent));
+ background: linear-gradient(90deg, var(--highlight), var(--accent));
}
.upload-feed {
@@ -1329,7 +1329,7 @@ th {
display: flex;
gap: 10px;
flex-wrap: wrap;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 12px;
}
@@ -1366,7 +1366,7 @@ th {
display: inline-flex;
align-items: center;
gap: 6px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 13px;
}
@@ -1383,7 +1383,7 @@ th {
}
.invite-card span {
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 13px;
}
@@ -1416,7 +1416,7 @@ th {
align-items: center;
justify-content: center;
gap: 16px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.spinner {
@@ -1497,7 +1497,7 @@ th {
.password-field label {
font-size: 13px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-weight: 600;
}
@@ -1569,7 +1569,7 @@ th {
.user-search-selected .user-search-email {
font-size: 12px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
@@ -1582,7 +1582,7 @@ th {
.user-search-arrow {
font-size: 12px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
transition: transform 0.15s ease;
flex-shrink: 0;
}
@@ -1650,7 +1650,7 @@ th {
.user-search-item .user-search-email {
font-size: 12px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
@@ -1669,7 +1669,7 @@ th {
.user-search-empty {
padding: 16px;
text-align: center;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 13px;
}
@@ -1686,7 +1686,7 @@ th {
border-radius: 12px;
cursor: pointer;
box-shadow: none;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.password-actions .ghost-btn:hover:not(:disabled) {
@@ -1695,7 +1695,7 @@ th {
}
.password-success {
- color: var(--claude-success);
+ color: var(--state-success);
margin: 0;
font-weight: 600;
}
diff --git a/static/src/admin/ApiAdminApp.vue b/static/src/admin/ApiAdminApp.vue
index ba2c3c04..a951b3b9 100644
--- a/static/src/admin/ApiAdminApp.vue
+++ b/static/src/admin/ApiAdminApp.vue
@@ -569,7 +569,7 @@ button {
border: none;
border-radius: 12px;
padding: 10px 14px;
- background: var(--claude-highlight);
+ background: var(--highlight);
color: #2a2013;
font-weight: 600;
cursor: pointer;
diff --git a/static/src/admin/CustomToolsApp.vue b/static/src/admin/CustomToolsApp.vue
index 7117e741..b9c1292e 100644
--- a/static/src/admin/CustomToolsApp.vue
+++ b/static/src/admin/CustomToolsApp.vue
@@ -417,7 +417,7 @@ watch(secondaryVerified, async (val) => {
diff --git a/static/src/components/chat/actions/ToolAction.vue b/static/src/components/chat/actions/ToolAction.vue
index eae9c4f6..df65600b 100644
--- a/static/src/components/chat/actions/ToolAction.vue
+++ b/static/src/components/chat/actions/ToolAction.vue
@@ -1646,7 +1646,7 @@ function renderListActiveSubAgents(result: any): string {
.code-block pre,
.output-block pre {
scrollbar-width: thin; /* Firefox */
- scrollbar-color: color-mix(in srgb, var(--claude-text-secondary) 55%, transparent) transparent;
+ scrollbar-color: color-mix(in srgb, var(--text-secondary) 55%, transparent) transparent;
}
.tool-result-content.scrollable::-webkit-scrollbar,
@@ -1670,7 +1670,7 @@ function renderListActiveSubAgents(result: any): string {
.tool-result-diff.scrollable::-webkit-scrollbar-thumb,
.code-block pre::-webkit-scrollbar-thumb,
.output-block pre::-webkit-scrollbar-thumb {
- background: color-mix(in srgb, var(--claude-text-secondary) 55%, transparent);
+ background: color-mix(in srgb, var(--text-secondary) 55%, transparent);
border-radius: 999px;
border: 2px solid transparent;
background-clip: padding-box;
@@ -1771,13 +1771,13 @@ function renderListActiveSubAgents(result: any): string {
}
.diff-line-number {
- color: var(--claude-text-tertiary);
+ color: var(--text-tertiary);
text-align: right;
user-select: none;
}
.diff-marker {
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
text-align: center;
user-select: none;
}
@@ -1800,7 +1800,7 @@ function renderListActiveSubAgents(result: any): string {
.diff-separator {
text-align: left;
- color: var(--claude-text-tertiary);
+ color: var(--text-tertiary);
margin: 8px 0;
}
diff --git a/static/src/components/chat/loaders/BouncingSquaresLoader.vue b/static/src/components/chat/loaders/BouncingSquaresLoader.vue
index 6e9c4c44..afe2d7e2 100644
--- a/static/src/components/chat/loaders/BouncingSquaresLoader.vue
+++ b/static/src/components/chat/loaders/BouncingSquaresLoader.vue
@@ -28,7 +28,7 @@
width: var(--square-size);
height: var(--square-size);
left: 15%;
- background-color: var(--claude-text-tertiary);
+ background-color: var(--text-tertiary);
transform-origin: 50%;
animation: bounce-square 0.5s alternate infinite ease;
}
diff --git a/static/src/components/chat/loaders/ChaoticOrbitSquaresLoader.vue b/static/src/components/chat/loaders/ChaoticOrbitSquaresLoader.vue
index 5f134883..d95689b3 100644
--- a/static/src/components/chat/loaders/ChaoticOrbitSquaresLoader.vue
+++ b/static/src/components/chat/loaders/ChaoticOrbitSquaresLoader.vue
@@ -25,7 +25,7 @@
position: absolute;
width: 3px;
height: 3px;
- background: var(--claude-text-tertiary);
+ background: var(--text-tertiary);
will-change: transform;
}
diff --git a/static/src/components/chat/loaders/DotSpinnerSquaresLoader.vue b/static/src/components/chat/loaders/DotSpinnerSquaresLoader.vue
index 12a8d3ad..13581c96 100644
--- a/static/src/components/chat/loaders/DotSpinnerSquaresLoader.vue
+++ b/static/src/components/chat/loaders/DotSpinnerSquaresLoader.vue
@@ -42,7 +42,7 @@
content: '';
width: 3px;
height: 3px;
- background: var(--claude-text-tertiary);
+ background: var(--text-tertiary);
transform: scale(0);
opacity: 0.5;
animation: pulse calc(var(--speed) * 1.111) ease-in-out infinite;
diff --git a/static/src/components/chat/loaders/DualChaseLoader.vue b/static/src/components/chat/loaders/DualChaseLoader.vue
index 3a65a760..b945a77b 100644
--- a/static/src/components/chat/loaders/DualChaseLoader.vue
+++ b/static/src/components/chat/loaders/DualChaseLoader.vue
@@ -24,7 +24,7 @@
top: 50%;
animation: chase-up 2.4s cubic-bezier(0, 0, 0.24, 1.21) infinite;
left: 50%;
- background: var(--claude-text-tertiary);
+ background: var(--text-tertiary);
}
.dual-chase-loader::after {
diff --git a/static/src/components/chat/loaders/FiveSquaresLoader.vue b/static/src/components/chat/loaders/FiveSquaresLoader.vue
index 7cbce6ce..8f0d45a7 100644
--- a/static/src/components/chat/loaders/FiveSquaresLoader.vue
+++ b/static/src/components/chat/loaders/FiveSquaresLoader.vue
@@ -23,7 +23,7 @@
.five-squares-loader div {
display: inline-block;
- background: var(--claude-text-tertiary);
+ background: var(--text-tertiary);
width: var(--square);
height: var(--square);
position: absolute;
diff --git a/static/src/components/chat/loaders/FollowTrackSquaresLoader.vue b/static/src/components/chat/loaders/FollowTrackSquaresLoader.vue
index a4a5d943..c352026b 100644
--- a/static/src/components/chat/loaders/FollowTrackSquaresLoader.vue
+++ b/static/src/components/chat/loaders/FollowTrackSquaresLoader.vue
@@ -25,7 +25,7 @@
position: absolute;
left: 50%;
margin-left: -1px;
- background: var(--claude-text-tertiary);
+ background: var(--text-tertiary);
animation: follow-track 1.25s infinite;
}
diff --git a/static/src/components/chat/loaders/FourCornerCycleSquaresLoader.vue b/static/src/components/chat/loaders/FourCornerCycleSquaresLoader.vue
index 3ba4d02c..fdc927f8 100644
--- a/static/src/components/chat/loaders/FourCornerCycleSquaresLoader.vue
+++ b/static/src/components/chat/loaders/FourCornerCycleSquaresLoader.vue
@@ -26,7 +26,7 @@
left: 50%;
margin-top: -1.5px;
margin-left: -1.5px;
- background: var(--claude-text-tertiary);
+ background: var(--text-tertiary);
animation: corner-cycle 1.8s ease-in-out infinite;
}
diff --git a/static/src/components/chat/loaders/JumpingSequenceSquaresLoader.vue b/static/src/components/chat/loaders/JumpingSequenceSquaresLoader.vue
index 81750963..67597e08 100644
--- a/static/src/components/chat/loaders/JumpingSequenceSquaresLoader.vue
+++ b/static/src/components/chat/loaders/JumpingSequenceSquaresLoader.vue
@@ -22,7 +22,7 @@
.sq {
width: 3px;
height: 3px;
- background: var(--claude-text-tertiary);
+ background: var(--text-tertiary);
animation: jump 2s ease infinite;
}
diff --git a/static/src/components/chat/loaders/LeapFrogSquaresLoader.vue b/static/src/components/chat/loaders/LeapFrogSquaresLoader.vue
index 5c465923..21e6e13c 100644
--- a/static/src/components/chat/loaders/LeapFrogSquaresLoader.vue
+++ b/static/src/components/chat/loaders/LeapFrogSquaresLoader.vue
@@ -38,7 +38,7 @@
content: '';
width: 3px;
height: 3px;
- background: var(--claude-text-tertiary);
+ background: var(--text-tertiary);
}
.dot:nth-child(2) {
diff --git a/static/src/components/chat/loaders/NewtonCradleSquaresLoader.vue b/static/src/components/chat/loaders/NewtonCradleSquaresLoader.vue
index 4a6cdb81..9c223fc2 100644
--- a/static/src/components/chat/loaders/NewtonCradleSquaresLoader.vue
+++ b/static/src/components/chat/loaders/NewtonCradleSquaresLoader.vue
@@ -36,7 +36,7 @@
top: 75%;
width: 3px;
height: 3px;
- background: var(--claude-text-tertiary);
+ background: var(--text-tertiary);
}
.dot:first-child {
diff --git a/static/src/components/chat/loaders/NineGridLoader.vue b/static/src/components/chat/loaders/NineGridLoader.vue
index 0e124760..f26f920b 100644
--- a/static/src/components/chat/loaders/NineGridLoader.vue
+++ b/static/src/components/chat/loaders/NineGridLoader.vue
@@ -38,7 +38,7 @@
top: 0;
width: 100%;
height: 100%;
- background: var(--claude-text-tertiary);
+ background: var(--text-tertiary);
}
.box:nth-child(3n) {
diff --git a/static/src/components/chat/loaders/OrbitBlurSquaresLoader.vue b/static/src/components/chat/loaders/OrbitBlurSquaresLoader.vue
index 9fc4d823..27d7a221 100644
--- a/static/src/components/chat/loaders/OrbitBlurSquaresLoader.vue
+++ b/static/src/components/chat/loaders/OrbitBlurSquaresLoader.vue
@@ -38,7 +38,7 @@
left: 0;
width: var(--size-orbe);
height: var(--size-orbe);
- background: var(--claude-text-tertiary);
+ background: var(--text-tertiary);
filter: blur(0.35px);
}
diff --git a/static/src/components/chat/loaders/RippleLoader.vue b/static/src/components/chat/loaders/RippleLoader.vue
index 00c4a9e7..9d8d1169 100644
--- a/static/src/components/chat/loaders/RippleLoader.vue
+++ b/static/src/components/chat/loaders/RippleLoader.vue
@@ -60,7 +60,7 @@
.cell:nth-child(7),
.cell:nth-child(8),
.cell:nth-child(9) {
- --cell-color: var(--claude-text-tertiary);
+ --cell-color: var(--text-tertiary);
}
@keyframes ripple {
diff --git a/static/src/components/chat/loaders/RotatingSquaresLoader.vue b/static/src/components/chat/loaders/RotatingSquaresLoader.vue
index 47fd028e..25a49fed 100644
--- a/static/src/components/chat/loaders/RotatingSquaresLoader.vue
+++ b/static/src/components/chat/loaders/RotatingSquaresLoader.vue
@@ -100,7 +100,7 @@
width: 3px;
height: 3px;
margin: 0.5px;
- background: var(--claude-text-tertiary);
+ background: var(--text-tertiary);
animation: square-animation 10s ease-in-out infinite both;
}
diff --git a/static/src/components/chat/loaders/ShadowRollingSquaresLoader.vue b/static/src/components/chat/loaders/ShadowRollingSquaresLoader.vue
index a3b89649..7f5d0111 100644
--- a/static/src/components/chat/loaders/ShadowRollingSquaresLoader.vue
+++ b/static/src/components/chat/loaders/ShadowRollingSquaresLoader.vue
@@ -13,7 +13,7 @@
height: var(--sq);
position: relative;
left: -10px;
- color: var(--claude-text-tertiary);
+ color: var(--text-tertiary);
animation: roll 2s linear infinite;
}
diff --git a/static/src/components/chat/loaders/SquareGridLoader.vue b/static/src/components/chat/loaders/SquareGridLoader.vue
index e262971c..f65bc57a 100644
--- a/static/src/components/chat/loaders/SquareGridLoader.vue
+++ b/static/src/components/chat/loaders/SquareGridLoader.vue
@@ -34,7 +34,7 @@
}
.square {
- background: var(--claude-text-tertiary);
+ background: var(--text-tertiary);
width: 3px;
height: 3px;
position: absolute;
diff --git a/static/src/components/chat/loaders/WaveMatrixSquaresLoader.vue b/static/src/components/chat/loaders/WaveMatrixSquaresLoader.vue
index 6977b4a3..4c32c7a3 100644
--- a/static/src/components/chat/loaders/WaveMatrixSquaresLoader.vue
+++ b/static/src/components/chat/loaders/WaveMatrixSquaresLoader.vue
@@ -25,7 +25,7 @@
.sq {
width: 3px;
height: 3px;
- background: var(--claude-text-tertiary);
+ background: var(--text-tertiary);
animation: wave var(--speed) ease-in-out infinite;
}
diff --git a/static/src/components/chat/quickdock/quickdock.css b/static/src/components/chat/quickdock/quickdock.css
index 803be7c6..658b83d5 100644
--- a/static/src/components/chat/quickdock/quickdock.css
+++ b/static/src/components/chat/quickdock/quickdock.css
@@ -980,9 +980,9 @@
align-items: center;
justify-content: center;
padding: 0;
- /* 线条色与左侧对话记录侧边栏导航图标一致(--claude-text),恒定不变:
+ /* 线条色与左侧对话记录侧边栏导航图标一致(--text-primary),恒定不变:
无 hover 变色,展开(is-active)状态也不变色 */
- color: var(--claude-text);
+ color: var(--text-primary);
/* 底色与背后面板一致(收起=对话标题栏 / 展开=应用背景,两者同为 --surface-panel) */
background: var(--surface-panel);
border: none;
diff --git a/static/src/components/input/FileAtMenu.vue b/static/src/components/input/FileAtMenu.vue
index eabf4565..1da2d287 100644
--- a/static/src/components/input/FileAtMenu.vue
+++ b/static/src/components/input/FileAtMenu.vue
@@ -129,7 +129,7 @@ defineExpose(publicApi);
max-height: calc(
((var(--file-at-row-height) * 7) + (var(--file-at-gap) * 8) + (var(--file-at-pad-y) * 2)) * 1.5
);
- border: 1px solid var(--claude-border);
+ border: 1px solid var(--border-default);
border-radius: var(--file-at-radius);
background: var(--surface-soft);
box-shadow: 0 8px 24px var(--shadow-color);
@@ -165,7 +165,7 @@ defineExpose(publicApi);
border-radius: 7px;
padding: 3px 9px;
background: transparent;
- color: var(--claude-text);
+ color: var(--text-primary);
text-align: left;
cursor: pointer;
}
@@ -184,7 +184,7 @@ defineExpose(publicApi);
.file-at-item__name {
flex: 0 1 auto;
min-width: 0;
- color: var(--claude-text);
+ color: var(--text-primary);
font-size: 12px;
font-weight: 500;
white-space: nowrap;
@@ -195,7 +195,7 @@ defineExpose(publicApi);
.file-at-item__description {
flex: 1 1 auto;
min-width: 0;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 12px;
white-space: nowrap;
overflow: hidden;
@@ -209,13 +209,13 @@ defineExpose(publicApi);
display: flex;
align-items: center;
padding: 3px 9px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 11px;
}
body[data-theme='dark'] .file-at-menu-wrapper {
background: var(--badge-bg);
- border-color: var(--claude-border);
+ border-color: var(--border-default);
}
.file-at-menu-motion-enter-active,
diff --git a/static/src/components/input/InputComposer.vue b/static/src/components/input/InputComposer.vue
index f7881e12..c899c101 100644
--- a/static/src/components/input/InputComposer.vue
+++ b/static/src/components/input/InputComposer.vue
@@ -2987,7 +2987,7 @@ onBeforeUnmount(() => {
width: 45px;
height: 45px;
pointer-events: auto;
- color: var(--claude-text);
+ color: var(--text-primary);
}
.floating-status-row {
@@ -3018,7 +3018,7 @@ onBeforeUnmount(() => {
justify-content: space-between;
gap: 12px;
padding: 4px 10px 4px 4px;
- border: 1px solid var(--claude-border);
+ border: 1px solid var(--border-default);
border-radius: 14px;
background: var(--theme-surface-soft);
box-shadow: none;
@@ -3037,7 +3037,7 @@ onBeforeUnmount(() => {
font-size: 14px;
font-weight: 500;
line-height: 16px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
background: var(--chat-surface-color);
padding: 2px 8px;
border-radius: 9999px;
@@ -3107,7 +3107,7 @@ onBeforeUnmount(() => {
border: none;
border-radius: 10px;
background: transparent;
- color: var(--claude-text);
+ color: var(--text-primary);
font: inherit;
font-size: 12px;
line-height: 1.2;
@@ -3139,12 +3139,12 @@ onBeforeUnmount(() => {
}
.floating-project-status__button--branch {
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.floating-project-status__notice {
padding: 0 8px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.floating-project-status__notice--button {
@@ -3221,7 +3221,7 @@ onBeforeUnmount(() => {
flex-direction: column;
gap: 2px;
padding: 6px;
- border: 1px solid var(--claude-border);
+ border: 1px solid var(--border-default);
border-radius: 14px;
background: var(--theme-surface-soft);
box-shadow: none;
@@ -3236,7 +3236,7 @@ onBeforeUnmount(() => {
border: none;
border-radius: 10px;
background: transparent;
- color: var(--claude-text);
+ color: var(--text-primary);
font-size: 14px;
line-height: 1.2;
text-align: left;
@@ -3299,8 +3299,8 @@ onBeforeUnmount(() => {
border-radius: 999px;
font-size: 12px;
line-height: 1.4;
- color: var(--claude-text-secondary);
- background: color-mix(in srgb, var(--theme-surface-soft) 92%, var(--claude-text-tertiary) 8%);
+ color: var(--text-secondary);
+ background: color-mix(in srgb, var(--theme-surface-soft) 92%, var(--text-tertiary) 8%);
border: 1px solid var(--theme-chip-border);
user-select: none;
transition:
@@ -3333,32 +3333,32 @@ onBeforeUnmount(() => {
opacity: 0;
}
.goal-mode-banner--running {
- color: var(--claude-accent);
- border-color: var(--claude-accent);
- background: color-mix(in srgb, var(--theme-surface-soft) 82%, var(--claude-accent) 18%);
+ color: var(--accent);
+ border-color: var(--accent);
+ background: color-mix(in srgb, var(--theme-surface-soft) 82%, var(--accent) 18%);
}
.goal-mode-banner--done {
- color: var(--claude-success);
- border-color: var(--claude-success);
- background: color-mix(in srgb, var(--theme-surface-soft) 82%, var(--claude-success) 18%);
+ color: var(--state-success);
+ border-color: var(--state-success);
+ background: color-mix(in srgb, var(--theme-surface-soft) 82%, var(--state-success) 18%);
}
:global(:root[data-theme='dark']) .goal-mode-banner,
:global(body[data-theme='dark']) .goal-mode-banner {
- color: var(--claude-text-secondary);
- background: color-mix(in srgb, var(--theme-surface-muted) 82%, var(--claude-text-tertiary) 18%);
+ color: var(--text-secondary);
+ background: color-mix(in srgb, var(--theme-surface-muted) 82%, var(--text-tertiary) 18%);
border-color: var(--theme-control-border-strong);
}
:global(:root[data-theme='dark']) .goal-mode-banner--running,
:global(body[data-theme='dark']) .goal-mode-banner--running {
color: var(--text-primary);
- background: color-mix(in srgb, var(--theme-surface-muted) 72%, var(--claude-accent) 28%);
- border-color: color-mix(in srgb, var(--claude-accent) 70%, white 30%);
+ background: color-mix(in srgb, var(--theme-surface-muted) 72%, var(--accent) 28%);
+ border-color: color-mix(in srgb, var(--accent) 70%, white 30%);
}
:global(:root[data-theme='dark']) .goal-mode-banner--done,
:global(body[data-theme='dark']) .goal-mode-banner--done {
color: color-mix(in srgb, var(--state-success) 30%, white);
- background: color-mix(in srgb, var(--theme-surface-muted) 72%, var(--claude-success) 28%);
- border-color: color-mix(in srgb, var(--claude-success) 70%, white 30%);
+ background: color-mix(in srgb, var(--theme-surface-muted) 72%, var(--state-success) 28%);
+ border-color: color-mix(in srgb, var(--state-success) 70%, white 30%);
}
.goal-mode-banner--clickable {
cursor: pointer;
@@ -3367,14 +3367,14 @@ onBeforeUnmount(() => {
width: 7px;
height: 7px;
border-radius: 50%;
- background: var(--claude-text-tertiary);
+ background: var(--text-tertiary);
}
.goal-mode-banner--running .goal-mode-banner__dot {
- background: var(--claude-accent);
+ background: var(--accent);
animation: goal-banner-pulse 1.4s ease-in-out infinite;
}
.goal-mode-banner--done .goal-mode-banner__dot {
- background: var(--claude-success);
+ background: var(--state-success);
}
@keyframes goal-banner-pulse {
0%,
diff --git a/static/src/components/input/QuickMenu.vue b/static/src/components/input/QuickMenu.vue
index 90b57823..bda74573 100644
--- a/static/src/components/input/QuickMenu.vue
+++ b/static/src/components/input/QuickMenu.vue
@@ -292,17 +292,17 @@ const goalCompleted = computed(() => String(props.goalProgress?.status || '').to
margin-top: 2px;
}
.menu-entry.goal-entry-active {
- color: var(--claude-accent);
+ color: var(--accent);
}
.menu-entry.goal-entry-active .entry-arrow {
- color: var(--claude-accent);
+ color: var(--accent);
font-size: 12px;
}
.menu-entry.mode-entry-active {
- color: var(--claude-accent);
+ color: var(--accent);
}
.menu-entry.mode-entry-active .entry-arrow {
- color: var(--claude-accent);
+ color: var(--accent);
font-size: 12px;
}
diff --git a/static/src/components/overlay/ConversationReviewDialog.vue b/static/src/components/overlay/ConversationReviewDialog.vue
index 6e3fd0f8..8ed3aa98 100644
--- a/static/src/components/overlay/ConversationReviewDialog.vue
+++ b/static/src/components/overlay/ConversationReviewDialog.vue
@@ -192,8 +192,8 @@ const formatUpdatedAt = (value: string | number) => {
max-width: 96vw;
height: min(700px, 88vh);
max-height: 88vh;
- background: var(--claude-panel);
- border: 1px solid var(--claude-border);
+ background: var(--surface-panel);
+ border: 1px solid var(--border-default);
border-radius: 16px;
box-shadow: var(--theme-shadow-strong);
display: flex;
@@ -210,7 +210,7 @@ const formatUpdatedAt = (value: string | number) => {
align-items: center;
justify-content: space-between;
gap: 12px;
- border-bottom: 1px solid var(--claude-border);
+ border-bottom: 1px solid var(--border-default);
}
.header-titles {
@@ -221,14 +221,14 @@ const formatUpdatedAt = (value: string | number) => {
font-size: 16px;
font-weight: 700;
line-height: 1.2;
- color: var(--claude-text);
+ color: var(--text-primary);
letter-spacing: -0.01em;
}
.review-header .subtitle {
font-size: 12px;
line-height: 1.2;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
margin-top: 4px;
}
@@ -245,7 +245,7 @@ const formatUpdatedAt = (value: string | number) => {
display: inline-flex;
align-items: center;
font-size: 12px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
padding: 0 10px;
border-radius: 8px;
background: var(--theme-tab-active);
@@ -265,7 +265,7 @@ const formatUpdatedAt = (value: string | number) => {
border: 0;
border-radius: 9px;
background: transparent;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
cursor: pointer;
transition:
background 140ms ease,
@@ -274,7 +274,7 @@ const formatUpdatedAt = (value: string | number) => {
.icon-close-btn:hover:not(:disabled) {
background: var(--theme-tab-active);
- color: var(--claude-text);
+ color: var(--text-primary);
}
.icon-close-btn:disabled {
@@ -291,7 +291,7 @@ const formatUpdatedAt = (value: string | number) => {
}
.review-left {
- border-right: 1px solid var(--claude-border);
+ border-right: 1px solid var(--border-default);
display: flex;
flex-direction: column;
min-height: 0;
@@ -316,12 +316,12 @@ const formatUpdatedAt = (value: string | number) => {
.pane-head-label {
font-size: 13px;
font-weight: 600;
- color: var(--claude-text);
+ color: var(--text-primary);
}
.pane-head-meta {
font-size: 12px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
/* ===== 通用滚动容器:隐藏滚动条,无边框盒子 ===== */
@@ -387,7 +387,7 @@ const formatUpdatedAt = (value: string | number) => {
bottom: 14px;
width: 3px;
border-radius: 999px;
- background: var(--claude-text-secondary);
+ background: var(--text-secondary);
}
.conversation-item .row {
@@ -395,7 +395,7 @@ const formatUpdatedAt = (value: string | number) => {
align-items: center;
gap: 8px;
font-weight: 600;
- color: var(--claude-text);
+ color: var(--text-primary);
}
.conversation-item .item-title {
@@ -419,13 +419,13 @@ const formatUpdatedAt = (value: string | number) => {
font-size: 12px;
line-height: 1;
background: var(--theme-chip-bg);
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.conversation-item .meta {
font-size: 12px;
line-height: 1;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
display: flex;
gap: 10px;
white-space: nowrap;
@@ -435,7 +435,7 @@ const formatUpdatedAt = (value: string | number) => {
.empty {
text-align: center;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 13px;
padding: 20px 0;
}
@@ -453,7 +453,7 @@ const formatUpdatedAt = (value: string | number) => {
border-radius: 10px;
padding: 0 12px;
background: transparent;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 13px;
text-align: left;
cursor: pointer;
@@ -464,7 +464,7 @@ const formatUpdatedAt = (value: string | number) => {
.load-more-btn:hover:not(:disabled) {
background: var(--theme-tab-active);
- color: var(--claude-text);
+ color: var(--text-primary);
}
.load-more-btn:disabled {
@@ -483,7 +483,7 @@ const formatUpdatedAt = (value: string | number) => {
gap: 1px;
font-family: Menlo, Consolas, 'SFMono-Regular', monospace;
font-size: 13px;
- color: var(--claude-text);
+ color: var(--text-primary);
white-space: pre-wrap;
word-break: break-word;
}
@@ -503,7 +503,7 @@ const formatUpdatedAt = (value: string | number) => {
height: 100%;
min-height: 220px;
text-align: center;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
display: flex;
flex-direction: column;
gap: 10px;
@@ -513,23 +513,23 @@ const formatUpdatedAt = (value: string | number) => {
}
.placeholder-icon {
- color: var(--claude-text-tertiary);
+ color: var(--text-tertiary);
opacity: 0.9;
}
.text-main {
font-weight: 600;
font-size: 14px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.text-sub {
font-size: 12px;
- color: var(--claude-text-tertiary);
+ color: var(--text-tertiary);
}
.placeholder.error .text-main {
- color: var(--claude-warning);
+ color: var(--state-warning);
}
/* ===== 底部操作栏 ===== */
@@ -541,7 +541,7 @@ const formatUpdatedAt = (value: string | number) => {
align-items: center;
justify-content: space-between;
gap: 14px;
- border-top: 1px solid var(--claude-border);
+ border-top: 1px solid var(--border-default);
}
/* 自定义开关(非原生 checkbox 外观),固定高度 */
@@ -551,7 +551,7 @@ const formatUpdatedAt = (value: string | number) => {
gap: 10px;
height: 38px;
font-size: 14px;
- color: var(--claude-text);
+ color: var(--text-primary);
cursor: pointer;
user-select: none;
}
@@ -586,7 +586,7 @@ const formatUpdatedAt = (value: string | number) => {
}
.toggle-send input:checked + .switch {
- background: var(--claude-accent-strong);
+ background: var(--accent-strong);
}
.toggle-send input:checked + .switch::after {
@@ -607,7 +607,7 @@ const formatUpdatedAt = (value: string | number) => {
font-size: 14px;
font-weight: 600;
cursor: pointer;
- background: var(--claude-accent);
+ background: var(--accent);
color: var(--on-accent);
transition:
background 140ms ease,
@@ -615,7 +615,7 @@ const formatUpdatedAt = (value: string | number) => {
}
.primary-btn:hover:not(:disabled) {
- background: var(--claude-button-hover);
+ background: var(--accent-hover);
}
.primary-btn:disabled,
@@ -636,7 +636,7 @@ const formatUpdatedAt = (value: string | number) => {
}
.review-left {
border-right: none;
- border-bottom: 1px solid var(--claude-border);
+ border-bottom: 1px solid var(--border-default);
}
}
diff --git a/static/src/components/overlay/GoalProgressDialog.vue b/static/src/components/overlay/GoalProgressDialog.vue
index 33ae215f..3d3902f3 100644
--- a/static/src/components/overlay/GoalProgressDialog.vue
+++ b/static/src/components/overlay/GoalProgressDialog.vue
@@ -168,51 +168,51 @@ const stoppedReasonLabel = computed(() => {
padding: 2px 10px;
border-radius: 999px;
border: 1px solid var(--theme-chip-border);
- background: color-mix(in srgb, var(--theme-surface-soft) 92%, var(--claude-text-tertiary) 8%);
- color: var(--claude-text-secondary);
+ background: color-mix(in srgb, var(--theme-surface-soft) 92%, var(--text-tertiary) 8%);
+ color: var(--text-secondary);
}
.goal-progress-status.is-running {
- color: var(--claude-accent);
- border-color: var(--claude-accent);
- background: color-mix(in srgb, var(--theme-surface-soft) 82%, var(--claude-accent) 18%);
+ color: var(--accent);
+ border-color: var(--accent);
+ background: color-mix(in srgb, var(--theme-surface-soft) 82%, var(--accent) 18%);
}
.goal-progress-status.is-done {
- color: var(--claude-success);
- border-color: var(--claude-success);
- background: color-mix(in srgb, var(--theme-surface-soft) 82%, var(--claude-success) 18%);
+ color: var(--state-success);
+ border-color: var(--state-success);
+ background: color-mix(in srgb, var(--theme-surface-soft) 82%, var(--state-success) 18%);
}
.goal-progress-status.is-stopped {
- color: var(--claude-warning);
- border-color: var(--claude-warning);
- background: color-mix(in srgb, var(--theme-surface-soft) 82%, var(--claude-warning) 18%);
+ color: var(--state-warning);
+ border-color: var(--state-warning);
+ background: color-mix(in srgb, var(--theme-surface-soft) 82%, var(--state-warning) 18%);
}
:global(:root[data-theme='dark']) .goal-progress-status,
:global(body[data-theme='dark']) .goal-progress-status {
- color: var(--claude-text-secondary);
- background: color-mix(in srgb, var(--theme-surface-muted) 82%, var(--claude-text-tertiary) 18%);
+ color: var(--text-secondary);
+ background: color-mix(in srgb, var(--theme-surface-muted) 82%, var(--text-tertiary) 18%);
border-color: var(--theme-control-border-strong);
}
:global(:root[data-theme='dark']) .goal-progress-status.is-running,
:global(body[data-theme='dark']) .goal-progress-status.is-running {
color: var(--text-primary);
- background: color-mix(in srgb, var(--theme-surface-muted) 72%, var(--claude-accent) 28%);
- border-color: color-mix(in srgb, var(--claude-accent) 70%, white 30%);
+ background: color-mix(in srgb, var(--theme-surface-muted) 72%, var(--accent) 28%);
+ border-color: color-mix(in srgb, var(--accent) 70%, white 30%);
}
:global(:root[data-theme='dark']) .goal-progress-status.is-done,
:global(body[data-theme='dark']) .goal-progress-status.is-done {
color: color-mix(in srgb, var(--state-success) 30%, white);
- background: color-mix(in srgb, var(--theme-surface-muted) 72%, var(--claude-success) 28%);
- border-color: color-mix(in srgb, var(--claude-success) 70%, white 30%);
+ background: color-mix(in srgb, var(--theme-surface-muted) 72%, var(--state-success) 28%);
+ border-color: color-mix(in srgb, var(--state-success) 70%, white 30%);
}
:global(:root[data-theme='dark']) .goal-progress-status.is-stopped,
:global(body[data-theme='dark']) .goal-progress-status.is-stopped {
color: color-mix(in srgb, var(--state-warning) 30%, white);
- background: color-mix(in srgb, var(--theme-surface-muted) 72%, var(--claude-warning) 28%);
- border-color: color-mix(in srgb, var(--claude-warning) 70%, white 30%);
+ background: color-mix(in srgb, var(--theme-surface-muted) 72%, var(--state-warning) 28%);
+ border-color: color-mix(in srgb, var(--state-warning) 70%, white 30%);
}
.goal-progress-goal {
font-size: 13px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
@@ -234,16 +234,16 @@ const stoppedReasonLabel = computed(() => {
.goal-metric__value {
font-size: 18px;
font-weight: 600;
- color: var(--claude-text);
+ color: var(--text-primary);
}
.goal-metric__label {
margin-top: 4px;
font-size: 11px;
- color: var(--claude-text-tertiary);
+ color: var(--text-tertiary);
}
.goal-progress-reason {
font-size: 13px;
- color: var(--claude-warning);
+ color: var(--state-warning);
margin-bottom: 10px;
}
.goal-progress-summary {
@@ -252,13 +252,13 @@ const stoppedReasonLabel = computed(() => {
}
.goal-progress-summary__title {
font-size: 12px;
- color: var(--claude-text-tertiary);
+ color: var(--text-tertiary);
margin-bottom: 6px;
}
.goal-progress-summary__body {
font-size: 13px;
line-height: 1.6;
- color: var(--claude-text);
+ color: var(--text-primary);
white-space: pre-wrap;
word-break: break-word;
max-height: 240px;
diff --git a/static/src/components/overlay/NewUserTutorialPrompt.vue b/static/src/components/overlay/NewUserTutorialPrompt.vue
index 4d8eab55..6dd608a9 100644
--- a/static/src/components/overlay/NewUserTutorialPrompt.vue
+++ b/static/src/components/overlay/NewUserTutorialPrompt.vue
@@ -100,13 +100,13 @@ button {
.primary {
border: none;
- background: linear-gradient(135deg, var(--claude-accent), var(--claude-accent-strong));
+ background: linear-gradient(135deg, var(--accent), var(--accent-strong));
color: var(--on-accent);
}
.ghost {
background: var(--theme-surface-soft);
- color: var(--claude-text);
+ color: var(--text-primary);
}
button:hover:not(:disabled) {
diff --git a/static/src/components/overlay/PathAuthorizationDialog.vue b/static/src/components/overlay/PathAuthorizationDialog.vue
index 160c694d..6757c8ca 100644
--- a/static/src/components/overlay/PathAuthorizationDialog.vue
+++ b/static/src/components/overlay/PathAuthorizationDialog.vue
@@ -66,7 +66,7 @@ defineEmits<{
.overlay-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px; }
.overlay-header h3 { margin: 0; font-size: 16px; }
.overlay-header button { border: none; background: transparent; font-size: 20px; cursor: pointer; }
-.hint { font-size: 12px; color: var(--claude-text-secondary); margin: 0 0 8px 0; }
+.hint { font-size: 12px; color: var(--text-secondary); margin: 0 0 8px 0; }
.mode-switch { display: inline-flex; border: 1px solid var(--theme-control-border); border-radius: 10px; overflow: hidden; margin-bottom: 8px; }
.mode-btn { border: none; background: transparent; padding: 6px 10px; cursor: pointer; font-size: 12px; }
.mode-btn.active { background: var(--theme-tab-active); font-weight: 600; }
diff --git a/static/src/components/overlay/UserQuestionDialog.vue b/static/src/components/overlay/UserQuestionDialog.vue
index 3eaaf815..ba34973f 100644
--- a/static/src/components/overlay/UserQuestionDialog.vue
+++ b/static/src/components/overlay/UserQuestionDialog.vue
@@ -164,7 +164,7 @@ function submit() {
max-height: min(520px, calc(100vh - 36px));
display: flex;
flex-direction: column;
- color: var(--claude-text);
+ color: var(--text-primary);
background: var(--theme-surface-card);
border: 1px solid var(--theme-control-border);
border-radius: 20px;
@@ -178,7 +178,7 @@ function submit() {
grid-template-columns: 56px 1fr 56px;
align-items: center;
border-bottom: 1px solid var(--theme-control-border);
- background: color-mix(in srgb, var(--theme-surface-soft) 92%, var(--claude-left-rail) 8%);
+ background: color-mix(in srgb, var(--theme-surface-soft) 92%, var(--surface-rail) 8%);
}
.user-question-traffic {
@@ -203,7 +203,7 @@ function submit() {
text-align: center;
font-size: 13px;
font-weight: 600;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
user-select: none;
}
@@ -226,7 +226,7 @@ function submit() {
}
.user-question-kicker {
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 12px;
}
@@ -257,7 +257,7 @@ function submit() {
border-radius: 6px;
border: 1px solid var(--theme-control-border);
background: transparent;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
cursor: pointer;
display: grid;
place-items: center;
@@ -271,7 +271,7 @@ function submit() {
.user-question-nav button:hover:not(:disabled) {
background: var(--hover-bg);
- color: var(--claude-text);
+ color: var(--text-primary);
}
.user-question-nav button:disabled {
@@ -298,7 +298,7 @@ function submit() {
.user-question-context {
margin: 0;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
line-height: 1.6;
font-size: 13px;
white-space: pre-wrap;
@@ -315,7 +315,7 @@ function submit() {
border: 1px solid var(--theme-control-border);
border-radius: 12px;
background: transparent;
- color: var(--claude-text);
+ color: var(--text-primary);
padding: 9px 11px;
text-align: left;
cursor: pointer;
@@ -339,7 +339,7 @@ function submit() {
}
.user-question-option__desc {
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 12px;
line-height: 1.42;
white-space: pre-wrap;
@@ -364,7 +364,7 @@ function submit() {
border: 1px solid var(--theme-control-border);
border-radius: 12px;
padding: 10px 11px;
- color: var(--claude-text);
+ color: var(--text-primary);
background: var(--theme-surface-soft);
outline: none;
font: inherit;
@@ -388,7 +388,7 @@ function submit() {
gap: 12px;
padding: 0 18px;
border-top: 1px solid var(--theme-control-border);
- background: color-mix(in srgb, var(--theme-surface-soft) 92%, var(--claude-left-rail) 8%);
+ background: color-mix(in srgb, var(--theme-surface-soft) 92%, var(--surface-rail) 8%);
}
.user-question-spacer {
@@ -412,22 +412,22 @@ function submit() {
.user-question-btn.ghost {
background: transparent;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.user-question-btn.ghost:hover {
background: var(--hover-bg);
- color: var(--claude-text);
+ color: var(--text-primary);
}
.user-question-btn.primary {
- background: var(--claude-accent);
- border-color: var(--claude-accent-strong);
+ background: var(--accent);
+ border-color: var(--accent-strong);
color: var(--on-accent);
}
.user-question-btn.primary:hover:not(:disabled) {
- background: var(--claude-button-hover);
+ background: var(--accent-hover);
}
.user-question-btn:disabled {
diff --git a/static/src/components/overlay/VersioningDialog.vue b/static/src/components/overlay/VersioningDialog.vue
index 10af0fc1..e0acc28c 100644
--- a/static/src/components/overlay/VersioningDialog.vue
+++ b/static/src/components/overlay/VersioningDialog.vue
@@ -253,12 +253,12 @@ const splitDiffContent = (content: any): string[] => {
max-height: 88vh;
overflow: hidden;
border-radius: 16px;
- background: var(--claude-panel);
- border: 1px solid var(--claude-border);
+ background: var(--surface-panel);
+ border: 1px solid var(--border-default);
box-shadow: var(--theme-shadow-strong);
display: flex;
flex-direction: column;
- color: var(--claude-text);
+ color: var(--text-primary);
}
/* ===== 头部:固定高度,靠分隔线 ===== */
@@ -266,7 +266,7 @@ const splitDiffContent = (content: any): string[] => {
flex: 0 0 auto;
height: 60px;
padding: 0 18px;
- border-bottom: 1px solid var(--claude-border);
+ border-bottom: 1px solid var(--border-default);
display: flex;
align-items: center;
justify-content: space-between;
@@ -334,7 +334,7 @@ const splitDiffContent = (content: any): string[] => {
}
.switch-line input:checked + .switch {
- background: var(--claude-accent-strong);
+ background: var(--accent-strong);
}
.switch-line input:checked + .switch::after {
@@ -355,7 +355,7 @@ const splitDiffContent = (content: any): string[] => {
align-items: center;
gap: 8px;
font-size: 13px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.scope-label {
@@ -372,10 +372,10 @@ const splitDiffContent = (content: any): string[] => {
align-items: center;
gap: 8px;
padding: 0 10px;
- border: 1px solid var(--claude-border);
+ border: 1px solid var(--border-default);
border-radius: 9px;
background: transparent;
- color: var(--claude-text);
+ color: var(--text-primary);
font-size: 13px;
cursor: pointer;
transition:
@@ -412,8 +412,8 @@ const splitDiffContent = (content: any): string[] => {
left: 1px;
width: 6px;
height: 6px;
- border-right: 1.5px solid var(--claude-text-secondary);
- border-bottom: 1.5px solid var(--claude-text-secondary);
+ border-right: 1.5px solid var(--text-secondary);
+ border-bottom: 1.5px solid var(--text-secondary);
transform: rotate(45deg);
transition: transform 160ms ease;
}
@@ -431,7 +431,7 @@ const splitDiffContent = (content: any): string[] => {
width: max-content;
z-index: 20;
padding: 6px;
- border: 1px solid var(--claude-border);
+ border: 1px solid var(--border-default);
border-radius: 12px;
background: var(--theme-surface-strong);
box-shadow: var(--theme-shadow-soft);
@@ -450,7 +450,7 @@ const splitDiffContent = (content: any): string[] => {
border: 0;
border-radius: 9px;
background: transparent;
- color: var(--claude-text);
+ color: var(--text-primary);
font-size: 13px;
text-align: left;
cursor: pointer;
@@ -470,7 +470,7 @@ const splitDiffContent = (content: any): string[] => {
.scope-option-check {
flex: 0 0 auto;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
/* ===== 头部按钮 ===== */
@@ -480,10 +480,10 @@ const splitDiffContent = (content: any): string[] => {
align-items: center;
gap: 6px;
padding: 0 12px;
- border: 1px solid var(--claude-border);
+ border: 1px solid var(--border-default);
border-radius: 9px;
background: transparent;
- color: var(--claude-text);
+ color: var(--text-primary);
font-size: 13px;
cursor: pointer;
transition: background 140ms ease;
@@ -506,7 +506,7 @@ const splitDiffContent = (content: any): string[] => {
border: 0;
border-radius: 9px;
background: transparent;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
cursor: pointer;
transition:
background 140ms ease,
@@ -515,7 +515,7 @@ const splitDiffContent = (content: any): string[] => {
.icon-close-btn:hover {
background: var(--theme-tab-active);
- color: var(--claude-text);
+ color: var(--text-primary);
}
/* ===== 主体:左右分栏靠竖线 ===== */
@@ -540,7 +540,7 @@ const splitDiffContent = (content: any): string[] => {
}
.checkpoint-list {
- border-right: 1px solid var(--claude-border);
+ border-right: 1px solid var(--border-default);
padding: 6px 8px;
display: flex;
flex-direction: column;
@@ -558,7 +558,7 @@ const splitDiffContent = (content: any): string[] => {
border-radius: 10px;
padding: 0 12px;
background: transparent;
- color: var(--claude-text);
+ color: var(--text-primary);
cursor: pointer;
overflow: hidden;
display: flex;
@@ -585,7 +585,7 @@ const splitDiffContent = (content: any): string[] => {
bottom: 16px;
width: 3px;
border-radius: 999px;
- background: var(--claude-text-secondary);
+ background: var(--text-secondary);
}
.row {
@@ -597,18 +597,18 @@ const splitDiffContent = (content: any): string[] => {
.row.top {
font-size: 12px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.seq {
font-weight: 700;
- color: var(--claude-text);
+ color: var(--text-primary);
}
.preview {
font-size: 13px;
line-height: 1.3;
- color: var(--claude-text);
+ color: var(--text-primary);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
@@ -628,7 +628,7 @@ const splitDiffContent = (content: any): string[] => {
}
.files {
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.checkpoint-detail {
@@ -664,7 +664,7 @@ const splitDiffContent = (content: any): string[] => {
gap: 10px;
align-items: center;
min-height: 40px;
- border-bottom: 1px solid var(--claude-border);
+ border-bottom: 1px solid var(--border-default);
padding: 0 4px;
font-size: 13px;
cursor: pointer;
@@ -682,12 +682,12 @@ const splitDiffContent = (content: any): string[] => {
.status {
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.path {
word-break: break-all;
- color: var(--claude-text);
+ color: var(--text-primary);
}
.delta {
@@ -697,7 +697,7 @@ const splitDiffContent = (content: any): string[] => {
.loading,
.empty {
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 13px;
padding: 12px 4px;
}
@@ -707,7 +707,7 @@ const splitDiffContent = (content: any): string[] => {
flex: 0 0 auto;
min-height: 60px;
padding: 12px 18px;
- border-top: 1px solid var(--claude-border);
+ border-top: 1px solid var(--border-default);
display: flex;
align-items: center;
gap: 16px;
@@ -729,7 +729,7 @@ const splitDiffContent = (content: any): string[] => {
.restore-option-label {
font-size: 13px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
white-space: nowrap;
}
@@ -742,10 +742,10 @@ const splitDiffContent = (content: any): string[] => {
.restore-option-btn {
height: 32px;
padding: 0 12px;
- border: 1px solid var(--claude-border);
+ border: 1px solid var(--border-default);
border-radius: 9px;
background: transparent;
- color: var(--claude-text);
+ color: var(--text-primary);
font-size: 13px;
cursor: pointer;
white-space: nowrap;
@@ -760,8 +760,8 @@ const splitDiffContent = (content: any): string[] => {
}
.restore-option-btn.active {
- border-color: var(--claude-accent);
- background: var(--claude-accent);
+ border-color: var(--accent);
+ background: var(--accent);
color: var(--on-accent);
}
@@ -782,14 +782,14 @@ const splitDiffContent = (content: any): string[] => {
padding: 0 18px;
font-size: 14px;
font-weight: 600;
- background: var(--claude-accent);
+ background: var(--accent);
color: var(--on-accent);
cursor: pointer;
transition: background 140ms ease;
}
.confirm-btn:hover:not(:disabled) {
- background: var(--claude-button-hover);
+ background: var(--accent-hover);
}
.confirm-btn:disabled {
@@ -810,7 +810,7 @@ const splitDiffContent = (content: any): string[] => {
.tool-result-diff.scroll-area {
max-height: calc(8 * 1.5em + 16px);
- border: 1px solid var(--claude-border);
+ border: 1px solid var(--border-default);
border-radius: 8px;
padding: 8px;
background: var(--theme-surface-soft);
@@ -829,7 +829,7 @@ const splitDiffContent = (content: any): string[] => {
}
.diff-marker {
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
text-align: center;
user-select: none;
}
@@ -853,13 +853,13 @@ const splitDiffContent = (content: any): string[] => {
.diff-context {
background: transparent;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.approval-note {
padding: 6px 8px;
font-size: 11px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
@media (max-width: 860px) {
@@ -869,7 +869,7 @@ const splitDiffContent = (content: any): string[] => {
}
.checkpoint-list {
border-right: none;
- border-bottom: 1px solid var(--claude-border);
+ border-bottom: 1px solid var(--border-default);
}
}
diff --git a/static/src/components/panels/TerminalPanel.vue b/static/src/components/panels/TerminalPanel.vue
index ab78cc71..5dfa1789 100644
--- a/static/src/components/panels/TerminalPanel.vue
+++ b/static/src/components/panels/TerminalPanel.vue
@@ -560,7 +560,7 @@ onBeforeUnmount(() => {
.terminal-panel__close:hover {
background: var(--theme-tab-active);
- color: var(--claude-text);
+ color: var(--text-primary);
box-shadow: 0 1px 2px var(--shadow-color);
}
diff --git a/static/src/components/panels/ToolApprovalPanel.vue b/static/src/components/panels/ToolApprovalPanel.vue
index 1867692e..347bcd81 100644
--- a/static/src/components/panels/ToolApprovalPanel.vue
+++ b/static/src/components/panels/ToolApprovalPanel.vue
@@ -290,26 +290,26 @@ const parseFinalMessage = (text: string) => {
.tool-approval-panel.is-goal-approval-mode .auto-approval-block {
background: var(--theme-surface-card);
border-color: var(--theme-control-border);
- color: var(--claude-text);
+ color: var(--text-primary);
}
.tool-approval-panel.is-goal-approval-mode .auto-approval-block__content,
.tool-approval-panel.is-goal-approval-mode .auto-approval-block__reason {
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.tool-approval-panel.is-goal-approval-mode .auto-approval-block__decision {
- color: var(--claude-text);
+ color: var(--text-primary);
}
:global(:root[data-theme='dark']) .auto-approval-block,
:global(body[data-theme='dark']) .auto-approval-block {
background: color-mix(in srgb, var(--theme-surface-muted) 86%, white 4%);
border-color: var(--theme-control-border-strong);
- color: var(--claude-text);
+ color: var(--text-primary);
}
:global(:root[data-theme='dark']) .auto-approval-block__content,
:global(body[data-theme='dark']) .auto-approval-block__content {
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
diff --git a/static/src/components/personalization/PersonalizationDrawer.vue b/static/src/components/personalization/PersonalizationDrawer.vue
index 73022ab3..f67a9e8c 100644
--- a/static/src/components/personalization/PersonalizationDrawer.vue
+++ b/static/src/components/personalization/PersonalizationDrawer.vue
@@ -1740,7 +1740,7 @@
key="sub-agents"
class="settings-page"
>
-
+
管理多智能体模式下的子智能体角色。预设角色可编辑(创建自定义覆盖),自定义角色可创建/编辑/删除。
@@ -3212,7 +3212,7 @@ const applyThemeOption = async (theme: ThemeKey) => {
.sub-agent-role-name {
font-size: 14px;
font-weight: 550;
- color: var(--claude-text);
+ color: var(--text-primary);
display: flex;
align-items: center;
gap: 6px;
@@ -3224,22 +3224,22 @@ const applyThemeOption = async (theme: ThemeKey) => {
font-weight: 400;
}
.sub-agent-role-tag.tag-preset {
- background: color-mix(in srgb, var(--claude-text-secondary) 15%, transparent);
- color: var(--claude-text-secondary);
+ background: color-mix(in srgb, var(--text-secondary) 15%, transparent);
+ color: var(--text-secondary);
}
.sub-agent-role-tag.tag-custom {
- background: color-mix(in srgb, var(--claude-accent) 15%, transparent);
- color: var(--claude-accent);
+ background: color-mix(in srgb, var(--accent) 15%, transparent);
+ color: var(--accent);
}
.sub-agent-role-desc {
font-size: 12.5px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
margin-top: 3px;
line-height: 1.38;
}
.sub-agent-role-meta {
font-size: 11px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
opacity: 0.7;
margin-top: 2px;
}
@@ -3274,7 +3274,7 @@ const applyThemeOption = async (theme: ThemeKey) => {
.role-editor-header h2 {
font-size: 20px;
font-weight: 600;
- color: var(--claude-text);
+ color: var(--text-primary);
margin: 0;
}
.role-editor-body {
@@ -3301,10 +3301,10 @@ const applyThemeOption = async (theme: ThemeKey) => {
.settings-section-title {
font-size: 14px;
font-weight: 550;
- color: var(--claude-text);
+ color: var(--text-primary);
}
.settings-empty-hint {
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 13px;
padding: 24px 0;
text-align: center;
@@ -3345,7 +3345,7 @@ const applyThemeOption = async (theme: ThemeKey) => {
border: 0;
border-radius: 50%;
background: transparent;
- color: var(--claude-text);
+ color: var(--text-primary);
display: grid;
place-items: center;
cursor: pointer;
@@ -3399,7 +3399,7 @@ const applyThemeOption = async (theme: ThemeKey) => {
border: 0;
border-radius: 12px;
background: transparent;
- color: var(--claude-text);
+ color: var(--text-primary);
padding: 0 13px;
display: flex;
align-items: center;
@@ -3458,7 +3458,7 @@ const applyThemeOption = async (theme: ThemeKey) => {
.settings-redesign-content-header h2 {
margin: 0;
- color: var(--claude-text);
+ color: var(--text-primary);
font-size: 28px;
line-height: 1;
letter-spacing: -0.045em;
@@ -3515,7 +3515,7 @@ const applyThemeOption = async (theme: ThemeKey) => {
align-items: center;
gap: 18px;
padding: 11px 0;
- color: var(--claude-text);
+ color: var(--text-primary);
}
.settings-list-row.tall,
@@ -3534,7 +3534,7 @@ const applyThemeOption = async (theme: ThemeKey) => {
.settings-row-title {
display: block;
- color: var(--claude-text);
+ color: var(--text-primary);
font-size: 14px;
font-weight: 550;
letter-spacing: -0.01em;
@@ -3544,7 +3544,7 @@ const applyThemeOption = async (theme: ThemeKey) => {
.settings-row-desc {
display: block;
margin-top: 3px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 12.5px;
line-height: 1.38;
}
@@ -3562,7 +3562,7 @@ const applyThemeOption = async (theme: ThemeKey) => {
border: 0;
border-radius: 12px;
background: transparent;
- color: var(--claude-text);
+ color: var(--text-primary);
display: inline-flex;
align-items: center;
justify-content: center;
@@ -3648,7 +3648,7 @@ const applyThemeOption = async (theme: ThemeKey) => {
border: 0;
border-radius: 12px;
background: transparent;
- color: var(--claude-text);
+ color: var(--text-primary);
display: grid;
grid-template-columns: minmax(0, 1fr) 22px;
row-gap: 0;
@@ -3672,7 +3672,7 @@ const applyThemeOption = async (theme: ThemeKey) => {
grid-column: 1;
grid-row: 1;
display: block;
- color: var(--claude-text);
+ color: var(--text-primary);
font-size: 15px;
font-weight: 550;
letter-spacing: -0.01em;
@@ -3684,7 +3684,7 @@ const applyThemeOption = async (theme: ThemeKey) => {
grid-row: 2;
display: block;
margin-top: 0;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 11px;
line-height: 1.15;
min-width: 0;
@@ -3701,7 +3701,7 @@ const applyThemeOption = async (theme: ThemeKey) => {
width: 21px;
height: 21px;
fill: none;
- stroke: var(--claude-text);
+ stroke: var(--text-primary);
stroke-width: 2.25;
stroke-linecap: round;
stroke-linejoin: round;
@@ -3721,7 +3721,7 @@ const applyThemeOption = async (theme: ThemeKey) => {
border: 1px solid var(--theme-control-border);
border-radius: 12px;
background: transparent;
- color: var(--claude-text);
+ color: var(--text-primary);
padding: 0 12px;
outline: none;
font-size: 13px;
@@ -3740,7 +3740,7 @@ const applyThemeOption = async (theme: ThemeKey) => {
.settings-section-divider__label {
font-size: 12px;
font-weight: 600;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
letter-spacing: 0.04em;
}
.settings-section-divider::after {
@@ -3761,7 +3761,7 @@ const applyThemeOption = async (theme: ThemeKey) => {
.settings-number-row input:focus,
.settings-number-input:focus,
.settings-compression-grid input:focus {
- border-color: var(--claude-text-secondary);
+ border-color: var(--text-secondary);
box-shadow: none;
}
@@ -3798,7 +3798,7 @@ const applyThemeOption = async (theme: ThemeKey) => {
border: 1px solid var(--theme-control-border);
border-radius: 999px;
background: transparent;
- color: var(--claude-text);
+ color: var(--text-primary);
min-height: 32px;
padding: 0 12px;
font-size: 12px;
@@ -3814,13 +3814,13 @@ const applyThemeOption = async (theme: ThemeKey) => {
.settings-chip-row button.active,
.settings-primary-button {
- border-color: var(--claude-accent);
- background: var(--claude-accent);
+ border-color: var(--accent);
+ background: var(--accent);
color: var(--on-accent);
}
.settings-secondary-button.danger {
- color: var(--claude-warning);
+ color: var(--state-warning);
}
.settings-inline-actions {
@@ -3836,12 +3836,12 @@ const applyThemeOption = async (theme: ThemeKey) => {
}
.settings-mini-status {
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 12px;
}
.settings-mini-status.warning {
- color: var(--claude-warning);
+ color: var(--state-warning);
}
.settings-add-row,
@@ -3865,7 +3865,7 @@ const applyThemeOption = async (theme: ThemeKey) => {
flex-direction: column;
gap: 10px;
padding: 14px 0;
- color: var(--claude-text);
+ color: var(--text-primary);
}
.settings-textarea-row textarea {
@@ -3875,7 +3875,7 @@ const applyThemeOption = async (theme: ThemeKey) => {
border: 1px solid var(--theme-control-border);
border-radius: 12px;
background: transparent;
- color: var(--claude-text);
+ color: var(--text-primary);
padding: 12px;
outline: none;
font-size: 13px;
@@ -3886,12 +3886,12 @@ const applyThemeOption = async (theme: ThemeKey) => {
}
.settings-textarea-row textarea:focus {
- border-color: var(--claude-text-secondary);
+ border-color: var(--text-secondary);
box-shadow: none;
}
.settings-textarea-row textarea::placeholder {
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
opacity: 0.6;
}
@@ -3926,7 +3926,7 @@ const applyThemeOption = async (theme: ThemeKey) => {
.fancy-path {
fill: none;
- stroke: var(--claude-text-secondary);
+ stroke: var(--text-secondary);
stroke-width: 5;
stroke-linecap: round;
stroke-linejoin: round;
@@ -3939,7 +3939,7 @@ const applyThemeOption = async (theme: ThemeKey) => {
}
.settings-toggle-row input:checked + .fancy-check .fancy-path {
- stroke: var(--claude-text-secondary);
+ stroke: var(--text-secondary);
stroke-dasharray: 70.5096664428711 9999999;
stroke-dashoffset: -262.2723388671875;
}
@@ -3975,7 +3975,7 @@ const applyThemeOption = async (theme: ThemeKey) => {
.settings-compression-grid label {
display: grid;
gap: 5px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 12px;
}
@@ -4003,12 +4003,12 @@ const applyThemeOption = async (theme: ThemeKey) => {
}
.status.success {
- color: var(--claude-success);
+ color: var(--state-success);
}
.status.error,
.usage-summary-error {
- color: var(--claude-warning);
+ color: var(--state-warning);
}
.usage-summary-page {
@@ -4035,7 +4035,7 @@ const applyThemeOption = async (theme: ThemeKey) => {
.usage-summary-eyebrow {
margin: 0;
font-size: 11px;
- color: var(--claude-accent-strong);
+ color: var(--accent-strong);
letter-spacing: 0.16em;
text-transform: uppercase;
}
@@ -4044,7 +4044,7 @@ const applyThemeOption = async (theme: ThemeKey) => {
.usage-summary-note,
.usage-summary-meta {
margin: 0;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 12px;
}
@@ -4070,22 +4070,22 @@ const applyThemeOption = async (theme: ThemeKey) => {
.usage-summary-item .label {
font-size: 12px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.usage-summary-item .value {
margin-top: 4px;
font-size: 20px;
font-weight: 600;
- color: var(--claude-text);
+ color: var(--text-primary);
}
.usage-summary-item .value--success {
- color: var(--claude-success);
+ color: var(--state-success);
}
.usage-summary-item .value--warning {
- color: var(--claude-warning);
+ color: var(--state-warning);
}
.usage-summary-meta {
@@ -4101,7 +4101,7 @@ const applyThemeOption = async (theme: ThemeKey) => {
border-radius: 999px;
padding: 7px 14px;
background: transparent;
- color: var(--claude-text);
+ color: var(--text-primary);
font-size: 12px;
cursor: pointer;
}
diff --git a/static/src/styles/base/_global.scss b/static/src/styles/base/_global.scss
index 8dde4f02..551c5641 100644
--- a/static/src/styles/base/_global.scss
+++ b/static/src/styles/base/_global.scss
@@ -7,8 +7,8 @@ body {
body {
font-family: 'Iowan Old Style', ui-serif, Georgia, Cambria, "Times New Roman", Times, serif;
- background: var(--claude-bg);
- color: var(--claude-text);
+ background: var(--surface-base);
+ color: var(--text-primary);
overflow: hidden;
-webkit-font-smoothing: antialiased;
}
@@ -21,8 +21,8 @@ select {
}
body[data-theme='dark'] {
- background: var(--claude-bg);
- color: var(--claude-text);
+ background: var(--surface-base);
+ color: var(--text-primary);
}
/* Remove iOS/Android WebView default tap highlight */
diff --git a/static/src/styles/base/_tokens.scss b/static/src/styles/base/_tokens.scss
index 0e0bacfa..b5db9de8 100644
--- a/static/src/styles/base/_tokens.scss
+++ b/static/src/styles/base/_tokens.scss
@@ -47,37 +47,16 @@
--effort-dot-uncovered: rgba(0, 0, 0, 0.28);
/* === 兼容别名(旧 token 名 → 新语义 token),迁移完成后删除 === */
- --claude-bg: var(--surface-base);
- --claude-panel: var(--surface-panel);
- --claude-left-rail: var(--surface-rail);
- --claude-sidebar: var(--surface-sidebar);
--theme-surface-card: var(--surface-card);
--theme-surface-strong: var(--surface-raised);
--theme-surface-soft: var(--surface-soft);
--theme-surface-muted: var(--surface-muted);
- --claude-text: var(--text-primary);
- --claude-text-secondary: var(--text-secondary);
- --claude-text-tertiary: var(--text-tertiary);
- --claude-muted: var(--text-muted);
- --claude-border: var(--border-default);
- --claude-border-strong: var(--border-strong);
--theme-card-border-strong: var(--border-card-strong);
--theme-chip-border: var(--chip-border);
- --claude-accent: var(--accent);
- --claude-accent-strong: var(--accent-strong);
- --claude-button-hover: var(--accent-hover);
- --claude-button-active: var(--accent-active);
- --claude-deep: var(--accent-deep);
- --claude-deep-strong: var(--accent-deep-strong);
- --claude-success: var(--state-success);
- --claude-warning: var(--state-warning);
- --claude-danger: var(--state-danger);
- --claude-highlight: var(--highlight);
--theme-tab-active: var(--tab-active);
--theme-chip-bg: var(--chip-bg);
--theme-badge-bg: var(--badge-bg);
--theme-switch-track: var(--switch-track);
- --claude-shadow: var(--shadow-card);
--theme-shadow-soft: var(--shadow-soft);
--theme-shadow-mid: var(--shadow-mid);
--theme-shadow-strong: var(--shadow-strong);
@@ -93,7 +72,7 @@
:root[data-theme='classic'] {
color-scheme: light;
- /* Surface 表面层级 —— Claude 亮色暖奶油盘(canvas
table,
@@ -838,7 +838,7 @@
.user-message.user-message--multi-agent .bubble-text th,
.user-message.user-message--multi-agent .bubble-text td {
- border: 1px solid var(--claude-border);
+ border: 1px solid var(--border-default);
padding: 6px 10px;
text-align: left;
vertical-align: middle;
@@ -847,7 +847,7 @@
.user-message.user-message--multi-agent .bubble-text th {
font-weight: 600;
- background: color-mix(in srgb, var(--claude-text) 7%, var(--chip-bg));
+ background: color-mix(in srgb, var(--text-primary) 7%, var(--chip-bg));
}
.message-block--last
@@ -894,7 +894,7 @@
.assistant-message .message-header {
font-size: 14px;
font-weight: 600;
- color: var(--claude-text);
+ color: var(--text-primary);
margin-bottom: 10px;
letter-spacing: 0.02em;
}
@@ -903,13 +903,13 @@
margin-left: 8px;
font-size: 12px;
font-weight: 500;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.assistant-generating-placeholder {
display: inline-flex;
align-items: center;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 14px;
font-weight: 500;
letter-spacing: 0.05em;
@@ -945,7 +945,7 @@
font-size: 15px;
line-height: 1.6;
box-shadow: none;
- color: var(--claude-text);
+ color: var(--text-primary);
white-space: pre-wrap;
word-break: break-all;
overflow-wrap: normal;
@@ -967,7 +967,7 @@
padding: 10px 14px;
border-radius: 14px;
font-size: 13px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
background: var(--theme-surface-card);
border: 1px solid var(--theme-control-border);
}
@@ -984,7 +984,7 @@
gap: 14px;
width: 100%;
margin: 2px auto;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
user-select: none;
}
@@ -1094,14 +1094,14 @@
transform: none;
pointer-events: auto;
background: transparent;
- color: var(--claude-text-tertiary);
+ color: var(--text-tertiary);
border-radius: 4px;
transition: color 140ms ease;
}
.user-bubble-expand-row .user-bubble-expand-btn:hover {
background: transparent;
- color: var(--claude-text);
+ color: var(--text-primary);
}
.user-bubble-actions {
@@ -1122,7 +1122,7 @@
.user-bubble-time {
font-size: 12px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
margin-left: auto;
padding-left: 8px;
line-height: 20px;
@@ -1143,7 +1143,7 @@
border-radius: 6px;
padding: 0;
background: transparent;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
cursor: pointer;
display: inline-flex;
align-items: center;
@@ -1156,7 +1156,7 @@
.user-bubble-action-btn:hover {
background-color: var(--theme-tab-active);
- color: var(--claude-text);
+ color: var(--text-primary);
}
.user-bubble-action-btn::before {
@@ -1195,8 +1195,8 @@
}
.assistant-message .message-text {
- background: var(--claude-highlight);
- border-left: 4px solid var(--claude-accent);
+ background: var(--highlight);
+ border-left: 4px solid var(--accent);
}
.user-message .message-text.user-bubble-text .image-inline-row {
@@ -1237,7 +1237,7 @@
margin: 0;
font-size: 15px;
font-weight: 600;
- color: var(--claude-text);
+ color: var(--text-primary);
letter-spacing: 0.08em;
background: transparent;
border: none;
@@ -1273,7 +1273,7 @@
font-family: 'SF Mono', 'Monaco', 'Consolas', monospace;
font-size: 13px;
line-height: 1.6;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
scrollbar-width: none;
}
@@ -1286,7 +1286,7 @@
border-radius: 12px;
margin-bottom: 12px;
overflow: hidden;
- border: 1px solid var(--claude-border);
+ border: 1px solid var(--border-default);
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
box-shadow: none;
}
@@ -1307,7 +1307,7 @@
}
.collapsible-header:hover {
- background: var(--claude-highlight);
+ background: var(--highlight);
}
/* 深色模式下块 hover 对齐对话列表 hover 颜色 */
@@ -1330,7 +1330,7 @@ body[data-theme='dark'] .collapsible-header:hover {
mask-position: center;
-webkit-mask-position: center;
transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
/* 移除旧的 ::before 箭头 */
@@ -1357,7 +1357,7 @@ body[data-theme='dark'] .collapsible-header:hover {
align-items: center;
gap: 6px;
font-size: 14px;
- color: var(--claude-text);
+ color: var(--text-primary);
}
.collapsible-content {
@@ -1402,7 +1402,7 @@ body[data-theme='dark'] .collapsible-header:hover {
padding: 13px 13px 13px 37px;
font-size: 13px;
line-height: 1.6;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
scrollbar-width: none;
}
@@ -1438,9 +1438,9 @@ body[data-theme='dark'] .collapsible-header:hover {
.stacked-shell {
position: relative;
- border: 1px solid var(--claude-border);
+ border: 1px solid var(--border-default);
border-radius: 16px;
- background: var(--claude-card);
+ background: var(--surface-card);
box-shadow: none;
overflow: hidden;
min-height: 0;
@@ -1458,7 +1458,7 @@ body[data-theme='dark'] .collapsible-header:hover {
}
.stacked-item {
- border-bottom: 1px solid var(--claude-border);
+ border-bottom: 1px solid var(--border-default);
}
.stacked-item:last-child {
@@ -1481,8 +1481,8 @@ body[data-theme='dark'] .collapsible-header:hover {
.stacked-more-block {
position: absolute;
inset: 0 0 auto 0;
- background: var(--claude-card);
- border-bottom: 0 solid var(--claude-border);
+ background: var(--surface-card);
+ border-bottom: 0 solid var(--border-default);
display: flex;
align-items: center;
gap: 10px;
@@ -1526,11 +1526,11 @@ body[data-theme='dark'] .more-icon {
.more-title {
font-weight: 700;
- color: var(--claude-text);
+ color: var(--text-primary);
}
.more-desc {
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 12px;
}
@@ -1578,7 +1578,7 @@ body[data-theme='dark'] .more-icon {
bottom: 0;
left: 0;
height: 2px;
- background: var(--claude-accent);
+ background: var(--accent);
animation: progress-bar 2s ease-in-out infinite;
opacity: 0;
transition: opacity 0.3s ease;
@@ -1606,18 +1606,18 @@ body[data-theme='dark'] .more-icon {
.status-text {
font-size: 14px;
- color: var(--claude-text);
+ color: var(--text-primary);
font-weight: 500;
white-space: nowrap;
flex-shrink: 0;
}
.collapsible-block.processing .status-text {
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.tool-desc {
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 12px;
margin-left: 8px;
white-space: nowrap;
@@ -1651,7 +1651,7 @@ body[data-theme='dark'] .more-icon {
.text-output {
margin: 16px 0;
- color: var(--claude-text);
+ color: var(--text-primary);
font-size: 15px;
line-height: 1.7;
}
@@ -1660,7 +1660,7 @@ body[data-theme='dark'] .more-icon {
display: block;
max-width: 100%;
margin: 14px auto;
- border: 1px solid var(--claude-border);
+ border: 1px solid var(--border-default);
border-radius: 12px;
overflow: hidden;
background: transparent;
@@ -1683,18 +1683,18 @@ body[data-theme='dark'] .more-icon {
.chat-inline-card__pending-tip {
font-size: 13px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.chat-inline-card__error {
font-size: 12px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
text-align: center;
}
.chat-inline-card__caption {
font-size: 12px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
text-align: center;
line-height: 1.4;
padding: 0 8px;
@@ -1718,16 +1718,16 @@ body[data-theme='dark'] .more-icon {
max-height: 720px;
object-fit: contain;
border-radius: 12px;
- border: 1px solid var(--claude-border);
+ border: 1px solid var(--border-default);
box-shadow: none;
- background: var(--claude-card);
+ background: var(--surface-card);
}
.chat-inline-card--error {
- border: 1px dashed var(--claude-accent);
+ border: 1px dashed var(--accent);
padding: 6px 10px;
border-radius: 12px;
- background: var(--claude-highlight);
+ background: var(--highlight);
}
.chat-inline-card--html {
@@ -1751,9 +1751,9 @@ body[data-theme='dark'] .more-icon {
width: 26px;
height: 26px;
border-radius: 999px;
- border: 1px solid var(--claude-border);
- background: color-mix(in srgb, var(--claude-card) 78%, transparent);
- color: var(--claude-text-secondary);
+ border: 1px solid var(--border-default);
+ background: color-mix(in srgb, var(--surface-card) 78%, transparent);
+ color: var(--text-secondary);
display: inline-flex;
align-items: center;
justify-content: center;
@@ -1767,9 +1767,9 @@ body[data-theme='dark'] .more-icon {
}
.chat-inline-card__refresh-btn:hover {
- color: var(--claude-text);
- border-color: var(--claude-accent);
- background: color-mix(in srgb, var(--claude-highlight) 72%, transparent);
+ color: var(--text-primary);
+ border-color: var(--accent);
+ background: color-mix(in srgb, var(--highlight) 72%, transparent);
}
.chat-inline-card__refresh-btn.is-refreshing {
@@ -1795,7 +1795,7 @@ body[data-theme='dark'] .more-icon {
.chat-inline-html__pending-tip {
font-size: 13px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.chat-inline-html__iframe {
@@ -1824,7 +1824,7 @@ show-html:not([data-rendered='1']) {
margin: 14px auto;
box-sizing: border-box;
overflow: hidden;
- border: 1px solid var(--claude-border);
+ border: 1px solid var(--border-default);
border-radius: 12px;
background: transparent;
box-shadow: none;
@@ -1926,7 +1926,7 @@ show-html:not([data-rendered='1'])[ratio='3:4'] {
overflow-x: auto;
overflow-y: hidden;
-webkit-overflow-scrolling: touch;
- border: 1px solid var(--claude-border);
+ border: 1px solid var(--border-default);
border-radius: 12px;
background: var(--theme-surface-soft);
box-shadow: none;
@@ -1951,13 +1951,13 @@ show-html:not([data-rendered='1'])[ratio='3:4'] {
.text-output .text-content .md-table-scroll::-webkit-scrollbar-thumb,
.text-output .text-content [data-md-table-scroll='1']::-webkit-scrollbar-thumb {
- background: color-mix(in srgb, var(--claude-text-secondary) 55%, transparent);
+ background: color-mix(in srgb, var(--text-secondary) 55%, transparent);
border-radius: 999px;
}
.text-output .text-content .md-table-scroll,
.text-output .text-content [data-md-table-scroll='1'] {
- scrollbar-color: color-mix(in srgb, var(--claude-text-secondary) 55%, transparent)
+ scrollbar-color: color-mix(in srgb, var(--text-secondary) 55%, transparent)
color-mix(in srgb, var(--theme-surface-muted) 70%, transparent);
scrollbar-width: thin;
}
@@ -1968,7 +1968,7 @@ show-html:not([data-rendered='1'])[ratio='3:4'] {
.text-output .text-content th,
.text-output .text-content td {
- border: 1px solid var(--claude-border);
+ border: 1px solid var(--border-default);
padding: 10px 14px;
text-align: left;
vertical-align: middle;
@@ -1977,13 +1977,13 @@ show-html:not([data-rendered='1'])[ratio='3:4'] {
.text-output .text-content th {
font-weight: 600;
- color: var(--claude-text);
+ color: var(--text-primary);
}
.text-output .text-content hr {
margin: 32px calc(var(--chat-content-x) * -1);
border: none;
- border-top: 1px solid var(--claude-border);
+ border-top: 1px solid var(--border-default);
}
.system-action {
@@ -1992,7 +1992,7 @@ show-html:not([data-rendered='1'])[ratio='3:4'] {
border-radius: 8px;
background: linear-gradient(135deg, color-mix(in srgb, var(--state-info) 8%, transparent), color-mix(in srgb, var(--state-info) 8%, transparent));
border-left: 4px solid var(--state-info);
- color: var(--claude-text);
+ color: var(--text-primary);
font-size: 14px;
line-height: 1.5;
}
@@ -2008,7 +2008,7 @@ show-html:not([data-rendered='1'])[ratio='3:4'] {
margin: 0;
font-size: 15px;
line-height: 1.7;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.append-block,
@@ -2017,12 +2017,12 @@ show-html:not([data-rendered='1'])[ratio='3:4'] {
padding: 12px 16px;
border-radius: 10px;
background: var(--theme-surface-soft);
- border-left: 4px solid var(--claude-accent);
+ border-left: 4px solid var(--accent);
box-shadow: none;
display: flex;
flex-direction: column;
gap: 8px;
- color: var(--claude-text);
+ color: var(--text-primary);
}
.append-block.append-error,
@@ -2039,7 +2039,7 @@ show-html:not([data-rendered='1'])[ratio='3:4'] {
}
.code-block-wrapper {
- border: 1px solid var(--claude-border);
+ border: 1px solid var(--border-default);
border-radius: 20px;
overflow: hidden;
margin: 16px 0;
@@ -2059,11 +2059,11 @@ show-html:not([data-rendered='1'])[ratio='3:4'] {
display: flex;
justify-content: space-between;
align-items: center;
- border-bottom: 1px solid var(--claude-border);
+ border-bottom: 1px solid var(--border-default);
}
.code-language {
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 14px;
line-height: 1;
letter-spacing: -0.01em;
@@ -2078,7 +2078,7 @@ show-html:not([data-rendered='1'])[ratio='3:4'] {
padding: 0;
border-radius: 10px;
background-color: transparent;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
cursor: pointer;
opacity: 0.9;
transition:
@@ -2100,7 +2100,7 @@ show-html:not([data-rendered='1'])[ratio='3:4'] {
.copy-code-btn:hover {
background-color: var(--theme-tab-active);
- color: var(--claude-text);
+ color: var(--text-primary);
}
.copy-code-btn.copied::before {
@@ -2138,7 +2138,7 @@ show-html:not([data-rendered='1'])[ratio='3:4'] {
padding: 0 !important;
border: 0 !important;
box-shadow: none !important;
- color: var(--claude-text);
+ color: var(--text-primary);
font-family:
'JetBrains Mono', 'SF Mono', 'Fira Code', 'Consolas', 'Menlo', 'Monaco', 'Courier New',
monospace !important;
@@ -2171,7 +2171,7 @@ show-html:not([data-rendered='1'])[ratio='3:4'] {
.cursor-blink {
animation: blink 1s steps(1) infinite;
- color: var(--claude-accent);
+ color: var(--accent);
}
@keyframes blink {
@@ -2211,7 +2211,7 @@ a.md-download-link {
overflow-y: hidden;
text-align: center;
scrollbar-width: thin;
- scrollbar-color: color-mix(in srgb, var(--claude-text-secondary) 55%, transparent) transparent;
+ scrollbar-color: color-mix(in srgb, var(--text-secondary) 55%, transparent) transparent;
&::-webkit-scrollbar {
height: 6px;
@@ -2222,7 +2222,7 @@ a.md-download-link {
}
&::-webkit-scrollbar-thumb {
- background: color-mix(in srgb, var(--claude-text-secondary) 55%, transparent);
+ background: color-mix(in srgb, var(--text-secondary) 55%, transparent);
border-radius: 999px;
}
diff --git a/static/src/styles/components/drag-upload.scss b/static/src/styles/components/drag-upload.scss
index c35d644b..ad474cb7 100644
--- a/static/src/styles/components/drag-upload.scss
+++ b/static/src/styles/components/drag-upload.scss
@@ -19,16 +19,16 @@
align-items: center;
gap: 16px;
padding: 48px 64px;
- border: 2px dashed var(--claude-accent);
+ border: 2px dashed var(--accent);
border-radius: 16px;
- background: var(--claude-highlight);
+ background: var(--highlight);
animation: drag-pulse 1.5s ease-in-out infinite;
}
.drag-upload-icon {
width: 64px;
height: 64px;
- color: var(--claude-accent);
+ color: var(--accent);
svg {
width: 100%;
@@ -39,12 +39,12 @@
.drag-upload-text {
font-size: 20px;
font-weight: 600;
- color: var(--claude-text);
+ color: var(--text-primary);
}
.drag-upload-hint {
font-size: 14px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
// 动画 - 使用主题色的脉冲效果(颜色走 --pulse-ring,随主题自动适配)
@@ -71,16 +71,16 @@
// 浅色主题(light) - 使用黑色强调
:root[data-theme='light'] {
.drag-upload-content {
- border-color: var(--claude-text);
- background: var(--claude-highlight);
+ border-color: var(--text-primary);
+ background: var(--highlight);
}
.drag-upload-icon {
- color: var(--claude-text);
+ color: var(--text-primary);
}
.drag-upload-hint {
- color: var(--claude-text);
+ color: var(--text-primary);
}
}
@@ -88,18 +88,18 @@
:root[data-theme='classic'],
:root:not([data-theme]) {
.drag-upload-hint {
- color: var(--claude-text);
+ color: var(--text-primary);
}
}
// 深色主题(dark) - 使用白色强调
:root[data-theme='dark'] {
.drag-upload-content {
- border-color: var(--claude-text);
- background: var(--claude-highlight);
+ border-color: var(--text-primary);
+ background: var(--highlight);
}
.drag-upload-icon {
- color: var(--claude-text);
+ color: var(--text-primary);
}
}
diff --git a/static/src/styles/components/input/_composer.scss b/static/src/styles/components/input/_composer.scss
index 92c3bbec..64837583 100644
--- a/static/src/styles/components/input/_composer.scss
+++ b/static/src/styles/components/input/_composer.scss
@@ -86,7 +86,7 @@
display: block;
font-size: 13px;
line-height: 1.3;
- color: var(--claude-text);
+ color: var(--text-primary);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
@@ -96,7 +96,7 @@
flex-shrink: 0;
border: none;
background: transparent;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 12px;
line-height: 1.2;
padding: 3px 4px;
@@ -108,7 +108,7 @@
.runtime-queue-item__action:hover {
background: var(--theme-chip-bg);
- color: var(--claude-text);
+ color: var(--text-primary);
}
.runtime-queue-item__action--danger:hover {
@@ -147,7 +147,7 @@
(var(--skill-slash-row-height) * var(--skill-slash-visible-rows)) +
(var(--skill-slash-gap) * (var(--skill-slash-visible-rows) + 1)) + 2px + 2px - 2px
);
- border: 1px solid var(--claude-border);
+ border: 1px solid var(--border-default);
border-top-left-radius: var(--skill-slash-radius);
border-top-right-radius: var(--skill-slash-radius);
background: var(--surface-soft);
@@ -224,7 +224,7 @@
border-radius: 7px;
padding: 3px 9px;
background: transparent;
- color: var(--claude-text);
+ color: var(--text-primary);
text-align: left;
cursor: pointer;
}
@@ -275,7 +275,7 @@
.skill-slash-item__description {
flex: 1 1 auto;
min-width: 0;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 12px;
white-space: nowrap;
overflow: hidden;
@@ -289,7 +289,7 @@
display: flex;
align-items: center;
padding: 3px 9px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 11px;
}
@@ -313,7 +313,7 @@ body[data-theme='dark'] {
.skill-slash-menu-wrapper {
background: var(--badge-bg);
- border-color: var(--claude-border);
+ border-color: var(--border-default);
}
.skill-slash-item__name {
@@ -401,7 +401,7 @@ body[data-theme='light'] {
.context-usage-ring {
--context-progress: 0%;
- --context-ring-color: var(--claude-accent);
+ --context-ring-color: var(--accent);
width: 18px;
height: 18px;
border-radius: 50%;
@@ -432,7 +432,7 @@ body[data-theme='light'] {
border: 1px solid var(--theme-control-border);
background: var(--theme-surface-soft);
box-shadow: none;
- color: var(--claude-text);
+ color: var(--text-primary);
font-size: 12px;
line-height: 1.35;
opacity: 0;
@@ -451,7 +451,7 @@ body[data-theme='light'] {
.permission-switcher__btn {
border: none;
background: transparent;
- color: var(--claude-text);
+ color: var(--text-primary);
border-radius: 999px;
padding: 4px 12px;
font-size: 14px;
@@ -465,7 +465,7 @@ body[data-theme='light'] {
}
.permission-switcher__btn:hover:not(:disabled) {
- color: var(--claude-text);
+ color: var(--text-primary);
text-decoration: none;
background: var(--theme-chip-bg);
box-shadow: none;
@@ -516,14 +516,14 @@ body[data-theme='light'] {
.permission-switcher__group-title {
font-size: 12px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-weight: 600;
padding: 2px 4px;
}
.permission-switcher__caret {
font-size: 14px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
transform: rotate(90deg);
transition: transform 0.18s ease;
}
@@ -547,7 +547,7 @@ body[data-theme='light'] {
border-radius: 10px;
padding: 8px 10px;
cursor: pointer;
- color: var(--claude-text);
+ color: var(--text-primary);
display: flex;
flex-direction: column;
gap: 2px;
@@ -568,7 +568,7 @@ body[data-theme='light'] {
.permission-switcher__item-desc {
font-size: 11px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
line-height: 1.35;
}
@@ -684,7 +684,7 @@ body[data-theme='light'] {
.stadium-input-editor p.is-editor-empty:first-child::before {
content: attr(data-placeholder);
- color: var(--claude-text-tertiary);
+ color: var(--text-tertiary);
float: left;
height: 0;
pointer-events: none;
@@ -733,7 +733,7 @@ body[data-theme='light'] {
font-size: 14px;
line-height: 1.4;
font-family: inherit;
- color: var(--claude-text);
+ color: var(--text-primary);
white-space: pre-wrap;
word-break: break-all;
overflow-wrap: normal;
@@ -793,7 +793,7 @@ body[data-theme='light'] {
border: none;
border-radius: 7px;
background: transparent;
- color: var(--claude-text);
+ color: var(--text-primary);
font-size: 16px;
cursor: pointer;
display: flex;
@@ -818,13 +818,13 @@ body[data-theme='light'] {
}
.stadium-btn.send-btn {
- background: var(--claude-accent);
+ background: var(--accent);
color: var(--on-accent);
box-shadow: none;
}
.stadium-btn.send-btn:hover:not(:disabled) {
- background: var(--claude-button-hover);
+ background: var(--accent-hover);
}
.stadium-btn.send-btn:disabled {
@@ -971,7 +971,7 @@ body[data-theme='light'] {
width: 230px;
padding: 12px;
background: var(--surface-soft);
- border: 1px solid var(--claude-border);
+ border: 1px solid var(--border-default);
border-radius: 18px;
box-shadow: none;
z-index: 30;
@@ -988,7 +988,7 @@ body[data-theme='light'] {
border-radius: 12px;
font-size: 14px;
text-align: left;
- color: var(--claude-text);
+ color: var(--text-primary);
display: flex;
align-items: center;
justify-content: space-between;
@@ -1008,7 +1008,7 @@ body[data-theme='light'] {
.menu-entry.active {
background: var(--chip-bg);
- color: var(--claude-text);
+ color: var(--text-primary);
font-weight: 600;
}
@@ -1019,7 +1019,7 @@ body[data-theme='light'] {
.menu-entry.has-submenu .entry-arrow {
margin-left: 10px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.quick-submenu {
@@ -1030,7 +1030,7 @@ body[data-theme='light'] {
min-width: 0;
padding: 12px;
border-radius: 18px;
- border: 1px solid var(--claude-border);
+ border: 1px solid var(--border-default);
background: var(--surface-soft);
box-shadow: none;
z-index: 31;
@@ -1039,7 +1039,7 @@ body[data-theme='light'] {
.submenu-status,
.submenu-empty {
font-size: 13px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.submenu-list {
@@ -1129,7 +1129,7 @@ body[data-theme='light'] {
}
.menu-entry.submenu-entry .entry-arrow {
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.tool-submenu-list {
@@ -1190,7 +1190,7 @@ body[data-theme='light'] {
right: 0;
bottom: calc(100% + 12px);
background: var(--surface-soft);
- border: 1px solid var(--claude-border);
+ border: 1px solid var(--border-default);
border-radius: 12px;
box-shadow: none;
padding: 12px;
@@ -1261,7 +1261,7 @@ body[data-theme='light'] {
flex: 1;
font-size: 13px;
font-weight: 500;
- color: var(--claude-text);
+ color: var(--text-primary);
display: inline-flex;
flex-direction: column;
align-items: center;
@@ -1296,7 +1296,7 @@ body[data-theme='light'] {
font-weight: 500;
text-align: left;
background: var(--surface-soft);
- color: var(--claude-text);
+ color: var(--text-primary);
cursor: pointer;
transition: all 0.2s ease;
}
@@ -1313,7 +1313,7 @@ body[data-theme='light'] {
.menu-btn.compress-entry {
background: var(--surface-soft);
- color: var(--claude-success);
+ color: var(--state-success);
}
.menu-btn.compress-entry:not(:disabled):hover {
@@ -1350,7 +1350,7 @@ body[data-theme='light'] {
.mobile-approval-overlay .mobile-panel-sheet--approval {
pointer-events: auto;
- background: var(--claude-panel);
+ background: var(--surface-panel);
}
/* 手机端审批面板按钮样式 - 与电脑端一致 */
@@ -1362,9 +1362,9 @@ body[data-theme='light'] {
}
.mobile-panel-sheet--approval .approval-btn--approve {
- background: var(--claude-accent);
+ background: var(--accent);
color: var(--on-accent);
- border-color: var(--claude-accent);
+ border-color: var(--accent);
}
.mobile-panel-sheet--approval .approval-btn--reject {
@@ -1374,8 +1374,8 @@ body[data-theme='light'] {
.mobile-panel-sheet--approval .approval-btn--switch {
background: transparent;
- border-color: var(--claude-accent);
- color: var(--claude-accent);
+ border-color: var(--accent);
+ color: var(--accent);
}
/* 审批卡片样式保持一致 */
@@ -1392,7 +1392,7 @@ body[data-theme='light'] {
.mobile-panel-sheet--approval .sidebar-header,
.mobile-panel-sheet--approval .sidebar .sidebar-header {
background: transparent !important;
- border-color: var(--claude-border);
+ border-color: var(--border-default);
padding: 0 16px !important;
}
diff --git a/static/src/styles/components/overlays/_overlays.scss b/static/src/styles/components/overlays/_overlays.scss
index f0a35322..4fc4c971 100644
--- a/static/src/styles/components/overlays/_overlays.scss
+++ b/static/src/styles/components/overlays/_overlays.scss
@@ -24,7 +24,7 @@
box-shadow: var(--theme-shadow-strong);
padding: 40px;
text-align: left;
- color: var(--claude-text);
+ color: var(--text-primary);
display: flex;
flex-direction: column;
overflow: hidden;
@@ -51,7 +51,7 @@
.personal-page-header p {
margin: 6px 0 0;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 14px;
}
@@ -60,7 +60,7 @@
padding: 8px 18px;
border-radius: 999px;
border: none;
- background: linear-gradient(135deg, var(--claude-accent) 0%, var(--claude-accent-strong) 100%);
+ background: linear-gradient(135deg, var(--accent) 0%, var(--accent-strong) 100%);
color: var(--surface-card);
font-size: 13px;
font-weight: 600;
@@ -82,7 +82,7 @@
border-radius: 999px;
border: 1px solid var(--theme-control-border-strong);
background: var(--theme-surface-soft);
- color: var(--claude-text);
+ color: var(--text-primary);
font-size: 13px;
font-weight: 600;
cursor: pointer;
@@ -128,7 +128,7 @@
}
.toggle-desc {
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 13px;
}
@@ -165,7 +165,7 @@
}
.toggle-switch input:checked + .switch-slider {
- background: var(--claude-accent);
+ background: var(--accent);
}
.toggle-switch input:checked + .switch-slider::before {
@@ -229,7 +229,7 @@
.fancy-path {
fill: none;
- stroke: var(--claude-text-secondary);
+ stroke: var(--text-secondary);
stroke-width: 5;
stroke-linecap: round;
stroke-linejoin: round;
@@ -247,13 +247,13 @@
}
.toggle-row input:checked + .fancy-check .fancy-path {
- stroke: var(--claude-accent);
+ stroke: var(--accent);
stroke-dasharray: 70.5096664428711 9999999;
stroke-dashoffset: -262.2723388671875;
}
.toggle-row span {
- color: var(--claude-text);
+ color: var(--text-primary);
font-weight: 500;
}
@@ -296,7 +296,7 @@
text-align: left;
font-weight: 600;
background: transparent;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
cursor: pointer;
transition:
background 0.2s ease,
@@ -308,14 +308,14 @@
display: block;
font-size: 11px;
font-weight: 500;
- color: var(--claude-text-tertiary);
+ color: var(--text-tertiary);
margin-top: 2px;
letter-spacing: 0.4px;
}
.personal-tab-button.active {
background: var(--theme-tab-active);
- color: var(--claude-accent);
+ color: var(--accent);
box-shadow: 0 10px 24px var(--border-default);
}
@@ -840,7 +840,7 @@
}
.behavior-field-header .field-desc {
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 13px;
}
@@ -933,7 +933,7 @@
}
.experiment-copy p {
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
line-height: 1.6;
}
@@ -941,7 +941,7 @@
text-transform: uppercase;
font-size: 12px;
letter-spacing: 0.4em;
- color: var(--claude-accent);
+ color: var(--accent);
margin-bottom: 6px;
}
@@ -965,7 +965,7 @@
.experiment-toggle-info p {
margin: 0;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.experiment-toggle .toggle-text {
@@ -988,7 +988,7 @@
margin: 0;
padding-left: 20px;
line-height: 1.6;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
/* Liquid glass overlay */
@@ -1173,12 +1173,12 @@
}
.run-mode-card:hover {
- border-color: var(--claude-accent);
+ border-color: var(--accent);
transform: translateY(-1px);
}
.run-mode-card.active {
- border-color: var(--claude-accent);
+ border-color: var(--accent);
background: var(--theme-tab-active);
box-shadow: 0 8px 20px var(--border-default);
}
@@ -1194,12 +1194,12 @@
.run-mode-title {
font-weight: 600;
font-size: 15px;
- color: var(--claude-text);
+ color: var(--text-primary);
}
.run-mode-badge {
font-size: 12px;
- color: var(--claude-accent);
+ color: var(--accent);
font-weight: 600;
background: var(--theme-badge-bg);
border-radius: 999px;
@@ -1207,7 +1207,7 @@
}
.run-mode-desc {
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 13px;
line-height: 1.4;
}
@@ -1230,12 +1230,12 @@
align-items: center;
gap: 4px;
font-weight: 600;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.thinking-presets button.active {
- border-color: var(--claude-accent);
- color: var(--claude-accent);
+ border-color: var(--accent);
+ color: var(--accent);
background: var(--theme-tab-active);
}
@@ -1266,12 +1266,12 @@
}
.thinking-hint {
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 13px;
}
.behavior-hint {
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 13px;
}
@@ -1290,7 +1290,7 @@
.link-button {
border: none;
background: none;
- color: var(--claude-accent);
+ color: var(--accent);
font-weight: 600;
cursor: pointer;
}
@@ -1313,7 +1313,7 @@
}
.tool-category-chip input {
- accent-color: var(--claude-accent);
+ accent-color: var(--accent);
}
.global-actions {
@@ -1356,14 +1356,14 @@
.theme-header p {
margin: 0;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.theme-badge {
padding: 6px 12px;
border-radius: 12px;
background: var(--theme-badge-bg);
- color: var(--claude-accent);
+ color: var(--accent);
font-weight: 700;
font-size: 12px;
letter-spacing: 0.08em;
@@ -1393,13 +1393,13 @@
}
.theme-card:hover {
- border-color: var(--claude-accent);
+ border-color: var(--accent);
box-shadow: var(--theme-shadow-soft);
transform: translateY(-1px);
}
.theme-card.active {
- border-color: var(--claude-accent);
+ border-color: var(--accent);
box-shadow: 0 10px 28px var(--shadow-color);
background: var(--theme-tab-active);
}
@@ -1426,7 +1426,7 @@
.theme-check {
font-weight: 700;
- color: var(--claude-accent);
+ color: var(--accent);
font-size: 16px;
}
@@ -1437,13 +1437,13 @@
.theme-card-body p {
margin: 0;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
line-height: 1.5;
}
.theme-note {
margin: 0;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 13px;
}
@@ -1528,7 +1528,7 @@
padding: 0;
border-radius: 8px;
background: transparent;
- color: var(--claude-text);
+ color: var(--text-primary);
cursor: pointer;
pointer-events: auto;
display: flex;
@@ -1715,7 +1715,7 @@
border-radius: 50%;
border: none;
background: transparent;
- color: var(--claude-text);
+ color: var(--text-primary);
display: flex;
align-items: center;
justify-content: center;
@@ -1774,7 +1774,7 @@
.mobile-panel-sheet {
width: 100%;
height: 100%;
- background: var(--claude-left-rail);
+ background: var(--surface-rail);
border-radius: 0;
box-shadow: none;
padding: 0;
@@ -1787,11 +1787,11 @@
.mobile-panel-sheet--conversation,
.mobile-panel-sheet--workspace {
- background: var(--claude-left-rail);
+ background: var(--surface-rail);
}
.mobile-panel-sheet--conversation {
- background: var(--claude-left-rail);
+ background: var(--surface-rail);
width: min(var(--conversation-expanded-width, 306px), 100vw);
max-width: 100vw;
padding-top: 0;
@@ -1804,14 +1804,14 @@
}
.mobile-panel-sheet--approval {
- background: var(--claude-panel);
+ background: var(--surface-panel);
width: min(460px, 92vw);
max-width: 92vw;
padding-top: 0;
}
.mobile-panel-sheet--focus {
- background: var(--claude-panel);
+ background: var(--surface-panel);
}
.mobile-overlay-close {
@@ -1823,7 +1823,7 @@
border-radius: 16px;
border: none;
background: var(--border-default);
- color: var(--claude-text);
+ color: var(--text-primary);
font-size: 18px;
cursor: pointer;
z-index: 5;
@@ -1915,7 +1915,7 @@
.desktop-approval-sheet {
height: 100%;
max-width: 92vw;
- background: var(--claude-panel);
+ background: var(--surface-panel);
box-shadow: var(--shadow-strong);
overflow: hidden;
display: flex;
@@ -1999,7 +1999,7 @@
.confirm-message {
font-size: 14px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.confirm-warning {
@@ -2028,7 +2028,7 @@
.confirm-button {
border: 1px solid var(--theme-control-border-strong);
background: transparent;
- color: var(--claude-text);
+ color: var(--text-primary);
border-radius: 10px;
padding: 8px 20px;
font-weight: 500;
@@ -2036,8 +2036,8 @@
}
.confirm-button--primary {
- background: var(--claude-accent);
- border-color: var(--claude-accent-strong);
+ background: var(--accent);
+ border-color: var(--accent-strong);
color: var(--on-accent);
}
@@ -2091,7 +2091,7 @@
.subagent-activity-close {
border: none;
background: transparent;
- color: var(--claude-text);
+ color: var(--text-primary);
font-size: 20px;
cursor: pointer;
padding: 4px 8px;
@@ -2107,7 +2107,7 @@
align-items: center;
gap: 12px;
font-size: 13px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
flex-wrap: wrap;
}
@@ -2186,7 +2186,7 @@
.subagent-activity-empty,
.subagent-activity-error {
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 13px;
}
@@ -2206,7 +2206,7 @@
}
.subagent-activity-text {
- color: var(--claude-text);
+ color: var(--text-primary);
line-height: 1.4;
word-break: break-all;
}
@@ -2243,7 +2243,7 @@
border: 1px solid var(--theme-control-border);
border-radius: 12px;
background: var(--theme-surface-soft);
- color: var(--claude-text);
+ color: var(--text-primary);
padding: 14px;
font-size: 12px;
line-height: 1.5;
@@ -2393,7 +2393,7 @@
flex-wrap: wrap;
gap: 10px;
font-size: 13px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.tone-preset-buttons {
@@ -2412,8 +2412,8 @@
}
.tone-preset-buttons button:hover {
- border-color: var(--claude-accent);
- color: var(--claude-accent);
+ border-color: var(--accent);
+ color: var(--accent);
}
.consideration-input {
@@ -2431,7 +2431,7 @@
height: 38px;
border-radius: 12px;
border: none;
- background: var(--claude-accent);
+ background: var(--accent);
color: var(--surface-card);
font-size: 20px;
font-weight: 600;
@@ -2465,13 +2465,13 @@
.drag-handle {
font-size: 16px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.consideration-text {
flex: 1;
font-size: 14px;
- color: var(--claude-text);
+ color: var(--text-primary);
}
.consideration-remove {
@@ -2487,7 +2487,7 @@
.consideration-hint,
.consideration-limit {
font-size: 13px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.personal-form-actions {
@@ -2541,7 +2541,7 @@
padding: 10px 20px;
border: none;
border-radius: 999px;
- background: linear-gradient(135deg, var(--claude-accent) 0%, var(--claude-accent-strong) 100%);
+ background: linear-gradient(135deg, var(--accent) 0%, var(--accent-strong) 100%);
color: var(--text-primary);
font-weight: 600;
cursor: pointer;
@@ -2577,7 +2577,7 @@
.personalization-loading {
padding: 32px 0;
text-align: center;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 14px;
}
@@ -2665,7 +2665,7 @@
opacity: 1;
}
.panel-card {
- border-left: 1px solid var(--claude-border);
+ border-left: 1px solid var(--border-default);
padding: 0 0 0 0;
}
.app-loading-state {
@@ -2677,7 +2677,7 @@
justify-content: center;
gap: 28px;
text-align: center;
- color: var(--claude-text);
+ color: var(--text-primary);
}
.loading-animation {
@@ -2697,15 +2697,15 @@
.loading-copy p {
margin: 6px 0 0;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.loading-refresh-btn {
margin-top: 14px;
- border: 1px solid var(--claude-border);
+ border: 1px solid var(--border-default);
border-radius: 10px;
- background: var(--claude-panel);
- color: var(--claude-text);
+ background: var(--surface-panel);
+ color: var(--text-primary);
padding: 8px 14px;
font-size: 13px;
cursor: pointer;
@@ -2722,8 +2722,8 @@
.boxes {
--size: 34px;
--duration: 900ms;
- --box-primary: var(--claude-accent);
- --box-secondary: var(--claude-accent-strong);
+ --box-primary: var(--accent);
+ --box-secondary: var(--accent-strong);
--box-tertiary: color-mix(in srgb, var(--accent) 30%, white);
height: calc(var(--size) * 2);
width: calc(var(--size) * 3);
@@ -3461,7 +3461,7 @@ body[data-theme='dark'] {
/* 左侧面板头部(文件/待办事项/子智能体标签栏) */
.sidebar-header {
- background: var(--claude-left-rail);
+ background: var(--surface-rail);
}
/* 移动端审批面板 - 移除所有背景让内容顶头 */
@@ -3588,7 +3588,7 @@ body[data-theme='dark'] {
.tutorial-intro-eyebrow {
margin: 0;
font-size: 12px;
- color: var(--claude-text-tertiary);
+ color: var(--text-tertiary);
letter-spacing: 0.06em;
}
@@ -3602,7 +3602,7 @@ body[data-theme='dark'] {
.tutorial-status-text,
.tutorial-feature-item p {
margin: 0;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
line-height: 1.55;
}
@@ -3643,7 +3643,7 @@ body[data-theme='dark'] {
.tutorial-status-badge.success {
color: var(--text-primary);
- background: linear-gradient(135deg, var(--claude-success), color-mix(in srgb, var(--state-success) 70%, black));
+ background: linear-gradient(135deg, var(--state-success), color-mix(in srgb, var(--state-success) 70%, black));
}
.tutorial-intro-actions {
@@ -3661,7 +3661,7 @@ body[data-theme='dark'] {
font-size: 14px;
font-weight: 700;
color: var(--text-primary);
- background: linear-gradient(135deg, var(--claude-accent), var(--claude-accent-strong));
+ background: linear-gradient(135deg, var(--accent), var(--accent-strong));
cursor: pointer;
}
@@ -3732,7 +3732,7 @@ body[data-theme='dark'] {
border-radius: 14px;
border: 1px solid var(--theme-control-border-strong);
background: var(--theme-surface-card);
- color: var(--claude-text);
+ color: var(--text-primary);
box-shadow: var(--theme-shadow-strong);
padding: 14px 14px 12px;
pointer-events: auto;
@@ -3754,13 +3754,13 @@ body[data-theme='dark'] {
.tutorial-popover__step {
font-size: 12px;
font-weight: 700;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.tutorial-popover__close {
border: 1px solid var(--theme-control-border);
background: var(--theme-surface-soft);
- color: var(--claude-text);
+ color: var(--text-primary);
border-radius: 999px;
padding: 4px 10px;
font-size: 12px;
@@ -3776,7 +3776,7 @@ body[data-theme='dark'] {
margin: 8px 0 0;
font-size: 13px;
line-height: 1.58;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.tutorial-popover__hint,
@@ -3786,7 +3786,7 @@ body[data-theme='dark'] {
}
.tutorial-popover__hint {
- color: var(--claude-accent-strong);
+ color: var(--accent-strong);
}
.tutorial-popover__warn {
@@ -3808,7 +3808,7 @@ body[data-theme='dark'] {
font-size: 12px;
font-weight: 700;
color: var(--text-primary);
- background: linear-gradient(135deg, var(--claude-accent), var(--claude-accent-strong));
+ background: linear-gradient(135deg, var(--accent), var(--accent-strong));
cursor: pointer;
}
@@ -3818,7 +3818,7 @@ body[data-theme='dark'] {
}
.tutorial-btn--ghost {
- color: var(--claude-text);
+ color: var(--text-primary);
border: 1px solid var(--theme-control-border);
background: var(--theme-surface-soft);
}
diff --git a/static/src/styles/components/panels/_resource-panel.scss b/static/src/styles/components/panels/_resource-panel.scss
index c3c4f21f..75e6b657 100644
--- a/static/src/styles/components/panels/_resource-panel.scss
+++ b/static/src/styles/components/panels/_resource-panel.scss
@@ -1,5 +1,5 @@
.token-count {
- color: var(--claude-accent);
+ color: var(--accent);
font-weight: 500;
}
/* 顶部 Token 抽屉 */
@@ -18,8 +18,8 @@
.token-display-panel {
width: min(860px, 92%);
- background: var(--claude-panel);
- border: 1px solid var(--claude-border);
+ background: var(--surface-panel);
+ border: 1px solid var(--border-default);
border-radius: 26px;
box-shadow: 0 24px 42px var(--shadow-color);
transition: transform 0.35s ease, opacity 0.35s ease;
@@ -59,7 +59,7 @@
bottom: 0;
left: 50%;
width: 1px;
- background: var(--claude-border);
+ background: var(--border-default);
transform: translateX(-0.5px);
pointer-events: none;
z-index: 0;
@@ -92,7 +92,7 @@
align-items: center;
font-size: 14px;
font-weight: 600;
- color: var(--claude-text);
+ color: var(--text-primary);
}
.stat-grid {
@@ -115,7 +115,7 @@
}
.stat-label {
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 12px;
letter-spacing: 0.04em;
}
@@ -124,20 +124,20 @@
font-weight: 600;
font-size: 18px;
font-variant-numeric: tabular-nums;
- color: var(--claude-text);
+ color: var(--text-primary);
}
.stat-value--accent {
- color: var(--claude-accent);
+ color: var(--accent);
font-size: 20px;
}
.stat-value--success {
- color: var(--claude-success);
+ color: var(--state-success);
}
.stat-value--warning {
- color: var(--claude-warning);
+ color: var(--state-warning);
}
.stat-value--mono {
@@ -148,7 +148,7 @@
.stat-meta,
.stat-foot {
font-size: 12px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.stat-meta {
@@ -161,7 +161,7 @@
.usage-placeholder {
font-size: 13px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.token-close-btn {
@@ -262,19 +262,19 @@
.quota-label {
font-size: 12px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-weight: 500;
}
.quota-value {
font-weight: 600;
font-size: 16px;
- color: var(--claude-text);
+ color: var(--text-primary);
}
.quota-reset {
font-size: 12px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.token-item {
@@ -285,7 +285,7 @@
}
.token-label {
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 11px;
font-weight: 500;
text-transform: uppercase;
@@ -293,19 +293,19 @@
}
.token-value {
- color: var(--claude-text);
+ color: var(--text-primary);
font-weight: 600;
font-size: 18px;
font-variant-numeric: tabular-nums;
}
.token-value.current {
- color: var(--claude-accent);
+ color: var(--accent);
font-size: 20px;
}
-.token-value.input { color: var(--claude-success); }
-.token-value.output { color: var(--claude-warning); }
+.token-value.input { color: var(--state-success); }
+.token-value.output { color: var(--state-warning); }
.panel-row-title {
display: flex;
@@ -313,7 +313,7 @@
align-items: center;
margin-bottom: 12px;
font-size: 12px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
text-transform: uppercase;
letter-spacing: 0.04em;
}
@@ -329,7 +329,7 @@
font-size: 11px;
font-weight: 600;
background: var(--badge-bg);
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.quota-toast {
@@ -338,12 +338,12 @@
right: 32px;
padding: 12px 18px;
border-radius: 12px;
- background: var(--claude-bg);
- border: 1px solid var(--claude-border-strong);
+ background: var(--surface-base);
+ border: 1px solid var(--border-strong);
box-shadow: 0 12px 30px var(--shadow-color);
z-index: 2000;
max-width: 320px;
- color: var(--claude-text);
+ color: var(--text-primary);
font-weight: 500;
display: flex;
align-items: center;
@@ -387,26 +387,26 @@
gap: 12px;
padding: 12px 14px;
border-radius: 14px;
- background: var(--claude-bg);
- border: 1px solid var(--claude-border-strong);
+ background: var(--surface-base);
+ border: 1px solid var(--border-strong);
box-shadow: 0 12px 30px var(--shadow-color);
- color: var(--claude-text);
+ color: var(--text-primary);
}
.app-toast::before {
content: "";
width: 4px;
border-radius: 999px;
- background: var(--claude-text-secondary);
+ background: var(--text-secondary);
align-self: stretch;
}
.app-toast--success::before {
- background: var(--claude-success);
+ background: var(--state-success);
}
.app-toast--warning::before {
- background: var(--claude-warning);
+ background: var(--state-warning);
}
.app-toast--error::before {
@@ -432,30 +432,30 @@
.toast-close {
border: none;
background: transparent;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 16px;
cursor: pointer;
padding: 2px;
}
.toast-close:hover {
- color: var(--claude-text);
+ color: var(--text-primary);
}
.status-pill--running {
background: color-mix(in srgb, var(--state-success) 22%, transparent);
- color: var(--claude-success);
+ color: var(--state-success);
}
.status-pill--stopped {
background: color-mix(in srgb, var(--state-warning) 22%, transparent);
- color: var(--claude-warning);
+ color: var(--state-warning);
}
.status-pill--host {
background: var(--badge-bg);
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.container-metric-grid {
@@ -471,7 +471,7 @@
}
.metric-label {
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 11px;
letter-spacing: 0.04em;
text-transform: uppercase;
@@ -479,18 +479,18 @@
.metric-value {
font-weight: 600;
- color: var(--claude-text);
+ color: var(--text-primary);
font-size: 16px;
font-variant-numeric: tabular-nums;
}
.metric-subtext {
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 12px;
}
.container-empty {
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 13px;
padding: 12px 0;
}
@@ -503,7 +503,7 @@
.container-stats-card {
border-left: none;
- border-top: 1px solid var(--claude-border);
+ border-top: 1px solid var(--border-default);
padding-left: 0;
padding-top: 16px;
}
@@ -570,7 +570,7 @@
/* 搜索结果展示 */
.search-meta {
font-size: 14px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
line-height: 1.6;
margin-bottom: 12px;
word-break: break-word;
@@ -593,11 +593,11 @@
.search-result-title {
font-weight: 600;
margin-bottom: 6px;
- color: var(--claude-text);
+ color: var(--text-primary);
}
.search-result-url a {
- color: var(--claude-accent-strong);
+ color: var(--accent-strong);
text-decoration: none;
word-break: break-all;
}
@@ -608,6 +608,6 @@
.search-empty {
font-size: 13px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-style: italic;
}
diff --git a/static/src/styles/components/panels/_right-panel.scss b/static/src/styles/components/panels/_right-panel.scss
index 07668620..cf5a96a7 100644
--- a/static/src/styles/components/panels/_right-panel.scss
+++ b/static/src/styles/components/panels/_right-panel.scss
@@ -24,7 +24,7 @@
.sidebar.right-sidebar .sidebar-header h3 {
font-size: 15px;
font-weight: 600;
- color: var(--claude-text);
+ color: var(--text-primary);
margin: 0;
}
@@ -46,7 +46,7 @@
border: none;
border-radius: 16px;
background: var(--hover-bg);
- color: var(--claude-text);
+ color: var(--text-primary);
font-size: 20px;
cursor: pointer;
}
@@ -57,7 +57,7 @@
border: none;
border-radius: 16px;
background: var(--hover-bg);
- color: var(--claude-text);
+ color: var(--text-primary);
font-size: 20px;
cursor: pointer;
}
@@ -69,9 +69,9 @@
height: var(--app-viewport);
display: flex;
flex-direction: column;
- background: var(--claude-left-rail);
- border-left: 1px solid var(--claude-border);
- color: var(--claude-text);
+ background: var(--surface-rail);
+ border-left: 1px solid var(--border-default);
+ color: var(--text-primary);
overflow: hidden;
}
@@ -83,7 +83,7 @@
align-items: center;
justify-content: space-between;
gap: 12px;
- border-bottom: 1px solid var(--claude-border);
+ border-bottom: 1px solid var(--border-default);
}
.git-changes-panel__title {
@@ -105,7 +105,7 @@
.git-changes-panel__upstream,
.git-changes-panel__arrow {
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.git-changes-panel__summary,
@@ -132,7 +132,7 @@
border: none;
border-radius: 14px;
background: transparent;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 18px;
line-height: 1;
cursor: pointer;
@@ -140,7 +140,7 @@
.git-changes-panel__close:hover {
background: var(--theme-tab-active);
- color: var(--claude-text);
+ color: var(--text-primary);
box-shadow: 0 1px 2px var(--shadow-color);
}
@@ -149,13 +149,13 @@
min-height: 0;
overflow: auto;
padding: 12px;
- scrollbar-color: color-mix(in srgb, var(--claude-text-secondary) 55%, transparent)
+ scrollbar-color: color-mix(in srgb, var(--text-secondary) 55%, transparent)
color-mix(in srgb, var(--theme-surface-muted) 70%, transparent);
scrollbar-width: thin;
}
.git-changes-panel * {
- scrollbar-color: color-mix(in srgb, var(--claude-text-secondary) 55%, transparent)
+ scrollbar-color: color-mix(in srgb, var(--text-secondary) 55%, transparent)
color-mix(in srgb, var(--theme-surface-muted) 70%, transparent);
scrollbar-width: thin;
}
@@ -175,7 +175,7 @@
.git-changes-panel::-webkit-scrollbar-thumb,
.git-changes-panel ::-webkit-scrollbar-thumb {
- background: color-mix(in srgb, var(--claude-text-secondary) 55%, transparent);
+ background: color-mix(in srgb, var(--text-secondary) 55%, transparent);
border-radius: 999px;
border: 2px solid transparent;
background-clip: padding-box;
@@ -214,7 +214,7 @@
justify-content: space-between;
gap: 10px;
padding: 0 8px;
- color: var(--claude-text);
+ color: var(--text-primary);
font-size: 13px;
font-weight: 600;
}
@@ -243,14 +243,14 @@
border: none;
border-radius: 9px;
background: transparent;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
cursor: pointer;
}
.git-change-file__open-btn:hover,
.git-change-file__open-btn.open {
background: var(--theme-tab-active);
- color: var(--claude-text);
+ color: var(--text-primary);
box-shadow: 0 1px 2px var(--shadow-color);
}
@@ -303,7 +303,7 @@ body[data-theme='dark'] .git-change-file__open-icon {
max-height: 260px;
overflow-y: auto;
padding: 6px;
- border: 1px solid var(--claude-border);
+ border: 1px solid var(--border-default);
border-radius: 12px;
background: var(--theme-surface-muted);
box-shadow: none;
@@ -319,7 +319,7 @@ body[data-theme='dark'] .git-change-file__open-icon {
border: none;
border-radius: 9px;
background: transparent;
- color: var(--claude-text);
+ color: var(--text-primary);
font-size: 13px;
text-align: left;
cursor: pointer;
@@ -339,7 +339,7 @@ body[data-theme='dark'] .git-change-file__open-icon {
.git-change-file__open-empty {
padding: 8px 10px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 12px;
font-weight: 400;
white-space: nowrap;
@@ -359,14 +359,14 @@ body[data-theme='dark'] .git-change-file__open-icon {
border: none;
border-radius: 8px;
background: transparent;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 12px;
cursor: pointer;
}
.git-change-file__reset:hover {
background: var(--theme-tab-active);
- color: var(--claude-text);
+ color: var(--text-primary);
box-shadow: 0 1px 2px var(--shadow-color);
}
@@ -394,7 +394,7 @@ body[data-theme='dark'] .git-change-file__open-icon {
border: none;
border-radius: 9px;
background: var(--theme-surface-muted);
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font: inherit;
font-family: inherit;
cursor: pointer;
@@ -414,7 +414,7 @@ body[data-theme='dark'] .git-change-file__open-icon {
.git-change-file__fold:hover {
background: var(--theme-tab-active);
- color: var(--claude-text);
+ color: var(--text-primary);
box-shadow: 0 1px 2px var(--shadow-color);
}
@@ -426,7 +426,7 @@ body[data-theme='dark'] .git-change-file__open-icon {
align-items: center;
justify-content: center;
flex: 0 0 16px;
- color: var(--claude-text-tertiary);
+ color: var(--text-tertiary);
text-align: center;
line-height: 1;
}
@@ -449,7 +449,7 @@ body[data-theme='dark'] .git-change-file__open-icon {
.git-change-file__hunk-header {
padding: 3px 8px;
- color: var(--claude-text-tertiary);
+ color: var(--text-tertiary);
white-space: pre;
}
@@ -466,13 +466,13 @@ body[data-theme='dark'] .git-change-file__open-icon {
}
.git-change-line__num {
- color: var(--claude-text-tertiary);
+ color: var(--text-tertiary);
text-align: right;
user-select: none;
}
.git-change-line__marker {
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
text-align: center;
user-select: none;
}
@@ -565,7 +565,7 @@ body[data-theme='dark'] .git-change-file__open-icon {
.no-files {
text-align: center;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
padding: 60px 20px;
font-size: 14px;
}
@@ -577,7 +577,7 @@ body[data-theme='dark'] .git-change-file__open-icon {
}
.file-tab {
- border: 1px solid var(--claude-border);
+ border: 1px solid var(--border-default);
border-radius: 12px;
overflow: hidden;
background: var(--surface-soft);
@@ -591,16 +591,16 @@ body[data-theme='dark'] .git-change-file__open-icon {
justify-content: space-between;
align-items: center;
font-size: 14px;
- border-bottom: 1px solid var(--claude-border);
+ border-bottom: 1px solid var(--border-default);
}
.file-name {
font-weight: 500;
- color: var(--claude-text);
+ color: var(--text-primary);
}
.file-size {
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 12px;
}
@@ -633,7 +633,7 @@ body[data-theme='dark'] .git-change-file__open-icon {
}
.approval-card {
- border: 1px solid var(--claude-border);
+ border: 1px solid var(--border-default);
border-radius: 12px;
background: var(--theme-surface-soft);
box-shadow: var(--theme-shadow-soft);
@@ -646,17 +646,17 @@ body[data-theme='dark'] .git-change-file__open-icon {
.approval-card__title {
font-size: 13px;
font-weight: 700;
- color: var(--claude-text);
+ color: var(--text-primary);
}
.approval-card__summary {
font-size: 12px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.approval-path {
font-size: 12px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
word-break: break-all;
}
@@ -707,7 +707,7 @@ body[data-theme='dark'] .git-change-file__open-icon {
flex-direction: column;
gap: 4px;
font-size: 12px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
background: var(--theme-surface-muted);
border: 1px solid var(--theme-control-border);
border-radius: 8px;
@@ -729,18 +729,18 @@ body[data-theme='dark'] .git-change-file__open-icon {
.approval-note {
padding: 6px 8px;
font-size: 11px;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.approval-lines--old {
- background: color-mix(in srgb, var(--claude-warning) 18%, transparent);
- border: 1px solid color-mix(in srgb, var(--claude-warning) 50%, transparent);
+ background: color-mix(in srgb, var(--state-warning) 18%, transparent);
+ border: 1px solid color-mix(in srgb, var(--state-warning) 50%, transparent);
color: var(--text-primary);
}
.approval-lines--new {
- background: color-mix(in srgb, var(--claude-success) 18%, transparent);
- border: 1px solid color-mix(in srgb, var(--claude-success) 50%, transparent);
+ background: color-mix(in srgb, var(--state-success) 18%, transparent);
+ border: 1px solid color-mix(in srgb, var(--state-success) 50%, transparent);
color: var(--text-primary);
}
@@ -788,7 +788,7 @@ body[data-theme='dark'] .git-change-file__open-icon {
.approval-btn--approve {
color: var(--theme-surface-strong);
- background: var(--claude-success);
+ background: var(--state-success);
}
.approval-btn--switch {
@@ -798,5 +798,5 @@ body[data-theme='dark'] .git-change-file__open-icon {
.approval-btn--reject {
color: var(--theme-surface-strong);
- background: var(--claude-accent-strong);
+ background: var(--accent-strong);
}
diff --git a/static/src/styles/components/sidebar/_conversation.scss b/static/src/styles/components/sidebar/_conversation.scss
index 698eb5fc..2779c09a 100644
--- a/static/src/styles/components/sidebar/_conversation.scss
+++ b/static/src/styles/components/sidebar/_conversation.scss
@@ -10,9 +10,9 @@
height: var(--app-viewport) !important;
min-height: var(--app-viewport) !important;
overflow: hidden;
- background: var(--claude-left-rail);
+ background: var(--surface-rail);
border-right: 0;
- color: var(--claude-text);
+ color: var(--text-primary);
transition: width 320ms cubic-bezier(0.22, 1, 0.36, 1);
}
@@ -25,7 +25,7 @@
width: 1px;
pointer-events: none;
opacity: 1;
- background: var(--claude-border);
+ background: var(--border-default);
transition: opacity 320ms cubic-bezier(0.22, 1, 0.36, 1);
}
@@ -61,7 +61,7 @@
border: 0;
border-radius: 8px;
background: transparent;
- color: var(--claude-text);
+ color: var(--text-primary);
display: grid;
align-items: center;
}
@@ -163,7 +163,7 @@
}
.monitor-mode-btn.blocked {
- color: var(--claude-text-tertiary);
+ color: var(--text-tertiary);
opacity: 0.6;
}
@@ -185,7 +185,7 @@
}
.search-inline-icon {
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.search-input {
@@ -196,13 +196,13 @@
outline: 0;
padding: 0 12px 0 8px;
background: transparent;
- color: var(--claude-text);
+ color: var(--text-primary);
font-size: 13px;
letter-spacing: -0.01em;
}
.search-input::placeholder {
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.conversation-sidebar .conversation-list {
@@ -228,14 +228,14 @@
.conversation-sidebar .running-task-section {
margin: 0 8px 12px;
padding: 6px 0 8px;
- border-bottom: 1px solid color-mix(in srgb, var(--claude-border) 72%, transparent);
+ border-bottom: 1px solid color-mix(in srgb, var(--border-default) 72%, transparent);
}
.conversation-sidebar .running-task-section-title {
margin: 0 8px 4px;
font-size: 12px;
font-weight: 700;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
letter-spacing: 0.01em;
}
@@ -250,7 +250,7 @@
border: 0;
border-radius: 8px;
background: transparent;
- color: var(--claude-text);
+ color: var(--text-primary);
text-align: left;
cursor: pointer;
transition:
@@ -269,7 +269,7 @@
white-space: nowrap;
font-size: 11px;
font-weight: 600;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
.conversation-sidebar .running-task-title {
@@ -279,7 +279,7 @@
font-size: 13px;
line-height: 1.25;
letter-spacing: -0.01em;
- color: var(--claude-text);
+ color: var(--text-primary);
}
.conversation-sidebar .running-task-main {
@@ -362,7 +362,7 @@ body[data-theme='dark'] .conversation-sidebar .running-task-item.active {
inset: 0;
z-index: 1;
border-radius: 12px;
- background: var(--claude-left-rail);
+ background: var(--surface-rail);
pointer-events: none;
}
@@ -445,7 +445,7 @@ body[data-theme='dark'] .conversation-sidebar .conversation-item.active:focus-wi
min-width: 0;
padding-left: 12px;
padding-right: 4px;
- color: var(--claude-text);
+ color: var(--text-primary);
font-size: 13px;
line-height: 1.25;
letter-spacing: -0.01em;
@@ -468,7 +468,7 @@ body[data-theme='dark'] .conversation-sidebar .conversation-item.active:focus-wi
.conversation-sidebar .conversation-running-loader {
width: 16px;
height: 16px;
- border: 2px solid var(--claude-text-secondary);
+ border: 2px solid var(--text-secondary);
border-bottom-color: transparent;
border-radius: 50%;
display: inline-block;
@@ -480,7 +480,7 @@ body[data-theme='dark'] .conversation-sidebar .conversation-item.active:focus-wi
width: 18px;
height: 18px;
display: inline-block;
- background: var(--claude-text-secondary);
+ background: var(--text-secondary);
mask: url('/static/icons/check.svg') center / contain no-repeat;
-webkit-mask: url('/static/icons/check.svg') center / contain no-repeat;
}
@@ -501,7 +501,7 @@ body[data-theme='dark'] .conversation-sidebar .conversation-item.active:focus-wi
border: 0;
border-radius: 9px;
background: transparent;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
display: grid;
place-items: center;
cursor: pointer;
@@ -518,7 +518,7 @@ body[data-theme='dark'] .conversation-sidebar .conversation-item.active:focus-wi
.conversation-sidebar .conversation-more-btn:hover,
.conversation-sidebar .conversation-action-wrap.menu-open .conversation-more-btn {
- color: var(--claude-text);
+ color: var(--text-primary);
}
.conversation-sidebar .conversation-more-btn span {
@@ -547,7 +547,7 @@ body[data-theme='dark'] .conversation-sidebar .conversation-item.active:focus-wi
width: max-content;
min-width: 92px;
padding: 6px;
- border: 1px solid var(--claude-border);
+ border: 1px solid var(--border-default);
border-radius: 14px;
background: var(--theme-surface-strong);
box-shadow: none;
@@ -583,7 +583,7 @@ body[data-theme='dark'] .conversation-sidebar .conversation-item.active:focus-wi
border: 0;
border-radius: 10px;
background: transparent;
- color: var(--claude-text);
+ color: var(--text-primary);
display: grid;
grid-template-columns: 24px auto;
align-items: center;
@@ -622,7 +622,7 @@ body[data-theme='dark'] .conversation-sidebar .conversation-item.active:focus-wi
.no-conversations,
.search-done,
.search-progress {
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 13px;
padding: 10px 12px;
white-space: nowrap;
@@ -639,7 +639,7 @@ body[data-theme='dark'] .conversation-sidebar .conversation-item.active:focus-wi
border-radius: 10px;
padding: 0 12px;
background: transparent;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
cursor: pointer;
text-align: left;
transition:
@@ -649,7 +649,7 @@ body[data-theme='dark'] .conversation-sidebar .conversation-item.active:focus-wi
.load-more-btn:hover:not(:disabled) {
background: var(--theme-tab-active);
- color: var(--claude-text);
+ color: var(--text-primary);
}
.load-more-btn:disabled {
@@ -744,13 +744,13 @@ body[data-theme='dark'] .workspace-group-header:hover {
border: 0;
border-radius: 8px;
background: transparent;
- color: var(--claude-text);
+ color: var(--text-primary);
text-align: left;
cursor: pointer;
}
.workspace-folder-icon {
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
}
/* 搜索结果分组头:仅作分类标识,不可交互、无 hover 高亮 */
@@ -784,7 +784,7 @@ body[data-theme='dark'] .workspace-group-header.search-result-group-header:hover
.workspace-running-loader {
width: 14px;
height: 14px;
- border: 2px solid var(--claude-text-secondary);
+ border: 2px solid var(--text-secondary);
border-bottom-color: transparent;
border-radius: 50%;
display: inline-block;
@@ -812,7 +812,7 @@ body[data-theme='dark'] .workspace-group-header.search-result-group-header:hover
border: 0;
border-radius: 8px;
background: transparent;
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
display: grid;
place-items: center;
cursor: pointer;
@@ -825,7 +825,7 @@ body[data-theme='dark'] .workspace-group-header.search-result-group-header:hover
.workspace-more-btn:hover,
.workspace-group-actions.visible .workspace-more-btn[aria-expanded='true'] {
background: var(--theme-surface-strong);
- color: var(--claude-text);
+ color: var(--text-primary);
}
.workspace-more-btn span {
@@ -857,7 +857,7 @@ body[data-theme='dark'] .workspace-group-header.search-result-group-header:hover
width: max-content;
min-width: 120px;
padding: 6px;
- border: 1px solid var(--claude-border);
+ border: 1px solid var(--border-default);
border-radius: 14px;
background: var(--theme-surface-strong);
box-shadow: none;
@@ -882,7 +882,7 @@ body[data-theme='dark'] .workspace-group-header.search-result-group-header:hover
border: 0;
border-radius: 10px;
background: transparent;
- color: var(--claude-text);
+ color: var(--text-primary);
display: grid;
align-items: center;
padding: 0 10px;
@@ -939,7 +939,7 @@ body[data-theme='dark'] .workspace-group-header.search-result-group-header:hover
.workspace-no-conversations,
.workspace-conversations-loading {
- color: var(--claude-text-secondary);
+ color: var(--text-secondary);
font-size: 13px;
padding: 10px 12px;
}
@@ -963,7 +963,7 @@ body[data-theme='dark'] .workspace-group-header.search-result-group-header:hover
padding: 16px;
border-radius: 16px;
background: var(--theme-surface-strong);
- border: 1px solid var(--claude-border);
+ border: 1px solid var(--border-default);
display: flex;
flex-direction: column;
gap: 12px;
@@ -972,17 +972,17 @@ body[data-theme='dark'] .workspace-group-header.search-result-group-header:hover
.workspace-rename-title {
font-size: 15px;
font-weight: 600;
- color: var(--claude-text);
+ color: var(--text-primary);
}
.workspace-rename-input {
width: 100%;
height: 40px;
padding: 0 12px;
- border: 1px solid var(--claude-border);
+ border: 1px solid var(--border-default);
border-radius: 10px;
background: var(--surface-base);
- color: var(--claude-text);
+ color: var(--text-primary);
font-size: 14px;
outline: none;
}
@@ -1009,7 +1009,7 @@ body[data-theme='dark'] .workspace-group-header.search-result-group-header:hover
.workspace-rename-cancel {
background: transparent;
- color: var(--claude-text);
+ color: var(--text-primary);
}
.workspace-rename-cancel:hover {
diff --git a/static/src/styles/layout/_app-shell.scss b/static/src/styles/layout/_app-shell.scss
index 8c1c91c9..ed7a55b9 100644
--- a/static/src/styles/layout/_app-shell.scss
+++ b/static/src/styles/layout/_app-shell.scss
@@ -5,11 +5,11 @@
flex-direction: row;
height: var(--app-viewport);
align-items: stretch;
- background: var(--claude-bg);
- color: var(--claude-text);
+ background: var(--surface-base);
+ color: var(--text-primary);
}
#app {
min-height: var(--app-viewport);
- background: var(--claude-bg);
+ background: var(--surface-base);
}
diff --git a/static/terminal.html b/static/terminal.html
index 41a32517..c329cbfb 100644
--- a/static/terminal.html
+++ b/static/terminal.html
@@ -19,27 +19,27 @@
box-sizing: border-box;
}
:root {
- --claude-bg: #eeece2;
- --claude-panel: rgba(255, 255, 255, 0.92);
- --claude-border: rgba(118, 103, 84, 0.25);
- --claude-text: #3d3929;
- --claude-text-secondary: #7f7766;
- --claude-accent: #da7756;
- --claude-muted: rgba(121, 109, 94, 0.45);
+ --app-bg: #eeece2;
+ --app-panel: rgba(255, 255, 255, 0.92);
+ --app-border: rgba(118, 103, 84, 0.25);
+ --app-text: #3d3929;
+ --app-text-secondary: #7f7766;
+ --app-accent: #da7756;
+ --app-muted: rgba(121, 109, 94, 0.45);
}
body {
font-family: 'Iowan Old Style', ui-serif, Georgia, Cambria, "Times New Roman", Times, serif;
- background: var(--claude-bg);
- color: var(--claude-text);
+ background: var(--app-bg);
+ color: var(--app-text);
height: 100vh;
display: flex;
flex-direction: column;
overflow: hidden;
}
.header {
- background: var(--claude-bg);
+ background: var(--app-bg);
padding: 15px 24px;
- border-bottom: 1px solid var(--claude-border);
+ border-bottom: 1px solid var(--app-border);
box-shadow: 0 10px 20px rgba(61, 57, 41, 0.08);
}
.header h1 {
@@ -65,12 +65,12 @@
animation: none;
}
.session-tabs {
- background: var(--claude-bg);
+ background: var(--app-bg);
padding: 12px 24px;
display: flex;
gap: 10px;
overflow-x: auto;
- border-bottom: 1px solid var(--claude-border);
+ border-bottom: 1px solid var(--app-border);
box-shadow: inset 0 -1px rgba(61, 57, 41, 0.05);
}
.tab {
@@ -84,7 +84,7 @@
align-items: center;
gap: 8px;
white-space: nowrap;
- color: var(--claude-text);
+ color: var(--app-text);
}
.tab:hover {
background: rgba(255, 255, 255, 0.95);
@@ -92,8 +92,8 @@
transform: translateY(-2px);
}
.tab.active {
- background: var(--claude-accent);
- border-color: var(--claude-accent);
+ background: var(--app-accent);
+ border-color: var(--app-accent);
color: #fffaf0;
box-shadow: 0 10px 24px rgba(218, 119, 86, 0.26);
}
@@ -115,7 +115,7 @@
box-shadow: 0 24px 48px rgba(61, 57, 41, 0.16);
display: flex;
flex-direction: column;
- border: 1px solid var(--claude-border);
+ border: 1px solid var(--app-border);
}
.terminal-header {
background: rgba(255, 255, 255, 0.86);
@@ -123,14 +123,14 @@
display: flex;
justify-content: space-between;
align-items: center;
- border-bottom: 1px solid var(--claude-border);
+ border-bottom: 1px solid var(--app-border);
}
.terminal-title {
display: flex;
align-items: center;
gap: 10px;
font-size: 14px;
- color: var(--claude-text-secondary);
+ color: var(--app-text-secondary);
}
.terminal-controls {
display: flex;
@@ -163,7 +163,7 @@
height: 100%;
margin: 0 14px 0 18px;
background: #ffffff;
- color: var(--claude-text);
+ color: var(--app-text);
overflow: hidden;
display: flex;
min-height: 0;
@@ -191,10 +191,10 @@
}
.sidebar {
width: 300px;
- background: var(--claude-panel);
+ background: var(--app-panel);
border-radius: 18px;
padding: 20px;
- border: 1px solid var(--claude-border);
+ border: 1px solid var(--app-border);
box-shadow: 0 18px 40px rgba(61, 57, 41, 0.1);
overflow-y: auto;
scrollbar-width: none;
@@ -208,7 +208,7 @@
.info-section h3 {
font-size: 14px;
margin-bottom: 10px;
- color: var(--claude-text-secondary);
+ color: var(--app-text-secondary);
letter-spacing: 0.05em;
}
.info-item {
@@ -219,10 +219,10 @@
font-size: 14px;
}
.info-label {
- color: var(--claude-text-secondary);
+ color: var(--app-text-secondary);
}
.info-value {
- color: var(--claude-text);
+ color: var(--app-text);
font-weight: 600;
}
.command-history {
@@ -238,20 +238,20 @@
margin: 3px 0;
font-family: inherit;
font-size: 12px;
- color: var(--claude-accent);
- border-left: 3px solid var(--claude-accent);
+ color: var(--app-accent);
+ border-left: 3px solid var(--app-accent);
padding-left: 10px;
background: rgba(218, 119, 86, 0.08);
border-radius: 6px;
}
.status-bar {
- background: var(--claude-panel);
+ background: var(--app-panel);
padding: 12px 24px;
display: flex;
justify-content: space-between;
align-items: center;
font-size: 13px;
- border-top: 1px solid var(--claude-border);
+ border-top: 1px solid var(--app-border);
box-shadow: 0 -8px 18px rgba(61, 57, 41, 0.08);
}
.status-left {
@@ -262,7 +262,7 @@
display: flex;
align-items: center;
gap: 6px;
- color: var(--claude-text-secondary);
+ color: var(--app-text-secondary);
}
@media (max-width: 768px) {
.main-content {
@@ -276,7 +276,7 @@
width: 40px;
height: 40px;
border: 3px solid rgba(61, 57, 41, 0.15);
- border-top-color: var(--claude-accent);
+ border-top-color: var(--app-accent);
border-radius: 50%;
animation: spin 1s linear infinite;
margin: 20px auto;
diff --git a/test/test_api_client_multimodal_sanitize.py b/test/test_api_client_multimodal_sanitize.py
index 541dafef..68347e37 100644
--- a/test/test_api_client_multimodal_sanitize.py
+++ b/test/test_api_client_multimodal_sanitize.py
@@ -2,12 +2,12 @@ from __future__ import annotations
import unittest
-from utils.api_client import DeepSeekClient
+from utils.api_client import APIClient
class APIClientMultimodalSanitizeTest(unittest.TestCase):
def test_text_only_model_adds_notice_when_only_media_parts(self):
- client = DeepSeekClient(web_mode=True)
+ client = APIClient(web_mode=True)
client.model_key = "DeepSeek-V4-Pro High" # custom_models.json: multimodal=none
messages = [
@@ -29,7 +29,7 @@ class APIClientMultimodalSanitizeTest(unittest.TestCase):
)
def test_text_only_model_strips_image_parts_to_text(self):
- client = DeepSeekClient(web_mode=True)
+ client = APIClient(web_mode=True)
client.model_key = "DeepSeek-V4-Pro High" # custom_models.json: multimodal=none
messages = [
@@ -54,7 +54,7 @@ class APIClientMultimodalSanitizeTest(unittest.TestCase):
)
def test_profile_text_only_fallback_strips_media_parts(self):
- client = DeepSeekClient(web_mode=True)
+ client = APIClient(web_mode=True)
client.model_key = ""
client.model_multimodal = "none"
@@ -79,7 +79,7 @@ class APIClientMultimodalSanitizeTest(unittest.TestCase):
)
def test_profile_multimodal_model_keeps_image_parts(self):
- client = DeepSeekClient(web_mode=True)
+ client = APIClient(web_mode=True)
client.model_key = ""
client.model_multimodal = "image,video"
@@ -103,7 +103,7 @@ class APIClientMultimodalSanitizeTest(unittest.TestCase):
)
def test_profile_multimodal_fallback_works_when_model_key_missing(self):
- client = DeepSeekClient(web_mode=True)
+ client = APIClient(web_mode=True)
client.model_key = "" # 模拟未知/缺失 key,仅走 profile 兜底
client.model_multimodal = "none"
diff --git a/test/test_sub_agent_regression.py b/test/test_sub_agent_regression.py
index 56481698..2d2e4f1a 100644
--- a/test/test_sub_agent_regression.py
+++ b/test/test_sub_agent_regression.py
@@ -22,7 +22,7 @@ os.environ["SUB_AGENT_STATE_FILE"] = str(_test_tmp / "state.json")
os.environ["SUB_AGENT_PROJECT_RESULTS_DIR"] = str(_test_tmp / "results")
from modules.sub_agent import SubAgentManager
-from utils.api_client import DeepSeekClient
+from utils.api_client import APIClient
class FakeTerminal:
@@ -85,7 +85,7 @@ class FakeTerminal:
class FakeModel:
- """按脚本驱动 DeepSeekClient.chat 的返回。"""
+ """按脚本驱动 APIClient.chat 的返回。"""
def __init__(self, responses: List[List[Dict[str, Any]]]):
self.responses = responses
@@ -122,13 +122,13 @@ def make_finish_chunk() -> Dict[str, Any]:
def install_fake_model(responses: List[List[Dict[str, Any]]]):
fake = FakeModel(responses)
- original = DeepSeekClient.chat
- DeepSeekClient.chat = fake.chat
+ original = APIClient.chat
+ APIClient.chat = fake.chat
return fake, original
def restore_model(original):
- DeepSeekClient.chat = original
+ APIClient.chat = original
def test_write_file_and_edit():
diff --git a/utils/__pycache__/api_client.cpython-312.pyc b/utils/__pycache__/api_client.cpython-312.pyc
deleted file mode 100644
index 02d8275f..00000000
Binary files a/utils/__pycache__/api_client.cpython-312.pyc and /dev/null differ
diff --git a/utils/__pycache__/context_manager.cpython-312.pyc b/utils/__pycache__/context_manager.cpython-312.pyc
deleted file mode 100644
index 3f540bb5..00000000
Binary files a/utils/__pycache__/context_manager.cpython-312.pyc and /dev/null differ
diff --git a/utils/__pycache__/conversation_manager.cpython-312.pyc b/utils/__pycache__/conversation_manager.cpython-312.pyc
deleted file mode 100644
index d2ddb59c..00000000
Binary files a/utils/__pycache__/conversation_manager.cpython-312.pyc and /dev/null differ
diff --git a/utils/__pycache__/logger.cpython-312.pyc b/utils/__pycache__/logger.cpython-312.pyc
deleted file mode 100644
index a70a7e4a..00000000
Binary files a/utils/__pycache__/logger.cpython-312.pyc and /dev/null differ
diff --git a/utils/__pycache__/terminal_factory.cpython-312.pyc b/utils/__pycache__/terminal_factory.cpython-312.pyc
deleted file mode 100644
index 0dbec55e..00000000
Binary files a/utils/__pycache__/terminal_factory.cpython-312.pyc and /dev/null differ
diff --git a/utils/api_client.py b/utils/api_client.py
index 30de8775..6e8b2159 100644
--- a/utils/api_client.py
+++ b/utils/api_client.py
@@ -1,4 +1,4 @@
# 兼容入口,已迁移到 utils.api_client 包
-from utils.api_client import DeepSeekClient
+from utils.api_client import APIClient
-__all__ = ['DeepSeekClient']
+__all__ = ['APIClient']
diff --git a/utils/api_client/__init__.py b/utils/api_client/__init__.py
index 0507d504..00bf33de 100644
--- a/utils/api_client/__init__.py
+++ b/utils/api_client/__init__.py
@@ -1,20 +1,20 @@
from utils.api_client.utils import _api_dump_enabled
-from utils.api_client.base_mixin import DeepSeekClientBaseMixin
-from utils.api_client.profile_mixin import DeepSeekClientProfileMixin
-from utils.api_client.message_mixin import DeepSeekClientMessageMixin
-from utils.api_client.tool_mixin import DeepSeekClientToolMixin
-from utils.api_client.logging_mixin import DeepSeekClientLoggingMixin
-from utils.api_client.formatting_mixin import DeepSeekClientFormattingMixin
-from utils.api_client.chat_mixin import DeepSeekClientChatMixin
+from utils.api_client.base_mixin import APIClientBaseMixin
+from utils.api_client.profile_mixin import APIClientProfileMixin
+from utils.api_client.message_mixin import APIClientMessageMixin
+from utils.api_client.tool_mixin import APIClientToolMixin
+from utils.api_client.logging_mixin import APIClientLoggingMixin
+from utils.api_client.formatting_mixin import APIClientFormattingMixin
+from utils.api_client.chat_mixin import APIClientChatMixin
-class DeepSeekClient(
- DeepSeekClientBaseMixin,
- DeepSeekClientProfileMixin,
- DeepSeekClientMessageMixin,
- DeepSeekClientToolMixin,
- DeepSeekClientLoggingMixin,
- DeepSeekClientFormattingMixin,
- DeepSeekClientChatMixin):
+class APIClient(
+ APIClientBaseMixin,
+ APIClientProfileMixin,
+ APIClientMessageMixin,
+ APIClientToolMixin,
+ APIClientLoggingMixin,
+ APIClientFormattingMixin,
+ APIClientChatMixin):
pass
-__all__ = ['DeepSeekClient', '_api_dump_enabled']
\ No newline at end of file
+__all__ = ['APIClient', '_api_dump_enabled']
\ No newline at end of file
diff --git a/utils/api_client/base_mixin.py b/utils/api_client/base_mixin.py
index c921f740..bc09c275 100644
--- a/utils/api_client/base_mixin.py
+++ b/utils/api_client/base_mixin.py
@@ -36,7 +36,7 @@ from utils.log_rotation import append_line, prune_dir
from utils.api_client.utils import _api_dump_enabled
-class DeepSeekClientBaseMixin:
+class APIClientBaseMixin:
def __init__(self, thinking_mode: bool = True, web_mode: bool = False):
# 模型 API 配置(端点 / 密钥 / 模型 ID)由 apply_profile 从 custom_models 注入;
# 这里仅初始化为空,未应用任何模型档案前不可直接发请求。
diff --git a/utils/api_client/chat_mixin.py b/utils/api_client/chat_mixin.py
index 7f82911f..624ddeca 100644
--- a/utils/api_client/chat_mixin.py
+++ b/utils/api_client/chat_mixin.py
@@ -36,7 +36,7 @@ from utils.log_rotation import append_line, prune_dir
from utils.api_client.utils import _api_dump_enabled
-class DeepSeekClientChatMixin:
+class APIClientChatMixin:
async def chat(
self,
messages: List[Dict],
diff --git a/utils/api_client/formatting_mixin.py b/utils/api_client/formatting_mixin.py
index 8db9b1a1..1f15b933 100644
--- a/utils/api_client/formatting_mixin.py
+++ b/utils/api_client/formatting_mixin.py
@@ -36,7 +36,7 @@ from utils.log_rotation import append_line, prune_dir
from utils.api_client.utils import _api_dump_enabled
-class DeepSeekClientFormattingMixin:
+class APIClientFormattingMixin:
def _format_read_file_result(self, data: Dict) -> str:
"""根据读取模式格式化 read_file 工具结果。"""
if not isinstance(data, dict):
diff --git a/utils/api_client/logging_mixin.py b/utils/api_client/logging_mixin.py
index 6e81ad65..c89777bc 100644
--- a/utils/api_client/logging_mixin.py
+++ b/utils/api_client/logging_mixin.py
@@ -36,7 +36,7 @@ from utils.log_rotation import append_line, prune_dir
from utils.api_client.utils import _api_dump_enabled
-class DeepSeekClientLoggingMixin:
+class APIClientLoggingMixin:
def _debug_log(self, payload: Dict[str, Any]) -> None:
if not _api_dump_enabled():
return
diff --git a/utils/api_client/message_mixin.py b/utils/api_client/message_mixin.py
index 4aeee3d2..b5e1600b 100644
--- a/utils/api_client/message_mixin.py
+++ b/utils/api_client/message_mixin.py
@@ -36,7 +36,7 @@ from utils.log_rotation import append_line, prune_dir
from utils.api_client.utils import _api_dump_enabled
-class DeepSeekClientMessageMixin:
+class APIClientMessageMixin:
def _merge_system_messages(self, messages: List[Dict]) -> List[Dict]:
"""
仅合并最开头连续的 system 消息(系统提示),后续插入的 system 消息保持原样。
diff --git a/utils/api_client/profile_mixin.py b/utils/api_client/profile_mixin.py
index d9e7e1d1..e3cd26dd 100644
--- a/utils/api_client/profile_mixin.py
+++ b/utils/api_client/profile_mixin.py
@@ -36,7 +36,7 @@ from utils.log_rotation import append_line, prune_dir
from utils.api_client.utils import _api_dump_enabled
-class DeepSeekClientProfileMixin:
+class APIClientProfileMixin:
def apply_profile(self, profile: Dict):
"""
动态应用模型配置
diff --git a/utils/api_client/tool_mixin.py b/utils/api_client/tool_mixin.py
index ab3cf207..667d37ba 100644
--- a/utils/api_client/tool_mixin.py
+++ b/utils/api_client/tool_mixin.py
@@ -36,7 +36,7 @@ from utils.log_rotation import append_line, prune_dir
from utils.api_client.utils import _api_dump_enabled
-class DeepSeekClientToolMixin:
+class APIClientToolMixin:
def _validate_json_string(self, json_str: str) -> tuple:
"""
验证JSON字符串的完整性