/* ===== 基础（登录页沿用 + 管理端框架移植自 docs/UI设计_管理端.html）===== */
:root {
    --gd-primary: #1B5BD7;
    --gd-primary-deep: #0F3FA8;
    --gd-primary-light: #2E6BE6;
    --gd-bg: #F5F7FA;
    --gd-card: #FFFFFF;
    --gd-text: #1F2329;
    --gd-text-sub: #5F6470;
    --gd-border: #E5E8EF;
    --gd-green: #00B42A;
    --gd-orange: #FF7D00;
    --gd-red: #F53F3F;
    --gd-gray: #86909C;
    --gd-soft: #EEF2F7;
    --gd-sh: 0 2px 10px rgba(15, 63, 168, .06);
    --gd-shh: 0 8px 24px rgba(15, 63, 168, .14);
    --gd-r: 12px;
}

* { box-sizing: border-box; }

html, body { height: 100%; margin: 0; }

body {
    font-family: "Source Han Sans SC", "思源黑体", "Microsoft YaHei", -apple-system, sans-serif;
    font-size: 14px;
    color: var(--gd-text);
    background: var(--gd-bg);
}

a { color: var(--gd-primary); text-decoration: none; }
a:hover { color: var(--gd-primary-light); }

/* ===== 管理端框架：左深色侧栏 + 右主区（原型 .app/.side/.main/.top）===== */
.app { display: flex; height: 100vh; }

.side {
    width: 212px;
    background: linear-gradient(180deg, var(--gd-primary-deep), #0A2C73 70%, #082252);
    color: #C9D6F2;
    display: flex;
    flex-direction: column;
    flex-shrink: 0;
    transition: width .25s ease;
}

.logo { padding: 22px 20px 16px; display: flex; align-items: center; gap: 10px; cursor: default; user-select: none; }
.logo .mark {
    width: 34px; height: 34px; border-radius: 9px;
    background: linear-gradient(135deg, var(--gd-primary-light), #5B8DEF);
    display: flex; align-items: center; justify-content: center;
    font-weight: 700; color: #fff; font-size: 16px;
    box-shadow: 0 4px 10px rgba(46, 107, 230, .4);
}
.logo b { color: #fff; font-size: 16px; }
.logo small { display: block; font-size: 11px; color: #8FA6D8; margin-top: 2px; }
.logo > div:last-child { white-space: nowrap; }

.nav { flex: 1; padding: 6px 12px; overflow-y: auto; }
.nav a {
    display: flex; align-items: center; gap: 11px;
    padding: 10px 12px; border-radius: 9px;
    color: #C9D6F2; font-size: 14px; margin-bottom: 2px;
    transition: all .18s; cursor: pointer;
    position: relative; flex-wrap: nowrap;
}
.nav a:hover { background: rgba(255, 255, 255, .08); color: #fff; transform: translateX(3px); }
.nav a.on { background: linear-gradient(90deg, var(--gd-primary-light), rgba(46, 107, 230, .25)); color: #fff; box-shadow: 0 4px 12px rgba(46, 107, 230, .35); }
.nav a span, .nav .gt > span { white-space: nowrap; }
.nav a i, .nav .gt i { font-style: normal; flex-shrink: 0; width: 20px; text-align: center; display: inline-block; }
.nav a .bdg {
    margin-left: auto; background: var(--gd-red); color: #fff; font-size: 11px;
    min-width: 18px; height: 18px; border-radius: 9px;
    display: flex; align-items: center; justify-content: center; padding: 0 5px;
}

/* 2 级导航：可折叠分组 */
.nav .grp2 .gt {
    display: flex; align-items: center; gap: 11px;
    padding: 10px 12px; border-radius: 9px;
    color: #C9D6F2; font-size: 14px; margin-top: 6px;
    cursor: pointer; transition: all .18s; user-select: none;
}
.nav .grp2 .gt:hover { background: rgba(255, 255, 255, .08); color: #fff; }
.nav .grp2 .gt .ar { margin-left: auto; font-size: 10px; color: #7E95C9; transition: transform .22s; }
.nav .grp2.open .gt .ar { transform: rotate(180deg); }
.nav .grp2 .sub-wrap { display: grid; grid-template-rows: 0fr; transition: grid-template-rows .22s ease; }
.nav .grp2.open .sub-wrap { grid-template-rows: 1fr; }
.nav .grp2 .sub-wrap > div { overflow: hidden; }
.nav a.sub { padding-left: 40px; position: relative; }
.nav a.sub::before {
    content: ""; position: absolute; left: 22px; top: 50%; transform: translateY(-50%);
    width: 5px; height: 5px; border-radius: 50%; background: #5F7BBF; transition: all .18s;
}
.nav a.sub:hover::before { background: #fff; }
.nav a.sub.on::before { background: #fff; box-shadow: 0 0 6px rgba(255, 255, 255, .8); }

/* 侧栏整体折叠（收成窄条只留图标） */
.side.mini { width: 64px; }
.side.mini .logo { flex-direction: column; gap: 6px; padding: 18px 0 12px; }
.side.mini .logo > div:last-child { display: none; }
.side.mini .nav a { justify-content: center; padding: 10px 0; }
.side.mini .nav a > span { display: none; }
.side.mini .nav a .bdg { position: absolute; top: 3px; right: 9px; min-width: 15px; height: 15px; font-size: 9.5px; padding: 0 4px; }
.side.mini .nav a.sub { padding-left: 0; }
.side.mini .nav a.sub::before { display: none; }
.side.mini .nav .gt { justify-content: center; padding: 10px 0; }
.side.mini .nav .gt > span, .side.mini .nav .gt .ar { display: none; }
.side.mini .nav .sub-wrap { display: none; }

.side .ft {
    display: flex; align-items: center; gap: 8px;
    padding: 14px 20px; font-size: 11px; color: #6E84BB;
    border-top: 1px solid rgba(255, 255, 255, .08);
}
.side .ft > span { flex: 1; white-space: nowrap; }
.side.mini .ft { justify-content: center; }
.side.mini .ft > span { display: none; }
.mini-btn {
    width: 26px; height: 26px; border-radius: 8px;
    border: 1px solid rgba(255, 255, 255, .18); background: rgba(255, 255, 255, .08);
    color: #C9D6F2; cursor: pointer; font-size: 13px; flex-shrink: 0; transition: all .18s;
}
.mini-btn:hover { background: rgba(255, 255, 255, .18); color: #fff; }

/* 主区：顶栏 + 内容滚动区 */
.main { flex: 1; display: flex; flex-direction: column; min-width: 0; }
.top {
    height: 58px; background: var(--gd-card); border-bottom: 1px solid #E8ECF2;
    display: flex; align-items: center; padding: 0 24px; gap: 16px; flex-shrink: 0; flex-wrap: nowrap;
}
.top h1 { font-size: 18px; font-weight: 600; white-space: nowrap; flex-shrink: 0; }
.top .crumb { color: var(--gd-gray); font-size: 12.5px; flex-shrink: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.top-spacer { flex: 1; }
.top-acts { display: flex; gap: 10px; white-space: nowrap; flex-shrink: 0; }
.bell {
    position: relative; width: 36px; height: 36px; border-radius: 9px;
    background: var(--gd-soft); display: flex; align-items: center; justify-content: center;
    cursor: pointer; white-space: nowrap; flex-shrink: 0;
}
.bell i { position: absolute; top: 7px; right: 8px; width: 8px; height: 8px; background: var(--gd-red); border-radius: 50%; border: 2px solid #fff; }
.user { display: flex; align-items: center; gap: 10px; padding: 5px 8px; white-space: nowrap; flex-shrink: 0; }
.user b { font-size: 13.5px; }
.user small { display: block; color: var(--gd-gray); font-size: 11px; }
.logout-form { display: inline-flex; }
.logout-btn { padding: 7px 14px; }

.body { flex: 1; overflow-y: auto; overflow-x: auto; padding: 20px 24px; min-width: 0; overscroll-behavior: contain; }

/* ===== 通用组件（原型移植）===== */
.row { display: flex; gap: 16px; }
.card { background: var(--gd-card); border-radius: var(--gd-r); box-shadow: var(--gd-sh); padding: 18px 20px; transition: box-shadow .25s, transform .25s; }
.card:hover { box-shadow: var(--gd-shh); }
.card h3 { font-size: 16px; font-weight: 500; margin-bottom: 14px; display: flex; align-items: center; gap: 8px; }
.card h3 .more { margin-left: auto; font-size: 12.5px; color: var(--gd-primary); cursor: pointer; font-weight: 400; }

.stats { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; margin-bottom: 16px; }

.stat { position: relative; overflow: hidden; padding: 20px; color: #fff; border-radius: var(--gd-r); cursor: pointer; transition: transform .25s, box-shadow .25s; box-shadow: var(--gd-sh); }
.stat:hover { transform: translateY(-4px); box-shadow: var(--gd-shh); }
.stat:nth-child(1) { background: linear-gradient(135deg, #1B5BD7, #4E86F0); }
.stat:nth-child(2) { background: linear-gradient(135deg, #0F9D8F, #2EC4B6); }
.stat:nth-child(3) { background: linear-gradient(135deg, #7C4DFF, #A17FFF); }
.stat:nth-child(4) { background: linear-gradient(135deg, #F76707, #FFA94D); }
.stat .n { font-size: 30px; font-weight: 700; }
.stat .l { opacity: .88; font-size: 13px; margin-top: 4px; }
.stat .ic { position: absolute; right: 14px; top: 14px; font-size: 34px; opacity: .22; }
.stat .sub { margin-top: 10px; font-size: 12px; opacity: .8; border-top: 1px solid rgba(255, 255, 255, .22); padding-top: 8px; }
.stat.sm { padding: 8px 14px; }
.stat.sm .n { font-size: 20px; display: inline-block; margin-right: 8px; vertical-align: baseline; }
.stat.sm .l { display: inline-block; margin-top: 0; font-size: 12.5px; }
.stat.sm .sub { margin-top: 3px; font-size: 11.5px; border-top: none; padding-top: 0; }
.stat.sm .ic { right: 10px; top: 7px; font-size: 18px; opacity: .18; }

.tag { display: inline-flex; align-items: center; gap: 5px; padding: 2px 10px; border-radius: 20px; font-size: 12px; font-weight: 500; white-space: nowrap; }
.tag::before { content: ""; width: 6px; height: 6px; border-radius: 50%; background: currentColor; }
.t-ok { background: #E8F8EE; color: var(--gd-green); }
.t-warn { background: #FFF3E6; color: var(--gd-orange); }
.t-err { background: #FEECEB; color: var(--gd-red); }
.t-info { background: #E8F1FF; color: var(--gd-primary); }
.t-gray { background: var(--gd-soft); color: var(--gd-gray); }

.bar { height: 7px; border-radius: 4px; background: var(--gd-soft); overflow: hidden; min-width: 80px; }
.bar i { display: block; height: 100%; border-radius: 4px; background: linear-gradient(90deg, var(--gd-primary), #5B8DEF); }
.bar i.ok { background: linear-gradient(90deg, #00B42A, #4CD263); }
.bar i.warn { background: linear-gradient(90deg, #FF7D00, #FFB057); }
.bar i.err { background: linear-gradient(90deg, #F53F3F, #FF7A76); }

.mini-ava {
    width: 28px; height: 28px; border-radius: 50%;
    background: var(--gd-primary); color: #fff; font-size: 12px;
    display: inline-flex; align-items: center; justify-content: center;
    font-weight: 600; flex-shrink: 0;
}

.btn {
    display: inline-flex; align-items: center; gap: 6px;
    padding: 8px 16px; border-radius: 8px; border: none;
    font-size: 13.5px; cursor: pointer; font-family: inherit;
    transition: all .18s; font-weight: 500;
}
.btn-p { background: linear-gradient(135deg, var(--gd-primary), var(--gd-primary-light)); color: #fff; box-shadow: 0 4px 10px rgba(27, 91, 215, .3); }
.btn-p:hover { transform: translateY(-2px); box-shadow: 0 6px 16px rgba(27, 91, 215, .42); }
.btn-g { background: var(--gd-soft); color: var(--gd-text-sub); }
.btn-g:hover { background: #E2E9F3; }
.btn-err { background: linear-gradient(135deg, #F53F3F, #FF6B6B); color: #fff; box-shadow: 0 4px 10px rgba(245, 63, 63, .3); }
.btn-err:hover { transform: translateY(-2px); box-shadow: 0 6px 16px rgba(245, 63, 63, .42); }

.lnk { color: var(--gd-primary); cursor: pointer; font-size: 12.5px; white-space: nowrap; }
.lnk:hover { text-decoration: underline; }
.lnk.d { color: var(--gd-red); }

.empty { text-align: center; color: var(--gd-gray); font-size: 12.5px; padding: 26px 0; line-height: 2; }
.empty span { font-size: 11.5px; color: #B0B8C7; }

table { width: 100%; border-collapse: collapse; font-size: 13.5px; }
th { text-align: left; color: var(--gd-gray); font-weight: 500; font-size: 12.5px; padding: 9px 12px; border-bottom: 1px solid #EEF1F5; }
td { padding: 11px 12px; border-bottom: 1px solid #F3F5F8; vertical-align: middle; }
tbody tr:hover { background: #F7FAFF; }

/* ===== 登录页（S1 既有，保留）===== */
.login-page { display: flex; min-height: 100vh; }

.login-brand {
    flex: 1.15;
    background:
        radial-gradient(1200px 600px at -10% 110%, rgba(46, 107, 230, .55), transparent 60%),
        radial-gradient(900px 500px at 110% -10%, rgba(15, 63, 168, .5), transparent 55%),
        linear-gradient(135deg, #0F3FA8 0%, #1B5BD7 60%, #2E6BE6 100%);
    color: #fff;
    display: flex;
    align-items: center;
    justify-content: center;
}
.login-brand-inner { max-width: 460px; padding: 40px; }
.login-logo {
    width: 56px; height: 56px; border-radius: 14px;
    background: rgba(255, 255, 255, .16);
    border: 1px solid rgba(255, 255, 255, .25);
    display: flex; align-items: center; justify-content: center;
    font-size: 22px; font-weight: 700; letter-spacing: 1px;
    margin-bottom: 24px;
    box-shadow: 0 8px 24px rgba(0, 0, 0, .18);
}
.login-brand h1 { font-size: 26px; font-weight: 600; margin: 0 0 12px; letter-spacing: 2px; }
.login-slogan { color: rgba(255, 255, 255, .85); font-size: 14px; margin: 0 0 28px; letter-spacing: .5px; }
.login-points { list-style: none; padding: 0; margin: 0; }
.login-points li {
    padding: 10px 0 10px 28px;
    position: relative;
    color: rgba(255, 255, 255, .92);
    border-bottom: 1px dashed rgba(255, 255, 255, .18);
    font-size: 13px;
}
.login-points li::before {
    content: "";
    position: absolute; left: 2px; top: 15px;
    width: 8px; height: 8px; border-radius: 2px;
    background: #69FFF0;
    box-shadow: 0 0 8px rgba(105, 255, 240, .8);
}

.login-panel {
    flex: 1;
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--gd-bg);
}
.login-form {
    width: 360px;
    background: var(--gd-card);
    border-radius: 14px;
    padding: 36px 36px 28px;
    border: 1px solid var(--gd-border);
    box-shadow: 0 8px 30px rgba(31, 35, 41, .08);
}
.login-form h2 { margin: 0 0 22px; font-size: 20px; font-weight: 600; }
.login-form label { display: block; margin-bottom: 16px; }
.login-form label span { display: block; font-size: 13px; color: var(--gd-text-sub); margin-bottom: 6px; }
.login-form input {
    width: 100%;
    height: 40px;
    border: 1px solid var(--gd-border);
    border-radius: 8px;
    padding: 0 12px;
    font-size: 14px;
    outline: none;
    transition: border-color .15s, box-shadow .15s;
}
.login-form input:focus {
    border-color: var(--gd-primary);
    box-shadow: 0 0 0 3px rgba(27, 91, 215, .12);
}
.login-error {
    background: #FFF1F0;
    border: 1px solid #FFCCC7;
    color: var(--gd-red);
    border-radius: 8px;
    padding: 8px 12px;
    font-size: 13px;
    margin-bottom: 16px;
}
.login-submit {
    width: 100%;
    height: 42px;
    margin-top: 6px;
    border: none;
    border-radius: 8px;
    background: linear-gradient(135deg, var(--gd-primary), var(--gd-primary-light));
    color: #fff;
    font-size: 15px;
    font-weight: 600;
    letter-spacing: 6px;
    cursor: pointer;
    transition: transform .12s, box-shadow .15s;
    box-shadow: 0 4px 14px rgba(27, 91, 215, .35);
}
.login-submit:hover { box-shadow: 0 6px 20px rgba(27, 91, 215, .45); transform: translateY(-1px); }
.login-submit:active { transform: translateY(0); }
.login-hint { margin: 18px 0 0; font-size: 12px; color: var(--gd-text-sub); line-height: 1.6; }

/* v0.40 扫码登录：页签 + 二维码 */
.login-tabs { display: flex; gap: 6px; margin-bottom: 10px; background: var(--gd-soft, #F2F5FA); border-radius: 10px; padding: 4px; }
.login-tab {
    flex: 1; border: none; background: transparent; border-radius: 8px;
    padding: 8px 0; font-size: 13.5px; color: var(--gd-text-sub); cursor: pointer;
}
.login-tab.on { background: #fff; color: var(--gd-primary); font-weight: 600; box-shadow: 0 2px 8px rgba(15, 23, 42, .08); }
.login-qr-box { display: flex; flex-direction: column; align-items: center; padding: 8px 0 4px; }
.login-qr-img { width: 210px; height: 210px; border: 1px solid var(--gd-line, #E5E9F0); border-radius: 10px; }
.login-qr-tip { margin: 14px 0 0; font-size: 13px; color: var(--gd-text-sub); text-align: center; line-height: 1.7; min-height: 20px; }

/* 窄屏（K-10）：品牌区收起、侧栏窄屏安全 */
@media (max-width: 768px) {
    .login-brand { display: none; }
    .top .crumb { display: none; }
    .stats { grid-template-columns: repeat(2, 1fr); }
}

/* Blazor 断线提示（K-22）：默认隐藏；电路断开时框架挂 components-reconnect-show/failed/rejected 类显示 */
#components-reconnect-modal { display: none; position: fixed; top: 14px; left: 50%; transform: translateX(-50%); z-index: 200; }
#components-reconnect-modal.components-reconnect-show,
#components-reconnect-modal.components-reconnect-failed,
#components-reconnect-modal.components-reconnect-rejected { display: block; }
#components-reconnect-modal .rc-box {
    background: #fff; border: 1px solid var(--gd-border); border-left: 4px solid var(--gd-orange);
    border-radius: 10px; box-shadow: 0 10px 30px rgba(10, 30, 80, .18);
    padding: 12px 18px; font-size: 13px; max-width: 460px;
}
#components-reconnect-modal .rc-title { margin: 0 0 4px; font-weight: 600; color: var(--gd-orange); }
#components-reconnect-modal .rc-tip { margin: 2px 0 0; color: var(--gd-text-sub); display: none; }
#components-reconnect-modal.components-reconnect-show .rc-tip.show { display: block; }
#components-reconnect-modal.components-reconnect-failed .rc-tip.failed { display: block; }
#components-reconnect-modal.components-reconnect-rejected .rc-tip.rejected { display: block; }
#components-reconnect-modal .rc-tip.failed,
#components-reconnect-modal .rc-tip.rejected { color: var(--gd-red); }
#components-reconnect-modal a { font-weight: 600; }

/* ===== s2 项目概览起：业务屏组件（原型移植 · 原变量映射 --p1→--gd-primary 等）===== */

/* 页面说明条（原型 .ph2-note） */
.ph2-note {
    display: inline-flex; align-items: center; gap: 6px;
    font-size: 11.5px; color: var(--gd-primary-deep);
    background: #E8F1FF; border: 1px solid #BFD6FA; border-radius: 8px;
    padding: 5px 11px; font-weight: 400; margin-bottom: 14px;
}

/* 弹窗（原型 .mask/.modal） */
@keyframes gd-fade { from { opacity: 0; } to { opacity: 1; } }
@keyframes gd-pop { from { opacity: 0; transform: scale(.95) translateY(10px); } to { opacity: 1; transform: none; } }
.mask { position: fixed; inset: 0; background: rgba(15, 25, 45, .42); backdrop-filter: blur(2px); display: none; align-items: center; justify-content: center; z-index: 50; animation: gd-fade .2s; }
.mask.on { display: flex; }
.modal { background: #fff; border-radius: 14px; width: 640px; max-height: 86vh; overflow: auto; padding: 24px 26px; box-shadow: 0 24px 60px rgba(10, 30, 80, .3); animation: gd-pop .25s ease; }
.modal h2 { font-size: 17px; margin-bottom: 16px; display: flex; align-items: center; }
.modal h2 .x { margin-left: auto; cursor: pointer; color: var(--gd-gray); font-size: 20px; padding: 4px; background: none; border: none; font-family: inherit; }
.modal h2 .x:hover { color: var(--gd-text); }

/* 表单（原型 .frm/.fld/.inp） */
.frm { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
.fld { display: flex; flex-direction: column; gap: 6px; }
.fld.full { grid-column: 1 / -1; }
.fld label { font-size: 12.5px; color: var(--gd-text-sub); }
.fld label.req::before { content: "＊"; color: var(--gd-red); font-weight: 700; margin-right: 3px; }
.inp { border: 1px solid #DDE3EC; border-radius: 8px; padding: 9px 12px; font-size: 13.5px; font-family: inherit; background: #fff; outline: none; transition: all .18s; width: 100%; }
.inp:focus { border-color: var(--gd-primary); box-shadow: 0 0 0 3px rgba(27, 91, 215, .12); }
.inp[readonly] { background: var(--gd-soft); color: var(--gd-text-sub); }
textarea.inp { resize: vertical; min-height: 60px; }

/* 警示条（原型 .warnbar） */
.warnbar { background: #FEECEB; border: 1px solid #FCCAC7; color: var(--gd-red); border-radius: 9px; padding: 10px 14px; font-size: 13px; display: flex; gap: 8px; align-items: center; margin: 12px 0; line-height: 1.5; }

/* 状态点（原型 .dot） */
.dot { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; display: inline-block; }
.dot.ok { background: var(--gd-green); box-shadow: 0 0 0 3px rgba(0, 180, 42, .15); }
.dot.warn { background: var(--gd-orange); box-shadow: 0 0 0 3px rgba(255, 125, 0, .15); }
.dot.err { background: var(--gd-red); box-shadow: 0 0 0 3px rgba(245, 63, 63, .15); }

/* 健康卡（原型 .hl-grid/.hl，#53 自二期并入） */
.hl-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; }
.hl { border: 1px solid #EDF0F5; border-radius: 12px; padding: 16px 18px; background: #fff; cursor: pointer; transition: all .2s; position: relative; overflow: hidden; }
.hl:hover { transform: translateY(-2px); box-shadow: var(--gd-shh); }
.hl::before { content: ""; position: absolute; left: 0; top: 0; bottom: 0; width: 4px; }
.hl.ok::before { background: linear-gradient(180deg, #00B42A, #4CD263); }
.hl.warn::before { background: linear-gradient(180deg, #FF7D00, #FFB057); }
.hl.err::before { background: linear-gradient(180deg, #F53F3F, #FF7A76); }
.hl .nm { font-weight: 600; font-size: 14.5px; display: flex; align-items: center; gap: 8px; }
.hl .meta { color: var(--gd-gray); font-size: 12px; margin: 7px 0 10px; }
.hl .duo { display: flex; flex-direction: column; gap: 6px; margin-bottom: 8px; }
.hl .duo .ln { display: flex; align-items: center; gap: 8px; font-size: 11.5px; color: var(--gd-text-sub); }
.hl .duo .ln em { font-style: normal; width: 34px; flex-shrink: 0; color: var(--gd-gray); }
.hl .duo .ln .bar { flex: 1; }
.hl .ft { display: flex; align-items: center; gap: 8px; font-size: 12px; color: var(--gd-text-sub); margin-top: 6px; }
.hl .ft b { margin-left: auto; }

/* 评论（原型 .cmt） */
.cmt { display: flex; gap: 10px; padding: 11px 0; border-bottom: 1px solid #F3F5F8; }
.cmt b { font-size: 13px; }
.cmt p { font-size: 13px; margin: 3px 0 0; line-height: 1.6; white-space: pre-wrap; }
.cmt p .at { color: var(--gd-primary); font-weight: 500; }
.cmt .tm { font-size: 11.5px; color: var(--gd-gray); margin-top: 4px; }
.cmt-input { display: flex; gap: 10px; margin-top: 14px; align-items: center; }

/* 里程碑轨道（原型 .ms-track，m2Health 健康详情） */
.ms-track { display: flex; align-items: flex-start; padding: 6px 0; }
.ms { flex: 1; text-align: center; position: relative; }
.ms::before { content: ""; position: absolute; top: 10px; left: -50%; width: 100%; height: 2px; background: #E3EAF5; }
.ms:first-child::before { display: none; }
.ms.done::before { background: var(--gd-green); }
.ms.cur::before { background: linear-gradient(90deg, var(--gd-green), var(--gd-primary)); }
.ms .pt { width: 20px; height: 20px; border-radius: 50%; margin: 0 auto; background: #E3EAF5; color: #fff; font-size: 10.5px; line-height: 20px; position: relative; }
.ms.done .pt { background: var(--gd-green); }
.ms.cur .pt { background: var(--gd-primary); box-shadow: 0 0 0 5px rgba(27, 91, 215, .18); }
.ms .t { font-size: 12px; font-weight: 500; margin-top: 7px; }
.ms .dt { font-size: 11px; color: var(--gd-gray); margin-top: 1px; }
.ms.cur .t { color: var(--gd-primary); font-weight: 600; }

/* 标签行容器（原型 .filter） */
.filter { display: flex; gap: 10px; align-items: center; margin-bottom: 16px; flex-wrap: wrap; }

/* 极简分页条 */
.pg { display: flex; gap: 10px; align-items: center; justify-content: flex-end; padding-top: 14px; font-size: 12.5px; color: var(--gd-text-sub); }
.pg .btn { padding: 5px 12px; font-size: 12.5px; }
.pg .btn:disabled { opacity: .45; cursor: default; transform: none; }

@media (max-width: 1250px) {
    .hl-grid { grid-template-columns: 1fr 1fr; }
}
@media (max-width: 768px) {
    .hl-grid { grid-template-columns: 1fr; }
    .frm { grid-template-columns: 1fr; }
}

/* ===== s7 项目计划（原型 .pj-cur / .gantt / .al-i，变量名按 K-05 换 --gd-*） ===== */

/* 顶栏项目选择器（s7 计划屏 topActs） */
.pj-cur { display: flex; align-items: center; gap: 7px; background: var(--gd-soft); border: 1px solid var(--gd-border); border-radius: 8px; padding: 7px 12px; font-size: 13px; cursor: pointer; transition: all .18s; min-width: 200px; white-space: nowrap; flex-shrink: 0; }
.pj-cur:hover { border-color: var(--gd-primary-light); color: var(--gd-primary); }
.pj-cur b { font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 150px; }
.pj-cur i { margin-left: auto; font-style: normal; color: var(--gd-gray); font-size: 10px; }

/* 计划进度甘特（左条=计划工期 / 下条=实际进度；月刻度竖线 + 今日虚线） */
.gantt { margin-top: 6px; }
.g-head { display: flex; height: 18px; font-size: 11px; color: var(--gd-gray); position: relative; }
.g-head span { position: absolute; transform: translateX(2px); }
.g-body { position: relative; }
.g-row { display: flex; align-items: center; height: 32px; }
.g-row:hover .g-track { background: #F7FAFF; }
.g-nm { width: 130px; flex-shrink: 0; font-size: 12.5px; font-weight: 500; color: var(--gd-text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; padding-right: 8px; }
.g-track { flex: 1; position: relative; height: 32px; }
.g-plan { position: absolute; top: 8px; height: 8px; border-radius: 4px; background: #DCE6F8; border: 1px solid #B9CCEF; }
.g-act { position: absolute; top: 17px; height: 8px; border-radius: 4px; box-shadow: 0 1px 3px rgba(31, 35, 41, .12); background: linear-gradient(90deg, var(--gd-primary), #5B8DEF); }
.g-act.ok { background: linear-gradient(90deg, #00B42A, #4CD263); }
.g-act.warn { background: linear-gradient(90deg, #FF7D00, #FFB057); }
.g-vline { position: absolute; top: 0; bottom: 0; width: 1px; background: #EDF1F7; }
.g-today { position: absolute; top: -4px; bottom: 0; width: 0; border-left: 2px dashed var(--gd-red); opacity: .6; }
.g-legend { display: flex; gap: 14px; align-items: center; font-size: 11.5px; color: var(--gd-gray); margin-top: 10px; flex-wrap: wrap; }
.g-legend i { display: inline-block; width: 18px; height: 7px; border-radius: 4px; margin-right: 5px; vertical-align: middle; }

/* 偏差预警卡条目（黄=滞后 / 红=逾期） */
.al-i { padding: 12px 13px; border: 1px solid #F0E3CE; background: linear-gradient(180deg, #FFFDF8, #FFFBF2); border-radius: 10px; margin-bottom: 10px; transition: transform .2s, box-shadow .2s; }
.al-i:hover { transform: translateX(3px); box-shadow: var(--gd-sh); }
.al-i.err { border-color: #F5D4D4; background: linear-gradient(180deg, #FFF8F8, #FFF5F5); }
.al-t { display: flex; justify-content: space-between; align-items: center; font-size: 13px; }
.al-d { font-size: 12px; color: var(--gd-text-sub); margin-top: 5px; }
.al-r { font-size: 12px; color: #B25E09; margin-top: 4px; }
.al-i.err .al-r { color: var(--gd-red); }
.al-a { display: flex; gap: 8px; margin-top: 9px; flex-wrap: wrap; }
.al-a span { font-size: 12px; color: var(--gd-primary); background: #F0F5FF; border-radius: 6px; padding: 4px 10px; cursor: pointer; transition: all .2s; }

/* 项目选择弹窗行（s7 计划屏 mPjPick） */
.pj-row { display: flex; align-items: center; gap: 10px; padding: 10px 12px; border: 1px solid var(--gd-border); border-radius: 10px; margin-bottom: 8px; cursor: pointer; transition: all .18s; font-size: 13.5px; }
.pj-row:hover { border-color: var(--gd-primary-light); background: #F7FAFF; }
.pj-row.on { border-color: var(--gd-primary); background: #F0F5FF; }

/* ===== s8 项目文档（原型 .dtree 目录树 / .ftag 扩展名标签，变量名按 K-05 换 --gd-*） ===== */
.dtree { font-size: 13px; line-height: 2.05; }
.dt-root { display: flex; align-items: center; gap: 6px; font-weight: 600; color: var(--gd-primary); padding: 3px 8px; cursor: pointer; border-radius: 7px; }
.dt-root:hover { background: #F7FAFF; }
.dt-root.on { background: #F0F5FF; }
.dt-i { display: flex; align-items: center; gap: 6px; padding: 2px 8px; color: var(--gd-text-sub); cursor: pointer; border-radius: 7px; position: relative; margin-left: 16px; }
.dt-i::before { content: ""; position: absolute; left: -9px; top: 50%; width: 9px; height: 1px; background: #E3EAF5; }
.dt-i:hover { background: #F7FAFF; color: var(--gd-text); }
.dt-i.on { background: #F0F5FF; color: var(--gd-primary); font-weight: 500; }
.dt-i.on::after { content: ""; position: absolute; left: -16px; top: 50%; transform: translateY(-50%); width: 3px; height: 14px; border-radius: 2px; background: var(--gd-primary); }
.dt-i .cnt, .dt-root .cnt { margin-left: auto; font-size: 11px; color: var(--gd-gray); background: var(--gd-soft); border-radius: 9px; padding: 0 7px; line-height: 1.6; }
.dt-i.on .cnt { background: #E0EAFF; color: var(--gd-primary); }

/* 扩展名标签（文件列表首列） */
.ftag { flex: none; width: 36px; text-align: center; font-size: 10px; font-weight: 700; border-radius: 5px; padding: 2.5px 0; letter-spacing: .5px; }
.ft-cad { background: #E8F1FF; color: var(--gd-primary); }
.ft-pdf { background: #FEECEB; color: var(--gd-red); }
.ft-doc { background: #E8F8EE; color: var(--gd-green); }
.ft-zip { background: #FFF3E6; color: #B25E09; }
.ft-img { background: #F3E8FF; color: #7C4DFF; }

/* 类别筛选 chips（原型 .typechips 复用 .chip） */
.typechips { flex-wrap: nowrap; }

/* 筛选/标签 chips（原型 .chips/.chip，s8 类别筛选首次启用） */
.chips { display: flex; flex-wrap: wrap; gap: 8px; }
.chip { display: flex; align-items: center; gap: 7px; border: 1px solid #DDE3EC; border-radius: 9px; padding: 7px 12px; cursor: pointer; font-size: 13px; transition: all .18s; background: #fff; color: var(--gd-text-sub); }
.chip:hover { border-color: var(--gd-primary-light); }
.chip.on { border-color: var(--gd-primary); background: #F0F5FF; color: var(--gd-primary); font-weight: 500; }

/* ===== s8 校审/权限（原型 .pvk 权限勾选格，S4 校审/权限专项） ===== */
.pvk { display: inline-flex; width: 22px; height: 22px; border-radius: 6px; align-items: center; justify-content: center; font-size: 13px; font-weight: 700; color: #A8B0BC; background: var(--gd-soft); cursor: default; user-select: none; }
.pvk.on { color: var(--gd-green); background: #E8F8EE; }
.pvk.click { cursor: pointer; transition: all .15s; }
.pvk.click:hover { box-shadow: 0 0 0 2px var(--gd-primary-light); }
.rm-row { color: var(--gd-red); font-size: 12px; cursor: pointer; white-space: nowrap; }
.rm-row:hover { text-decoration: underline; }
.lockhint { font-size: 11px; color: var(--gd-gray); margin-left: 4px; }

/* ===== s3 生产单（原型 .imgs 图纸附件墙） ===== */
.imgs { display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; }
.imgbox { aspect-ratio: 4/3; border-radius: 9px; background: linear-gradient(135deg, #DCE6F7, #C2D4F2); display: flex; align-items: center; justify-content: center; color: #5F7AB8; font-size: 12px; cursor: zoom-in; transition: transform .2s; flex-direction: column; gap: 6px; overflow: hidden; position: relative; padding: 6px; text-align: center; }
.imgbox:hover { transform: scale(1.04); }
.imgbox img { width: 100%; height: 100%; object-fit: cover; }
.imgbox .del { position: absolute; top: 5px; right: 5px; width: 20px; height: 20px; border-radius: 50%; background: rgba(31, 35, 41, .55); color: #fff; font-size: 12px; line-height: 20px; text-align: center; display: none; }
.imgbox:hover .del { display: block; }
.imgbox.add { border: 1.5px dashed #BFD6FA; background: #F6FAFF; color: var(--gd-primary); cursor: pointer; }

/* ===== s4 工单调度（原型 .kb 看板 / .kcard 卡片 / .tl 留痕时间线 / .mini-ava） ===== */
.kb { display: grid; grid-template-columns: repeat(4, 1fr); gap: 14px; align-items: start; }
.kb-col { background: var(--gd-soft); border-radius: 12px; padding: 12px; min-height: 280px; }
.kb-col .hd { display: flex; align-items: center; gap: 8px; font-weight: 600; font-size: 13.5px; padding: 2px 4px 12px; }
.kb-col .hd span { margin-left: auto; background: #fff; border-radius: 9px; font-size: 11.5px; color: var(--gd-gray); padding: 1px 8px; font-weight: 500; }
.kcard { background: #fff; border-radius: 10px; padding: 13px 14px; margin-bottom: 10px; box-shadow: var(--gd-sh); cursor: pointer; transition: all .2s; border-left: 3px solid var(--gd-primary); }
.kcard:hover { transform: translateY(-2px); box-shadow: var(--gd-shh); }
.kcard b { font-size: 13.5px; display: block; }
.kcard .sub { font-size: 12px; color: var(--gd-gray); margin: 5px 0 9px; }
.kcard .ft { display: flex; align-items: center; justify-content: space-between; gap: 8px; flex-wrap: wrap; }
/* 两行紧凑卡（#107）：行1 标题+状态tag右；行2 项目·生产单+负责人右；进度条仅进行中追加 */
.kcard.slim { padding: 11px 13px; }
.kcard.slim .r1 { display: flex; align-items: center; gap: 8px; }
.kcard.slim .r1 b { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; display: block; }
.kcard.slim .r2 { display: flex; align-items: center; gap: 8px; margin-top: 6px; }
.kcard.slim .r2 .sub { flex: 1; min-width: 0; margin: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.kcard.slim .bar { margin-top: 8px; }
.kcard .who { display: flex; align-items: center; gap: 6px; font-size: 12px; color: var(--gd-text-sub); flex: none; }
.kcard .who .mini-ava { width: 20px; height: 20px; font-size: 10px; }
.kcard .who.none { color: var(--gd-gray); }
.mini-ava { width: 22px; height: 22px; border-radius: 50%; color: #fff; font-size: 10.5px; display: flex; align-items: center; justify-content: center; font-weight: 600; background: var(--gd-primary); flex: none; }

/* 派发/流转留痕时间线（mTask） */
.tl { position: relative; padding-left: 22px; }
.tl::before { content: ""; position: absolute; left: 6px; top: 6px; bottom: 6px; width: 2px; background: #E3EAF5; }
.tl-i { position: relative; padding: 0 0 12px; font-size: 12.5px; color: var(--gd-text-sub); }
.tl-i::before { content: ""; position: absolute; left: -21px; top: 4px; width: 10px; height: 10px; border-radius: 50%; background: var(--gd-primary); box-shadow: 0 0 0 3px #fff; }
.tl-i .tm { color: var(--gd-gray); font-size: 11.5px; margin-left: 6px; }

/* ===== s5 现场协同（原型 .dense 紧凑表格） ===== */
table.dense { font-size: 12.5px; }
table.dense td, table.dense th { padding: 6px 10px; }
table.dense .grp td { background: #F8FAFD; }
.rulebar { background: #FFF9EF; border: 1px solid #F5DFC0; color: #8A6116; border-radius: 9px; padding: 10px 14px; font-size: 12.5px; line-height: 1.7; margin-bottom: 14px; }

/* 今日考勤一览（/attendance；S5 第 5 步） */
.att-thumb { width: 64px; height: 48px; object-fit: cover; border-radius: 6px; border: 1px solid var(--gd-line, #E5EAF2); cursor: pointer; }
.att-thumb:hover { border-color: var(--gd-primary); }

/* 今日考勤三区布局（左汇总表 60% / 右上地图 / 右下个人明细；三卡撑满视口数据区） */
.att-wrap { display: flex; gap: 14px; align-items: stretch; height: calc(100vh - 286px); min-height: 460px; }
.att-left { flex: 0 0 60%; min-width: 0; height: 100%; }
.att-right { flex: 1; min-width: 0; height: 100%; display: flex; flex-direction: column; gap: 14px; }
.att-left > .card { height: 100%; overflow-y: auto; box-sizing: border-box; }
.att-right > .card:last-child { flex: 1; overflow-y: auto; box-sizing: border-box; min-height: 180px; }
.att-tbl { width: 100%; border-collapse: collapse; font-size: 13px; }
.att-tbl th, .att-tbl td { border-bottom: 1px solid var(--gd-border, #E5EAF2); padding: 8px 10px; text-align: left; vertical-align: top; }
.att-tbl th { color: var(--gd-gray, #86909C); font-weight: 600; font-size: 12.5px; background: var(--gd-soft, #F5F7FA); }
.att-tbl tbody tr { cursor: pointer; }
.att-tbl tbody tr:hover { background: #F7FAFF; }
.att-tbl tbody tr.sel { background: #E8F1FF; }
.att-sess { font-size: 12.5px; line-height: 1.7; white-space: nowrap; }


/* 报工照片墙（s4 Dispatch；S5 第 5 步） */
.wall-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(132px, 1fr)); gap: 10px; max-height: 56vh; overflow-y: auto; }
.wall-tile { position: relative; border: 1px solid var(--gd-border, #E8ECF2); border-radius: 10px; overflow: hidden; cursor: pointer; background: #fff; }
.wall-tile img { display: block; width: 100%; height: 96px; object-fit: cover; }
.wall-tile:hover { border-color: var(--gd-primary); }
.wall-badges { position: absolute; top: 4px; left: 4px; right: 4px; display: flex; gap: 4px; flex-wrap: wrap; }
.wall-badges .tag { font-size: 10.5px; padding: 0 6px; }
.wall-cap { font-size: 11px; color: var(--gd-gray, #86909C); padding: 4px 6px; line-height: 1.5; }
.wall-cap b { color: var(--gd-text, #1F2329); }

/* 照片预览水印（#102 管线：姓名+时间 平铺斜排） */
.wm-box { position: relative; display: inline-block; max-width: 100%; overflow: hidden; border-radius: 10px; background: #000; }
.wm-layer { position: absolute; inset: 0; pointer-events: none; overflow: hidden; display: flex; flex-wrap: wrap; gap: 26px; align-content: center; justify-content: center; transform: rotate(-18deg); opacity: .22; }
.wm-layer span { font-size: 14px; font-weight: 700; color: #fff; white-space: nowrap; }

/* ===== s1 工作台（原型 .proj/.pj/.todo-it 换 --gd-* 变量）===== */
.proj { display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; }
.pj { border: 1px solid var(--gd-border, #EDF0F5); border-radius: 10px; padding: 14px 16px; transition: all .2s; cursor: pointer; background: #fff; }
.pj:hover { border-color: #C9D6F2; transform: translateY(-2px); box-shadow: 0 8px 20px rgba(15,63,168,.08); }
.pj .nm { font-weight: 600; font-size: 14px; display: flex; align-items: center; gap: 8px; }
.pj .meta { color: var(--gd-gray); font-size: 12px; margin: 8px 0 10px; display: flex; gap: 12px; flex-wrap: wrap; }
.pj .ft { display: flex; align-items: center; gap: 10px; font-size: 12px; color: var(--gd-text-sub, #5F6470); margin-top: 9px; }
.pj .ft b { margin-left: auto; font-size: 13px; color: var(--gd-text); }
.dot { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; display: inline-block; }
.dot.ok { background: var(--gd-green, #00B42A); box-shadow: 0 0 0 3px rgba(0,180,42,.15); }
.dot.warn { background: var(--gd-orange, #FF7D00); box-shadow: 0 0 0 3px rgba(255,125,0,.15); }
.dot.err { background: var(--gd-red, #F53F3F); box-shadow: 0 0 0 3px rgba(245,63,63,.15); }
.todo-it { display: flex; gap: 12px; padding: 12px 4px; border-bottom: 1px solid #F3F5F8; align-items: flex-start; cursor: pointer; border-radius: 8px; }
.todo-it:hover { background: #F7FAFF; }
.todo-it .ti { width: 34px; height: 34px; border-radius: 9px; display: flex; align-items: center; justify-content: center; font-size: 15px; flex-shrink: 0; }
.ti.pu { background: #FFF3E6; } .ti.sg { background: #E8F1FF; } .ti.ov { background: #FEECEB; }
.todo-it b { font-size: 13.5px; font-weight: 500; display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.todo-it p { color: var(--gd-gray); font-size: 12px; margin-top: 3px; }
.todo-it time { margin-left: auto; font-size: 11.5px; color: var(--gd-gray); white-space: nowrap; flex-shrink: 0; }

/* ===== S6 统计报表（s6 用工统计 · 步②）：趋势柱图 + 班组占比环形 + 层级钻取 ===== */
.trend { display: flex; align-items: flex-end; gap: 10px; height: 220px; padding: 6px 4px 0; overflow-x: auto; }
.trend .col { flex: 1; min-width: 26px; display: flex; flex-direction: column; align-items: center; justify-content: flex-end; gap: 6px; height: 100%; }
.trend .col i { display: block; width: 70%; max-width: 46px; min-height: 3px; background: linear-gradient(180deg, #4E86F0, #1B5BD7); border-radius: 6px 6px 2px 2px; }
.trend .col span { font-size: 11px; color: var(--gd-gray); white-space: nowrap; }
.donut-wrap { display: flex; align-items: center; gap: 22px; flex-wrap: wrap; }
.donut { width: 160px; height: 160px; flex: none; position: relative; }
.donut svg { transform: rotate(-90deg); display: block; }
.donut circle { transition: stroke-dasharray .3s; }
.donut .dc { position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; }
.donut .dc b { font-size: 19px; }
.donut .dc span { font-size: 11px; color: var(--gd-gray); }
.legend { display: flex; flex-direction: column; gap: 8px; font-size: 13px; min-width: 0; flex: 1; }
.legend div { display: flex; align-items: center; gap: 8px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.legend i { width: 10px; height: 10px; border-radius: 3px; flex: none; }
.hier-row { cursor: pointer; }
.hier-row:hover td { background: #F7FAFF; }
.lv-prod td:first-child { padding-left: 34px; }
.lv-worker td:first-child { padding-left: 58px; font-size: 13px; }
.hier-toggle { display: inline-block; width: 14px; color: var(--gd-gray); user-select: none; }

/* ===== S6 步③④：汇总行（采购/建议页签摘要行）===== */
.statline { display: flex; flex-wrap: wrap; gap: 8px 22px; font-size: 13px; color: var(--gd-text-sub); align-items: baseline; }
.statline b { color: var(--gd-text); font-size: 14.5px; }
.statline .money { color: var(--gd-primary); }

/* ===== 顶栏小 chip（走查插单 09-11：标题栏人员/类型筛选用，一排不挤）===== */
.chip.sm { padding: 4px 10px; font-size: 12px; gap: 5px; border-radius: 7px; }

/* ===== 表格行操作下拉（走查插单 09-11：多操作合并一个按钮，点开二次选择）===== */
.dd-wrap { position: relative; display: inline-block; }
.dd-backdrop { position: fixed; inset: 0; z-index: 70; }
.dd-menu { position: absolute; right: 0; top: calc(100% + 4px); z-index: 71; background: #fff; border: 1px solid var(--gd-border); border-radius: 9px; box-shadow: 0 8px 28px rgba(15, 34, 67, .16); padding: 5px; min-width: 108px; }
.dd-menu button { display: block; width: 100%; text-align: left; border: none; background: none; padding: 7px 12px; font-size: 13px; border-radius: 6px; cursor: pointer; color: var(--gd-text); white-space: nowrap; }
.dd-menu button:hover { background: #F0F5FF; color: var(--gd-primary); }
.dd-menu button.danger:hover { background: #FFF1F0; color: #F53F3F; }

/* ===== 任务进度条 + 可点 %（v15；批 11 任务进度跟踪） ===== */
.pgc { display: flex; align-items: center; gap: 8px; }
.pg { width: 86px; height: 6px; background: #EDF0F5; border-radius: 3px; overflow: hidden; flex-shrink: 0; }
.pg i { display: block; height: 100%; background: linear-gradient(90deg, var(--gd-primary), var(--gd-primary-light)); border-radius: 3px; }
.pg.done i { background: var(--gd-green, #00B42A); }
.pg.cut i { background: #C2C8D2; }
.pgt { font-size: 12px; color: var(--gd-text-sub); min-width: 32px; }
.pgt.lnk { cursor: pointer; color: var(--gd-primary); text-decoration: underline dotted; text-underline-offset: 3px; }

/* ===== 计划页节点下管理任务子行（v16→v17：按落实表列对齐的表格行） ===== */
.mt-tr { background: #FAFBFE; font-size: 12.5px; cursor: pointer; }
.mt-tr:hover td { background: #F0F5FF; }
.mt-tr td { color: var(--gd-text-sub); }

/* ===== 人员排程（v18；v0.10.0 生产组新页：全员轴+全员表两卡） ===== */
.sched { overflow-x: auto; }
.sc-head { display: flex; align-items: center; padding-bottom: 6px; position: sticky; top: 0; background: #fff; z-index: 2; }
.sc-people { max-height: 300px; overflow-y: auto; }   /* 走查插单 09-12：卡1 视口 10 人（行高 30px），超出滚动 */
.sc-row { display: flex; align-items: center; min-width: 640px; height: 30px; }
.sc-row:hover { background: #FAFBFE; }
.sc-name { width: 120px; flex: none; font-size: 13px; padding: 4px 10px 4px 4px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.sc-head .sc-track { position: relative; height: 18px; }
.sc-track { flex: 1; position: relative; height: 30px; margin-right: 8px; overflow: hidden; }   /* 域外完结单裁剪（走查拍板 09-12 完结单不算域） */
.sc-tick { position: absolute; top: 0; font-size: 11px; color: var(--gd-gray); transform: translateX(-50%); }
.sc-today { position: absolute; top: -4px; bottom: -4px; border-left: 2px dashed var(--gd-red); opacity: .7; }
/* 今日线逐行绘制（.sc-today 每行渲染；走查插单 09-12） */
.sc-bar { position: absolute; top: 9px; height: 12px; border-radius: 5px; cursor: pointer; transition: transform .12s; min-width: 3px; }
.sc-bar:hover { transform: translateY(-2px); box-shadow: 0 4px 10px rgba(15,34,67,.22); }
.sc-bar.done { height: 5px; top: 13px; opacity: .45; }
.sc-conflict { position: absolute; top: 6px; height: 18px; border: 2px solid var(--gd-red); border-radius: 7px; background: rgba(245,63,63,.12); pointer-events: none; }
.po0 { background: #1B5BD7; } .po1 { background: #00B42A; } .po2 { background: #FF7D00; } .po3 { background: #722ED1; }
.po4 { background: #0FC6C2; } .po5 { background: #EB2F96; } .po6 { background: #86909C; } .po7 { background: #C4630A; }
.po-dot { display: inline-block; width: 9px; height: 9px; border-radius: 3px; margin-right: 6px; vertical-align: baseline; }
.sc-tables { max-height: 620px; overflow-y: auto; padding-right: 4px; }
.sc-tblock { margin-bottom: 14px; }
.sc-tblock:last-child { margin-bottom: 0; }
.sc-tname { display: flex; align-items: center; gap: 10px; font-size: 13.5px; margin: 4px 0 6px; padding-top: 8px; border-top: 1px dashed #E5E9F0; }
.sc-tblock:first-child .sc-tname { border-top: none; padding-top: 0; }

/* ===== v0.17 周报按项目分组 + AI 总结（css v22）===== */
tr.wgrp td { background: #F0F5FF; font-weight: 600; }
tr.wgrp td .wsub { font-weight: 400; font-size: 12px; color: var(--gd-gray); margin-left: 8px; }
tr.wperson td { background: #FAFBFE; font-weight: 600; font-size: 12.5px; }
tr.wperson td .wsub { font-weight: 400; font-size: 12px; color: var(--gd-gray); margin-left: 8px; }
.btn-ai { background: linear-gradient(135deg, #6B3FD4, #9A6BFF); color: #fff; box-shadow: 0 4px 10px rgba(107, 63, 212, .3); }
.btn-ai[disabled] { opacity: .55; cursor: not-allowed; }
.ai-card { font-size: 13px; line-height: 2; background: #FAFBFE; border: 1px dashed #E5E9F0; border-radius: 8px; padding: 12px 16px; white-space: pre-wrap; word-break: break-word; }

/* ===== v0.20.3 表格自带滚动（鼠标滚轮直接滚表格；表头吸附） ===== */
.tbl-scroll { max-height: 560px; overflow-y: auto; overflow-x: auto; overscroll-behavior: contain; }
.tbl-scroll table { min-width: 860px; }
.tbl-scroll th { position: sticky; top: 0; background: #F7F9FC; z-index: 1; box-shadow: inset 0 -1px 0 var(--gd-border, #E5E9F0); }
