/* 本地知识库(Phase 3 RAG):文档列表 + 检索测试 + 带引用问答。 Warm Paper 全令牌配色,遵循 design-system.md。 */ .kb { flex: 1; min-width: 0; overflow-y: auto; padding: 36px 48px 48px; } .kb-head { display: flex; align-items: flex-end; justify-content: space-between; gap: 16px; margin-bottom: 16px; flex-wrap: wrap; } .kb-head h1 { font-size: 30px; } .kb-head-sub { margin: 6px 0 0; font-size: 13.5px; color: var(--text-secondary); } .kb-head-actions { display: flex; align-items: center; gap: 14px; } .kb-stat { font-size: 13px; color: var(--text-secondary); font-variant-numeric: tabular-nums; } .kb-backend-note { margin: 0 0 16px; padding: 8px 14px; border: 1px dashed var(--border); border-radius: var(--radius-control); background: var(--bg-sunken); font-size: 13px; color: var(--text-secondary); } .kb-notice { margin: 0 0 16px; padding: 8px 14px; border: 1px solid var(--border); border-radius: var(--radius-control); background: var(--accent-soft); font-size: 13px; color: var(--text); } .kb-error { margin: 8px 0 0; font-size: 13px; color: var(--danger); } .kb-muted { font-size: 13px; color: var(--text-secondary); } /* ── 按钮 / 输入 ────────────────────────────────────────────────── */ .kb-btn { display: inline-flex; align-items: center; gap: 6px; height: 36px; padding: 0 14px; border: 1px solid var(--border); border-radius: var(--radius-control); background: transparent; color: var(--text); font-family: inherit; font-size: 13.5px; cursor: pointer; transition: background-color var(--dur) var(--ease), border-color var(--dur) var(--ease); } .kb-btn:hover:not(:disabled) { background: var(--bg-elevated); } .kb-btn:disabled { opacity: 0.55; cursor: default; } .kb-btn-primary { border-color: transparent; background: var(--accent); color: var(--bg); } .kb-btn-primary:hover:not(:disabled) { filter: brightness(0.94); } .kb-icon-btn { display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 28px; border: none; border-radius: var(--radius-control); background: transparent; color: var(--text-secondary); cursor: pointer; transition: background-color var(--dur) var(--ease); } .kb-icon-btn:hover { background: var(--accent-soft); color: var(--text); } .kb-input { flex: 1; min-width: 0; height: 36px; padding: 0 12px; border: 1px solid transparent; border-radius: var(--radius-control); background: var(--bg-sunken); color: var(--text); font-family: inherit; font-size: 14px; } .kb-input::placeholder { color: var(--text-tertiary); } .kb-input:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent-soft) 65%, transparent); } .kb-select { height: 36px; padding: 0 8px; border: 1px solid var(--border); border-radius: var(--radius-control); background: var(--bg-elevated); color: var(--text); font-family: inherit; font-size: 13px; } .kb-input-row { display: flex; align-items: center; gap: 8px; margin-bottom: 12px; } /* ── 双栏布局 ───────────────────────────────────────────────────── */ .kb-columns { display: grid; grid-template-columns: 320px minmax(0, 1fr); gap: 20px; align-items: start; } .kb-right { display: flex; flex-direction: column; gap: 20px; min-width: 0; } .kb-panel { padding: 20px 22px; border: 1px solid var(--border); border-radius: var(--radius-card); background: var(--bg-elevated); } .kb-panel-title { margin: 0 0 14px; font-family: var(--font-serif); font-size: 17px; font-weight: 600; } /* ── 文档列表 ───────────────────────────────────────────────────── */ .kb-empty { display: flex; flex-direction: column; align-items: center; gap: 8px; padding: 28px 12px; text-align: center; color: var(--text-secondary); } .kb-empty p { margin: 0; font-family: var(--font-serif); font-size: 15px; color: var(--text); } .kb-empty .kb-muted { font-family: var(--font-sans); font-size: 13px; color: var(--text-secondary); } .kb-doc-list { list-style: none; margin: 0; padding: 0; } .kb-doc { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 10px 4px; border-bottom: 1px solid var(--border); } .kb-doc:last-child { border-bottom: none; } .kb-doc-main { display: flex; flex-direction: column; min-width: 0; } .kb-doc-name { font-size: 14px; color: var(--text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .kb-doc-meta { margin-top: 2px; font-size: 12px; color: var(--text-secondary); font-variant-numeric: tabular-nums; } /* ── 检索命中卡片 ───────────────────────────────────────────────── */ .kb-hit-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 10px; } .kb-hit { padding: 12px 14px; border: 1px solid var(--border); border-radius: var(--radius-control); background: var(--bg); transition: border-color var(--dur) var(--ease); } .kb-hit:hover { border-color: var(--accent); } .kb-hit-head { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; margin-bottom: 6px; } .kb-hit-source { font-size: 12.5px; color: var(--text-secondary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .kb-hit-score { flex-shrink: 0; font-family: var(--font-mono); font-size: 12px; color: var(--accent); font-variant-numeric: tabular-nums; } .kb-hit-excerpt { margin: 0; font-size: 13.5px; line-height: 1.6; color: var(--text); } /* ── 问答结果 ───────────────────────────────────────────────────── */ .kb-ask-result { margin-top: 4px; } .kb-question-line { margin: 10px 0 6px; font-size: 13px; color: var(--text-secondary); } .kb-answer-body { font-size: 14.5px; line-height: 1.7; } .kb-answer-body > * { margin: 0 0 10px; } .kb-cite-ref { display: inline; padding: 0 3px; margin: 0 1px; border: none; border-radius: 4px; background: var(--accent-soft); color: var(--accent); font-family: var(--font-mono); font-size: 12px; cursor: pointer; vertical-align: super; line-height: 1; transition: background-color var(--dur) var(--ease); } .kb-cite-ref:hover { background: var(--accent); color: var(--bg); } /* ── 引用条目(可折叠) ─────────────────────────────────────────── */ .kb-citations { margin: 0 0 12px; padding: 10px 14px; border: 1px solid var(--border); border-radius: var(--radius-control); background: var(--bg-sunken); } .kb-citations > summary { cursor: pointer; font-size: 13px; color: var(--text-secondary); list-style: none; } .kb-citations > summary::-webkit-details-marker { display: none; } .kb-citation-list { list-style: none; margin: 10px 0 0; padding: 0; display: flex; flex-direction: column; gap: 8px; } .kb-citation { padding-top: 8px; border-top: 1px solid var(--border); } .kb-citation:first-child { border-top: none; padding-top: 0; } .kb-citation-btn { display: flex; align-items: baseline; gap: 6px; width: 100%; padding: 0; border: none; background: transparent; text-align: left; cursor: pointer; } .kb-citation-rank { flex-shrink: 0; font-family: var(--font-mono); font-size: 12px; color: var(--accent); } .kb-citation-source { font-size: 12.5px; color: var(--text-secondary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .kb-citation-quote { margin: 4px 0 0; font-size: 13px; line-height: 1.55; color: var(--text); display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; } /* ── 引用原文抽屉 ───────────────────────────────────────────────── */ .kb-drawer-mask { position: fixed; inset: 0; display: flex; justify-content: flex-end; background: var(--scrim); z-index: 40; } .kb-drawer { display: flex; flex-direction: column; width: min(520px, 90vw); height: 100%; background: var(--bg-elevated); border-left: 1px solid var(--border); box-shadow: var(--shadow-float); animation: kb-drawer-in 180ms var(--ease); } @keyframes kb-drawer-in { from { opacity: 0; transform: translateX(12px); } to { opacity: 1; transform: translateX(0); } } .kb-drawer-head { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 18px 22px; border-bottom: 1px solid var(--border); } .kb-drawer-head > div { display: flex; align-items: baseline; gap: 8px; min-width: 0; } .kb-drawer-source { font-family: var(--font-serif); font-size: 15px; font-weight: 600; color: var(--text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .kb-drawer-body { flex: 1; overflow-y: auto; padding: 20px 22px; font-size: 14.5px; line-height: 1.7; } .kb-drawer-body .md > * { margin: 0 0 12px; } /* ── 拖放蒙层 ───────────────────────────────────────────────────── */ .kb-drag-overlay { position: fixed; inset: 0; z-index: 50; background: var(--glass); display: flex; align-items: center; justify-content: center; } .kb-drag-card { display: flex; flex-direction: column; align-items: center; gap: 10px; padding: 40px 56px; border: 1px dashed var(--accent); border-radius: var(--radius-float); color: var(--text); } .kb-drag-title { margin: 0; font-family: var(--font-serif); font-size: 24px; font-weight: 600; } .kb-drag-sub { margin: 0; font-size: 13.5px; color: var(--text-secondary); } /* 转圈(theme.css 的 reduced-motion 会全局关停动画) */ .kb-spin { animation: kb-rot 1s linear infinite; } @keyframes kb-rot { to { transform: rotate(360deg); } } /* 窄屏:双栏折叠成单栏 */ @media (max-width: 900px) { .kb-columns { grid-template-columns: minmax(0, 1fr); } } /* ── 语义检索徽章(契约 7B)────────────────────────────────────── */ .kb-backend { margin-bottom: 12px; } /* 徽章本体是个按钮:点开才看细节,默认视图只给结论 */ .kb-backend-badge { display: inline-flex; align-items: center; gap: 6px; padding: 4px 12px; border: 1px solid var(--border); border-radius: var(--radius-chip); background: var(--bg-elevated); color: var(--text-secondary); font-size: 12px; line-height: 1.6; cursor: pointer; transition: border-color var(--dur) var(--ease), color var(--dur) var(--ease); } .kb-backend-badge:hover { border-color: var(--accent); color: var(--text); } .kb-backend-badge:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; } /* 状态点:启用=success,降级=warning。不用红——降级是设计内的正常状态 */ .kb-dot { width: 7px; height: 7px; border-radius: 50%; background: var(--warning); flex: none; } .kb-backend-on .kb-dot { background: var(--success); } .kb-backend-label { font-weight: 500; } .kb-backend-on .kb-backend-label { color: var(--text); } /* 模型名片片:次要信息,弱化显示 */ .kb-backend-model { padding-left: 6px; margin-left: 2px; border-left: 1px solid var(--border); color: var(--text-tertiary); font-family: var(--font-mono); font-size: 11px; } .kb-backend-detail { margin-top: 8px; } .kb-backend-detail .kb-backend-note { margin: 0; } .kb-backend-meta { margin: 4px 0 0; color: var(--text-tertiary); font-size: 12px; } /* 导入进度:等宽数字更好读 */ .kb-import-progress { font-variant-numeric: tabular-nums; }