/* ══ 全站共享样式 ══════════════════════════════════════════════════
   首页、列表页、文章页共用。抽出来的理由很实际：三份 header 和三份 i18n
   各抄一遍，改一处就会漏两处 —— 而漏了不报错，只是慢慢长得不一样。
*/
:root{
  --plum:#37003c; --plum-2:#2a002e; --plum-3:#4a0a52;
  --orchid:#963cff; --orchid-2:#b276ff;
  --paper:#fff; --paper-2:#f6f4f7;
  /* 灰阶，对白底的对比度都算过（WCAG，正文要 4.5:1）：
       --ink   18.86  标题正文
       --ink-2  9.91  次要正文
       --ink-3  5.66  时间、来源名、副标题这类小字 ← **原来是 #8d8294，只有
                      3.65，全站的时间戳/城市名/页脚说明都不达标**
       --ink-4  2.07  **只能用于装饰**（占位块、禁用态、分隔线），
                      绝不用来写需要读的字
     在浅灰底 #f6f4f7 上（药丸、卡片悬停）ink-2 = 9.07、ink-3 = 5.18，也过线。 */
  --ink:#1c0a20; --ink-2:#4a3f50; --ink-3:#6e6376; --ink-4:#b9b2bd;
  --line:#e9e5eb; --line-2:#f0edf2;
  /* 胜平负。**这三个色块上压白字，所以颜色本身要够深**：
     原来的 #0f9d58 / #d99400 / #d92d20 配白字只有 3.51 / 2.57 / 4.83 ——
     近五场那排 15px 的小方块里，"W" 和 "D" 基本看不清。
     现在 5.41 / 5.31 / 6.52，都过 4.5。 */
  --win:#0b7a44; --draw:#8f6300; --loss:#b81d12;
  /* 样板里的两个关键颜色：青色 chip 和亮紫强调带。之前只有紫，
     所以整站没有"提示色" —— 标签、当前项、强调数字都只能靠紫的深浅，
     结果就是"有型但没有重点"。 */
  --teal:#00e0c6; --teal-ink:#00312c;
  /* 照片上的遮罩。样板每一张人物图都压了这个 —— 没有它，白字压在
     浅色照片上会糊，而且照片和色块之间没有过渡，看着像贴上去的。 */
  --veil-b:linear-gradient(to top,rgba(20,0,24,.94) 0%,rgba(20,0,24,.55) 26%,
           rgba(20,0,24,.08) 58%,transparent 78%);
  --veil-l:linear-gradient(100deg,rgba(55,0,60,.92) 0%,rgba(55,0,60,.6) 30%,
           rgba(55,0,60,.15) 58%,transparent 80%);
  --gut:clamp(16px,3vw,44px);
  --wrap:1460px;
  /* 英文字体照 app 的 Typeface.swift：Plus Jakarta Sans。
     它不含 CJK 字形，所以中文回退思源黑体 —— 这也是 app 界面用英文的原因。 */
  --sans:"Plus Jakarta Sans","Noto Sans SC",-apple-system,BlinkMacSystemFont,
         "PingFang SC",sans-serif;
  /* 动效只用这几档。**时长和曲线各页不许自己再编一套** —— 之前全站有 .14/.15/.16/.18/.2/.22/.25s
     七八种时长、ease 和三四条贝塞尔混着用，同一种「点开」在这页弹、在那页滑，看着就不是一个站。
       --ease-out    绝大多数进场：起步快、落定软（展开、浮层、内容出现）
       --ease-io     来回的位移（加载动画、滑块在两个位置之间走）
       --ease-spring 小元素的「弹一下」（logo 悬停、选中态落定），只许用在 30px 以下的东西上
       --t-fast  颜色、描边这类不占位的变化      --t-base  浮层、按钮、选中态
       --t-slow  展开收起、抽屉、换整块内容 */
  --ease-out:cubic-bezier(.22,.7,.2,1);
  --ease-io:cubic-bezier(.65,0,.35,1);
  --ease-spring:cubic-bezier(.3,1.4,.5,1);
  --t-fast:.14s; --t-base:.22s; --t-slow:.34s; --t-header:.48s;
}
*{box-sizing:border-box}
body{margin:0;background:var(--paper);color:var(--ink);
  font:15px/1.55 var(--sans);-webkit-font-smoothing:antialiased;overflow-x:hidden}
h1,h2,h3,h4{margin:0;font-weight:800;letter-spacing:-.03em}
a{color:inherit;text-decoration:none}
img{display:block;max-width:100%}
button{font:inherit;cursor:pointer;border:0;background:none;color:inherit}
::selection{background:var(--orchid);color:#fff}
/* 所有数字等宽。app 的 Typeface.tabularFigures 就是这个用意：数字一变，
   周围的字不能跟着晃。比分、倒计时、积分每次刷新都在变。 */
.n,.cdcell b,.stbl td,.fxr .tm,.lc-row .rk,.lc-row .vl,.lc-hero .big{
  font-variant-numeric:tabular-nums}
.wrap{max-width:var(--wrap);margin:0 auto;padding:0 var(--gut)}
/* 顶栏是吸顶的，所以跳到锚点时要给它让出高度 ——
   否则该区块的标题正好被顶栏盖住，看起来像"跳错了地方"。 */
:target,section[id]{scroll-margin-top:76px}
/* 占位块：一道光从左往右扫过去。
   原来是整块一明一暗地闪 —— 闪烁读起来像「出错了在重试」，扫光读起来是「在来的路上」。 */
.skl{background:var(--paper-2) linear-gradient(100deg,rgba(255,255,255,0) 38%,
    rgba(255,255,255,.75) 50%,rgba(255,255,255,0) 62%) 100% 0/300% 100% no-repeat;
  animation:mp-shimmer 1.5s linear infinite;border-radius:3px}
.skl-d{background:rgba(255,255,255,.07) linear-gradient(100deg,rgba(255,255,255,0) 38%,
    rgba(255,255,255,.1) 50%,rgba(255,255,255,0) 62%) 100% 0/300% 100% no-repeat;
  animation:mp-shimmer 1.5s linear infinite}
@keyframes mp-shimmer{from{background-position:100% 0}to{background-position:0 0}}
@keyframes pulse{50%{opacity:.5}}

/* ══ 顶栏 ══
   **页顶是透明的，压在每一页的深色刊头上；滚过刊头才变成白底。** 每一页最上面都有一块深色刊头
   （首页大图、赛程、比赛、人物……），标了 `.mp-under` 的那块往上钻到顶栏下面，顶栏在它上面是白字、
   透明底，刊头的颜色和照片一直铺到屏幕最上沿（2026-10-12 用户要求全站这样，播客区和对垒页先这么做的）。
   刊头滚出顶栏以后（site.js 给 <html> 加 `tb-solid`）变回白底深字 —— 半透明白加模糊，正文从底下透过去，
   所以**不画下边线**也分得开（用户指出那条线完全没必要）。当前项还是深紫实心药丸。
   页面要在 <html> 上带 `tb-over` 才会这样（第一帧就要透明，等脚本来加会先闪一下白条）。 */
:root{--tb-h:62px}
@media (max-width:900px){:root{--tb-h:102px}}
@media (max-width:760px){:root{--tb-h:96px}}
.topbar{position:sticky;top:0;z-index:60;background-color:rgba(255,255,255,.88);
  -webkit-backdrop-filter:saturate(1.8) blur(18px);backdrop-filter:saturate(1.8) blur(18px);
  transition:background-color var(--t-slow) var(--ease-out)}
/* 透明时压在照片上的一层暗：白字在亮处（天空、草皮、白球衣）也读得清。只在顶栏这一条高度里，下沿是全透明，没有接缝 */
.topbar::before{content:"";position:absolute;inset:0;pointer-events:none;opacity:0;
  background:linear-gradient(180deg,rgba(10,0,14,.5),rgba(10,0,14,.18) 62%,rgba(10,0,14,0));
  transition:opacity var(--t-slow) var(--ease-out)}
.mp-under{margin-top:calc(-1 * var(--tb-h))}
.tb{position:relative;max-width:var(--wrap);margin:0 auto;padding:0 var(--gut);height:62px;
  display:flex;align-items:center;gap:20px}
.plmark{position:relative;display:flex;align-items:center;flex:none}
/* 两张 logo 叠着（墨线版、白字版），透明 ⇄ 白底时交叉淡入。**不用 CSS invert**：logo 上那道紫带会反成黄绿 */
.plmark img{transition:opacity var(--t-slow) var(--ease-out)}
.plmark img.lg-w{position:absolute;left:0;top:50%;translate:0 -50%;opacity:0}
html.night .plmark img{opacity:0}
html.night .plmark img.lg-w{opacity:1}
/* 带字的完整 logo 一张图。
   **不再是"图形 + HTML 文字"**：那样字体、字距、颜色都得我在 CSS 里重新配一遍,
   配出来是个"像但不是"的 logo。整张用品牌自己的图,比例和字形就都不会走样。
   PNG 而不是 SVG：这套品牌的性格在手绘笔画的糙边上,描成矢量会更"干净"
   但把那个味道抹掉了;2x/3x 位图在视网膜屏上足够清楚。
   **只定高度**,宽度让它自己按比例走。

   40px 是按顶栏量出来的：栏高 62、导航项 34、导航文字 13.5px。
   30px 时字标只有 9px 高（字标占整体的 0.289），比导航文字还小一圈,
   两个火柴人也挤成一团;40px 让字标到 12px,和导航文字同一个量级。 */
.plmark img{height:40px;width:auto;display:block}
/* 手机上必须更小。**带字的 logo 是横向的**（宽约高的 4.7 倍）,
   34px 高就是 160px 宽 —— 加上汉堡 22 和右侧那组控件 180,
   360 就撑破了 390 的视口（实测文档宽 418、出现横滚）。
   26px 高 ≈ 123px 宽,留得下。 */
@media (max-width:700px){.plmark img{height:26px}}
@media (max-width:380px){.plmark img{height:23px}}
.plmark b{font-weight:800;font-size:15px;letter-spacing:-.02em;color:var(--plum)}
.tbnav{display:flex;align-items:center;gap:2px;overflow-x:auto;flex:1;
  scrollbar-width:none}
.tbnav::-webkit-scrollbar{display:none}
.tbnav a{display:flex;align-items:center;height:34px;padding:0 11px;
  border-radius:5px;font-size:13.5px;font-weight:600;color:var(--ink-2);
  white-space:nowrap;transition:background-color var(--t-base) var(--ease-out),color var(--t-fast)}
/* 中等宽度（含英文）一整排导航放不下：项距收一点，比让最后一项被裁成半截、要横着拖强 */
@media (min-width:761px) and (max-width:1360px){
  .tb{gap:14px}
  .tbnav a{padding:0 10px}
}
.tbnav a:hover{background:var(--paper-2);color:var(--plum)}
.tbnav a.on{background:var(--plum);color:#fff}
.tbright{display:flex;align-items:center;gap:8px;flex:none}
.acct-slot{display:flex;align-items:center;justify-content:center;flex:none;width:34px;height:34px}
/* 联赛切换：logo 右边的一排小标签。描边不填色，和右边的语言切换、下面的导航区分开 ——
   导航是「去哪一页」，这个是「看哪个联赛」，不该长得像又一组导航。
   只有公开联赛多于一个时才渲染，所以联赛开放之前这段样式没有任何元素可作用。
   手机上落到顶栏下面单独一行（顶栏已经被 logo、汉堡和右侧控件占满）。 */
.lgsw{display:flex;align-items:center;gap:2px;flex:none;padding-right:14px;
  margin-right:-4px;border-right:1px solid var(--line)}
.lgsw a{position:relative;height:30px;padding:0 6px;display:flex;align-items:center;border-radius:6px;
  font-size:12.5px;font-weight:700;color:var(--ink-3);white-space:nowrap;
  border:1px solid transparent;
  transition:color var(--t-fast),border-color var(--t-base) var(--ease-out),
    background-color var(--t-base) var(--ease-out),padding var(--t-slow) var(--ease-out)}
.lgsw a:hover{color:var(--plum);border-color:var(--line)}
.lgsw a.on{color:var(--plum);border-color:var(--plum);background:var(--paper-2);padding:0 10px 0 7px}
/* logo 保持原尺寸，展开的是联赛名字和旁边的空间。 */
.lgsw a .lglogo{width:18px;height:18px;flex:none}
/* 平时只露 logo，选中的那个才把名字展开 —— 五个名字全摆出来，英文下顶栏放不下导航。
   **展开用 grid 轨道 0fr → 1fr**：宽度跟着名字的真实长度走（Premier League 和 Serie A 差一倍），
   不用写死 max-width 去猜，也就不会出现"展开到一半突然停住"或"多留一截空白"。
   名字自己再晚一拍淡入、从左滑进来，先让出位置再出字，读起来是"打开"而不是"跳出来"。
   名字和 logo 之间的间距是里层 span 的 padding，跟着展开从 0 长到 6px ——
   padding 不会被 0fr 轨道裁掉，一直挂着的话每个收起的联赛都白占 6px。 */
.lgsw .lgname{display:grid;grid-template-columns:0fr;
  transition:grid-template-columns var(--t-header) var(--ease-out)}
.lgsw .lgname>span{overflow:hidden;min-width:0;padding-left:0;opacity:0;translate:-6px 0;
  transition:opacity var(--t-fast),translate var(--t-base) var(--ease-out),padding var(--t-header) var(--ease-out)}
.lgsw a.on .lgname{grid-template-columns:1fr}
.lgsw a.on .lgname>span{opacity:1;translate:0 0;padding-left:6px;
  transition:opacity var(--t-base) var(--ease-out) .1s,translate var(--t-header) var(--ease-out),
    padding var(--t-header) var(--ease-out)}
/* 收起的那几个名字在 title 和读屏标签里；鼠标停上去不等系统提示（要一秒多），直接在下方浮一个小签 */
@media (hover:hover) and (min-width:901px){
  .lgsw a:not(.on)::after{content:attr(aria-label);position:absolute;left:50%;top:calc(100% + 8px);
    padding:4px 9px;border-radius:6px;background:var(--plum);color:#fff;font-size:11.5px;font-weight:650;
    pointer-events:none;opacity:0;translate:-50% -4px;z-index:5;
    transition:opacity var(--t-fast),translate var(--t-base) var(--ease-out)}
  .lgsw a:not(.on):hover::after{opacity:1;translate:-50% 0;transition-delay:.12s}
}
@media (max-width:900px){
  .topbar{position:sticky}
  .lgsw{position:absolute;left:0;right:0;top:62px;padding:6px var(--gut);
    margin:0;border-right:0;overflow-x:auto}
  /* 绝对定位不占位，所以顶栏自己让出这一行的高度（6+28+6）。
     不让的话这一行压在正文最上面 40px 上：比赛页的「返回」和「分享」被它盖住、点不到。
     这一行没有自己的底色和分隔线：它是顶栏的一部分，跟着顶栏透明 / 变白。 */
  .topbar:has(.lgsw){padding-bottom:40px}
}
/* 语言切换：分段控件。白底上用浅灰槽 + 深紫选中块 */
.langsw{display:flex;background:var(--paper-2);border-radius:999px;
  padding:3px;gap:2px}
.langsw button{padding:5px 13px;border-radius:999px;font-size:12px;font-weight:700;
  color:var(--ink-3);transition:.15s}
.langsw button:hover{color:var(--plum)}
.langsw button.on{background:var(--plum);color:#fff}
.tbi{width:34px;height:34px;display:grid;place-items:center;
  color:var(--ink-2);border-radius:50%;transition:.15s}
.tbi:hover{background:var(--paper-2);color:var(--plum)}
.tbi svg{width:17px;height:17px}

/* ── 透明的那一段（压在刊头上）：白字、透明底。颜色都跟着过渡，变白底那一下不是「啪」地一换 ── */
:is(.tbnav a,.lgsw a,.langsw button,.tbi,.tbburger){transition:color var(--t-base) var(--ease-out),
  background-color var(--t-base) var(--ease-out),border-color var(--t-base) var(--ease-out)}
.lgsw a{transition:color var(--t-base) var(--ease-out),background-color var(--t-base) var(--ease-out),
  border-color var(--t-base) var(--ease-out),padding var(--t-header) var(--ease-out)}
html.tb-over:not(.tb-solid) .topbar{background-color:transparent;-webkit-backdrop-filter:none;backdrop-filter:none}
html.tb-over:not(.tb-solid) .topbar::before{opacity:1}
html.tb-over:not(.tb-solid) .plmark img{opacity:0}
html.tb-over:not(.tb-solid) .plmark img.lg-w{opacity:1}
html.tb-over:not(.tb-solid) .tbnav a{color:rgba(255,255,255,.84)}
html.tb-over:not(.tb-solid) .tbnav a:hover{background:rgba(255,255,255,.12);color:#fff}
html.tb-over:not(.tb-solid) .tbnav a.on{background:#fff;color:var(--plum)}
html.tb-over:not(.tb-solid) .lgsw{border-right-color:rgba(255,255,255,.22)}
html.tb-over:not(.tb-solid) .lgsw a{color:rgba(255,255,255,.74)}
html.tb-over:not(.tb-solid) .lgsw a:hover{color:#fff;border-color:rgba(255,255,255,.3)}
html.tb-over:not(.tb-solid) .lgsw a.on{color:#fff;border-color:rgba(255,255,255,.62);background:rgba(255,255,255,.12)}
html.tb-over:not(.tb-solid) .langsw{background:rgba(255,255,255,.14)}
html.tb-over:not(.tb-solid) .langsw button{color:rgba(255,255,255,.72)}
html.tb-over:not(.tb-solid) .langsw button:hover{color:#fff}
html.tb-over:not(.tb-solid) .langsw button.on{background:#fff;color:var(--plum)}
html.tb-over:not(.tb-solid) :is(.tbi,.tbburger){color:rgba(255,255,255,.88)}
html.tb-over:not(.tb-solid) :is(.tbi,.tbburger):hover{background:rgba(255,255,255,.12);color:#fff}
@media (max-width:760px){
  /* 手机上的联赛分段控件：灰槽换成半透明白，选中块照旧是白的 */
  html.tb-over:not(.tb-solid) .lgsw{background:rgba(255,255,255,.14)}
  html.tb-over:not(.tb-solid) .lgsw a.on{color:var(--plum);background:#fff}
}

/* ══ 共享原子 ══ */
.nbadge{background:var(--plum);color:#fff;font-size:10px;font-weight:800;
  padding:3px 8px;border-radius:3px;letter-spacing:.07em;text-transform:uppercase}
/* 正文状态标签。**描边不填色** —— 它旁边就是填色的来源徽标（`.nbadge`），
   两个实心块并排会打起来，而这个标签是次要信息：读者先看的是标题和来源。
   三种状态各一个颜色，但都压得很淡：
     短讯      石墨色 —— 中性的"就这样"，不是警告
     原文未获取 琥珀色 —— 我们这边没做到
     正在补全   青色   —— 在动，等一下就有
   **不要用红色。** 这三种都不是错误，红色会让一条正常的视频短讯看着像坏页面。 */
.bstate{display:inline-flex;align-items:center;font-size:10px;font-weight:700;
  padding:2px 7px;border-radius:3px;letter-spacing:.04em;white-space:nowrap;
  border:1px solid currentColor;line-height:1.5}
.bstate.brief{color:#6b6478}
.bstate.blocked{color:#a2761f}
.bstate.pending{color:#1f7a78}
.btn-plum{display:inline-flex;align-items:center;gap:8px;background:var(--plum);
  color:#fff;padding:11px 20px;font-size:12.5px;font-weight:700;border-radius:3px;
  transition:.15s}
.btn-plum:hover{background:var(--orchid)}
.sec-hd{display:flex;align-items:baseline;gap:14px;margin-bottom:18px}
.sec-hd h2{font-size:clamp(24px,2.6vw,34px)}
.sec-hd span{font-size:12.5px;color:var(--ink-3)}
/* 段落标题右边「完整积分榜 →」这类去整页的入口 */
.sec-hd .sec-more{margin-left:auto;flex:none;font-size:13px;font-weight:700;color:var(--plum);white-space:nowrap}
.sec-hd .sec-more:hover{color:var(--orchid)}
/* 持续事件的小块（首页「正在发生」、球队抽屉、人物页、文章页共用）：一行一件事，发丝线隔开，不做卡片。
   类名用 ev 前缀：`.strow` 是积分榜的行（固定五列），第一版事件行误用了同名类，在球队抽屉里被排成三条窄列。 */
.evrow{position:relative;display:grid;grid-template-columns:minmax(0,1fr);gap:4px;padding:16px 78px 16px 0;border-bottom:1px solid var(--line-2);color:inherit}
.evrow.noav{padding-right:0}
.evrow:last-child{border-bottom:0}
.evrow .evmain{display:flex;flex-wrap:wrap;align-items:center;gap:4px 9px;font-size:15px}
.evrow .evmain b{font-weight:800;font-size:17px;letter-spacing:-.1px}
.evrow .evkind{color:var(--ink-3);font-size:13px}
/* 阶段标签（传闻 / 谈判中 / 基本谈妥…）和正文状态标签 `.bstate` 是同一族：描边不填色、3px 圆角、10px 粗体，
   放在实心的 `.nbadge` 旁边不抢戏。原来是 999px 的药丸，和站里别处的标签是两套形状。 */
.evrow .evst{display:inline-flex;align-items:center;padding:2px 7px;border-radius:3px;white-space:nowrap;
  border:1px solid var(--line);font:700 10px/1.5 var(--sans);letter-spacing:.04em;color:var(--ink-3)}
.evrow .evst.on{border-color:var(--orchid);color:var(--orchid)}
.evrow .evlead{font-size:14.5px;line-height:1.5;color:var(--ink);display:-webkit-box;
  -webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;transition:color var(--t-base) var(--ease-out)}
.evrow .evmeta{display:flex;align-items:center;min-width:0;font-size:12px;color:var(--ink-3);white-space:nowrap}
.evrow .evwhen{flex:none}
.evrow:hover .evlead,.evrow:focus-visible .evlead{color:var(--orchid)}
/* ── 鼠标放上去才有的那一层：头像、进展条、媒体名字。位置都在平时就预留好了（右边 78px、meta 行里的空位），展开时文字不动 ── */
.evrow:focus-visible{outline:2px solid var(--orchid);outline-offset:2px}
.evav{position:absolute;right:6px;top:18px;width:58px;height:58px;pointer-events:none}
.evav>i,.evav>img:not(.evcrest){position:absolute;inset:0;width:100%;height:100%;border-radius:50%}
.evav>i{display:grid;place-items:center;font:800 22px/1 var(--sans);font-style:normal;color:var(--plum);background:var(--paper-2)}
.evav>img:not(.evcrest){object-fit:cover;object-position:50% 18%;background:var(--paper-2);opacity:0;transition:opacity .3s var(--ease-out)}
.evav>img.ok{opacity:1}
.evav>img.gone{display:none}
/* 光圈：一圈兰紫渐变的细环，跟着头像一起出现 */
.evav::before{content:"";position:absolute;inset:-3px;border-radius:50%;padding:2px;
  background:linear-gradient(135deg,var(--orchid),var(--plum));
  -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);-webkit-mask-composite:xor;mask-composite:exclude}
.evav .evcrest{position:absolute;right:-5px;bottom:-4px;width:24px;height:24px;object-fit:contain;padding:3px;border-radius:50%;
  background:#fff;box-shadow:0 0 0 1px var(--line-2),0 2px 6px rgba(40,0,50,.16)}
.evpips{display:inline-flex;gap:3px;margin-left:10px;flex:none}
.evpips i{width:14px;height:4px;border-radius:2px;background:var(--line)}
.evpips i.on{background:var(--orchid)}
/* 右边留 22px 内边距给渐隐用：渐隐只吃这块空白；标签真放不下、溢出到这里时才会被渐隐吃掉 */
.evouts{display:flex;gap:5px;margin-left:10px;padding-right:22px;min-width:0;overflow:hidden;
  -webkit-mask:linear-gradient(90deg,#000 calc(100% - 22px),transparent);mask:linear-gradient(90deg,#000 calc(100% - 22px),transparent)}
.evouts em{flex:none;font-style:normal;font-weight:700;font-size:11px;line-height:1;padding:4px 7px;border-radius:3px;
  border:1px solid var(--line);color:var(--ink-2);background:#fff}
/* 能悬停的设备（鼠标）：平时全藏着，放上去错开一点依次出来 */
@media (hover:hover) and (pointer:fine){
  .evav{opacity:0;transform:translateX(-16px) scale(.86);
    transition:opacity var(--t-slow) var(--ease-out),transform var(--t-slow) var(--ease-out)}
  .evav::before{opacity:0;transform:scale(.82);transition:opacity var(--t-slow) var(--ease-out) .06s,transform var(--t-slow) var(--ease-spring) .06s}
  .evav .evcrest{transform:scale(0);transition:transform .42s var(--ease-spring) .2s}
  .evpips i{transform:scaleX(0);transform-origin:left;opacity:0;
    transition:transform var(--t-base) var(--ease-out) calc(var(--i) * 55ms + .05s),opacity var(--t-base) var(--ease-out) calc(var(--i) * 55ms + .05s)}
  .evouts em{opacity:0;transform:translateX(-8px);
    transition:opacity var(--t-base) var(--ease-out) calc(var(--i) * 70ms + .16s),transform var(--t-base) var(--ease-out) calc(var(--i) * 70ms + .16s)}
  .evrow:hover .evav,.evrow:focus-visible .evav{opacity:1;transform:none}
  .evrow:hover .evav::before,.evrow:focus-visible .evav::before{opacity:1;transform:none}
  .evrow:hover .evav .evcrest,.evrow:focus-visible .evav .evcrest{transform:none}
  .evrow:hover .evpips i,.evrow:focus-visible .evpips i{transform:none;opacity:1}
  .evrow:hover .evouts em,.evrow:focus-visible .evouts em{opacity:1;transform:none}
}
/* 手机 / 触屏：没有悬停，头像常驻（小一号），媒体名字不展开 —— 点进去是时间线，那里有每一家 */
@media (hover:none),(pointer:coarse){
  .evrow{padding-right:66px}
  .evrow.noav{padding-right:0}
  .evav{width:48px;height:48px}
  .evav::before{display:none}
  .evouts{display:none}
}
@media (prefers-reduced-motion:reduce){
  .evav,.evav::before,.evav>img,.evav .evcrest,.evpips i,.evouts em{transition:opacity .01s!important;transform:none!important}
}
/* 文章页「这件事的进展」：每一步一行，本文所在的那一步标出来 */
.evsteps{list-style:none;margin:0;padding:0}
.evsteps li{display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:4px 10px;align-items:baseline;
  padding:8px 0;border-bottom:1px solid var(--line-2);font-size:12.5px}
.evsteps li.here b{color:var(--orchid)}
.evsteps b{font-weight:800}
.evsteps span{color:var(--ink-3)}
.evsteps a{color:inherit;font-weight:650}
.evsteps a:hover{color:var(--orchid)}
.evmore{display:inline-block;margin-top:10px;font-size:12.5px;font-weight:700;color:var(--plum)}
.evmore:hover{color:var(--orchid)}
.pagehead{background:var(--plum-2);padding:30px 0 28px}
.pagehead.mp-under{padding-top:calc(30px + var(--tb-h))}
.pagehead .in{max-width:var(--wrap);margin:0 auto;padding:0 var(--gut);
  display:flex;align-items:center;gap:18px;flex-wrap:wrap}
.pagehead h1{color:#fff;font-size:clamp(26px,3vw,40px);line-height:1.1}
.pagehead .sub{color:rgba(255,255,255,.6);font-size:13px;font-weight:600}
.pagehead img{width:52px;height:52px;object-fit:contain;flex:none}
.pagehead .back{margin-left:auto;color:rgba(255,255,255,.7);font-size:12.5px;
  font-weight:700;border-bottom:1px solid rgba(255,255,255,.3);padding-bottom:2px}
.pagehead .back:hover{color:#fff;border-bottom-color:var(--orchid)}

/* 话题筛选条 */
.chips{display:flex;gap:8px;flex-wrap:wrap;padding:20px 0 24px}
.chips a{padding:7px 15px;border:1px solid var(--line);border-radius:999px;
  font-size:12.5px;font-weight:600;color:var(--ink-2);transition:.15s}
.chips a:hover{border-color:var(--plum);color:var(--plum)}
.chips a.on{background:var(--plum);border-color:var(--plum);color:#fff}

/* 报道卡网格 —— 列表页和首页的"值得一读"共用 */
.storygrid{display:grid;grid-template-columns:repeat(4,1fr);gap:22px}
@media (max-width:1180px){.storygrid{grid-template-columns:repeat(3,1fr)}}
@media (max-width:840px){.storygrid{grid-template-columns:repeat(2,1fr)}}
@media (max-width:560px){.storygrid{grid-template-columns:1fr}}
.storycard{display:block;border-top:1px solid var(--line);padding-top:14px}
.storycard .shot{aspect-ratio:16/10;overflow:hidden;background:var(--paper-2);
  margin-bottom:12px}
.storycard .shot img{width:100%;height:100%;object-fit:cover;transition:transform .5s}
.storycard:hover .shot img{transform:scale(1.04)}
.storycard h4{font-size:15px;line-height:1.36;font-weight:700;margin-bottom:9px;
  display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.storycard:hover h4{color:var(--orchid)}
.storycard .meta{font-size:11.5px;color:var(--ink-3);display:flex;gap:8px;
  align-items:center}
.more-row{display:flex;justify-content:center;padding:34px 0 10px}
.empty{color:var(--ink-3);font-size:13.5px;padding:40px 0;text-align:center}
.source-links{display:grid;gap:10px;margin-top:12px}
.source-links a{font-size:13px;line-height:1.6;color:var(--ink-2);overflow-wrap:anywhere;
  text-decoration:underline;text-decoration-color:var(--line);text-underline-offset:3px}
.source-links a:hover{color:var(--plum);text-decoration-color:currentColor}
.source-links small{display:block;font-size:11px;color:var(--ink-3)}
.source-links.compact{display:flex;flex-wrap:wrap;gap:6px 12px;margin-top:7px}
.source-links.compact a{font-size:11.5px;color:var(--ink-3)}

/* ══ 拼接卡片 ══
   横向的缩略图 + 标题，靠 1px 细线拼成一整块，不留间距。
   列表页和收藏页共用 —— 放在这里而不是各页 <style> 里，
   免得同一套卡片在两个文件里各长一份，改一处忘一处。 */
.tiles{display:grid;grid-template-columns:repeat(3,1fr);gap:0;
  border:1px solid var(--line);border-bottom:0}
@media (max-width:900px){.tiles{grid-template-columns:repeat(2,1fr)}}
@media (max-width:560px){.tiles{grid-template-columns:1fr}}
.tile{display:grid;grid-template-columns:96px minmax(0,1fr);gap:12px;
  padding:13px 14px;border-bottom:1px solid var(--line);
  border-right:1px solid var(--line);transition:background .15s}
.tile:hover{background:var(--paper-2)}
.tiles>.tile:nth-child(3n){border-right:0}
@media (max-width:900px){
  .tiles>.tile:nth-child(3n){border-right:1px solid var(--line)}
  .tiles>.tile:nth-child(2n){border-right:0}
}
@media (max-width:560px){.tiles>.tile{border-right:0}}
.tile .sh{aspect-ratio:1/1;overflow:hidden;background:var(--paper-2)}
.tile .sh img{width:100%;height:100%;object-fit:cover;transition:transform .5s}
.tile:hover .sh img{transform:scale(1.05)}
/* 文字列做成 flex 列,**来源行钉在底部**。
   原来 `.m` 紧跟在标题下面,于是标题一行的卡和标题三行的卡,来源行高度
   各不相同 —— 一排三张并列时那三个来源标签上下错开，看着就是没对齐。
   标题长短是内容决定的,不该决定别的元素在哪。 */
.tile > div:last-child{display:flex;flex-direction:column;min-width:0}
.tile h4{font-size:13.5px;line-height:1.35;font-weight:660;
  display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;
  overflow:hidden}
.tile:hover h4{color:var(--orchid)}
.tile .m{margin-top:auto;padding-top:6px;font-size:10.5px;color:var(--ink-3);
  display:flex;align-items:center;gap:7px;flex-wrap:wrap}

/* ══ 页脚 ══
   **浅灰底、深色字，右上角一道斜向渐变。** 样板是这样的：整页只有英雄区、
   赛程日期条、榜单卡是深色，页脚是浅的。我之前做成深紫，结果页面底部又压了
   一大块重色，和顶部抢。 */
.foot{background:var(--paper-2);color:var(--ink-2);padding:36px 0 22px;
  margin-top:44px;position:relative;overflow:hidden}
/* 右上角的斜向渐变条 —— 样板里那几道蓝紫色的斜切装饰 */
.foot::before{content:"";position:absolute;right:-60px;top:-40px;
  width:340px;height:190px;pointer-events:none;
  background:linear-gradient(115deg,var(--orchid) 0%,var(--teal) 100%);
  opacity:.16;transform:skewX(-22deg)}
.foot::after{content:"";position:absolute;right:-130px;top:-64px;
  width:300px;height:190px;pointer-events:none;
  background:linear-gradient(115deg,var(--plum-3) 0%,var(--orchid) 100%);
  opacity:.14;transform:skewX(-22deg)}
.foot>*{position:relative;z-index:1}
.foot-top{display:grid;grid-template-columns:1.5fr 1fr 1fr 1fr;gap:26px;
  padding-bottom:26px;border-bottom:1px solid var(--line)}
@media (max-width:820px){.foot-top{grid-template-columns:1fr 1fr}}
.fbrand{display:flex;align-items:center;margin-bottom:12px}
.fbrand img{height:38px;width:auto;display:block}
.fbrand b{font-weight:800;font-size:15px;color:var(--plum)}
.fcol h5{color:var(--plum);font-size:12px;font-weight:800;margin:0 0 11px;
  letter-spacing:.02em}
.fcol a{display:block;font-size:12.5px;padding:4px 0;color:var(--ink-2)}
.fcol a:hover{color:var(--plum)}
.fbadges{display:grid;grid-template-columns:repeat(10,1fr);gap:10px;
  padding:22px 0;border-bottom:1px solid var(--line)}
@media (max-width:820px){.fbadges{grid-template-columns:repeat(5,1fr)}}
.fbadges a{display:grid;place-items:center;padding:7px;border-radius:6px;
  transition:.15s}
.fbadges a:hover{background:#fff}
.fbadges img{width:26px;height:26px;object-fit:contain;opacity:.9}
.fbadges a:hover img{opacity:1}
.flegal{display:flex;align-items:center;gap:16px;flex-wrap:wrap;
  padding-top:16px;font-size:11.5px;color:var(--ink-3)}
.flegal .rt{margin-left:auto;display:flex;gap:16px}
.flegal a:hover{color:var(--plum)}

@media (prefers-reduced-motion:reduce){*{transition:none!important;animation:none!important}}
@media (max-width:760px){.tbnav{display:none}}

/* ── 读者账号（顶栏右上角）──
   外框和未登录时那个人形图标一样大（34px）：登录态是异步回来的，回来时图标换成头像，
   尺寸一变左边那排（搜索、语言切换）就会跟着挪一下。 */
.acct{position:relative;width:34px;height:34px;display:grid;place-items:center}
.acct .avatar{width:30px;height:30px;border-radius:50%;border:0;cursor:pointer;
  display:grid;place-items:center;overflow:hidden;padding:0;
  background:var(--orchid);color:#fff;font-size:12.5px;font-weight:700}
.acct .avatar img{width:100%;height:100%;object-fit:cover;display:block}
.acct-menu{position:absolute;right:0;top:calc(100% + 8px);min-width:184px;
  background:#fff;border:1px solid var(--line);border-radius:10px;
  box-shadow:0 12px 32px rgba(20,0,24,.16);padding:6px;z-index:60;
  /* 从头像那个角长出来、收回去。用 visibility 而不是 display:none —— display 切换没有过渡，
     菜单只能「啪」一下出现 */
  opacity:0;visibility:hidden;transform:translateY(-6px) scale(.97);transform-origin:100% 0;
  transition:opacity var(--t-fast) ease,transform var(--t-base) var(--ease-out),
    visibility 0s linear var(--t-base)}
.acct-menu.on{opacity:1;visibility:visible;transform:none;transition-delay:0s}
.acct-who{padding:8px 10px 9px;font-size:12px;color:var(--ink-3);
  border-bottom:1px solid var(--line-2);margin-bottom:4px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.acct-menu a,.acct-menu button{display:block;width:100%;text-align:left;
  padding:8px 10px;font-size:13.5px;font-weight:600;color:var(--ink);
  background:none;border:0;border-radius:6px;cursor:pointer}
.acct-menu a:hover,.acct-menu button:hover{background:var(--paper-2)}

/* 关注按钮（球队抽屉、球队报道页、个人中心）。没关注是线框，关注了是实心 ——
   和收藏按钮同一个意思：实心 = 已经在你的账号上了 */
.followbtn{display:inline-flex;align-items:center;justify-content:center;flex:none;
  height:32px;padding:0 16px;border-radius:999px;border:1px solid var(--line);
  background:#fff;color:var(--ink);font:700 13px var(--sans);cursor:pointer;
  white-space:nowrap;transition:background .15s,border-color .15s,color .15s}
.followbtn:hover{border-color:var(--ink-3)}
.followbtn.on{background:var(--plum);border-color:var(--plum);color:#fff}
.followbtn.on:hover{background:var(--plum-3);border-color:var(--plum-3)}
.followbtn[disabled]{opacity:.6;cursor:default}
.followbtn.dark.on{background:rgba(255,255,255,.14);border-color:rgba(255,255,255,.55);color:#fff}
.followbtn.dark.on:hover{background:rgba(255,255,255,.24);border-color:#fff}
/* ══ 剪藏 ══ 选中字幕 / 正文的一段，旁边浮出来的那一小条（site.js 的 S.clipper）。白纸页是紫色实心胶囊（同全站主按钮），
   夜色页（播客、视频）是青色那颗（同那边的播放键）。底下那条小提示（S.toast）和分享弹窗的「已复制」同一个样子 */
.clipbar{position:fixed;z-index:96;left:0;top:0;display:flex;gap:2px;padding:3px;border-radius:999px;background:var(--plum);
  box-shadow:0 10px 28px rgba(28,10,32,.26);translate:-50% 6px;opacity:0;pointer-events:none;
  transition:opacity var(--t-fast) var(--ease-out),translate var(--t-base) var(--ease-out)}
.clipbar.on{opacity:1;translate:-50% 0;pointer-events:auto}
.clipbar button{display:inline-flex;align-items:center;gap:6px;height:34px;padding:0 14px;border:0;border-radius:999px;
  background:transparent;color:#fff;font:800 13px var(--sans);cursor:pointer;white-space:nowrap}
.clipbar button:hover{background:rgba(255,255,255,.14)}
.clipbar button:focus-visible{outline:2px solid var(--teal);outline-offset:1px}
.clipbar svg{width:15px;height:15px;flex:none}
html.night .clipbar{background:var(--teal);box-shadow:0 12px 30px rgba(0,0,0,.5)}
html.night .clipbar button{color:#002b26}
html.night .clipbar button:hover{background:rgba(0,43,38,.1)}
html.night .clipbar button:focus-visible{outline-color:#fff}
.mp-toast{position:fixed;left:50%;bottom:28px;z-index:96;max-width:min(92vw,520px);padding:11px 18px;border-radius:999px;
  background:var(--ink);color:#fff;font-size:13px;font-weight:700;line-height:1.45;text-align:center;
  translate:-50% 12px;opacity:0;pointer-events:none;transition:opacity var(--t-base) ease,translate var(--t-slow) var(--ease-out)}
.mp-toast.on{opacity:1;translate:-50% 0;pointer-events:auto}
.mp-toast a{color:var(--teal);margin-left:6px;text-decoration:underline;text-underline-offset:2px}
html.night .mp-toast{background:#f5f2f7;color:var(--ink);box-shadow:0 14px 34px rgba(0,0,0,.5)}
html.night .mp-toast a{color:var(--plum)}
html.pod-player-on .mp-toast{bottom:calc(76px + 18px + env(safe-area-inset-bottom))}
@media (max-width:760px){
  .mp-toast{bottom:calc(72px + env(safe-area-inset-bottom))}
  html.pod-player-on .mp-toast{bottom:calc(57px + 64px + 14px + env(safe-area-inset-bottom))}
}

/* 收藏按钮 —— 和文章页底部那排线框按钮同一套语言 */
.btn-line.on{background:var(--plum);color:#fff;border-color:var(--plum)}

/* ══ 样板里的三样东西：色块、遮罩、拼接 ═══════════════════════════
   之前整站缺的就是这三个，所以"有型但没有灵魂"：
   - 大色块：深紫整块压住一段，白底页面才有节奏，而不是一路白到底
   - 遮罩：照片上压渐变，白字才压得住，照片也才和色块连成一体
   - 拼接：卡片之间零间隙，边界靠 1px 分隔线 —— 样板的赛程条就是这么做的
*/
.block-plum{background:var(--plum);color:#fff}
.block-plum h1,.block-plum h2,.block-plum h3,.block-plum h4{color:#fff}
.block-orchid{background:var(--orchid);color:#fff}

/* 青色 chip —— 样板里"CHELSEA · 12 AUG"那种 */
.chip-teal{display:inline-flex;align-items:center;gap:6px;
  background:var(--teal);color:var(--teal-ink);
  padding:4px 9px;border-radius:3px;
  font-size:10.5px;font-weight:800;letter-spacing:.08em;text-transform:uppercase}

/* 压了遮罩的照片框。子元素 img 铺满，文字放 .veil-cap 里 */
.veiled{position:relative;overflow:hidden;background:#1a0a20}
.veiled>img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.veiled::after{content:"";position:absolute;inset:0;background:var(--veil-b)}
.veiled.side::after{background:var(--veil-l),var(--veil-b)}
.veil-cap{position:absolute;left:0;right:0;bottom:0;z-index:3;padding:22px 24px}

/* 零间隙拼接网格 */
.splice{display:grid;gap:0}
.splice>*{border-right:1px solid rgba(255,255,255,.1)}
.splice>*:last-child{border-right:0}

/* 交叉淡入换图 —— 两层叠着，切换时一层淡出一层淡入。
   **不能只改 src** —— 那样会闪一下白，而且大图有加载延迟，
   看起来就是"卡了一下"而不是"换了一张"。 */
.xfade{position:relative;overflow:hidden}
.xfade>img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;
  opacity:0;transition:opacity .42s ease}
.xfade>img.on{opacity:1}

/* 可悬停选中的行（焦点人物、榜单） */
.pickrow{cursor:pointer;transition:background .16s}
.pickrow:hover,.pickrow.on{background:rgba(255,255,255,.1)}

/* 深色区域里的滚动条 —— 默认那根在紫底上是一条白杠，很难看 */
/* 浅色底上的滚动条。**深色那套直接套过来是看不见的** ——
   白色 28% 透明压在白底上基本无痕。抽屉、面板这类浅底滚动区用这个。 */
.litescroll{scrollbar-width:thin;scrollbar-color:rgba(55,0,60,.26) transparent}
.litescroll::-webkit-scrollbar{width:7px;height:7px}
.litescroll::-webkit-scrollbar-track{background:transparent}
.litescroll::-webkit-scrollbar-thumb{background:rgba(55,0,60,.22);border-radius:4px}
.litescroll::-webkit-scrollbar-thumb:hover{background:rgba(55,0,60,.4)}

.darkscroll{scrollbar-width:thin;scrollbar-color:rgba(255,255,255,.28) transparent}
.darkscroll::-webkit-scrollbar{width:6px;height:6px}
.darkscroll::-webkit-scrollbar-track{background:transparent}
.darkscroll::-webkit-scrollbar-thumb{background:rgba(255,255,255,.24);border-radius:3px}
.darkscroll::-webkit-scrollbar-thumb:hover{background:rgba(255,255,255,.42)}

/* 真正能用的 tab：当前项底部一条亮紫，切换有过渡 */
.tabrow{display:flex;gap:2px;border-bottom:1px solid var(--line);overflow-x:auto;
  scrollbar-width:none}
.tabrow::-webkit-scrollbar{display:none}
.tabrow button{padding:11px 16px;font-size:13.5px;font-weight:700;color:var(--ink-3);
  background:none;border:0;cursor:pointer;white-space:nowrap;
  box-shadow:inset 0 -2px 0 transparent;transition:color .15s,box-shadow .15s}
.tabrow button:hover{color:var(--ink)}
.tabrow button.on{color:var(--ink);box-shadow:inset 0 -2px 0 var(--plum)}
/* 深色版（赛程/积分榜那对） */
.tabrow.dark{border-bottom-color:rgba(255,255,255,.12)}
.tabrow.dark button{flex:1;color:rgba(255,255,255,.55);text-align:center;
  box-shadow:none;padding:13px 0}
.tabrow.dark button:hover{color:#fff}
.tabrow.dark button.on{background:var(--orchid);color:#fff}

/* ══ 首页侧栏的积分榜（tab 切过去时显示）══════════════════════════
   跟赛程面板一起改成白底 —— 两个 tab 在同一块面板里，一个浅一个深会很怪。 */
.strow{display:grid;grid-template-columns:26px 18px minmax(0,1fr) 26px 30px;
  align-items:center;gap:8px;padding:8px 14px;
  border-bottom:1px solid var(--line-2);transition:background .14s}
.strow:last-child{border-bottom:0}
.strow:hover{background:var(--paper-2)}
.strow img{width:18px;height:18px;object-fit:contain}
.strow .pos{font-size:11.5px;font-weight:700;color:var(--ink-3);
  text-align:center}
/* 欧冠区和降级区用左侧色条标出来 —— 样板也是这么做的，
   比整行染色克制，不会盖住队徽 */
.strow .pos.ucl{color:var(--plum);box-shadow:inset 2px 0 0 var(--teal)}
.strow .pos.rel{color:var(--loss);box-shadow:inset 2px 0 0 var(--loss)}
.strow .cl{font-size:12.5px;font-weight:700;color:var(--ink);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.strow .pl{font-size:11.5px;color:var(--ink-3);text-align:center}
.strow .pt{font-size:13px;font-weight:800;color:var(--plum);text-align:center;
  font-variant-numeric:tabular-nums}
/* 赛程行里的比分（已结束的比赛）。
   **颜色不能写死白色。** 这条是当年面板还是深紫底时写的；面板改成白底之后
   白字压在浅灰药丸上等于隐形 —— 而且只有已完赛的比分中招，未开赛的时间
   照旧能看见，所以很容易漏掉。继承父元素的颜色就不会再跟着改版走偏。 */
.fxr .tm .sc{font-weight:800;color:inherit;font-variant-numeric:tabular-nums}

/* ── 手机导航 ──
   顶栏那排导航在 760px 以下隐藏,而在加这个之前**没有任何替代** ——
   赛程、积分榜、人物、球队、全部报道在手机上完全到不了,除了首页
   每个页面都是死路。这是功能缺失,不是样式问题。 */
.tbburger{display:none;width:40px;height:40px;padding:0;border:0;
  background:none;color:var(--ink-2);cursor:pointer;
  align-items:center;justify-content:center;border-radius:8px}
.tbburger:hover{background:var(--paper-2);color:var(--plum)}
.tbburger svg{width:22px;height:22px}
/* 手机上不用汉堡：导航在底栏（.tabbar），见文件后面「手机：原生 app 骨架」 */
/* 中等宽度整排导航放不下（英文词长，比中文早一截）：与其让它在顶栏里横着拖、最后一项被裁半截，
   不如直接换成菜单按钮。断点是逐 2px 扫出来的（/news，按最宽的「Premier League」展开、五个联赛都在算）——
   2026-10-15 导航加了「视频」之后：项距从 14 收到 11（不收的话英文在顶栏最宽 1460 时也差 39px），
   英文 1442 以下溢出，留余量到 1459；中文 1196 以下溢出，到 1219。
   导航和汉堡照旧成对切换。改导航项或联赛名后要重扫。 */
@media (min-width:761px) and (max-width:1459px){
  html[lang^="en"] .tbnav{display:none}
  html[lang^="en"] .tbburger{display:flex}
  html[lang^="en"] .tbright{margin-left:auto}
}
@media (min-width:761px) and (max-width:1219px){
  .tbnav{display:none}
  .tbburger{display:flex}
  .tbright{margin-left:auto}
}

.tbdrawer{position:fixed;inset:0;z-index:90}
.tbdrawer[hidden]{display:none}
.tbd-back{position:absolute;inset:0;background:rgba(20,0,26,.5);
  backdrop-filter:blur(2px);animation:mp-fade-in var(--t-base) ease both}
.tbd-panel{position:absolute;top:0;right:0;bottom:0;width:min(78vw,300px);
  background:#fff;box-shadow:-8px 0 30px rgba(30,0,40,.18);
  display:flex;flex-direction:column;padding:14px 0;
  animation:tbd-in var(--t-slow) var(--ease-out) both}
@keyframes tbd-in{from{transform:translateX(100%)}to{transform:none}}
/* 关的时候也要走：原来一点关闭整块直接消失，开是滑进来的、关是瞬间没的，一开一关不像同一个东西 */
.tbdrawer.closing .tbd-back{animation:mp-fade-out var(--t-base) ease both}
.tbdrawer.closing .tbd-panel{animation:tbd-out var(--t-base) cubic-bezier(.4,0,.7,.2) both}
@keyframes tbd-out{to{transform:translateX(100%)}}
/* 菜单项跟着抽屉依次落位 */
.tbd-panel>a{animation:mp-rise var(--t-slow) var(--ease-out) both}
.tbd-panel>a:nth-of-type(2){animation-delay:.03s}
.tbd-panel>a:nth-of-type(3){animation-delay:.06s}
.tbd-panel>a:nth-of-type(4){animation-delay:.09s}
.tbd-panel>a:nth-of-type(5){animation-delay:.12s}
.tbd-panel>a:nth-of-type(n+6){animation-delay:.15s}
.tbdrawer.closing .tbd-panel>a{animation:none}
.tbdrawer.keep:not(.closing) :is(.tbd-back,.tbd-panel,.tbd-panel>a){animation:none}
.tbd-head{display:flex;align-items:center;justify-content:space-between;
  padding:4px 18px 14px;border-bottom:1px solid var(--line)}
.tbd-head b{font:800 13px var(--sans);letter-spacing:.06em;color:var(--ink-3);
  text-transform:uppercase}
.tbd-head button{width:36px;height:36px;padding:0;border:0;background:none;
  color:var(--ink-3);cursor:pointer;border-radius:8px;display:grid;
  place-items:center}
.tbd-head button:hover{background:var(--paper-2);color:var(--ink)}
.tbd-head button svg{width:18px;height:18px}
/* 抽屉里的每一项 **高度 48px** —— 拇指点击区的下限。
   顶栏那排是鼠标用的,可以矮;这里是手指用的。 */
.tbd-panel>a{display:flex;align-items:center;min-height:48px;padding:0 18px;
  font:700 15px var(--sans);color:var(--ink);text-decoration:none;
  border-bottom:1px solid var(--line-2)}
.tbd-panel>a:active{background:var(--paper-2)}
.tbd-panel>a.on{color:var(--plum);background:var(--paper-2);
  box-shadow:inset 3px 0 0 var(--plum)}
/* 抽屉打开时锁住背景滚动 —— 不锁的话手指在抽屉上滑会带动后面的页面 */
html.tbd-open{overflow:hidden}

/* ══ 手机：原生 app 骨架 ══════════════════════════════════════════════
   原来手机顶栏把 logo、汉堡、语言、搜索、头像全塞在一行，下面再挂一排散落的联赛图标 —— 像把桌面版缩小了。
   现在照原生 app 分工：
     顶栏    只留 logo + 搜索 + 头像；下面一条联赛分段控件（灰槽 + 白色选中块，iOS 那种）
     底栏    首页 / 赛程 / 积分榜 / 球队 / 更多，拇指够得着；「更多」弹出底部面板（人物、全部报道、Mac 版、语言）
     往下滚  顶栏整条收起给内容让位，往回一滚就出来；底栏一直在
   底栏是 fixed 的，所以正文底部要让出它的高度（含 iPhone 底部横条那段安全区）。 */
.tabbar{display:none}
.tbd-lang,.tbd-t-more{display:none}
.tbd-panel>a svg{width:20px;height:20px;flex:none;margin-right:14px;color:var(--ink-3)}
.tbd-panel>a.on svg{color:var(--plum)}
@media (max-width:760px){
  .tb{height:52px;gap:12px}
  .tb .langsw,.tbburger{display:none}
  .tbright{margin-left:auto;gap:4px}
  .tbi{width:40px;height:40px}
  .tbi svg{width:20px;height:20px}
  .topbar{transition:transform var(--t-slow) var(--ease-out)}
  html.tb-hide .topbar{transform:translateY(-100%)}
  html.tb-hide .acct-menu{visibility:hidden}

  /* 联赛：一条满宽的分段控件。没选的平分剩下的宽度、只露 logo，选中的是白色浮起的那块、带名字 */
  .lgsw{top:52px;left:var(--gut);right:var(--gut);height:36px;padding:3px;gap:0;
    background:var(--paper-2);border-radius:10px;overflow:hidden}
  .lgsw a{flex:1 1 0;justify-content:center;height:30px;padding:0;border:0;border-radius:7px;
    -webkit-tap-highlight-color:transparent;
    transition:flex-grow var(--t-slow) var(--ease-out),background-color var(--t-base),box-shadow var(--t-base)}
  .lgsw a:hover{border-color:transparent}
  .lgsw a.on{flex:0 0 auto;padding:0 12px 0 9px;border:0;background:#fff;
    box-shadow:0 1px 3px rgba(30,0,40,.14),0 0 0 .5px rgba(30,0,40,.06)}
  .lgsw a:active .lglogo{transform:scale(.88)}
  .lgsw a .lglogo{width:20px;height:20px}
  .topbar:has(.lgsw){padding-bottom:44px}

  .tabbar{display:grid;grid-template-columns:repeat(5,1fr);position:fixed;left:0;right:0;bottom:0;z-index:70;
    padding:0 env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left);
    background:rgba(255,255,255,.88);-webkit-backdrop-filter:saturate(1.8) blur(18px);
    backdrop-filter:saturate(1.8) blur(18px);border-top:1px solid var(--line)}
  .tabbar a,.tabbar button{position:relative;height:56px;display:flex;flex-direction:column;
    align-items:center;justify-content:center;gap:3px;padding:0;border:0;background:none;cursor:pointer;
    font:650 10.5px var(--sans);color:var(--ink-3);text-decoration:none;
    -webkit-tap-highlight-color:transparent;transition:color var(--t-fast)}
  /* 选中项图标后面一枚淡紫胶囊（Material 3 底栏的指示器），从中间撑开 */
  .tabbar a::before,.tabbar button::before{content:"";position:absolute;top:6px;left:50%;width:54px;height:28px;
    margin-left:-27px;border-radius:999px;background:rgba(55,0,60,.09);transform:scaleX(.4);opacity:0;
    transition:transform var(--t-slow) var(--ease-out),opacity var(--t-fast)}
  .tabbar .on{color:var(--plum)}
  .tabbar .on::before{transform:none;opacity:1}
  .tabbar svg{position:relative;width:23px;height:23px;margin-top:1px;transition:transform var(--t-fast) var(--ease-out)}
  .tabbar .on svg{stroke-width:2.2}
  .tabbar :active>svg{transform:scale(.86)}
  .tabbar span{position:relative;white-space:nowrap}
  body{padding-bottom:calc(57px + env(safe-area-inset-bottom))}

  /* 「更多」从底下弹上来的面板，顶上一根抓手；主导航那四项底栏里已经有了，这里不重复 */
  .tbd-panel{top:auto;left:0;right:0;width:auto;max-height:86vh;overflow-y:auto;
    border-radius:18px 18px 0 0;padding:20px 0 calc(14px + env(safe-area-inset-bottom));
    box-shadow:0 -10px 34px rgba(30,0,40,.2);animation-name:tbd-up}
  .tbd-panel::before{content:"";position:absolute;top:7px;left:50%;width:36px;height:5px;margin-left:-18px;
    border-radius:3px;background:var(--line)}
  .tbdrawer.closing .tbd-panel{animation-name:tbd-down}
  .tbd-panel>a:is([data-k=home],[data-k=fixtures],[data-k=table],[data-k=clubs]){display:none}
  .tbd-panel>a{min-height:52px;padding:0 20px}
  .tbd-panel>a.on{box-shadow:none}
  .tbd-head{padding:0 12px 10px 20px}
  .tbd-t-menu{display:none}
  .tbd-t-more{display:inline}
  .tbd-lang{display:flex;align-items:center;justify-content:space-between;min-height:60px;padding:0 20px;
    font:700 15px var(--sans);color:var(--ink)}
  .tbd-lang .langsw button{min-height:34px;padding:0 16px;font-size:13px}

  /* 页面里贴底的提示条（分享的「已复制」）要浮在底栏上面 */
  .shr-toast{bottom:calc(72px + env(safe-area-inset-bottom))}
}
/* ══ 玻璃小人图标的轻动效（下载页、连接页、装到桌面的提示条） ══
   图标进场浮上来一次；背后那圈紫光先淡入，再慢慢一明一暗。光是 ::before 画的，
   上面那条全站的「减少动态效果」规则（`*`）选不到伪元素，所以在这里单独关。
   .sm 是提示条里那颗：只呼吸两轮就停在淡淡的一圈，别一直在读字的人眼角闪。 */
.app-glyph{position:relative;display:block;width:fit-content;justify-self:start;flex:none;isolation:isolate}
.app-glyph img{display:block;animation:ag-rise .7s var(--ease-out) .05s both}
.app-glyph::before{content:"";position:absolute;inset:-30%;z-index:-1;border-radius:50%;pointer-events:none;
  background:radial-gradient(closest-side,rgba(150,60,255,.42),rgba(150,60,255,.16) 52%,rgba(150,60,255,0) 72%);
  opacity:0;transform:scale(.9);
  animation:ag-glow-in .6s var(--ease-out) .25s forwards,ag-breathe 4.8s ease-in-out .85s infinite}
.app-glyph.sm{--ag-rise:4px}
.app-glyph.sm::before{inset:-45%;
  animation:ag-glow-in .5s var(--ease-out) .3s forwards,ag-breathe 4.8s ease-in-out .8s 2}
@keyframes ag-rise{from{opacity:0;transform:translateY(var(--ag-rise,12px))}to{opacity:1;transform:none}}
@keyframes ag-glow-in{to{opacity:.55}}
@keyframes ag-breathe{0%,100%{opacity:.55;transform:scale(.9)}50%{opacity:1;transform:scale(1.04)}}
@media (prefers-reduced-motion:reduce){.app-glyph::before{animation:none!important;opacity:.55}}
/* ══ 装到桌面的提示条 ══
   **浮在顶栏下沿，不占文档流**：脚本 1 秒多以后才决定出不出，占位的话整页正文会被往下推一截。
   顶栏收起（tb-hide）时跟着贴到屏幕最上面。高度由内容定，--pwa-top 是脚本量的顶栏实际高度。 */
.pwa-bar{position:fixed;z-index:65;left:10px;right:10px;top:calc(var(--pwa-top,97px) + 8px);
  display:flex;align-items:center;gap:12px;padding:12px 8px 12px 12px;border-radius:16px;
  background:#fff;box-shadow:0 10px 30px rgba(30,0,40,.18),0 0 0 .5px rgba(30,0,40,.08);
  opacity:0;transform:translateY(-10px) scale(.98);pointer-events:none;
  transition:opacity var(--t-base) var(--ease-out),transform var(--t-slow) var(--ease-out),top var(--t-slow) var(--ease-out)}
.pwa-bar.in{opacity:1;transform:none;pointer-events:auto}
html.tb-hide .pwa-bar{top:calc(8px + env(safe-area-inset-top))}
.pwa-bar img{width:42px;height:42px;border-radius:10px;flex:none}
.pwa-tx{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
.pwa-tx b{font:800 14px/1.25 var(--sans);color:var(--ink);letter-spacing:-.01em}
.pwa-tx span{font-size:12px;line-height:1.4;color:var(--ink-3)}
.pwa-tx span b{font-size:12px;font-weight:750;color:var(--ink-2)}
.pwa-ic{display:inline-flex;vertical-align:-3px;color:#0a7cff}
.pwa-ic svg{width:15px;height:15px}
.pwa-go{flex:none;height:36px;padding:0 18px;border-radius:999px;background:var(--plum);color:#fff;
  font:750 13px var(--sans);-webkit-tap-highlight-color:transparent}
.pwa-go:active{transform:scale(.96)}
.pwa-x{flex:none;width:34px;height:34px;display:grid;place-items:center;border-radius:50%;color:var(--ink-3);
  -webkit-tap-highlight-color:transparent}
.pwa-x:active{background:var(--paper-2)}
.pwa-x svg{width:16px;height:16px}
@media (min-width:761px){.pwa-bar{left:auto;right:var(--gut);width:380px}}
@media (prefers-reduced-motion:reduce){.pwa-bar{transition:none}}
/* 「更多」里的安装项：只在这台设备装得上时露出（脚本给 html 挂 .pwa-can） */
.tbd-install{display:none}
html.pwa-can .tbd-install{display:flex;align-items:center;width:100%;min-height:48px;padding:0 18px;
  font:700 15px var(--sans);color:var(--plum);text-align:left;border-bottom:1px solid var(--line-2)}
html.pwa-can .tbd-install svg{width:20px;height:20px;flex:none;margin-right:14px}
@media (max-width:760px){html.pwa-can .tbd-install{min-height:52px;padding:0 20px}}
@keyframes tbd-up{from{transform:translateY(100%)}to{transform:none}}
@keyframes tbd-down{to{transform:translateY(100%)}}

/* ── 手机上的点击区 ──
   页脚链接实测只有 22~27px 高,拇指点不准。**48px 是下限**,
   但页脚项很多,给 40px 加上足够的行距,在密度和可点之间取中。 */
@media (max-width:760px){
  .foot a{min-height:40px;display:inline-flex;align-items:center}
  .langsw button{min-height:36px;padding:0 12px}
  .plmark{min-height:40px}
}

/* 只给读屏软件的字 */
.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;
  clip:rect(0 0 0 0);white-space:nowrap;border:0}

/* ══ 联赛 logo ══════════════════════════════════════════════════════
   所有写着「英超 / 西甲 / 意甲 / 德甲 / 法甲」的地方都带它（`SITE.leagueLogo` / `SITE.leagueTag` 出的标记）。
   图是站内文件（`assets/leagues/`，tools/fetch_league_logos.py），浅底、深底各一版。 */
.lglogo{display:inline-block;flex:none;width:16px;height:16px;object-fit:contain;vertical-align:-3px}
.lgtag{display:inline-flex;align-items:center;gap:6px;white-space:nowrap}
.lgtag .lglogo{vertical-align:0}

/* ══ 顶栏占位 ══
   顶栏是脚本画的。万一浏览器在脚本跑完之前先画了一帧，空的占位也得是顶栏那么高 ——
   否则这一帧里正文顶在最上面，下一帧被顶栏推下去 62px（手机上还有联赛那一行，102px）。 */
#site-header:empty{display:block;height:var(--tb-h);background:#fff}
html.tb-over #site-header:empty{background:transparent}

/* ══ 加载动画 ════════════════════════════════════════════════════════
   玻璃小人从空到满、慢慢灌满紫色，循环（2026-10-22 起）。**动的是图片本身的帧**（一张动图，
   tools/build_loader.py 用两张生图拼出来），这里不再给它加任何 CSS 动作。
   开了「减少动态效果」的人看到的是一张静止的满格图（site.js 的 loaderFigure 里换图）。
   深浅底都用同一张，所以没有 .dark 的换图规则。
   **先等 160ms 再出现**：接口一两百毫秒就回来的时候，一闪而过的加载图比没有更难看。 */
.mpl-stage{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:14px;
  width:100%;grid-column:1/-1;
  min-height:clamp(320px,62vh,660px);padding:40px var(--gut);text-align:center;
  animation:mpl-show .3s linear .16s both}
.mpl-stage.sm{min-height:190px;padding:24px 0;gap:10px}
.mpl{--w:clamp(96px,9vw,124px);display:block;flex:none;width:var(--w);aspect-ratio:1}
.mpl img{display:block;width:100%;height:100%}
.mpl-stage.sm .mpl{--w:76px}
.mpl-cap{font-size:11.5px;font-weight:700;letter-spacing:.16em;text-transform:uppercase;color:var(--ink-3)}
html[lang="zh"] .mpl-cap{letter-spacing:.24em;text-transform:none}
/* 深底（首页头图、人物页刊头、分享弹窗的深色预览）：图不换，只把字换成白的 */
.mpl-stage.dark .mpl-cap{color:rgba(255,255,255,.62)}
@keyframes mpl-show{from{opacity:0}}
/* 按钮里的小号加载：只有那颗球在滚（「加载更多」这类原地等的按钮）。
   **颜色跟着按钮的字走**（球的形状当遮罩、底色是 currentColor）：紫底白字的按钮上是白球，
   线框按钮上是紫球 —— 直接放紫色的球图，在紫色按钮上就看不见了。 */
.mpl-roll{display:inline-block;flex:none;width:14px;height:14px;vertical-align:-2px;
  background:currentColor;
  -webkit-mask:url(/assets/brand/spin-ball.png) center/contain no-repeat;
  mask:url(/assets/brand/spin-ball.png) center/contain no-repeat;
  animation:mpl-roll .9s linear infinite}
@keyframes mpl-roll{to{transform:rotate(360deg)}}

/* 内容到了怎么落位（依次上浮、局部淡入）在 site.js 的 SITE.motion 里，用 Web Animations 播：
   只在**第一次**换掉加载动画时播一次 —— 直播页每 30 秒重画一次，要是每次都播，页面就一直在抖。 */
@keyframes mp-rise{from{opacity:0;transform:translateY(12px)}}
@keyframes mp-fade-in{from{opacity:0}}
@keyframes mp-fade-out{to{opacity:0}}
/* 等数据时容器里只有加载动画：拼接卡片网格那圈边框先不画，不然动画被框在一个空方框里 */
.tiles:has(>.mpl-stage),.storygrid:has(>.mpl-stage){border:0}

/* ══ 跳页 ══
   1) 点了站内链接，顶栏下沿立刻走一道紫→青的进度线 —— 新页面还没回来之前，读者知道「点到了」。
   2) 支持跨页视图过渡的浏览器（Chrome 126+、Safari 18.2+）：顶栏原地不动，只有下面的内容淡出淡入。
      原来每点一下导航，整页白一下、顶栏重新长出来，看着像刷新而不是翻页。 */
.topbar::after{content:"";position:absolute;left:0;right:0;bottom:-1px;height:2px;pointer-events:none;
  background:linear-gradient(90deg,var(--orchid),#7a5cff 55%,var(--teal));
  transform:scaleX(0);transform-origin:0 50%;opacity:0;transition:opacity .3s ease}
html.mp-nav .topbar::after{opacity:1;animation:mp-nav 9s cubic-bezier(.08,.7,.2,1) forwards}
@keyframes mp-nav{0%{transform:scaleX(0)}8%{transform:scaleX(.32)}35%{transform:scaleX(.68)}
  100%{transform:scaleX(.95)}}
/* 开关本身（@view-transition{navigation:auto}）写在每个页面 <head> 的内联 <style> 里，不在这里：
   外链样式表里的开关新页面有时来不及认（实测同一对页面时成时败）。这里只管过渡怎么播。
   顶栏的名字（mp-head）只在换页那一下由 site.js 挂上去，平时不挂（理由写在 site.js 的 pagereveal 那里） */
::view-transition-group(mp-head){animation:none}
::view-transition-old(mp-head),::view-transition-new(mp-head){animation-duration:var(--t-base)}
::view-transition-group(.mp-header-part){animation-duration:var(--t-header);animation-timing-function:var(--ease-io)}
/* 截图保留原来的字形尺寸，宽度变化只裁切，不把文字和 logo 拉宽。 */
::view-transition-old(.mp-header-part),::view-transition-new(.mp-header-part){
  width:auto;height:auto;max-width:none;max-height:none;object-fit:none;object-position:left top;
  animation-duration:var(--t-base);animation-timing-function:var(--ease-out);mix-blend-mode:normal}
::view-transition-group(mp-dock){animation:none}
::view-transition-old(mp-dock){display:none}
::view-transition-new(mp-dock){animation:none}
::view-transition-old(root){animation:mp-fade-out .14s ease-out both}
::view-transition-new(root){animation:mp-vt-in .34s var(--ease-out) both}
@keyframes mp-vt-in{from{opacity:0;transform:translateY(10px)}}
/* 切语言是同一页里整页换字（顶栏也换）：整页一起交叉淡入，内容不上浮 —— 字在原位换 */
html.mp-vt-swap::view-transition-old(root){animation:mp-fade-out .16s ease-out both}
html.mp-vt-swap::view-transition-new(root){animation:mp-fade-in .26s ease-out both}

@media (prefers-reduced-motion:reduce){
  html.mp-nav .topbar::after{animation:none;transform:scaleX(.6)}
  .acct-menu{transform:none}
  #site-header,#site-header *{animation:none!important;transition:none!important}
}
