feat(v3): 配色体系对齐 deepseek-harness Web(D7 视觉)

- 提取 dsh design-platform 官方色板为设计令牌:品牌蓝 #4176e6、bluish 灰阶、
  语义状态色、透明描边(rgba 0.04-0.1)
- 侧栏改近白(sidebar-fill),扁平化阴影,悬停/滚动条/缓动全部对齐 dsh
- 六视图旧硬编码蓝批量令牌化,视觉单一来源
This commit is contained in:
tzt
2026-09-01 21:48:05 +08:00
parent 1ae9ffb159
commit 943eecc5ef
26 changed files with 164 additions and 128 deletions
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
.metrics-view[data-v-079e4daf]{height:100%;padding:20px 24px;overflow-y:auto}.by-model[data-v-079e4daf]{border-collapse:collapse;width:100%;font-size:12px}.by-model th[data-v-079e4daf],.by-model td[data-v-079e4daf]{text-align:left;border-bottom:1px solid #f3f4f6;padding:4px 8px}.by-model th[data-v-079e4daf]{color:#6b7280;font-weight:600}.by-model td.mono[data-v-079e4daf]{font-family:ui-monospace,Consolas,monospace}.hint[data-v-079e4daf]{color:#9ca3af;margin-top:8px;font-size:11px}.metrics-header[data-v-079e4daf]{justify-content:space-between;align-items:center;margin-bottom:20px;display:flex}.metrics-header h2[data-v-079e4daf]{margin:0;font-size:20px}.refresh[data-v-079e4daf]{cursor:pointer;background:#fff;border:1px solid #d1d5db;border-radius:6px;padding:6px 14px}.loading[data-v-079e4daf],.error[data-v-079e4daf]{text-align:center;color:#9ca3af;padding:40px}.error[data-v-079e4daf]{color:#dc2626}.card-grid[data-v-079e4daf]{grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:16px;margin-bottom:24px;display:grid}.metric-card[data-v-079e4daf]{background:#fff;border:1px solid #e5e7eb;border-radius:10px;padding:16px}.metric-card.highlight[data-v-079e4daf]{background:#eff6ff;border-color:#2563eb}.metric-card h3[data-v-079e4daf]{color:#374151;margin:0 0 12px;font-size:14px}.kv-list[data-v-079e4daf]{grid-template-columns:1fr 1fr;gap:6px 12px;font-size:13px;display:grid}.kv-list span[data-v-079e4daf]{color:#6b7280}.kv-list b[data-v-079e4daf]{color:#111;text-align:right}.review-card[data-v-079e4daf]{grid-column:span 2}.review-stats[data-v-079e4daf]{gap:24px;margin-bottom:12px;display:flex}.stat-item[data-v-079e4daf]{flex-direction:column;align-items:center;display:flex}.stat-num[data-v-079e4daf]{color:#2563eb;font-size:28px;font-weight:700}.stat-label[data-v-079e4daf]{color:#6b7280;font-size:12px}.progress-wrap[data-v-079e4daf]{background:#e5e7eb;border-radius:99px;height:8px;margin-bottom:6px;overflow:hidden}.reviewed-bar[data-v-079e4daf]{background:#16a34a;height:100%;transition:width .5s}.review-rate[data-v-079e4daf]{color:#6b7280;margin:0;font-size:13px}.raw-json[data-v-079e4daf]{background:var(--c-bg);border:1px solid #e5e7eb;border-radius:8px}.raw-json summary[data-v-079e4daf]{cursor:pointer;color:#6b7280;padding:10px 14px;font-size:13px}.raw-json pre[data-v-079e4daf]{white-space:pre-wrap;border-top:1px solid #e5e7eb;margin:0;padding:10px 14px;font-size:12px}
@@ -0,0 +1 @@
.metrics-view[data-v-8b237097]{height:100%;padding:20px 24px;overflow-y:auto}.by-model[data-v-8b237097]{border-collapse:collapse;width:100%;font-size:12px}.by-model th[data-v-8b237097],.by-model td[data-v-8b237097]{text-align:left;border-bottom:1px solid #f3f4f6;padding:4px 8px}.by-model th[data-v-8b237097]{color:#6b7280;font-weight:600}.by-model td.mono[data-v-8b237097]{font-family:ui-monospace,Consolas,monospace}.hint[data-v-8b237097]{color:#9ca3af;margin-top:8px;font-size:11px}.metrics-header[data-v-8b237097]{justify-content:space-between;align-items:center;margin-bottom:20px;display:flex}.metrics-header h2[data-v-8b237097]{margin:0;font-size:20px}.refresh[data-v-8b237097]{cursor:pointer;background:#fff;border:1px solid #d1d5db;border-radius:6px;padding:6px 14px}.loading[data-v-8b237097],.error[data-v-8b237097]{text-align:center;color:#9ca3af;padding:40px}.error[data-v-8b237097]{color:#dc2626}.card-grid[data-v-8b237097]{grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:16px;margin-bottom:24px;display:grid}.metric-card[data-v-8b237097]{background:#fff;border:1px solid #e5e7eb;border-radius:10px;padding:16px}.metric-card.highlight[data-v-8b237097]{border-color:var(--c-primary);background:var(--c-primary-soft)}.metric-card h3[data-v-8b237097]{color:#374151;margin:0 0 12px;font-size:14px}.kv-list[data-v-8b237097]{grid-template-columns:1fr 1fr;gap:6px 12px;font-size:13px;display:grid}.kv-list span[data-v-8b237097]{color:#6b7280}.kv-list b[data-v-8b237097]{color:#111;text-align:right}.review-card[data-v-8b237097]{grid-column:span 2}.review-stats[data-v-8b237097]{gap:24px;margin-bottom:12px;display:flex}.stat-item[data-v-8b237097]{flex-direction:column;align-items:center;display:flex}.stat-num[data-v-8b237097]{color:var(--c-primary);font-size:28px;font-weight:700}.stat-label[data-v-8b237097]{color:#6b7280;font-size:12px}.progress-wrap[data-v-8b237097]{background:#e5e7eb;border-radius:99px;height:8px;margin-bottom:6px;overflow:hidden}.reviewed-bar[data-v-8b237097]{background:#16a34a;height:100%;transition:width .5s}.review-rate[data-v-8b237097]{color:#6b7280;margin:0;font-size:13px}.raw-json[data-v-8b237097]{background:var(--c-bg);border:1px solid #e5e7eb;border-radius:8px}.raw-json summary[data-v-8b237097]{cursor:pointer;color:#6b7280;padding:10px 14px;font-size:13px}.raw-json pre[data-v-8b237097]{white-space:pre-wrap;border-top:1px solid #e5e7eb;margin:0;padding:10px 14px;font-size:12px}
@@ -1 +1 @@
import{A as e,D as t,G as n,I as r,L as i,N as a,O as o,P as s,V as c,W as l,j as u,k as d,s as f,t as p}from"./index-D70fN-oL.js";var m={class:`metrics-view`},h={key:0,class:`loading`},g={key:1,class:`error`},_={class:`card-grid`},v={class:`metric-card`},y={class:`kv-list`},b={class:`metric-card`},x={class:`kv-list`},S={key:0,class:`metric-card highlight`},C={class:`kv-list`},w={key:0},T={key:1},E={key:1,class:`metric-card`},D={class:`by-model`},O={class:`mono`},k={key:2,class:`metric-card review-card`},A={class:`review-stats`},j={class:`stat-item`},M={class:`stat-num`},N={class:`stat-item`},P={class:`stat-num`},F={key:0,class:`progress-wrap`},I={class:`review-rate`},L={class:`raw-json`},R=p(a({__name:`MetricsView`,setup(a){let p=c(null),R=c(!1),z=c(``),B=o(()=>p.value?.v2?.by_model||null);async function V(){R.value=!0,z.value=``;try{p.value=await f()}catch(e){z.value=e instanceof Error?e.message:`指标加载失败,请检查后端服务`}finally{R.value=!1}}return s(V),(a,o)=>(r(),u(`div`,m,[d(`header`,{class:`metrics-header`},[o[0]||=d(`h2`,null,`系统指标`,-1),d(`button`,{class:`refresh`,onClick:V},`🔄 刷新`)]),R.value?(r(),u(`div`,h,`加载中…`)):z.value?(r(),u(`div`,g,n(z.value),1)):p.value?(r(),u(t,{key:2},[d(`div`,_,[d(`div`,v,[o[1]||=d(`h3`,null,`路由器(v1`,-1),d(`div`,y,[(r(!0),u(t,null,i(p.value.router,(e,i)=>(r(),u(t,{key:i},[d(`span`,null,n(i),1),d(`b`,null,n(e),1)],64))),128))])]),d(`div`,b,[o[2]||=d(`h3`,null,`缓存`,-1),d(`div`,x,[(r(!0),u(t,null,i(p.value.cache,(e,i)=>(r(),u(t,{key:i},[d(`span`,null,n(i),1),d(`b`,null,n(e),1)],64))),128))])]),p.value.v2?(r(),u(`div`,S,[o[3]||=d(`h3`,null,`协作管线(v2`,-1),d(`div`,C,[(r(!0),u(t,null,i(p.value.v2,(i,a)=>(r(),u(t,{key:a},[a===`by_model`?e(``,!0):(r(),u(`span`,w,n(a),1)),a===`by_model`?e(``,!0):(r(),u(`b`,T,n(i),1))],64))),128))])])):e(``,!0),B.value&&Object.keys(B.value).length?(r(),u(`div`,E,[o[5]||=d(`h3`,null,`按模型分账(token / 成本)`,-1),d(`table`,D,[o[4]||=d(`thead`,null,[d(`tr`,null,[d(`th`,null,`模型`),d(`th`,null,`次数`),d(`th`,null,``),d(`th`,null,``),d(`th`,null,`成本 $`)])],-1),d(`tbody`,null,[(r(!0),u(t,null,i(B.value,(e,t)=>(r(),u(`tr`,{key:t},[d(`td`,O,n(t),1),d(`td`,null,n(e.requests),1),d(`td`,null,n(e.input_tokens),1),d(`td`,null,n(e.output_tokens),1),d(`td`,null,n(e.cost_est_usd),1)]))),128))])]),o[6]||=d(`p`,{class:`hint`},`单价来自模型池条目($/1M tokens);经典设置下的模型成本不计入。`,-1)])):e(``,!0),p.value.review?(r(),u(`div`,k,[o[9]||=d(`h3`,null,`人工检验`,-1),d(`div`,A,[d(`div`,j,[d(`span`,M,n(p.value.review.pending),1),o[7]||=d(`span`,{class:`stat-label`},`待审核`,-1)]),d(`div`,N,[d(`span`,P,n(p.value.review.total),1),o[8]||=d(`span`,{class:`stat-label`},`总提交`,-1)])]),p.value.review.total>0?(r(),u(`div`,F,[d(`div`,{class:`reviewed-bar`,style:l({width:`${(p.value.review.total-p.value.review.pending)/p.value.review.total*100}%`})},null,4)])):e(``,!0),d(`p`,I,` 通过率: `+n(((p.value.review.total-p.value.review.pending)/p.value.review.total*100).toFixed(1))+`% `,1)])):e(``,!0)]),d(`details`,L,[o[10]||=d(`summary`,null,`原始 JSON`,-1),d(`pre`,null,n(JSON.stringify(p.value,null,2)),1)])],64)):e(``,!0)]))}}),[[`__scopeId`,`data-v-079e4daf`]]);export{R as default};
import{A as e,D as t,G as n,I as r,L as i,N as a,O as o,P as s,V as c,W as l,j as u,k as d,s as f,t as p}from"./index-8a-EFu_T.js";var m={class:`metrics-view`},h={key:0,class:`loading`},g={key:1,class:`error`},_={class:`card-grid`},v={class:`metric-card`},y={class:`kv-list`},b={class:`metric-card`},x={class:`kv-list`},S={key:0,class:`metric-card highlight`},C={class:`kv-list`},w={key:0},T={key:1},E={key:1,class:`metric-card`},D={class:`by-model`},O={class:`mono`},k={key:2,class:`metric-card review-card`},A={class:`review-stats`},j={class:`stat-item`},M={class:`stat-num`},N={class:`stat-item`},P={class:`stat-num`},F={key:0,class:`progress-wrap`},I={class:`review-rate`},L={class:`raw-json`},R=p(a({__name:`MetricsView`,setup(a){let p=c(null),R=c(!1),z=c(``),B=o(()=>p.value?.v2?.by_model||null);async function V(){R.value=!0,z.value=``;try{p.value=await f()}catch(e){z.value=e instanceof Error?e.message:`指标加载失败,请检查后端服务`}finally{R.value=!1}}return s(V),(a,o)=>(r(),u(`div`,m,[d(`header`,{class:`metrics-header`},[o[0]||=d(`h2`,null,`系统指标`,-1),d(`button`,{class:`refresh`,onClick:V},`🔄 刷新`)]),R.value?(r(),u(`div`,h,`加载中…`)):z.value?(r(),u(`div`,g,n(z.value),1)):p.value?(r(),u(t,{key:2},[d(`div`,_,[d(`div`,v,[o[1]||=d(`h3`,null,`路由器(v1`,-1),d(`div`,y,[(r(!0),u(t,null,i(p.value.router,(e,i)=>(r(),u(t,{key:i},[d(`span`,null,n(i),1),d(`b`,null,n(e),1)],64))),128))])]),d(`div`,b,[o[2]||=d(`h3`,null,`缓存`,-1),d(`div`,x,[(r(!0),u(t,null,i(p.value.cache,(e,i)=>(r(),u(t,{key:i},[d(`span`,null,n(i),1),d(`b`,null,n(e),1)],64))),128))])]),p.value.v2?(r(),u(`div`,S,[o[3]||=d(`h3`,null,`协作管线(v2`,-1),d(`div`,C,[(r(!0),u(t,null,i(p.value.v2,(i,a)=>(r(),u(t,{key:a},[a===`by_model`?e(``,!0):(r(),u(`span`,w,n(a),1)),a===`by_model`?e(``,!0):(r(),u(`b`,T,n(i),1))],64))),128))])])):e(``,!0),B.value&&Object.keys(B.value).length?(r(),u(`div`,E,[o[5]||=d(`h3`,null,`按模型分账(token / 成本)`,-1),d(`table`,D,[o[4]||=d(`thead`,null,[d(`tr`,null,[d(`th`,null,`模型`),d(`th`,null,`次数`),d(`th`,null,``),d(`th`,null,``),d(`th`,null,`成本 $`)])],-1),d(`tbody`,null,[(r(!0),u(t,null,i(B.value,(e,t)=>(r(),u(`tr`,{key:t},[d(`td`,O,n(t),1),d(`td`,null,n(e.requests),1),d(`td`,null,n(e.input_tokens),1),d(`td`,null,n(e.output_tokens),1),d(`td`,null,n(e.cost_est_usd),1)]))),128))])]),o[6]||=d(`p`,{class:`hint`},`单价来自模型池条目($/1M tokens);经典设置下的模型成本不计入。`,-1)])):e(``,!0),p.value.review?(r(),u(`div`,k,[o[9]||=d(`h3`,null,`人工检验`,-1),d(`div`,A,[d(`div`,j,[d(`span`,M,n(p.value.review.pending),1),o[7]||=d(`span`,{class:`stat-label`},`待审核`,-1)]),d(`div`,N,[d(`span`,P,n(p.value.review.total),1),o[8]||=d(`span`,{class:`stat-label`},`总提交`,-1)])]),p.value.review.total>0?(r(),u(`div`,F,[d(`div`,{class:`reviewed-bar`,style:l({width:`${(p.value.review.total-p.value.review.pending)/p.value.review.total*100}%`})},null,4)])):e(``,!0),d(`p`,I,` 通过率: `+n(((p.value.review.total-p.value.review.pending)/p.value.review.total*100).toFixed(1))+`% `,1)])):e(``,!0)]),d(`details`,L,[o[10]||=d(`summary`,null,`原始 JSON`,-1),d(`pre`,null,n(JSON.stringify(p.value,null,2)),1)])],64)):e(``,!0)]))}}),[[`__scopeId`,`data-v-8b237097`]]);export{R as default};
@@ -0,0 +1 @@
.review-view[data-v-d5b38f1c]{height:100%;padding:20px 24px;overflow-y:auto}.review-header[data-v-d5b38f1c]{justify-content:space-between;align-items:center;margin-bottom:20px;display:flex}.review-header h2[data-v-d5b38f1c]{margin:0;font-size:20px}.controls[data-v-d5b38f1c]{gap:8px;display:flex}button[data-v-d5b38f1c]{cursor:pointer;background:#fff;border:1px solid #d1d5db;border-radius:6px;padding:6px 14px;font-size:13px}button.active[data-v-d5b38f1c]{background:var(--c-primary);color:#fff;border-color:var(--c-primary)}.refresh-btn[data-v-d5b38f1c]{margin-left:auto}.loading[data-v-d5b38f1c],.error[data-v-d5b38f1c],.empty[data-v-d5b38f1c]{text-align:center;color:#9ca3af;padding:40px}.error[data-v-d5b38f1c]{color:#dc2626}.queue-list[data-v-d5b38f1c]{flex-direction:column;gap:16px;display:flex}.review-card[data-v-d5b38f1c]{background:#fff;border:1px solid #e5e7eb;border-radius:10px;padding:16px}.card-header[data-v-d5b38f1c]{flex-wrap:wrap;align-items:center;gap:10px;margin-bottom:10px;display:flex}.card-id[data-v-d5b38f1c]{color:#6b7280;font-family:monospace;font-size:12px}.verdict-badge[data-v-d5b38f1c]{border-radius:99px;padding:2px 8px;font-size:12px;font-weight:600}.verdict-badge.pending[data-v-d5b38f1c]{color:#92400e;background:#fef3c7}.verdict-badge.approved[data-v-d5b38f1c]{color:#16a34a;background:#dcfce7}.verdict-badge.rejected[data-v-d5b38f1c]{color:#dc2626;background:#fee2e2}.tags[data-v-d5b38f1c]{gap:4px;display:flex}.tag[data-v-d5b38f1c]{color:#3730a3;background:#e0e7ff;border-radius:4px;padding:1px 6px;font-size:11px}.date[data-v-d5b38f1c]{color:#9ca3af;margin-left:auto;font-size:11px}.query-block[data-v-d5b38f1c],.response-block[data-v-d5b38f1c]{margin-bottom:8px;font-size:13px;line-height:1.6}.query-block pre[data-v-d5b38f1c],.response-block pre[data-v-d5b38f1c]{background:var(--c-bg);white-space:pre-wrap;border:1px solid #e5e7eb;border-radius:4px;margin:4px 0 0;padding:6px 10px;font-size:13px}.actions[data-v-d5b38f1c]{flex-direction:column;gap:8px;margin-top:10px;display:flex}textarea[data-v-d5b38f1c]{resize:vertical;box-sizing:border-box;border:1px solid #d1d5db;border-radius:6px;width:100%;padding:8px 10px;font-family:inherit;font-size:13px}.btn-row[data-v-d5b38f1c]{gap:8px;display:flex}.approve[data-v-d5b38f1c]{color:#16a34a;background:#dcfce7;border-color:#86efac}.reject[data-v-d5b38f1c]{color:#dc2626;background:#fee2e2;border-color:#fca5a5}.correction[data-v-d5b38f1c]{background:#fffbeb;border:1px solid #fcd34d;border-radius:4px;margin-top:8px;padding:6px 10px;font-size:13px}
@@ -1 +1 @@
import{A as e,D as t,E as n,G as r,I as i,L as a,M as o,N as s,O as c,P as l,U as u,V as d,f,j as p,k as m,t as h,v as g,z as _}from"./index-D70fN-oL.js";var v={class:`review-view`},y={class:`review-header`},b={class:`controls`},x={key:0,class:`loading`},S={key:1,class:`error`},C={key:2,class:`queue-list`},w={key:0,class:`empty`},T={class:`card-header`},E={class:`card-id`},D={class:`tags`},O={class:`date`},k={class:`query-block`},A={class:`response-block`},j={key:0,class:`actions`},M=[`onUpdate:modelValue`],N={class:`btn-row`},P=[`onClick`],F=[`onClick`],I={key:1,class:`correction`},L=h(s({__name:`ReviewView`,setup(s){let h=d([]),L=d(!1),R=d(``),z=d(`pending`),B=d({}),V=c(()=>z.value===`all`?h.value:h.value.filter(e=>e.verdict===z.value));async function H(){L.value=!0,R.value=``;try{h.value=await f()}catch(e){R.value=e instanceof Error?e.message:String(e)}finally{L.value=!1}}async function U(e,t){try{await g(e,t,B.value[e]||void 0),await H()}catch(e){R.value=e instanceof Error?e.message:String(e)}}return l(H),(s,c)=>(i(),p(`div`,v,[m(`header`,y,[c[4]||=m(`h2`,null,`人工检验队列`,-1),m(`div`,b,[m(`button`,{class:u({active:z.value===`all`}),onClick:c[0]||=e=>z.value=`all`},`全部`,2),m(`button`,{class:u({active:z.value===`pending`}),onClick:c[1]||=e=>z.value=`pending`},`待审核`,2),m(`button`,{class:u({active:z.value===`approved`}),onClick:c[2]||=e=>z.value=`approved`},`已通过`,2),m(`button`,{class:u({active:z.value===`rejected`}),onClick:c[3]||=e=>z.value=`rejected`},`已拒绝`,2),m(`button`,{class:`refresh-btn`,onClick:H},`🔄 刷新`)])]),L.value?(i(),p(`div`,x,`加载中…`)):R.value?(i(),p(`div`,S,r(R.value),1)):(i(),p(`div`,C,[V.value.length?e(``,!0):(i(),p(`div`,w,`队列为空。`)),(i(!0),p(t,null,a(V.value,s=>(i(),p(`div`,{key:s.id,class:`review-card`},[m(`div`,T,[m(`span`,E,`#`+r(s.id),1),m(`span`,{class:u([`verdict-badge`,s.verdict])},r(s.verdict),3),m(`span`,D,[(i(!0),p(t,null,a(s.tags,e=>(i(),p(`span`,{key:e,class:`tag`},r(e),1))),128))]),m(`span`,O,r(s.created_at),1)]),m(`div`,k,[c[5]||=m(`strong`,null,`Query`,-1),o(r(s.query),1)]),m(`div`,A,[c[6]||=m(`strong`,null,`Response`,-1),m(`pre`,null,r(s.response),1)]),s.verdict===`pending`?(i(),p(`div`,j,[_(m(`textarea`,{"onUpdate:modelValue":e=>B.value[s.id]=e,placeholder:`修正意见(可选)`,rows:`2`},null,8,M),[[n,B.value[s.id]]]),m(`div`,N,[m(`button`,{class:`approve`,onClick:e=>U(s.id,`approved`)},`✅ 通过`,8,P),m(`button`,{class:`reject`,onClick:e=>U(s.id,`rejected`)},`❌ 拒绝`,8,F)])])):s.correction?(i(),p(`div`,I,[c[7]||=m(`strong`,null,`修正:`,-1),o(r(s.correction),1)])):e(``,!0)]))),128))]))]))}}),[[`__scopeId`,`data-v-c4b0ce4d`]]);export{L as default};
import{A as e,D as t,E as n,G as r,I as i,L as a,M as o,N as s,O as c,P as l,U as u,V as d,f,j as p,k as m,t as h,v as g,z as _}from"./index-8a-EFu_T.js";var v={class:`review-view`},y={class:`review-header`},b={class:`controls`},x={key:0,class:`loading`},S={key:1,class:`error`},C={key:2,class:`queue-list`},w={key:0,class:`empty`},T={class:`card-header`},E={class:`card-id`},D={class:`tags`},O={class:`date`},k={class:`query-block`},A={class:`response-block`},j={key:0,class:`actions`},M=[`onUpdate:modelValue`],N={class:`btn-row`},P=[`onClick`],F=[`onClick`],I={key:1,class:`correction`},L=h(s({__name:`ReviewView`,setup(s){let h=d([]),L=d(!1),R=d(``),z=d(`pending`),B=d({}),V=c(()=>z.value===`all`?h.value:h.value.filter(e=>e.verdict===z.value));async function H(){L.value=!0,R.value=``;try{h.value=await f()}catch(e){R.value=e instanceof Error?e.message:String(e)}finally{L.value=!1}}async function U(e,t){try{await g(e,t,B.value[e]||void 0),await H()}catch(e){R.value=e instanceof Error?e.message:String(e)}}return l(H),(s,c)=>(i(),p(`div`,v,[m(`header`,y,[c[4]||=m(`h2`,null,`人工检验队列`,-1),m(`div`,b,[m(`button`,{class:u({active:z.value===`all`}),onClick:c[0]||=e=>z.value=`all`},`全部`,2),m(`button`,{class:u({active:z.value===`pending`}),onClick:c[1]||=e=>z.value=`pending`},`待审核`,2),m(`button`,{class:u({active:z.value===`approved`}),onClick:c[2]||=e=>z.value=`approved`},`已通过`,2),m(`button`,{class:u({active:z.value===`rejected`}),onClick:c[3]||=e=>z.value=`rejected`},`已拒绝`,2),m(`button`,{class:`refresh-btn`,onClick:H},`🔄 刷新`)])]),L.value?(i(),p(`div`,x,`加载中…`)):R.value?(i(),p(`div`,S,r(R.value),1)):(i(),p(`div`,C,[V.value.length?e(``,!0):(i(),p(`div`,w,`队列为空。`)),(i(!0),p(t,null,a(V.value,s=>(i(),p(`div`,{key:s.id,class:`review-card`},[m(`div`,T,[m(`span`,E,`#`+r(s.id),1),m(`span`,{class:u([`verdict-badge`,s.verdict])},r(s.verdict),3),m(`span`,D,[(i(!0),p(t,null,a(s.tags,e=>(i(),p(`span`,{key:e,class:`tag`},r(e),1))),128))]),m(`span`,O,r(s.created_at),1)]),m(`div`,k,[c[5]||=m(`strong`,null,`Query`,-1),o(r(s.query),1)]),m(`div`,A,[c[6]||=m(`strong`,null,`Response`,-1),m(`pre`,null,r(s.response),1)]),s.verdict===`pending`?(i(),p(`div`,j,[_(m(`textarea`,{"onUpdate:modelValue":e=>B.value[s.id]=e,placeholder:`修正意见(可选)`,rows:`2`},null,8,M),[[n,B.value[s.id]]]),m(`div`,N,[m(`button`,{class:`approve`,onClick:e=>U(s.id,`approved`)},`✅ 通过`,8,P),m(`button`,{class:`reject`,onClick:e=>U(s.id,`rejected`)},`❌ 拒绝`,8,F)])])):s.correction?(i(),p(`div`,I,[c[7]||=m(`strong`,null,`修正:`,-1),o(r(s.correction),1)])):e(``,!0)]))),128))]))]))}}),[[`__scopeId`,`data-v-d5b38f1c`]]);export{L as default};
@@ -1 +0,0 @@
.review-view[data-v-c4b0ce4d]{height:100%;padding:20px 24px;overflow-y:auto}.review-header[data-v-c4b0ce4d]{justify-content:space-between;align-items:center;margin-bottom:20px;display:flex}.review-header h2[data-v-c4b0ce4d]{margin:0;font-size:20px}.controls[data-v-c4b0ce4d]{gap:8px;display:flex}button[data-v-c4b0ce4d]{cursor:pointer;background:#fff;border:1px solid #d1d5db;border-radius:6px;padding:6px 14px;font-size:13px}button.active[data-v-c4b0ce4d]{color:#fff;background:#2563eb;border-color:#2563eb}.refresh-btn[data-v-c4b0ce4d]{margin-left:auto}.loading[data-v-c4b0ce4d],.error[data-v-c4b0ce4d],.empty[data-v-c4b0ce4d]{text-align:center;color:#9ca3af;padding:40px}.error[data-v-c4b0ce4d]{color:#dc2626}.queue-list[data-v-c4b0ce4d]{flex-direction:column;gap:16px;display:flex}.review-card[data-v-c4b0ce4d]{background:#fff;border:1px solid #e5e7eb;border-radius:10px;padding:16px}.card-header[data-v-c4b0ce4d]{flex-wrap:wrap;align-items:center;gap:10px;margin-bottom:10px;display:flex}.card-id[data-v-c4b0ce4d]{color:#6b7280;font-family:monospace;font-size:12px}.verdict-badge[data-v-c4b0ce4d]{border-radius:99px;padding:2px 8px;font-size:12px;font-weight:600}.verdict-badge.pending[data-v-c4b0ce4d]{color:#92400e;background:#fef3c7}.verdict-badge.approved[data-v-c4b0ce4d]{color:#16a34a;background:#dcfce7}.verdict-badge.rejected[data-v-c4b0ce4d]{color:#dc2626;background:#fee2e2}.tags[data-v-c4b0ce4d]{gap:4px;display:flex}.tag[data-v-c4b0ce4d]{color:#3730a3;background:#e0e7ff;border-radius:4px;padding:1px 6px;font-size:11px}.date[data-v-c4b0ce4d]{color:#9ca3af;margin-left:auto;font-size:11px}.query-block[data-v-c4b0ce4d],.response-block[data-v-c4b0ce4d]{margin-bottom:8px;font-size:13px;line-height:1.6}.query-block pre[data-v-c4b0ce4d],.response-block pre[data-v-c4b0ce4d]{background:var(--c-bg);white-space:pre-wrap;border:1px solid #e5e7eb;border-radius:4px;margin:4px 0 0;padding:6px 10px;font-size:13px}.actions[data-v-c4b0ce4d]{flex-direction:column;gap:8px;margin-top:10px;display:flex}textarea[data-v-c4b0ce4d]{resize:vertical;box-sizing:border-box;border:1px solid #d1d5db;border-radius:6px;width:100%;padding:8px 10px;font-family:inherit;font-size:13px}.btn-row[data-v-c4b0ce4d]{gap:8px;display:flex}.approve[data-v-c4b0ce4d]{color:#16a34a;background:#dcfce7;border-color:#86efac}.reject[data-v-c4b0ce4d]{color:#dc2626;background:#fee2e2;border-color:#fca5a5}.correction[data-v-c4b0ce4d]{background:#fffbeb;border:1px solid #fcd34d;border-radius:4px;margin-top:8px;padding:6px 10px;font-size:13px}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2 -2
View File
@@ -5,8 +5,8 @@
<link rel="icon" type="image/svg+xml" href="/static/favicon.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>端云协同 LLM 协作系统</title>
<script type="module" crossorigin src="/static/assets/index-D70fN-oL.js"></script>
<link rel="stylesheet" crossorigin href="/static/assets/index-BVpeNfYt.css">
<script type="module" crossorigin src="/static/assets/index-8a-EFu_T.js"></script>
<link rel="stylesheet" crossorigin href="/static/assets/index-DtUWLrmy.css">
</head>
<body>
<div id="app"></div>
@@ -1 +1 @@
{"touched":[],"bashMutation":true,"reportedFindings":[],"findingEvents":[],"baseline":null,"stateErrors":[],"omittedReportedFindings":0,"omittedFindingEvents":0,"processing":null,"updatedAt":"2026-09-01T11:06:00.142Z"}
{"touched":[],"bashMutation":true,"reportedFindings":[],"findingEvents":[],"baseline":null,"stateErrors":[],"omittedReportedFindings":0,"omittedFindingEvents":0,"processing":null,"updatedAt":"2026-09-01T13:44:31.436Z"}
+27 -26
View File
@@ -1,6 +1,6 @@
<template>
<div class="app">
<!-- 深色侧边导航 -->
<!-- 侧边导航dsh 风格近白 + 透明描边 -->
<aside class="side">
<div class="brand">
<div class="brand-logo">🤖</div>
@@ -31,7 +31,7 @@
</template>
<script setup lang="ts">
// App.vue — 深色侧边栏壳 + 路由出口
// App.vue — 侧边栏壳deepseek-harness 配色:sidebar-fill 近白 + 品牌蓝点缀)
const NAV = [
{ to: '/chat', icon: '💬', label: '对话' },
{ to: '/collaboration', icon: '🔄', label: '协作过程' },
@@ -48,13 +48,14 @@ const NAV = [
height: 100%;
}
/* ---------- 侧边栏 ---------- */
/* ---------- 侧边栏dshspecific-sidebar-fill 近白) ---------- */
.side {
width: 208px;
flex-shrink: 0;
display: flex;
flex-direction: column;
background: linear-gradient(180deg, var(--c-side-bg) 0%, var(--c-side-bg-2) 100%);
background: var(--c-side-bg);
border-right: 1px solid var(--c-side-border);
color: var(--c-side-text);
padding: 18px 12px 14px;
user-select: none;
@@ -64,9 +65,8 @@ const NAV = [
display: flex;
align-items: center;
gap: 10px;
padding: 4px 8px 18px;
border-bottom: 1px solid rgba(255, 255, 255, 0.07);
margin-bottom: 14px;
padding: 4px 8px 16px;
margin-bottom: 12px;
}
.brand-logo {
width: 38px;
@@ -74,43 +74,44 @@ const NAV = [
display: grid;
place-items: center;
font-size: 20px;
background: linear-gradient(135deg, #4f6ef7, #7c5cf5);
background: linear-gradient(135deg, var(--ds-blue-400), var(--ds-blue-500));
border-radius: 11px;
box-shadow: 0 4px 14px rgba(79, 110, 247, 0.45);
box-shadow: 0 3px 10px rgba(65, 118, 230, 0.35);
}
.brand-text { display: flex; flex-direction: column; line-height: 1.25; }
.brand-text b { color: #fff; font-size: 15px; letter-spacing: 0.5px; }
.brand-text span { font-size: 11px; color: var(--c-side-text); }
.brand-text { display: flex; flex-direction: column; line-height: 1.3; }
.brand-text b { color: var(--c-text); font-size: 15px; letter-spacing: 0.5px; }
.brand-text span { font-size: 11px; color: var(--c-caption); }
.nav { display: flex; flex-direction: column; gap: 3px; flex: 1; }
.nav { display: flex; flex-direction: column; gap: 2px; flex: 1; }
.nav-item {
display: flex;
align-items: center;
gap: 11px;
padding: 9px 12px;
padding: 8px 10px;
border-radius: 9px;
text-decoration: none;
color: var(--c-side-text);
font-size: 13.5px;
font-weight: 500;
position: relative;
transition: background 0.15s, color 0.15s;
transition: background 0.15s var(--ds-ease), color 0.15s var(--ds-ease);
}
.nav-item:hover { background: rgba(255, 255, 255, 0.055); color: #e6eaf4; }
.nav-item:hover { background: var(--c-side-hover); color: var(--c-text); }
.nav-item.router-link-active {
background: var(--c-side-active);
color: var(--c-side-text-active);
font-weight: 600;
}
.nav-item.router-link-active::before {
content: '';
position: absolute;
left: -12px;
top: 8px;
bottom: 8px;
top: 7px;
bottom: 7px;
width: 3px;
border-radius: 0 3px 3px 0;
background: var(--c-primary);
background: var(--c-accent);
}
.nav-icon {
width: 26px;
@@ -118,26 +119,25 @@ const NAV = [
display: grid;
place-items: center;
font-size: 15px;
background: rgba(255, 255, 255, 0.06);
background: var(--c-hover);
border-radius: 7px;
}
.nav-item.router-link-active .nav-icon { background: rgba(79, 110, 247, 0.35); }
.nav-item.router-link-active .nav-icon { background: var(--c-primary-soft); }
.side-foot {
display: flex;
align-items: center;
gap: 7px;
padding: 10px 8px 2px;
border-top: 1px solid rgba(255, 255, 255, 0.07);
padding: 12px 8px 2px;
font-size: 11px;
color: #7d879e;
color: var(--c-caption);
}
.foot-dot {
width: 7px;
height: 7px;
border-radius: 50%;
background: #34d399;
box-shadow: 0 0 6px #34d399;
background: var(--c-ok);
box-shadow: 0 0 6px rgba(34, 197, 94, 0.6);
}
/* ---------- 内容区 ---------- */
@@ -147,6 +147,7 @@ const NAV = [
height: 100%;
display: flex;
flex-direction: column;
background: var(--c-surface);
}
.content {
flex: 1;
+65 -39
View File
@@ -1,74 +1,101 @@
/* ============================================================
端云协同 LLM 系统 · 全局设计令牌与基础样式
(浅色主题;深色侧边栏壳见 App.vue)
配色体系对齐 deepseek-harness Webdesign-platform.css):
近白侧栏 + 纯白表面 + 极淡透明描边 + 近黑文字 + DeepSeek 品牌蓝
============================================================ */
:root {
/* 色板 */
--c-bg: #f4f6fb; /* 页面底 */
/* —— DeepSeek 色板(取自 dsw-static-*)—— */
--ds-blue-50: #edf3fe; /* rgb(237,243,254) */
--ds-blue-100: #e4edfd; /* rgb(228,237,253) */
--ds-blue-300: #b7c8fe; /* rgb(183,200,254) */
--ds-blue-400: #6786fe; /* rgb(103,158,254) */
--ds-blue-500: #4176e6; /* rgb(65,118,230) 品牌主色 */
--ds-neutral-bluish-00: #ffffff;
--ds-neutral-bluish-50: #f9fafb;
--ds-neutral-bluish-60: #f5f6f7;
--ds-neutral-bluish-75: #f1f3f5;
--ds-neutral-bluish-100: #ebeef2;
--ds-neutral-bluish-200: #e1e5ee;
--ds-neutral-bluish-400: #adb2b8;
--ds-neutral-bluish-600: #818588;
--ds-neutral-bluish-700: #61666b;
--ds-neutral-bluish-1000: #0f1115;
/* —— 语义令牌(各视图使用)—— */
--c-bg: var(--ds-neutral-bluish-60); /* 页面底(模块平台灰) */
--c-surface: #ffffff; /* 卡片/面板 */
--c-border: #e6e9f2;
--c-border-soft: #eef1f7;
--c-border: rgba(16, 20, 26, 0.1); /* border-l2 */
--c-border-soft: rgba(16, 20, 26, 0.05); /* border-l1 */
--c-text: #1a2233;
--c-text-2: #5b6478;
--c-text-3: #9aa3b5;
--c-text: var(--ds-neutral-bluish-1000);
--c-text-2: var(--ds-neutral-bluish-700);
--c-text-3: var(--ds-neutral-bluish-600);
--c-caption: var(--ds-neutral-bluish-400);
--c-primary: #4f6ef7;
--c-primary-strong: #3d5cf5;
--c-primary-soft: #eef1fe;
--c-primary-ring: rgba(79, 110, 247, 0.16);
--c-primary: var(--ds-blue-500);
--c-primary-strong: var(--ds-blue-400); /* 悬停(dsh:变亮) */
--c-primary-soft: var(--ds-blue-50);
--c-primary-tint: var(--ds-blue-100);
--c-primary-ring: rgba(65, 118, 230, 0.2);
--c-ok: #16a34a;
--c-ok-soft: #dcfce7;
--c-warn: #d97706;
--c-warn-soft: #fef3c7;
--c-err: #dc2626;
--c-err-soft: #fee2e2;
--c-hover: rgba(38, 49, 72, 0.06); /* dsh 交互悬停 */
/* 侧边栏(深色) */
--c-side-bg: #151b2c;
--c-side-bg-2: #1b2338;
--c-side-text: #aeb7cd;
--c-side-text-active: #ffffff;
--c-side-active: rgba(255, 255, 255, 0.09);
--c-ok: #22c55e;
--c-ok-soft: #e6faed;
--c-warn: #dd8629;
--c-warn-soft: #fef5e7;
--c-err: #ec1313;
--c-err-soft: #fef2f2;
/* 形状与影 */
/* —— 侧边栏(近白,dsh sidebar-fill)—— */
--c-side-bg: var(--ds-neutral-bluish-50);
--c-side-text: var(--ds-neutral-bluish-700);
--c-side-text-active: var(--ds-neutral-bluish-1000);
--c-side-active: var(--ds-neutral-bluish-100);
--c-side-hover: var(--ds-neutral-bluish-75);
--c-side-border: var(--c-border-soft);
--c-accent: var(--ds-blue-500);
/* —— 形状与影(dsh:扁平,描边负责层次)—— */
--radius: 10px;
--radius-sm: 7px;
--shadow-card: 0 1px 2px rgba(16, 24, 40, 0.04), 0 4px 16px rgba(16, 24, 40, 0.06);
--shadow-pop: 0 10px 40px rgba(16, 24, 40, 0.16);
--shadow-card: 0 1px 2px rgba(16, 24, 40, 0.03);
--shadow-pop: 0 8px 30px rgba(16, 24, 40, 0.12);
--font-mono: ui-monospace, Consolas, "Courier New", monospace;
--font-mono: 'SF Mono', 'JetBrains Mono', 'Fira Code', Consolas,
'Liberation Mono', Menlo, Courier, 'PingFang SC', 'Microsoft YaHei', monospace;
--ds-ease: cubic-bezier(0.4, 0, 0.2, 1);
}
* { box-sizing: border-box; margin: 0; padding: 0; }
html, body, #app {
height: 100%;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC",
"Microsoft YaHei", Roboto, sans-serif;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC',
'Hiragino Sans GB', 'Microsoft YaHei', Roboto, sans-serif;
font-size: 14px;
color: var(--c-text);
background: var(--c-bg);
-webkit-font-smoothing: antialiased;
}
/* ---------- 统一滚动条 ---------- */
/* ---------- 统一滚动条dshneutral-200 圆头) ---------- */
::-webkit-scrollbar { width: 9px; height: 9px; }
::-webkit-scrollbar-thumb {
background: #c9cfdd;
background: #e5e5e5;
border-radius: 8px;
border: 2px solid transparent;
background-clip: content-box;
}
::-webkit-scrollbar-thumb:hover { background-color: #aab2c5; }
::-webkit-scrollbar-thumb:hover { background-color: #d4d4d4; }
::-webkit-scrollbar-track { background: transparent; }
/* ---------- 基础元素统一 ---------- */
button, input, select, textarea { font-family: inherit; color: inherit; }
h2 { font-size: 19px; font-weight: 700; letter-spacing: 0.2px; }
h2 { font-size: 19px; font-weight: 700; letter-spacing: 0.2px; color: var(--c-text); }
a { color: var(--c-primary); }
@@ -83,12 +110,12 @@ input:focus-visible, select:focus-visible, textarea:focus-visible, button:focus-
/* ---------- 通用卡片质感(供各页复用) ---------- */
.surface {
background: var(--c-surface);
border: 1px solid var(--c-border);
border: 1px solid var(--c-border-soft);
border-radius: var(--radius);
box-shadow: var(--shadow-card);
}
/* 各页卡片统一阴影(配合各自 scoped 样式) */
/* 各页卡片统一描边与阴影(配合各自 scoped 样式) */
.settings-section,
.metric-card,
.ev-card {
@@ -104,13 +131,12 @@ input:focus-visible, select:focus-visible, textarea:focus-visible, button:focus-
}
.page-head .sub { margin-top: 3px; }
/* 细节:数字/代码味道 */
.mono { font-family: var(--font-mono); }
/* 平滑出现 */
/* 平滑出现dsh 缓动曲线) */
@media (prefers-reduced-motion: no-preference) {
.ev-card, .metric-card, .settings-section {
animation: fade-up 0.18s ease both;
animation: fade-up 0.2s var(--ds-ease) both;
}
}
@keyframes fade-up {
+13 -13
View File
@@ -394,7 +394,7 @@ onMounted(async () => {
cursor: pointer;
color: #374151;
}
.ws-list li:hover { background: #eff6ff; }
.ws-list li:hover { background: var(--c-primary-soft); }
.ws-list li.dir { color: #92400e; font-weight: 500; cursor: default; }
.ws-empty { color: #9ca3af; cursor: default; font-size: 12px; }
.ws-empty:hover { background: transparent; }
@@ -481,10 +481,10 @@ onMounted(async () => {
resize: vertical;
outline: none;
}
.task-input:focus { border-color: #2563eb; box-shadow: 0 0 0 2px #2563eb26; }
.task-input:focus { border-color: var(--c-primary); box-shadow: 0 0 0 2px var(--c-primary-ring); }
.btn-run {
color: #fff;
background: #2563eb;
background: var(--c-primary);
border: none;
border-radius: 8px;
padding: 0 22px;
@@ -493,11 +493,11 @@ onMounted(async () => {
cursor: pointer;
align-self: stretch;
}
.btn-run:hover:not(:disabled) { background: #1d4ed8; }
.btn-run:disabled { background: #93c5fd; cursor: not-allowed; }
.btn-run:hover:not(:disabled) { background: var(--c-primary-strong); }
.btn-run:disabled { background: var(--c-primary-tint); cursor: not-allowed; }
.status-line { font-size: 13px; font-weight: 600; margin-bottom: 10px; }
.st-running { color: #2563eb; }
.st-running { color: var(--c-primary); }
.st-ok { color: #16a34a; }
.st-err { color: #dc2626; }
@@ -528,7 +528,7 @@ onMounted(async () => {
overflow: hidden;
text-overflow: ellipsis;
}
.ph-plan { color: #1e40af; background: #dbeafe; }
.ph-plan { color: #1e40af; background: var(--c-primary-tint); }
.ph-execute { color: #166534; background: #dcfce7; }
.ph-review { color: #7c2d12; background: #ffedd5; }
.ev-msg { margin-bottom: 8px; }
@@ -543,7 +543,7 @@ onMounted(async () => {
max-height: 260px;
overflow-y: auto;
}
.msg-planner { background: #eff6ff; color: #1e3a8a; border: 1px solid #bfdbfe; }
.msg-planner { background: var(--c-primary-soft); color: #1e3a8a; border: 1px solid var(--c-primary-tint); }
.msg-executor { background: #f0fdf4; color: #14532d; border: 1px solid #bbf7d0; }
.executor-select { flex: 1; max-width: 340px; }
.ev-card {
@@ -581,8 +581,8 @@ onMounted(async () => {
.diff-new { background: #f0fdf4; color: #15803d; }
.ev-usage { text-align: right; color: #9ca3af; font-size: 11px; margin: 4px 0; }
.ev-final {
border: 1px solid #bfdbfe;
background: #eff6ff;
border: 1px solid var(--c-primary-tint);
background: var(--c-primary-soft);
border-radius: 8px;
padding: 12px 14px;
margin-top: 10px;
@@ -649,8 +649,8 @@ onMounted(async () => {
overflow: hidden;
text-overflow: ellipsis;
}
.dir-item:hover { background: #eff6ff; }
.dir-item.up { color: #2563eb; font-weight: 500; }
.dir-item:hover { background: var(--c-primary-soft); }
.dir-item.up { color: var(--c-primary); font-weight: 500; }
.dir-item.empty { color: #9ca3af; cursor: default; }
.dir-item.empty:hover { background: transparent; }
.path-row { display: flex; gap: 10px; align-items: center; margin-top: 10px; }
@@ -677,7 +677,7 @@ onMounted(async () => {
overflow: hidden;
text-overflow: ellipsis;
}
.recent-chip:hover { background: #eff6ff; border-color: #bfdbfe; }
.recent-chip:hover { background: var(--c-primary-soft); border-color: var(--c-primary-tint); }
.picker-msg { color: #d97706; font-size: 12px; margin-top: 8px; }
.modal-actions { display: flex; gap: 10px; margin-top: 14px; }
</style>
+7 -7
View File
@@ -208,12 +208,12 @@ async function handleSend() {
font-size: 13px;
}
.session-item:hover { background: #e5e7eb; }
.session-item.active { background: #dbeafe; }
.session-item.active { background: var(--c-primary-tint); }
.s-query { color: #111; }
.s-status { font-size: 11px; color: #9ca3af; }
.s-status.done { color: #16a34a; }
.s-status.failed { color: #dc2626; }
.s-status.running { color: #2563eb; }
.s-status.running { color: var(--c-primary); }
.main {
flex: 1;
@@ -244,7 +244,7 @@ async function handleSend() {
font-size: 14px;
line-height: 1.6;
}
.assistant-msg { background: #eff6ff; }
.assistant-msg { background: var(--c-primary-soft); }
.role-label {
font-weight: 700;
font-size: 12px;
@@ -270,7 +270,7 @@ async function handleSend() {
font-weight: 600;
}
.badge.pending { background: #f3f4f6; color: #6b7280; }
.badge.running { background: #dbeafe; color: #2563eb; }
.badge.running { background: var(--c-primary-tint); color: var(--c-primary); }
.badge.done { background: #dcfce7; color: #16a34a; }
.badge.failed { background: #fee2e2; color: #dc2626; }
.route-path { font-size: 12px; color: #9ca3af; }
@@ -305,7 +305,7 @@ async function handleSend() {
.deps { color: #9ca3af; font-size: 12px; }
.done { color: #16a34a; }
.pending { color: #9ca3af; }
.running { color: #2563eb; }
.running { color: var(--c-primary); }
.error-msg { color: #dc2626; font-size: 13px; background: #fee2e2; padding: 8px 12px; border-radius: 6px; }
@@ -324,10 +324,10 @@ async function handleSend() {
font-size: 14px;
outline: none;
}
.input-bar input:focus { border-color: #2563eb; }
.input-bar input:focus { border-color: var(--c-primary); }
.input-bar button {
padding: 10px 20px;
background: #2563eb;
background: var(--c-primary);
color: #fff;
border: none;
border-radius: 8px;
+11 -11
View File
@@ -276,7 +276,7 @@ function getDecision(issueId: string) {
font-size: 13px;
}
.session-item:hover { background: #e5e7eb; }
.session-item.active { background: #dbeafe; }
.session-item.active { background: var(--c-primary-tint); }
.meta { font-size: 11px; color: #9ca3af; }
.stats {
@@ -331,18 +331,18 @@ function getDecision(issueId: string) {
color: #111;
margin: 0 0 12px;
padding-bottom: 6px;
border-bottom: 2px solid #2563eb;
border-bottom: 2px solid var(--c-primary);
}
.brief-card {
background: #eff6ff;
border: 1px solid #bfdbfe;
background: var(--c-primary-soft);
border: 1px solid var(--c-primary-tint);
border-radius: 8px;
padding: 14px 16px;
}
.goal { font-size: 14px; margin-bottom: 8px; color: #1e40af; font-weight: 600; }
.tags { display: flex; gap: 6px; flex-wrap: wrap; }
.tag { background: #dbeafe; color: #1d4ed8; padding: 2px 8px; border-radius: 99px; font-size: 12px; }
.tag { background: var(--c-primary-tint); color: var(--c-primary-strong); padding: 2px 8px; border-radius: 99px; font-size: 12px; }
.domain { background: #fce7f3; color: #9d174d; padding: 2px 8px; border-radius: 99px; font-size: 12px; }
.constraints { list-style: disc inside; font-size: 13px; color: #374151; margin-top: 8px; }
@@ -375,14 +375,14 @@ function getDecision(issueId: string) {
z-index: 1;
}
.plan-step.done .step-dot { background: #16a34a; border-color: #16a34a; }
.plan-step.running .step-dot { background: #2563eb; border-color: #2563eb; }
.plan-step.running .step-dot { background: var(--c-primary); border-color: var(--c-primary); }
.plan-step.pending .step-dot { background: #fff; }
.step-content { flex: 1; }
.step-header { display: flex; align-items: center; gap: 8px; margin-bottom: 4px; }
.step-id { font-family: monospace; font-size: 12px; color: #6b7280; font-weight: 700; }
.step-status { font-size: 11px; padding: 1px 6px; border-radius: 99px; }
.plan-step.done .step-status { background: #dcfce7; color: #16a34a; }
.plan-step.running .step-status { background: #dbeafe; color: #2563eb; }
.plan-step.running .step-status { background: var(--c-primary-tint); color: var(--c-primary); }
.plan-step.pending .step-status { background: #f3f4f6; color: #9ca3af; }
.step-task { margin: 0; font-size: 13px; color: #374151; }
.step-deps { font-size: 11px; color: #9ca3af; margin-top: 2px; }
@@ -396,7 +396,7 @@ function getDecision(issueId: string) {
.progress-bar-wrap { margin-bottom: 10px; }
.progress-label { font-size: 12px; color: #6b7280; margin-bottom: 4px; }
.progress-bar { height: 6px; background: #e5e7eb; border-radius: 99px; overflow: hidden; }
.progress-fill { height: 100%; background: #2563eb; border-radius: 99px; transition: width 0.4s ease; }
.progress-fill { height: 100%; background: var(--c-primary); border-radius: 99px; transition: width 0.4s ease; }
.progress-steps { display: flex; flex-wrap: wrap; gap: 8px; }
.pg-step {
display: flex;
@@ -408,7 +408,7 @@ function getDecision(issueId: string) {
border: 1px solid #e5e7eb;
}
.pg-step.done { background: #dcfce7; border-color: #bbf7d0; }
.pg-step.running { background: #dbeafe; border-color: #bfdbfe; }
.pg-step.running { background: var(--c-primary-tint); border-color: var(--c-primary-tint); }
.pg-note { color: #9ca3af; font-size: 11px; }
/* Issues */
@@ -424,8 +424,8 @@ function getDecision(issueId: string) {
.issue-step { font-size: 11px; color: #6b7280; }
.decision {
margin-top: 8px;
background: #eff6ff;
border: 1px solid #bfdbfe;
background: var(--c-primary-soft);
border: 1px solid var(--c-primary-tint);
border-radius: 4px;
padding: 6px 10px;
font-size: 13px;
+2 -2
View File
@@ -165,7 +165,7 @@ onMounted(load)
border-radius: 10px;
padding: 16px;
}
.metric-card.highlight { border-color: #2563eb; background: #eff6ff; }
.metric-card.highlight { border-color: var(--c-primary); background: var(--c-primary-soft); }
.metric-card h3 { margin: 0 0 12px; font-size: 14px; color: #374151; }
.kv-list {
@@ -180,7 +180,7 @@ onMounted(load)
.review-card { grid-column: span 2; }
.review-stats { display: flex; gap: 24px; margin-bottom: 12px; }
.stat-item { display: flex; flex-direction: column; align-items: center; }
.stat-num { font-size: 28px; font-weight: 700; color: #2563eb; }
.stat-num { font-size: 28px; font-weight: 700; color: var(--c-primary); }
.stat-label { font-size: 12px; color: #6b7280; }
.progress-wrap {
+1 -1
View File
@@ -116,7 +116,7 @@ button {
cursor: pointer;
font-size: 13px;
}
button.active { background: #2563eb; color: #fff; border-color: #2563eb; }
button.active { background: var(--c-primary); color: #fff; border-color: var(--c-primary); }
.refresh-btn { margin-left: auto; }
.loading, .error, .empty {
+14 -14
View File
@@ -1090,8 +1090,8 @@ onUnmounted(() => { _dlSSE?.close() })
transition: background 0.1s;
}
.model-item:last-child { border-bottom: none; }
.model-item:hover { background: #eff6ff; }
.model-item.selected { background: #dbeafe; }
.model-item:hover { background: var(--c-primary-soft); }
.model-item.selected { background: var(--c-primary-tint); }
.model-item-name { font-weight: 500; color: #1f2937; }
.model-item-size { color: #9ca3af; font-size: 12px; }
@@ -1118,10 +1118,10 @@ onUnmounted(() => { _dlSSE?.close() })
font-size: 13px;
outline: none;
}
.download-input:focus { border-color: #2563eb; }
.download-input:focus { border-color: var(--c-primary); }
.btn-download {
color: #fff;
background: #2563eb;
background: var(--c-primary);
border: none;
border-radius: 6px;
padding: 7px 16px;
@@ -1129,12 +1129,12 @@ onUnmounted(() => { _dlSSE?.close() })
cursor: pointer;
min-width: 70px;
}
.btn-download:disabled { background: #93c5fd; cursor: not-allowed; }
.btn-download:disabled { background: var(--c-primary-tint); cursor: not-allowed; }
.progress-wrap { margin-top: 8px; }
.progress-bar { background: #e5e7eb; border-radius: 3px; height: 6px; overflow: hidden; }
.progress-fill {
background: linear-gradient(90deg, #2563eb, #3b82f6);
background: linear-gradient(90deg, var(--c-primary), #3b82f6);
border-radius: 3px;
height: 100%;
transition: width 0.3s;
@@ -1177,8 +1177,8 @@ onUnmounted(() => { _dlSSE?.close() })
color: #111827;
}
.field input:focus, .field select:focus {
border-color: #2563eb;
box-shadow: 0 0 0 2px #2563eb26;
border-color: var(--c-primary);
box-shadow: 0 0 0 2px var(--c-primary-ring);
}
.model-select {
@@ -1190,7 +1190,7 @@ onUnmounted(() => { _dlSSE?.close() })
padding: 8px 12px;
font-size: 14px;
}
.model-select:focus { border-color: #2563eb; outline: none; box-shadow: 0 0 0 3px #2563eb26; }
.model-select:focus { border-color: var(--c-primary); outline: none; box-shadow: 0 0 0 3px var(--c-primary-ring); }
.input-row {
display: flex;
@@ -1242,7 +1242,7 @@ onUnmounted(() => { _dlSSE?.close() })
font-weight: 600;
}
.tier-local { color: #166534; background: #dcfce7; }
.tier-budget { color: #1e40af; background: #dbeafe; }
.tier-budget { color: #1e40af; background: var(--c-primary-tint); }
.tier-premium { color: #7c2d12; background: #ffedd5; }
.pool-edit {
@@ -1282,7 +1282,7 @@ onUnmounted(() => { _dlSSE?.close() })
white-space: nowrap;
transition: background 0.1s;
}
.btn-ping:hover:not(:disabled) { background: #eff6ff; }
.btn-ping:hover:not(:disabled) { background: var(--c-primary-soft); }
.btn-ping:disabled { opacity: 0.5; cursor: not-allowed; }
.ping-badge { font-size: 12px; font-weight: 500; white-space: nowrap; }
@@ -1309,7 +1309,7 @@ onUnmounted(() => { _dlSSE?.close() })
.btn-primary {
color: #fff;
background: #2563eb;
background: var(--c-primary);
border: none;
border-radius: 7px;
padding: 9px 20px;
@@ -1318,8 +1318,8 @@ onUnmounted(() => { _dlSSE?.close() })
cursor: pointer;
transition: background 0.15s;
}
.btn-primary:hover:not(:disabled) { background: #1d4ed8; }
.btn-primary:disabled { background: #93c5fd; cursor: not-allowed; }
.btn-primary:hover:not(:disabled) { background: var(--c-primary-strong); }
.btn-primary:disabled { background: var(--c-primary-tint); cursor: not-allowed; }
.btn-secondary {
color: #374151;
+9
View File
@@ -142,3 +142,12 @@
- App.vue 重设计:顶部条 → 深色侧边栏壳(渐变 Logo、图标导航、激活态高亮条、网关状态脚注)。
- 各页浅层打磨:页面背景令牌化、卡片统一阴影、浏览器标题/lang 修正(原为"webapp"/en)。
- 功能零改动;构建产物同步。
### 5.7 增补(同日):配色体系对齐 deepseek-harness Web
-`deepseek-harness/packages/client/ui-theme/src/styles/design-platform.css` 提取
官方色板(dsw-static-*):DeepSeek 品牌蓝 deepseek-500 rgb(65,118,230)、
bluish 中性灰阶、语义状态色,替换自拟配色。
- 风格修正:深色侧栏 → dsh 式**近白侧栏**sidebar-fill bluish-50 + 透明描边);
扁平化阴影(描边负责层次);交互悬停 rgba(38,49,72,.06);滚动条 neutral-200 圆头。
- 全部视图旧硬编码蓝(#2563eb 系)批量替换为设计令牌,视觉单一来源。