:root{--primary: #0b6efd;--primary-dark: #0958c7;--bg: #f4f6fa;--card: #ffffff;--text: #1a2233;--text-2: #5b6b80;--text-3: #93a1b5;--line: #e8edf4;--red: #e5484d;--green: #30a46c;--orange: #f76b15;--radius: 14px;--shadow: 0 1px 3px rgba(20, 40, 80, .06), 0 4px 14px rgba(20, 40, 80, .05);--safe-b: env(safe-area-inset-bottom, 0px)}*{box-sizing:border-box;margin:0;padding:0;-webkit-tap-highlight-color:transparent}html,body{height:100%}body{font-family:-apple-system,BlinkMacSystemFont,PingFang SC,Microsoft YaHei,Helvetica Neue,sans-serif;background:var(--bg);color:var(--text);line-height:1.5}a{color:var(--primary);text-decoration:none}.btn{border:none;border-radius:10px;padding:10px 16px;font-size:15px;cursor:pointer;transition:opacity .15s,transform .08s;background:var(--primary);color:#fff}.btn:active{transform:scale(.97)}.btn.ghost{background:#eef4ff;color:var(--primary)}.btn.danger{background:#fdecec;color:var(--red)}.btn:disabled{opacity:.5;cursor:not-allowed}.input,.select,.textarea{width:100%;border:1px solid var(--line);border-radius:10px;padding:10px 12px;font-size:15px;background:#fff;outline:none}.input:focus,.textarea:focus{border-color:var(--primary)}.topbar{position:sticky;top:0;z-index:30;background:var(--primary);color:#fff;padding:calc(14px + env(safe-area-inset-top,0px)) 16px 14px}.topbar h1{font-size:19px;font-weight:700}.topbar .sub{font-size:12px;opacity:.85;margin-top:2px}.stats-row{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;padding:14px 16px}.stat{background:var(--card);border-radius:var(--radius);box-shadow:var(--shadow);padding:12px 8px;text-align:center}.stat .num{font-size:22px;font-weight:800;color:var(--primary)}.stat .lbl{font-size:12px;color:var(--text-2);margin-top:2px}.filters{padding:0 16px 10px}.search-row{display:flex;gap:8px;margin-bottom:10px}.search-row .input{flex:1}.chips{display:flex;gap:8px;flex-wrap:wrap}.chip{background:var(--card);border:1px solid var(--line);color:var(--text-2);padding:6px 13px;border-radius:20px;font-size:13px;cursor:pointer}.chip.active{background:var(--primary);border-color:var(--primary);color:#fff}.tender-list{padding:0 16px calc(80px + var(--safe-b))}.tender-card{background:var(--card);border-radius:var(--radius);box-shadow:var(--shadow);padding:14px;margin-bottom:12px;cursor:pointer}.tender-card .t-title{font-size:16px;font-weight:600;line-height:1.45;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.tender-card .t-meta{display:flex;flex-wrap:wrap;gap:6px 12px;margin-top:10px;font-size:12.5px;color:var(--text-2)}.tender-card .t-tags{margin-top:10px;display:flex;flex-wrap:wrap;gap:6px}.tag{font-size:11.5px;padding:2px 9px;border-radius:6px}.tag.cat{background:#eef4ff;color:var(--primary)}.tag.kw{background:#fff1e6;color:var(--orange)}.tag.fav{background:#fff7d6;color:#9a7d0a}.relevance{font-size:11.5px;color:var(--green);font-weight:700}.badge-new{background:var(--red);color:#fff;font-size:10.5px;padding:2px 7px;border-radius:5px;margin-right:6px}.detail{padding:16px 16px calc(90px + var(--safe-b))}.detail .d-title{font-size:20px;font-weight:700;line-height:1.4}.detail .d-meta{background:var(--card);border-radius:var(--radius);box-shadow:var(--shadow);padding:14px;margin-top:14px;font-size:14px}.detail .d-meta .row{display:flex;justify-content:space-between;padding:8px 0;border-bottom:1px solid var(--line)}.detail .d-meta .row:last-child{border:none}.detail .d-meta .k{color:var(--text-2)}.detail .d-meta .v{text-align:right;max-width:65%;word-break:break-all;color:var(--text)}.detail .d-body{background:var(--card);border-radius:var(--radius);box-shadow:var(--shadow);padding:16px;margin-top:14px;font-size:15px;line-height:1.85;white-space:pre-wrap;word-break:break-word}.detail .d-body:empty:before{content:"（暂无正文，可点击来源链接查看原文）";color:var(--text-3)}.empty{text-align:center;color:var(--text-3);padding:40px 20px}.loading{text-align:center;color:var(--text-3);padding:30px}.bottom-nav{position:fixed;bottom:0;left:0;right:0;background:#fff;border-top:1px solid var(--line);display:flex;padding-bottom:var(--safe-b);z-index:40}.bottom-nav .item{flex:1;padding:9px 0 7px;text-align:center;font-size:12px;color:var(--text-3);cursor:pointer}.bottom-nav .item.active{color:var(--primary);font-weight:600}.bottom-nav .item .ic{font-size:20px;display:block;margin-bottom:2px;line-height:1}.action-bar{position:fixed;bottom:0;left:0;right:0;display:flex;gap:10px;padding:12px 16px calc(12px + var(--safe-b));background:#fff;border-top:1px solid var(--line);z-index:40}.action-bar .btn{flex:1}.panel{padding:16px;padding-bottom:calc(30px + var(--safe-b))}.panel-title{font-size:16px;font-weight:700;margin-bottom:12px}.kw-item{background:var(--card);border-radius:12px;box-shadow:var(--shadow);padding:12px 14px;margin-bottom:10px;display:flex;justify-content:space-between;align-items:center}.kw-item .info{display:flex;align-items:center;gap:8px}.kw-item .cat-badge{font-size:11px;background:#eef4ff;color:var(--primary);padding:2px 8px;border-radius:5px}.kw-item .name{font-weight:600;font-size:15px}.kw-item .ops{display:flex;gap:6px}.mini-btn{font-size:12px;padding:4px 9px;border-radius:7px;border:1px solid var(--line);background:#fff;cursor:pointer}.mini-btn.primary{color:var(--primary)}.mini-btn.danger{color:var(--red)}.mini-btn.off{color:var(--text-3)}.src-card{background:var(--card);border-radius:12px;box-shadow:var(--shadow);padding:13px 14px;margin-bottom:10px}.src-card .hd{display:flex;justify-content:space-between;align-items:center}.src-card .nm{font-weight:600}.src-card .st{font-size:11.5px;padding:3px 9px;border-radius:6px}.src-card .st.on{background:#e8f7ef;color:var(--green)}.src-card .st.off{background:#f0f2f5;color:var(--text-3)}.src-card .info{font-size:12.5px;color:var(--text-2);margin-top:6px}.modal-mask{position:fixed;top:0;right:0;bottom:0;left:0;background:#0a142873;z-index:60;display:flex;align-items:flex-end;justify-content:center}.modal{background:#fff;width:100%;max-width:520px;border-radius:18px 18px 0 0;padding:18px 16px calc(18px + var(--safe-b));max-height:88vh;overflow-y:auto}.modal .m-title{font-size:17px;font-weight:700;margin-bottom:14px}.modal .field{margin-bottom:12px}.modal .field label{display:block;font-size:13px;color:var(--text-2);margin-bottom:5px}.modal .m-actions{display:flex;gap:10px;margin-top:16px}.modal .m-actions .btn{flex:1}.toast{position:fixed;bottom:110px;left:50%;transform:translate(-50%);background:#141e32eb;color:#fff;padding:10px 18px;border-radius:10px;font-size:14px;z-index:100;animation:fadeUp .2s ease}@keyframes fadeUp{0%{opacity:0;transform:translate(-50%,8px)}to{opacity:1;transform:translate(-50%)}}@media(min-width:768px){body{max-width:1100px;margin:0 auto}.tender-list{display:grid;grid-template-columns:1fr 1fr;gap:12px}.stats-row{grid-template-columns:repeat(4,160px)}.filters{max-width:1000px}}.sort-bar{display:flex;align-items:center;flex-wrap:wrap;gap:6px;padding:2px 0 10px;font-size:12.5px}.sort-label{color:var(--text-3);margin-right:2px}.sort-item{padding:4px 10px;border:1px solid var(--border);border-radius:14px;color:var(--text-2);cursor:pointer;-webkit-user-select:none;user-select:none;transition:all .15s}.sort-item:hover{border-color:var(--primary);color:var(--primary)}.sort-item.active{background:var(--primary);border-color:var(--primary);color:#fff;font-weight:600}.sort-dir{margin-left:auto;padding:4px 10px;border-radius:14px;background:#f2f5fa;color:var(--text-2);cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap}.sort-dir:hover{background:#e6ecf7;color:var(--primary)}.pager{padding:18px 0 28px;text-align:center}.pager-info{font-size:12px;color:var(--text-3);margin-bottom:10px}.pager-btns{display:flex;flex-wrap:wrap;justify-content:center;gap:6px}.pg{min-width:34px;height:32px;padding:0 10px;border:1px solid var(--border);border-radius:6px;background:#fff;color:var(--text-2);font-size:13px;line-height:1;cursor:pointer;transition:all .15s}.pg:hover:not(:disabled){border-color:var(--primary);color:var(--primary)}.pg.active{background:var(--primary);border-color:var(--primary);color:#fff;font-weight:600}.pg:disabled{opacity:.45;cursor:not-allowed}.pg.dots{border:none;background:transparent;cursor:default;min-width:20px;color:var(--text-3)}@media(min-width:720px){.pager{grid-column:1 / -1}.sort-bar{padding-bottom:14px}}.badge-failed{display:inline-block;margin-right:6px;padding:1px 7px;border-radius:4px;background:#e34d59;color:#fff;font-size:12px;font-weight:600;vertical-align:2px}.tender-card.card-failed{border-left:4px solid #e34d59;background:linear-gradient(90deg,rgba(227,77,89,.06),transparent 60%)}.tender-card.card-failed .t-title{color:#b3282f}.tender-card.card-linked{border-left:4px solid #2f6fd0}.tender-card.card-failed.card-linked{border-left:4px solid #e34d59}.chip-failed{color:#b3282f}.chip-failed.active{background:#e34d59;color:#fff;border-color:#e34d59}.tag.failed{background:#e34d59;color:#fff}.tag.rel{font-weight:600}.tag.rel.rel-fail{background:#fdecec;color:#b3282f;border:1px solid #f3b9b9}.tag.rel.rel-win{background:#e8f5ec;color:#1c7a3e;border:1px solid #a8d9ba}.tag.rel.rel-bid{background:#eaf1fb;color:#1f5fa8;border:1px solid #b4cdec}.tag.biz{background:#ede9fe;color:#5b3fc4;border:1px solid #c9bcf5}.biz-bar{display:flex;align-items:center;gap:8px;margin-top:10px;padding:9px 10px;background:#f7f7fb;border:1px solid #e6e4f2;border-radius:10px}.biz-bar.active{background:#f2effe;border-color:#b9a8f0}.biz-label{flex-shrink:0;font-size:12.5px;color:#5a5a68;font-weight:600}.biz-tags{display:flex;flex-wrap:wrap;gap:6px}.biz-tag{padding:3px 9px;border:1px solid #d8d5e8;border-radius:12px;background:#fff;color:#55525f;font-size:12.5px;cursor:pointer;-webkit-user-select:none;user-select:none;transition:all .15s}.biz-tag:hover{border-color:#8f7ae6;color:#5b3fc4}.biz-tag.on{background:#6a4fd0;border-color:#6a4fd0;color:#fff;font-weight:600}.biz-clear{flex-shrink:0;margin-left:auto;font-size:12px;color:#8a8695;text-decoration:underline;cursor:pointer}.adv-toggle{display:none}@media(max-width:767.98px){.adv-toggle{display:flex;align-items:center;justify-content:center;gap:6px;width:100%;margin-top:10px;padding:8px 12px;background:#fff;border:1px dashed #c4d2e8;border-radius:10px;color:var(--text-2);font-size:13px;font-family:inherit;cursor:pointer;-webkit-user-select:none;user-select:none;transition:background .15s,border-color .15s}.adv-toggle:hover{border-color:#9db8e0}.adv-toggle:active{background:#f2f6fd}.adv-arrow{display:inline-block;font-size:10px;line-height:1;color:var(--text-3);transition:transform .25s ease}.adv-arrow.up{transform:rotate(180deg)}.adv-count{min-width:18px;height:18px;line-height:18px;padding:0 5px;background:#6a4fd0;color:#fff;border-radius:9px;font-size:11px;font-weight:600;text-align:center}.adv-collapse{overflow:hidden;max-height:0;opacity:0;transition:max-height .28s ease,opacity .22s ease;contain:layout}.adv-collapse.open{max-height:640px;opacity:1}}@media(min-width:768px){.adv-collapse{max-height:none;opacity:1;overflow:visible}}.alert{margin:12px 0;padding:12px 14px;border-radius:10px;border-left:4px solid}.alert-failed{background:#fdf0f0;border-color:#e34d59}.alert-won{background:#eef8f1;border-color:#2f9e57}.alert-title{font-size:14px;font-weight:700;margin-bottom:5px}.alert-failed .alert-title{color:#b3282f}.alert-won .alert-title{color:#1c7a3e}.alert-desc{font-size:13px;color:#555;line-height:1.6}.link-box{margin:12px 0;border:1px solid #dfe3ec;border-radius:10px;overflow:hidden}.link-title{padding:9px 12px;background:#f4f6fa;font-size:13px;font-weight:700;color:#3a4256}.link-item{display:flex;align-items:center;gap:8px;padding:11px 12px;border-top:1px solid #eef0f5;cursor:pointer;transition:background .15s}.link-item:hover{background:#f7f9fc}.rel-badge{flex-shrink:0;padding:2px 8px;border-radius:4px;font-size:12px;font-weight:600}.rel-badge.rel-fail{background:#e34d59;color:#fff}.rel-badge.rel-win{background:#2f9e57;color:#fff}.rel-badge.rel-bid{background:#2f6fd0;color:#fff}.link-t{flex:1;font-size:13.5px;color:#1f2430;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.link-meta{flex-shrink:0;font-size:12px;color:#8a8f9c}.link-go{flex-shrink:0;font-size:12.5px;color:#2f6fd0;font-weight:600}.range-bar{display:flex;align-items:center;gap:8px;margin-top:10px;padding:9px 10px;background:#f7f8fa;border:1px solid #e4e6eb;border-radius:10px}.range-label{flex-shrink:0;font-size:12.5px;color:#5a5a68;font-weight:600}.range-btns{display:flex;flex-wrap:wrap;gap:6px}.range-btn{padding:3px 11px;border:1px solid #d8dae0;border-radius:12px;background:#fff;color:#55525f;font-size:12.5px;cursor:pointer;-webkit-user-select:none;user-select:none;transition:all .15s}.range-btn:hover{border-color:#2f6fd0;color:#2f5fa8}.range-btn.on{background:#2f6fd0;border-color:#2f6fd0;color:#fff;font-weight:600;box-shadow:0 1px 3px #2f6fd04d}.range-sum{flex-shrink:0;margin-left:auto;font-size:12px;color:#9a9eaa;font-family:ui-monospace,Menlo,Consolas,monospace}.login-wrap{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:24px;background:linear-gradient(160deg,#1b4a8f,#2f6fd0 55%,#4a90e2)}.login-card{width:100%;max-width:380px;background:#fff;border-radius:14px;padding:32px 30px 26px;box-shadow:0 12px 40px #0000002e}.login-brand{text-align:center;margin-bottom:24px}.login-logo{font-size:19px;font-weight:700;color:#1a1d24;letter-spacing:.5px}.login-tip{font-size:12.5px;color:#8a90a0;margin-top:6px}.login-card .field{margin-bottom:14px}.login-card .field label{display:block;font-size:12.5px;color:#5a6070;margin-bottom:5px;font-weight:600}.login-card .input{width:100%;padding:10px 12px;font-size:14px;border:1px solid #d8dae0;border-radius:8px;box-sizing:border-box}.login-card .input:focus{outline:none;border-color:#2f6fd0;box-shadow:0 0 0 3px #2f6fd01f}.login-err{background:#fdecec;border:1px solid #f0bcbc;color:#a33a3a;font-size:12.5px;padding:8px 11px;border-radius:7px;margin-bottom:14px;line-height:1.5}.login-btn{width:100%;padding:10px;font-size:14.5px;font-weight:600;border-radius:8px}.login-btn:disabled{opacity:.6;cursor:not-allowed}.login-foot{margin-top:16px;text-align:center;font-size:11.5px;color:#a0a5b2}.topbar{position:relative}.user-box{position:absolute;right:20px;top:50%;transform:translateY(-50%);display:flex;align-items:center;gap:9px}@media(max-width:767.98px){.topbar h1{font-size:17px}.user-box{position:static;transform:none;margin-top:10px;flex-wrap:wrap;gap:7px}.user-name{max-width:110px;font-size:12.5px}.user-box .mini-btn{padding:3px 8px;font-size:11.5px}}.user-name{font-size:13px;color:#fff;font-weight:600;max-width:130px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.user-role{font-size:11px;padding:2px 8px;border-radius:10px;font-weight:600}.role-admin{background:#ffd66b;color:#6b4e00}.role-viewer{background:#ffffff47;color:#fff}.user-box .mini-btn{background:#fff3;border-color:#fff6;color:#fff;padding:3px 10px;font-size:12px}.user-box .mini-btn:hover{background:#ffffff52}.ro-tip{font-size:12px;color:var(--text-3, #a0a5b2);background:#0000000a;border-radius:6px;padding:4px 10px;align-self:center}.pwd-card{max-width:400px}.pw-user{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--text-2, #5b6070);background:#f2f5fa;border-radius:8px;padding:9px 12px;margin-bottom:16px}.pw-user .user-role{background:#e3e9f4;color:#40506b}.pw-user .role-admin{background:#ffd66b;color:#6b4e00}.pwd-card .field{margin-bottom:12px}.modal .login-err{margin:10px 0 0}
