mirror of
https://github.com/router-for-me/Cli-Proxy-API-Management-Center.git
synced 2026-02-03 03:10:50 +08:00
Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fe11bfb48f | ||
|
|
ee0d8f82d7 | ||
|
|
0bbb397df5 |
248
i18n.js
248
i18n.js
@@ -3,7 +3,7 @@ const i18n = {
|
||||
// 语言配置
|
||||
currentLanguage: 'zh-CN',
|
||||
fallbackLanguage: 'zh-CN',
|
||||
|
||||
|
||||
// 语言包
|
||||
translations: {
|
||||
'zh-CN': {
|
||||
@@ -38,15 +38,15 @@ const i18n = {
|
||||
'common.base_url': '地址',
|
||||
'common.proxy_url': '代理',
|
||||
'common.alias': '别名',
|
||||
|
||||
|
||||
// 页面标题
|
||||
'title.main': 'CLI Proxy API Management Center',
|
||||
'title.login': 'CLI Proxy API Management Center',
|
||||
|
||||
|
||||
// 自动登录
|
||||
'auto_login.title': '正在自动登录...',
|
||||
'auto_login.message': '正在使用本地保存的连接信息尝试连接服务器',
|
||||
|
||||
|
||||
// 登录页面
|
||||
'login.subtitle': '请输入连接信息以访问管理界面',
|
||||
'login.connection_title': '连接地址',
|
||||
@@ -64,18 +64,18 @@ const i18n = {
|
||||
'login.error_title': '登录失败',
|
||||
'login.error_required': '请填写完整的连接信息',
|
||||
'login.error_invalid': '连接失败,请检查地址和密钥',
|
||||
|
||||
|
||||
// 头部导航
|
||||
'header.check_connection': '检查连接',
|
||||
'header.refresh_all': '刷新全部',
|
||||
'header.logout': '登出',
|
||||
|
||||
|
||||
// 连接信息
|
||||
'connection.title': '连接信息',
|
||||
'connection.server_address': '服务器地址:',
|
||||
'connection.management_key': '管理密钥:',
|
||||
'connection.status': '连接状态:',
|
||||
|
||||
|
||||
// 侧边栏导航
|
||||
'nav.basic_settings': '基础设置',
|
||||
'nav.api_keys': 'API 密钥',
|
||||
@@ -83,7 +83,7 @@ const i18n = {
|
||||
'nav.auth_files': '认证文件',
|
||||
'nav.usage_stats': '使用统计',
|
||||
'nav.system_info': '系统信息',
|
||||
|
||||
|
||||
// 基础设置
|
||||
'basic_settings.title': '基础设置',
|
||||
'basic_settings.debug_title': '调试模式',
|
||||
@@ -99,7 +99,7 @@ const i18n = {
|
||||
'basic_settings.quota_title': '配额超出行为',
|
||||
'basic_settings.quota_switch_project': '自动切换项目',
|
||||
'basic_settings.quota_switch_preview': '切换到预览模型',
|
||||
|
||||
|
||||
// API 密钥管理
|
||||
'api_keys.title': 'API 密钥管理',
|
||||
'api_keys.proxy_auth_title': '代理服务认证密钥',
|
||||
@@ -113,7 +113,7 @@ const i18n = {
|
||||
'api_keys.edit_modal_title': '编辑API密钥',
|
||||
'api_keys.edit_modal_key_label': 'API密钥:',
|
||||
'api_keys.delete_confirm': '确定要删除这个API密钥吗?',
|
||||
|
||||
|
||||
// AI 提供商
|
||||
'ai_providers.title': 'AI 提供商配置',
|
||||
'ai_providers.gemini_title': 'Gemini API 密钥',
|
||||
@@ -127,7 +127,7 @@ const i18n = {
|
||||
'ai_providers.gemini_edit_modal_title': '编辑Gemini API密钥',
|
||||
'ai_providers.gemini_edit_modal_key_label': 'API密钥:',
|
||||
'ai_providers.gemini_delete_confirm': '确定要删除这个Gemini密钥吗?',
|
||||
|
||||
|
||||
'ai_providers.codex_title': 'Codex API 配置',
|
||||
'ai_providers.codex_add_button': '添加配置',
|
||||
'ai_providers.codex_empty_title': '暂无Codex配置',
|
||||
@@ -145,7 +145,7 @@ const i18n = {
|
||||
'ai_providers.codex_edit_modal_url_label': 'Base URL (可选):',
|
||||
'ai_providers.codex_edit_modal_proxy_label': '代理 URL (可选):',
|
||||
'ai_providers.codex_delete_confirm': '确定要删除这个Codex配置吗?',
|
||||
|
||||
|
||||
'ai_providers.claude_title': 'Claude API 配置',
|
||||
'ai_providers.claude_add_button': '添加配置',
|
||||
'ai_providers.claude_empty_title': '暂无Claude配置',
|
||||
@@ -163,7 +163,7 @@ const i18n = {
|
||||
'ai_providers.claude_edit_modal_url_label': 'Base URL (可选):',
|
||||
'ai_providers.claude_edit_modal_proxy_label': '代理 URL (可选):',
|
||||
'ai_providers.claude_delete_confirm': '确定要删除这个Claude配置吗?',
|
||||
|
||||
|
||||
'ai_providers.openai_title': 'OpenAI 兼容提供商',
|
||||
'ai_providers.openai_add_button': '添加提供商',
|
||||
'ai_providers.openai_empty_title': '暂无OpenAI兼容提供商',
|
||||
@@ -191,8 +191,8 @@ const i18n = {
|
||||
'ai_providers.openai_delete_confirm': '确定要删除这个OpenAI提供商吗?',
|
||||
'ai_providers.openai_keys_count': '密钥数量',
|
||||
'ai_providers.openai_models_count': '模型数量',
|
||||
|
||||
|
||||
|
||||
|
||||
// 认证文件管理
|
||||
'auth_files.title': '认证文件管理',
|
||||
'auth_files.title_section': '认证文件',
|
||||
@@ -213,7 +213,7 @@ const i18n = {
|
||||
'auth_files.delete_success': '文件删除成功',
|
||||
'auth_files.delete_all_success': '成功删除',
|
||||
'auth_files.files_count': '个文件',
|
||||
|
||||
|
||||
// Gemini Web Token
|
||||
'auth_login.gemini_web_title': 'Gemini Web Token',
|
||||
'auth_login.gemini_web_button': '保存 Gemini Web Token',
|
||||
@@ -225,7 +225,75 @@ const i18n = {
|
||||
'auth_login.gemini_web_label_label': '标签 (可选):',
|
||||
'auth_login.gemini_web_label_placeholder': '输入标签名称 (可选)',
|
||||
'auth_login.gemini_web_saved': 'Gemini Web Token 保存成功',
|
||||
|
||||
|
||||
// Codex OAuth
|
||||
'auth_login.codex_oauth_title': 'Codex OAuth',
|
||||
'auth_login.codex_oauth_button': '开始 Codex 登录',
|
||||
'auth_login.codex_oauth_hint': '通过 OAuth 流程登录 Codex 服务,自动获取并保存认证文件。',
|
||||
'auth_login.codex_oauth_url_label': '授权链接:',
|
||||
'auth_login.codex_open_link': '打开链接',
|
||||
'auth_login.codex_copy_link': '复制链接',
|
||||
'auth_login.codex_oauth_status_waiting': '等待认证中...',
|
||||
'auth_login.codex_oauth_status_success': '认证成功!',
|
||||
'auth_login.codex_oauth_status_error': '认证失败:',
|
||||
'auth_login.codex_oauth_start_error': '启动 Codex OAuth 失败:',
|
||||
'auth_login.codex_oauth_polling_error': '检查认证状态失败:',
|
||||
|
||||
// Anthropic OAuth
|
||||
'auth_login.anthropic_oauth_title': 'Anthropic OAuth',
|
||||
'auth_login.anthropic_oauth_button': '开始 Anthropic 登录',
|
||||
'auth_login.anthropic_oauth_hint': '通过 OAuth 流程登录 Anthropic (Claude) 服务,自动获取并保存认证文件。',
|
||||
'auth_login.anthropic_oauth_url_label': '授权链接:',
|
||||
'auth_login.anthropic_open_link': '打开链接',
|
||||
'auth_login.anthropic_copy_link': '复制链接',
|
||||
'auth_login.anthropic_oauth_status_waiting': '等待认证中...',
|
||||
'auth_login.anthropic_oauth_status_success': '认证成功!',
|
||||
'auth_login.anthropic_oauth_status_error': '认证失败:',
|
||||
'auth_login.anthropic_oauth_start_error': '启动 Anthropic OAuth 失败:',
|
||||
'auth_login.anthropic_oauth_polling_error': '检查认证状态失败:',
|
||||
|
||||
// Gemini CLI OAuth
|
||||
'auth_login.gemini_cli_oauth_title': 'Gemini CLI OAuth',
|
||||
'auth_login.gemini_cli_oauth_button': '开始 Gemini CLI 登录',
|
||||
'auth_login.gemini_cli_oauth_hint': '通过 OAuth 流程登录 Google Gemini CLI 服务,自动获取并保存认证文件。',
|
||||
'auth_login.gemini_cli_project_id_label': 'Google Cloud 项目 ID (可选):',
|
||||
'auth_login.gemini_cli_project_id_placeholder': '输入 Google Cloud 项目 ID (可选)',
|
||||
'auth_login.gemini_cli_project_id_hint': '如果指定了项目 ID,将使用该项目的认证信息。',
|
||||
'auth_login.gemini_cli_oauth_url_label': '授权链接:',
|
||||
'auth_login.gemini_cli_open_link': '打开链接',
|
||||
'auth_login.gemini_cli_copy_link': '复制链接',
|
||||
'auth_login.gemini_cli_oauth_status_waiting': '等待认证中...',
|
||||
'auth_login.gemini_cli_oauth_status_success': '认证成功!',
|
||||
'auth_login.gemini_cli_oauth_status_error': '认证失败:',
|
||||
'auth_login.gemini_cli_oauth_start_error': '启动 Gemini CLI OAuth 失败:',
|
||||
'auth_login.gemini_cli_oauth_polling_error': '检查认证状态失败:',
|
||||
|
||||
// Qwen OAuth
|
||||
'auth_login.qwen_oauth_title': 'Qwen OAuth',
|
||||
'auth_login.qwen_oauth_button': '开始 Qwen 登录',
|
||||
'auth_login.qwen_oauth_hint': '通过设备授权流程登录 Qwen 服务,自动获取并保存认证文件。',
|
||||
'auth_login.qwen_oauth_url_label': '授权链接:',
|
||||
'auth_login.qwen_open_link': '打开链接',
|
||||
'auth_login.qwen_copy_link': '复制链接',
|
||||
'auth_login.qwen_oauth_status_waiting': '等待认证中...',
|
||||
'auth_login.qwen_oauth_status_success': '认证成功!',
|
||||
'auth_login.qwen_oauth_status_error': '认证失败:',
|
||||
'auth_login.qwen_oauth_start_error': '启动 Qwen OAuth 失败:',
|
||||
'auth_login.qwen_oauth_polling_error': '检查认证状态失败:',
|
||||
|
||||
// iFlow OAuth
|
||||
'auth_login.iflow_oauth_title': 'iFlow OAuth',
|
||||
'auth_login.iflow_oauth_button': '开始 iFlow 登录',
|
||||
'auth_login.iflow_oauth_hint': '通过 OAuth 流程登录 iFlow 服务,自动获取并保存认证文件。',
|
||||
'auth_login.iflow_oauth_url_label': '授权链接:',
|
||||
'auth_login.iflow_open_link': '打开链接',
|
||||
'auth_login.iflow_copy_link': '复制链接',
|
||||
'auth_login.iflow_oauth_status_waiting': '等待认证中...',
|
||||
'auth_login.iflow_oauth_status_success': '认证成功!',
|
||||
'auth_login.iflow_oauth_status_error': '认证失败:',
|
||||
'auth_login.iflow_oauth_start_error': '启动 iFlow OAuth 失败:',
|
||||
'auth_login.iflow_oauth_polling_error': '检查认证状态失败:',
|
||||
|
||||
// 使用统计
|
||||
'usage_stats.title': '使用统计',
|
||||
'usage_stats.total_requests': '总请求数',
|
||||
@@ -245,7 +313,7 @@ const i18n = {
|
||||
'usage_stats.tokens_count': 'Token数量',
|
||||
'usage_stats.models': '模型统计',
|
||||
'usage_stats.success_rate': '成功率',
|
||||
|
||||
|
||||
// 系统信息
|
||||
'system_info.title': '系统信息',
|
||||
'system_info.connection_status_title': '连接状态',
|
||||
@@ -256,7 +324,7 @@ const i18n = {
|
||||
'system_info.real_time_data': '实时数据',
|
||||
'system_info.not_loaded': '未加载',
|
||||
'system_info.seconds_ago': '秒前',
|
||||
|
||||
|
||||
// 通知消息
|
||||
'notification.debug_updated': '调试设置已更新',
|
||||
'notification.proxy_updated': '代理设置已更新',
|
||||
@@ -298,12 +366,12 @@ const i18n = {
|
||||
'notification.gemini_api_key': 'Gemini API密钥',
|
||||
'notification.codex_api_key': 'Codex API密钥',
|
||||
'notification.claude_api_key': 'Claude API密钥',
|
||||
|
||||
|
||||
// 语言切换
|
||||
'language.switch': '语言',
|
||||
'language.chinese': '中文',
|
||||
'language.english': 'English',
|
||||
|
||||
|
||||
// 主题切换
|
||||
'theme.switch': '主题',
|
||||
'theme.light': '亮色',
|
||||
@@ -311,12 +379,12 @@ const i18n = {
|
||||
'theme.switch_to_light': '切换到亮色模式',
|
||||
'theme.switch_to_dark': '切换到暗色模式',
|
||||
'theme.auto': '跟随系统',
|
||||
|
||||
|
||||
// 页脚
|
||||
'footer.version': '版本',
|
||||
'footer.author': '作者'
|
||||
},
|
||||
|
||||
|
||||
'en-US': {
|
||||
// Common
|
||||
'common.login': 'Login',
|
||||
@@ -347,15 +415,15 @@ const i18n = {
|
||||
'common.required': 'Required',
|
||||
'common.api_key': 'Key',
|
||||
'common.base_url': 'Address',
|
||||
|
||||
|
||||
// Page titles
|
||||
'title.main': 'CLI Proxy API Management Center',
|
||||
'title.login': 'CLI Proxy API Management Center',
|
||||
|
||||
|
||||
// Auto login
|
||||
'auto_login.title': 'Auto Login in Progress...',
|
||||
'auto_login.message': 'Attempting to connect to server using locally saved connection information',
|
||||
|
||||
|
||||
// Login page
|
||||
'login.subtitle': 'Please enter connection information to access the management interface',
|
||||
'login.connection_title': 'Connection Address',
|
||||
@@ -373,18 +441,18 @@ const i18n = {
|
||||
'login.error_title': 'Login Failed',
|
||||
'login.error_required': 'Please fill in complete connection information',
|
||||
'login.error_invalid': 'Connection failed, please check address and key',
|
||||
|
||||
|
||||
// Header navigation
|
||||
'header.check_connection': 'Check Connection',
|
||||
'header.refresh_all': 'Refresh All',
|
||||
'header.logout': 'Logout',
|
||||
|
||||
|
||||
// Connection info
|
||||
'connection.title': 'Connection Information',
|
||||
'connection.server_address': 'Server Address:',
|
||||
'connection.management_key': 'Management Key:',
|
||||
'connection.status': 'Connection Status:',
|
||||
|
||||
|
||||
// Sidebar navigation
|
||||
'nav.basic_settings': 'Basic Settings',
|
||||
'nav.api_keys': 'API Keys',
|
||||
@@ -392,7 +460,7 @@ const i18n = {
|
||||
'nav.auth_files': 'Auth Files',
|
||||
'nav.usage_stats': 'Usage Statistics',
|
||||
'nav.system_info': 'System Info',
|
||||
|
||||
|
||||
// Basic settings
|
||||
'basic_settings.title': 'Basic Settings',
|
||||
'basic_settings.debug_title': 'Debug Mode',
|
||||
@@ -408,7 +476,7 @@ const i18n = {
|
||||
'basic_settings.quota_title': 'Quota Exceeded Behavior',
|
||||
'basic_settings.quota_switch_project': 'Auto Switch Project',
|
||||
'basic_settings.quota_switch_preview': 'Switch to Preview Model',
|
||||
|
||||
|
||||
// API Keys management
|
||||
'api_keys.title': 'API Keys Management',
|
||||
'api_keys.proxy_auth_title': 'Proxy Service Authentication Keys',
|
||||
@@ -422,7 +490,7 @@ const i18n = {
|
||||
'api_keys.edit_modal_title': 'Edit API Key',
|
||||
'api_keys.edit_modal_key_label': 'API Key:',
|
||||
'api_keys.delete_confirm': 'Are you sure you want to delete this API key?',
|
||||
|
||||
|
||||
// AI Providers
|
||||
'ai_providers.title': 'AI Providers Configuration',
|
||||
'ai_providers.gemini_title': 'Gemini API Keys',
|
||||
@@ -436,7 +504,7 @@ const i18n = {
|
||||
'ai_providers.gemini_edit_modal_title': 'Edit Gemini API Key',
|
||||
'ai_providers.gemini_edit_modal_key_label': 'API Key:',
|
||||
'ai_providers.gemini_delete_confirm': 'Are you sure you want to delete this Gemini key?',
|
||||
|
||||
|
||||
'ai_providers.codex_title': 'Codex API Configuration',
|
||||
'ai_providers.codex_add_button': 'Add Configuration',
|
||||
'ai_providers.codex_empty_title': 'No Codex Configuration',
|
||||
@@ -451,7 +519,7 @@ const i18n = {
|
||||
'ai_providers.codex_edit_modal_key_label': 'API Key:',
|
||||
'ai_providers.codex_edit_modal_url_label': 'Base URL (Optional):',
|
||||
'ai_providers.codex_delete_confirm': 'Are you sure you want to delete this Codex configuration?',
|
||||
|
||||
|
||||
'ai_providers.claude_title': 'Claude API Configuration',
|
||||
'ai_providers.claude_add_button': 'Add Configuration',
|
||||
'ai_providers.claude_empty_title': 'No Claude Configuration',
|
||||
@@ -466,7 +534,7 @@ const i18n = {
|
||||
'ai_providers.claude_edit_modal_key_label': 'API Key:',
|
||||
'ai_providers.claude_edit_modal_url_label': 'Base URL (Optional):',
|
||||
'ai_providers.claude_delete_confirm': 'Are you sure you want to delete this Claude configuration?',
|
||||
|
||||
|
||||
'ai_providers.openai_title': 'OpenAI Compatible Providers',
|
||||
'ai_providers.openai_add_button': 'Add Provider',
|
||||
'ai_providers.openai_empty_title': 'No OpenAI Compatible Providers',
|
||||
@@ -485,8 +553,8 @@ const i18n = {
|
||||
'ai_providers.openai_delete_confirm': 'Are you sure you want to delete this OpenAI provider?',
|
||||
'ai_providers.openai_keys_count': 'Keys Count',
|
||||
'ai_providers.openai_models_count': 'Models Count',
|
||||
|
||||
|
||||
|
||||
|
||||
// Auth files management
|
||||
'auth_files.title': 'Auth Files Management',
|
||||
'auth_files.title_section': 'Auth Files',
|
||||
@@ -507,7 +575,7 @@ const i18n = {
|
||||
'auth_files.delete_success': 'File deleted successfully',
|
||||
'auth_files.delete_all_success': 'Successfully deleted',
|
||||
'auth_files.files_count': 'files',
|
||||
|
||||
|
||||
// Gemini Web Token
|
||||
'auth_login.gemini_web_title': 'Gemini Web Token',
|
||||
'auth_login.gemini_web_button': 'Save Gemini Web Token',
|
||||
@@ -519,7 +587,75 @@ const i18n = {
|
||||
'auth_login.gemini_web_label_label': 'Label (Optional):',
|
||||
'auth_login.gemini_web_label_placeholder': 'Enter label name (optional)',
|
||||
'auth_login.gemini_web_saved': 'Gemini Web Token saved successfully',
|
||||
|
||||
|
||||
// Codex OAuth
|
||||
'auth_login.codex_oauth_title': 'Codex OAuth',
|
||||
'auth_login.codex_oauth_button': 'Start Codex Login',
|
||||
'auth_login.codex_oauth_hint': 'Login to Codex service through OAuth flow, automatically obtain and save authentication files.',
|
||||
'auth_login.codex_oauth_url_label': 'Authorization URL:',
|
||||
'auth_login.codex_open_link': 'Open Link',
|
||||
'auth_login.codex_copy_link': 'Copy Link',
|
||||
'auth_login.codex_oauth_status_waiting': 'Waiting for authentication...',
|
||||
'auth_login.codex_oauth_status_success': 'Authentication successful!',
|
||||
'auth_login.codex_oauth_status_error': 'Authentication failed:',
|
||||
'auth_login.codex_oauth_start_error': 'Failed to start Codex OAuth:',
|
||||
'auth_login.codex_oauth_polling_error': 'Failed to check authentication status:',
|
||||
|
||||
// Anthropic OAuth
|
||||
'auth_login.anthropic_oauth_title': 'Anthropic OAuth',
|
||||
'auth_login.anthropic_oauth_button': 'Start Anthropic Login',
|
||||
'auth_login.anthropic_oauth_hint': 'Login to Anthropic (Claude) service through OAuth flow, automatically obtain and save authentication files.',
|
||||
'auth_login.anthropic_oauth_url_label': 'Authorization URL:',
|
||||
'auth_login.anthropic_open_link': 'Open Link',
|
||||
'auth_login.anthropic_copy_link': 'Copy Link',
|
||||
'auth_login.anthropic_oauth_status_waiting': 'Waiting for authentication...',
|
||||
'auth_login.anthropic_oauth_status_success': 'Authentication successful!',
|
||||
'auth_login.anthropic_oauth_status_error': 'Authentication failed:',
|
||||
'auth_login.anthropic_oauth_start_error': 'Failed to start Anthropic OAuth:',
|
||||
'auth_login.anthropic_oauth_polling_error': 'Failed to check authentication status:',
|
||||
|
||||
// Gemini CLI OAuth
|
||||
'auth_login.gemini_cli_oauth_title': 'Gemini CLI OAuth',
|
||||
'auth_login.gemini_cli_oauth_button': 'Start Gemini CLI Login',
|
||||
'auth_login.gemini_cli_oauth_hint': 'Login to Google Gemini CLI service through OAuth flow, automatically obtain and save authentication files.',
|
||||
'auth_login.gemini_cli_project_id_label': 'Google Cloud Project ID (Optional):',
|
||||
'auth_login.gemini_cli_project_id_placeholder': 'Enter Google Cloud Project ID (optional)',
|
||||
'auth_login.gemini_cli_project_id_hint': 'If a project ID is specified, authentication information for that project will be used.',
|
||||
'auth_login.gemini_cli_oauth_url_label': 'Authorization URL:',
|
||||
'auth_login.gemini_cli_open_link': 'Open Link',
|
||||
'auth_login.gemini_cli_copy_link': 'Copy Link',
|
||||
'auth_login.gemini_cli_oauth_status_waiting': 'Waiting for authentication...',
|
||||
'auth_login.gemini_cli_oauth_status_success': 'Authentication successful!',
|
||||
'auth_login.gemini_cli_oauth_status_error': 'Authentication failed:',
|
||||
'auth_login.gemini_cli_oauth_start_error': 'Failed to start Gemini CLI OAuth:',
|
||||
'auth_login.gemini_cli_oauth_polling_error': 'Failed to check authentication status:',
|
||||
|
||||
// Qwen OAuth
|
||||
'auth_login.qwen_oauth_title': 'Qwen OAuth',
|
||||
'auth_login.qwen_oauth_button': 'Start Qwen Login',
|
||||
'auth_login.qwen_oauth_hint': 'Login to Qwen service through device authorization flow, automatically obtain and save authentication files.',
|
||||
'auth_login.qwen_oauth_url_label': 'Authorization URL:',
|
||||
'auth_login.qwen_open_link': 'Open Link',
|
||||
'auth_login.qwen_copy_link': 'Copy Link',
|
||||
'auth_login.qwen_oauth_status_waiting': 'Waiting for authentication...',
|
||||
'auth_login.qwen_oauth_status_success': 'Authentication successful!',
|
||||
'auth_login.qwen_oauth_status_error': 'Authentication failed:',
|
||||
'auth_login.qwen_oauth_start_error': 'Failed to start Qwen OAuth:',
|
||||
'auth_login.qwen_oauth_polling_error': 'Failed to check authentication status:',
|
||||
|
||||
// iFlow OAuth
|
||||
'auth_login.iflow_oauth_title': 'iFlow OAuth',
|
||||
'auth_login.iflow_oauth_button': 'Start iFlow Login',
|
||||
'auth_login.iflow_oauth_hint': 'Login to iFlow service through OAuth flow, automatically obtain and save authentication files.',
|
||||
'auth_login.iflow_oauth_url_label': 'Authorization URL:',
|
||||
'auth_login.iflow_open_link': 'Open Link',
|
||||
'auth_login.iflow_copy_link': 'Copy Link',
|
||||
'auth_login.iflow_oauth_status_waiting': 'Waiting for authentication...',
|
||||
'auth_login.iflow_oauth_status_success': 'Authentication successful!',
|
||||
'auth_login.iflow_oauth_status_error': 'Authentication failed:',
|
||||
'auth_login.iflow_oauth_start_error': 'Failed to start iFlow OAuth:',
|
||||
'auth_login.iflow_oauth_polling_error': 'Failed to check authentication status:',
|
||||
|
||||
// Usage Statistics
|
||||
'usage_stats.title': 'Usage Statistics',
|
||||
'usage_stats.total_requests': 'Total Requests',
|
||||
@@ -539,7 +675,7 @@ const i18n = {
|
||||
'usage_stats.tokens_count': 'Token Count',
|
||||
'usage_stats.models': 'Model Statistics',
|
||||
'usage_stats.success_rate': 'Success Rate',
|
||||
|
||||
|
||||
// System info
|
||||
'system_info.title': 'System Information',
|
||||
'system_info.connection_status_title': 'Connection Status',
|
||||
@@ -550,7 +686,7 @@ const i18n = {
|
||||
'system_info.real_time_data': 'Real-time Data',
|
||||
'system_info.not_loaded': 'Not Loaded',
|
||||
'system_info.seconds_ago': 'seconds ago',
|
||||
|
||||
|
||||
// Notification messages
|
||||
'notification.debug_updated': 'Debug settings updated',
|
||||
'notification.proxy_updated': 'Proxy settings updated',
|
||||
@@ -590,12 +726,12 @@ const i18n = {
|
||||
'notification.gemini_api_key': 'Gemini API key',
|
||||
'notification.codex_api_key': 'Codex API key',
|
||||
'notification.claude_api_key': 'Claude API key',
|
||||
|
||||
|
||||
// Language switch
|
||||
'language.switch': 'Language',
|
||||
'language.chinese': '中文',
|
||||
'language.english': 'English',
|
||||
|
||||
|
||||
// Theme switch
|
||||
'theme.switch': 'Theme',
|
||||
'theme.light': 'Light',
|
||||
@@ -603,25 +739,25 @@ const i18n = {
|
||||
'theme.switch_to_light': 'Switch to light mode',
|
||||
'theme.switch_to_dark': 'Switch to dark mode',
|
||||
'theme.auto': 'Follow system',
|
||||
|
||||
|
||||
// Footer
|
||||
'footer.version': 'Version',
|
||||
'footer.author': 'Author'
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
// 获取翻译文本
|
||||
t(key, params = {}) {
|
||||
const translation = this.translations[this.currentLanguage]?.[key] ||
|
||||
this.translations[this.fallbackLanguage]?.[key] ||
|
||||
key;
|
||||
|
||||
const translation = this.translations[this.currentLanguage]?.[key] ||
|
||||
this.translations[this.fallbackLanguage]?.[key] ||
|
||||
key;
|
||||
|
||||
// 简单的参数替换
|
||||
return translation.replace(/\{(\w+)\}/g, (match, param) => {
|
||||
return params[param] || match;
|
||||
});
|
||||
},
|
||||
|
||||
|
||||
// 设置语言
|
||||
setLanguage(lang) {
|
||||
if (this.translations[lang]) {
|
||||
@@ -631,19 +767,19 @@ const i18n = {
|
||||
this.updateAllTexts();
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
// 更新页面语言属性
|
||||
updatePageLanguage() {
|
||||
document.documentElement.lang = this.currentLanguage;
|
||||
},
|
||||
|
||||
|
||||
// 更新所有文本
|
||||
updateAllTexts() {
|
||||
// 更新所有带有 data-i18n 属性的元素
|
||||
document.querySelectorAll('[data-i18n]').forEach(element => {
|
||||
const key = element.getAttribute('data-i18n');
|
||||
const text = this.t(key);
|
||||
|
||||
|
||||
if (element.tagName === 'INPUT' && (element.type === 'text' || element.type === 'password')) {
|
||||
element.placeholder = text;
|
||||
} else if (element.tagName === 'TITLE') {
|
||||
@@ -652,7 +788,7 @@ const i18n = {
|
||||
element.textContent = text;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
// 更新所有带有 data-i18n-html 属性的元素(支持HTML)
|
||||
document.querySelectorAll('[data-i18n-html]').forEach(element => {
|
||||
const key = element.getAttribute('data-i18n-html');
|
||||
@@ -660,7 +796,7 @@ const i18n = {
|
||||
element.innerHTML = html;
|
||||
});
|
||||
},
|
||||
|
||||
|
||||
// 初始化
|
||||
init() {
|
||||
// 从本地存储获取用户偏好语言
|
||||
@@ -676,7 +812,7 @@ const i18n = {
|
||||
this.currentLanguage = 'en-US';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
this.updatePageLanguage();
|
||||
this.updateAllTexts();
|
||||
}
|
||||
|
||||
1068
index.html
1068
index.html
File diff suppressed because it is too large
Load Diff
618
styles.css
618
styles.css
@@ -9,30 +9,30 @@
|
||||
:root {
|
||||
/* 布局尺寸 */
|
||||
--navbar-height: 69px;
|
||||
|
||||
|
||||
/* 亮色主题(默认) */
|
||||
--bg-primary: #f5f7fa;
|
||||
--bg-secondary: #ffffff;
|
||||
--bg-tertiary: #f8f9fb;
|
||||
--bg-quaternary: #f7fafc;
|
||||
--bg-modal: rgba(0, 0, 0, 0.5);
|
||||
|
||||
|
||||
/* 侧边栏颜色 */
|
||||
--sidebar-bg: #ffffff;
|
||||
--sidebar-hover: #f0f2f5;
|
||||
--sidebar-active: #e8f4ff;
|
||||
--sidebar-border: #e5e7eb;
|
||||
|
||||
|
||||
--text-primary: #1f2937;
|
||||
--text-secondary: #4b5563;
|
||||
--text-tertiary: #6b7280;
|
||||
--text-quaternary: #9ca3af;
|
||||
--text-inverse: white;
|
||||
|
||||
|
||||
--border-primary: #e5e7eb;
|
||||
--border-secondary: #d1d5db;
|
||||
--border-focus: #3b82f6;
|
||||
|
||||
|
||||
--accent-primary: #3b82f6;
|
||||
--accent-secondary: #e5e7eb;
|
||||
--accent-tertiary: #f3f4f6;
|
||||
@@ -40,25 +40,25 @@
|
||||
--primary-hover: #2563eb;
|
||||
--card-bg: #ffffff;
|
||||
--border-color: #e5e7eb;
|
||||
|
||||
|
||||
--success-bg: #d1fae5;
|
||||
--success-text: #065f46;
|
||||
--success-border: #6ee7b7;
|
||||
|
||||
|
||||
--error-bg: #fee2e2;
|
||||
--error-text: #991b1b;
|
||||
--error-border: #fca5a5;
|
||||
|
||||
|
||||
--warning-bg: #fef3c7;
|
||||
--warning-text: #92400e;
|
||||
--warning-border: #fbbf24;
|
||||
|
||||
|
||||
--shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
|
||||
--shadow-primary: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06);
|
||||
--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
|
||||
--shadow-secondary: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
|
||||
--shadow-modal: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
|
||||
|
||||
|
||||
--glass-bg: rgba(255, 255, 255, 0.95);
|
||||
--glass-border: rgba(229, 231, 235, 0.8);
|
||||
}
|
||||
@@ -70,23 +70,23 @@
|
||||
--bg-tertiary: #1a202c;
|
||||
--bg-quaternary: #2d3748;
|
||||
--bg-modal: rgba(0, 0, 0, 0.7);
|
||||
|
||||
|
||||
/* 侧边栏颜色 */
|
||||
--sidebar-bg: #1f2937;
|
||||
--sidebar-hover: #374151;
|
||||
--sidebar-active: #1e3a5f;
|
||||
--sidebar-border: #374151;
|
||||
|
||||
|
||||
--text-primary: #f9fafb;
|
||||
--text-secondary: #e5e7eb;
|
||||
--text-tertiary: #d1d5db;
|
||||
--text-quaternary: #9ca3af;
|
||||
--text-inverse: #ffffff;
|
||||
|
||||
|
||||
--border-primary: #374151;
|
||||
--border-secondary: #4b5563;
|
||||
--border-focus: #60a5fa;
|
||||
|
||||
|
||||
--accent-primary: #3b82f6;
|
||||
--accent-secondary: #374151;
|
||||
--accent-tertiary: #1f2937;
|
||||
@@ -94,25 +94,25 @@
|
||||
--primary-hover: #3b82f6;
|
||||
--card-bg: #1f2937;
|
||||
--border-color: #374151;
|
||||
|
||||
|
||||
--success-bg: #064e3b;
|
||||
--success-text: #6ee7b7;
|
||||
--success-border: #059669;
|
||||
|
||||
|
||||
--error-bg: #7f1d1d;
|
||||
--error-text: #fca5a5;
|
||||
--error-border: #dc2626;
|
||||
|
||||
|
||||
--warning-bg: #78350f;
|
||||
--warning-text: #fbbf24;
|
||||
--warning-border: #f59e0b;
|
||||
|
||||
|
||||
--shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.3);
|
||||
--shadow-primary: 0 1px 3px 0 rgba(0, 0, 0, 0.3), 0 1px 2px 0 rgba(0, 0, 0, 0.2);
|
||||
--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.3), 0 2px 4px -1px rgba(0, 0, 0, 0.2);
|
||||
--shadow-secondary: 0 10px 15px -3px rgba(0, 0, 0, 0.3), 0 4px 6px -2px rgba(0, 0, 0, 0.2);
|
||||
--shadow-modal: 0 20px 25px -5px rgba(0, 0, 0, 0.4), 0 10px 10px -5px rgba(0, 0, 0, 0.3);
|
||||
|
||||
|
||||
--glass-bg: rgba(31, 41, 59, 0.95);
|
||||
--glass-border: rgba(75, 85, 99, 0.8);
|
||||
}
|
||||
@@ -149,8 +149,13 @@
|
||||
}
|
||||
|
||||
@keyframes spin {
|
||||
0% { transform: rotate(0deg); }
|
||||
100% { transform: rotate(360deg); }
|
||||
0% {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
|
||||
100% {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
|
||||
.auto-login-content h2 {
|
||||
@@ -198,7 +203,8 @@
|
||||
border: 1px solid rgba(255, 255, 255, 0.2);
|
||||
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1);
|
||||
transition: all 0.3s ease;
|
||||
margin-top: 8px; /* 与标题拉开距离,避免遮挡 */
|
||||
margin-top: 8px;
|
||||
/* 与标题拉开距离,避免遮挡 */
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
@@ -537,29 +543,31 @@
|
||||
margin: 10px;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
|
||||
.login-header-top {
|
||||
flex-direction: column;
|
||||
gap: 20px;
|
||||
align-items: center;
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
|
||||
|
||||
.header-controls {
|
||||
flex-direction: row;
|
||||
justify-content: center;
|
||||
gap: 8px;
|
||||
margin-bottom: 10px; /* 在小屏幕上给控制按钮组添加下边距 */
|
||||
margin-bottom: 10px;
|
||||
/* 在小屏幕上给控制按钮组添加下边距 */
|
||||
}
|
||||
|
||||
|
||||
/* 登录页面小屏幕优化 */
|
||||
.login-header-top .header-controls {
|
||||
margin: 8px auto 0 auto; /* 顶部留白,避免与标题拥挤 */
|
||||
margin: 8px auto 0 auto;
|
||||
/* 顶部留白,避免与标题拥挤 */
|
||||
background: rgba(255, 255, 255, 0.08);
|
||||
padding: 6px;
|
||||
border-radius: 10px;
|
||||
}
|
||||
|
||||
|
||||
.login-header-top .language-btn,
|
||||
.login-header-top .theme-btn {
|
||||
padding: 6px 10px;
|
||||
@@ -567,14 +575,15 @@
|
||||
height: 32px;
|
||||
min-width: 32px;
|
||||
}
|
||||
|
||||
|
||||
.language-btn,
|
||||
.theme-btn {
|
||||
padding: 8px 16px;
|
||||
font-size: 13px;
|
||||
height: 36px; /* 在小屏幕上稍微减小高度 */
|
||||
height: 36px;
|
||||
/* 在小屏幕上稍微减小高度 */
|
||||
}
|
||||
|
||||
|
||||
.login-title {
|
||||
font-size: 1.5rem;
|
||||
flex-direction: column;
|
||||
@@ -583,16 +592,16 @@
|
||||
justify-content: center;
|
||||
margin-bottom: 25px;
|
||||
}
|
||||
|
||||
|
||||
#login-logo {
|
||||
height: 50px;
|
||||
}
|
||||
|
||||
|
||||
.login-form .input-group {
|
||||
flex-direction: column;
|
||||
align-items: stretch;
|
||||
}
|
||||
|
||||
|
||||
.login-form .btn-secondary {
|
||||
width: 100%;
|
||||
margin-top: 10px;
|
||||
@@ -851,7 +860,7 @@ body {
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
.top-navbar-actions > * {
|
||||
.top-navbar-actions>* {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
height: 36px;
|
||||
@@ -892,7 +901,7 @@ body {
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.top-navbar-actions > * {
|
||||
.top-navbar-actions>* {
|
||||
height: 34px;
|
||||
min-height: 34px;
|
||||
}
|
||||
@@ -933,7 +942,7 @@ body {
|
||||
.header-actions .btn span {
|
||||
display: none;
|
||||
}
|
||||
|
||||
|
||||
.header-actions .btn {
|
||||
padding: 6px 10px;
|
||||
}
|
||||
@@ -1017,7 +1026,7 @@ body {
|
||||
align-items: flex-start;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
|
||||
.info-value {
|
||||
max-width: 100%;
|
||||
width: 100%;
|
||||
@@ -1049,6 +1058,7 @@ body {
|
||||
opacity: 0;
|
||||
transform: translateY(10px);
|
||||
}
|
||||
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
@@ -1293,11 +1303,11 @@ textarea::placeholder {
|
||||
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
|
||||
input:checked + .slider {
|
||||
input:checked+.slider {
|
||||
background: var(--primary-color);
|
||||
}
|
||||
|
||||
input:checked + .slider:before {
|
||||
input:checked+.slider:before {
|
||||
transform: translateX(20px);
|
||||
}
|
||||
|
||||
@@ -1457,6 +1467,7 @@ input:checked + .slider:before {
|
||||
opacity: 0;
|
||||
transform: translateY(-30px);
|
||||
}
|
||||
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
@@ -1612,34 +1623,34 @@ input:checked + .slider:before {
|
||||
transform: translateX(0);
|
||||
box-shadow: var(--shadow-secondary);
|
||||
}
|
||||
|
||||
|
||||
/* 移动端强制恢复侧栏展开状态 */
|
||||
.sidebar.collapsed {
|
||||
width: 240px !important;
|
||||
}
|
||||
|
||||
|
||||
.sidebar.collapsed .nav-item span {
|
||||
opacity: 1 !important;
|
||||
width: auto !important;
|
||||
overflow: visible !important;
|
||||
}
|
||||
|
||||
|
||||
.sidebar.collapsed .nav-item {
|
||||
justify-content: flex-start !important;
|
||||
padding: 10px 14px !important;
|
||||
}
|
||||
|
||||
|
||||
.sidebar.collapsed .nav-item i {
|
||||
margin-right: 12px !important;
|
||||
}
|
||||
|
||||
|
||||
.main-wrapper {
|
||||
margin-left: 0;
|
||||
width: 100%;
|
||||
min-height: calc(100vh - var(--navbar-height, 69px));
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
|
||||
.main-content {
|
||||
padding: 20px 16px;
|
||||
}
|
||||
@@ -1649,18 +1660,18 @@ input:checked + .slider:before {
|
||||
.top-navbar {
|
||||
padding: 12px 16px;
|
||||
}
|
||||
|
||||
|
||||
.top-navbar-title {
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
|
||||
.top-navbar-actions {
|
||||
gap: 6px;
|
||||
flex-wrap: wrap;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
|
||||
.top-navbar-actions > * {
|
||||
.top-navbar-actions>* {
|
||||
height: 34px;
|
||||
min-height: 34px;
|
||||
}
|
||||
@@ -1681,66 +1692,66 @@ input:checked + .slider:before {
|
||||
.top-navbar-actions .btn span {
|
||||
display: none;
|
||||
}
|
||||
|
||||
|
||||
.btn {
|
||||
padding: 6px 12px;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
|
||||
.card {
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
|
||||
.card-header {
|
||||
padding: 16px 20px;
|
||||
}
|
||||
|
||||
|
||||
.card-content {
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
|
||||
.input-group {
|
||||
flex-direction: column;
|
||||
align-items: stretch;
|
||||
}
|
||||
|
||||
|
||||
.card-header {
|
||||
flex-direction: column;
|
||||
gap: 12px;
|
||||
align-items: flex-start;
|
||||
}
|
||||
|
||||
|
||||
.card-header .header-actions {
|
||||
width: 100%;
|
||||
justify-content: flex-start;
|
||||
}
|
||||
|
||||
|
||||
/* 模态框响应式 */
|
||||
.modal-content {
|
||||
margin: 5% auto;
|
||||
width: 95%;
|
||||
max-width: none;
|
||||
}
|
||||
|
||||
|
||||
#modal-body {
|
||||
padding: 40px 20px 20px 20px;
|
||||
}
|
||||
|
||||
|
||||
#modal-body h3 {
|
||||
font-size: 18px;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
|
||||
#modal-body .modal-actions {
|
||||
flex-direction: column-reverse;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
|
||||
#modal-body .modal-actions .btn {
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
|
||||
.content-section h2 {
|
||||
font-size: 20px;
|
||||
margin-bottom: 20px;
|
||||
@@ -1803,7 +1814,9 @@ input:checked + .slider:before {
|
||||
}
|
||||
|
||||
@keyframes spin {
|
||||
to { transform: rotate(360deg); }
|
||||
to {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
|
||||
/* 空状态 */
|
||||
@@ -1899,9 +1912,11 @@ input:checked + .slider:before {
|
||||
0% {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
50% {
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
100% {
|
||||
opacity: 1;
|
||||
}
|
||||
@@ -2211,3 +2226,480 @@ input:checked + .slider:before {
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
/* Codex OAuth 样式 */
|
||||
#codex-oauth-content {
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
#codex-oauth-url {
|
||||
font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
|
||||
font-size: 13px;
|
||||
background: var(--bg-tertiary);
|
||||
border: 1px solid var(--border-primary);
|
||||
color: var(--text-secondary);
|
||||
}
|
||||
|
||||
#codex-oauth-url:focus {
|
||||
border-color: var(--border-focus);
|
||||
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
|
||||
}
|
||||
|
||||
#codex-oauth-status {
|
||||
font-weight: 500;
|
||||
padding: 8px 12px;
|
||||
border-radius: 6px;
|
||||
background: var(--bg-tertiary);
|
||||
border: 1px solid var(--border-primary);
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
#codex-oauth-status.success {
|
||||
background: var(--success-bg);
|
||||
border-color: var(--success-border);
|
||||
color: var(--success-text);
|
||||
}
|
||||
|
||||
#codex-oauth-status.error {
|
||||
background: var(--error-bg);
|
||||
border-color: var(--error-border);
|
||||
color: var(--error-text);
|
||||
}
|
||||
|
||||
#codex-oauth-status.warning {
|
||||
background: var(--warning-bg);
|
||||
border-color: var(--warning-border);
|
||||
color: var(--warning-text);
|
||||
}
|
||||
|
||||
/* Codex OAuth 按钮样式 */
|
||||
#codex-open-link,
|
||||
#codex-copy-link {
|
||||
min-width: 100px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
#codex-open-link {
|
||||
background: var(--primary-color);
|
||||
border-color: var(--primary-color);
|
||||
}
|
||||
|
||||
#codex-open-link:hover {
|
||||
background: var(--primary-hover);
|
||||
border-color: var(--primary-hover);
|
||||
}
|
||||
|
||||
#codex-copy-link {
|
||||
background: var(--bg-secondary);
|
||||
border-color: var(--border-primary);
|
||||
color: var(--text-secondary);
|
||||
}
|
||||
|
||||
#codex-copy-link:hover {
|
||||
background: var(--bg-tertiary);
|
||||
border-color: var(--border-secondary);
|
||||
color: var(--text-primary);
|
||||
}
|
||||
|
||||
/* 响应式设计 - Codex OAuth */
|
||||
@media (max-width: 768px) {
|
||||
#codex-oauth-content .input-group {
|
||||
flex-direction: column;
|
||||
align-items: stretch;
|
||||
}
|
||||
|
||||
#codex-open-link,
|
||||
#codex-copy-link {
|
||||
width: 100%;
|
||||
margin-top: 8px;
|
||||
}
|
||||
|
||||
#codex-oauth-url {
|
||||
font-size: 12px;
|
||||
}
|
||||
}
|
||||
|
||||
/* Anthropic OAuth 样式 */
|
||||
#anthropic-oauth-content {
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
#anthropic-oauth-url {
|
||||
font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
|
||||
font-size: 13px;
|
||||
background: var(--bg-tertiary);
|
||||
border: 1px solid var(--border-primary);
|
||||
color: var(--text-secondary);
|
||||
}
|
||||
|
||||
#anthropic-oauth-url:focus {
|
||||
border-color: var(--border-focus);
|
||||
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
|
||||
}
|
||||
|
||||
#anthropic-oauth-status {
|
||||
font-weight: 500;
|
||||
padding: 8px 12px;
|
||||
border-radius: 6px;
|
||||
background: var(--bg-tertiary);
|
||||
border: 1px solid var(--border-primary);
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
#anthropic-oauth-status.success {
|
||||
background: var(--success-bg);
|
||||
border-color: var(--success-border);
|
||||
color: var(--success-text);
|
||||
}
|
||||
|
||||
#anthropic-oauth-status.error {
|
||||
background: var(--error-bg);
|
||||
border-color: var(--error-border);
|
||||
color: var(--error-text);
|
||||
}
|
||||
|
||||
#anthropic-oauth-status.warning {
|
||||
background: var(--warning-bg);
|
||||
border-color: var(--warning-border);
|
||||
color: var(--warning-text);
|
||||
}
|
||||
|
||||
/* Anthropic OAuth 按钮样式 */
|
||||
#anthropic-open-link,
|
||||
#anthropic-copy-link {
|
||||
min-width: 100px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
#anthropic-open-link {
|
||||
background: var(--primary-color);
|
||||
border-color: var(--primary-color);
|
||||
}
|
||||
|
||||
#anthropic-open-link:hover {
|
||||
background: var(--primary-hover);
|
||||
border-color: var(--primary-hover);
|
||||
}
|
||||
|
||||
#anthropic-copy-link {
|
||||
background: var(--bg-secondary);
|
||||
border-color: var(--border-primary);
|
||||
color: var(--text-secondary);
|
||||
}
|
||||
|
||||
#anthropic-copy-link:hover {
|
||||
background: var(--bg-tertiary);
|
||||
border-color: var(--border-secondary);
|
||||
color: var(--text-primary);
|
||||
}
|
||||
|
||||
/* 响应式设计 - Anthropic OAuth */
|
||||
@media (max-width: 768px) {
|
||||
#anthropic-oauth-content .input-group {
|
||||
flex-direction: column;
|
||||
align-items: stretch;
|
||||
}
|
||||
|
||||
#anthropic-open-link,
|
||||
#anthropic-copy-link {
|
||||
width: 100%;
|
||||
margin-top: 8px;
|
||||
}
|
||||
|
||||
#anthropic-oauth-url {
|
||||
font-size: 12px;
|
||||
}
|
||||
}
|
||||
|
||||
/* Gemini CLI OAuth 样式 */
|
||||
#gemini-cli-oauth-content {
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
#gemini-cli-oauth-url {
|
||||
font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
|
||||
font-size: 13px;
|
||||
background: var(--bg-tertiary);
|
||||
border: 1px solid var(--border-primary);
|
||||
color: var(--text-secondary);
|
||||
}
|
||||
|
||||
#gemini-cli-oauth-url:focus {
|
||||
border-color: var(--border-focus);
|
||||
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
|
||||
}
|
||||
|
||||
#gemini-cli-oauth-status {
|
||||
font-weight: 500;
|
||||
padding: 8px 12px;
|
||||
border-radius: 6px;
|
||||
background: var(--bg-tertiary);
|
||||
border: 1px solid var(--border-primary);
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
#gemini-cli-oauth-status.success {
|
||||
background: var(--success-bg);
|
||||
border-color: var(--success-border);
|
||||
color: var(--success-text);
|
||||
}
|
||||
|
||||
#gemini-cli-oauth-status.error {
|
||||
background: var(--error-bg);
|
||||
border-color: var(--error-border);
|
||||
color: var(--error-text);
|
||||
}
|
||||
|
||||
#gemini-cli-oauth-status.warning {
|
||||
background: var(--warning-bg);
|
||||
border-color: var(--warning-border);
|
||||
color: var(--warning-text);
|
||||
}
|
||||
|
||||
/* Gemini CLI OAuth 按钮样式 */
|
||||
#gemini-cli-open-link,
|
||||
#gemini-cli-copy-link {
|
||||
min-width: 100px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
#gemini-cli-open-link {
|
||||
background: var(--primary-color);
|
||||
border-color: var(--primary-color);
|
||||
}
|
||||
|
||||
#gemini-cli-open-link:hover {
|
||||
background: var(--primary-hover);
|
||||
border-color: var(--primary-hover);
|
||||
}
|
||||
|
||||
#gemini-cli-copy-link {
|
||||
background: var(--bg-secondary);
|
||||
border-color: var(--border-primary);
|
||||
color: var(--text-secondary);
|
||||
}
|
||||
|
||||
#gemini-cli-copy-link:hover {
|
||||
background: var(--bg-tertiary);
|
||||
border-color: var(--border-secondary);
|
||||
color: var(--text-primary);
|
||||
}
|
||||
|
||||
/* Gemini CLI 项目 ID 输入框样式 */
|
||||
#gemini-cli-project-id {
|
||||
font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
|
||||
font-size: 13px;
|
||||
background: var(--bg-tertiary);
|
||||
border: 1px solid var(--border-primary);
|
||||
color: var(--text-secondary);
|
||||
}
|
||||
|
||||
#gemini-cli-project-id:focus {
|
||||
border-color: var(--border-focus);
|
||||
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
|
||||
}
|
||||
|
||||
/* 响应式设计 - Gemini CLI OAuth */
|
||||
@media (max-width: 768px) {
|
||||
#gemini-cli-oauth-content .input-group {
|
||||
flex-direction: column;
|
||||
align-items: stretch;
|
||||
}
|
||||
|
||||
#gemini-cli-open-link,
|
||||
#gemini-cli-copy-link {
|
||||
width: 100%;
|
||||
margin-top: 8px;
|
||||
}
|
||||
|
||||
#gemini-cli-oauth-url {
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
#gemini-cli-project-id {
|
||||
font-size: 12px;
|
||||
}
|
||||
}
|
||||
|
||||
/* Qwen OAuth 样式 */
|
||||
#qwen-oauth-content {
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
#qwen-oauth-url {
|
||||
font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
|
||||
font-size: 13px;
|
||||
background: var(--bg-tertiary);
|
||||
border: 1px solid var(--border-primary);
|
||||
color: var(--text-secondary);
|
||||
}
|
||||
|
||||
#qwen-oauth-url:focus {
|
||||
border-color: var(--border-focus);
|
||||
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
|
||||
}
|
||||
|
||||
#qwen-oauth-status {
|
||||
font-weight: 500;
|
||||
padding: 8px 12px;
|
||||
border-radius: 6px;
|
||||
background: var(--bg-tertiary);
|
||||
border: 1px solid var(--border-primary);
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
#qwen-oauth-status.success {
|
||||
background: var(--success-bg);
|
||||
border-color: var(--success-border);
|
||||
color: var(--success-text);
|
||||
}
|
||||
|
||||
#qwen-oauth-status.error {
|
||||
background: var(--error-bg);
|
||||
border-color: var(--error-border);
|
||||
color: var(--error-text);
|
||||
}
|
||||
|
||||
#qwen-oauth-status.warning {
|
||||
background: var(--warning-bg);
|
||||
border-color: var(--warning-border);
|
||||
color: var(--warning-text);
|
||||
}
|
||||
|
||||
/* Qwen OAuth 按钮样式 */
|
||||
#qwen-open-link,
|
||||
#qwen-copy-link {
|
||||
min-width: 100px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
#qwen-open-link {
|
||||
background: var(--primary-color);
|
||||
border-color: var(--primary-color);
|
||||
}
|
||||
|
||||
#qwen-open-link:hover {
|
||||
background: var(--primary-hover);
|
||||
border-color: var(--primary-hover);
|
||||
}
|
||||
|
||||
#qwen-copy-link {
|
||||
background: var(--bg-secondary);
|
||||
border-color: var(--border-primary);
|
||||
color: var(--text-secondary);
|
||||
}
|
||||
|
||||
#qwen-copy-link:hover {
|
||||
background: var(--bg-tertiary);
|
||||
border-color: var(--border-secondary);
|
||||
color: var(--text-primary);
|
||||
}
|
||||
|
||||
/* 响应式设计 - Qwen OAuth */
|
||||
@media (max-width: 768px) {
|
||||
#qwen-oauth-content .input-group {
|
||||
flex-direction: column;
|
||||
align-items: stretch;
|
||||
}
|
||||
|
||||
#qwen-open-link,
|
||||
#qwen-copy-link {
|
||||
width: 100%;
|
||||
margin-top: 8px;
|
||||
}
|
||||
|
||||
#qwen-oauth-url {
|
||||
font-size: 12px;
|
||||
}
|
||||
}
|
||||
|
||||
/* iFlow OAuth 样式 */
|
||||
#iflow-oauth-content {
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
#iflow-oauth-url {
|
||||
font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
|
||||
font-size: 13px;
|
||||
background: var(--bg-tertiary);
|
||||
border: 1px solid var(--border-primary);
|
||||
color: var(--text-secondary);
|
||||
}
|
||||
|
||||
#iflow-oauth-url:focus {
|
||||
border-color: var(--border-focus);
|
||||
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
|
||||
}
|
||||
|
||||
#iflow-oauth-status {
|
||||
font-weight: 500;
|
||||
padding: 8px 12px;
|
||||
border-radius: 6px;
|
||||
background: var(--bg-tertiary);
|
||||
border: 1px solid var(--border-primary);
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
#iflow-oauth-status.success {
|
||||
background: var(--success-bg);
|
||||
border-color: var(--success-border);
|
||||
color: var(--success-text);
|
||||
}
|
||||
|
||||
#iflow-oauth-status.error {
|
||||
background: var(--error-bg);
|
||||
border-color: var(--error-border);
|
||||
color: var(--error-text);
|
||||
}
|
||||
|
||||
#iflow-oauth-status.warning {
|
||||
background: var(--warning-bg);
|
||||
border-color: var(--warning-border);
|
||||
color: var(--warning-text);
|
||||
}
|
||||
|
||||
/* iFlow OAuth 按钮样式 */
|
||||
#iflow-open-link,
|
||||
#iflow-copy-link {
|
||||
min-width: 100px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
#iflow-open-link {
|
||||
background: var(--primary-color);
|
||||
border-color: var(--primary-color);
|
||||
}
|
||||
|
||||
#iflow-open-link:hover {
|
||||
background: var(--primary-hover);
|
||||
border-color: var(--primary-hover);
|
||||
}
|
||||
|
||||
#iflow-copy-link {
|
||||
background: var(--bg-secondary);
|
||||
border-color: var(--border-primary);
|
||||
color: var(--text-secondary);
|
||||
}
|
||||
|
||||
#iflow-copy-link:hover {
|
||||
background: var(--bg-tertiary);
|
||||
border-color: var(--border-secondary);
|
||||
color: var(--text-primary);
|
||||
}
|
||||
|
||||
/* 响应式设计 - iFlow OAuth */
|
||||
@media (max-width: 768px) {
|
||||
#iflow-oauth-content .input-group {
|
||||
flex-direction: column;
|
||||
align-items: stretch;
|
||||
}
|
||||
|
||||
#iflow-open-link,
|
||||
#iflow-copy-link {
|
||||
width: 100%;
|
||||
margin-top: 8px;
|
||||
}
|
||||
|
||||
#iflow-oauth-url {
|
||||
font-size: 12px;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user