/* ===================================================================
   大屏自适应 .tho-large / .tho-cast
   -------------------------------------------------------------------
   由 base.html 首屏前的内联脚本按视口给 <html> 定级（见该脚本注释）。
   定级只认「形状」——纵横比，不认绝对宽度；只有一道最小尺寸门槛
   （宽 ≥1000 且 高 ≥640）用来排除手机横屏这类「比例宽但很小」的设备：
     .tho-desktop 宽高比 ≥1.4（比 4:3 明显更宽）：游戏页整屏锁定
     .tho-large   宽高比 ≥1.6（16:10 以上宽屏）：放大字号与内容宽度，保留导航/页脚
     .tho-cast    宽高比 ≥2.6 且 ≥1440x700：会场大屏/投屏，收起导航/页脚
                  （导航改为「鼠标移到顶部滑出」，见文件末尾）
                  与页首遮罩，内容铺满，棋盘等关键字段按视口最大化
   所有规则都挂在 html.tho-* 下，小屏/手机完全不命中，行为不变。

   手动覆盖：?cast=1 强制投屏、?cast=0 关闭；按 C 键切换（会话内记住）。

   尺寸取舍依据（用 Playwright 在 4160x1560 实测）：
     - 会场屏 8:3 超宽但只有 1560 高 → 棋盘必须由“剩余高度”定尺寸
     - 比分/页头占高，故大屏下压缩其纵向留白给棋盘
     - 左右两栏（角色池/推断记录）各自滚动，避免把整页撑高
   =================================================================== */

/* ============ 一级：宽屏放大 ============ */
html.tho-large { font-size: clamp(16px, calc(14px + 0.20vw), 22px); }
html.tho-large .container { max-width: min(94vw, 2200px) !important; }

/* ============ 二级：会场大屏 / 投屏 ============ */
html.tho-cast { font-size: clamp(18px, calc(12px + 0.32vw), 34px); }

/* 收起站点外框，把竖向空间全部让给内容 */
html.tho-cast .tho-footer,
html.tho-cast .back-top,
html.tho-cast .page-veil { display: none !important; }

/* 导航：投屏档默认收起为浮层（不占高度、不挡内容），鼠标移到页面顶部由 base.html
   的脚本加 .tho-nav-peek 滑出 —— 否则投屏档根本没有可点的菜单。 */
html.tho-cast .navbar {
    display: flex !important;
    position: fixed;
    top: 0; left: 0; right: 0;
    z-index: 1080;
    transform: translateY(-102%);
    opacity: 0;
    pointer-events: none;
    transition: transform .22s ease, opacity .22s ease;
    background: rgba(255, 255, 255, .97);
    box-shadow: 0 2px 18px rgba(0, 0, 0, .12);
}
html.tho-cast .navbar.tho-nav-peek {
    transform: translateY(0);
    opacity: 1;
    pointer-events: auto;
}
html.tho-cast .navbar .navbar-brand,
html.tho-cast .navbar .nav-link { color: #2f5b8f !important; }
html.tho-cast .navbar .nav-link { font-size: clamp(1rem, 1.05vw, 2.2rem); }

/* 内容铺满全屏 */
html.tho-cast body { overflow-x: hidden; }
html.tho-cast .container,
html.tho-cast .container-fluid {
    max-width: 100% !important;
    width: 100% !important;
    padding-left: clamp(14px, 0.9vw, 56px);
    padding-right: clamp(14px, 0.9vw, 56px);
}
/* 让「整屏锁定」的页面正好等于 100vh（见 .bingo-screen） */
html.tho-cast .tho-fade { padding-top: 0; }
html.tho-cast .row { --bs-gutter-x: 1.2vw; --bs-gutter-y: 1.2vw; }

/* 通用文字：Bootstrap 标题/表格/按钮随屏放大 */
html.tho-cast h1 { font-size: clamp(2.2rem, 2.8vw, 6rem); }
html.tho-cast h2 { font-size: clamp(1.9rem, 2.3vw, 5rem); }
html.tho-cast h3 { font-size: clamp(1.6rem, 1.9vw, 4rem); }
html.tho-cast h4 { font-size: clamp(1.4rem, 1.55vw, 3.2rem); }
html.tho-cast h5 { font-size: clamp(1.2rem, 1.3vw, 2.6rem); }
html.tho-cast .btn { font-size: clamp(1rem, 1.05vw, 2.2rem); padding: .5em 1.1em; }
html.tho-cast .btn-lg { font-size: clamp(1.15rem, 1.25vw, 2.6rem); }
html.tho-cast .table { font-size: clamp(1rem, 1vw, 2.2rem); }
html.tho-cast .list-group-item { font-size: clamp(1.05rem, 1.1vw, 2.4rem); }

/* 页头（全站复用 .tho-page-head）：大屏下压缩纵向留白，避免占掉内容高度 */
html.tho-cast .tho-page-head { padding: .8vh 0 .6vh; }
html.tho-cast .tho-page-head .tho-kicker { font-size: clamp(.9rem, .95vw, 2.2rem); }
html.tho-cast .tho-page-head h2 { font-size: clamp(1.8rem, 2.2vw, 4.6rem); letter-spacing: .3vw; margin: .6vh 0 .4vh; }
html.tho-cast .tho-page-head p { font-size: clamp(1rem, 1.05vw, 2.4rem); }

/* 板块外框标签 */
html.tho-cast .tho-frame { padding: 2.2vh 1.6vw; }
html.tho-cast .tho-frame .ns-tag { font-size: clamp(1.05rem, 1.25vw, 2.8rem); }
html.tho-cast .tho-frame .ns-tag .ns-en { font-size: clamp(.7rem, .78vw, 1.7rem); }

/* ===================================================================
   芙一把 BINGO / 1v1（/bingo、/guess）
   -------------------------------------------------------------------
   三级处理（互不冲突）：
     .tho-desktop（宽高比 ≥1.4，含笔记本/横屏平板）「整屏锁定」：页面不滚动，
         页头/比分板/棋盘/两侧都在一屏内；两侧过长时各自内部滚动兜底；
         并隐藏游戏页页脚（768 高的笔记本上页脚要占 213px）。
     .tho-large （宽高比 ≥1.6）「两侧铺开」：中栏被棋盘高度限死、宽度富余，
         把宽度让给两侧 —— 左栏角色池改等宽网格、右栏红蓝记录并排，
         从而两侧免滚动。
     .tho-cast  （宽高比 ≥2.0，会场大屏）在 large 之上再放大字号。
   /bingo/player 面向选手手机，不参与整屏锁定。
   =================================================================== */

html.tho-desktop .bingo-screen,
html.tho-cast .bingo-player,
html.tho-cast .bingo-admin { max-width: none; }

/* ---------- 一级：整屏锁定（笔记本及以上） ---------- */
html.tho-desktop body.game-screen { overflow: hidden; }
html.tho-desktop body.game-screen .tho-footer,
html.tho-desktop body.game-screen .back-top { display: none !important; }

html.tho-desktop .bingo-screen {
    position: relative;
    height: calc(100vh - var(--tho-nav-h, 64px));
    box-sizing: border-box;
    margin-bottom: 0;
    padding: .8vh 1.2vw 1.2vh;
    display: flex;
    flex-direction: column;
    overflow: hidden;
}
html.tho-desktop .bingo-screen > .bingo-header,
html.tho-desktop .bingo-screen > .bingo-scoreboard,
html.tho-desktop .bingo-screen > .bingo-collect { flex: 0 0 auto; }
html.tho-desktop .bingo-screen > .bingo-header { margin-bottom: .6vh !important; }
html.tho-desktop .bingo-screen > .bingo-scoreboard { margin-bottom: .6vh !important; }
html.tho-desktop .bingo-screen > .bingo-collect { margin-bottom: .6vh !important; max-height: 26vh; overflow-y: auto; }
html.tho-desktop .bingo-screen > .bingo-layout {
    flex: 1 1 auto;
    min-height: 0;
    /* 关键 1：栅格行必须受容器高度约束，否则列内容会把行撑高并被 .bingo-screen 裁掉 */
    grid-template-rows: minmax(0, 1fr);
    /* 关键 2：bingo.css 基线是 align-items:start（列按内容撑高），这里必须改回 stretch */
    align-items: stretch;
}

/* duel 对局区：#duelPlay 是 .bingo-screen 的直接子元素（隐藏时靠内联 display:none） */
html.tho-desktop .bingo-screen > #duelPlay { flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; }
html.tho-desktop .bingo-screen > #duelPlay > .bingo-scoreboard { flex: 0 0 auto; margin-bottom: .6vh !important; }
html.tho-desktop .bingo-screen > #duelPlay > .bingo-layout { flex: 1 1 auto; min-height: 0; }

/* ===================================================================
   /guess（1v1）：**整页可滚动**，不再整屏锁定
   -------------------------------------------------------------------
   需求沿革：面板放中栏 → 一开就把棋盘从 451px 压到 34px；
             改成右侧浮层 → 挡住右栏「推断记录」；
             挪到左栏 → 左栏只有 250~517px，角色池挤成一小条，太小。
   最终方案：面板回到棋盘正下方（和棋盘同宽），同时解除 /guess 的整屏锁定，
             整页往下滚 —— 面板多高都不会挤小棋盘，棋盘改按中栏宽度定尺寸反而更大。
   只作用于 /guess（body.duel-play + .bingo-screen.duel-screen），/bingo 观看页保持整屏锁定。
   =================================================================== */
html.tho-desktop body.game-screen.duel-play { overflow: auto; }
html.tho-desktop .bingo-screen.duel-screen {
    height: auto;
    min-height: calc(100vh - var(--tho-nav-h, 64px));
    overflow: visible;
    /* 棋盘上方「页头 + 比分板 + 提示行」的预留高度，用于算棋盘可用高度（实测调校） */
    --duel-chrome: 34vh;
}
html.tho-desktop .bingo-screen.duel-screen > #duelPlay { flex: 0 0 auto; }
html.tho-desktop .bingo-screen.duel-screen > #duelPlay > .bingo-layout { flex: 0 0 auto; }

/* 棋盘：一屏内尽量大且正方。
   这里不再让 wrap 参与 flex 分配，而是给它一个「一屏减去页头/比分板」的确定高度，
   棋盘仍用 min(可用宽, 可用高) 定尺寸 → 整块棋盘始终能一屏看全；
   多出来的猜测面板在它下面，靠整页滚动去看。 */
html.tho-desktop .bingo-screen.duel-screen .bingo-board-wrap {
    flex: 0 0 auto;
    height: calc(100vh - var(--tho-nav-h, 64px) - var(--duel-chrome, 34vh));
    container-type: size;   /* 供 min(100cqw,100cqh) 使用 */
}
html.tho-desktop .bingo-screen.duel-screen .bingo-board {
    width: min(100cqw, 100cqh);
    height: min(100cqw, 100cqh);
    max-width: 100%;
    max-height: 100%;
}

/* 三栏重新配比：把宽度从两侧让给棋盘（原先 19vw/34vw 按**视口**算，
   容器被 max-width 封顶后中栏只剩 619px，棋盘因此一直很小）。
   这里改用相对栅格容器的百分比，超宽屏也不会失控。
   2026-10-03：右栏「双方推断记录」取消，改为「选角色」区。
   选角色需要「一行放得下更多角色、一屏看全」→ 右栏加宽到 26%（并给 360px 下限），
   左栏收到 18%，两侧合计仍是 44% → 中栏棋盘宽度完全不变。 */
html.tho-large .bingo-screen.duel-screen > #duelPlay > .bingo-layout,
html.tho-cast .bingo-screen.duel-screen > #duelPlay > .bingo-layout {
    grid-template-columns: minmax(0, 18%) minmax(0, 1fr) minmax(420px, 26%);
    gap: .8vw;
    align-items: stretch;
}
/* 横排时 order 必须归零：媒体查询（≤1150px）里的 order 是给「窄屏堆叠」用的，
   而上面这条百分比三栏在 tho-large 下始终生效，若 order 还在，
   中栏（order:1）会排到第一列（22% 的窄列）去。 */
html.tho-large .bingo-screen.duel-screen > #duelPlay > .bingo-layout > .bingo-col,
html.tho-cast .bingo-screen.duel-screen > #duelPlay > .bingo-layout > .bingo-col { order: 0; }

/* ===================================================================
   /bingo/player（选手操作页）：与 /guess 对齐
   -------------------------------------------------------------------
   该页本来就不是「整屏锁定」（只有 .bingo-screen 锁），所以页面天然可滚；
   这里补两件事：
     1) 棋盘一屏内尽量大：给 wrap 一个「一屏减页头」的高度，棋盘用它定尺寸
        （JS syncBoardHeight() 会覆盖成实测值；这条是没跑到 JS 时的兜底）
     2) 三栏重新配比，把宽度让给棋盘 */
html.tho-desktop .bingo-player .bingo-board-wrap {
    flex: 0 0 auto;
    height: calc(100vh - var(--tho-nav-h, 64px) - var(--duel-chrome, 34vh));
    container-type: size;
}
html.tho-large .bingo-player .bingo-layout,
html.tho-cast .bingo-player .bingo-layout {
    grid-template-columns: minmax(0, 18%) minmax(0, 1fr) minmax(420px, 26%);
    gap: .8vw;
    align-items: stretch;
}
html.tho-large .bingo-player .bingo-layout > .bingo-col,
html.tho-cast .bingo-player .bingo-layout > .bingo-col { order: 0; }

/* /bingo 观看页：左「所点格子的猜测」· 棋盘 · 右「双方推断记录」。
   右侧从 34vw 收到 24%，腾出的宽度给新的左栏，中栏棋盘尺寸基本不变。 */
html.tho-large .bingo-screen > .bingo-layout,
html.tho-cast .bingo-screen > .bingo-layout {
    grid-template-columns: 20% minmax(0, 1fr) 24%;
    gap: .8vw;
    align-items: stretch;
}
html.tho-large .bingo-screen > .bingo-layout > .bingo-col,
html.tho-cast .bingo-screen > .bingo-layout > .bingo-col { order: 0; }

html.tho-desktop .bingo-col { min-height: 0; }
html.tho-desktop .bingo-col-left,
html.tho-desktop .bingo-col-right { overflow-y: auto; }
html.tho-desktop .bingo-col-center { display: flex; flex-direction: column; min-height: 0; }

/* 选手页在桌面档也隐藏页脚：页脚会在棋盘下方多出一整屏，导致「要看全就得下拉」。 */
html.tho-desktop body.player-screen .tho-footer,
html.tho-desktop body.player-screen .back-top { display: none !important; }

/* 选角色区（选手页右栏）：面板与角色区都按内容高度走（不再撑满整栏），
   配合「右栏加宽 + 角色字号调小」，25 个角色一屏看全、既不内部滚动也不撑高页面。
   真放不下时由角色区自己滚动，页面高度仍由棋盘决定。 */
html.tho-desktop .bingo-screen.duel-screen .bingo-col-right,
html.tho-desktop .bingo-player .bingo-col-right {
    display: flex;
    flex-direction: column;
}
html.tho-desktop .bingo-screen.duel-screen #guessPanel,
html.tho-desktop .bingo-player #guessPanel {
    flex: 0 0 auto;
    display: flex;
    flex-direction: column;
}
html.tho-desktop .bingo-screen.duel-screen #guessPoolSelect,
html.tho-desktop .bingo-player #guessPoolSelect {
    flex: 0 0 auto;
    max-height: 100%;
}

/* 棋盘：高度由剩余空间决定，宽度靠 aspect-ratio 反推 → 一屏内尽量大且正方。
   2026-09-29 修正横向溢出：原写法只有 height:100% + aspect-ratio + max-width:100%，
   当一个屏幕的「可用高度 > 中栏宽度」时（例如 2720×1541：容器被
   html.tho-large .container 的 max-width:min(94vw,2200px) 封顶到 2200，
   而栅格仍按视口 19vw/34vw 分配，中栏只剩 618px，可用高度却有 1148px），
   棋盘盒子被 max-width 压成 618×1148 的非方形；格子又各自带 aspect-ratio:1/1，
   栅格轨道的自动最小尺寸等于格子高度（220px），于是 5 列仍是 1148px 宽、
   直接横向溢出 530px 盖到右侧「推断记录」上。
   修法：容器查询单位取「可用宽 vs 可用高」的较小值做正方形边长，
   并让轨道可以收缩到 0（minmax(0,1fr) + 格子 min-width:0）双保险。 */
html.tho-desktop .bingo-board-wrap {
    flex: 1 1 auto; min-height: 0;
    display: flex; align-items: center; justify-content: center;
    container-type: size;   /* 供下面的 cqw/cqh 使用 */
}
html.tho-desktop .bingo-board {
    width: min(100cqw, 100cqh);
    height: min(100cqw, 100cqh);
    max-width: 100%; max-height: 100%;
    aspect-ratio: 1 / 1; margin: 0 auto;
    grid-template-columns: repeat(5, minmax(0, 1fr));
}
html.tho-desktop .bingo-board .bingo-cell { min-width: 0; }

/* 获胜横幅：底部悬浮条，不占三栏高度（否则 finished 态会把两侧挤到滚动） */
html.tho-desktop .bingo-winner {
    position: absolute; left: 50%; bottom: 1.2vh; transform: translateX(-50%);
    z-index: 30; max-width: 92vw; margin: 0; border-radius: 999px;
    box-shadow: 0 1vh 3vh rgba(0, 0, 0, .35);
}

/* 笔记本档：角色池排两列，尽量少滚动（large/cast 档会用 4 列覆盖它） */
html.tho-desktop .public-pool {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: .4vh .4vw;
    align-content: start;
    padding: .4vw;
}
html.tho-desktop .public-pool-chip {
    display: block; width: auto; min-width: 0; margin: 0;
    padding: .12em .35em; line-height: 1.15; text-align: center;
}

/* ---------- 二级：宽屏「两侧铺开」（宽高比 ≥1.6） ---------- */
/* 三栏宽度统一收在上面各自的段落里定义（/guess、/bingo/player、/bingo 各一组），
   这里不再重复声明：同特异性下后写的会覆盖先写的，曾因此让 /bingo 回退成旧的两栏
   （三个子元素被挤到两列两行 → 中栏高度塌成 0、棋盘消失）。 */

/* 页头压成一行：标题 · 状态徽章 · 轮次并排，省下的高度全给棋盘 */
html.tho-large .bingo-header,
html.tho-cast .bingo-header {
    display: flex; align-items: center; justify-content: center;
    flex-wrap: wrap; gap: .6vw 1.6vw; margin-bottom: .4vh !important;
}
html.tho-large .bingo-scoreboard,
html.tho-cast .bingo-scoreboard { gap: .8vw; align-items: center; }
html.tho-large .bingo-panel-title, html.tho-cast .bingo-panel-title,
html.tho-large .bingo-feed-title, html.tho-cast .bingo-feed-title { margin-bottom: .4vh; }
html.tho-large .pool-search, html.tho-cast .pool-search { margin-bottom: .6vh; }

/* 左栏·公开角色池：等宽网格（不用 column-count —— 多列瀑布在 30 个角色时
   列高不均衡，实测理想 ~880px 却被撑到 1228px，导致必须滚动） */
html.tho-large .public-pool,
html.tho-cast .public-pool {
    display: grid;
    grid-template-columns: repeat(4, minmax(0, 1fr));
    gap: .45vh .5vw;
    align-content: start;
    max-height: none;
    padding: .5vw;
}
html.tho-large .public-pool-chip,
html.tho-cast .public-pool-chip {
    display: block; width: auto; min-width: 0; margin: 0;
    padding: .12em .35em; line-height: 1.15; text-align: center;
}

/* 右栏·推断记录：红蓝两队**上下排**（不再左右分栏）。
   分左右时每队只剩半栏宽，记录里的角色名/格子/选手 + 6 个反馈字段被迫折成
   很多行；上下排后每条记录拿到整栏宽度，头部回到一行、字段按栏宽自动分列。
   （另外原 .record-char 的 overflow-wrap:anywhere 会把头部拆成 3 行 138px，
     6 个反馈字段又各占一行 → 每条曾高达 519px，这里一并修掉） */
/* 条件化：每队至少 19em 宽（≈ 头部「角色名+格子+选手+结果」一行所需的宽度）时
   才红蓝并排；否则上下排、每条吃满整栏 —— 避免半栏宽把信息挤成多行。
   注意：只作用于 /bingo 观看页的记录栏；选手页右栏现在是「选角色」面板，
   不能被当成 grid 容器。 */
html.tho-large .bingo-screen > .bingo-layout > .bingo-col-right,
html.tho-cast .bingo-screen > .bingo-layout > .bingo-col-right {
    display: grid;
    /* 条件化：每队至少 19em 宽才红蓝并排，否则上下排。
       min(19em, 100%) 是必需的：只用 19em 时，若右栏被压到比 19em 还窄，
       轨道会以 19em 为硬下限横向溢出 → 右栏出现横向滚动条/被裁切。 */
    grid-template-columns: repeat(auto-fit, minmax(min(19em, 100%), 1fr));
    grid-auto-rows: min-content;
    gap: .5vw;
    align-content: start;
}
html.tho-large .bingo-screen > .bingo-layout > .bingo-col-right > .bingo-panel-title,
html.tho-cast .bingo-screen > .bingo-layout > .bingo-col-right > .bingo-panel-title { grid-column: 1 / -1; margin-bottom: 0; }
html.tho-large .records-team,
html.tho-cast .records-team { padding: .35vw; margin-bottom: .6vh; min-width: 0; }
html.tho-large .records-team:last-child,
html.tho-cast .records-team:last-child { margin-bottom: 0; }
html.tho-large .record-item,
html.tho-cast .record-item { padding: .2em .45em; margin-bottom: .3em; }
html.tho-large .record-head,
html.tho-cast .record-head {
    display: flex; flex-wrap: wrap; align-items: baseline;
    gap: .15vw .6vw; line-height: 1.2;
}
html.tho-large .record-char, html.tho-cast .record-char { flex: 0 1 auto; min-width: 0; }
html.tho-large .record-cell, html.tho-cast .record-cell,
html.tho-large .record-player, html.tho-cast .record-player,
html.tho-large .record-result, html.tho-cast .record-result { flex: 0 0 auto; }
/* 反馈字段：按栏宽自动分列（每列至少 190px），栏越宽列越多、行数越少 */
html.tho-large .record-fields,
html.tho-cast .record-fields {
    display: grid;
    /* 每列至少 13em（≈13 个字符宽）→ 字号多大，列就多宽，字段尽量保持一行 */
    grid-template-columns: repeat(auto-fit, minmax(13em, 1fr));
    gap: 0 .7vw; margin-top: 2px; line-height: 1.15;
}
html.tho-large .rec-field,
html.tho-cast .rec-field { min-width: 0; }

/* ---------- 三级：会场大屏字号 ---------- */
html.tho-cast .bingo-title { font-size: clamp(1.7rem, 2.1vw, 4.2rem); letter-spacing: .25vw; margin: 0; }
html.tho-cast .bingo-status-badge { font-size: clamp(.95rem, 1.05vw, 2.1rem); padding: .25em 1em; border-radius: 999px; margin: 0; }
html.tho-cast .bingo-round-line { font-size: clamp(.85rem, .9vw, 1.8rem); margin: 0; }
html.tho-cast .team-panel { max-width: none; padding: .22vh 1vw; border-radius: 1vh; }
html.tho-cast .team-name { font-size: clamp(1.05rem, 1.15vw, 2.2rem); }
html.tho-cast .team-score { font-size: clamp(1.8rem, 2.2vw, 4.6rem); line-height: 1; }
html.tho-cast .team-goal { font-size: clamp(.75rem, .85vw, 1.7rem); }
html.tho-cast .vs-badge { font-size: clamp(1.4rem, 1.8vw, 3.6rem); }
html.tho-cast .bingo-cell { border-width: .2vh; border-radius: 1vh; padding: .3vh; }
html.tho-cast .bingo-cell .cell-main { font-size: clamp(1rem, 1.15vw, 2.6rem); }
html.tho-cast .bingo-cell .cell-num { font-size: clamp(.75rem, .85vw, 1.8rem); }
html.tho-cast .bingo-legend { font-size: clamp(.9rem, 1vw, 2rem); gap: 1.4vw; margin-top: .4vh !important; }
html.tho-cast .cell-mini { width: 1.1vw; height: 1.1vw; }
html.tho-cast .public-pool-chip { font-size: clamp(.8rem, .74vw, 1.5rem); }
html.tho-cast .pool-count,
html.tho-cast .pool-empty { font-size: clamp(.85rem, .9vw, 1.9rem); }
html.tho-cast .records-head { font-size: clamp(.95rem, 1vw, 2rem); margin-bottom: .2vh; }
html.tho-cast .record-head { font-size: clamp(.8rem, .88vw, 1.75rem); }
html.tho-cast .record-fields { font-size: clamp(.7rem, .76vw, 1.55rem); }
html.tho-cast .record-empty { font-size: clamp(.85rem, .9vw, 1.8rem); }
html.tho-cast .bingo-winner { padding: .55vh 2.2vw; font-size: clamp(1.05rem, 1.4vw, 2.8rem); }

/* 矮屏（如 3840x1080、3.5:1 超宽）竖向空间不足：
   vw 类字号在超宽屏上偏大，这里再压一档，优先保证两侧信息一屏可见 */
@media (max-height: 1250px) {
    html.tho-cast .bingo-title { font-size: clamp(1.3rem, 1.6vw, 3.2rem); }
    html.tho-cast .bingo-status-badge { font-size: clamp(.8rem, .85vw, 1.7rem); }
    html.tho-cast .bingo-round-line { font-size: clamp(.72rem, .76vw, 1.5rem); }
    html.tho-cast .team-name { font-size: clamp(.95rem, 1vw, 2rem); }
    html.tho-cast .team-score { font-size: clamp(1.6rem, 1.9vw, 3.8rem); }
    html.tho-cast .bingo-legend { font-size: clamp(.75rem, .8vw, 1.7rem); }
    html.tho-cast .bingo-cell .cell-main { font-size: clamp(.85rem, .95vw, 2.2rem); }
    html.tho-cast .bingo-cell .cell-num { font-size: clamp(.65rem, .7vw, 1.5rem); }
    html.tho-cast .bingo-panel-title,
    html.tho-cast .bingo-feed-title { font-size: clamp(.85rem, .9vw, 1.8rem); }
    html.tho-cast .public-pool { grid-template-columns: repeat(5, minmax(0, 1fr)); }
    html.tho-cast .public-pool-chip { font-size: clamp(.7rem, .76vw, 1.45rem); padding: .1em .3em; }
    html.tho-cast .records-head { font-size: clamp(.8rem, .85vw, 1.7rem); }
    html.tho-cast .record-head { font-size: clamp(.7rem, .76vw, 1.5rem); }
    html.tho-cast .record-fields {
        font-size: clamp(.62rem, .66vw, 1.3rem);
        grid-template-columns: repeat(auto-fit, minmax(11em, 1fr));
    }
    html.tho-cast .records-team { padding: .28vw; }
    html.tho-cast .record-item { padding: .14vh .26vw; margin-bottom: .2vh; }
    html.tho-cast .bingo-winner { padding: .4vh 1vw; font-size: clamp(.9rem, 1vw, 1.9rem); }
}

/* duel 大厅 / 匹配中（与 /bingo 同属 .bingo-screen，整屏锁定） */
html.tho-cast .duel-lobby { max-width: 40vw; margin: auto; padding: 4vh 3vw; }
html.tho-cast .duel-lobby-sub { font-size: clamp(1rem, 1.2vw, 2.6rem); }
html.tho-cast .duel-match-btn { font-size: clamp(1.4rem, 1.7vw, 3.6rem); padding: .55em 1.5em; }
html.tho-cast .duel-nick-input { font-size: clamp(1rem, 1.2vw, 2.6rem); max-width: 28vw; }
html.tho-cast .duel-waiting-text { font-size: clamp(1.2rem, 1.4vw, 3rem); }
html.tho-desktop .duel-lobby { margin: auto; }

/* ===================================================================
   崩坏的信息（/collapse）
   =================================================================== */
/* 原 .collapse-center 卡在 max-width:640px，大屏下标题会被挤成多行 → 放开 */
html.tho-cast .collapse-main-visual { min-height: auto; padding: 2vh 1vw; gap: 2vw; }
html.tho-cast .collapse-center {
    max-width: min(94vw, 1500px);
    padding: 3vh 3vw;
    gap: 2.2vh;
    border-radius: 2vh;
}
html.tho-cast .collapse-title { font-size: clamp(3rem, 4.2vw, 9rem); letter-spacing: .25vw; }
html.tho-cast .collapse-subtitle { font-size: clamp(1rem, 1.25vw, 2.8rem); }
html.tho-cast .pun-counter-block { margin: 0; }
html.tho-cast .pun-counter-label { font-size: clamp(1rem, 1.15vw, 2.5rem); }
html.tho-cast .pun-counter-number { font-size: clamp(4rem, 6vw, 13rem); }
html.tho-cast .remaining-info { font-size: clamp(1rem, 1.2vw, 2.6rem); }
html.tho-cast .muted-notice { font-size: clamp(1rem, 1.25vw, 2.8rem); }
html.tho-cast .login-prompt p { font-size: clamp(1rem, 1.25vw, 2.8rem); }
html.tho-cast .btn-submit-pun { font-size: clamp(1.2rem, 1.5vw, 3.2rem); padding: .6em 1.6em; }

/* ===================================================================
   中奖结果（/results）
   名字是唯一关键字段 → 字号够大，但压缩卡片留白，尽量一屏放下
   =================================================================== */
html.tho-cast .winner-card .prize-emoji { font-size: clamp(2rem, 2.4vw, 5rem); margin-bottom: .4vh !important; }
html.tho-cast .winner-card h3 { font-size: clamp(1.5rem, 1.7vw, 3.4rem); }
html.tho-cast .winner-card .card-body { padding: 1.4vh 1vw !important; }
html.tho-cast .winner-card .list-group-item { font-size: clamp(1.1rem, 1.25vw, 2.4rem); padding: .35em .6em; }

/* ===================================================================
   首页（/）
   =================================================================== */
html.tho-cast .tho-hero { padding: 5vh 3vw; margin-top: 1vh; }
html.tho-cast .tho-hero h1 { font-size: clamp(2.6rem, 3.6vw, 8rem); letter-spacing: .4vw; }
html.tho-cast .tho-hero .hero-emblem { font-size: clamp(3rem, 4.2vw, 9rem); }
html.tho-cast .tho-hero .hero-sub { font-size: clamp(1.1rem, 1.4vw, 3rem); }
html.tho-cast .tho-hero .hero-host,
html.tho-cast .tho-hero .hero-rule { font-size: clamp(.9rem, 1.05vw, 2.3rem); }
html.tho-cast .tho-hero .hero-welcome { font-size: clamp(1rem, 1.15vw, 2.5rem); }
html.tho-cast .tho-hero .btn { font-size: clamp(1.05rem, 1.2vw, 2.6rem); }

html.tho-cast .tho-info-card h5,
html.tho-cast .tho-act-card h5,
html.tho-cast .tho-club-card h5,
html.tho-cast .tho-booth-card h5 { font-size: clamp(1.2rem, 1.4vw, 2.9rem); }
/* 这些图标盒是固定 px 尺寸，必须与字号同步放大，否则 emoji 溢出 */
html.tho-cast .tho-info-card .ic { width: 3.4vw; height: 3.4vw; font-size: 2vw; }
html.tho-cast .tho-act-card .act-icon { width: 3.4vw; height: 3.4vw; font-size: 2vw; margin-bottom: .8vh; }
html.tho-cast .tho-club-card .club-avatar { width: 4vw; height: 4vw; font-size: 2.2vw; }
html.tho-cast .tho-act-card p,
html.tho-cast .tho-club-card .club-body,
html.tho-cast .tho-booth-card p { font-size: clamp(.95rem, 1.08vw, 2.3rem); }
html.tho-cast .tho-act-card .act-meta,
html.tho-cast .tho-act-card .act-link { font-size: clamp(.95rem, 1.05vw, 2.2rem); }
html.tho-cast .tho-timeline-item .t-date { font-size: clamp(1rem, 1.1vw, 2.3rem); }
html.tho-cast .tho-timeline-item h5 { font-size: clamp(1.1rem, 1.25vw, 2.6rem); }
html.tho-cast .tho-timeline-item p { font-size: clamp(.95rem, 1.05vw, 2.2rem); }

/* 新闻：大屏放大标题/摘要 */
html.tho-cast .tho-news-hero-card h4 { font-size: clamp(1.5rem, 1.9vw, 4rem); }
html.tho-cast .tho-news-card h5 { font-size: clamp(1.1rem, 1.3vw, 2.7rem); }
html.tho-cast .tho-news-hero-card .desc,
html.tho-cast .tho-news-card .desc { font-size: clamp(.9rem, 1vw, 2.1rem); }

/* 新闻详情正文 */
html.tho-cast .news-detail-title { font-size: clamp(2rem, 2.5vw, 5.5rem); }
html.tho-cast .news-detail-body { font-size: clamp(1.05rem, 1.2vw, 2.5rem); line-height: 1.9; }

/* 表格类页面（查询/管理/排行）关键字段 */
html.tho-cast .key-table-container { font-size: clamp(1rem, 1.05vw, 2.2rem); }
html.tho-cast .qr-container { font-size: clamp(1rem, 1.05vw, 2.2rem); }
