/* ============================================================
   铁路蓝主题 · 浅色门户（宽屏 + 卡片动效）
   深蓝 #16365c / 点缀红 #c00000
   ============================================================ */
:root{
  --rail-blue:#16365c; --rail-blue-2:#1f4a7a; --rail-blue-3:#2f6fb2;
  --rail-accent:#c00000; --rail-accent-2:#e03636;
  --rail-bg:#f2f5fa; --rail-ink:#22304a;
  --shadow-sm:0 1px 4px rgba(22,54,92,.08);
  --shadow-md:0 8px 24px rgba(22,54,92,.12);
  --shadow-lg:0 16px 40px rgba(22,54,92,.18);
}
body{
  background:var(--rail-bg);
  font-family:"Microsoft YaHei","PingFang SC","Hiragino Sans GB",system-ui,-apple-system,sans-serif;
  color:var(--rail-ink);
}
/* ---------- 宽屏布局 ---------- */
.wrap-wide{max-width:1600px;margin:0 auto;padding-left:1.25rem;padding-right:1.25rem;}
.portal-main{min-width:0;}
.portal-main main{max-width:100%;}

.text-rail{color:var(--rail-blue)!important;}
.bg-rail{background:var(--rail-blue)!important;}
.btn-rail{background:var(--rail-blue);color:#fff;border:none;transition:all .25s ease;}
.btn-rail:hover{background:var(--rail-blue-2);color:#fff;transform:translateY(-1px);box-shadow:0 6px 16px rgba(22,54,92,.3);}
.btn-accent{background:linear-gradient(135deg,var(--rail-accent),#8f0000);color:#fff;border:none;transition:all .25s ease;}
.btn-accent:hover{background:linear-gradient(135deg,var(--rail-accent-2),var(--rail-accent));color:#fff;transform:translateY(-1px);box-shadow:0 6px 16px rgba(192,0,0,.35);}

/* ---------- 顶部导航 ---------- */
.navbar-rail{background:linear-gradient(90deg,#16365c 0%,#0d2240 100%);box-shadow:0 2px 12px rgba(8,26,48,.35);}
.navbar-rail .nav-link,.navbar-rail .navbar-brand{color:#fff;}
.navbar-rail .nav-link{position:relative;transition:color .25s;}
.navbar-rail .nav-link::after{content:"";position:absolute;left:.7rem;right:.7rem;bottom:.25rem;height:2px;background:#ffd966;transform:scaleX(0);transition:transform .3s ease;}
.navbar-rail .nav-link:hover{color:#ffd966;}
.navbar-rail .nav-link:hover::after{transform:scaleX(1);}

/* ---------- 卡片与动效 ---------- */
.card-shadow{
  background:#fff;border-radius:.9rem;box-shadow:var(--shadow-sm);
  transition:transform .28s ease,box-shadow .28s ease;
}
.card-shadow.hoverable:hover{transform:translateY(-5px);box-shadow:var(--shadow-md);}
.stat-card{
  background:#fff;border-radius:.9rem;padding:1.15rem 1.3rem;box-shadow:var(--shadow-sm);
  position:relative;overflow:hidden;height:100%;
  transition:transform .28s ease,box-shadow .28s ease;
}
.stat-card::before{content:"";position:absolute;inset:0 auto 0 0;width:4px;background:linear-gradient(180deg,var(--rail-blue),var(--rail-accent));opacity:.85;}
.stat-card:hover{transform:translateY(-4px);box-shadow:var(--shadow-md);}
.stat-card .num{font-size:1.8rem;font-weight:700;color:var(--rail-blue);line-height:1.2;}
.glass{
  background:rgba(255,255,255,.72);
  backdrop-filter:blur(14px) saturate(1.3);
  -webkit-backdrop-filter:blur(14px) saturate(1.3);
  border:1px solid rgba(255,255,255,.65);
  box-shadow:var(--shadow-md);
}
.frame-glow{position:relative;border-radius:.9rem;}
.frame-glow::before{
  content:"";position:absolute;inset:-1px;border-radius:1rem;padding:1px;
  background:linear-gradient(120deg,rgba(22,54,92,.5),rgba(192,0,0,.45),rgba(47,111,178,.5));
  -webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);
  -webkit-mask-composite:xor;mask-composite:exclude;
  opacity:0;transition:opacity .35s ease;pointer-events:none;
}
.frame-glow:hover::before{opacity:1;}

/* ---------- 字体层次 ---------- */
.page-title{
  font-weight:800;letter-spacing:.02em;color:var(--rail-blue);
  background:linear-gradient(120deg,#16365c 20%,#2f6fb2 60%,#16365c);
  -webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;
}
.section-title{font-weight:700;letter-spacing:.03em;color:var(--rail-blue);}
@keyframes fadeUp{from{opacity:0;transform:translateY(14px);}to{opacity:1;transform:none;}}
.anim-in{animation:fadeUp .5s ease both;}
.anim-in-1{animation:fadeUp .5s .05s ease both;}
.anim-in-2{animation:fadeUp .5s .12s ease both;}
.anim-in-3{animation:fadeUp .5s .2s ease both;}

/* ---------- 门户侧边栏 ---------- */
.portal-sidebar{
  width:236px;min-height:100vh;flex-shrink:0;position:sticky;top:0;height:100vh;overflow-y:auto;
  background:linear-gradient(180deg,#16365c 0%,#0d2240 100%);color:#dbe4f0;
}
.portal-sidebar .brand{padding:1.05rem 1.15rem;font-weight:700;color:#fff;border-bottom:1px solid rgba(255,255,255,.12);letter-spacing:.05em;}
.portal-sidebar a{color:#c6d3e6;text-decoration:none;display:block;padding:.5rem 1.1rem;border-radius:.45rem;margin:.1rem .55rem;transition:all .22s ease;}
.portal-sidebar a:hover,.portal-sidebar a.active{background:rgba(255,255,255,.13);color:#fff;transform:translateX(3px);}
.portal-sidebar details{margin:.1rem .55rem;}
.portal-sidebar details>summary{cursor:pointer;padding:.55rem .6rem;border-radius:.45rem;list-style:none;font-weight:600;color:#fff;letter-spacing:.04em;}
.portal-sidebar details>summary::-webkit-details-marker{display:none;}
.portal-sidebar details>summary::before{content:"▸ ";color:#ffd966;}
.portal-sidebar details[open]>summary::before{content:"▾ ";}
.portal-sidebar details a{padding-left:1.4rem;font-size:.93rem;}
.portal-topbar{
  background:rgba(255,255,255,.85);backdrop-filter:blur(10px);
  border-bottom:1px solid #e3e8f0;padding:.7rem 1.5rem;display:flex;align-items:center;justify-content:space-between;
  position:sticky;top:0;z-index:100;
}
.user-chip{display:flex;align-items:center;gap:.55rem;}
.user-chip .avatar{
  width:36px;height:36px;border-radius:50%;color:#fff;display:flex;align-items:center;justify-content:center;font-weight:700;
  background:linear-gradient(135deg,var(--rail-blue),var(--rail-blue-3));box-shadow:0 3px 8px rgba(22,54,92,.3);
}

/* ---------- 时间线 ---------- */
.tl{position:relative;padding-left:1.6rem;}
.tl::before{content:"";position:absolute;left:.45rem;top:.4rem;bottom:.4rem;width:2px;background:linear-gradient(180deg,#cfd9e8,#e7edf5);}
.tl-item{position:relative;padding-bottom:1.1rem;}
.tl-item::before{content:"";position:absolute;left:-1.32rem;top:.25rem;width:.8rem;height:.8rem;border-radius:50%;background:#fff;border:3px solid var(--rail-blue);transition:transform .25s;}
.tl-item:hover::before{transform:scale(1.25);}
.tl-item.hot::before{border-color:var(--rail-accent);}

/* ---------- 表格 / 徽标 / 进度 ---------- */
.table thead th{background:#eef2f8;color:var(--rail-blue);white-space:nowrap;letter-spacing:.02em;}
.table tbody tr{transition:background .2s;}
.badge{font-weight:500;letter-spacing:.02em;}
.progress{height:.7rem;border-radius:1rem;}
.progress-bar{transition:width 1s ease;}

/* ---------- 信息墙卡片 ---------- */
.wall-card{
  background:#fff;border-radius:.9rem;box-shadow:var(--shadow-sm);padding:1.1rem 1.2rem;height:100%;
  border-top:3px solid var(--rail-blue);
  transition:transform .28s ease,box-shadow .28s ease,border-color .28s;
}
.wall-card:hover{transform:translateY(-5px);box-shadow:var(--shadow-md);border-top-color:var(--rail-accent);}
.update-card{border-left:4px solid var(--rail-blue-3);}
.update-card .utype-badge{font-size:.75rem;}

footer.site-footer{background:#0d2240;color:#9db3d0;padding:1.4rem 0;margin-top:3rem;font-size:.9rem;}

/* ---------- 第三轮升级：紧凑密度覆盖 ---------- */
.wrap-wide{max-width:2400px;padding-left:16px;padding-right:16px;}
.portal-sidebar{width:200px;}
.portal-topbar{padding:.4rem 1rem;}
main .p-4{padding:.8rem!important;}
main .mb-4{margin-bottom:.8rem!important;}
main .g-4{--bs-gutter-x:.8rem;--bs-gutter-y:.8rem;}
main .g-3{--bs-gutter-x:.6rem;--bs-gutter-y:.6rem;}
.stat-card{padding:.7rem .9rem;}
.stat-card .num{font-size:1.4rem;}
.wall-card{padding:.7rem .85rem;}
main .card-shadow.p-4{padding:.9rem!important;}

/* ---------- 横向阶段时间轴 ---------- */
.tl-h{display:flex;align-items:flex-start;overflow-x:auto;padding:.4rem .2rem;}
.tl-h-node{display:flex;flex-direction:column;align-items:center;min-width:92px;flex:1;text-align:center;}
.tl-h-dot{
  width:34px;height:34px;border-radius:50%;display:flex;align-items:center;justify-content:center;
  font-weight:700;font-size:.85rem;background:#e7edf5;color:#7a8ca8;border:2px solid #cfd9e8;
  transition:transform .25s ease;
}
.tl-h-node.done .tl-h-dot{background:var(--rail-blue);border-color:var(--rail-blue);color:#fff;}
.tl-h-node.current .tl-h-dot{
  background:var(--rail-accent);border-color:var(--rail-accent);color:#fff;
  box-shadow:0 0 0 5px rgba(192,0,0,.15);transform:scale(1.12);
}
.tl-h-label{margin-top:.35rem;font-size:.8rem;font-weight:600;color:var(--rail-blue);}
.tl-h-node.current .tl-h-label{color:var(--rail-accent);}
.tl-h-date{font-size:.72rem;color:#93a5bd;}
.tl-h-line{flex:0 0 24px;height:2px;background:#cfd9e8;margin-top:16px;}
.tl-h-line.done{background:var(--rail-blue);}

/* ---------- 第四轮：全局字号下限 15px ----------
   单条规则便于调整；需压在 Bootstrap 工具类（.small/.btn-sm/.badge 等）之上，
   故使用 !important（这些类自身也用 !important）。 */
small, .small, .badge, .btn-sm, .btn-group-sm > .btn,
.form-control-sm, .form-select-sm, .table-sm,
.form-text, .invalid-feedback, .valid-feedback,
.pagination .page-link, .tl-h-date, .utype-badge, .demo-table,
.list-group-item, .accordion-button, summary, label, .form-label{
  font-size:15px!important;
}

/* ---------- 第四轮：页面切换过渡（≤300ms，减弱动效时禁用） ---------- */
@keyframes pageIn{from{opacity:0;transform:translateY(10px);}to{opacity:1;transform:translateY(0);}}
main{animation:pageIn .28s ease both;}
@media (prefers-reduced-motion: reduce){
  main{animation:none;}
  *{animation-duration:.01ms!important;transition-duration:.01ms!important;}
}

/* ---------- 第四轮：公共页 footer 吸底 ---------- */
.public-body{display:flex;flex-direction:column;min-height:100vh;}
.public-body>main{flex:1 0 auto;}
.public-body>footer.site-footer{flex-shrink:0;margin-top:2rem;}
/* 门户主区同样铺满视口高度 */
.portal-body{display:flex;flex-direction:column;min-height:100vh;}
.portal-body>main{flex:1 0 auto;}

/* ---------- 第四轮：各端口铁路元素 SVG 背景（清晰可见的淡色版） ---------- */
body[class*="bg-role-"]{
  background-color:var(--rail-bg);
  background-image:
    linear-gradient(180deg,var(--role-tint,rgba(47,111,178,.07)) 0%,rgba(0,0,0,0) 42%),
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1600' height='360' viewBox='0 0 1600 360'%3E%3Cg fill='none' stroke='%2316365c' stroke-opacity='0.15' stroke-width='2'%3E%3Cpath d='M0 210 L130 120 L260 210'/%3E%3Cpath d='M180 210 L280 140 L380 210'/%3E%3Cpath d='M1220 215 L1330 135 L1440 215'/%3E%3Cpath d='M1380 215 L1470 150 L1560 215'/%3E%3Cpath d='M0 212 L1600 212'/%3E%3Cpath d='M520 360 L790 135'/%3E%3Cpath d='M1080 360 L810 135'/%3E%3Cpath d='M540 340 L1060 340'/%3E%3Cpath d='M580 315 L1020 315'/%3E%3Cpath d='M620 290 L980 290'/%3E%3Cpath d='M655 265 L945 265'/%3E%3Cpath d='M690 240 L910 240'/%3E%3Cpath d='M720 216 L880 216'/%3E%3Cpath d='M745 192 L855 192'/%3E%3Cpath d='M765 170 L835 170'/%3E%3Cpath d='M150 360 L150 80'/%3E%3Cpath d='M150 92 L280 92'/%3E%3Cpath d='M280 92 L280 120'/%3E%3Cpath d='M400 330 L400 105'/%3E%3Cpath d='M400 115 L500 115'/%3E%3Cpath d='M500 115 L500 138'/%3E%3Cpath d='M1450 360 L1450 80'/%3E%3Cpath d='M1450 92 L1320 92'/%3E%3Cpath d='M1320 92 L1320 120'/%3E%3Cpath d='M1200 330 L1200 105'/%3E%3Cpath d='M1200 115 L1100 115'/%3E%3Cpath d='M1100 115 L1100 138'/%3E%3Cpath d='M0 132 L800 128 L1600 132'/%3E%3Cpath d='M600 70 q12 -12 24 0 q12 -12 24 0'/%3E%3Cpath d='M950 55 q10 -10 20 0 q10 -10 20 0'/%3E%3Cpath d='M700 212 L700 150'/%3E%3C/g%3E%3Cg fill='%2316365c' fill-opacity='0.15'%3E%3Ccircle cx='700' cy='142' r='7'/%3E%3C/g%3E%3Cg fill='%2316365c' fill-opacity='0.08' stroke='%2316365c' stroke-opacity='0.12' stroke-width='2'%3E%3Cpath d='M940 212 L940 170 Q940 150 965 148 L1180 148 Q1215 148 1235 175 L1245 192 Q1250 212 1225 212 Z'/%3E%3Crect x='965' y='160' width='34' height='18' rx='3'/%3E%3Crect x='1010' y='160' width='34' height='18' rx='3'/%3E%3Crect x='1055' y='160' width='34' height='18' rx='3'/%3E%3Crect x='1100' y='160' width='34' height='18' rx='3'/%3E%3Cpath d='M1060 148 L1085 128 L1110 148'/%3E%3C/g%3E%3C/svg%3E");
  background-repeat:repeat,no-repeat;
  background-position:0 0,center bottom;
  background-size:auto auto,1600px 360px;
  background-attachment:scroll,fixed;
}
body.bg-role-student{--role-tint:rgba(47,111,178,.09);}
body.bg-role-teacher{--role-tint:rgba(75,92,196,.09);}
body.bg-role-chair{--role-tint:rgba(58,161,126,.09);}
body.bg-role-dean{--role-tint:rgba(22,54,92,.11);}
body.bg-role-expert{--role-tint:rgba(132,94,194,.09);}
body.bg-role-admin{--role-tint:rgba(90,107,125,.11);}

/* ---------- 第四轮：往年项目"项目书"卡片 ---------- */
.proj-book{
  position:relative;background:#fffdf8;border-radius:.6rem;height:100%;
  box-shadow:0 2px 6px rgba(22,54,92,.10),0 10px 24px rgba(22,54,92,.08);
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120'%3E%3Cg fill='%2316365c' fill-opacity='0.025'%3E%3Ccircle cx='18' cy='22' r='1.4'/%3E%3Ccircle cx='64' cy='12' r='1.2'/%3E%3Ccircle cx='102' cy='44' r='1.5'/%3E%3Ccircle cx='40' cy='70' r='1.2'/%3E%3Ccircle cx='88' cy='96' r='1.4'/%3E%3Ccircle cx='24' cy='108' r='1.1'/%3E%3C/g%3E%3C/svg%3E");
  transition:transform .28s ease,box-shadow .28s ease;
  overflow:hidden;
}
.proj-book:hover{transform:translateY(-5px);box-shadow:0 8px 18px rgba(22,54,92,.14),0 18px 40px rgba(22,54,92,.12);}
.pb-band{
  display:flex;justify-content:space-between;align-items:center;
  padding:.45rem .9rem;color:#fff;font-size:15px;font-weight:600;letter-spacing:.08em;
}
.pb-band.lv-national{background:linear-gradient(90deg,#8a0e1c,#c00000);}
.pb-band.lv-prov{background:linear-gradient(90deg,#16365c,#2f6fb2);}
.pb-band.lv-school{background:linear-gradient(90deg,#3aa17e,#7fc8a9);}
.pb-body{padding:.85rem 1rem .95rem;position:relative;}
.pb-title{
  font-size:17px;font-weight:800;color:#16365c;line-height:1.35;
  min-height:2.7em;padding-right:72px;
}
.pb-stamp{
  position:absolute;top:.6rem;right:.8rem;width:62px;height:62px;border-radius:50%;
  border:2px dashed;display:flex;align-items:center;justify-content:center;text-align:center;
  font-size:15px;font-weight:800;transform:rotate(-12deg);opacity:.82;line-height:1.1;
  background:rgba(255,255,255,.6);
}
.pb-stamp.lv-national{color:#c00000;border-color:#c00000;}
.pb-stamp.lv-prov{color:#2f6fb2;border-color:#2f6fb2;}
.pb-stamp.lv-school{color:#2e8b6e;border-color:#2e8b6e;}
.pb-meta{width:100%;font-size:15px;margin:.4rem 0 .5rem;border-collapse:collapse;}
.pb-meta th{
  color:#8a99ab;font-weight:600;white-space:nowrap;padding:.18rem .6rem .18rem 0;
  border-bottom:1px dashed #e3e8f0;width:64px;font-size:15px;
}
.pb-meta td{color:#3d4f66;padding:.18rem 0;border-bottom:1px dashed #e3e8f0;font-size:15px;}
.pb-meta tr:last-child th,.pb-meta tr:last-child td{border-bottom:none;}
.pb-intro{
  font-family:"SimSun","Songti SC",serif;font-size:15px;color:#5a6b7d;line-height:1.6;
  border-left:3px solid #d8c58a;padding-left:.6rem;min-height:3.2em;
}
.pb-intro::before{content:"「";color:#c9a96a;}
.pb-intro::after{content:"」";color:#c9a96a;}

/* ---------- 第五轮：在研项目过程管理入口区 ---------- */
.proc-zone{border-left:4px solid #e8a33d;}
.proc-countdown{font-size:15px!important;padding:.45rem .8rem;}
.proc-entry{
  display:flex;align-items:center;gap:.7rem;background:#fff;border:1px solid #e3e8f0;
  border-radius:.8rem;padding:.7rem .9rem;height:100%;text-decoration:none;
  transition:transform .25s ease,box-shadow .25s ease,border-color .25s;
}
.proc-entry:hover{transform:translateY(-3px);box-shadow:var(--shadow-md);border-color:var(--rail-blue);}
.proc-entry i{font-size:1.5rem;color:var(--rail-blue);}
.proc-entry b{display:block;color:#16365c;font-size:15px;}
.proc-entry span{display:block;color:#8a99ab;font-size:15px;}
