:root{
  --bg:#f2f5fa; --panel:#ffffff; --panel-2:#f8fafc;
  --line:#e3e9f2; --line-2:#eef2f7;
  --txt:#1f2937; --txt-2:#5b6779; --txt-3:#8b96a8;
  --brand:#1268d6; --brand-2:#0b4ea8; --brand-soft:#e8f1fd;
  --ok:#199a4f; --ok-soft:#e6f6ec;
  --warn:#d98200; --warn-soft:#fdf3e2;
  --danger:#d63b3b; --danger-soft:#fdecec;
  --purple:#6f42c1; --purple-soft:#f1ebfb;
  --r:10px; --r-sm:6px;
  --sh:0 1px 2px rgba(16,32,64,.05),0 4px 14px rgba(16,32,64,.05);
}
*{box-sizing:border-box}
html,body{height:100%}
body{
  margin:0;background:var(--bg);color:var(--txt);
  font:14px/1.6 "Microsoft YaHei","PingFang SC","Hiragino Sans GB",Arial,sans-serif;
  -webkit-font-smoothing:antialiased;
}
a{text-decoration:none;color:inherit}
h1,h2,h3,h4{margin:0;font-weight:600}
.hidden{display:none !important}
#app{display:flex;height:100vh;overflow:hidden}

/* ---------------- sidebar ---------------- */
.sidebar{
  width:236px;flex:0 0 236px;background:#0e2b52;color:#cbd8ea;
  display:flex;flex-direction:column;
}
.brand{display:flex;gap:10px;padding:16px 16px 14px;border-bottom:1px solid rgba(255,255,255,.08)}
.brand-mark{
  width:38px;height:38px;border-radius:9px;flex:0 0 38px;
  background:linear-gradient(135deg,#2b8bff,#1268d6);color:#fff;
  display:flex;align-items:center;justify-content:center;font-size:19px;font-weight:700;
}
.brand-title{color:#fff;font-size:14.5px;font-weight:600;letter-spacing:.3px}
.brand-sub{font-size:11px;color:#8fa6c4;line-height:1.35;margin-top:2px}
#nav{padding:10px 8px;overflow:auto;flex:1}
.nav-item{
  display:flex;align-items:center;gap:10px;padding:9px 11px;margin-bottom:3px;
  border-radius:8px;color:#c3d2e6;font-size:13.6px;cursor:pointer;transition:.15s;
}
.nav-item span{display:flex;flex-direction:column}
.nav-item em{font-style:normal;font-size:10px;color:#7189a8;letter-spacing:.5px}
.nav-item:hover{background:rgba(255,255,255,.07);color:#fff}
.nav-item.active{background:linear-gradient(90deg,#1268d6,#1c7df0);color:#fff;box-shadow:0 2px 10px rgba(18,104,214,.35)}
.nav-item.active em{color:#cfe4ff}
.ic{width:17px;height:17px;flex:0 0 17px;background-size:contain;background-repeat:no-repeat;opacity:.9}
.ic-home{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='%23c3d2e6' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M3 10l9-7 9 7v10a1 1 0 0 1-1 1h-5v-6H9v6H4a1 1 0 0 1-1-1z'/%3E%3C/svg%3E")}
.nav-item.active .ic{filter:brightness(3)}
.ic-judge{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='%23c3d2e6' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='11' cy='11' r='7'/%3E%3Cpath d='M20 20l-4-4'/%3E%3C/svg%3E")}
.ic-list{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='%23c3d2e6' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M8 6h13M8 12h13M8 18h13M3 6h.01M3 12h.01M3 18h.01'/%3E%3C/svg%3E")}
.ic-file{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='%23c3d2e6' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8z'/%3E%3Cpath d='M14 3v5h5'/%3E%3C/svg%3E")}
.ic-check{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='%23c3d2e6' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M9 11l3 3L22 4'/%3E%3Cpath d='M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11'/%3E%3C/svg%3E")}
.ic-gavel{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='%23c3d2e6' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 13l6-6 6 6-6 6z'/%3E%3Cpath d='M12 19l8-8'/%3E%3C/svg%3E")}
.ic-book{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='%23c3d2e6' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M4 5a2 2 0 0 1 2-2h13v18H6a2 2 0 0 1-2-2z'/%3E%3Cpath d='M8 3v18'/%3E%3C/svg%3E")}
.ic-chart{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='%23c3d2e6' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M4 20h16M8 16v-5M13 16V7M18 16v-8'/%3E%3C/svg%3E")}
.ic-cog{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='%23c3d2e6' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='3'/%3E%3Cpath d='M12 2v3M12 19v3M2 12h3M19 12h3M5 5l2 2M17 17l2 2M19 5l-2 2M7 17l-2 2'/%3E%3C/svg%3E")}
.side-foot{padding:10px 14px 14px;border-top:1px solid rgba(255,255,255,.08)}
.db-pill{font-size:11px;color:#7f96b5;line-height:1.6;word-break:break-all}
.db-pill.muted{color:#5d7391}

/* ---------------- topbar ---------------- */
.main{flex:1;display:flex;flex-direction:column;overflow:hidden}
.topbar{
  height:60px;flex:0 0 60px;background:var(--panel);border-bottom:1px solid var(--line);
  display:flex;align-items:center;justify-content:space-between;padding:0 22px;
}
.crumb h1{font-size:17px;letter-spacing:.2px}
.crumb p{margin:1px 0 0;font-size:12px;color:var(--txt-3)}
.topbar-right{display:flex;align-items:center;gap:12px}
.today{font-size:12.5px;color:var(--txt-2)}
.content{flex:1;overflow:auto;padding:18px 22px 40px}

/* ---------------- generic ---------------- */
.card{background:var(--panel);border:1px solid var(--line);border-radius:var(--r);box-shadow:var(--sh)}
.card-hd{padding:12px 16px;border-bottom:1px solid var(--line-2);display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap}
.card-hd h3{font-size:14.5px}
.card-hd .sub{font-size:12px;color:var(--txt-3);font-weight:400}
.card-bd{padding:14px 16px}
.grid{display:grid;gap:14px}
.g2{grid-template-columns:repeat(2,minmax(0,1fr))}
.g3{grid-template-columns:repeat(3,minmax(0,1fr))}
.g4{grid-template-columns:repeat(4,minmax(0,1fr))}
.rowflex{display:flex;gap:10px;align-items:center;flex-wrap:wrap}
.spacer{flex:1}
.mt12{margin-top:12px}.mt16{margin-top:16px}

.btn{
  border:1px solid var(--line);background:#fff;color:var(--txt);
  padding:6px 13px;border-radius:var(--r-sm);font-size:13px;cursor:pointer;
  font-family:inherit;transition:.15s;white-space:nowrap;
}
.btn:hover{border-color:#c6d3e6;background:var(--panel-2)}
.btn.primary{background:var(--brand);border-color:var(--brand);color:#fff}
.btn.primary:hover{background:var(--brand-2)}
.btn.ghost{background:transparent}
.btn.danger{color:var(--danger);border-color:#f3c9c9}
.btn.danger:hover{background:var(--danger-soft)}
.btn.sm{padding:3px 9px;font-size:12px}
.btn:disabled{opacity:.5;cursor:not-allowed}

input,select,textarea{
  font-family:inherit;font-size:13px;color:var(--txt);background:#fff;
  border:1px solid var(--line);border-radius:var(--r-sm);padding:6px 9px;outline:none;width:100%;
}
input:focus,select:focus,textarea:focus{border-color:var(--brand);box-shadow:0 0 0 3px rgba(18,104,214,.1)}
textarea{resize:vertical;line-height:1.65}
label.fl{display:block;font-size:12px;color:var(--txt-2);margin-bottom:4px}
.field{margin-bottom:11px}
.searchbox{position:relative}
.searchbox input{padding-left:28px}
.searchbox:before{
  content:"";position:absolute;left:9px;top:50%;width:12px;height:12px;margin-top:-6px;
  background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='%238b96a8' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='11' cy='11' r='7'/%3E%3Cpath d='M20 20l-4-4'/%3E%3C/svg%3E") center/contain no-repeat;
}

/* dict field with add button */
.dict{display:flex;gap:6px}
.dict select{flex:1}
.dict .btn{flex:0 0 auto;padding:6px 9px}

/* chips */
.chip{display:inline-flex;align-items:center;gap:5px;padding:2px 9px;border-radius:20px;font-size:12px;line-height:1.7;white-space:nowrap}
.chip.blue{background:var(--brand-soft);color:var(--brand-2)}
.chip.green{background:var(--ok-soft);color:#12693a}
.chip.amber{background:var(--warn-soft);color:#a26200}
.chip.red{background:var(--danger-soft);color:#a52727}
.chip.purple{background:var(--purple-soft);color:#5a2fa0}
.chip.grey{background:#eef1f5;color:#5b6779}

.dot{width:7px;height:7px;border-radius:50%;display:inline-block;margin-right:6px}
.d-red{background:#d63b3b}.d-orange{background:#e8851a}.d-amber{background:#d9b300}
.d-blue{background:#1268d6}.d-green{background:#199a4f}.d-grey{background:#9aa5b5}

/* table */
.tbl-wrap{overflow:auto;border:1px solid var(--line);border-radius:var(--r);background:#fff}
table.tbl{width:100%;border-collapse:collapse;font-size:13px}
table.tbl th{
  background:var(--panel-2);text-align:left;font-weight:600;color:var(--txt-2);
  padding:9px 10px;border-bottom:1px solid var(--line);white-space:nowrap;position:sticky;top:0;z-index:2;
}
table.tbl td{padding:9px 10px;border-bottom:1px solid var(--line-2);vertical-align:top}
table.tbl tr:hover td{background:#fafbfd}
table.tbl td.nowrap{white-space:nowrap}
.tbl-empty{padding:40px;text-align:center;color:var(--txt-3)}
.opgroup{display:flex;gap:5px;flex-wrap:wrap}
.lnk{color:var(--brand);cursor:pointer;font-size:12.5px}
.lnk:hover{text-decoration:underline}
.lnk.red{color:var(--danger)}
.clamp2{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.clamp3{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}

/* KPI */
.kpi{background:#fff;border:1px solid var(--line);border-radius:var(--r);padding:14px 16px;box-shadow:var(--sh);position:relative;overflow:hidden}
.kpi .k-label{font-size:12.5px;color:var(--txt-2)}
.kpi .k-val{font-size:27px;font-weight:700;letter-spacing:.5px;margin-top:4px;line-height:1.2}
.kpi .k-sub{font-size:11.5px;color:var(--txt-3);margin-top:3px}
.kpi .k-bar{position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--brand)}
.kpi.red .k-bar{background:var(--danger)}.kpi.amber .k-bar{background:var(--warn)}
.kpi.green .k-bar{background:var(--ok)}.kpi.purple .k-bar{background:var(--purple)}

/* chart */
.chart{width:100%;height:290px}
.chart.lg{height:340px}
.chart.sm{height:240px}

/* modal */
.modal-root{position:fixed;inset:0;background:rgba(14,32,58,.42);z-index:100;display:flex;align-items:flex-start;justify-content:center;padding:36px 20px;overflow:auto}
.modal{background:#fff;border-radius:12px;width:100%;max-width:920px;box-shadow:0 20px 60px rgba(10,30,60,.3);animation:pop .18s ease}
.modal.wide{max-width:1080px}
.modal.narrow{max-width:520px}
@keyframes pop{from{transform:translateY(10px);opacity:0}to{transform:none;opacity:1}}
.modal-hd{padding:13px 18px;border-bottom:1px solid var(--line-2);display:flex;justify-content:space-between;align-items:center}
.modal-hd h3{font-size:15px}
.modal-bd{padding:16px 18px;max-height:70vh;overflow:auto}
.modal-ft{padding:12px 18px;border-top:1px solid var(--line-2);display:flex;justify-content:flex-end;gap:9px}
.x-btn{border:none;background:none;font-size:20px;color:var(--txt-3);cursor:pointer;line-height:1}
.x-btn:hover{color:var(--txt)}

/* toast */
.toast-root{position:fixed;top:18px;left:50%;transform:translateX(-50%);z-index:200;display:flex;flex-direction:column;gap:8px;align-items:center}
.toast{background:#12325c;color:#fff;padding:9px 16px;border-radius:20px;font-size:13px;box-shadow:0 8px 24px rgba(10,30,60,.28);animation:tin .2s ease}
.toast.ok{background:#137a41}.toast.err{background:#b53333}
@keyframes tin{from{transform:translateY(-8px);opacity:0}to{transform:none;opacity:1}}

/* judge result */
.jr{border:1px solid var(--line);border-radius:9px;margin-bottom:9px;background:#fff;overflow:hidden}
.jr-hd{display:flex;gap:10px;align-items:flex-start;padding:10px 12px;background:var(--panel-2);border-bottom:1px solid var(--line-2)}
.jr-code{font-family:Consolas,Monaco,monospace;font-size:12px;color:var(--brand-2);background:var(--brand-soft);padding:1px 7px;border-radius:4px;white-space:nowrap}
.jr-body{padding:10px 12px}
.jr-body ul{margin:5px 0 0;padding-left:20px;color:var(--txt-2)}
.jr-body li{margin-bottom:4px}
.jr-meta{font-size:11.5px;color:var(--txt-3);margin-top:8px}
.score-bar{display:inline-block;min-width:44px;height:5px;border-radius:3px;background:var(--brand);vertical-align:middle}

.tabs{display:flex;gap:4px;border-bottom:1px solid var(--line);margin-bottom:14px;flex-wrap:wrap}
.tab{padding:7px 14px;font-size:13px;color:var(--txt-2);cursor:pointer;border-bottom:2px solid transparent;margin-bottom:-1px}
.tab:hover{color:var(--txt)}
.tab.active{color:var(--brand);border-bottom-color:var(--brand);font-weight:600}

.form-grid2{display:grid;grid-template-columns:1fr 1fr;gap:0 16px}
.form-grid3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:0 14px}
hr.sep{border:none;border-top:1px dashed var(--line);margin:14px 0}
.sec-title{font-size:12.5px;font-weight:600;color:var(--brand-2);background:var(--brand-soft);display:inline-block;padding:2px 10px;border-radius:4px;margin-bottom:10px}

/* print */
.print-area{display:none}
@media print{
  body>*{display:none !important}
  .print-area{display:block !important;position:static}
  .print-area .pg{page-break-after:always}
  .print-area table{width:100%;border-collapse:collapse;font-size:11pt}
  .print-area td,.print-area th{border:1px solid #333;padding:6px 8px}
  .print-area h2{text-align:center;font-size:16pt;margin:0 0 6px}
  .print-area .pinfo{font-size:10.5pt;margin-bottom:8px}
}
.formdoc{background:#fff;padding:26px 30px;max-width:900px;margin:0 auto;border:1px solid var(--line)}
.formdoc h2{text-align:center;font-size:19px;letter-spacing:2px;margin-bottom:4px}
.formdoc .pinfo{text-align:center;color:var(--txt-2);font-size:12.5px;margin-bottom:14px}
.formdoc table{width:100%;border-collapse:collapse;font-size:12.5px}
.formdoc td,.formdoc th{border:1px solid #4a5a70;padding:7px 9px;vertical-align:middle}
.formdoc td.lbl{background:#f4f7fb;width:120px;color:#35507a;font-weight:600;white-space:nowrap}
.formdoc .stage{text-align:center;font-weight:600;width:52px;background:#f4f7fb}

.emptybox{padding:36px;text-align:center;color:var(--txt-3);font-size:13px}
.pill-count{background:var(--brand-soft);color:var(--brand-2);border-radius:10px;padding:0 7px;font-size:11.5px;margin-left:5px}
.photo-slot{border:1px dashed var(--line);border-radius:8px;min-height:90px;display:flex;align-items:center;justify-content:center;color:var(--txt-3);font-size:12px;background:var(--panel-2);overflow:hidden}
.photo-slot img{max-width:100%;max-height:180px;display:block}
.photo-row{display:grid;grid-template-columns:1fr 1fr;gap:14px}

/* ================= 密码层：登录遮罩 ================= */
.login-root{position:fixed;inset:0;z-index:9999;display:flex;align-items:center;justify-content:center;
  background:radial-gradient(1200px 700px at 50% -10%,#1b3a68,#0d1424 60%)}
.login-card{width:400px;max-width:92vw;background:#fff;border-radius:16px;padding:34px 34px 24px;
  box-shadow:0 24px 70px rgba(0,0,0,.45);text-align:center}
.login-mark{width:56px;height:56px;border-radius:14px;margin:0 auto 12px;display:flex;align-items:center;
  justify-content:center;font-size:24px;font-weight:700;color:#fff;
  background:linear-gradient(135deg,#1268d6,#1c7df0);box-shadow:0 8px 20px rgba(18,104,214,.35)}
.login-card h2{margin:0 0 4px;font-size:19px;color:#16233b;letter-spacing:.5px}
.login-sub{margin:0 0 16px;font-size:12.5px;color:#7b8798;line-height:1.6}
.login-field{text-align:left;margin-bottom:12px}
.login-field label{display:block;font-size:12px;color:#5b6779;margin-bottom:5px}
.login-field input{width:100%;height:40px;padding:0 12px;border:1px solid #d8dfe9;border-radius:9px;
  font-size:14px;outline:none;box-sizing:border-box}
.login-field input:focus{border-color:#1c7df0;box-shadow:0 0 0 3px rgba(28,125,240,.13)}
.login-remember{display:flex;align-items:center;gap:6px;font-size:12.5px;color:#6b7686;margin:2px 0 14px}
.login-btn{width:100%;height:42px;font-size:15px;letter-spacing:4px}
.login-tip{background:#fdecec;color:#c0392b;border:1px solid #f8cfcf;border-radius:8px;
  font-size:12.5px;padding:7px 10px;margin-bottom:12px;text-align:left}
.login-foot{margin-top:14px;font-size:11.5px;color:#96a0af;line-height:1.7}
.user-pill{display:flex;align-items:center;gap:8px}
.user-pill .who{font-size:12.5px;color:var(--txt-2);background:var(--panel-2);border:1px solid var(--line);
  border-radius:20px;padding:4px 12px}

/* ================= 日记层 ================= */
.jr-hero{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:12px}
.jr-stat{border:1px solid var(--line);border-radius:10px;padding:12px 14px;background:var(--panel-2)}
.jr-stat .n{font-size:22px;font-weight:700;color:var(--txt);line-height:1.2}
.jr-stat .l{font-size:11.5px;color:var(--txt-3);margin-top:3px}
.jr-stat.warn .n{color:#d9480f}
.jr-stat.danger .n{color:#c0392b}
.jr-stat.ok .n{color:#2b7a3d}
.timeline{position:relative;padding-left:22px}
.timeline:before{content:"";position:absolute;left:7px;top:6px;bottom:6px;width:2px;background:var(--line)}
.tl-item{position:relative;padding:8px 0 10px;border-bottom:1px dashed var(--line-2)}
.tl-item:before{content:"";position:absolute;left:-19px;top:13px;width:10px;height:10px;border-radius:50%;
  background:#9db4d0;border:2px solid var(--panel)}
.tl-item.k-log:before{background:#2b7a3d}
.tl-item.k-imp:before{background:#1268d6}
.tl-item.k-cloud:before{background:#8e44ad}
.tl-item.k-note:before{background:#e08a00}
.tl-hd{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.tl-act{font-size:13.2px;font-weight:600;color:var(--txt)}
.tl-time{font-size:11.5px;color:var(--txt-3);margin-left:auto}
.tl-detail{font-size:12.3px;color:var(--txt-2);margin-top:3px;line-height:1.7;word-break:break-all}
.note-card{border:1px solid var(--line);border-left:3px solid #e08a00;border-radius:8px;padding:10px 12px;
  background:var(--panel-2);margin-bottom:10px}
.note-card .nt{font-size:11.5px;color:var(--txt-3);margin-bottom:4px}
.note-card .nb{font-size:13px;line-height:1.8;white-space:pre-wrap;word-break:break-word}

/* ================= 云端共享 ================= */
.cloud-step{display:flex;gap:10px;align-items:flex-start;padding:10px 0;border-bottom:1px dashed var(--line-2)}
.cloud-step .idx{flex:0 0 24px;height:24px;border-radius:50%;background:var(--brand);color:#fff;font-size:12.5px;
  display:flex;align-items:center;justify-content:center;margin-top:1px}
.cloud-step .txt{font-size:12.8px;line-height:1.85;color:var(--txt-2)}
.sync-log{max-height:230px;overflow:auto;font-size:12.2px;line-height:1.9}
.sync-log .ok{color:#2b7a3d}
.sync-log .bad{color:#c0392b}
.url-chip{display:inline-block;background:var(--panel-2);border:1px solid var(--line);border-radius:6px;
  padding:3px 9px;font-size:12.2px;margin:3px 6px 3px 0;font-family:Consolas,monospace;cursor:pointer}
.url-chip:hover{border-color:var(--brand);color:var(--brand)}
