/* ============================================================
   湾区AI日历 · BAY AREA AI CALENDAR
   全站样式表（多页版）
   品牌色：深蓝 #0B132B / 品牌蓝 #2563EB / 荧光青 #00E5FF / 青绿 #14B8A6
   ============================================================ */

:root{
  --navy:#0B132B;
  --navy-2:#122A54;
  --navy-3:#1A3E7A;
  --blue:#2563EB;
  --blue-d:#1D4ED8;
  --blue-l:#5B8DF6;
  --cyan:#00E5FF;
  --teal:#14B8A6;

  --bg:#F7FAFF;
  --card:#FFFFFF;
  --blue-bg:#EFF5FF;
  --blue-bg2:#E6F0FF;
  --line:#E2EAF7;
  --line-strong:#CDDCF2;

  --tx:#0F172A;
  --tx2:#475569;
  --tx3:#8296B0;

  --amber:#B45309; --amber-bg:#FFF7E8;
  --red:#B91C1C; --red-bg:#FEF2F2;
  --green:#0F766E; --green-bg:#E7FBF7;

  --radius:14px;
  --shadow:0 2px 10px rgba(37,99,235,.06);
  --shadow-h:0 10px 28px rgba(37,99,235,.14);
}
*{box-sizing:border-box;margin:0;padding:0}
body{
  font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;
  background:var(--bg); color:var(--tx); line-height:1.6; font-size:14px;
  -webkit-font-smoothing:antialiased;
}
.wrap{max-width:1120px;margin:0 auto;padding:0 24px}
a{color:var(--blue-d);text-decoration:none}
a:hover{text-decoration:underline}

/* ============ HEADER（首页大头部） ============ */
header{
  position:relative; overflow:hidden; color:#fff;
  background:linear-gradient(158deg,#0B132B 0%,#122B57 48%,#1B4285 100%);
  padding:40px 0 0;
}
header::before{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:
    radial-gradient(620px 320px at 84% 8%, rgba(0,229,255,.22), transparent 62%),
    radial-gradient(520px 300px at 6% 92%, rgba(37,99,235,.34), transparent 66%);
}
header::after{
  content:"";position:absolute;inset:0;pointer-events:none;opacity:.30;
  background-image:linear-gradient(rgba(140,190,255,.14) 1px,transparent 1px),
                   linear-gradient(90deg,rgba(140,190,255,.14) 1px,transparent 1px);
  background-size:52px 52px;
  mask-image:linear-gradient(180deg,rgba(0,0,0,.85),transparent 78%);
  -webkit-mask-image:linear-gradient(180deg,rgba(0,0,0,.85),transparent 78%);
}
.head-inner{position:relative;z-index:2;padding-bottom:26px}
.brand-row{display:flex;align-items:center;gap:14px;flex-wrap:wrap}
.brand-row a{color:inherit;text-decoration:none}
.logo{
  width:38px;height:38px;border-radius:10px;flex:0 0 38px;
  background:linear-gradient(140deg,var(--blue) 0%,var(--cyan) 100%);
  display:flex;align-items:center;justify-content:center;
  font-weight:700;font-size:16px;color:#fff;
  box-shadow:0 6px 18px rgba(0,229,255,.32);
}
/* 页头站点名「湾区AI日历」。原来的选择器是裸标签 h1，等于给全站每个 <h1> 都套上
   「文字透明 + 渐变裁剪」——详情页和赛事页标题同为 <h1>，一并继承后文字变透明，
   只剩渐变底色，而渐变从纯白起步，在浅色卡片上左半截直接隐形，
   看起来就像标题被一块色块盖住了。收窄成类选择器，只作用于页头。 */
.site-name{
  font-size:26px;font-weight:700;letter-spacing:-.3px;
  background:linear-gradient(92deg,#FFFFFF 12%,#9ED8FF 58%,#00E5FF 100%);
  -webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;
}
.en{font-size:10px;color:#8FB6E8;letter-spacing:2.4px;text-transform:uppercase}
.tagline{
  font-size:12px;color:#CFE3FF;background:rgba(255,255,255,.10);
  border:1px solid rgba(140,190,255,.28);padding:3px 11px;border-radius:20px;
}
.stats{display:flex;gap:26px;flex-wrap:wrap;margin-top:20px}
.stat{position:relative;padding-left:16px}
.stat::before{content:"";position:absolute;left:0;top:4px;bottom:2px;width:2px;border-radius:2px;background:linear-gradient(180deg,var(--cyan),rgba(0,229,255,.15))}
.stat-num{
  font-size:22px;font-weight:700;line-height:1.2;
  background:linear-gradient(92deg,#fff,#7FD4FF);
  -webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;
}
.stat-num small{font-size:12px;font-weight:500;-webkit-text-fill-color:#C7DCFF;margin-left:2px}
.stat-lab{font-size:11px;color:#8FB6E8;letter-spacing:1.2px;margin-top:2px}
/* 这里原有 .notice（首页顶部「关于本站」深色说明框）。该区块已按需求移除，
   规则一并清掉，不留孤儿样式。声明口径本身没有消失 —— 页尾区块与
   build.py 的 contact_legal_block() 仍原地保留，需要恢复时把占位加回模板即可。 */
/* .skyline：hero 底部的城市天际线装饰条（96px）。
   按需求已从首页模板摘掉 {skyline} 占位以缩短头部与活动日历的边距；
   SVG 仍在 build.py 的 SKYLINE 常量里，要恢复把占位加回模板即可。 */
.skyline{display:block;width:100%;height:96px;margin-top:6px}

/* ============ 内页页头（详情页 / 机构页 / 列表页） ============ */
.page-head{
  position:relative;overflow:hidden;color:#fff;
  background:linear-gradient(158deg,#0B132B 0%,#122B57 60%,#1B4285 100%);
  padding:18px 0 22px;
}
.page-head::before{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:radial-gradient(520px 240px at 88% 0%, rgba(0,229,255,.18), transparent 66%);
}
.page-head .wrap{position:relative;z-index:2}
.page-head .brand-row{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.page-head .logo{width:30px;height:30px;flex:0 0 30px;border-radius:8px;font-size:13px}
.page-head .site-name{font-size:16px;font-weight:700;color:#fff}
.page-head .tagline{font-size:11px;padding:2px 9px}
.crumb{margin-top:16px;font-size:12px;color:#9EC0EE;line-height:1.9}
.crumb a{color:#CFE3FF;text-decoration:none}
.crumb a:hover{color:#fff;text-decoration:underline}
.crumb .sep{margin:0 7px;color:#5C86C4}
.navlinks{margin-top:14px;display:flex;gap:8px;flex-wrap:wrap}
.navlinks a{
  font-size:12px;color:#CFE3FF;background:rgba(255,255,255,.08);
  border:1px solid rgba(140,190,255,.26);border-radius:20px;padding:4px 13px;
  text-decoration:none;transition:all .16s;
}
.navlinks a:hover{background:rgba(255,255,255,.16);color:#fff;border-color:rgba(0,229,255,.5)}

/* ============ SECTIONS ============ */
section{padding:34px 0 6px}
h2{
  font-size:17px;font-weight:700;margin-bottom:4px;color:#0B132B;
  display:flex;align-items:center;gap:10px;
}
h2::before{
  content:"";width:4px;height:18px;border-radius:2px;
  background:linear-gradient(180deg,var(--blue),var(--cyan));
  box-shadow:0 0 10px rgba(0,229,255,.55);
}
.sec-desc{font-size:13px;color:var(--tx2);margin:0 0 18px 14px}

/* ============ FEATURED ============ */
.featured-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(480px,1fr));gap:14px}
@media(max-width:1080px){.featured-grid{grid-template-columns:1fr}}
/* 移动端重点活动也走双列（与时间轴一致的密度诉求）：
   概述段与「适合谁」气泡收进详情页，卡片只留标题 / 徽标 / 元信息 / 标签。 */
@media(max-width:640px){
  .featured-grid{grid-template-columns:1fr 1fr;gap:9px}
  .feat{padding:12px 11px 12px 15px}
  .feat-name{font-size:12.5px;line-height:1.45}
  .feat-meta{font-size:11px;margin-top:6px}
  .datebadge{font-size:10.5px;padding:3px 8px;border-radius:7px}
  .feat-detail,.feat-fit{display:none}
  .tagrow{margin-top:8px;gap:4px}
  .tagrow .tag{font-size:10.5px;padding:2px 6px}
}
.feat{
  position:relative;overflow:hidden;
  background:var(--card);border:1px solid var(--line);border-radius:var(--radius);
  padding:20px 22px 20px 25px;box-shadow:var(--shadow);
  transition:transform .18s ease,box-shadow .18s ease,border-color .18s ease;
}
.feat::before{content:"";position:absolute;left:0;top:0;bottom:0;width:4px;background:linear-gradient(180deg,var(--blue-d),var(--blue),var(--cyan))}
.feat::after{content:"";position:absolute;right:-40px;top:-40px;width:150px;height:150px;border-radius:50%;background:radial-gradient(circle,rgba(37,99,235,.09),transparent 70%);pointer-events:none}
.feat:hover{transform:translateY(-3px);box-shadow:var(--shadow-h);border-color:var(--line-strong)}
.feat-top{display:flex;justify-content:space-between;gap:14px;align-items:flex-start;flex-wrap:wrap}
.feat-name{font-size:15px;font-weight:700;line-height:1.45;color:#0B132B}
.datebadge{
  font-size:12px;font-weight:600;color:#fff;
  background:linear-gradient(135deg,var(--blue-d),var(--blue));
  padding:5px 11px;border-radius:8px;white-space:nowrap;
  box-shadow:0 4px 12px rgba(37,99,235,.28);
}
.feat-meta{font-size:13px;color:var(--tx2);margin-top:9px}
.feat-meta b{color:var(--tx);font-weight:600}
.feat-detail{font-size:13px;color:var(--tx2);margin-top:10px}
.feat-fit{
  margin-top:12px;font-size:12px;line-height:1.7;
  color:#0E6B8A;background:#ECFBFF;border-left:3px solid var(--cyan);
  border-radius:8px;padding:9px 12px;
}
.tagrow{display:flex;flex-wrap:wrap;gap:6px;margin-top:12px;align-items:center}
.tag{
  font-size:12px;padding:3px 9px;border-radius:6px;
  background:var(--blue-bg);color:var(--tx2);border:1px solid var(--line);
}
.tag.tk{background:#E6F0FF;color:var(--blue-d);border-color:#C3DAFF;font-weight:500}
.tag.free{background:var(--green-bg);color:var(--green);border-color:#B7EBDF;font-weight:500}
.tag.risk{background:var(--red-bg);color:var(--red);border-color:#FBD5D5}
.tag.ended{background:#F1F5F9;color:#64748B;border-color:#E2E8F0}
.feat-name a,.ev-name a{color:inherit;text-decoration:none}
.feat-name a:hover,.ev-name a:hover{color:var(--blue-d)}

/* ============ 时间轴（按日期分组） ============ */
.chips{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:16px}
.chip{
  font-size:12px;padding:5px 14px;border-radius:20px;background:var(--card);
  border:1px solid var(--line-strong);color:var(--tx2);cursor:pointer;transition:all .16s;
}
.chip:hover{border-color:var(--blue-l);color:var(--blue-d);box-shadow:0 2px 10px rgba(37,99,235,.12)}
.chip.on{background:linear-gradient(135deg,var(--blue-d),var(--blue));color:#fff;border-color:transparent;box-shadow:0 4px 14px rgba(37,99,235,.32)}
/* 这里原有 .chips-more（「更多城市（n）」折叠器）的样式。
   城市 chip 现改为全部平铺，折叠器连同模板与这组规则一并移除 ——
   城市总数只有 5 个，一屏放得下，藏起来反而让人以为只有深圳广州。 */
.timeline{display:grid;gap:18px}
.tl-day{display:grid;grid-template-columns:132px 1fr;gap:20px;align-items:start}
@media(max-width:760px){.tl-day{grid-template-columns:1fr;gap:8px}}
.tl-head{position:sticky;top:12px;text-align:right}
@media(max-width:760px){.tl-head{text-align:left}}
.tl-d{
  font-size:15px;font-weight:700;color:#0B132B;line-height:1.3;
}
.tl-d .wd{font-size:11px;font-weight:500;color:var(--tx3);display:block;letter-spacing:.5px}
.tl-count{font-size:11px;color:var(--tx3);margin-top:3px}
.tl-list{display:grid;gap:9px;border-left:2px solid var(--line);padding-left:20px}
@media(max-width:760px){.tl-list{border-left:none;padding-left:0}}
.ev{
  position:relative;
  background:var(--card);border:1px solid var(--line);border-radius:12px;
  padding:13px 17px;box-shadow:var(--shadow);
  transition:transform .18s ease,box-shadow .18s ease,border-color .18s ease;
}
.ev:hover{transform:translateY(-2px);box-shadow:var(--shadow-h);border-color:var(--line-strong)}
/* 卡片改为「左封面色块 + 右正文」，与联谱那类列表同构；
   两态共用一个固定尺寸，日后补上海报不会引起布局位移 */
/* 卡片改为「左封面 + 右正文」。
   官方海报多是竖版，所以位子是竖向矩形而非正方形：占位骨架照样填满，
   换成海报时按 object-position:top 从顶部对齐，标题区不会被裁掉。 */
.ev{display:flex;gap:14px;align-items:flex-start}
.ev-body{flex:1;min-width:0}
/* 海报缩略图：框尺寸固定（和首字占位块同一套），不随图片比例变，
   所以同一排卡片高度整齐。

   此前是 48×62 + object-fit:cover 硬裁，遇到 600×2760 的长图只截到
   顶部一条深色页眉，看上去就是一块来路不明的深色色块——用户反馈的
   「海报不和谐」就是这个。

   长图的处理见下面 [style*="--pn"] 那条：不把整张缩进去（会细成一条缝），
   也不让框长高（会把卡片撑得比邻卡高一半），而是取出整图中的一段填满框。
   那张图本身是可整除的切图海报，每一段都是完整的 3:4 竖版设计。 */
.ev-poster{
  flex:0 0 84px;width:84px;height:108px;margin:0;border-radius:9px;
  overflow:hidden;position:relative;background:#F1F5F9;
}
.ev-poster img{width:100%;height:100%;object-fit:cover;display:block}
/* 长图取段：--pn 是总段数，--pi 是要第几段。
   图片先按「n 倍框高」纵向放大（宽度自动等比跟随），此时整图高度
   正好是框高的 n 倍；再用 translateY 把目标段移进框内——
   一段占整图高度的 1/n，所以按图片自身高度取百分比就是 100%/n × i。
   框宽固定 84px、整图按 3:4 段比例放大后宽度略大于 84px，
   用 overflow:hidden 裁掉两侧极小的溢出，主体不受影响。 */
.ev-poster[style*="--pn"] img{
  height:calc(var(--pn) * 100%);
  width:auto;min-width:100%;
  transform:translateY(calc(-100% / var(--pn) * var(--pi)));
}
.ev-poster .poster-ph{
  width:100%;height:100%;display:flex;align-items:center;justify-content:center;
  font-size:18px;font-weight:700;line-height:1;user-select:none;
}
.ev-poster.is-empty{border:1px dashed var(--line-strong);background:#FBFCFE}
/* 「图源主办方」角标按需求取消，.poster-src 样式随之移除 */
/* 移动端（≤640px）活动卡改「左右双列」：
   需求是一屏至少看到 4 场，所以整卡压缩 —— 海报缩到 46×62（仍是可辨识的
   竖版缩略图，只是变小）、概述/备注收进详情页、正文两行封顶。
   （历史上海报曾被放大到 72×96，那是单列时代的取舍；双列后宽度只有
   ~165px，海报再大就挤掉标题了，故回调。） */
@media(max-width:640px){
  .tl-list{grid-template-columns:1fr 1fr;gap:8px}
  .ev{gap:8px;padding:10px 11px}
  .ev-poster{flex:0 0 46px;width:46px;height:62px;border-radius:7px}
  .ev-poster .poster-ph{font-size:15px}
  .ev-name{font-size:12.5px;line-height:1.45}
  /* 地点/类型/主办/场馆一行放不下：两行截断，完整信息详情页有 */
  .ev-sub{font-size:11px;margin-top:3px;
    display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
  .ev-tags{gap:4px;margin-top:6px}
  /* 双列卡宽度只有 ~165px，分类标签一折就是两三行，是卡片超高的主因：
     移动端只保留时间标签，城市/类型信息已在 .ev-sub 里，免费/收费看详情页 */
  .ev-tags .tag{display:none}
  .ev-time{margin-left:0;flex:0 0 100%;width:fit-content;margin-top:0}
  /* 极端长标题限 3 行，防止个别卡片把整行撑高 */
  .ev-name{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
  /* 双列卡里放不下的长内容：详情页完整保留 */
  .ev-desc,.ev-note{display:none}
}
/* .ev-top 原来承担「标题左 + 时间右」的分布；时间标签已移入标签行，
   现在只剩标题一个子元素，保留容器是为了 DOM 结构稳定。 */
.ev-top{min-width:0}
.ev-name{font-size:14px;font-weight:600;color:#0B132B;line-height:1.5;min-width:0}
/* ── 时间标签 ────────────────────────────────────────────────────────
   原来是卡片底部单独一行、右对齐（display:table + margin-left:auto），
   吃掉约 45px 竖向空间。现在并进标签行，成为紧随分类标签的第 3 个标签。

   这里是两套排布：
   · 桌面端（.ev-tags 的 @media 之外）：标签行宽度充裕，时间只占一个标签位，
     flex:1 1 100% 会把「剩余空间」全分给它，于是又变成一条通栏长条
     （第一版就是这个毛病）。改成 flex:0 0 auto + margin-left:auto 顶到行尾，
     宽度收缩到文字大小。
   · 移动端（@media 内）：`.ev-tags` 是横向滚动行，时间用 margin-left:auto
     会被一起滚走，所以改为普通文档流中另起一行（flex-basis:100% 配合
     width:fit-content 才会收缩到文字宽度，否则整行拉满）。
   ─────────────────────────────────────────────────────────────── */
.ev-time{flex:0 0 auto;margin-left:auto;font-size:11px;font-weight:600;color:var(--blue-d);background:var(--blue-bg);border:1px solid #C9DDFB;border-radius:6px;padding:2px 7px;white-space:nowrap}
.ev-time.allday{color:var(--tx2);background:#F4F7FC;border-color:var(--line)}
.ev-sub{font-size:12px;color:var(--tx2);margin-top:5px}
.ev-tags{display:flex;flex-wrap:wrap;gap:5px;margin-top:8px;align-items:center}
.ev-tags .tag{font-size:11px;padding:2px 7px}
.ev-note{font-size:12px;color:var(--amber);margin-top:7px}
.ev-desc{font-size:12.5px;color:var(--tx2);margin-top:8px;line-height:1.7}
.empty{
  font-size:13px;color:var(--tx3);padding:30px 0;text-align:center;
  background:var(--card);border:1px dashed var(--line-strong);border-radius:12px;
}

/* ============ 折叠区（通用）============
   .fold 是外壳，.fold-head 是那一条可点的标题栏，.fold-body 是内容。
   默认收起，靠 .open 类展开；DOM 里给 body 挂 .hide 实现收起。
   往期活动、近期重点活动、AI 孵化器三处共用这一套。 */
.fold{margin-top:22px}
.fold.solo{margin-top:16px}
.fold-head{
  display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  background:var(--card);border:1px solid var(--line);border-radius:12px;
  padding:13px 17px;cursor:pointer;user-select:none;
  transition:border-color .16s,box-shadow .16s;
}
.fold-head:hover{border-color:var(--line-strong);box-shadow:var(--shadow)}
.fold-head:focus-visible{outline:2px solid var(--blue);outline-offset:2px}
.fold-title{font-size:13.5px;font-weight:600;color:var(--tx)}
.fold-hint{font-size:12px;color:var(--tx3)}
.fold-arrow{
  margin-left:auto;font-size:12px;color:var(--tx3);
  transition:transform .18s ease;
}
.fold.open .fold-arrow{transform:rotate(180deg)}
.fold-body{margin-top:12px}
.fold-body.hide{display:none}

/* 往期活动专属：整体压暗，视觉上退到后面 */
.past-fold .fold-body .tl-d,.past-fold .fold-body .tl-count{color:var(--tx3)}
.past-fold .fold-body .ev{opacity:.82}
.past-fold .fold-body .ev:hover{opacity:1}
/* 近期重点活动专属 */
.feat-fold .fold-body .feat{margin-bottom:12px}
/* 孵化器专属 */
.wl-fold .fold-body{margin-top:12px}
.wl-fold .fold-body .wl-grid{margin-top:0}

/* ============ 详情页 ============ */
.detail{padding:30px 0 0}
.d-card{
  background:var(--card);border:1px solid var(--line);border-radius:var(--radius);
  box-shadow:var(--shadow);overflow:hidden;
}
.d-card::before{content:"";display:block;height:5px;background:linear-gradient(90deg,var(--blue-d),var(--blue) 45%,var(--cyan))}
.d-body{padding:26px 30px 30px}
@media(max-width:640px){.d-body{padding:20px 18px 24px}}
.d-badges{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin-bottom:14px}
/* 详情页头部：只留徽标 + 标题。
   缩略海报已去掉（海报改由正文「活动海报」区块整幅展示，缩略图重复且占首屏），
   所以这里不再需要左右分栏，标题直接顶到卡片顶部，首屏信息密度更高。 */
.d-hero{display:block}
.d-badge{
  font-size:12px;font-weight:600;color:#fff;
  background:linear-gradient(135deg,var(--blue-d),var(--blue));
  padding:5px 12px;border-radius:8px;box-shadow:0 4px 12px rgba(37,99,235,.26);
}
.d-badge.cyan{background:linear-gradient(135deg,#0891B2,var(--cyan));box-shadow:0 4px 12px rgba(0,229,255,.28)}
/* 标题用深蓝，比近黑的 #0B132B 更有品牌感，也与站内主色呼应。

   历史包袱说明：这里曾经需要显式推平全局 h1 的「渐变文字」，否则文字会被
   background-clip:text + text-fill-color:transparent 弄成透明。
   那个全局 h1 规则已收窄为页头专用的 .site-name，雷已拆除，
   所以下面不再需要 !important 兜底，保持普通声明即可。
   若将来又出现「标题只剩半截/颜色不对」，先查有没有新的标签级文字渐变规则。 */
.d-title{font-size:26px;font-weight:800;line-height:1.36;color:#0B2A6B;letter-spacing:-.3px}
@media(max-width:640px){
  .d-hero .d-badges{margin-bottom:10px;gap:6px}
  .d-hero .d-badge{font-size:11px;padding:4px 9px}
  .d-title{font-size:20px;line-height:1.34}
}
.d-rawname{font-size:12px;color:var(--tx3);margin-top:8px;line-height:1.7}
.d-lead{font-size:14px;color:var(--tx2);line-height:1.85;margin-top:16px}
@media(max-width:640px){.d-lead{font-size:13.5px;line-height:1.8;margin-top:12px}}
/* 活动信息：桌面自适应多列；移动端固定两列，长内容跨列占满整行。
   注意基础样式必须写在 @media 之前 —— 同优先级下后写的会覆盖媒体查询里的规则。 */
.d-grid{
  display:grid;grid-template-columns:repeat(auto-fit,minmax(215px,1fr));
  gap:1px;background:var(--line);border:1px solid var(--line);
  border-radius:12px;overflow:hidden;margin-top:22px;
}
.d-item{background:var(--card);padding:13px 16px}
.d-k{font-size:11px;color:var(--tx3);letter-spacing:.8px;margin-bottom:3px}
.d-v{font-size:13.5px;color:#0B132B;font-weight:500;line-height:1.6;word-break:break-word}
/* 网格末尾的报名格位。字段项数偏奇数，末尾天然空一格，报名按钮正好补满。
   用 flex 纵向排布让按钮吃掉剩余高度，和相邻格位等高；
   按钮铺满整格宽度，在手机上是个够大的点击目标。 */
.d-item.d-item-reg{display:flex;flex-direction:column;justify-content:center}
.d-grid-reg{
  display:flex;width:100%;justify-content:center;
  font-size:13px;padding:9px 14px;margin-top:2px;
}
@media(max-width:640px){
  .d-grid{grid-template-columns:1fr 1fr;margin-top:18px;border-radius:10px}
  .d-item{padding:11px 13px}
  .d-item.span2{grid-column:1 / -1}
  .d-k{font-size:10.5px;letter-spacing:.6px;margin-bottom:2px}
  .d-v{font-size:13px;line-height:1.55}
  .d-grid-reg{font-size:12.5px;padding:8px 10px}
}
.d-sec{margin-top:26px}
@media(max-width:640px){.d-sec{margin-top:22px}}
.d-sec h3{
  font-size:14px;font-weight:700;color:#0B132B;margin-bottom:10px;
  display:flex;align-items:center;gap:8px;
}
.d-sec h3::before{content:"";width:3px;height:14px;border-radius:2px;background:linear-gradient(180deg,var(--blue),var(--cyan))}
.d-p{font-size:13.5px;color:var(--tx2);line-height:1.95;margin:0}
.d-ul{list-style:none;margin:0;padding:0}
.d-ul li{
  font-size:13.5px;color:var(--tx2);line-height:1.9;
  padding-left:15px;position:relative;margin-bottom:6px;
}
.d-ul li:last-child{margin-bottom:0}
.d-ul li::before{
  content:"";position:absolute;left:2px;top:.72em;
  width:5px;height:5px;border-radius:50%;background:var(--cyan);
}
.d-fit{
  font-size:13.5px;line-height:1.85;color:#0E6B8A;
  background:#ECFBFF;border-left:3px solid var(--cyan);border-radius:10px;padding:13px 16px;
}
.d-warn{
  font-size:12.5px;line-height:1.8;color:var(--amber);
  background:var(--amber-bg);border-left:3px solid #F0C36D;border-radius:10px;padding:11px 15px;margin-top:12px;
}
/* ---- 全宽长海报：整幅不裁切，原图多长就多长 ----
   与顶部 132×176 小图分工不同：小图管「认出是哪场」，这里管「看清海报写了什么」。
   没有 poster 字段时整个区块不渲染。 */
.d-poster-full .poster-figure{
  margin:0;background:#F1F5F9;border:1px solid var(--line);
  border-radius:12px;overflow:hidden;
}
.d-poster-full img{width:100%;height:auto;display:block}
.poster-src-line{
  font-size:11px;color:var(--tx3);text-align:center;
  padding:8px 10px;background:var(--card);border-top:1px solid var(--line);
}
.poster-figure.zoomable{cursor:zoom-in}
/* 海报放大层：整屏黑底，图片按高度撑满，超出部分可滚动查看 */
.zoom-layer{
  position:fixed;inset:0;z-index:200;display:none;
  background:rgba(6,11,26,.94);overflow:auto;
  padding:52px 14px 24px;-webkit-overflow-scrolling:touch;
}
.zoom-layer.on{display:block}
.zoom-layer img{
  display:block;width:auto;max-width:100%;height:auto;
  margin:0 auto;border-radius:8px;background:#fff;
}
.zoom-close{
  position:fixed;top:12px;right:14px;z-index:201;
  width:38px;height:38px;border-radius:50%;border:none;cursor:pointer;
  background:rgba(255,255,255,.14);color:#fff;font-size:22px;line-height:1;
  display:flex;align-items:center;justify-content:center;
}
.zoom-close:hover{background:rgba(255,255,255,.26)}
@media(max-width:640px){
  .zoom-layer{padding:54px 10px 20px}
}
/* ---- 活动流程：左时间右内容的时间轴 ---- */
.agenda{list-style:none;margin:0;padding:0;position:relative}
.ag-item{
  display:flex;gap:14px;align-items:baseline;
  padding:9px 0 9px 14px;border-left:2px solid var(--line-strong);position:relative;
}
.ag-item:last-child{border-left-color:transparent}
.ag-item::before{
  content:"";position:absolute;left:-5px;top:14px;
  width:8px;height:8px;border-radius:50%;
  background:var(--card);border:2px solid var(--blue);
}
.ag-item:first-child::before{background:var(--cyan);border-color:var(--cyan)}
.ag-t{
  flex:0 0 92px;font-size:12.5px;font-weight:600;color:var(--blue-d);
  font-variant-numeric:tabular-nums;line-height:1.7;
}
.ag-x{flex:1;min-width:0;font-size:13.5px;color:var(--tx2);line-height:1.75}
@media(max-width:640px){
  .ag-item{gap:10px;padding:8px 0 8px 12px}
  .ag-t{flex:0 0 68px;font-size:12px;letter-spacing:-.2px}
  .ag-x{font-size:13px;line-height:1.7}
}
/* ---- 嘉宾：头像占位 + 名字 + 头衔 ---- */
.speakers{list-style:none;margin:0;padding:0;
  display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:10px}
.sp-item{
  display:flex;align-items:center;gap:10px;
  background:var(--card);border:1px solid var(--line);
  border-radius:10px;padding:10px 13px;
}
.sp-av{
  flex:0 0 32px;width:32px;height:32px;border-radius:50%;
  display:flex;align-items:center;justify-content:center;
  font-size:13px;font-weight:700;color:#fff;
  background:linear-gradient(135deg,var(--blue-d),var(--blue));
}
.sp-txt{min-width:0;line-height:1.5}
.sp-txt b{display:block;font-size:13.5px;color:#0B132B;font-weight:600}
.sp-txt em{display:block;font-size:11.5px;color:var(--tx3);font-style:normal;margin-top:1px}
@media(max-width:640px){
  .speakers{grid-template-columns:1fr}
  .sp-item{padding:9px 12px}
}
/* ---- 报名方式 ----
   用 grid 而不是 flex：figure 元素自带浏览器默认 margin，flex 下容易算错分配宽度，
   grid 的 1fr 列不受 margin 影响，宽度分配更可控。
   左：报名说明 + 按钮；右：二维码位。
   二维码常比报名页晚出，所以无图时出等尺寸占位骨架，补图不会引起布局位移。 */
.d-signup .signup{
  display:grid;grid-template-columns:1fr auto;gap:20px;align-items:center;
  background:linear-gradient(135deg,#F7FAFF,#EEF4FF);
  border:1px solid var(--line);border-radius:12px;padding:18px 20px;
}
.signup-main{min-width:0}
.signup-hd{display:flex;align-items:center;gap:9px;flex-wrap:wrap}
.signup-tag{
  font-size:11.5px;font-weight:600;color:#0E6B8A;
  background:#DDF6FF;border-radius:6px;padding:4px 10px;flex:0 0 auto;
}
.signup-tag.is-closed{color:var(--tx3);background:#EEF1F6}
.signup-note{font-size:12.5px;color:var(--tx2);line-height:1.75;flex:1 1 100%;margin-top:2px}
.signup-actions{margin-top:13px}
.signup-btn{font-size:13.5px;padding:10px 22px}
.signup-btn.is-disabled{
  color:var(--tx3);background:#F1F3F7;border-color:var(--line);
  cursor:not-allowed;box-shadow:none;
}
.signup-btn.is-disabled:hover{color:var(--tx3);border-color:var(--line);box-shadow:none}
.signup-qr{
  width:116px;height:116px;margin:0;padding:0;border-radius:10px;
  overflow:hidden;position:relative;background:#fff;border:1px solid var(--line);
  display:flex;align-items:center;justify-content:center;flex-direction:column;
}
.signup-qr img{width:100%;height:100%;object-fit:contain;display:block;padding:5px;box-sizing:border-box}
.signup-qr.is-empty{border-style:dashed;background:#FBFCFE}
.signup-qr-ph{
  font-size:11px;color:var(--tx3);line-height:1.5;text-align:center;user-select:none;
}
.signup-qr figcaption{
  position:absolute;left:0;right:0;bottom:0;
  font-size:9.5px;color:var(--tx3);text-align:center;
  background:rgba(255,255,255,.92);padding:3px 0;
}
.signup-qr.is-empty figcaption{position:static;background:none;padding:0;margin-top:6px}
.signup-legal{font-size:11.5px;color:var(--tx3);line-height:1.7;margin-top:10px}
@media(max-width:640px){
  /* 移动端二维码放右上、说明与按钮占左侧，整体更省竖向空间 */
  .d-signup .signup{gap:14px;padding:15px 16px;align-items:flex-start;
    grid-template-columns:1fr 92px}
  .signup-qr{width:92px;height:92px}
  .signup-note{font-size:12px}
  .signup-actions{margin-top:12px}
}
.d-actions{display:flex;gap:10px;flex-wrap:wrap;margin-top:26px;padding-top:20px;border-top:1px solid var(--line)}
.btn{
  font-size:13px;font-family:inherit;cursor:pointer;
  padding:9px 18px;border-radius:9px;border:1px solid var(--line-strong);
  background:var(--card);color:var(--tx2);text-decoration:none;
  transition:all .16s;display:inline-flex;align-items:center;gap:6px;
}
.btn:hover{border-color:var(--blue-l);color:var(--blue-d);box-shadow:0 2px 10px rgba(37,99,235,.14);text-decoration:none}
.btn.primary{background:linear-gradient(135deg,var(--blue-d),var(--blue));color:#fff;border-color:transparent;box-shadow:0 4px 14px rgba(37,99,235,.28)}
.btn.primary:hover{color:#fff;box-shadow:0 6px 18px rgba(37,99,235,.36)}
/* 底部「去官网报名」：行动项，用青色实心与「复制活动链接」的蓝区分开，
   读者不用在同一排里找哪个才是报名。 */
.btn.goto-reg{
  background:linear-gradient(135deg,#0891B2,var(--cyan));
  color:#fff;border-color:transparent;box-shadow:0 4px 14px rgba(0,229,255,.3);
}
.btn.goto-reg:hover{color:#fff;box-shadow:0 6px 18px rgba(0,229,255,.4)}

/* ============ 机构页 ============ */
.org-hero{
  background:var(--card);border:1px solid var(--line);border-radius:var(--radius);
  box-shadow:var(--shadow);padding:24px 28px;position:relative;overflow:hidden;
}
.org-hero::before{content:"";position:absolute;left:0;top:0;bottom:0;width:4px;background:linear-gradient(180deg,var(--blue-d),var(--cyan))}
.org-hero::after{content:"";position:absolute;right:-50px;top:-50px;width:180px;height:180px;border-radius:50%;background:radial-gradient(circle,rgba(37,99,235,.08),transparent 70%)}
.org-name{font-size:21px;font-weight:700;color:#0B132B;line-height:1.4;position:relative;z-index:1}
.org-slug{font-size:12px;color:var(--tx3);margin-top:6px;position:relative;z-index:1}
.org-stats{display:flex;gap:26px;flex-wrap:wrap;margin-top:18px;position:relative;z-index:1}
.org-stat{padding-left:14px;position:relative}
.org-stat::before{content:"";position:absolute;left:0;top:3px;bottom:3px;width:2px;border-radius:2px;background:linear-gradient(180deg,var(--blue),var(--cyan))}
.org-stat-num{font-size:20px;font-weight:700;color:#0B132B;line-height:1.2}
.org-stat-lab{font-size:11px;color:var(--tx3);letter-spacing:.8px}

/* ============ 机构总览 ============ */
.org-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:10px}
.org-card{
  background:var(--card);border:1px solid var(--line);border-radius:12px;padding:15px 17px;
  box-shadow:var(--shadow);position:relative;overflow:hidden;
  transition:transform .18s ease,box-shadow .18s ease;display:block;color:inherit;text-decoration:none;
}
.org-card::before{content:"";position:absolute;left:0;right:0;top:0;height:3px;background:linear-gradient(90deg,var(--blue),var(--cyan));opacity:.85}
.org-card:hover{transform:translateY(-2px);box-shadow:var(--shadow-h);text-decoration:none}
.org-card-n{font-size:13.5px;font-weight:700;color:#0B132B;line-height:1.45}
.org-card-m{font-size:12px;color:var(--tx2);margin-top:5px}

/* ============ CONTESTS / INCUBATORS ============ */
/* 注意：赛事卡（.contest / .contest-name / .contest-body）的样式
   统一写在文件末尾的「赛事卡片」区块，这里不再重复定义。
   历史上这里曾有一套旧的 .contest-name 深蓝渐变标题条，
   与新版左图右文布局冲突（旧规则把标题渲染成深色条、撑高卡片），已删除。
   下面的 .wl-* 是孵化器驻点卡，仍在使用。 */
#contests{display:grid;gap:12px}
.nodes{display:flex;flex-wrap:wrap;gap:8px}
.node{font-size:12px;color:var(--blue-d);background:var(--blue-bg);border:1px solid #C9DDFB;border-radius:8px;padding:5px 11px}
.contest-note{font-size:12px;color:var(--tx2);margin-top:10px}
.wl-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(255px,1fr));gap:10px}
.wl{
  position:relative;overflow:hidden;background:var(--card);border:1px solid var(--line);border-radius:12px;
  padding:15px 17px;box-shadow:var(--shadow);transition:transform .18s ease,box-shadow .18s ease;
}
.wl::before{content:"";position:absolute;left:0;right:0;top:0;height:3px;background:linear-gradient(90deg,var(--blue),var(--cyan));opacity:.85}
.wl:hover{transform:translateY(-2px);box-shadow:var(--shadow-h)}
.wl-city{font-size:11px;color:var(--blue-d);letter-spacing:1.2px;margin-bottom:5px;font-weight:600}
.wl-name{font-size:13px;font-weight:700;margin-bottom:3px;color:#0B132B}
.wl-focus{font-size:12px;color:var(--tx2)}
.wl-status{display:inline-block;font-size:11px;padding:2px 9px;border-radius:6px;margin-top:9px}
.st-open{background:var(--green-bg);color:var(--green)}
.st-book{background:var(--amber-bg);color:var(--amber)}
.st-limited{background:var(--blue-bg);color:var(--blue-d)}
/* 移动端孵化器卡双列，与其他板块的密度保持一致 */
@media(max-width:640px){
  .wl-grid{grid-template-columns:1fr 1fr;gap:9px}
  .wl{padding:11px 12px}
  .wl-name{font-size:12px}
  .wl-focus{font-size:11px}
  .wl-status{font-size:10.5px;margin-top:7px}
}

/* ============ CONTACT / LEGAL / FOOTER ============ */
/* 这里原有 .legal（页尾「投稿 · 协作 · 纠错 · 信息来源与权利声明」浅底框）。
   该区块已按需求从页面隐藏，样式一并清掉。
   注意：只是「不在页面出现」，不是删除能力 —— build.py 的 contact_legal_block()
   与 data/events.json 的 legal / contact 数据都原地保留。若日后要恢复，
   把 {contactlegal} 占位加回首页模板，并恢复下面这段规则即可：
     .legal{background:#F8FAFF;border:1px solid var(--line);
            border-left:3px solid var(--blue);border-radius:var(--radius);
            padding:18px 24px;font-size:12px;color:var(--tx2);line-height:1.95}
     .legal b{color:#0B132B;font-weight:600} */
footer{
  position:relative;overflow:hidden;margin-top:40px;color:#8FB6E8;
  background:linear-gradient(180deg,#0B132B,#122A54);
  padding:26px 0 34px;font-size:12px;line-height:1.85;
}
footer::before{
  content:"";position:absolute;inset:0;pointer-events:none;opacity:.22;
  background-image:linear-gradient(rgba(140,190,255,.16) 1px,transparent 1px),
                   linear-gradient(90deg,rgba(140,190,255,.16) 1px,transparent 1px);
  background-size:52px 52px;
}
footer .wrap{position:relative;z-index:1}
footer a{color:#CFE3FF}
.foot-brand{font-size:13px;color:#fff;font-weight:600}
.foot-nav{display:flex;gap:14px;flex-wrap:wrap;margin-top:10px}
.foot-nav a{
  color:#CFE3FF;text-decoration:none;font-size:12px;
  border-bottom:1px solid transparent;transition:border-color .16s,color .16s;
}
.foot-nav a:hover{color:#fff;border-bottom-color:rgba(207,227,255,.6)}

/* ============ TOAST ============ */
#toast{
  position:fixed;left:50%;bottom:34px;transform:translateX(-50%) translateY(14px);
  background:rgba(11,19,43,.95);color:#fff;font-size:13px;line-height:1.5;max-width:86vw;
  padding:11px 20px;border-radius:10px;opacity:0;pointer-events:none;z-index:99;
  border:1px solid rgba(0,229,255,.38);box-shadow:0 12px 30px rgba(11,19,43,.38);
  transition:opacity .2s ease,transform .2s ease;text-align:center;
}
#toast.on{opacity:1;transform:translateX(-50%) translateY(0)}
.hide{display:none!important}

/* ============ 赛事库（原「AI 赛事节点」升级版）============ */
.contest-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(330px,1fr));gap:14px}
/* 赛事卡片：顶部横幅海报 + 下方内容（示意图版式）。
   横幅承担「一眼认出是哪一场」，下方依次是标题/日期/主办方/标签、
   精简信息行，底部是报名与详情按钮。 */
.contest{
  background:var(--card);border:1px solid var(--line);border-left:3px solid var(--line-strong);
  border-radius:var(--radius);box-shadow:var(--shadow);overflow:hidden;
  transition:transform .18s ease,box-shadow .18s ease;
  display:flex;flex-direction:column;
}
.contest:hover{transform:translateY(-2px);box-shadow:var(--shadow-h)}
.contest[data-state="soon"]{border-left-color:#EF9F27}
.contest[data-state="open"]{border-left-color:var(--teal)}
.contest[data-state="running"]{border-left-color:var(--blue-l)}
.contest[data-state="past"]{border-left-color:var(--line-strong);opacity:.82}
.contest[data-state="ended"]{border-left-color:var(--line);opacity:.62}

/* ---- 顶部横幅海报位 ----
   示意图版式：横屏大图通栏在卡片顶部，宽 100%、固定高 158px，
   object-fit:cover 裁切；没有图的赛事出同尺寸品牌横幅占位块，
   补图后不会引起布局位移。
   （历史坑：旧版是左封面右内容的左右布局，配 align-items:stretch 时
   封面被右栏拉成 116×700 长条；改为上下布局后不复存在。） */
.ct-poster{
  flex:0 0 auto;width:100%;height:158px;margin:0;position:relative;
  background:#0B132B;overflow:hidden;
}
.ct-poster img{width:100%;height:100%;object-fit:cover;display:block}
/* 占位块走品牌主视觉的语言：深蓝底 + 青色描边 + 站名，
   零图状态下版面依然是完整设计，不像坏掉了。
   四档色调按 id 轮换，避免整列同色难以区分。 */
.ct-poster-ph{
  position:absolute;inset:0;display:flex;flex-direction:column;
  align-items:center;justify-content:center;gap:3px;text-align:center;
}
.ct-poster-ph b{
  font-size:30px;font-weight:800;line-height:1;color:#fff;
  text-shadow:0 2px 10px rgba(0,229,255,.45);
}
.ct-poster-ph i{
  font-size:9px;font-style:normal;letter-spacing:1px;
  color:#8FD8F5;opacity:.9;
}
.ct-poster-ph.tone1{background:linear-gradient(150deg,#0B132B,#123A73 60%,#155FA0)}
.ct-poster-ph.tone2{background:linear-gradient(150deg,#0B132B,#0B4F55 60%,#0A7A82)}
.ct-poster-ph.tone3{background:linear-gradient(150deg,#141033,#2A1F63 60%,#3B2E8A)}
.ct-poster-ph.tone4{background:linear-gradient(150deg,#0B132B,#12304F 60%,#0E5A78)}

/* ---- 右内容 ---- */
.contest-body{padding:12px 14px 13px;display:flex;flex-direction:column;gap:7px;flex:1;min-width:0}
.contest-name{
  font-size:14px;font-weight:700;color:#0B132B;line-height:1.42;
  display:flex;align-items:flex-start;gap:7px;flex-wrap:wrap;
}
.ct-title{flex:1 1 100%;min-width:0;order:-1;margin-bottom:3px}
.ct-badge{
  font-size:10.5px;padding:2px 8px;border-radius:20px;font-weight:600;white-space:nowrap;
  background:#EEF1F6;color:var(--tx2);border:1px solid var(--line);
}
.ct-badge.soon{background:#FEF3C7;color:#8A5A08;border-color:#F5D48A}
.ct-badge.open{background:#D6F5EC;color:#0B6B54;border-color:#93E0CB}
.ct-badge.running{background:#E4EDFB;color:#1B4E9B;border-color:#B7CFF3}
.ct-badge.past{background:#EDF1F7;color:#6B7A90;border-color:#D3DCE9}
.ct-badge.ended{background:#EDF1F7;color:#6B7A90;border-color:#D3DCE9}
.ct-days{
  font-size:10.5px;padding:2px 8px;border-radius:20px;font-weight:700;white-space:nowrap;
  background:#FEF3C7;color:#8A5A08;border:1px solid #F5D48A;
}
/* 地点/类型元信息行 */
.ct-meta{display:flex;gap:7px;flex-wrap:wrap;font-size:12px;color:var(--tx3)}
.ct-org{font-size:12px;color:var(--tx2);line-height:1.5}
.ct-meta span{position:relative}
.ct-meta span+span::before{content:"·";margin-right:7px;color:var(--line-strong)}
/* 日期行：报名截止是判断「还能不能报」的第一依据，给它最重的视觉 */
.ct-date{
  font-size:12.5px;color:#0B132B;font-weight:600;
  display:flex;gap:6px;align-items:baseline;flex-wrap:wrap;
}
.ct-date span{
  font-size:11px;font-weight:500;color:var(--tx3);
  background:var(--bg);border-radius:5px;padding:1px 7px;flex:0 0 auto;
}
/* 标签行限高一行。赛道标签 + 形式标签加起来能到 4 个，
   在窄卡片里会折成三行、白占 80px。overflow:hidden 直接裁掉溢出部分 ——
   标签是辅助识别的，看得到前几个就够了。 */
.ct-chips{display:flex;flex-wrap:wrap;gap:6px;max-height:26px;overflow:hidden}
.ct-chip{font-size:11px;padding:2px 8px;border-radius:6px;background:var(--blue-bg);color:var(--blue-d)}
.ct-chip.tag2{background:var(--bg);color:var(--tx2);border:1px solid var(--line)}
.ct-rows{display:grid;gap:7px}
.ct-row{display:flex;gap:9px;font-size:12.5px;line-height:1.65}
.ct-k{flex:0 0 62px;color:var(--tx3);font-size:11.5px;padding-top:1px}
/* 字段值截断两行。数据里的「面向人群」「内容」这类字段常是整段话，
   最长的一条能单独把行撑到 300px —— 一张卡片的高度不该由一个字段决定。
   截断后各卡片高度收敛，列表节奏才稳；完整内容详情页有。 */
.ct-v{
  flex:1;min-width:0;color:var(--tx2);word-break:break-word;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
}
/* 操作按钮排在一条线上，不换行 —— 换行会让卡片底部多出一整行，
   而「前往报名」一旦被挤到第二行就失去了「顺手点」的意义。 */
.ct-actions{display:flex;flex-wrap:nowrap;gap:8px;margin-top:auto;padding-top:6px}
.ct-actions .btn{padding:6px 13px;font-size:12.5px;white-space:nowrap;flex:0 0 auto}
.ct-closed{font-size:12px;color:var(--tx3);padding:6px 0}
/* 来源说明条。内容由数据里的 note 字段生成，长短不一：
   短的一句话，长的能写满四五行。这里限制三行截断 ——
   它的作用是「提醒别把日期当权威」，不是正文，不该抢走卡片一半高度。
   完整说明读者可以在详情页看到。

   截断处加了底部渐隐（::after 盖一层从透明到卡片底的渐变），
   否则文字在第三行中间被硬切，看着像渲染错位而不是「还有更多」。 */
.ct-warn{
  position:relative;
  font-size:11px;color:var(--amber);background:var(--amber-bg);
  border-radius:7px;padding:7px 9px;line-height:1.55;
  display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;
}
.ct-warn::after{
  content:"";position:absolute;left:0;right:0;bottom:0;height:16px;
  /* 用 color-mix 从 --amber-bg 派生透明色，避免把 #FFF7E8 写死两份：
     哪天调了 --amber-bg，这里会跟着走，不会留下一道对不上的色带。 */
  background:linear-gradient(to bottom,color-mix(in srgb,var(--amber-bg) 0%,transparent),var(--amber-bg));
  pointer-events:none;
}
.more-row{margin-top:16px}

/* 赛事总览页筛选栏 */
.bar2{display:grid;gap:12px;margin-bottom:18px}
.bar2 input[type=search]{
  width:100%;height:42px;border:1px solid var(--line-strong);border-radius:10px;
  padding:0 15px;font-size:14px;font-family:inherit;background:var(--card);
  color:var(--tx);outline:none;transition:border-color .16s;
}
.bar2 input[type=search]:focus{border-color:var(--blue-l);box-shadow:0 0 0 3px rgba(37,99,235,.12)}
.bar2 .chips{margin-bottom:0}

@media(max-width:760px){
  .contest-grid{grid-template-columns:1fr}
  .ct-k{flex:0 0 56px}
}

/* 移动端赛事卡：双列排布，横幅压矮。详细字段（参赛条件/奖励/内容/主办方…）
   在手机上会撑得很长，这里整块隐藏，想看的进详情页。
   日期行和标签行保留：这两行才是扫视时真正用来做判断的。 */
@media(max-width:640px){
  /* 双列：一屏至少 4 项；横幅收到 82px，标题/元信息字号同步下调 */
  .contest-grid{grid-template-columns:1fr 1fr;gap:9px}
  .ct-poster{height:82px}
  .ct-poster-ph b{font-size:19px}
  .ct-poster-ph i{font-size:8px;letter-spacing:.5px}
  .contest-body{padding:9px 10px 10px;gap:5px}
  .contest-name{font-size:12.5px;line-height:1.4}
  .ct-meta{font-size:10.5px;gap:5px}
  .ct-org{font-size:10.5px}
  .ct-date{font-size:11px}
  .ct-chip{font-size:10px;padding:1px 6px}
  /* 详细字段与免责条照旧整块收起 */
  .ct-rows{display:none}
  .ct-warn{display:none}
  /* 窄卡里「前往报名 + 详情」放不下一行，允许换行并缩小按钮 */
  .ct-actions{flex-wrap:wrap;gap:6px}
  .ct-actions .btn{padding:5px 10px;font-size:11px}
}

@media(max-width:640px){
  .site-name{font-size:21px}
  header{padding-top:32px}
  .stats{gap:18px}
  .stat-num{font-size:19px}
  .skyline{height:70px}
  .wrap{padding:0 16px}
}

/* ============ 报名按钮移动端铺满（放在 .btn 之后才能覆盖它的 inline-flex）============ */
@media(max-width:640px){
  .d-signup .signup-btn{display:flex;width:100%;justify-content:center;padding:11px 18px}
}

/* ============ 过期置灰：前端按访客当天日期实时判断，0 点自动翻新 ============ */
/* .past-fold .fold-body .ev 的旧 opacity 在前面，这里用同级更高优先级覆盖 */
article.ev,article.feat{transition:filter .5s ease,opacity .5s ease}
article.ev.is-past,article.feat.is-past,.past-fold .ev.is-past{filter:grayscale(1);opacity:.45}
article.ev.is-past .ev-name a{color:inherit}
article.ev.is-past:hover,article.feat.is-past:hover{transform:none}
.tl-day.past-day .tl-head{opacity:.55}
/* 滚动定位到最新活动后的短暂高亮描边（outline 不与卡片自身 box-shadow 冲突） */
article.ev.just-landed{animation:gba-land 2.6s ease-out}
@keyframes gba-land{
  0%,45%{outline:3px solid rgba(255,176,66,.75);outline-offset:2px}
  100%{outline:3px solid rgba(255,176,66,0);outline-offset:2px}
}
