:root{color-scheme:light;--bg:#f1f4f8;--panel:#ecf1f7;--line:#cfd9e8;--ink:#111c2e;--muted:#526987;--blue:#2863c5;--soft:#e3ebf5}
*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--ink);font:14px/1.5 -apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif}button,input,select{font:inherit}button,a,select{cursor:pointer}button{color:inherit;border:1px solid #c6d1e1;background:#e6ebf2;border-radius:5px}button:hover:not(:disabled){filter:brightness(.96)}button:disabled{opacity:.45;cursor:default}a{color:var(--blue);text-decoration:none}a:hover{text-decoration:underline}:focus-visible{outline:2px solid var(--blue);outline-offset:3px}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.skip-link{position:fixed;left:16px;top:-60px;z-index:10;background:white;padding:10px}.skip-link:focus{top:8px}
.dashboard{flex:1;min-height:0;min-width:1024px;padding:7px 12px 2px 15px;display:flex;flex-direction:column;gap:9px}.metrics{height:78px;flex:none;border:1px solid #d9e4f5;border-radius:12px;background:#fff;display:grid;grid-template-columns:repeat(5,minmax(0,1fr));align-items:center;box-shadow:0 1px 4px #24487708}.metrics article{text-align:center;border-left:1px solid #d9e4f5;border-radius:11px;padding:1px 8px;color:#526895;font-size:12px;line-height:19px}.metrics article:first-child{border:0}.metrics p{margin:0;height:28px;line-height:28px}.metrics strong{color:var(--blue);font-size:24px;font-weight:720;font-variant-numeric:tabular-nums;letter-spacing:.3px}.metrics small{display:block;font-size:12px;color:#677ba2}.toolbar{min-height:53px;display:flex;gap:12px;align-items:center;padding:3px 0 8px;border-bottom:1px solid var(--line);flex:none}.heading{display:flex;align-items:baseline;gap:10px;flex-shrink:0}.heading h2{margin:0;font-size:16px;font-weight:650}.heading>span{font-size:12px;color:var(--muted)}#search-form{display:flex;align-items:center;gap:10px;flex:1;min-width:220px;height:40px;border:2px solid #2c64b9;border-radius:11px;background:white;box-shadow:0 0 0 4px #2c64b91a;overflow:hidden}#search-form img{margin-left:12px}#search{flex:1;min-width:0;border:0;background:transparent;color:var(--ink);outline:0;font-size:14px;height:100%}#search::placeholder{color:#6c80a2}#search-form:focus-within{box-shadow:0 0 0 4px #2863c52d}#search-form button{height:100%;width:73px;background:#2c64b9;color:#fff;border:0;border-radius:0;font-weight:650}
.workspace{flex:1;min-height:0;display:grid;grid-template-columns:minmax(0,1fr) 320px;gap:10px}.panel{min-height:0;min-width:0;border:1px solid var(--line);border-radius:12px;background:var(--panel);overflow:hidden;display:flex;flex-direction:column}.panel-toolbar{min-height:41px;padding:6px 12px;display:flex;gap:12px;align-items:center;border-bottom:1px solid var(--line);flex-wrap:wrap}.chips{display:flex;gap:6px;flex-wrap:wrap}.chip{height:28px;border:1px solid transparent;border-radius:20px;padding:0 8px;font-size:12px;white-space:nowrap;background:var(--chip-bg,#dce4ef);color:var(--chip-color,#526987)}.chip span{opacity:.75;margin-left:4px;font-variant-numeric:tabular-nums}.chip[aria-pressed=true]{border-color:var(--chip-color,#1580ed);box-shadow:inset 0 0 0 1px var(--chip-color,#1580ed)}.chip.all[aria-pressed=true]{background:#3699ff;color:#071c35}.list-summary{font-size:12px;color:var(--muted);margin-left:auto;white-space:nowrap;max-width:100%;overflow:hidden;text-overflow:ellipsis}
.table-scroll{position:relative;flex:1;min-height:0;overflow:auto;scrollbar-width:thin;scrollbar-color:#b7c4d6 transparent}table{width:100%;border-collapse:collapse;table-layout:fixed;font-size:13px}thead{position:sticky;top:0;z-index:1;background:var(--panel)}th{text-align:left;color:#526887;font-size:12px;font-weight:600;height:34px;border-bottom:1px solid var(--line)}td{height:35px;border-bottom:1px solid #dce4ef;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:4px 5px}th{padding:4px 5px}td:first-child,th:first-child{text-align:right;color:#768db0;padding-right:8px}td:nth-child(2){color:#607b9e;font-variant-numeric:tabular-nums}td:nth-child(4){font-weight:600}td:nth-child(6){color:#00834b}tbody tr:hover{background:#e2ebf7}.amount{text-align:right;font-variant-numeric:tabular-nums}.col-index{width:3.5%}.col-date{width:7%}.col-buyer{width:12%}.col-project{width:auto}.col-amount{width:8%}.col-winner{width:15%}.col-stage{width:6%}.col-progress{width:16%}.col-report{width:4%}.badge{font-size:11px;padding:2px 6px;border-radius:3px;background:var(--chip-bg,#dce4ef);color:var(--chip-color,#526987)}.progress{display:flex;align-items:flex-start;width:100%;font-size:11px;line-height:1.15;padding:2px 0}
.progress-node{position:relative;flex:1 1 0;min-width:0;display:flex;flex-direction:column;align-items:center;gap:3px;color:#a4b3c6;font-weight:400}
.progress-node::before{content:"";position:absolute;left:0;right:0;top:4px;height:1.5px;background:#cfd9e6}
.progress-node:first-child::before{left:50%}.progress-node:last-child::before{right:50%}
.progress-dot{position:relative;width:8px;height:8px;border-radius:50%;background:#bbc9dc;transform:scale(.5)}
.progress-label{position:relative;max-width:100%;overflow:hidden;text-overflow:ellipsis}
.progress-node.current{color:#263445;font-weight:600}.progress-node.current .progress-dot{background:var(--chip-color);transform:none;box-shadow:0 0 0 2px color-mix(in srgb,var(--chip-color) 16%,transparent)}
a.progress-node{text-decoration:none;border-radius:4px}a.progress-node:hover .progress-label{text-decoration:underline}a.progress-node:focus-visible{outline:2px solid var(--chip-color);outline-offset:2px}.project-link{color:inherit}.empty-state{position:absolute;inset:35px 0 0;display:flex;flex-direction:column;align-items:center;justify-content:center;padding-bottom:50px;color:var(--muted);text-align:center}.empty-state>img{opacity:.65;margin-bottom:8px}.empty-state h2{font-size:16px;font-weight:600;color:#536b8e;margin:6px 0}.empty-state p{font-size:13px;margin:3px 16px}.empty-state .empty-note{font-size:12px;color:#697f9d;margin-top:6px}.empty-state button{margin-top:15px;padding:5px 15px;background:white;color:var(--blue)}[hidden]{display:none!important}
.pagination{height:49px;flex:none;border-top:1px solid var(--line);display:flex;align-items:center;justify-content:center;gap:7px;font-size:12px;background:#eff3f8}.pagination button{height:30px;min-width:34px;padding:0 10px}.pagination>span{padding:0 7px}.pagination form{display:flex;align-items:center;gap:7px;margin-left:3px;color:var(--muted)}.pagination input{width:56px;height:30px;text-align:center;border:1px solid #c5d0df;border-radius:5px;background:#e5eaf1;color:var(--ink)}.unit-toolbar{height:43px;flex:none;padding:7px 8px;display:flex;align-items:center;justify-content:space-between;gap:8px;border-bottom:1px solid var(--line);font-size:12px}.unit-tabs,.expand-controls{display:flex;gap:4px;align-items:center}.unit-toolbar button{padding:3px 5px;white-space:nowrap}.unit-tabs button[aria-pressed=true]{background:#0687e3;color:white;border-color:#0687e3}.expand-controls>span{color:var(--muted);margin-right:1px}.unit-tree{padding:8px;overflow:auto;flex:1}.tree-row{display:flex;gap:6px;align-items:center;min-height:27px}.tree-row .tree-name{background:transparent;border:0;text-align:left;padding:2px 0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tree-row .tree-name[aria-pressed=true]{color:var(--blue);font-weight:700}.tree-row .count{margin-left:auto;color:#1c78d1;font-size:12px;white-space:nowrap}.tree-toggle{width:18px;height:18px;flex:none;padding:0;line-height:15px;color:#55708f}.tree-group{margin-left:12px}.tree-child{margin-left:24px}.tree-child .tree-name{font-size:12px}.tree-group>.tree-name{color:#006b62;font-weight:600}.tree-hint{color:#69809d;font-size:12px;padding:10px 24px;line-height:1.8}.city-nav{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:11px 12px;border-top:1px solid var(--line);font-size:12px}.city-nav select{width:110px;border:1px solid #c6d1e1;border-radius:5px;padding:4px 8px;background:#f7f9fc;color:#526987}
@media(max-width:1500px){.heading{display:block}.heading>span{font-size:11px}.workspace{grid-template-columns:minmax(0,1fr) 290px}.panel-toolbar{gap:5px}.list-summary{width:100%;text-align:right}.chip{padding:0 7px}.col-progress{width:13%}.col-buyer{width:11%}.col-winner{width:12%}.col-date{width:9%}}@media(max-width:1200px){.workspace{grid-template-columns:minmax(0,1fr) 270px}.expand-controls{gap:2px}.unit-toolbar{padding:7px 5px;gap:3px}.col-progress{width:0}.progress-cell,.progress-heading{display:none}.col-winner{width:15%}.col-stage{width:9%}.col-report{width:6%}.col-buyer{width:13%}.col-date{width:12%}.metrics small{font-size:11px}}
/* Directory counts are organizational units, not procurement totals. */
.catalog-note{font-size:11px;color:#627894;margin:2px 0 8px;padding:0 3px;line-height:1.7}.tree-group .tree-name{min-width:0;font-size:12px;font-weight:600}.tree-row .count{flex-shrink:0}.tree-child .tree-name{min-width:0}.expand-controls button[aria-pressed=true]{border-color:#3583cd;color:#2161a7;background:#dce9f8}
.extra-categories{border-top:1px solid var(--line);margin-top:8px;padding-top:6px}.extra-categories .tree-name{color:#263f5d}.extra-categories .count{color:#607897}.extra-categories .tree-hint{margin:3px 0 8px;padding:3px 24px;font-size:12px}

.metrics small{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.summary-retry{margin:8px;padding:4px 10px;color:var(--blue)}

.clear-filters{flex:none;font-size:12px;height:26px;padding:0 8px;color:var(--blue);background:#fff}
/* Keep dates and monetary values readable in smaller desktop windows. */
@media(max-width:1450px){.col-index{width:34px}.col-date{width:96px}.col-buyer{width:120px}.col-amount{width:100px}.col-winner{width:140px}.col-stage{width:78px}.col-report{width:35px}.col-progress{width:0}.progress-cell,.progress-heading{display:none}}
@media(max-width:1450px){.col-report{width:40px}.col-progress{visibility:collapse}.progress-cell,.progress-heading{display:table-cell;visibility:collapse;padding:0}th{white-space:nowrap}}

/* Project history stays within the existing desktop table scroll container. */
.progress-node.done{color:#7890ad}.progress-node.done .progress-dot{background:var(--chip-color);transform:none;opacity:.38}
a.progress-node.done:hover .progress-dot,a.progress-node.done:focus-visible .progress-dot{opacity:1}
.project-toggle{display:flex;align-items:center;gap:6px;width:100%;padding:0;border:0;background:transparent;text-align:left;font-weight:600;border-radius:2px}.project-toggle::before{content:"›";color:#0786db;font-size:18px;flex:none}.project-toggle[aria-expanded=true]::before{content:"⌄"}.project-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.project-details>td{padding:12px 18px!important;background:#f7f9fc;text-align:left!important;white-space:normal;color:var(--ink)!important}.detail-heading{display:flex;gap:12px;align-items:baseline;margin-bottom:10px}.detail-heading strong{font-size:13px}.detail-heading>span{font-size:11px;color:var(--muted)}.notice-list{padding:0;margin:0;list-style:none}.notice-list li{display:grid;grid-template-columns:90px 70px minmax(160px,1fr) 100px minmax(120px,20%);gap:10px;align-items:center;padding:7px 0;border-top:1px solid #e0e7f0;font-size:12px}.notice-list .badge{justify-self:start}.notice-list time{color:var(--muted)}.notice-title{white-space:normal;overflow-wrap:anywhere}.notice-amount{text-align:right}.notice-winner{color:#00834b;overflow-wrap:anywhere}.progress-cell{padding-left:2px;padding-right:2px}

.amount-sort{display:inline-flex;align-items:center;justify-content:flex-end;gap:3px;border:0;background:transparent;color:inherit;font:inherit;font-weight:600;padding:2px 0;min-height:24px}.sort-indicator{display:inline-block;width:12px;text-align:center}th[aria-sort="ascending"] .amount-sort,th[aria-sort="descending"] .amount-sort{color:var(--blue)}

/* City brand header follows Shenzhen with city-specific module navigation. */
body{height:100dvh;min-height:640px;min-width:1024px;display:flex;flex-direction:column}
.city-header{position:relative;isolation:isolate;z-index:2;flex:none;display:flex;align-items:center;gap:16px;min-height:104px;padding:12px 28px;background:linear-gradient(100deg,#01102b,#052352);color:#eaf2ff;border-bottom:1px solid #82b2cf4d;box-shadow:0 0 18px #2f8cff2e}
.city-header>.szh-particles{position:absolute;inset:0;width:100%;height:100%;z-index:-1;pointer-events:none}
.city-brand{display:block;flex:none;width:60px;height:60px;border:1px solid #7ab4ff99;border-radius:11px;overflow:hidden;box-shadow:0 0 22px #2f8cff40}
.city-brand img{display:block;width:100%;height:100%;object-fit:cover}
.city-header-copy{min-width:0}.city-header h1{margin:0;color:#fff;font-size:clamp(19px,1.6vw,25px);font-weight:750;letter-spacing:-.01em;line-height:1.15;white-space:nowrap}
.city-header-meta{display:flex;flex-direction:column;gap:3px;width:max-content;max-width:100%;margin-top:4px}.city-header-row{display:flex;align-items:center;justify-content:space-between;gap:12px}.city-header-row p{margin:0;color:#9fb9e4;font-size:12.5px}.city-header-row b{color:#fff}
.city-header-pill{display:inline-flex;align-items:center;justify-content:center;gap:5px;padding:2px 10px;border:1px solid #82b2cf42;border-radius:999px;background:#020e2499;color:#bcd2ec;font-size:11.5px;font-weight:600;white-space:nowrap;cursor:pointer}.city-header-pill:hover{color:#fff;border-color:#d6e4fa99;text-decoration:none}.city-header-pill img{display:block}
.city-header-credit{padding:2px 11px;border:1px solid #7dd3fc4d;border-radius:999px;background:linear-gradient(100deg,#2f8cff29,#7dd3fc0d);box-shadow:0 0 14px #2f8cff2e;color:#d6e4fa;font-size:11.5px;font-weight:800;line-height:1.1;white-space:nowrap}.city-header-credit em{color:#b1b7ff;font-style:normal}
.city-header-actions{margin-left:auto;display:flex;flex-direction:column;gap:10px;flex:none;width:264px}.city-header-actions .city-header-pill{width:112px;height:32px;font-size:12.5px;font-weight:600;padding:4px 10px;border-radius:999px;gap:7px;background:#020e24b3}.city-header :focus-visible{outline-color:#9cddff}
.city-header-qr{position:relative}.city-header-qr summary{list-style:none}.city-header-qr summary::-webkit-details-marker{display:none}.city-header-qr[open] summary{border-color:#9cddff;color:#fff}
.city-header-pop{position:absolute;top:calc(100% + 10px);right:0;width:200px;padding:8px;background:white;border:1px solid #cfd9e8;border-radius:12px;box-shadow:0 16px 40px #0005;color:#263f5d}.city-header-pop img{display:block;width:100%;height:auto;border-radius:6px}.city-header-pop p{margin:5px 0 0;font-size:12px;text-align:center}
@media(max-width:1280px){.city-header{padding:10px 18px;gap:12px;min-height:98px}.city-header-actions{gap:8px}.city-header h1{font-size:20px}.city-brand{width:54px;height:54px}}

/* Utility controls precede the module navigation, matching Shenzhen. */
.city-header-actions .city-header-pill:hover,.city-header-actions .city-header-qr[open] .city-header-pill{background:#17385a;color:#fff;border-color:#9cddff80}
/* Match Shenzhen site-shell sizing; all account visuals come from wx-login.js. */
.city-header #wxLogin{width:100%;min-width:0;min-height:32px;flex:none;justify-content:center}
.city-header #wxLogin .wxprofile{box-sizing:border-box;min-width:0;max-width:100%;min-height:32px;padding:4px 11px 4px 5px;gap:6px}
.city-header #wxLogin .wxav{box-sizing:border-box;width:22px;height:22px}
.city-header-actions svg{flex:none}

/* City modules switch inside the persistent brand header. */
.city-header-end{margin-left:auto;display:flex;flex-direction:column;align-items:stretch;gap:8px;flex:none;width:440px}
.city-header-end .city-header-actions{margin-left:0;display:flex;flex-direction:row;align-items:center;gap:10px;width:100%}
.city-header-end .city-header-actions .city-header-pill{width:100px}
.city-header-end #wxLogin{width:110px;justify-content:flex-end}
.city-header{padding-top:10px;padding-bottom:10px}
.city-header .city-view-tabs{display:flex;align-items:center;gap:6px;flex:none;padding:3px;border:1px solid #82b2cf42;border-radius:10px;background:#020e2470}
.city-header .city-view-tabs button{flex:1;min-width:0;height:36px;padding:0 16px;border:0;border-radius:7px;background:transparent;color:#c9dcf5;font-size:14px;font-weight:650;white-space:nowrap}
.city-header .city-view-tabs button:hover{background:#17385a;color:white;filter:none}
.city-header .city-view-tabs [aria-pressed=true],.city-header .city-view-tabs [aria-pressed=true]:hover{background:#2563ce;color:white}
.budget-mode>.metrics,.budget-mode>.workspace,.budget-mode>.toolbar{display:none}.budget-mode{padding-bottom:10px}
.agency-budget-link{flex:none;font-size:11px;padding:2px 5px;border:1px solid #b9cce6;border-radius:4px;color:#2464bb;background:#f8fbff;margin-left:3px}.tree-row .agency-budget-link+.count{min-width:49px;text-align:right;margin-left:3px}#city-budget[hidden]{display:none}
@media(max-width:1500px){.toolbar{gap:9px}.toolbar .heading h2{font-size:14px}}
@media(max-width:1180px){.city-header{gap:10px;padding-inline:16px}.city-header h1{font-size:18px}.city-brand{width:48px;height:48px}.city-header-end{width:400px}.city-header-end .city-header-actions .city-header-pill{width:90px;font-size:12px}.city-header-end #wxLogin{width:100px}}
