/* MCP 服务器 + 专家中心(Phase 5D):Warm Paper 全令牌配色。 覆盖组件:McpPanel / ExpertsCenter / ExpertPicker,以及对话头部的专家入口。 规则来自 docs/design-system.md:留白优先、衬线标题、语义色只出现在状态语境。 */ /* ---------- 通用面板骨架 ---------- */ .experts-center { flex: 1; min-width: 0; overflow-y: auto; padding: 36px 48px 48px; } .mcp-panel { min-width: 0; display: flex; flex-direction: column; gap: 20px; } .panel-head { display: flex; align-items: flex-end; justify-content: space-between; gap: 16px; flex-wrap: wrap; margin-bottom: 4px; } .panel-title { margin: 0; font-family: var(--font-serif); font-size: 30px; font-weight: 600; letter-spacing: -0.01em; color: var(--text); } .panel-desc { margin: 8px 0 0; max-width: 60ch; font-size: 13.5px; line-height: 1.7; color: var(--text-secondary); } .panel-error { margin: 0; padding: 10px 14px; border: 1px solid var(--danger); border-radius: var(--radius-control); background: var(--bg-sunken); color: var(--danger); font-size: 13px; line-height: 1.6; } .panel-empty { margin: 0; padding: 28px 0; font-size: 13.5px; line-height: 1.9; color: var(--text-tertiary); } .inline-code { padding: 1px 6px; border-radius: 6px; background: var(--bg-sunken); color: var(--text-secondary); font-family: var(--font-mono); font-size: 12.5px; } /* ---------- 按钮(补充 App.css 的 .btn-primary/.btn-secondary)---------- */ .btn-ghost { display: inline-flex; align-items: center; gap: 6px; height: 32px; padding: 0 12px; border: 1px solid transparent; border-radius: var(--radius-control); background: transparent; color: var(--text-secondary); font-family: inherit; font-size: 13px; cursor: pointer; transition: background-color var(--dur) var(--ease); } .btn-ghost:hover:not(:disabled) { background: var(--bg-elevated); color: var(--text); } .btn-ghost:disabled { opacity: 0.55; cursor: default; } .btn-danger { display: inline-flex; align-items: center; gap: 6px; height: 32px; padding: 0 12px; border: 1px solid var(--danger); border-radius: var(--radius-control); background: transparent; color: var(--danger); font-family: inherit; font-size: 13px; cursor: pointer; transition: background-color var(--dur) var(--ease); } .btn-danger:hover { background: var(--bg-elevated); } .btn-icon { display: inline-grid; place-items: center; width: 28px; height: 28px; border: 1px solid transparent; border-radius: var(--radius-control); background: transparent; color: var(--text-secondary); cursor: pointer; transition: background-color var(--dur) var(--ease); } .btn-icon:hover { background: var(--bg-elevated); color: var(--text); } .mcp-panel .btn-primary, .experts-center .btn-primary { display: inline-flex; align-items: center; gap: 6px; height: 36px; padding: 0 18px; } /* ---------- 表单 ---------- */ .mcp-form, .expert-form { display: flex; flex-direction: column; gap: 16px; padding: 20px 22px; border: 1px solid var(--border); border-radius: var(--radius-card); background: var(--bg-elevated); } .mcp-form-title { margin: 0; font-family: var(--font-serif); font-size: 19px; font-weight: 600; color: var(--text); } .field { display: flex; flex-direction: column; gap: 6px; } .field-label { font-size: 13px; font-weight: 500; color: var(--text-secondary); } .field-note { margin: 0; font-size: 12.5px; line-height: 1.7; color: var(--text-tertiary); } .field-input { width: 100%; padding: 9px 12px; border: 1px solid transparent; border-radius: var(--radius-control); background: var(--bg-sunken); color: var(--text); font-family: inherit; font-size: 13.5px; line-height: 1.6; resize: vertical; transition: border-color var(--dur) var(--ease); } .field-input:focus { outline: none; border-color: var(--accent); } .field-mono { font-family: var(--font-mono); font-size: 12.5px; } .mcp-env-row { display: grid; grid-template-columns: 1fr 1fr auto; gap: 8px; align-items: center; } .mcp-form-actions { display: flex; align-items: center; gap: 10px; } .expert-form-row { display: grid; grid-template-columns: 1fr 1.2fr; gap: 16px; align-items: start; } .expert-emoji-grid { display: flex; flex-wrap: wrap; gap: 6px; } .expert-emoji { display: inline-grid; place-items: center; width: 34px; height: 34px; border: 1px solid var(--border); border-radius: var(--radius-control); background: var(--bg-sunken); font-size: 17px; cursor: pointer; transition: border-color var(--dur) var(--ease), background-color var(--dur) var(--ease); } .expert-emoji:hover { background: var(--bg-elevated); } .expert-emoji.is-active { border-color: var(--accent); background: var(--accent-soft); } .expert-prompt { font-family: var(--font-sans); line-height: 1.75; } /* ---------- MCP 服务器卡片 ---------- */ .mcp-list { display: flex; flex-direction: column; gap: 14px; margin: 0; padding: 0; list-style: none; } .mcp-card { display: flex; flex-direction: column; gap: 10px; padding: 18px 20px; border: 1px solid var(--border); border-radius: var(--radius-card); background: var(--bg-elevated); } .mcp-card-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; } .mcp-card-title { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; } .mcp-name { font-family: var(--font-serif); font-size: 18px; font-weight: 600; color: var(--text); } .mcp-status { display: inline-flex; align-items: center; gap: 6px; font-size: 12.5px; color: var(--text-secondary); } .mcp-status-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--text-tertiary); } .mcp-status.is-connected .mcp-status-dot { background: var(--success); } .mcp-status.is-connecting .mcp-status-dot { background: var(--warning); } .mcp-status.is-error .mcp-status-dot { background: var(--danger); } .mcp-tools-count { font-size: 12.5px; color: var(--text-tertiary); font-variant-numeric: tabular-nums; } .mcp-card-actions { display: flex; align-items: center; gap: 4px; flex-wrap: wrap; } .mcp-command { margin: 0; overflow-wrap: anywhere; } .mcp-enabled { display: inline-flex; align-items: center; gap: 8px; font-size: 13px; color: var(--text-secondary); cursor: pointer; } .mcp-error { margin: 0; font-size: 12.5px; line-height: 1.7; color: var(--danger); } .mcp-confirm { display: inline-flex; align-items: center; gap: 6px; font-size: 12.5px; color: var(--text-secondary); } /* ---------- MCP 工具清单 ---------- */ .mcp-tools { border-top: 1px solid var(--border); padding-top: 10px; } .mcp-tools-toggle { display: inline-flex; align-items: center; gap: 4px; padding: 4px 6px 4px 0; border: none; background: transparent; color: var(--text-secondary); font-family: inherit; font-size: 13px; cursor: pointer; } .mcp-tools-toggle:hover { color: var(--text); } .mcp-tool-list { display: flex; flex-direction: column; margin: 8px 0 0; padding: 0; list-style: none; } .mcp-tool { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 9px 0; border-bottom: 1px solid var(--border); } .mcp-tool:last-child { border-bottom: none; } .mcp-tool-info { display: flex; flex-direction: column; gap: 2px; min-width: 0; } .mcp-tool-name { font-family: var(--font-mono); font-size: 12.5px; color: var(--text); overflow-wrap: anywhere; } .mcp-tool-desc { font-size: 12.5px; line-height: 1.6; color: var(--text-secondary); overflow-wrap: anywhere; } .mcp-tool-toggle { display: inline-flex; align-items: center; gap: 6px; flex-shrink: 0; padding: 5px 10px; border: 1px solid var(--border); border-radius: var(--radius-control); background: var(--bg-sunken); color: var(--text-secondary); font-size: 12.5px; cursor: pointer; transition: border-color var(--dur) var(--ease), background-color var(--dur) var(--ease); } .mcp-tool-toggle input { accent-color: var(--accent); } .mcp-tool-toggle.is-on { border-color: var(--success); background: var(--bg-elevated); color: var(--text); } /* ---------- 专家中心 ---------- */ .experts-tabs { display: inline-flex; gap: 4px; padding: 3px; border: 1px solid var(--border); border-radius: var(--radius-control); background: var(--bg-sunken); } .experts-tab { height: 30px; padding: 0 14px; border: none; border-radius: calc(var(--radius-control) - 2px); background: transparent; color: var(--text-secondary); font-family: inherit; font-size: 13px; cursor: pointer; transition: background-color var(--dur) var(--ease); } .experts-tab.is-active { background: var(--bg-elevated); color: var(--text); } .experts-actions { margin-bottom: 16px; } .expert-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); gap: 16px; margin: 0; padding: 0; list-style: none; } /* hover 统一(描边加深 + 轻上浮)在 App.css;transition 也集中在那里定义 */ .expert-card { display: flex; gap: 14px; padding: 18px 20px; border: 1px solid var(--border); border-radius: var(--radius-card); background: var(--bg-elevated); } .expert-card.is-active { border-color: var(--accent); } .expert-card-emoji { font-size: 30px; line-height: 1.2; } .expert-card-body { display: flex; flex-direction: column; gap: 6px; min-width: 0; } .expert-card-name { display: flex; align-items: center; gap: 8px; margin: 0; font-family: var(--font-serif); font-size: 18px; font-weight: 600; color: var(--text); } .expert-card-desc { margin: 0; font-size: 13px; line-height: 1.7; color: var(--text-secondary); } .expert-card-model { margin: 0; font-size: 12.5px; color: var(--text-tertiary); } .expert-card-actions { display: flex; align-items: center; gap: 4px; flex-wrap: wrap; margin-top: 4px; } /* 状态徽章:与全站徽章同尺寸同字重 */ .expert-badge { padding: 2px 8px; border-radius: 999px; background: var(--bg-sunken); color: var(--text-tertiary); font-family: var(--font-sans); font-size: 12px; font-weight: 500; } .expert-badge.is-custom { color: var(--text-secondary); } .experts-foot { margin: 18px 0 0; font-size: 12.5px; line-height: 1.7; color: var(--text-tertiary); } /* ---------- 对话头部的专家选择器 ---------- */ .chat-header { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 10px 24px; border-bottom: 1px solid var(--border); } .chat-header-title { margin: 0; font-family: var(--font-serif); font-size: 15px; font-weight: 600; color: var(--text-secondary); } .expert-picker { position: relative; } .expert-picker-trigger { display: inline-flex; align-items: center; gap: 7px; height: 32px; padding: 0 12px; border: 1px solid var(--border); border-radius: var(--radius-control); background: transparent; color: var(--text); font-family: inherit; font-size: 13px; cursor: pointer; transition: background-color var(--dur) var(--ease); } .expert-picker-trigger:hover { background: var(--bg-elevated); } .expert-picker-emoji { font-size: 15px; } .expert-menu { position: absolute; top: calc(100% + 6px); right: 0; z-index: 20; width: 300px; max-height: 360px; overflow-y: auto; padding: 10px; border: 1px solid var(--border); border-radius: var(--radius-float); background: var(--bg-elevated); box-shadow: var(--shadow-float); } .expert-menu-title { margin: 2px 6px 8px; font-size: 12px; color: var(--text-tertiary); } .expert-option { display: flex; align-items: flex-start; gap: 10px; width: 100%; padding: 8px 10px; border: none; border-radius: var(--radius-control); background: transparent; color: var(--text); font-family: inherit; text-align: left; cursor: pointer; transition: background-color var(--dur) var(--ease); } .expert-option:hover { background: var(--accent-soft); } .expert-option.is-active { background: var(--accent-soft); } .expert-option-emoji { font-size: 18px; line-height: 1.3; } .expert-option-body { display: flex; flex-direction: column; gap: 2px; min-width: 0; } .expert-option-name { display: flex; align-items: center; gap: 6px; font-size: 13.5px; font-weight: 500; } .expert-option-desc { font-size: 12px; line-height: 1.6; color: var(--text-secondary); } .expert-menu-foot { display: flex; align-items: center; gap: 6px; margin: 8px 6px 2px; font-size: 12px; color: var(--text-tertiary); } @media (prefers-reduced-motion: reduce) { .mcp-card, .expert-card, .expert-menu, .expert-option, .btn-ghost, .mcp-tool-toggle { transition: none; } }