This commit is contained in:
Your Name
2026-08-27 14:04:28 +08:00
parent f7720831be
commit 334890171e
3016 changed files with 263403 additions and 27971 deletions
+43 -1
View File
@@ -1,7 +1,29 @@
# -*- coding: utf-8 -*-
"""Build console-app.js from the original mock script plus live-data hooks."""
"""一次性的构建脚本,已经作废——**不要运行它**。
当初它的用途是:拿设计稿导出的 `_orig_script.js`,套上接真实数据的补丁,
生成 `console-app.js`。那之后 `console-app.js` 被直接手改了很多轮,包括
* 侧边球体的启动/暂停开关(`data-action="toggle-listen"`
* 面板溢出与活动条横向滚动的布局修复
* 可编辑字段的悬停/聚焦样式和 `annotateEditableFields()`
* 审核后发送的「通过并发送」放行按钮
这些改动一条都没有回流到本文件里的模板字符串。现在再跑一次,等于把
`console-app.js` 整个退回到几个版本之前——而且是静悄悄地退,不报任何错,
下次有人打开界面才发现按钮没了。
留着它是为了保存当初的生成逻辑,**不是**为了再次执行。真要重新生成,先把
上面那些改动逐条同步进来,再删掉这个拦截。
"""
import sys
from pathlib import Path
raise SystemExit(
"_patch_console.py 已作废:再跑一次会把 console-app.js 覆盖回旧版本,"
"丢掉球体开关、布局修复、可编辑字段样式和审核放行按钮。详见文件开头说明。"
)
root = Path(__file__).resolve().parent
script = (root / "_orig_script.js").read_text(encoding="utf-8")
for old, new in [
@@ -237,8 +259,28 @@ render = function(name){
const label = document.getElementById("orb-label");
if (orb) orb.classList.toggle("paused", !STATE.listening);
if (label) label.textContent = STATE.statusLabel || (STATE.listening ? "监听中" : "已停止");
const listener = document.getElementById("listener");
if (listener) listener.title = STATE.listening ? "点击暂停监听" : "点击开始监听";
annotateEditableFields();
};
// 数字框只写着一个数,允许范围藏在 min/max 里,谁也看不见。补成 tooltip。
function annotateEditableFields(){
const main = document.getElementById("main");
if (!main) return;
main.querySelectorAll('input[type="number"]').forEach(el => {
const min = el.getAttribute("min"), max = el.getAttribute("max");
if (min === null || max === null) return;
const unit = (el.parentElement && el.parentElement.textContent || "")
.replace(/\s+/g, "").match(/(秒|轮|天|次|tokens|个)/);
const range = `可修改:${min} ~ ${max}${unit ? " " + unit[1] : ""}`;
if (!el.title) el.title = range;
if (!el.getAttribute("aria-label")) el.setAttribute("aria-label", range);
});
main.querySelectorAll("select").forEach(el => { if (!el.title) el.title = "点击选择"; });
main.querySelectorAll('input[type="range"]').forEach(el => { if (!el.title) el.title = "拖动调整"; });
}
window.applyState = function(payload){
const data = typeof payload === "string" ? JSON.parse(payload) : (payload || {});
const prev = STATE.view;
File diff suppressed because one or more lines are too long
+193 -47
View File
@@ -22,7 +22,7 @@
button{border:0;outline:none;-webkit-tap-highlight-color:transparent}
.sprite{position:absolute;width:0;height:0;overflow:hidden}
.ico{display:inline-block;width:21px;height:21px;fill:none;stroke:currentColor;stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round;vertical-align:middle;flex:0 0 auto;pointer-events:none}
#stage{position:absolute;left:50%;top:50%;width:1630px;height:965px;transform:translate(-50%,-50%) scale(var(--scale,1));transform-origin:center;border:1px solid rgba(112,140,203,.18);overflow:hidden;background:
#stage{position:absolute;left:0;top:0;width:1630px;min-height:965px;height:auto;display:flex;flex-direction:column;transform:scale(var(--scale,1));transform-origin:top left;border:1px solid rgba(112,140,203,.18);overflow:visible;background:
radial-gradient(circle at 72% 9%,rgba(126,214,255,.18),transparent 29%),
radial-gradient(circle at 96% 77%,rgba(145,115,255,.17),transparent 30%),
radial-gradient(circle at 23% 77%,rgba(93,236,216,.09),transparent 25%),
@@ -33,8 +33,8 @@
.titlebar strong{font-size:14px;letter-spacing:.02em}
.window-actions{margin-left:auto;display:flex;gap:31px;align-items:center;color:#1b263d;font:17px/1 Arial,sans-serif}
.window-actions span:nth-child(2){font-size:18px}
.workspace{height:920px;display:grid;grid-template-columns:112px minmax(0,1fr);gap:58px;padding:3px 36px 16px 24px}
.rail{height:902px;border:1px solid rgba(111,137,205,.16);border-radius:37px;background:rgba(255,255,255,.68);box-shadow:0 20px 48px rgba(76,97,162,.10),inset 0 1px 0 #fff;backdrop-filter:blur(24px);padding:30px 10px 17px;display:flex;flex-direction:column;align-items:center;position:relative;z-index:5;overflow:visible}
.workspace{flex:1 1 auto;min-height:920px;display:grid;grid-template-columns:112px minmax(0,1fr);gap:58px;padding:3px 36px 16px 24px}
.rail{height:100%;min-height:902px;border:1px solid rgba(111,137,205,.16);border-radius:37px;background:rgba(255,255,255,.68);box-shadow:0 20px 48px rgba(76,97,162,.10),inset 0 1px 0 #fff;backdrop-filter:blur(24px);padding:30px 10px 17px;display:flex;flex-direction:column;align-items:center;position:relative;z-index:5;overflow:visible}
.brand-logo{width:52px;height:52px;border-radius:14px;font-size:27px;margin-bottom:28px;box-shadow:0 13px 28px rgba(67,80,255,.33)}
.nav{display:flex;flex-direction:column;align-items:center;gap:7px;width:100%}
.nav-btn{position:relative;width:88px;height:71px;border-radius:24px;background:transparent;cursor:pointer;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;color:#40557e;transition:.2s ease;z-index:1;outline:none}
@@ -46,15 +46,15 @@
.nav-btn.active{width:127px;height:54px;margin:6px 0 8px;flex-direction:row;justify-content:flex-start;gap:7px;padding:2px 13px 2px 7px;color:#2259ee;background:linear-gradient(100deg,rgba(239,245,255,.95),rgba(251,248,255,.94));border:1px solid rgba(101,126,231,.13);box-shadow:0 12px 24px rgba(87,102,227,.15);z-index:3}
.nav-btn.active .nav-icon{width:50px;height:50px;flex:0 0 50px;color:#fff;background:radial-gradient(circle at 38% 27%,#6ae0ff 0 5%,#3c7dff 35%,#5d63ff 61%,#9669ff 82%);box-shadow:0 0 0 7px rgba(75,107,255,.08),0 8px 19px rgba(79,92,255,.34)}
.nav-btn.active>span{font-weight:650;color:#2556e9}
.listener{margin-top:auto;display:grid;place-items:center;gap:11px;color:#00a5b1;font-size:13px;font-weight:650}
.listener{margin-top:auto;display:grid;place-items:center;gap:11px;color:#00a5b1;font-size:13px;font-weight:650;cursor:pointer;padding:10px 6px;border-radius:16px;user-select:none;transition:background .18s}.listener:hover{background:rgba(0,165,177,.08)}.listener:active{background:rgba(0,165,177,.16)}.listener:focus-visible{outline:2px solid rgba(0,165,177,.55);outline-offset:2px}
.orb{width:61px;height:61px;border-radius:50%;position:relative;background:radial-gradient(circle at 38% 30%,#fff 0 5%,#8ee8ff 20%,#596aff 45%,#9a73ff 66%,rgba(62,217,228,.45) 75%);box-shadow:0 0 0 7px rgba(42,215,234,.13),0 0 28px rgba(72,106,255,.44)}
.orb:before,.orb:after{content:"";position:absolute;border-radius:50%;inset:8px;border:1px solid rgba(255,255,255,.72)}
.orb:after{inset:18px;background:radial-gradient(circle,#f8ffff 0 10%,rgba(255,255,255,.18) 65%,transparent);border:0}
.orb.paused{filter:grayscale(.7);opacity:.65;box-shadow:none}
.system-btn{width:52px;height:52px;border-radius:50%;display:grid;place-items:center;background:linear-gradient(145deg,rgba(255,255,255,.92),rgba(228,235,250,.78));box-shadow:0 7px 17px rgba(81,101,168,.08);cursor:pointer;color:#263b64;margin-top:27px}
.system-btn.active{color:#fff;background:linear-gradient(145deg,#33c9f5,#4c6aff 55%,#8b6cff);box-shadow:0 0 0 7px rgba(72,111,255,.09),0 8px 19px rgba(70,97,255,.3)}
.main{min-width:0;padding-top:24px;height:900px;overflow:hidden}
.screen{height:876px;animation:fade .23s ease both}
.main{min-width:0;padding-top:24px;min-height:900px;overflow:visible}
.screen{min-height:876px;overflow:visible;animation:fade .23s ease both}
@keyframes fade{from{opacity:0;transform:translateY(5px)}to{opacity:1;transform:none}}
.page-head{height:88px;display:flex;align-items:flex-start;justify-content:space-between;gap:18px}
.page-head h1{margin:0;color:var(--navy);font-size:34px;line-height:1.08;font-weight:720;letter-spacing:-.035em}
@@ -70,19 +70,19 @@
.led{width:12px;height:12px;border-radius:50%;background:var(--green);box-shadow:0 0 0 4px rgba(19,183,122,.09)}
.panel{border:1px solid var(--line);background:var(--glass);border-radius:24px;box-shadow:var(--shadow);backdrop-filter:blur(22px)}
.panel-pad{padding:18px 21px}
.panel-title{height:27px;display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:12px}
.panel-title{min-height:27px;display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:12px}
.panel-title h2{margin:0;color:var(--navy);font-size:18px;font-weight:700;letter-spacing:-.02em}
.panel-title small{color:var(--muted);font-size:12px}
.badge{height:28px;padding:0 12px;border-radius:15px;display:inline-flex;align-items:center;gap:6px;background:rgba(60,107,255,.075);color:#2c65f4;border:1px solid rgba(67,111,255,.08);font-size:12px;white-space:nowrap}
.badge.green{background:rgba(15,183,119,.08);color:#0ca56b}.badge.orange{background:rgba(255,151,26,.1);color:#ed8c00}.badge.red{background:rgba(255,77,85,.08);color:#ed4c52}
.wave-ribbon{height:96px;margin-bottom:20px;padding:0 25px;display:grid;grid-template-columns:1.3fr 1fr 1fr .85fr;align-items:center;position:relative;overflow:hidden}
.wave-ribbon{height:96px;margin-bottom:16px;padding:0 25px;display:grid;grid-template-columns:1.3fr 1fr 1fr .85fr;align-items:center;position:relative;overflow:hidden}
.wave-ribbon:after{content:"";position:absolute;left:15%;right:3%;top:28px;height:48px;opacity:.38;background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 700 55'%3E%3Cg fill='none' stroke-linecap='round'%3E%3Cpath d='M0 29 C45 3 83 50 128 26 S214 5 258 30 345 45 392 25 480 4 525 30 615 48 700 22' stroke='%237b83ff' stroke-width='1.1'/%3E%3Cpath d='M0 33 C54 50 90 7 145 29 S247 46 301 24 410 11 463 30 566 43 625 20 672 17 700 26' stroke='%233bcbea' stroke-width='1'/%3E%3Cpath d='M0 22 C50 12 82 42 126 27 S205 9 255 25 344 40 390 29 478 12 525 25 618 38 700 25' stroke='%23a78afa' stroke-width='.8'/%3E%3C/g%3E%3C/svg%3E") center/100% 100% no-repeat}
.metric{height:58px;position:relative;z-index:1;display:flex;align-items:center;gap:17px;padding:0 21px;border-right:1px solid rgba(110,135,197,.14)}
.metric:last-child{border:0}.metric:first-child{padding-left:0}
.metric-icon{width:54px;height:54px;border-radius:50%;display:grid;place-items:center;color:var(--blue);background:linear-gradient(145deg,rgba(236,245,255,.9),rgba(232,231,255,.68));box-shadow:0 8px 18px rgba(75,100,180,.07),inset 0 0 0 1px rgba(92,126,216,.08)}
.metric-icon .ico{width:28px;height:28px}.metric-icon.green{color:var(--green);background:rgba(228,249,241,.72)}.metric-icon.red{color:var(--red);background:rgba(255,235,238,.75)}.metric-icon.orange{color:var(--orange);background:rgba(255,243,228,.77)}
.metric-copy{display:grid;gap:1px}.metric-copy span{font-size:13px;color:#566589}.metric-copy strong{font-size:26px;line-height:1.05;color:#122653;font-weight:700}.metric-copy strong.green{color:var(--green)}.metric-copy strong.blue{color:#2f62f6}
.auto-grid{display:grid;grid-template-columns:322px 586px 462px;grid-template-rows:358px 130px;gap:14px;margin-bottom:20px}
.auto-grid{display:grid;grid-template-columns:minmax(0,322fr) minmax(0,586fr) minmax(0,462fr);grid-auto-rows:minmax(358px,auto);gap:14px;margin-bottom:20px}
.queue-card{grid-row:span 2}.task-card{grid-row:span 2}.journey-card{grid-column:3}.window-card{grid-column:3}
.queue-list{display:grid;gap:3px}.queue-row{height:71px;display:grid;grid-template-columns:50px minmax(0,1fr) 67px;align-items:center;gap:11px;padding:7px 11px;border-radius:21px;position:relative;cursor:pointer}
.queue-row+.queue-row{border-top:1px solid rgba(109,135,197,.10);border-radius:0}.queue-row.active{background:linear-gradient(95deg,rgba(241,246,255,.95),rgba(255,255,255,.7));border-radius:22px;box-shadow:inset 4px 0 #3776ff,0 8px 20px rgba(81,103,177,.05);border-top-color:transparent}
@@ -101,18 +101,21 @@
.j-step{height:45px;display:grid;grid-template-columns:36px 1fr 45px;align-items:center;gap:10px;position:relative;padding-right:8px}.j-step.active{height:48px;border-radius:17px;background:linear-gradient(90deg,rgba(70,112,255,.13),rgba(129,104,255,.09))}.j-dot{width:25px;height:25px;margin-left:5px;border-radius:50%;display:grid;place-items:center;color:#fff;background:var(--green);font-size:12px;position:relative;z-index:1;box-shadow:0 4px 10px rgba(18,177,118,.14)}
.j-step.active .j-dot{width:37px;height:37px;margin-left:-1px;background:radial-gradient(circle at 35% 28%,#7fe8ff,#4c62ff 54%,#8669ff);box-shadow:0 0 0 7px rgba(73,107,255,.09),0 0 20px rgba(70,95,255,.32);font-size:16px}.j-step.wait .j-dot{background:#e8edf6;color:#7d89a6;box-shadow:none}.j-copy strong{display:block;color:#253861;font-size:13px}.j-copy span{font-size:10px;color:#8391af}.j-step.active .j-copy strong,.j-step.active .j-copy span{color:#2b62f1}.j-time{font-size:11px;color:#7685a5;text-align:right}
.window-status{display:grid;grid-template-columns:repeat(5,1fr);gap:7px}.window-stat{height:72px;border-radius:17px;background:rgba(255,255,255,.58);border:1px solid rgba(109,137,203,.12);display:grid;place-items:center;align-content:center;gap:3px;text-align:center}.window-stat .ico{width:21px;height:21px;color:#263c68}.window-stat strong{font-size:10px;color:#2c3d65}.window-stat span{font-size:10px;color:#0aab71;line-height:1.3}
.activity-panel{height:145px;padding:15px 20px}.activity-panel .panel-title{margin-bottom:8px}.activity-strip{display:grid;grid-template-columns:repeat(4,1fr) 168px;gap:10px}.activity-card{height:82px;border-radius:19px;background:rgba(255,255,255,.62);border:1px solid rgba(111,137,201,.13);padding:11px 14px;display:grid;grid-template-columns:33px 1fr;grid-template-rows:auto auto;column-gap:10px;position:relative}.activity-icon{grid-row:1/3;width:31px;height:31px;border-radius:50%;display:grid;place-items:center;background:rgba(32,190,137,.09);color:#10ad76}.activity-icon.blue{color:#3c72ff;background:rgba(60,114,255,.09)}.activity-icon.orange{color:var(--orange);background:rgba(255,152,29,.10)}.activity-card time{font-size:11px;color:#7382a3}.activity-card strong{font-size:13px;color:#263960}.activity-card p{grid-column:2;margin:0;font-size:11px;color:#7281a0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.activity-state{position:absolute;right:12px;top:10px;font-size:10px;color:var(--green)}
.activity-panel{min-height:145px;padding:15px 20px}.activity-panel .panel-title{margin-bottom:8px}.activity-strip{display:grid;grid-template-columns:repeat(4,1fr) 168px;gap:10px}.activity-card{height:82px;border-radius:19px;background:rgba(255,255,255,.62);border:1px solid rgba(111,137,201,.13);padding:11px 14px;display:grid;grid-template-columns:33px 1fr;grid-template-rows:auto auto;column-gap:10px;position:relative}.activity-icon{grid-row:1/3;width:31px;height:31px;border-radius:50%;display:grid;place-items:center;background:rgba(32,190,137,.09);color:#10ad76}.activity-icon.blue{color:#3c72ff;background:rgba(60,114,255,.09)}.activity-icon.orange{color:var(--orange);background:rgba(255,152,29,.10)}.activity-card time{font-size:11px;color:#7382a3}.activity-card strong{font-size:13px;color:#263960}.activity-card p{grid-column:2;margin:0;font-size:11px;color:#7281a0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.activity-state{position:absolute;right:12px;top:10px;font-size:10px;color:var(--green)}
.activity-more{height:48px;align-self:center}
.tabs{height:58px;width:max-content;padding:5px;display:flex;align-items:center;gap:5px;border-radius:30px;background:rgba(255,255,255,.56);border:1px solid var(--line);box-shadow:var(--shadow);margin:-3px 0 18px}.tab{height:46px;padding:0 39px;border-radius:24px;background:transparent;cursor:pointer;color:#354871}.tab.active{background:linear-gradient(105deg,rgba(231,241,255,.95),rgba(239,235,255,.95));color:#225ff1;box-shadow:0 7px 17px rgba(80,101,180,.08)}
.filter-row{height:64px;padding:9px 14px;margin-bottom:18px;display:flex;align-items:center;gap:13px}.search{height:44px;width:295px;border-radius:23px;background:rgba(255,255,255,.56);border:1px solid rgba(112,139,203,.14);display:flex;align-items:center;gap:9px;padding:0 15px}.search input{border:0;outline:0;background:transparent;width:100%;font-size:13px}.filter-pill{height:44px;padding:0 26px;border-radius:23px;background:rgba(255,255,255,.57);border:1px solid rgba(110,138,201,.14);cursor:pointer}.filter-pill.active{color:#2863f3;background:linear-gradient(100deg,rgba(234,242,255,.93),rgba(242,239,255,.92));border-color:rgba(71,110,241,.14)}
.soft{border-radius:18px;background:rgba(255,255,255,.56);border:1px solid rgba(109,136,200,.13)}
.stack{display:grid;gap:12px}.row{display:flex;align-items:center;justify-content:space-between;gap:12px}.toolbar{display:flex;align-items:center;gap:9px;flex-wrap:wrap}
.queue-view-grid{display:grid;grid-template-columns:350px 714px 301px;gap:15px;height:506px;margin-bottom:18px}.queue-view-grid>.panel{height:506px}.queue-view-grid .queue-row{height:71px}.queue-filters{display:flex;gap:9px;margin-bottom:10px}.queue-filters .filter-pill{height:31px;padding:0 17px;font-size:12px}.detail-stats{display:grid;grid-template-columns:1.15fr 1fr 1fr .8fr;gap:12px;margin-bottom:14px}.detail-stat{height:64px;padding:10px 14px;border-radius:18px;background:rgba(255,255,255,.57);border:1px solid rgba(110,137,201,.13);display:grid;align-content:center;gap:4px}.detail-stat span{font-size:11px;color:#7080a2}.detail-stat b{font-size:14px;color:#21355f}.process-title{font-size:14px;color:#215fe9;font-weight:700;display:flex;gap:10px;align-items:center;margin:13px 0}.process-line{display:grid;grid-template-columns:repeat(6,1fr);position:relative;padding-top:6px}.process-line:before{content:"";position:absolute;top:22px;left:7%;right:7%;height:3px;background:linear-gradient(90deg,#26c188 0 55%,#8c72ff 72%,#e6ebf5 72%)}.process-step{text-align:center;position:relative;z-index:1}.process-dot{width:35px;height:35px;border-radius:50%;display:grid;place-items:center;margin:auto;background:#fff;border:1px solid rgba(102,132,206,.17);color:#7382a2}.process-step.done .process-dot{color:#fff;background:var(--green);box-shadow:0 0 0 7px rgba(17,181,119,.07)}.process-step.active .process-dot{width:45px;height:45px;margin-top:-5px;color:#fff;background:radial-gradient(circle at 35% 30%,#6be5ff,#4d61ff 56%,#8f6bff);box-shadow:0 0 0 8px rgba(74,105,255,.08),0 0 19px rgba(75,93,255,.31)}.process-step strong{display:block;font-size:12px;color:#253963;margin-top:9px}.process-step span{display:block;font-size:10px;color:#8190ad;margin-top:3px}.process-step.active strong,.process-step.active span{color:#2861f1}.side-stat{height:90px;padding:17px;border-radius:21px;background:rgba(255,255,255,.58);border:1px solid rgba(111,138,204,.13);display:flex;align-items:center;gap:13px}.side-stat .metric-icon{width:45px;height:45px}.side-stat span{font-size:12px;color:#6d7ca0}.side-stat b{display:block;font-size:15px;color:#243760;margin-top:3px}
.archive-grid{display:grid;grid-template-columns:333px 605px 437px;gap:14px;height:521px;margin-bottom:14px}.archive-grid>.panel{height:521px}.conversation-list .queue-row{height:70px}.chat{display:grid;gap:9px;padding:0 5px}.chat-line{display:flex;align-items:flex-end;gap:10px}.chat-line.ai{justify-content:flex-end}.mini-avatar{width:34px;height:34px;border-radius:50%;display:grid;place-items:center;background:rgba(108,127,178,.11);color:#66769b}.chat-line.ai .mini-avatar{order:2;color:#2e67f3;background:rgba(55,109,255,.10)}.chat-bubble{max-width:78%;padding:9px 15px;border-radius:16px;background:rgba(255,255,255,.65);border:1px solid rgba(108,136,200,.13);font-size:12px;color:#33466f}.chat-line.ai .chat-bubble{background:linear-gradient(110deg,rgba(239,245,255,.9),rgba(243,241,255,.86))}.chat-bubble time{display:block;font-size:10px;color:#8491ae;margin-bottom:3px}.memory-card{height:286px}.settle-card{height:221px}.tag{height:38px;padding:0 18px;border-radius:19px;display:inline-flex;align-items:center;background:rgba(19,184,123,.08);color:#12a66e;border:1px solid rgba(18,177,117,.09);font-size:13px}.tag.violet{background:rgba(133,105,255,.09);color:#7857e9}.tag.blue{background:rgba(48,108,255,.08);color:#2e64ec}.memory-copy{margin-top:14px;padding:18px;border-radius:19px;background:rgba(255,255,255,.58);border:1px solid rgba(110,138,200,.13);font-size:13px;line-height:1.8;color:#354972}.settle-row{height:56px;padding:8px 12px;display:grid;grid-template-columns:42px 1fr auto;gap:10px;align-items:center;border-radius:18px;background:rgba(255,255,255,.56);border:1px solid rgba(109,137,202,.12)}.settle-icon{width:36px;height:36px;border-radius:11px;display:grid;place-items:center;color:#fff;background:linear-gradient(145deg,#5bd3b1,#24ad7f)}.settle-row strong{font-size:13px;color:#2b3e67}.settle-row small{display:block;color:#8190ac;font-size:10px;margin-top:2px}.archive-bottom{height:153px}
.ai-top{display:grid;grid-template-columns:856px 536px;gap:14px;height:330px;margin-bottom:14px}.ai-bottom{display:grid;grid-template-columns:428px 428px 536px;gap:14px;height:244px;margin-bottom:14px}.ai-profile{display:grid;grid-template-columns:125px 390px 1fr;gap:18px;align-items:center}.ai-ball{width:108px;height:108px;border-radius:50%;display:grid;place-items:center;color:#fff;font-size:33px;font-weight:700;background:radial-gradient(circle at 36% 29%,#fff 0 4%,#82e2ff 18%,#4f67ff 48%,#946fff 67%,rgba(72,214,224,.34) 76%);box-shadow:0 0 0 11px rgba(79,119,255,.06),0 17px 32px rgba(82,95,212,.18)}.field{display:grid;gap:7px}.field label{font-size:13px;color:#34476e}.input,.select,.textarea{width:100%;border:1px solid rgba(108,136,201,.16);background:rgba(255,255,255,.63);border-radius:16px;outline:0;padding:10px 14px}.textarea{height:108px;resize:none;font-size:12px;line-height:1.7}.preview-box{height:205px;padding:18px;border-radius:22px;background:linear-gradient(140deg,rgba(255,255,255,.60),rgba(241,239,255,.68));border:1px solid rgba(108,136,201,.14)}.preview-box p{font-size:13px;line-height:1.75;color:#2f416c}.select.model{height:58px;border-radius:19px;color:#334fe9;font-size:18px;font-weight:650;background:linear-gradient(110deg,rgba(248,249,255,.92),rgba(241,238,255,.88));border-color:rgba(85,99,240,.19)}.form-grid{display:grid;grid-template-columns:1fr 1fr 1fr;gap:12px}.form-grid.two{grid-template-columns:1fr 1fr}.range{accent-color:#416fff;width:100%}.knowledge{display:grid;grid-template-columns:180px 1fr;gap:15px;align-items:center}.donut{width:148px;height:148px;border-radius:50%;background:conic-gradient(#5b7bff 0 34%,#55c9ee 34% 61%,#73dfcd 61% 78%,#e7eef8 78%);display:grid;place-items:center;position:relative;box-shadow:0 10px 26px rgba(73,110,196,.08)}.donut:before{content:"";position:absolute;inset:17px;border-radius:50%;background:rgba(255,255,255,.91)}.donut strong{position:relative;font-size:28px;color:#18305f;text-align:center}.donut small{display:block;font-size:10px;color:#7081a6;font-weight:500}.tool-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}.tool-card{height:145px;border-radius:20px;background:rgba(255,255,255,.57);border:1px solid rgba(110,138,202,.13);display:grid;place-items:center;align-content:center;gap:9px}.tool-icon{width:53px;height:53px;border-radius:50%;display:grid;place-items:center;color:#fff;background:linear-gradient(145deg,#5ed2b2,#20aa7d);box-shadow:0 7px 16px rgba(29,177,126,.15)}.tool-card:nth-child(2) .tool-icon{background:linear-gradient(145deg,#68bdff,#4169ff)}.tool-card:nth-child(3) .tool-icon{background:linear-gradient(145deg,#ac83ff,#7657e6)}.switch{width:44px;height:25px;border-radius:13px;background:#dfe6f2;position:relative;cursor:pointer;transition:.2s}.switch:after{content:"";position:absolute;width:19px;height:19px;top:3px;left:3px;border-radius:50%;background:#fff;box-shadow:0 2px 7px rgba(43,57,99,.19);transition:.2s}.switch.on{background:linear-gradient(90deg,#27c79a,#11ad73)}.switch.on:after{transform:translateX(19px)}.setting-line{height:51px;padding:0 15px;border-radius:18px;background:rgba(255,255,255,.57);border:1px solid rgba(109,137,201,.12);display:flex;align-items:center;justify-content:space-between;gap:10px}.config-strip{height:110px}
.automation-top{display:grid;grid-template-columns:880px 499px;gap:14px;height:278px;margin-bottom:14px}.automation-mid{display:grid;grid-template-columns:350px 361px 361px 293px;gap:14px;height:246px;margin-bottom:14px}.auto-flow{height:145px;display:grid;grid-template-columns:repeat(5,1fr);align-items:center;position:relative}.auto-flow:before{content:"";position:absolute;left:7%;right:7%;top:53px;height:3px;background:linear-gradient(90deg,#37b9ff,#776cff,#a06cf1);opacity:.42}.flow-step{position:relative;z-index:1;text-align:center}.flow-circle{width:58px;height:58px;border-radius:50%;margin:0 auto 10px;display:grid;place-items:center;color:#2d65f2;background:rgba(255,255,255,.87);border:1px solid rgba(91,126,214,.17);box-shadow:0 10px 21px rgba(72,94,163,.08)}.flow-step strong{display:block;color:#263960;font-size:14px}.flow-pill{height:44px;border:1px dashed rgba(80,127,229,.25);border-radius:22px;margin-top:10px;display:flex;align-items:center;justify-content:center;gap:10px;color:#52658e;font-size:12px}.wechat-graphic{display:grid;grid-template-columns:166px 1fr;gap:16px;align-items:center}.fake-window{height:152px;border-radius:18px;background:linear-gradient(#83aefa 0 25px,rgba(255,255,255,.78) 25px);border:1px solid rgba(100,138,215,.17);position:relative;overflow:hidden}.fake-window:before{content:"";position:absolute;left:14px;top:41px;width:27px;height:91px;border-radius:8px;background:#5792f2;box-shadow:41px 0 0 #eef2fb,81px 0 0 #f2f4fb}.fake-check{position:absolute;right:9px;bottom:9px;width:43px;height:43px;border-radius:50%;display:grid;place-items:center;color:#fff;background:var(--green)}.coexist{display:grid;grid-template-columns:1fr auto;gap:12px;align-items:center}.mouse-orb{height:100px;display:flex;align-items:flex-end;justify-content:center;gap:38px}.mouse-pointer{width:67px;height:67px;border-radius:50%;display:grid;place-items:center;font-size:35px;background:radial-gradient(circle at 35% 30%,#fff,#c8d4ff 38%,#7d73ff 70%);box-shadow:0 0 0 8px rgba(82,116,255,.07),0 0 23px rgba(73,99,255,.26)}.risk-tags{display:grid;gap:9px}.risk-tag{height:42px;padding:0 13px;border-radius:16px;background:rgba(247,244,255,.76);border:1px solid rgba(129,104,239,.13);display:flex;align-items:center;gap:9px;color:#7351e4}.check-strip{height:130px}
.logs-grid{display:grid;grid-template-columns:764px 616px;grid-template-rows:237px 141px;gap:14px;margin-bottom:14px}.event-flow{grid-row:span 2}.event-list{display:grid;gap:0}.event-row{height:59px;display:grid;grid-template-columns:34px 89px 52px 1fr 62px;gap:9px;align-items:center;border-bottom:1px solid rgba(110,136,199,.11)}.event-node{width:25px;height:25px;border-radius:50%;display:grid;place-items:center;background:#fff;color:var(--green);border:1px solid rgba(93,137,210,.14);box-shadow:0 5px 12px rgba(68,95,162,.07)}.event-row time{color:#68789d}.event-kind{width:42px;height:42px;border-radius:50%;display:grid;place-items:center;color:var(--green);background:rgba(19,182,119,.09)}.event-copy strong{display:block;color:#22365f;font-size:14px}.event-copy span{font-size:11px;color:#7785a4}.health-rings{display:grid;grid-template-columns:repeat(3,1fr);text-align:center}.health-ring{width:81px;height:81px;border-radius:50%;margin:auto;display:grid;place-items:center;color:var(--green);background:conic-gradient(#4bc7aa 0 84%,#e6eef7 84%);position:relative}.health-ring:before{content:"";position:absolute;inset:9px;border-radius:50%;background:rgba(255,255,255,.94)}.health-ring .ico{position:relative}.health-rings strong{display:block;font-size:12px;color:#263a63;margin-top:7px}.health-rings span{font-size:11px;color:var(--green)}.chain{display:grid;grid-template-columns:repeat(4,1fr);align-items:center;position:relative}.chain:before{content:"";position:absolute;left:11%;right:11%;top:29px;height:3px;background:linear-gradient(90deg,#45d5c2,#6480ff,#a36ff5);opacity:.35}.chain-step{text-align:center;position:relative;z-index:1}.chain-step .flow-circle{width:45px;height:45px;margin-bottom:4px}.chain-step strong{display:block;font-size:11px;color:#2d416a}.chain-step span{font-size:10px;color:#7484a6}.log-mid{display:grid;grid-template-columns:676px 704px;gap:14px;height:136px;margin-bottom:14px}.exception-grid{display:grid;grid-template-columns:repeat(3,1fr) 150px;gap:10px}.exception{height:75px;padding:12px;border-radius:19px;background:rgba(255,255,255,.58);border:1px solid rgba(110,137,201,.12);display:flex;align-items:center;gap:12px}.exception b{display:block;font-size:20px;color:#17305f}.recent-activity{height:139px}
.system-top,.system-mid{display:grid;grid-template-columns:457px 457px 464px;gap:14px;height:354px;margin-bottom:14px}.system-mid{height:244px}.system-line{height:48px;padding:0 15px;border-radius:19px;background:rgba(255,255,255,.57);border:1px solid rgba(109,137,201,.12);display:flex;align-items:center;gap:12px}.system-line>span:first-of-type{flex:1}.system-line .ico{color:#3267ed}.storage-grid{display:grid;grid-template-columns:180px 1fr;align-items:center}.storage-actions{display:flex;gap:8px;margin-top:15px}.notice-preview{height:91px;padding:12px;border-radius:18px;background:rgba(255,255,255,.58);border:1px solid rgba(108,137,201,.13);display:grid;grid-template-columns:42px 1fr auto;gap:10px;align-items:center}.maintenance{display:grid;grid-template-columns:1fr 1fr;gap:11px}.maint-card{height:91px;padding:14px;border-radius:19px;background:rgba(255,255,255,.58);border:1px solid rgba(109,137,201,.13);display:flex;align-items:center;gap:13px}.maint-card .metric-icon{width:48px;height:48px}.maint-card strong{display:block;font-size:13px;color:#263a64}.maint-card small{font-size:10px;color:#8190ac}.system-status{height:146px}
.queue-view-grid{display:grid;grid-template-columns:minmax(0,350fr) minmax(0,714fr) minmax(0,301fr);gap:15px;min-height:506px;margin-bottom:18px}.queue-view-grid>.panel{min-height:506px}.queue-view-grid .queue-row{height:71px}.queue-filters{display:flex;gap:9px;margin-bottom:10px}.queue-filters .filter-pill{height:31px;padding:0 17px;font-size:12px}.detail-stats{display:grid;grid-template-columns:1.15fr 1fr 1fr .8fr;gap:12px;margin-bottom:14px}.detail-stat{height:64px;padding:10px 14px;border-radius:18px;background:rgba(255,255,255,.57);border:1px solid rgba(110,137,201,.13);display:grid;align-content:center;gap:4px}.detail-stat span{font-size:11px;color:#7080a2}.detail-stat b{font-size:14px;color:#21355f}.process-title{font-size:14px;color:#215fe9;font-weight:700;display:flex;gap:10px;align-items:center;margin:13px 0}.process-line{display:grid;grid-template-columns:repeat(6,1fr);position:relative;padding-top:6px}.process-line:before{content:"";position:absolute;top:22px;left:7%;right:7%;height:3px;background:linear-gradient(90deg,#26c188 0 55%,#8c72ff 72%,#e6ebf5 72%)}.process-step{text-align:center;position:relative;z-index:1}.process-dot{width:35px;height:35px;border-radius:50%;display:grid;place-items:center;margin:auto;background:#fff;border:1px solid rgba(102,132,206,.17);color:#7382a2}.process-step.done .process-dot{color:#fff;background:var(--green);box-shadow:0 0 0 7px rgba(17,181,119,.07)}.process-step.active .process-dot{width:45px;height:45px;margin-top:-5px;color:#fff;background:radial-gradient(circle at 35% 30%,#6be5ff,#4d61ff 56%,#8f6bff);box-shadow:0 0 0 8px rgba(74,105,255,.08),0 0 19px rgba(75,93,255,.31)}.process-step strong{display:block;font-size:12px;color:#253963;margin-top:9px}.process-step span{display:block;font-size:10px;color:#8190ad;margin-top:3px}.process-step.active strong,.process-step.active span{color:#2861f1}.side-stat{height:90px;padding:17px;border-radius:21px;background:rgba(255,255,255,.58);border:1px solid rgba(111,138,204,.13);display:flex;align-items:center;gap:13px}.side-stat .metric-icon{width:45px;height:45px}.side-stat span{font-size:12px;color:#6d7ca0}.side-stat b{display:block;font-size:15px;color:#243760;margin-top:3px}
.archive-grid{display:grid;grid-template-columns:minmax(0,333fr) minmax(0,605fr) minmax(0,437fr);gap:14px;min-height:521px;margin-bottom:14px}.archive-grid>.panel{min-height:521px}.conversation-list .queue-row{height:70px}.chat{display:grid;gap:9px;padding:0 5px}.chat-line{display:flex;align-items:flex-end;gap:10px}.chat-line.ai{justify-content:flex-end}.mini-avatar{width:34px;height:34px;border-radius:50%;display:grid;place-items:center;background:rgba(108,127,178,.11);color:#66769b}.chat-line.ai .mini-avatar{order:2;color:#2e67f3;background:rgba(55,109,255,.10)}.chat-bubble{max-width:78%;padding:9px 15px;border-radius:16px;background:rgba(255,255,255,.65);border:1px solid rgba(108,136,200,.13);font-size:12px;color:#33466f}.chat-line.ai .chat-bubble{background:linear-gradient(110deg,rgba(239,245,255,.9),rgba(243,241,255,.86))}.chat-bubble time{display:block;font-size:10px;color:#8491ae;margin-bottom:3px}.memory-card{height:286px}.settle-card{height:221px}.tag{height:38px;padding:0 18px;border-radius:19px;display:inline-flex;align-items:center;background:rgba(19,184,123,.08);color:#12a66e;border:1px solid rgba(18,177,117,.09);font-size:13px}.tag.violet{background:rgba(133,105,255,.09);color:#7857e9}.tag.blue{background:rgba(48,108,255,.08);color:#2e64ec}.memory-copy{margin-top:14px;padding:18px;border-radius:19px;background:rgba(255,255,255,.58);border:1px solid rgba(110,138,200,.13);font-size:13px;line-height:1.8;color:#354972}.settle-row{height:56px;padding:8px 12px;display:grid;grid-template-columns:42px 1fr auto;gap:10px;align-items:center;border-radius:18px;background:rgba(255,255,255,.56);border:1px solid rgba(109,137,202,.12)}.settle-icon{width:36px;height:36px;border-radius:11px;display:grid;place-items:center;color:#fff;background:linear-gradient(145deg,#5bd3b1,#24ad7f)}.settle-row strong{font-size:13px;color:#2b3e67}.settle-row small{display:block;color:#8190ac;font-size:10px;margin-top:2px}.archive-bottom{min-height:153px}
.ai-top{display:grid;grid-template-columns:minmax(0,856fr) minmax(0,536fr);gap:14px;min-height:330px;margin-bottom:14px}.ai-bottom{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:14px;min-height:244px;margin-bottom:14px;align-items:start}
/* 这一排四块内容长短差很多(「发送模式」带一整段说明)。拉伸成等高时,
最高那块会被按行高摆布、内容顶出框外;按各自内容高度排,底边参差一点,
但没有一个字会画到框外。 */.ai-profile{display:grid;grid-template-columns:125px 390px 1fr;gap:18px;align-items:center}.ai-ball{width:108px;height:108px;border-radius:50%;display:grid;place-items:center;color:#fff;font-size:33px;font-weight:700;background:radial-gradient(circle at 36% 29%,#fff 0 4%,#82e2ff 18%,#4f67ff 48%,#946fff 67%,rgba(72,214,224,.34) 76%);box-shadow:0 0 0 11px rgba(79,119,255,.06),0 17px 32px rgba(82,95,212,.18)}.field{display:grid;gap:7px}.field label{font-size:13px;color:#34476e}.input,.select,.textarea{width:100%;border:1px solid rgba(108,136,201,.16);background:rgba(255,255,255,.63);border-radius:16px;outline:0;padding:10px 14px}.textarea{height:108px;resize:none;font-size:12px;line-height:1.7}.preview-box{height:205px;padding:18px;border-radius:22px;background:linear-gradient(140deg,rgba(255,255,255,.60),rgba(241,239,255,.68));border:1px solid rgba(108,136,201,.14)}.preview-box p{font-size:13px;line-height:1.75;color:#2f416c}.select.model{height:58px;border-radius:19px;color:#334fe9;font-size:18px;font-weight:650;background:linear-gradient(110deg,rgba(248,249,255,.92),rgba(241,238,255,.88));border-color:rgba(85,99,240,.19)}.form-grid{display:grid;grid-template-columns:1fr 1fr 1fr;gap:12px}.form-grid.two{grid-template-columns:1fr 1fr}.range{accent-color:#416fff;width:100%}.knowledge{display:grid;grid-template-columns:180px 1fr;gap:15px;align-items:center}.donut{width:148px;height:148px;border-radius:50%;background:conic-gradient(#5b7bff 0 34%,#55c9ee 34% 61%,#73dfcd 61% 78%,#e7eef8 78%);display:grid;place-items:center;position:relative;box-shadow:0 10px 26px rgba(73,110,196,.08)}.donut:before{content:"";position:absolute;inset:17px;border-radius:50%;background:rgba(255,255,255,.91)}.donut strong{position:relative;font-size:28px;color:#18305f;text-align:center}.donut small{display:block;font-size:10px;color:#7081a6;font-weight:500}.tool-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}.tool-card{height:145px;border-radius:20px;background:rgba(255,255,255,.57);border:1px solid rgba(110,138,202,.13);display:grid;place-items:center;align-content:center;gap:9px}.tool-icon{width:53px;height:53px;border-radius:50%;display:grid;place-items:center;color:#fff;background:linear-gradient(145deg,#5ed2b2,#20aa7d);box-shadow:0 7px 16px rgba(29,177,126,.15)}.tool-card:nth-child(2) .tool-icon{background:linear-gradient(145deg,#68bdff,#4169ff)}.tool-card:nth-child(3) .tool-icon{background:linear-gradient(145deg,#ac83ff,#7657e6)}.switch{width:44px;height:25px;border-radius:13px;background:#dfe6f2;position:relative;cursor:pointer;transition:.2s}.switch:after{content:"";position:absolute;width:19px;height:19px;top:3px;left:3px;border-radius:50%;background:#fff;box-shadow:0 2px 7px rgba(43,57,99,.19);transition:.2s}.switch.on{background:linear-gradient(90deg,#27c79a,#11ad73)}.switch.on:after{transform:translateX(19px)}.setting-line{height:51px;padding:0 15px;border-radius:18px;background:rgba(255,255,255,.57);border:1px solid rgba(109,137,201,.12);display:flex;align-items:center;justify-content:space-between;gap:10px}.config-strip{min-height:110px}
.automation-top{display:grid;grid-template-columns:minmax(0,880fr) minmax(0,499fr);gap:14px;min-height:278px;margin-bottom:14px}.automation-mid{display:grid;grid-template-columns:minmax(0,350fr) minmax(0,361fr) minmax(0,361fr) minmax(0,293fr);gap:14px;min-height:246px;margin-bottom:14px}.auto-flow{height:145px;display:grid;grid-template-columns:repeat(5,1fr);align-items:center;position:relative}.auto-flow:before{content:"";position:absolute;left:7%;right:7%;top:53px;height:3px;background:linear-gradient(90deg,#37b9ff,#776cff,#a06cf1);opacity:.42}.flow-step{position:relative;z-index:1;text-align:center}.flow-circle{width:58px;height:58px;border-radius:50%;margin:0 auto 10px;display:grid;place-items:center;color:#2d65f2;background:rgba(255,255,255,.87);border:1px solid rgba(91,126,214,.17);box-shadow:0 10px 21px rgba(72,94,163,.08)}.flow-step strong{display:block;color:#263960;font-size:14px}.flow-pill{height:44px;border:1px dashed rgba(80,127,229,.25);border-radius:22px;margin-top:10px;display:flex;align-items:center;justify-content:center;gap:10px;color:#52658e;font-size:12px}.wechat-graphic{display:grid;grid-template-columns:166px 1fr;gap:16px;align-items:center}.fake-window{height:152px;border-radius:18px;background:linear-gradient(#83aefa 0 25px,rgba(255,255,255,.78) 25px);border:1px solid rgba(100,138,215,.17);position:relative;overflow:hidden}.fake-window:before{content:"";position:absolute;left:14px;top:41px;width:27px;height:91px;border-radius:8px;background:#5792f2;box-shadow:41px 0 0 #eef2fb,81px 0 0 #f2f4fb}.fake-check{position:absolute;right:9px;bottom:9px;width:43px;height:43px;border-radius:50%;display:grid;place-items:center;color:#fff;background:var(--green)}.coexist{display:grid;grid-template-columns:1fr auto;gap:12px;align-items:center}.mouse-orb{height:100px;display:flex;align-items:flex-end;justify-content:center;gap:38px}.mouse-pointer{width:67px;height:67px;border-radius:50%;display:grid;place-items:center;font-size:35px;background:radial-gradient(circle at 35% 30%,#fff,#c8d4ff 38%,#7d73ff 70%);box-shadow:0 0 0 8px rgba(82,116,255,.07),0 0 23px rgba(73,99,255,.26)}.risk-tags{display:grid;gap:9px}.risk-tag{height:42px;padding:0 13px;border-radius:16px;background:rgba(247,244,255,.76);border:1px solid rgba(129,104,239,.13);display:flex;align-items:center;gap:9px;color:#7351e4}.check-strip{min-height:130px}
.logs-grid{display:grid;grid-template-columns:minmax(0,764fr) minmax(0,616fr);grid-auto-rows:minmax(226px,auto);gap:14px;margin-bottom:14px}.event-flow{grid-row:span 2}.event-list{display:grid;gap:0}.event-row{height:59px;display:grid;grid-template-columns:34px 89px 52px 1fr 62px;gap:9px;align-items:center;border-bottom:1px solid rgba(110,136,199,.11)}.event-node{width:25px;height:25px;border-radius:50%;display:grid;place-items:center;background:#fff;color:var(--green);border:1px solid rgba(93,137,210,.14);box-shadow:0 5px 12px rgba(68,95,162,.07)}.event-row time{color:#68789d}.event-kind{width:42px;height:42px;border-radius:50%;display:grid;place-items:center;color:var(--green);background:rgba(19,182,119,.09)}.event-copy strong{display:block;color:#22365f;font-size:14px}.event-copy span{font-size:11px;color:#7785a4}.health-rings{display:grid;grid-template-columns:repeat(3,1fr);text-align:center}.health-ring{width:81px;height:81px;border-radius:50%;margin:auto;display:grid;place-items:center;color:var(--green);background:conic-gradient(#4bc7aa 0 84%,#e6eef7 84%);position:relative}.health-ring:before{content:"";position:absolute;inset:9px;border-radius:50%;background:rgba(255,255,255,.94)}.health-ring .ico{position:relative}.health-rings strong{display:block;font-size:12px;color:#263a63;margin-top:7px}.health-rings span{font-size:11px;color:var(--green)}.chain{display:grid;grid-template-columns:repeat(4,1fr);align-items:center;position:relative}.chain:before{content:"";position:absolute;left:11%;right:11%;top:29px;height:3px;background:linear-gradient(90deg,#45d5c2,#6480ff,#a36ff5);opacity:.35}.chain-step{text-align:center;position:relative;z-index:1}.chain-step .flow-circle{width:45px;height:45px;margin-bottom:4px}.chain-step strong{display:block;font-size:11px;color:#2d416a}.chain-step span{font-size:10px;color:#7484a6}.log-mid{display:grid;grid-template-columns:minmax(0,676fr) minmax(0,704fr);gap:14px;min-height:136px;margin-bottom:14px}.exception-grid{display:grid;grid-template-columns:repeat(3,1fr) 150px;gap:10px}.exception{height:75px;padding:12px;border-radius:19px;background:rgba(255,255,255,.58);border:1px solid rgba(110,137,201,.12);display:flex;align-items:center;gap:12px}.exception b{display:block;font-size:20px;color:#17305f}.recent-activity{min-height:139px}
.system-top,.system-mid{display:grid;grid-template-columns:minmax(0,457fr) minmax(0,457fr) minmax(0,464fr);gap:14px;min-height:354px;margin-bottom:14px}.system-mid{min-height:244px}.system-line{height:48px;padding:0 15px;border-radius:19px;background:rgba(255,255,255,.57);border:1px solid rgba(109,137,201,.12);display:flex;align-items:center;gap:12px}.system-line>span:first-of-type{flex:1}.system-line .ico{color:#3267ed}.storage-grid{display:grid;grid-template-columns:180px 1fr;align-items:center}.storage-actions{display:flex;gap:8px;margin-top:15px}.notice-preview{height:91px;padding:12px;border-radius:18px;background:rgba(255,255,255,.58);border:1px solid rgba(108,137,201,.13);display:grid;grid-template-columns:42px 1fr auto;gap:10px;align-items:center}.maintenance{display:grid;grid-template-columns:1fr 1fr;gap:11px}.maint-card{height:91px;padding:14px;border-radius:19px;background:rgba(255,255,255,.58);border:1px solid rgba(109,137,201,.13);display:flex;align-items:center;gap:13px}.maint-card .metric-icon{width:48px;height:48px}.maint-card strong{display:block;font-size:13px;color:#263a64}.maint-card small{font-size:10px;color:#8190ac}.system-status{min-height:146px}
.status-cells{display:grid;grid-template-columns:repeat(4,1fr);gap:0}.status-cell{height:74px;display:grid;grid-template-columns:51px 1fr;gap:12px;align-items:center;padding:5px 25px;border-right:1px solid rgba(109,136,199,.13)}.status-cell:last-child{border:0}.status-cell .metric-icon{width:48px;height:48px;color:var(--green)}.status-cell strong{display:block;font-size:13px;color:#253962}.status-cell span{font-size:10px;color:#7988a7}
.toast{position:absolute;right:32px;bottom:26px;z-index:100;padding:13px 20px;border-radius:18px;background:rgba(30,43,79,.92);color:#fff;box-shadow:0 17px 34px rgba(30,42,79,.24);opacity:0;transform:translateY(15px);transition:.22s;pointer-events:none}.toast.show{opacity:1;transform:none}
html.embedded .titlebar{display:none}
@@ -123,21 +126,21 @@
transform-origin:top left;
border:none;box-shadow:none;
}
html.embedded .workspace{height:920px}
html.embedded .screen{animation:none}
/* Qt WebEngine can drop an entire composited surface while rebuilding
several viewport-sized backdrop filters at a fractional DPI scale.
Keep the exact panel geometry, translucent fill, border and shadow, but
render the embedded panels on the normal page surface so the rail and
lower content cannot disappear during navigation or window restore. */
html.embedded .panel{-webkit-backdrop-filter:none;backdrop-filter:none}
/* QWebEngine: keep the reference end states, but avoid animating nav
width/height/margins inside the blurred rail. Those layout transitions
repeatedly invalidate the rail's backdrop layer during page switches. */
html.embedded .rail{-webkit-backdrop-filter:none;backdrop-filter:none}
html.embedded .nav-btn,html.embedded .nav-icon{transition:none}
html.embedded .nav-btn:hover .nav-icon{transform:none}
html.embedded body{background:#f4f8ff;overflow:hidden}
html.embedded .workspace{min-height:920px}
html.embedded .screen{animation:none}
/* Qt WebEngine can drop an entire composited surface while rebuilding
several viewport-sized backdrop filters at a fractional DPI scale.
Keep the exact panel geometry, translucent fill, border and shadow, but
render the embedded panels on the normal page surface so the rail and
lower content cannot disappear during navigation or window restore. */
html.embedded .panel{-webkit-backdrop-filter:none;backdrop-filter:none}
/* QWebEngine: keep the reference end states, but avoid animating nav
width/height/margins inside the blurred rail. Those layout transitions
repeatedly invalidate the rail's backdrop layer during page switches. */
html.embedded .rail{-webkit-backdrop-filter:none;backdrop-filter:none}
html.embedded .nav-btn,html.embedded .nav-icon{transition:none}
html.embedded .nav-btn:hover .nav-icon{transform:none}
html.embedded body{background:#f4f8ff;overflow:hidden}
html.embedded .empty-board{height:240px;display:grid;place-items:center;text-align:center;color:var(--muted);padding:24px}
button:focus,button:focus-visible,.nav-btn:focus,.nav-btn:focus-visible,.system-btn:focus,.btn:focus,.tab:focus,.filter-pill:focus,.icon-btn:focus,.round-btn:focus{
outline:none !important;
@@ -148,21 +151,164 @@
.system-line select{border:0;background:transparent;color:#26365F;outline:0;min-width:88px}
.ai-pane[hidden]{display:none !important}
.toolbar .icon-btn{width:32px;height:32px;border:0;border-radius:10px;display:grid;place-items:center;cursor:pointer;color:#5c6d94;background:transparent;padding:0}
.toolbar .icon-btn:hover{background:rgba(80,110,210,.08);color:#2b62f1}
.select.action{cursor:pointer;text-align:left}
.automation-top .flow-pill .num{width:34px;padding:0;border:0;background:transparent;color:#2d65f0;font-weight:700;text-align:center;outline:0;appearance:textfield}
.automation-top .flow-pill.live-flow-pill{gap:5px}.automation-top .flow-pill.live-flow-pill .num{width:25px}
.automation-top .flow-pill .num::-webkit-inner-spin-button,.automation-top .flow-pill .num::-webkit-outer-spin-button,.automation-mid .idle-num::-webkit-inner-spin-button,.automation-mid .idle-num::-webkit-outer-spin-button,.automation-mid .ai-num::-webkit-inner-spin-button,.automation-mid .ai-num::-webkit-outer-spin-button{appearance:none;margin:0}
.automation-mid .idle-num{width:38px;padding:0;border:0;background:transparent;color:#2562ed;font-weight:700;text-align:center;outline:0;appearance:textfield}
.automation-mid .ai-num{width:25px;padding:0;border:0;background:transparent;color:#2d65f0;font-weight:700;text-align:center;outline:0;appearance:textfield}
.fake-check.off{background:#9aa8c5}
.health-ring.bad{color:var(--red);background:conic-gradient(#ff7b80 0 84%,#e6eef7 84%)}
.system-security-state{white-space:nowrap}.system-security-state.on{color:var(--green)}.system-security-state.off{color:var(--red)}
.system-top .retention-control{height:39px;min-width:99px;padding:0 13px;gap:4px}
.system-top .retention-control .retain-num{width:32px;padding:0;border:0;background:transparent;text-align:right;outline:0;appearance:textfield}
.system-top .retention-control .retain-num::-webkit-inner-spin-button,.system-top .retention-control .retain-num::-webkit-outer-spin-button{appearance:none;margin:0}
.maintenance .maint-card[data-action]{cursor:pointer}
</style>
.toolbar .icon-btn:hover{background:rgba(80,110,210,.08);color:#2b62f1}
.select.action{cursor:pointer;text-align:left}
.automation-top .flow-pill .num{width:34px;padding:0;border:0;background:transparent;color:#2d65f0;font-weight:700;text-align:center;outline:0;appearance:textfield}
.automation-top .flow-pill.live-flow-pill{gap:5px}.automation-top .flow-pill.live-flow-pill .num{width:25px}
.automation-top .flow-pill .num::-webkit-inner-spin-button,.automation-top .flow-pill .num::-webkit-outer-spin-button,.automation-mid .idle-num::-webkit-inner-spin-button,.automation-mid .idle-num::-webkit-outer-spin-button,.automation-mid .ai-num::-webkit-inner-spin-button,.automation-mid .ai-num::-webkit-outer-spin-button{appearance:none;margin:0}
.automation-mid .idle-num{width:38px;padding:0;border:0;background:transparent;color:#2562ed;font-weight:700;text-align:center;outline:0;appearance:textfield}
.automation-mid .ai-num{width:25px;padding:0;border:0;background:transparent;color:#2d65f0;font-weight:700;text-align:center;outline:0;appearance:textfield}
.fake-check.off{background:#9aa8c5}
.health-ring.bad{color:var(--red);background:conic-gradient(#ff7b80 0 84%,#e6eef7 84%)}
.system-security-state{white-space:nowrap}.system-security-state.on{color:var(--green)}.system-security-state.off{color:var(--red)}
.system-top .retention-control{height:39px;min-width:99px;padding:0 13px;gap:4px}
.system-top .retention-control .retain-num{width:32px;padding:0;border:0;background:transparent;text-align:right;outline:0;appearance:textfield}
.system-top .retention-control .retain-num::-webkit-inner-spin-button,.system-top .retention-control .retain-num::-webkit-outer-spin-button{appearance:none;margin:0}
.maintenance .maint-card[data-action]{cursor:pointer}
/* 由后台下发、本机只读的开关:看得见状态,点不动。
做成禁用样式而不是直接藏起来——藏了的话,人会以为这个能力没有;
显示成锁定的,才说得清"有这个能力,但不在这儿配"。 */
.switch.switch-locked{opacity:.55;cursor:not-allowed;pointer-events:none}
/* 审核模式的说明条:告诉人现在为什么没自动发出去,以及怎么放行 */
.review-hint{margin-top:10px;display:flex;align-items:flex-start;gap:8px;
padding:10px 12px;border-radius:10px;line-height:1.6;font-size:12.5px;
color:#8a5a10;background:rgba(255,166,42,.09);border:1px solid rgba(255,166,42,.24)}
.review-hint svg{flex:none;width:15px;height:15px;margin-top:2px}
.review-hint b{color:#6f4708}
/* ── 面板收口 ─────────────────────────────────────────────────────
舞台是写死的 1630×965 再整体缩放,所以每块面板的高度也都是写死的。
写死高度本身没问题,问题是没有一处做收口:面板里一旦装进比设计稿更多
的真实数据(8 个会话、16 条消息、更长的知识库卡片),多出来的部分不会
被裁掉,而是原样画到下面那块面板身上——看上去就是"布局全乱了"。
这里统一兜住:固定高度的容器自己裁剪,真正会变长的那几块改成内部滚动。 */
.queue-view-grid>*,.archive-grid>*,.ai-top>*,.ai-bottom>*,
.automation-top>*,.automation-mid>*,.log-mid>*,.system-mid>*,
.system-top>*,.logs-grid>*,.ai-grid>*{min-height:0}
/* 兜底:任何固定高度的面板都不许把内容画到外面 */
.ai-top>.panel,.ai-bottom>.panel,.automation-top>.panel,
.automation-mid>.panel,.log-mid>.panel,.system-mid>.panel,
.system-top>.panel,.logs-grid>.panel,.queue-view-grid>.panel,
.archive-grid>.panel{overflow:visible}
/* 列表型面板:标题和页脚钉住,中间那段自己滚 */
.archive-grid>.panel,.queue-view-grid>.panel,
.logs-grid>.panel.event-flow,.memory-card,.settle-card{
display:flex;flex-direction:column;overflow:visible}
.archive-grid>.panel>*,.queue-view-grid>.panel>*,
.logs-grid>.panel.event-flow>*,.memory-card>*,.settle-card>*{flex:0 0 auto}
.archive-grid>.panel>.queue-list,
.archive-grid>.panel>.chat,
.queue-view-grid>.panel>.queue-list,
.queue-view-grid>.panel>.stack,
.logs-grid>.panel.event-flow>.event-list,
.memory-card>.memory-copy,
.settle-card>.stack{flex:1 1 auto;min-height:0;overflow:visible}
/* 活动条:设计稿按 4 张卡排的,真实数据来 6 条就换行、把面板顶穿。
改成永远一行,多的横向滚——面板高度是写死的,换行必然溢出。 */
.activity-panel,.archive-bottom{display:flex;flex-direction:column;overflow:visible;
padding:12px 20px 10px}
.activity-panel>.panel-title,.archive-bottom>.panel-title{flex:0 0 auto}
.activity-panel>.activity-strip,.archive-bottom>.activity-strip{
flex:1 1 auto;min-height:0;
grid-template-columns:none;grid-auto-flow:column;grid-auto-columns:278px;
align-content:start;overflow:visible}
/* 底部状态条:4 个 74px 的格子塞进 108px 的面板,差 23px。
压缩这条的内边距和标题间距把它让出来,不动格子本身的尺寸。 */
.config-strip,.check-strip,.system-status{padding:8px 21px 10px}
.config-strip>.panel-title,.check-strip>.panel-title,
.system-status>.panel-title{margin-bottom:4px}
.config-strip,.check-strip,.system-status{overflow:visible}
/* 按钮"处理中"态:点下去必须看得出来收到了。
没有这个的话,慢一点的保存就是一片安静,人只会以为按钮坏了、反复点。 */
.btn.is-busy{opacity:.72;cursor:progress;pointer-events:none}
.btn.is-busy .ico{animation:spin .9s linear infinite;transform-origin:50% 50%}
@keyframes spin{to{transform:rotate(360deg)}}
/* 数值文字按 1.05 行高排版,下缘会被裁掉一点 */
.metric-copy{min-height:0}
.metric-copy strong{line-height:1.18}
/* ── 可输入的地方要看得出来能输入 ───────────────────────────────
这几个数字原来是 border:0;background:transparent;outline:none——跟旁边
的粗体蓝字长得一模一样。没人知道它能改,点进去也没有任何反馈,改完更
不知道有没有生效。统一给一层轻量的"可编辑"外观:静止时一圈浅边框暗示
可改,悬停浮起底色,聚焦亮出蓝色光环。 */
.flow-pill .num,.idle-num,.retain-num,.ai-num,
.automation-top .flow-pill .num,.automation-mid .idle-num,
.automation-mid .ai-num,.system-top .retention-control .retain-num{
box-sizing:border-box;appearance:textfield;
height:30px;padding:0 8px;margin:0 3px;
border:1px solid rgba(90,126,214,.26);border-radius:10px;
background:rgba(255,255,255,.92);
box-shadow:inset 0 1px 2px rgba(76,102,168,.07);
color:#2d65f0;font-weight:700;text-align:center;cursor:text;
transition:border-color .16s,box-shadow .16s,background .16s}
/* 实时版把这几个框压到了 25px:套上边框和内边距后只剩 7px 放数字,
"300" 根本显示不全。按框的实际用途给回够用的宽度。 */
.automation-top .flow-pill .num,
.automation-top .flow-pill.live-flow-pill .num{width:62px}
.automation-mid .idle-num{width:60px}
.automation-mid .ai-num{width:50px}
.system-top .retention-control .retain-num{width:58px;text-align:center}
.ai-num.select,.select.ai-num{width:auto;min-width:96px}
/* 悬停 / 聚焦。这里必须写全限定选择器:上面那几条内联数字框的规则用了
三层类名,权重比 `.screen input:focus` 高,简写会被它们直接压掉——表现
就是点进去毫无反应,跟没做一样。 */
.flow-pill .num:hover,.idle-num:hover,.retain-num:hover,.ai-num:hover,
.automation-top .flow-pill .num:hover,
.automation-top .flow-pill.live-flow-pill .num:hover,
.automation-mid .idle-num:hover,.automation-mid .ai-num:hover,
.system-top .retention-control .retain-num:hover,
.input:hover,.select:hover,.textarea:hover,.system-line select:hover{
border-color:rgba(75,123,245,.5);background:#fff}
/* 聚焦:所有可输入控件统一的蓝色光环。原来一律 outline:0 又没给替代,
用键盘 Tab 过去时完全看不出焦点落在哪一格。 */
.screen input:focus,.screen select:focus,.screen textarea:focus,
.flow-pill .num:focus,.idle-num:focus,.retain-num:focus,.ai-num:focus,
.automation-top .flow-pill .num:focus,
.automation-top .flow-pill.live-flow-pill .num:focus,
.automation-mid .idle-num:focus,.automation-mid .ai-num:focus,
.system-top .retention-control .retain-num:focus{
border-color:#4b7bf5;background:#fff;
box-shadow:0 0 0 3px rgba(75,123,245,.2)}
.search:focus-within{border-color:#4b7bf5;
box-shadow:0 0 0 3px rgba(75,123,245,.15)}
/* 系统设置里两个下拉是裸 select,用的浏览器默认样式,和整体完全不搭 */
.system-line select{margin-left:auto;min-width:132px;height:34px;
padding:0 12px;border-radius:14px;cursor:pointer;
border:1px solid rgba(108,136,201,.22);
background:rgba(255,255,255,.78);color:#34476e;
transition:border-color .16s,box-shadow .16s,background .16s}
/* 只读的地方要看得出来"不能改",别让人白点 */
.textarea[readonly],.input[readonly]{
background:rgba(242,246,253,.86);color:#5c6c8e;cursor:default;
box-shadow:none}
.textarea[readonly]:hover,.input[readonly]:hover{
border-color:rgba(108,136,201,.16)}
/* 下拉一律手型:它是"点开选",不是"打字填" */
.screen select,.select{cursor:pointer}
/* 滑块也要有手感 */
.range{cursor:pointer}
/* 细滚动条,不破坏观感 */
.screen ::-webkit-scrollbar{width:6px;height:6px}
.screen ::-webkit-scrollbar-track{background:transparent}
.screen ::-webkit-scrollbar-thumb{background:rgba(109,137,201,.26);border-radius:3px}
.screen ::-webkit-scrollbar-thumb:hover{background:rgba(109,137,201,.44)}
</style>
</head>
<body>
<svg class="sprite" aria-hidden="true">
@@ -230,7 +376,7 @@
<button class="nav-btn" data-view="automation"><span class="nav-icon"><svg class="ico"><use href="#i-settings"/></svg></span><span>自动化设置</span></button>
<button class="nav-btn" data-view="logs"><span class="nav-icon"><svg class="ico"><use href="#i-log"/></svg></span><span>运行日志</span></button>
</nav>
<div class="listener"><div class="orb paused" id="orb"></div><span id="orb-label">已停止</span></div>
<div class="listener" id="listener" data-action="toggle-listen" role="button" tabindex="0" title="点击开始监听"><div class="orb paused" id="orb"></div><span id="orb-label">已停止</span></div>
<button class="system-btn" data-view="system" aria-label="系统设置"><svg class="ico"><use href="#i-settings"/></svg></button>
</aside>
<main class="main" id="main"></main>