/* 项目管理系统 · 按参考截图 UI（浅蓝灰底 + 科技蓝），PC + H5 响应式 */
:root{
  --bg:#f3f6fb; --card:#ffffff; --line:#e8edf5;
  --primary:#2b6bff; --primary-2:#4f8bff; --primary-weak:#eaf2ff;
  --text:#1f2633; --text-2:#5b6779; --text-3:#8a94a6;
  --green:#18a058; --green-bg:#e8f8f0;
  --orange:#f08c00; --orange-bg:#fff4e6;
  --red:#e5484d; --gray-bg:#f2f4f8;
  --radius:14px; --shadow:0 2px 10px rgba(31,58,110,.06);
  --sidebar-w:216px;
}
*{box-sizing:border-box;margin:0;padding:0}
html,body{height:100%}
body{font-family:"PingFang SC","Microsoft YaHei","Segoe UI",system-ui,sans-serif;background:var(--bg);color:var(--text);font-size:14px}
button{font-family:inherit;cursor:pointer;border:none;background:none}
input,select,textarea{font-family:inherit;font-size:14px;color:var(--text);outline:none;border:1px solid var(--line);border-radius:8px;padding:8px 10px;background:#fff}
input:focus,select:focus,textarea:focus{border-color:var(--primary)}
::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-thumb{background:#cdd6e4;border-radius:3px}

/* ===== 布局 ===== */
.app{display:flex;min-height:100vh}
.sidebar{width:var(--sidebar-w);background:#fff;border-right:1px solid var(--line);position:fixed;top:0;bottom:0;left:0;z-index:50;display:flex;flex-direction:column;padding:14px 12px;transition:transform .25s}
.brand{display:flex;align-items:center;gap:9px;padding:6px 8px 16px}
.brand-mark{width:32px;height:32px;border-radius:9px;background:linear-gradient(135deg,#4f8bff,#2b6bff);display:flex;align-items:center;justify-content:center;color:#fff;font-weight:700;font-size:15px;flex:none}
.brand b{font-size:16px;letter-spacing:.5px}
.brand small{display:block;font-size:10px;color:var(--text-3);font-weight:400}
.nav{display:flex;flex-direction:column;gap:4px}
.nav a{display:flex;align-items:center;gap:10px;padding:10px 12px;border-radius:10px;color:var(--text-2);text-decoration:none;font-size:14px;transition:.15s}
.nav a svg{width:17px;height:17px;flex:none}
.nav a:hover{background:#f6f9ff;color:var(--primary)}
.nav a.active{background:var(--primary-weak);color:var(--primary);font-weight:600}
.nav .nav-sep{margin:10px 8px 4px;font-size:11px;color:var(--text-3)}
.side-foot{margin-top:auto;padding:10px 8px;border-top:1px solid var(--line);display:flex;align-items:center;gap:10px}
.avatar{width:34px;height:34px;border-radius:50%;background:#e3e8f0;color:#9aa4b5;display:flex;align-items:center;justify-content:center;flex:none}
.side-foot .who b{display:block;font-size:13px}
.side-foot .who span{font-size:11px;color:var(--text-3)}
.logout-btn{margin-left:auto;color:var(--text-3);font-size:12px;padding:6px;border-radius:8px}
.logout-btn:hover{color:var(--red);background:#fdf0f0}

.main{flex:1;margin-left:var(--sidebar-w);padding:18px 22px 90px;min-width:0}
.topbar{display:flex;align-items:center;gap:14px;margin-bottom:0}

/* ===== 通用组件 ===== */
.card{background:var(--card);border-radius:var(--radius);box-shadow:var(--shadow);padding:18px}
.card-title{display:flex;align-items:center;gap:8px;font-size:15px;font-weight:600;margin-bottom:14px}
.card-title .more{margin-left:auto;font-size:12px;color:var(--text-3);cursor:pointer;font-weight:400}
.log-filters{display:flex;gap:6px;margin:-6px 0 10px}
.log-filters select{flex:1;min-width:0;max-width:none;font-size:12px;padding:4px 24px 4px 8px;border-radius:8px}
.all-logs{max-height:56vh;overflow-y:auto;padding-right:6px}
.card-title .more:hover{color:var(--primary)}
.btn{display:inline-flex;align-items:center;gap:6px;background:var(--primary);color:#fff;border-radius:9px;padding:9px 16px;font-size:13px;font-weight:500;transition:.15s;white-space:nowrap}
.btn svg{width:15px;height:15px;flex:none}
.btn:hover{background:#1f5af0}
.btn.plain{background:#fff;color:var(--text-2);border:1px solid var(--line)}
.btn.plain:hover{color:var(--primary);border-color:var(--primary);background:var(--primary-weak)}
.btn.sm{padding:6px 11px;font-size:12px;border-radius:8px}
.btn.ghost{background:var(--primary-weak);color:var(--primary)}
.tag{display:inline-flex;align-items:center;padding:3px 10px;border-radius:20px;font-size:12px;white-space:nowrap}
.tag.blue{background:var(--primary-weak);color:var(--primary)}
.tag.green{background:var(--green-bg);color:var(--green)}
.tag.gray{background:var(--gray-bg);color:var(--text-3)}
.tag.orange{background:var(--orange-bg);color:var(--orange)}
.tag.red{background:#fdeaea;color:var(--red)}
.progress{height:7px;background:#edf1f8;border-radius:4px;overflow:hidden;min-width:60px}
.progress i{display:block;height:100%;border-radius:4px;background:linear-gradient(90deg,var(--primary-2),var(--primary));transition:width .4s}

/* 统计卡 */
.stat-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin-bottom:16px}
.stat-card{display:flex;align-items:center;gap:14px;background:#fff;border-radius:var(--radius);box-shadow:var(--shadow);padding:18px}
.stat-ico{width:46px;height:46px;border-radius:12px;display:flex;align-items:center;justify-content:center;flex:none}
.stat-ico svg{width:22px;height:22px}
.stat-ico.blue{background:var(--primary-weak);color:var(--primary)}
.stat-ico.green{background:var(--green-bg);color:var(--green)}
.stat-ico.orange{background:var(--orange-bg);color:var(--orange)}
.stat-ico.cyan{background:#e6f7fb;color:#0ea5c6}
.stat-card .num{font-size:24px;font-weight:700;line-height:1.1}
.stat-card .lbl{font-size:12px;color:var(--text-3);margin-top:3px}

/* 顶部横幅 */
.banner{position:relative;overflow:hidden;border-radius:var(--radius);background:linear-gradient(90deg,rgba(7,22,48,.85) 0%,rgba(7,22,48,.55) 45%,rgba(7,22,48,.25) 100%),url('banner-bg.jpg') center 22%/cover no-repeat #0b1e3d;color:#fff;padding:38px 28px;margin-bottom:16px;display:flex;align-items:center}
.banner h2{font-size:22px;letter-spacing:.5px;position:relative;z-index:1}
.banner p{font-size:13px;opacity:.85;margin-top:8px}
.banner .date-chip{margin-left:auto;position:relative;z-index:1;text-align:right;font-size:12px;opacity:.92;line-height:1.9}

/* 仪表盘两栏 */
.grid-2{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-bottom:16px}
.grid-main{display:grid;grid-template-columns:2fr 1fr;gap:16px;align-items:start}
.grid-main>div{min-width:0}

/* 图表 */
.donut-wrap{display:flex;align-items:center;gap:24px}
.donut-center{font-size:26px;font-weight:700;fill:var(--text)}
.donut-sub{font-size:11px;fill:var(--text-3)}
.legend{display:flex;flex-direction:column;gap:9px;font-size:13px}
.legend .li{display:flex;align-items:center;gap:8px;color:var(--text-2)}
.legend .dot{width:9px;height:9px;border-radius:3px;flex:none}
.legend b{margin-left:auto;color:var(--text)}

/* 追踪列表 / 动态 */
.track-row{display:flex;align-items:center;gap:12px;padding:11px 0;border-bottom:1px dashed var(--line);cursor:pointer}
.track-row:last-child{border-bottom:none}
.p-ico{width:34px;height:34px;border-radius:9px;background:linear-gradient(135deg,#dbe9ff,#bcd6ff);display:flex;align-items:center;justify-content:center;flex:none;color:var(--primary)}
.p-ico.p-num{font-size:12px;font-weight:700;letter-spacing:.5px;color:var(--primary)}
.track-row .tname{width:180px;font-size:13px;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.track-row .towner{width:44px;color:var(--text-2);font-size:12px}
.track-row .tbar{flex:1;display:flex;align-items:center;gap:8px}
.track-row .tpct{font-size:12px;color:var(--text-2);width:34px}
.track-row .ttime{color:var(--text-3);font-size:12px;width:84px;text-align:right}
.track-row .t-arrow{font-size:11px;color:var(--text-3);transition:.2s;flex:none}
.stat-card.selected{box-shadow:0 0 0 2px var(--primary) inset,0 8px 20px rgba(43,107,255,.12)}
.stat-card.selected .lbl{color:var(--primary);font-weight:600}
.track-flabel{font-size:11.5px;color:var(--primary);background:rgba(43,107,255,.08);border-radius:20px;padding:3px 10px;display:inline-flex;align-items:center;gap:6px}
.track-flabel .tf-clear{cursor:pointer;color:var(--primary);font-weight:400;font-size:11px;padding:0 1px}
/* 新建账号：账号类型选择 */
.acct-type{display:flex;gap:8px}
.acct-type span{flex:1;text-align:center;padding:8px 0;border:1px solid var(--line);border-radius:9px;font-size:13px;color:var(--text-2);cursor:pointer;transition:.15s;user-select:none}
.acct-type span:hover{border-color:var(--primary);color:var(--primary)}
.acct-type span.on{border-color:var(--primary);color:var(--primary);background:var(--primary-weak);font-weight:600}
.track-flabel .tf-clear:hover{color:#e5484d}
.track-row.open .t-arrow{transform:rotate(180deg);color:var(--primary)}
.track-row.open .tname{color:var(--primary)}
.track-detail{display:none;padding:0 6px;border-bottom:1px dashed var(--line)}
.track-detail.open{display:block;animation:fadeSlide .22s ease}
.td-head{display:flex;align-items:center;gap:10px;padding:12px 6px 4px}
.td-sum{font-size:12.5px;color:var(--text-2);flex:1;min-width:0}
.td-sum b{color:var(--primary)}
.td-edit{flex:none}
.td-stages{display:flex;align-items:center;flex-wrap:wrap;gap:6px;padding:8px 6px}
/* 展开详情：项目进程 / 财务数据 切换 */
.td-tabs{display:inline-flex;background:#eef1f6;border-radius:8px;padding:3px;gap:2px;margin:4px 0 8px}
.td-tabs b{padding:5px 14px;border-radius:6px;font-size:12px;font-weight:500;color:var(--text-2);cursor:pointer;transition:all .15s}
.td-tabs b.on{background:#fff;color:var(--primary);font-weight:600;box-shadow:0 1px 4px rgba(16,24,40,.1)}
.td-view-fin{padding:10px 2px}
.td-stage{font-size:11.5px;padding:3px 9px;border-radius:20px;background:#eef1f6;color:#8a94a6;white-space:nowrap}
.td-stage.done{background:rgba(24,160,88,.1);color:var(--green)}
.td-stage.active{background:rgba(43,107,255,.1);color:var(--primary);font-weight:600}
.td-arr{color:#c0c9d8;font-size:11px}
.td-notes-title{font-size:12px;color:var(--text-3);padding:6px 6px 0}
.td-note{padding:8px 6px;border-top:1px dashed var(--line)}
.td-notes .td-note:first-child{border-top:none}
.tn-date{font-size:11.5px;color:var(--text-3)}
.tn-stage{margin-left:8px;font-size:10.5px;padding:1px 7px;border-radius:10px;background:#eef0f4;color:#5b6472}
/* 流程标签按步骤分色（与背景同色系、略深以保证可读） */
.td-note.st-survey .tn-stage{background:#fbe3e3;color:#c2483f}
.td-note.st-agreement .tn-stage{background:#dceaff;color:#2b6bd8}
.td-note.st-construction .tn-stage{background:#ffedc9;color:#a86a00}
.td-note.st-install .tn-stage{background:#d7f1e2;color:#1c8a52}
.td-note.st-accept .tn-stage{background:#e9deff;color:#7452d8}
.td-note.st-others .tn-stage{background:#e7e9ee;color:#5b6472}
.td-notes-title .td-count{font-size:11px;color:var(--text-3);font-weight:400;margin-left:8px}
.tn-kind{font-size:10px;padding:1px 7px;border-radius:9px;font-weight:500;margin-left:6px}
.tn-kind.note{background:#eef0f4;color:#5b6472}   /* 备注标签·统一中性色 */
.tn-actor{color:var(--text-2);margin-left:8px;font-weight:500;font-size:10.5px}
.td-note p{margin:4px 0 0;font-size:12.5px;color:var(--text);line-height:1.5;word-break:break-all}
/* 工作动态与备注：按所属流程步骤分色（淡色背景，未标注步骤的保持默认） */
.td-note.st-survey{background:#fdf5f5;border-radius:8px;padding:8px 9px}      /* 现场勘测·极淡红 */
.td-note.st-agreement{background:#f3f8ff;border-radius:8px;padding:8px 9px}   /* 安全施工协议·极淡蓝 */
.td-note.st-construction{background:#fffbf0;border-radius:8px;padding:8px 9px} /* 前期施工·极淡橙 */
.td-note.st-install{background:#f2faf5;border-radius:8px;padding:8px 9px}     /* 到货安装·极淡绿 */
.td-note.st-accept{background:#f9f5ff;border-radius:8px;padding:8px 9px}      /* 培训验收·极淡紫 */
.td-note.st-others{background:#f7f8fa;border-radius:8px;padding:8px 9px}      /* 其他·极淡灰 */
@keyframes fadeSlide{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}
.tl{position:relative;padding-left:14px}
.tl::before{content:"";position:absolute;left:4px;top:6px;bottom:6px;width:2px;background:#eef2f9}
.tl-item{position:relative;padding:0 0 14px 12px}
.tl-item:last-child{padding-bottom:2px}
.tl-item::before{content:"";position:absolute;left:-14px;top:5px;width:8px;height:8px;border-radius:50%;background:var(--primary-2);box-shadow:0 0 0 3px var(--primary-weak)}
.tl-item.green::before{background:var(--green);box-shadow:0 0 0 3px var(--green-bg)}
.tl-item.orange::before{background:var(--orange);box-shadow:0 0 0 3px var(--orange-bg)}
.tl-item .t1{font-size:13px;line-height:1.5}
.tl-item .t2{font-size:11px;color:var(--text-3);margin-top:3px}

/* 表格 */
.table-wrap{overflow-x:auto}
table{width:100%;border-collapse:collapse;font-size:13px}
th{color:var(--text-3);font-weight:500;text-align:left;padding:10px 12px;border-bottom:1px solid var(--line);white-space:nowrap}
td{padding:12px;border-bottom:1px solid #f1f4fa;vertical-align:middle}
tr:last-child td{border-bottom:none}
tbody tr:hover{background:#f8faff}
.cell-p{display:flex;align-items:center;gap:10px;min-width:200px}
.cell-p .p-ico{width:32px;height:32px}
.cell-p b{font-size:13px;font-weight:500;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;max-width:220px;word-break:break-all;line-height:1.45}
.cell-p span{font-size:11px;color:var(--text-3)}
.bar-cell{display:flex;align-items:center;gap:8px;min-width:130px}
.bar-cell span{font-size:12px;color:var(--text-2);width:32px}
.op-link{color:var(--primary);font-size:12px;cursor:pointer;padding:5px 8px;border-radius:6px}
.op-link:hover{background:var(--primary-weak)}
.op-link.gray{color:var(--text-3)}

/* 筛选行 */
.filter-row{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:14px}
.filter-row input[type=text]{min-width:220px}
.filter-row select{min-width:110px}

/* 任务 / 日历 */
.task-item{display:flex;align-items:center;gap:11px;padding:11px 0;border-bottom:1px dashed var(--line)}
.task-item[data-pid]{cursor:pointer;border-radius:8px}
.task-item[data-pid]:hover .tt b{color:var(--primary)}
.task-item .t-edit{font-size:11px;color:var(--primary);flex:none;opacity:.75}
.task-item[data-pid]:hover .t-edit{opacity:1;font-weight:600}
.stage-card.focus-flash{animation:flashPulse 1.2s ease 2}
@keyframes flashPulse{0%,100%{box-shadow:var(--shadow,0 2px 10px rgba(30,80,180,.06))}50%{box-shadow:0 0 0 4px rgba(48,120,255,.28);border-color:var(--primary)}}
.task-item:last-child{border-bottom:none}
.task-item .tt{flex:1;min-width:0}
.task-item .tt b{font-size:13px;font-weight:500;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.task-item .tt span{font-size:11px;color:var(--text-3)}
.task-check{width:18px;height:18px;border-radius:50%;border:2px solid #c8d4ea;flex:none;display:flex;align-items:center;justify-content:center;color:#fff;font-size:11px}
.task-item.done .task-check{background:var(--green);border-color:var(--green)}
.task-item.done .tt b{text-decoration:line-through;color:var(--text-3)}
.due-chip{font-size:11px;color:var(--orange);background:var(--orange-bg);border-radius:6px;padding:2px 7px;white-space:nowrap}
/* 我的任务：自建 / 删除 */
.task-add{margin-left:auto;font-size:12px;color:var(--primary);background:var(--primary-weak);border:none;border-radius:7px;padding:4px 10px;cursor:pointer;font-weight:500}
.task-add:hover{filter:brightness(.95)}
.task-form{display:flex;gap:7px;align-items:center;padding:10px 0 4px;flex-wrap:wrap}
.task-form input[type=text]{flex:1;min-width:140px;border:1px solid var(--line);border-radius:8px;padding:7px 10px;font-size:12.5px;outline:none}
.task-form input[type=text]:focus{border-color:var(--primary)}
.task-form input[type=date]{border:1px solid var(--line);border-radius:8px;padding:6px 8px;font-size:12px;color:var(--text-2);background:#fff}
.task-del{flex:none;font-size:12px;color:#c2cad6;cursor:pointer;padding:2px 4px;border-radius:5px;line-height:1}
.task-del:hover{color:var(--red);background:rgba(229,72,77,.08)}
.cal{user-select:none}
.cal-head{display:flex;align-items:center;margin-bottom:10px}
.cal-head b{font-size:14px}
.cal-head .nav{margin-left:auto;display:flex;gap:6px}
.cal-head button{width:26px;height:26px;border-radius:7px;border:1px solid var(--line);color:var(--text-2);font-size:13px}
.cal-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:4px;text-align:center}
.cal-grid .wd{font-size:11px;color:var(--text-3);padding:5px 0}
.cal-grid .day{position:relative;font-size:12.5px;padding:8px 0;border-radius:8px;color:var(--text-2)}
.cal-grid .day.dim{color:#c6cfdc}
.cal-grid .day.today{background:var(--primary);color:#fff;font-weight:600}
.cal-grid .day .ev{position:absolute;bottom:3px;left:50%;transform:translateX(-50%);width:5px;height:5px;border-radius:50%;background:var(--orange)}
.cal-grid .day.today .ev{background:#fff}
.cal-grid .day:not(.dim){cursor:pointer;transition:.12s}
.cal-grid .day:not(.dim):hover{background:var(--primary-weak)}
.cal-grid .day.sel{background:var(--primary);color:#fff;font-weight:600}
.cal-grid .day.sel .ev{background:#fff}
.cal-grid .day .td-ev{background:var(--primary);margin-left:0;left:calc(50% + 5px)}
.cal-grid .day.today .td-ev{background:#fff}
.td-add{display:flex;gap:8px;margin-top:9px}
.td-add input{flex:1;min-width:0;font-size:12.5px;padding:8px 10px;border:1px solid var(--line);border-radius:8px;outline:none;background:#fff}
.td-add input:focus{border-color:var(--primary)}
.cal-day-head{font-size:13px;font-weight:600;margin:12px 0 8px;padding-top:10px;border-top:1px solid var(--line);color:var(--text)}
.cal-day-head .cl-week{font-size:11px;font-weight:400;color:var(--text-3);margin-left:6px}
.cal-sec{margin-bottom:10px}
.cal-sec > b{display:block;font-size:12px;color:var(--text-2);margin-bottom:6px}
.cal-log,.cal-task,.cal-todo{display:flex;align-items:baseline;gap:7px;font-size:12px;padding:5px 0;border-bottom:1px dashed var(--line)}
.cal-log:last-child,.cal-task:last-child,.cal-todo:last-child{border-bottom:none}
.cl-time{color:var(--text-3);font-size:11px;flex:none;font-variant-numeric:tabular-nums}
.cl-txt{color:var(--text);line-height:1.45;flex:1;min-width:0}
.cl-txt i{display:block;font-style:normal;font-size:10.5px;color:var(--primary);margin-top:1px}
.cl-p{flex:none;font-size:10.5px;color:var(--text-3);max-width:88px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cl-dot{width:6px;height:6px;border-radius:50%;background:var(--orange);flex:none;align-self:center}
.cl-done{flex:none;font-size:10.5px;color:var(--green)}
.cl-open{flex:none;font-size:10.5px;color:var(--orange)}
.cal-todo .td-check{width:15px;height:15px;border-radius:50%;border:1.5px solid #c8d4ea;flex:none;align-self:center;display:flex;align-items:center;justify-content:center;font-size:9px;color:#fff;cursor:pointer}
.cal-todo.done .td-check{background:var(--green);border-color:var(--green)}
.cal-todo.done .cl-txt{color:var(--text-3);text-decoration:line-through}
.cal-todo .td-del{flex:none;font-size:11px;color:#c6cfdc;cursor:pointer;padding:0 3px}
.cal-todo .td-del:hover{color:#e5484d}
.cal-empty{font-size:11.5px;color:#b0bac8;padding:3px 0}

/* ===== 项目详情 ===== */
.detail-head{display:flex;align-items:flex-start;gap:14px;flex-wrap:wrap;margin-bottom:16px}
.detail-head .info h2{font-size:19px;display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.detail-head .meta{display:flex;gap:16px;color:var(--text-2);font-size:12.5px;margin-top:8px;flex-wrap:wrap}
.detail-head .acts{margin-left:auto;display:flex;gap:9px;flex-wrap:wrap}
/* ===== 流程图 ===== */
.flow-row{display:grid;grid-template-columns:3fr 2fr;gap:16px;margin-bottom:16px;align-items:stretch}
.flow-row>.card{min-width:0}
.flow-card{margin-bottom:0;display:flex;flex-direction:column}
.flow-card .flow{margin:auto 0;padding-top:2px}
.donut-card .donut-wrap{gap:14px}
.donut-box{display:flex;flex-direction:column;align-items:center;flex:none}
.donut-label{font-size:11px;color:var(--text-3);margin-top:2px;white-space:nowrap}
.flow{display:flex;align-items:flex-start;padding:8px 4px 2px;overflow-x:auto}
.flow-node{display:flex;flex-direction:column;align-items:center;gap:5px;flex:none;width:86px;text-align:center}
.fn-dot{width:36px;height:36px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:13px;font-weight:700;background:#dde5f0;color:#8a94a6;transition:.2s}
.flow-node.done .fn-dot{background:var(--green);color:#fff}
.flow-node.active .fn-dot{background:var(--primary);color:#fff;animation:pulse 2s infinite}
.flow-node.lock .fn-dot{background:#eef1f6;color:#b6c0cf}
.flow-node.has .fn-dot{background:var(--primary);color:#fff}
.flow-node.has .fn-name{color:var(--text);font-weight:600}
.fn-name{font-size:12.5px;color:var(--text-2);line-height:1.3}
.flow-node.active .fn-name{color:var(--primary);font-weight:600}
.fn-sub{font-size:11px;color:var(--text-3)}
.fn-line{flex:1;height:3px;border-radius:2px;background:#e4eaf4;margin-top:17px;min-width:12px}
.fn-line.filled{background:var(--green)}
@keyframes pulse{0%,100%{box-shadow:0 0 0 4px var(--primary-weak)}50%{box-shadow:0 0 0 9px var(--primary-weak)}}
.step.done .sname{color:var(--text)}
.stage-card{margin-bottom:14px}
.stage-card.active{border:1px solid #cfe0ff;box-shadow:0 4px 16px rgba(43,107,255,.10)}
.stage-head{display:flex;align-items:center;gap:10px;margin-bottom:12px}
.stage-head b{font-size:15px}
.stage-head .stage-acts{margin-left:auto;display:flex;gap:8px}
.field-row{display:flex;gap:12px;flex-wrap:wrap;margin-bottom:12px}
.field{display:flex;flex-direction:column;gap:6px;font-size:12.5px;color:var(--text-2)}
.field select,.field input{min-width:170px}
.field.col{flex:1;min-width:220px}
.field.col textarea{width:100%;min-height:64px;resize:vertical}
.chk{display:flex;align-items:center;gap:8px;font-size:13.5px;color:var(--text);cursor:pointer}
.chk input{width:16px;height:16px;accent-color:var(--primary)}
.note-list{margin-top:10px}
.note-item{background:#f8faff;border:1px solid #eef2fa;border-radius:10px;padding:10px 12px;margin-bottom:8px}
.note-item .nd{font-size:11px;color:var(--text-3);margin-bottom:4px;display:flex;align-items:center;gap:6px}
.note-item .nd .auto{background:var(--primary-weak);color:var(--primary);font-size:10px;padding:1px 6px;border-radius:4px}
.note-item .nd .note-ops{margin-left:auto;display:flex;gap:6px}
.note-item .nd .nk{border:none;background:none;font-size:11px;color:var(--text-3);cursor:pointer;padding:0}
.note-item .nd .nk:hover{color:var(--primary)}
.note-item .nd .nk.note-del:hover{color:#e5484d}
.note-item p{font-size:13px;line-height:1.55}

/* 弹窗 */
.modal-mask{position:fixed;inset:0;background:rgba(23,32,55,.45);z-index:200;display:flex;align-items:center;justify-content:center;padding:20px}
.modal{background:#fff;border-radius:16px;width:100%;max-width:480px;max-height:88vh;overflow-y:auto;padding:22px}
.modal h3{font-size:16px;margin-bottom:16px}
.modal .form-row{margin-bottom:13px}
.modal .form-row label{display:block;font-size:12.5px;color:var(--text-2);margin-bottom:6px}
.modal .form-row input,.modal .form-row select,.modal .form-row textarea{width:100%}
.modal .foot{display:flex;justify-content:flex-end;gap:10px;margin-top:18px}
.photo-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}
.photo-grid .ph{position:relative;aspect-ratio:1;border-radius:10px;overflow:hidden;background:#eef2f9;cursor:pointer}
.photo-grid .ph img{width:100%;height:100%;object-fit:cover}
/* 非图片附件（项目前期资料）：文件图标块 */
.photo-grid .ph-doc{background:#f6f8fc;border:1px solid #e3e8f2;display:flex;align-items:center;justify-content:center}
.photo-grid .ph-doc .ph-file{display:flex;flex-direction:column;align-items:center;gap:4px;padding:6px;width:100%;overflow:hidden}
.photo-grid .ph-doc .ph-ico{font-size:26px;line-height:1}
.photo-grid .ph-doc .ph-nm{font-size:11px;color:var(--text-2,#4b5563);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.photo-grid .ph .ph-acts{position:absolute;right:5px;bottom:5px;display:flex;gap:4px;opacity:1;transition:.15s}
.photo-grid .ph:hover .ph-acts button{background:rgba(17,24,39,.95)}
.photo-grid .ph .ph-acts button{border:none;border-radius:7px;width:26px;height:26px;background:rgba(17,24,39,.72);color:#fff;font-size:13px;line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center}
.photo-grid .ph .ph-acts button:hover{background:rgba(17,24,39,.95)}
.photo-grid .ph .del{position:absolute;top:5px;right:5px;width:22px;height:22px;border-radius:6px;background:rgba(0,0,0,.45);color:#fff;font-size:12px;display:flex;align-items:center;justify-content:center}
.up-hint{font-size:12px;color:var(--text-3);margin-top:8px}

/* ===== 阶段照片区（阶段卡内） ===== */
.stage-photos{margin-top:14px;padding-top:12px;border-top:1px dashed #e3e8f2}
.sp-head{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:10px}
.sp-title{font-size:13px;font-weight:600;color:var(--text);display:inline-flex;align-items:center;gap:6px}
.sp-title svg{width:15px;height:15px;color:#2b6bff}
.sp-up{cursor:pointer;flex-shrink:0}
.stage-photos .photo-grid{grid-template-columns:repeat(4,1fr)}

/* ===== 登录页 ===== */
.login-page{min-height:100vh;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#dfeaff 0%,#f3f6fb 45%,#e7f0ff 100%);padding:20px}
.login-card{width:100%;max-width:380px;background:#fff;border-radius:20px;box-shadow:0 18px 50px rgba(43,86,178,.14);padding:34px 30px}
/* 修改密码入口：登录卡片内、提示文字下方 */
.login-foot{margin-top:12px;font-size:13px;color:var(--text-3);cursor:pointer;user-select:none;text-align:center;transition:color .15s}
.login-foot:hover{color:var(--blue,#2b6bff)}
.modal-head{font-size:16px;margin-bottom:14px}
.modal-foot{display:flex;justify-content:flex-end;gap:10px;margin-top:16px}
.login-logo{width:52px;height:52px;border-radius:14px;background:linear-gradient(135deg,#4f8bff,#2b6bff);display:flex;align-items:center;justify-content:center;margin:0 auto 16px}
.login-logo svg{width:26px;height:26px;color:#fff}
.login-card h1{font-size:19px;text-align:center}
.login-card .lg-sub{text-align:center;color:var(--text-3);font-size:12.5px;margin:7px 0 24px}
.login-card .form-row{margin-bottom:14px}
.login-card input{width:100%;padding:11px 13px}
.login-err{color:var(--red);font-size:12.5px;min-height:18px;margin-bottom:6px;text-align:center}
.login-card .btn{width:100%;justify-content:center;padding:12px;font-size:14.5px}
.login-tip{margin-top:16px;text-align:center;font-size:11.5px;color:var(--text-3);line-height:1.8}

/* toast */
.toast{position:fixed;top:22px;left:50%;transform:translateX(-50%);background:#1f2633;color:#fff;font-size:13px;padding:10px 18px;border-radius:10px;z-index:999;box-shadow:0 8px 24px rgba(0,0,0,.2);animation:tin .25s}
.toast.err{background:var(--red)}
@keyframes tin{from{opacity:0;transform:translate(-50%,-8px)}to{opacity:1;transform:translate(-50%,0)}}

/* ===== H5 适配 ===== */
.bottom-nav{display:none}
@media (max-width:920px){
  .sidebar{transform:translateX(-100%);box-shadow:0 0 40px rgba(0,0,0,.15)}
  .sidebar.open{transform:none}
  .side-mask{position:fixed;inset:0;background:rgba(0,0,0,.35);z-index:40}
  .main{margin-left:0;padding:14px 14px 84px}
  .menu-btn{display:flex}
  .stat-grid{grid-template-columns:repeat(2,1fr);gap:10px}
  .stat-card{padding:14px}
  .stat-card .num{font-size:20px}
  .grid-2,.grid-main{grid-template-columns:1fr}
  .flow-row{grid-template-columns:1fr}
  .flow-card{margin-bottom:0}
  .banner{padding:20px}
  .banner h2{font-size:18px}
  .banner .date-chip{display:none}
  .track-row{flex-wrap:wrap}
  .td-head{flex-wrap:wrap}
  .track-row .tname{width:100%}
  .track-row .tbar{width:100%}
  .track-row .ttime{width:auto;margin-left:auto}
  /* 表格转卡片 */
  .table-wrap table,.table-wrap tbody,.table-wrap tr,.table-wrap td{display:block;width:100%}
  .table-wrap thead{display:none}
  .table-wrap tr{border:1px solid var(--line);border-radius:12px;padding:6px 12px;margin-bottom:10px}
  .table-wrap tr:hover{background:#fff}
  .table-wrap td{border:none;padding:7px 0}
  .table-wrap td[data-th]::before{content:attr(data-th);font-size:11px;color:var(--text-3);margin-right:8px}
  .bottom-nav{position:fixed;left:0;right:0;bottom:0;background:#fff;border-top:1px solid var(--line);z-index:60;display:flex;padding:6px 4px calc(6px + env(safe-area-inset-bottom))}
  .bottom-nav a{flex:1;display:flex;flex-direction:column;align-items:center;gap:3px;font-size:10.5px;color:var(--text-3);text-decoration:none;padding:4px 0;border-radius:8px}
  .bottom-nav a svg{width:20px;height:20px}
  .bottom-nav a.active{color:var(--primary);font-weight:600}
  .detail-head .acts{margin-left:0;width:100%}
  .detail-head .acts .btn{flex:1;justify-content:center}
  /* H5：详情头部卡片化（与下方内容宽度一致） */
  .detail-head{margin:0 0 14px;padding:16px 18px;background:var(--card);border-radius:var(--radius);box-shadow:var(--shadow)}
  .filter-row input[type=text]{min-width:0;flex:1}
  .photo-grid{grid-template-columns:repeat(3,1fr)}
  .stage-photos .photo-grid{grid-template-columns:repeat(3,1fr)}
}

/* ---- 项目详情侧栏：项目/采购切换 + 财务数据面板 ---- */
.pv-toggle{display:flex;background:#eef1f6;border-radius:9px;padding:3px;margin-bottom:12px}
.pv-toggle span{flex:1;text-align:center;padding:7px 0;border-radius:7px;font-size:13px;cursor:pointer;color:var(--text-2);transition:all .15s}
.pv-toggle span.on{background:#fff;color:var(--primary);font-weight:600;box-shadow:0 1px 4px rgba(16,24,40,.1)}
.pv-progress{display:flex;align-items:center;gap:8px}
.pv-bar{flex:1;height:6px;border-radius:3px;background:#e6eaf1;overflow:hidden}
.pv-bar i{display:block;height:100%;background:var(--green);border-radius:3px}
.pv-progress span{font-size:12px;color:var(--text-2);white-space:nowrap}
.pv-stage{display:flex;align-items:center;gap:8px;padding:8px 0;border-bottom:1px dashed var(--line);font-size:13px}
.pv-stage:last-child{border-bottom:none}
.pv-stage b{flex:1;font-weight:500;color:var(--text)}
.pv-stage em{font-style:normal;font-size:12px;color:var(--text-3)}
.pv-dot{width:8px;height:8px;border-radius:50%;background:#d5dbe4;flex:none}
.pv-dot.done{background:var(--green)}
.pv-dot.active{background:var(--primary)}
.fin-kv{display:grid;grid-template-columns:1fr 1fr;gap:6px 12px;font-size:12.5px;color:var(--text)}
.fin-kv b{color:var(--text-3);font-weight:400;margin-right:4px}
.fin-file{display:inline-flex;align-items:center;max-width:100%;margin:3px 6px 3px 0;padding:3px 9px;background:#f0f5ff;color:var(--primary);border-radius:6px;font-size:12px;cursor:pointer;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:top}
.fin-file:hover{background:#e0ebff}
/* ===== 财务面板：两栏（左·采购系统动态日志 / 右·基本信息+收付款统计+上传资料） ===== */
.fin-two-col{display:grid;grid-template-columns:1fr 1fr;gap:0 12px;align-items:start}
.fin-two-col .fin-col{min-width:0}
.fin-two-col h4{font-size:13px;margin:0 0 8px;color:var(--text)}
.fin-col + .fin-col{border-left:1px dashed #e3e8f2;padding-left:12px}
/* 窄容器内 kv 改单列，避免两栏再嵌两列过挤 */
.fin-two-col .fin-kv{grid-template-columns:1fr;gap:4px}
.fin-log{display:flex;flex-direction:column;gap:6px}
.fl-item{background:#f5f7fb;border-radius:8px;padding:7px 9px;font-size:12.5px;line-height:1.55}
.fl-item.sales{background:#eaf2ff}   /* 销项·浅蓝 */
.fl-item.purch{background:#e7f7ee}   /* 进项·浅果绿 */
.fl-item.note{background:#f3f4f6}    /* 备注·中性灰 */
.fl-date{font-size:11px;color:var(--text-3);margin-bottom:3px}
.fl-tag{display:inline-block;font-size:10.5px;line-height:1;padding:3px 6px;border-radius:5px;margin-right:5px;vertical-align:1px;flex-shrink:0}
.fl-tag.sales{background:#cfe2ff;color:#2b6bff}
.fl-tag.purch{background:#cdeeda;color:#189a54}
.fl-tag.note{background:#e2e5ea;color:#5b6472}
.fl-txt{word-break:break-word}
.fin-sub-h{font-size:12px;font-weight:600;color:var(--text-2);margin:8px 0 5px}
@media (max-width:920px){ /* H5：两栏改上下堆叠 */
  .fin-two-col{grid-template-columns:1fr}
  .fin-col + .fin-col{border-left:none;padding-left:0;border-top:1px dashed #e3e8f2;padding-top:12px;margin-top:6px}
}
/* 财务面板防溢出：grid/flex 子项允许收缩，长芯片截断省略、长文本可断行 */
#pv-fin,.td-view-fin{min-width:0;overflow-wrap:break-word}
#pv-fin .fin-two-col>div,.td-view-fin .fin-two-col>div{min-width:0}
/* 项目分配卡（主账号 · 详情右栏） */
.assign-card .assign-now{font-size:13px;color:var(--text-2);margin-bottom:10px}
.assign-card .assign-now b{color:var(--text);font-weight:600}
.assign-row{display:flex;gap:8px}
.assign-row select{flex:1;min-width:0}
.assign-row .btn{flex-shrink:0}

/* ===== 待分配项目（认领页） ===== */
.ua-item{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 8px;border-bottom:1px solid #eef1f6}
.ua-item:last-child{border-bottom:none}
.ua-item .ua-main{display:flex;flex-direction:column;gap:3px;min-width:0}
.ua-item .ua-main b{font-size:14px}
.ua-item .ua-main span{font-size:12px;color:var(--text-3)}
.ua-item .ua-tag{font-size:12px;color:var(--text-3);background:#f2f4f8;border-radius:6px;padding:4px 10px;white-space:nowrap}
.ua-item .ua-claim{white-space:nowrap}
