保持 Muse 风格(白底、细线、灰/浅蓝气泡),不再四栏切视图: 顶栏(连接/健康/配额/刷新 + 锚点导航)+ 6 张数据卡片 (健康、配额、任务、Workers、项目、项目数据,均取自已有 store 数据,未加载不以 0 充数)+ 所有模块按顺序铺在一页 (派发、任务列表、对话+详情、项目、环境、Workers、技能、 自动化、分诊、管理区、API Key)。图标栏与右侧栏删除, 内容分别移到顶栏与各自模块下;今天列表与任务列表重复, 不再单独保留;对话为空时不再重复渲染派发表单。 含自动选第一个项目修复(主要聊天不再空)与继续消息 历史,console 标记单测本地 53 项通过。
150 lines
11 KiB
CSS
150 lines
11 KiB
CSS
/* Single token source — Muse web/desktop palette (2026-10-29 redesign).
|
|
This supersedes the previous v3 porcelain/ink/seal palette: white page,
|
|
light-grey hairlines, grey assistant bubbles, light-blue user bubbles,
|
|
blue accent, green only for 已连接. The old pine/seal colours are gone;
|
|
the button class name "seal" is retained only so Dispatch/DetailActions
|
|
need no change — it now renders in screenshot blue. No coloured page
|
|
backgrounds, no big header bar, no shadows. Sans-serif only. */
|
|
:root{
|
|
--text:#1d2129; --muted:#667085; --line:#e4e7ec; --line-strong:#d0d5dd;
|
|
--paper:#ffffff; --card:#ffffff;
|
|
--bubble-assistant:#f2f2f2; --bubble-user:#bfe0ff;
|
|
--accent:#3b82f6; --accent-dark:#2563eb; --accent-soft:#eef4ff;
|
|
--green:#22c55e; --success:#16a34a; --danger:#b42318; --danger-soft:#fef3f2;
|
|
--amber:#b54708; --purple:#6941c6;
|
|
--radius:12px; --radius-sm:10px; --shadow:none;
|
|
--sans:-apple-system,"PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;
|
|
--mono:"IBM Plex Mono",Menlo,Consolas,monospace;
|
|
--ctl:40px;
|
|
}
|
|
*{box-sizing:border-box}
|
|
html,body,#root{height:100%}
|
|
body{font-family:var(--sans);margin:0;color:var(--text);background:#fff;line-height:1.6;font-size:14px}
|
|
a{color:var(--accent);text-underline-offset:3px}
|
|
:focus-visible{outline:3px solid var(--accent);outline-offset:2px}
|
|
@media (prefers-reduced-motion:reduce){*{scroll-behavior:auto!important;transition:none!important}}
|
|
.muted{color:var(--muted);font-size:13px;line-height:1.6}
|
|
.err{color:var(--danger)} .ok{color:var(--success)}
|
|
button{cursor:pointer;font-weight:600;border-radius:999px}
|
|
button:disabled{opacity:.45;cursor:not-allowed;box-shadow:none}
|
|
button.primary{background:var(--accent);border-color:var(--accent);color:#fff}
|
|
button.primary:hover{background:var(--accent-dark)}
|
|
/* "seal" is a legacy class name only; its colour is screenshot blue now. */
|
|
button.seal{background:var(--accent);border-color:var(--accent);color:#fff}
|
|
button.seal:hover{background:var(--accent-dark)}
|
|
button.danger{color:var(--danger);border-color:#fecdca;background:var(--danger-soft)}
|
|
button.danger:hover{background:#fee4e2}
|
|
.icon-btn{width:32px;height:32px;padding:0;display:grid;place-items:center;border:1px solid var(--line);border-radius:50%;background:#fff;color:var(--text);font-size:16px;line-height:1}
|
|
.icon-btn:hover{background:#f9fafb}
|
|
|
|
/* Dashboard shell: ONE scrollable console page, same Muse tokens.
|
|
Slim sticky top bar (name + status + health + quota + refresh
|
|
stamp + anchor nav), a data-cards row, then every module as a
|
|
section. No icon-rail column, no left list column, no right
|
|
panel column — the old shell classes are gone with them. */
|
|
.dash-topbar{position:sticky;top:0;z-index:10;background:#fff;border-bottom:1px solid var(--line);padding:10px 20px 8px}
|
|
.dash-topbar-row{display:flex;gap:14px;align-items:center;flex-wrap:wrap}
|
|
.dash-brand{font-weight:700;font-size:17px}
|
|
.dash-status{font-size:13px;font-weight:600;color:var(--muted)}
|
|
.dash-status.ok{color:var(--green)}
|
|
.dash-stamp{margin-left:auto}
|
|
.dash-nav{display:flex;gap:4px;flex-wrap:wrap;margin-top:8px}
|
|
.dash-nav a{color:var(--text);text-decoration:none;font-size:13px;font-weight:600;padding:6px 12px;border-radius:999px}
|
|
.dash-nav a:hover{background:#f2f2f2}
|
|
.dash-page{max-width:1180px;margin:0 auto;padding:20px;display:flex;flex-direction:column;gap:20px}
|
|
.dash-section{scroll-margin-top:130px;display:flex;flex-direction:column;gap:20px}
|
|
.dash-section.card{padding:20px}
|
|
.dash-cards{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}
|
|
.dash-card{background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:16px 18px;min-width:0}
|
|
.dash-card-label{color:var(--muted);font-size:13px;font-weight:600}
|
|
.dash-card-value{font-size:28px;font-weight:700;line-height:1.3;overflow-wrap:anywhere}
|
|
|
|
|
|
/* Cards: flat white sections with a hairline border, no shadow. */
|
|
.card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);box-shadow:none;padding:20px}
|
|
.card h2{font-size:17px;margin:0 0 12px;font-weight:600}
|
|
.card h3{font-size:15px;margin:24px 0 12px;padding-top:20px;border-top:1px solid var(--line);font-weight:600}
|
|
.card h3:first-of-type{border-top:0;padding-top:0}
|
|
.composer h2{font-size:20px}
|
|
.composer textarea.prompt{min-height:148px;font-size:16px;padding:16px 18px;border-radius:12px}
|
|
.composer textarea.coord{font-family:var(--mono);font-size:13px}
|
|
/* Unified controls: same-row controls are all 40px */
|
|
.bar{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin:12px 0}
|
|
.bar > button,.bar > label{display:inline-flex;align-items:center;height:var(--ctl);min-height:var(--ctl);padding:0 16px;box-sizing:border-box;white-space:nowrap}
|
|
.bar > input,.bar > select{height:var(--ctl);min-height:var(--ctl)}
|
|
input,select,textarea,button{font:inherit;font-size:14px;padding:10px 13px;border-radius:var(--radius-sm);border:1px solid var(--line-strong);background:#fff;color:var(--text)}
|
|
input:focus,select:focus,textarea:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px rgba(59,130,246,.15)}
|
|
button:hover{box-shadow:none}
|
|
select{appearance:none;-webkit-appearance:none;cursor:pointer;padding-right:34px;background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'><path d='M1 1l5 5 5-5' fill='none' stroke='%23667085' stroke-width='1.5' stroke-linecap='round'/></svg>");background-repeat:no-repeat;background-position:right 12px center}
|
|
select::-ms-expand{display:none}
|
|
select:disabled,input:disabled{color:var(--muted);background:#f9fafb;cursor:not-allowed}
|
|
input[type="checkbox"]{width:16px;height:16px;accent-color:var(--accent)}
|
|
input[type="file"]{height:var(--ctl);display:inline-flex;align-items:center;padding:0 12px;border:1px dashed var(--line-strong);border-radius:999px;background:#fff}
|
|
input[type="file"]::file-selector-button{height:28px;padding:0 12px;margin-right:10px;border:0;border-radius:999px;background:#f2f2f2;color:var(--text);font:inherit;font-size:13px;cursor:pointer}
|
|
textarea{width:100%;min-height:84px;resize:vertical;line-height:1.65;padding:12px 14px;border-radius:12px}
|
|
.composer .bar label{display:inline-flex;align-items:center;gap:7px;border:1px solid var(--line-strong);border-radius:999px;padding:7px 13px;background:#fff;cursor:pointer;font-size:13px;font-weight:600}
|
|
.composer .bar label:has(input:checked){background:var(--text);color:#fff;border-color:var(--text)}
|
|
.stacked{margin-bottom:12px}
|
|
.stacked + .bar{margin-top:0}
|
|
/* Data lists: one shared list style, no per-section inline styles */
|
|
.data-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px}
|
|
.data-list li{position:relative;margin:0;padding:10px 12px;background:#f9fafb;border:1px solid var(--line);border-radius:12px;line-height:1.6;display:flex;flex-wrap:wrap;align-items:center;gap:8px;overflow-wrap:anywhere}
|
|
.data-list li .row-main{flex:1 1 200px;min-width:0}
|
|
.data-list li button{flex:none}
|
|
.data-list li.is-online,.data-list li.is-offline{padding-left:26px}
|
|
.data-list li.is-online::before,.data-list li.is-offline::before{content:"";position:absolute;left:12px;top:17px;width:8px;height:8px;border-radius:50%}
|
|
.data-list li.is-online::before{background:var(--green)}
|
|
.data-list li.is-offline::before{background:var(--danger)}
|
|
.data-group{margin-bottom:12px}.data-group:last-child{margin-bottom:0}.data-group > b{display:block;margin-bottom:8px}
|
|
/* Status colours (text only; dots use currentColor) */
|
|
.st-queued{color:var(--muted)}.st-running{color:var(--amber);font-weight:700}.st-completed{color:var(--success)}.st-failed,.st-merge-failed{color:var(--danger)}.st-merged{color:var(--purple)}.st-interrupted{color:var(--amber)}
|
|
/* Task table (kept for any table view; the left list is the primary list) */
|
|
.table-wrap{border:0;border-top:1px solid var(--line);overflow:auto;background:var(--card)}
|
|
table{border-collapse:collapse;width:100%;font-size:13px}
|
|
th,td{padding:12px 16px;text-align:left;vertical-align:top;border-bottom:1px solid var(--line)}
|
|
th{background:#f9fafb;color:var(--muted);font-size:12px;font-weight:600;white-space:nowrap;letter-spacing:.3px}
|
|
tbody tr{cursor:pointer}
|
|
tbody tr:hover{background:#f9fafb}
|
|
tr.selected{background:#f2f2f2}
|
|
td.prompt-col{font-size:15px;line-height:1.55}
|
|
/* Result / error blocks: light, not dark — the screenshot has no dark log block */
|
|
pre{background:#f9fafb;color:var(--text);border:1px solid var(--line);border-radius:12px;padding:16px 18px;overflow:auto;max-height:420px;white-space:pre-wrap;word-break:break-word;font-size:13px;font-family:var(--mono);line-height:1.7}
|
|
.trace-box{background:#f9fafb;color:var(--text);border:1px solid var(--line);border-radius:12px;padding:16px 18px;max-height:520px;overflow:auto;font-size:13px;line-height:1.9;font-family:var(--mono)}
|
|
.trace-box .muted{color:var(--muted)}
|
|
/* Chat: Muse screenshot bubbles. Assistant grey left, user light-blue
|
|
right, dark text on both, rounded ~16px, max-width ~75%. One shared
|
|
style for the trace timeline and the continue chat. */
|
|
.conversation{display:flex;flex-direction:column;gap:20px}
|
|
.chat-column{max-width:100%;margin:0 auto;width:100%}
|
|
.chat-list{position:relative;display:flex;flex-direction:column;gap:12px;max-height:none;overflow:visible;padding:8px 0}
|
|
.chat-row{display:flex}.chat-row.user{justify-content:flex-end}.chat-row.assistant,.chat-row.tool{justify-content:flex-start}
|
|
.chat-bubble{max-width:75%;padding:10px 14px;border-radius:16px;line-height:1.65;white-space:pre-wrap;word-break:break-word;color:var(--text)}
|
|
.chat-bubble.user{background:var(--bubble-user);border-bottom-right-radius:4px}
|
|
.chat-bubble.assistant{background:var(--bubble-assistant);border-bottom-left-radius:4px}
|
|
.chat-bubble.tool{background:var(--bubble-assistant);font-family:var(--mono);font-size:13px;border-bottom-left-radius:4px}
|
|
.chat-label{font-size:12px;color:var(--muted);margin-bottom:4px}
|
|
.chat-status{text-align:center;font-size:12px;color:var(--muted)}
|
|
.chat-follow{position:sticky;bottom:8px;align-self:center;background:var(--accent);border-color:var(--accent);color:#fff;z-index:2}
|
|
.chat-input-bar{position:sticky;bottom:0;display:flex;gap:8px;align-items:center;background:#fff;border:1px solid var(--line);border-radius:999px;padding:6px 6px 6px 16px;box-shadow:0 1px 4px rgba(0,0,0,.06);z-index:2}
|
|
.chat-input{flex:1;height:var(--ctl);min-height:var(--ctl);resize:none;border:0;background:transparent;padding:8px 0}
|
|
.chat-input:focus{box-shadow:none;outline:none}
|
|
.chat-send{width:36px;height:36px;border-radius:50%;background:var(--bubble-user);border:0;color:var(--accent-dark);padding:0;display:grid;place-items:center;font-size:18px;line-height:1;flex:none}
|
|
.chat-send:disabled{opacity:.45;background:#f2f2f2;color:var(--muted)}
|
|
.conv-divider{border-top:1px solid var(--line);margin:4px 0}
|
|
@media (max-width:900px){
|
|
.dash-cards{grid-template-columns:repeat(2,1fr)}
|
|
.dash-hide-sm{display:none}
|
|
.dash-page{padding:14px}
|
|
.dash-section.card{padding:16px}
|
|
.card{padding:16px}
|
|
th:nth-child(2),td:nth-child(2),th:nth-child(3),td:nth-child(3),th:nth-child(7),td:nth-child(7){display:none}
|
|
}
|
|
@media (max-width:560px){
|
|
.dash-cards{grid-template-columns:1fr}
|
|
.dash-nav{flex-wrap:nowrap;overflow-x:auto}
|
|
.card{padding:16px}
|
|
th:nth-child(6),td:nth-child(6),th:nth-child(9),td:nth-child(9){display:none}
|
|
.bar > input[type="text"],.bar > input[type="password"],.bar > select{flex:1 1 100%}
|
|
th,td{padding:10px 12px}
|
|
}
|