:root{
  --bg:#f4f6fa; --card:#ffffff; --line:#e3e8f0; --text:#1f2937; --muted:#6b7280;
  --primary:#1d4ed8; --primary-d:#1e40af; --danger:#dc2626;
  --gold:#b45309; --blue:#2563eb; --amber:#d97706; --purple:#7c3aed; --green:#16a34a; --gray:#64748b;
  --radius:12px; --shadow:0 1px 3px rgba(15,23,42,.08),0 6px 18px -8px rgba(15,23,42,.12);
}
*{box-sizing:border-box; margin:0; padding:0;}
body{font-family:"Microsoft YaHei","PingFang SC","Segoe UI",system-ui,sans-serif;background:var(--bg);color:var(--text);font-size:15px;}
button{font-family:inherit;cursor:pointer;}
input,select,textarea{font-family:inherit;font-size:15px;}

/* topbar */
.topbar{background:linear-gradient(120deg,#0f2a5c,#1d4ed8);color:#fff;padding:14px 22px;display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:10px;}
.brand{display:flex;gap:14px;align-items:center;}
.logo{background:#fff;color:#1d4ed8;font-weight:800;font-size:18px;padding:6px 10px;border-radius:10px;letter-spacing:.5px;}
.topbar h1{font-size:18px;font-weight:700;}
.topbar .sub{font-size:13px;opacity:.8;margin-top:2px;}
.top-actions{display:flex;gap:8px;flex-wrap:wrap;}

/* buttons */
.btn{border:1px solid transparent;border-radius:9px;padding:8px 14px;font-size:14px;font-weight:600;transition:.15s;white-space:nowrap;}
.btn.primary{background:#fff;color:#1d4ed8;}
.btn.primary:hover{background:#e6ecff;}
.btn.solid{background:var(--primary);color:#fff;}
.btn.solid:hover{background:var(--primary-d);}
.btn.ghost{background:rgba(255,255,255,.12);color:#fff;border-color:rgba(255,255,255,.28);}
.btn.ghost:hover{background:rgba(255,255,255,.22);}
/* 登录弹窗内的语言切换按钮：弹窗是白底，ghost 的白字会隐形，这里改为浅色可见样式 */
#loginLang{background:#fff;color:#334155;border:1px solid #cbd5e1;font-weight:600;}
#loginLang:hover{background:#f1f5f9;border-color:#94a3b8;}
.btn.small{padding:4px 9px;font-size:13px;border-radius:7px;}
.btn.mini{padding:2px 7px;font-size:12px;border-radius:6px;}
.btn.icon{background:transparent;border:none;color:#fff;font-size:16px;opacity:.85;}
.btn.icon:hover{opacity:1;}
.btn.danger-out{background:#fff;color:var(--danger);border-color:#fecaca;}
.btn.danger-out:hover{background:#fef2f2;}
.btn.gray{background:#eef1f6;color:#374151;border-color:#d7dee9;}
.btn.gray:hover{background:#e2e7ef;}
.btn.chip-btn{padding:5px 11px;font-size:13px;border-radius:999px;background:#fff;color:#374151;border:1px solid #d7dee9;}
.btn.chip-btn.active{background:var(--primary);color:#fff;border-color:var(--primary);}
.btn:disabled{opacity:.5;cursor:not-allowed;}

/* stats */
.stats{display:flex;gap:10px;padding:14px 22px 4px;flex-wrap:wrap;}
.stat{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:10px 16px;min-width:118px;box-shadow:var(--shadow);}
.stat .n{font-size:22px;font-weight:800;line-height:1.1;}
.stat .l{font-size:13px;color:var(--muted);margin-top:2px;}
.stat.due .n{color:var(--danger);}
.stat.signed .n{color:var(--green);}
.stat.arr .n{color:var(--primary);}

/* tabs */
.tabs{display:flex;gap:4px;padding:14px 22px 0;border-bottom:1px solid var(--line);margin-bottom:16px;}
.tab{background:transparent;border:none;padding:9px 18px;font-size:15px;font-weight:600;color:var(--muted);border-bottom:3px solid transparent;}
.tab.active{color:var(--primary);border-bottom-color:var(--primary);}
.view{padding:0 22px 30px;}
.hidden{display:none !important;}
main{max-width:1280px;margin:0 auto;width:100%;}

/* board */
.board-toolbar{display:flex;align-items:center;margin-bottom:12px;}
.board-toolbar .sp{flex:1;}
.board-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:14px;}
.fam-card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:16px;box-shadow:var(--shadow);cursor:pointer;transition:.15s;}
.fam-card:hover{border-color:#93b4f5;transform:translateY(-1px);}
.fam-card .fh{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px;}
.fam-card h3{font-size:15px;}
.fam-tag{background:#eef2ff;color:var(--primary);font-size:12px;font-weight:700;padding:3px 8px;border-radius:999px;}
.fam-nums{display:flex;gap:8px;margin:10px 0 12px;flex-wrap:wrap;}
.fn{background:#f6f8fb;border:1px solid var(--line);border-radius:8px;padding:6px 10px;text-align:center;flex:1;min-width:52px;}
.fn b{display:block;font-size:16px;}
.fn span{font-size:12px;color:var(--muted);}
.bar{height:7px;background:#eef1f6;border-radius:6px;overflow:hidden;display:flex;}
.bar i{display:block;height:100%;}
.mbar{display:flex;justify-content:space-between;font-size:12px;color:var(--muted);margin-top:6px;}

/* filters */
.filters{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:12px;}
.filters input[type=search]{padding:7px 11px;border:1px solid #d7dee9;border-radius:9px;min-width:220px;background:#fff;}
.filters select{padding:6px 8px;border:1px solid #d7dee9;border-radius:9px;background:#fff;}
.count{margin-left:auto;color:var(--muted);font-size:13px;}
.sec-title{font-size:16px;margin-bottom:4px;}
.hint{font-size:13px;color:var(--muted);font-weight:400;margin-left:8px;}

/* table */
.vtable-wrap{background:#fff;border:1px solid var(--line);border-radius:var(--radius);overflow:auto;box-shadow:var(--shadow);}
table.vtable{width:100%;border-collapse:collapse;min-width:1180px;}
.vtable th{position:sticky;top:0;background:#f8fafc;text-align:left;font-size:13px;color:var(--muted);padding:10px 10px;border-bottom:1px solid var(--line);white-space:nowrap;}
.vtable td{padding:9px 10px;border-bottom:1px solid #f0f3f8;vertical-align:middle;font-size:14px;}
.vtable tr:last-child td{border-bottom:none;}
.vtable tbody tr:hover{background:#f8faff;}
.cat-cell{max-width:230px;}
.cat-cell .cname{font-weight:600;}
.cat-cell .cmeta{font-size:12px;color:var(--muted);}
.vname{font-weight:700;}
.vcont{font-size:12px;color:var(--muted);}
.action-cell{white-space:nowrap;text-align:right;}

/* chips & tags */
.chip{display:inline-block;padding:2px 8px;border-radius:999px;font-size:11.5px;font-weight:600;white-space:nowrap;}
.tier-line{background:#fef3c7;color:#92400e;}
.tier-two{background:#dbeafe;color:#1e40af;}
.tier-three{background:#e2e8f0;color:#334155;}
.tier-none{background:#f1f5f9;color:#64748b;border:1px dashed #cbd5e1;}
.neg-0{background:#f1f5f9;color:#475569;}
.neg-1{background:#dbeafe;color:#1e40af;}
.neg-2{background:#fef3c7;color:#b45309;}
.neg-3{background:#ede9fe;color:#6d28d9;}
.neg-4{background:#dcfce7;color:#15803d;}
.neg-x{background:#f1f5f9;color:#94a3b8;text-decoration:line-through;}
.exh-0{background:#f1f5f9;color:#64748b;border:1px dashed #cbd5e1;}
.exh-1{background:#dbeafe;color:#1e40af;}
.exh-2{background:#fef3c7;color:#b45309;}
/* 优先级 */
.prio-0{background:#fee2e2;color:#b91c1c;border:1px solid #fecaca;}
.prio-1{background:#fef3c7;color:#b45309;border:1px solid #fde68a;}
.prio-2{background:#f1f5f9;color:#64748b;border:1px solid #e2e8f0;}
.prio-mini{display:inline-block;font-size:10.5px;font-weight:700;line-height:1;padding:2px 5px;border-radius:4px;margin-left:5px;vertical-align:1px;}
.exh-3{background:#dcfce7;color:#15803d;}
.risk{background:#fee2e2;color:#b91c1c;font-weight:700;}
.risk-none{display:none;}
.fam-chip{background:#eef2ff;color:#4338ca;font-size:12px;padding:1px 7px;border-radius:6px;white-space:nowrap;}
.due-today{color:var(--danger);font-weight:800;}
.due-soon{color:var(--amber);font-weight:700;}
.plan-badge{background:#eef1f6;color:#374151;border:1px solid #d7dee9;border-radius:6px;padding:1px 6px;font-size:12px;}
.empty{padding:46px 20px;text-align:center;color:var(--muted);}

/* remind list */
.remind-item{display:flex;gap:12px;align-items:center;background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:12px 16px;margin-bottom:9px;box-shadow:var(--shadow);}
.remind-item .d{font-weight:800;min-width:64px;}
.remind-item .who{font-weight:700;}
.remind-item .what{color:var(--muted);font-size:13px;}
.remind-item .grow{flex:1;}
.overdue .d{color:var(--danger);}

/* modal */
.modal-mask{position:fixed;inset:0;background:rgba(15,23,42,.5);display:flex;align-items:flex-start;justify-content:center;padding:40px 16px;z-index:50;overflow-y:auto;}
.modal{background:#fff;border-radius:16px;width:620px;max-width:100%;box-shadow:0 24px 60px -12px rgba(0,0,0,.35);display:flex;flex-direction:column;max-height:90vh;}
.modal.wide{width:860px;}
.modal-head{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;border-bottom:1px solid var(--line);}
.modal-head h3{font-size:16px;}
.modal-head .sp{flex:1;}
.btn.small{font-size:13px;padding:4px 10px;}
.modal-body{padding:16px 20px;overflow-y:auto;}
.modal-foot{display:flex;align-items:center;padding:12px 20px;border-top:1px solid var(--line);}
.modal-foot .sp{flex:1;}

/* form */
.fgrid{display:grid;grid-template-columns:1fr 1fr;gap:12px 14px;}
.fgrid .full{grid-column:1/-1;}
.field label{display:block;font-size:13px;color:var(--muted);margin-bottom:4px;font-weight:600;}
.field input,.field select,.field textarea{width:100%;padding:7px 10px;border:1px solid #d7dee9;border-radius:9px;background:#fff;}
.field textarea{resize:vertical;min-height:58px;}
.field input:focus,.field select:focus,.field textarea:focus{outline:2px solid #bfdbfe;border-color:var(--blue);}
.stage-groups{margin-top:4px;}
.sg{border:1px solid var(--line);border-radius:10px;padding:10px 12px;margin-bottom:10px;background:#fafbfd;}
.sg .sg-t{font-size:13px;font-weight:700;color:#374151;margin-bottom:7px;display:flex;justify-content:space-between;align-items:center;}
.seg{display:flex;gap:6px;flex-wrap:wrap;}
.seg .opt{font-size:13px;padding:4px 10px;border-radius:999px;border:1px solid #d7dee9;background:#fff;color:#475569;font-weight:600;}
.seg .opt.on{background:var(--primary);border-color:var(--primary);color:#fff;}
.seg .opt.giveup{color:#94a3b8;border-style:dashed;}
.seg .opt.giveup.on{background:#6b7280;border-color:#6b7280;}
.small-inline{display:flex;gap:8px;align-items:center;margin-top:7px;}
.small-inline select{width:auto;}
.ql{display:flex;justify-content:space-between;font-size:12px;color:var(--muted);margin-top:4px;}
.log-box{background:#f8fafc;border:1px solid var(--line);border-radius:10px;padding:8px 10px;max-height:150px;overflow-y:auto;margin-top:6px;}
.log-box .lg{font-size:13px;padding:3px 0;border-bottom:1px dashed #e8edf4;}
.log-box .lg:last-child{border-bottom:none;}
.log-box .lg .lt{color:var(--muted);font-size:12px;margin-right:6px;}
.fam-list .fam-row{display:flex;align-items:center;gap:10px;background:#fafbfd;border:1px solid var(--line);border-radius:10px;padding:9px 12px;margin-bottom:8px;}
.fam-row .code{background:#eef2ff;color:#4338ca;font-weight:800;font-size:13px;padding:2px 8px;border-radius:6px;}
.fam-row .cat-main{flex:1;min-width:0;}
.fam-row .cat-main b{font-size:15px;}
.fam-row .cat-main p{font-size:13px;color:var(--muted);margin-top:2px;}
.vrow{background:#fff;border:1px solid #e8edf4;border-radius:8px;padding:7px 10px;margin:6px 0 6px 18px;display:flex;align-items:center;gap:10px;flex-wrap:wrap;}
.muted{color:var(--muted);}
.small{font-size:13px;}
#toastBox{position:fixed;bottom:24px;right:24px;z-index:99;display:flex;flex-direction:column;gap:8px;}
.toast{background:#111827;color:#fff;padding:10px 16px;border-radius:10px;font-size:14px;box-shadow:0 8px 20px rgba(0,0,0,.25);animation:fadein .2s;}
.toast.err{background:#b91c1c;}
@keyframes fadein{from{opacity:0;transform:translateY(6px);}to{opacity:1;transform:none;}}

/* ---------- 登录与用户徽标 ---------- */
.user-badge{display:inline-flex;align-items:center;gap:6px;margin-right:2px;}
.user-badge .uname{font-size:14px;font-weight:700;color:rgba(255,255,255,.95);text-shadow:0 1px 2px rgba(0,0,0,.3);}
.urole{display:inline-block;padding:2px 9px;border-radius:999px;font-size:11.5px;font-weight:700;}
.r-admin{background:#dcfce7;color:#15803d;}
.r-view{background:#e0e7ff;color:#4338ca;}
.login-err{color:#b91c1c;font-size:12.5px;min-height:18px;margin-top:8px;font-weight:600;}
#loginMask{z-index:200;}
/* 只读账号：隐藏一切写操作入口 */
body.readonly [data-act="edit"],
body.readonly [data-act="record"],
body.readonly [data-act="del"],
body.readonly [data-act="addv"],
body.readonly [data-act="addcat"],
body.readonly [data-act="editcat"],
body.readonly [data-act="delcat"],
body.readonly #btnAddCat,
body.readonly #btnAddCat2,
body.readonly #btnSeed,
body.readonly .admin-only,
body.readonly #btnSaveVendor,
body.readonly #btnSaveCat{display:none !important;}

/* 合作邀请函下载 */
.doc-row{display:flex;align-items:center;gap:14px;border:1px solid var(--line);border-radius:12px;padding:12px 14px;margin-bottom:10px;background:#fafbfd;}
.doc-row .doc-info{flex:1;min-width:0;}
.doc-head{display:flex;align-items:center;gap:8px;margin-bottom:3px;}
.doc-head b{font-size:15px;}
.doc-tag{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:7px;font-size:11.5px;font-weight:800;color:#fff;flex:none;}
.doc-tag.zh{background:#1d4ed8;}
.doc-tag.en{background:#7c3aed;}
.doc-row a.btn{text-decoration:none;}
