/* ==========================================================================
   V-POP ASIA newsite — Global styles
   Phase 3: Fixed bg video + narrow grey marquee + rectangular nav cluster
            + mid-block (YT/HOST/STARS) shared grey panel
   ========================================================================== */

/* --- Chiron Hei HK (中文 / 局部英數字型) --- */
@font-face {
    font-family: 'Chiron Hei HK';
    src: url('../../font/Chiron_Hei_HK/static/ChironHeiHK-Regular.ttf') format('truetype');
    font-weight: 400;
    font-display: swap;
}
@font-face {
    font-family: 'Chiron Hei HK';
    src: url('../../font/Chiron_Hei_HK/static/ChironHeiHK-Medium.ttf') format('truetype');
    font-weight: 500;
    font-display: swap;
}
@font-face {
    font-family: 'Chiron Hei HK';
    src: url('../../font/Chiron_Hei_HK/static/ChironHeiHK-Bold.ttf') format('truetype');
    font-weight: 700;
    font-display: swap;
}
@font-face {
    font-family: 'Chiron Hei HK';
    src: url('../../font/Chiron_Hei_HK/static/ChironHeiHK-Black.ttf') format('truetype');
    font-weight: 900;
    font-display: swap;
}

:root {
    /* Backgrounds */
    --bg-page:    #0a0a0a;          /* fallback under video bg */
    --bg-mid:     #212121;          /* mid-block (YT/HOST/STARS) — dark grey per spec */
    --bg-news:    #1a1a1a;          /* placeholder until NEWS gets its own image */
    --black:      #0A0A0A;

    /* Edge gap — distance from page edges (brand icon + nav cluster + drawer).
       60px base + 5px → brand-icon moves 5px to the right, cluster + drawer
       move 5px to the left. */
    --edge-gap:   65px;
    /* Mid-block side gap — slightly narrower (10px wider grey panel) */
    --mid-gap:    50px;

    /* Brand neon purple */
    --primary:        #9B4DFF;
    --primary-bright: #B968FF;
    --accent-pink:    #E040FB;
    --accent-light:   #E0B0FF;
    --title-pink:     #e984fc;     /* designer-spec pink for titles + divider */

    /* Text */
    --text-main:  #ffffff;
    --text-muted: rgba(255, 255, 255, 0.7);
    --text-dim:   rgba(255, 255, 255, 0.45);

    /* Typography */
    --font-en:   'Orbitron', 'Share Tech Mono', system-ui, sans-serif;
    --font-tc:   'Noto Sans TC', 'PingFang TC', 'Microsoft JhengHei', sans-serif;
    --font-mono: 'Share Tech Mono', 'Consolas', monospace;

    /* Marquee — height is 90% of the original 65px */
    --marquee-h: 58px;

    /* Nav cluster (rectangular, sits BELOW marquee) */
    --nav-cluster-top: calc(var(--marquee-h) + 16px);
    --nav-cluster-h:   56px;
}

/* ==========================================================================
   Scroll-reveal animations — IntersectionObserver toggles `.in-view`.
   Base state hides + offsets; `.in-view` slides/fades to final position.
   ========================================================================== */
.reveal {
    opacity: 0;
    transition: opacity 1.1s cubic-bezier(0.22, 1, 0.36, 1),
                transform 1.1s cubic-bezier(0.22, 1, 0.36, 1);
    will-change: opacity, transform;
}
.reveal.reveal-from-right {
    transform: translateX(140px);
}
/* 從左側飛入。這個 class 名稱原本就掛在 index_*.html 的評審陣容照片上，
   但一直沒有對應規則（只定義了 from-right / from-bottom），所以那張照片先前
   只有淡入沒有位移；補上後兩側的進場方向才對稱。
   注意：權重必須維持 0,2,0（跟 .reveal.in-view 相同）並寫在 .in-view 之前，
   後面的 .in-view{transform:none} 才蓋得掉、元素才會滑回定位。 */
.reveal.reveal-from-left {
    transform: translateX(-140px);
}
.reveal.reveal-from-bottom {
    transform: translateY(60px);
}
.reveal.in-view {
    opacity: 1;
    transform: none;
    /* Per-element stagger when entering (cards do a wave). Default 0 = no
       delay. The leave transition reads from .reveal's rule (no delay), so
       cards fade out together — only the entrance cascades. */
    transition-delay: var(--reveal-delay, 0ms);
}
@media (prefers-reduced-motion: reduce) {
    .reveal,
    .reveal.reveal-from-right,
    .reveal.reveal-from-left { opacity: 1; transform: none; transition: none; }
}


/* -------- Reset / base -------- */
* { box-sizing: border-box; }
html { scroll-behavior: smooth; }
/* 錨點捲動時在上方留白，避免內容被右上角的浮動選單藥丸壓住 */
#broadcast { scroll-margin-top: 96px; }
body {
    margin: 0;
    background: var(--bg-page);
    color: var(--text-main);
    font-family: var(--font-tc);
    font-weight: 400;
    line-height: 1.55;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    overflow-x: hidden;
}

/* ==========================================================================
   Custom cursor — applied everywhere including the first-visit splash.
   Image is the pre-resized 40 % version (46 × 43) since CSS `cursor` cannot
   scale a bitmap. Fallback to system default if the image fails to load.
   ========================================================================== */
*,
html,
body {
    cursor: url('../resource/cursor2-40.png') 0 0, auto;
}
a, button,
[role="button"], [type="button"], [type="submit"],
.star-card, .cal-day.has-event,
.nav-trigger, .splash-overlay, .splash-enter,
.cal-nav, .events-view-all, .ev-cal-btn {
    cursor: url('../resource/cursor2-40.png') 0 0, pointer;
}
img { max-width: 100%; display: block; }
a { color: inherit; text-decoration: none; }
button { font: inherit; cursor: pointer; }


/* ==========================================================================
   FIRST-VISIT SPLASH OVERLAY — full-screen, hidden after first dismiss.
   ========================================================================== */
.splash-overlay {
    position: fixed;
    inset: 0;
    z-index: 5000;
    background: url('../resource/Hero-BG.jpg') center / cover no-repeat #07020f;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 40px;
    padding: 40px;
    color: #ffffff;
    animation: splashFadeIn 0.5s ease;
}
/* Hide instantly for repeat visitors — the inline check above adds this
   class to <html> BEFORE the overlay element is parsed, so no flash. */
html.splash-seen .splash-overlay { display: none !important; }

.splash-logo {
    max-width: 760px;
    width: min(50vw, 760px);
    height: auto;
    display: block;
    filter: drop-shadow(0 0 50px rgba(155, 77, 255, 0.55));
}

.splash-text {
    text-align: center;
    color: #ffffff;
    line-height: 1.7;
    /* Light purple glow */
    text-shadow:
        0 0 14px rgba(233, 132, 252, 0.6),
        0 0 30px rgba(155, 77, 255, 0.4),
        0 2px 10px rgba(0, 2, 0, 0.55);
}
.splash-text p {
    /* +20 px size bump (~20 級 字) — each line stays as a single line.
       Mixed-font stack: Latin/numbers render in Orbitron (--font-en) Bold,
       CJK glyphs fall through to Noto Sans TC (--font-tc) Bold. */
    margin: 14px 0;
    font-family: 'Orbitron', 'Noto Sans TC', 'PingFang TC', 'Microsoft JhengHei', sans-serif;
    font-size: clamp(1.55rem, 3vw, 2.95rem);
    font-weight: 700;
    letter-spacing: 0.04em;
    white-space: nowrap;
}
.splash-channel { font-weight: 700; margin-right: 18px; }
.splash-when    { font-weight: 700; }

.splash-enter {
    margin-top: 14px;
    /* Further-reduced opacity — almost ghost-like until hovered. */
    background: rgba(255, 255, 255, 0.015);
    border: 1px solid rgba(255, 255, 255, 0.09);
    color: rgba(255, 255, 255, 0.28);
    font-family: var(--font-tc);
    font-size: 0.95rem;
    font-weight: 700;
    letter-spacing: 0.1em;
    padding: 12px 32px;
    border-radius: 999px;
    cursor: pointer;
    transition: background 0.25s ease, transform 0.25s ease, color 0.25s ease, border-color 0.25s ease, opacity 0.25s ease;
    backdrop-filter: blur(4px);
    -webkit-backdrop-filter: blur(4px);
}
.splash-enter:hover {
    background: rgba(155, 77, 255, 0.35);
    border-color: rgba(255, 255, 255, 0.7);
    color: #ffffff;
    transform: scale(1.04);
}

.splash-overlay.is-leaving {
    opacity: 0;
    transform: scale(1.04);
    transition: opacity 0.4s ease, transform 0.4s ease;
    pointer-events: none;
}

/* SKIP hint — pink chip that follows the cursor only while the user is idle */
.splash-skip {
    position: fixed;
    background: #ec4899;
    color: #ffffff;
    padding: 2px 7px;
    border-radius: 3px;
    font-family: var(--font-en);
    font-size: 0.47rem;
    letter-spacing: 0.14em;
    font-weight: 700;
    pointer-events: none;        /* never blocks clicks on the overlay */
    opacity: 0;
    transform: translateY(-2px);
    transition: opacity 0.2s ease, transform 0.2s ease;
    z-index: 5001;
    box-shadow: 0 1px 5px rgba(236, 72, 153, 0.5);
    user-select: none;
    /* Default position somewhere off-screen until JS positions it */
    top: -100px;
    left: -100px;
}
.splash-skip.is-visible {
    opacity: 1;
    transform: translateY(0);
}

@keyframes splashFadeIn {
    from { opacity: 0; }
    to   { opacity: 1; }
}

/* Splash entrance — LOGO → text → button rise from below, fade in.
   Each lands 100px below its original flex-centred position (per spec). */
@keyframes splashRiseIn {
    from { opacity: 0; transform: translateY(160px); }
    to   { opacity: 1; transform: translateY(100px); }
}
.splash-logo,
.splash-text,
.splash-enter {
    transform: translateY(100px);  /* final resting position (shifted down 100px) */
    animation: splashRiseIn 0.9s cubic-bezier(0.22, 1, 0.36, 1) both;
}
.splash-logo  { animation-delay: 0.25s; }
.splash-text  { animation-delay: 0.6s;  }
.splash-enter { animation-delay: 0.95s; }
@media (prefers-reduced-motion: reduce) {
    .splash-logo,
    .splash-text,
    .splash-enter { animation: none; transform: translateY(100px); opacity: 1; }
}

@media (max-width: 805px) {
    .splash-overlay { gap: 28px; padding: 24px; }
    .splash-logo { width: 80vw; }
    /* Mobile: allow wrap so the long line fits and bump font down a bit */
    .splash-text p {
        font-size: clamp(1.1rem, 4.5vw, 1.6rem);
        white-space: normal;
    }
    .splash-channel { margin-right: 12px; }
    .splash-enter { font-size: 0.85rem; padding: 10px 24px; }
}


/* ==========================================================================
   Page-wide fixed background video — sits behind ALL content.
   ========================================================================== */
.page-bg-video {
    position: fixed;
    top: 0;
    left: 0;
    width: 100vw;
    height: 100vh;
    object-fit: cover;
    z-index: -10;
    pointer-events: none;
}


/* ==========================================================================
   Top-left brand icon — fixed, sits below marquee
   ========================================================================== */
.brand-icon {
    position: fixed;
    /* Same vertical band as the nav cluster — both sit BELOW the marquee */
    top: var(--nav-cluster-top);
    left: var(--edge-gap);
    z-index: 1200;
    /* 90 % of cluster height (slightly smaller than the cluster) */
    width: calc(var(--nav-cluster-h) * 0.9);
    height: calc(var(--nav-cluster-h) * 0.9);
    display: flex;
    align-items: center;
    justify-content: center;
    transition: transform 0.25s ease;
}
.brand-icon:hover { transform: scale(1.05); }
.brand-icon-img {
    width: 100%;
    height: 100%;
    object-fit: contain;
    display: block;
    transform-origin: center center;
    /* Rotation angle is set by JS based on scroll position — no transition
       so the icon turns 1-to-1 with the scroll wheel for a tactile feel. */
}


/* ==========================================================================
   Top-right nav cluster — RECTANGULAR purple panel, sits BELOW marquee
   ========================================================================== */
.nav-cluster {
    position: fixed;
    top: var(--nav-cluster-top);
    right: var(--edge-gap);
    z-index: 1310;                  /* above backdrop + drawer so it stays "lit" */
    width: 270px;                   /* 90 % of original 300px */
    height: var(--nav-cluster-h);
    background: #9237f5;            /* solid brand purple per design spec */
    /* Closed: top square, bottom rounded. When the drawer is open the bottom
       corners flatten so the cluster meets the drawer's square top edge
       flush (no gap between cluster and drawer). */
    border-radius: 0 0 16px 16px;
    transition: border-radius 0.3s ease;
    padding: 0 22px 0 20px;         /* logo sits ~20px from left edge */
    display: inline-flex;
    align-items: center;
    justify-content: space-between; /* logo left, hamburger right */
    box-shadow: 0 4px 14px rgba(146, 55, 245, 0.45);
}

.nav-cluster-logo {
    display: inline-flex;
    align-items: center;
    line-height: 0;
    color: #ffffff;
}
.nav-cluster-logo-img {
    /* 110 % of previous size (0.385 × 1.1 ≈ 0.424) */
    height: calc(var(--nav-cluster-h) * 0.424);
    width: auto;
    display: block;
    transition: opacity 0.25s ease;
}
/* Half-opacity when the user hovers the cluster panel */
.nav-cluster:hover .nav-cluster-logo-img {
    opacity: 0.5;
}

/* ==========================================================================
   語系切換 —— 地球圖示 + 下拉選單，位於 LOGO 與漢堡選單之間
   --------------------------------------------------------------------------
   .nav-cluster 是 justify-content: space-between，插入這顆按鈕後三個元件會
   自動平均撐開；再加 margin-right 保證與漢堡之間至少有一段死區，手機上才不
   會誤觸。選單本身掛在 .nav-cluster（z-index 1310）底下，會蓋在抽屜之上。
   ========================================================================== */
.nav-lang {
    position: relative;
    align-self: stretch;            /* 撐滿 cluster 高度，選單才能用 top:100% 對齊底緣 */
    /* ★ 語系功能的總開關 ★
       暫時隱藏：display: none　／　要重新啟用：把 none 改回 flex。
       只要改這一個值就好，其他地方都不用動。display:none 會一次做到三件事：
         1. 地球圖示不顯示
         2. 不佔位置（藥丸裡的 LOGO 與漢堡會自動重新分配空間，不會留空洞）
         3. 完全點不到（連鍵盤 Tab 也跳過），不會展開語系面板
       HTML、JS 都原封不動保留，隨時可以一秒恢復。
       ★ 目前狀態：none（隱藏）★ */
    display: none;
    align-items: center;
    flex: 0 0 auto;                 /* 不被 flex 壓縮，圖示才不會變形 */
    /* 左右留白刻意不對稱：右邊（漢堡側）給得多，左邊（LOGO 側）給得少，
       這樣誤觸的風險落在無害的 LOGO 上，而不是會整片展開的主選單。 */
    margin-left: 8px;
    margin-right: 18px;
}
.nav-lang-trigger {
    width: 34px;
    height: 34px;
    flex: 0 0 auto;
    padding: 0;
    border: none;
    border-radius: 50%;
    background: transparent;
    color: #ffffff;                 /* 反白：白色線條壓在紫底上 */
    display: flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    transition: background-color 0.2s ease, color 0.2s ease;
}
.nav-lang-trigger svg { width: 22px; height: 22px; display: block; }
.nav-lang-trigger:hover,
.nav-lang.is-open .nav-lang-trigger {
    background: rgba(255, 255, 255, 0.18);
}
.nav-lang-trigger:focus-visible {
    outline: 2px solid #ffffff;
    outline-offset: 2px;
}

.nav-lang-menu {
    position: absolute;
    top: 100%;                      /* cluster 底緣 */
    right: 50%;
    transform: translate(50%, -12px) scaleY(0.96);
    transform-origin: top center;
    margin-top: 8px;                /* 與 cluster 之間留一點縫，跟主抽屜區隔 */
    min-width: 128px;
    background: #9237f5;            /* 同 cluster / 抽屜的品牌紫 */
    border-radius: 14px;
    /* 內距與行距沿用 .nav-drawer / .nav-drawer-list 的節奏 */
    padding: 16px 18px;
    display: flex;
    flex-direction: column;
    gap: 12px;
    box-shadow: 0 12px 30px rgba(0, 0, 0, 0.45);
    z-index: 1;
    opacity: 0;
    pointer-events: none;
    /* 與主抽屜完全相同的展開曲線與秒數 */
    transition: opacity 0.28s ease, transform 0.32s cubic-bezier(0.22, 1, 0.36, 1);
}
.nav-lang.is-open .nav-lang-menu {
    opacity: 1;
    transform: translate(50%, 0) scaleY(1);
    pointer-events: auto;
}
/* 項目的字體、字級、字重、字距、hover 動態全部比照 .nav-drawer-item /
   .nav-drawer-item-top（HOME 那一列），兩個選單的操作手感因此一致：
   滑過去是變色 + 向右位移 4px，沒有底色色塊。 */
.nav-lang-item {
    display: block;
    font-family: var(--font-en);
    font-size: 0.975rem;
    font-weight: 500;
    letter-spacing: 0.08em;
    color: #ffffff;
    text-decoration: none;
    white-space: nowrap;
    transition: color 0.2s ease, transform 0.2s ease;
}
.nav-lang-item:hover {
    color: var(--accent-light);
    transform: translateX(4px);
}
/* 目前語系：用與 hover 相同的亮紫色常駐標示，不另外加色塊 */
.nav-lang-item.is-current {
    color: var(--accent-light);
    cursor: default;
}

/* Hamburger — inside the cluster, on the right */
.nav-trigger {
    width: 30px;
    height: 30px;
    background: transparent;
    border: none;
    border-radius: 0;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 5px;
    padding: 0;
}
.nav-trigger:hover span { background: var(--accent-light); }
.nav-trigger span {
    display: block;
    width: 22px;
    height: 2px;
    background: #ffffff;
    border-radius: 2px;
    transition: transform 0.3s ease, opacity 0.25s ease, background 0.2s ease;
}
body.nav-open .nav-trigger span:nth-child(1) { transform: translateY(7px) rotate(45deg); }
body.nav-open .nav-trigger span:nth-child(2) { opacity: 0; }
body.nav-open .nav-trigger span:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }

/* When the drawer is open, flatten the cluster bottom so it meets the
   drawer's square top edge flush (no visible gap). */
body.nav-open .nav-cluster { border-radius: 0; }


/* ==========================================================================
   Hamburger Drawer (slides in from right)
   ========================================================================== */
/* Drawer = a 300×380 dropdown panel that drops down directly below the
   nav cluster — NOT a full-page slide-in. Width matches the cluster. */
.nav-drawer {
    position: fixed;
    top: calc(var(--nav-cluster-top) + var(--nav-cluster-h));
    right: var(--edge-gap);
    bottom: auto;
    width: 270px;                  /* 90 % of original 300px (cluster match) */
    height: 384px;                 /* 7 items (EPISODES restored) */
    max-width: none;
    background: #9237f5;            /* same brand purple as the cluster */
    /* Top edge flush against the rectangular cluster (square corners);
       bottom edge rounded. */
    border-radius: 0 0 16px 16px;
    color: #ffffff;
    padding: 22px 24px 22px;
    z-index: 1300;
    display: flex;
    flex-direction: column;
    box-shadow: 0 12px 30px rgba(0, 0, 0, 0.45);
    /* Drop-down animation */
    opacity: 0;
    transform: translateY(-12px) scaleY(0.96);
    transform-origin: top center;
    pointer-events: none;
    transition: opacity 0.28s ease, transform 0.32s cubic-bezier(0.22, 1, 0.36, 1);
}
body.nav-open .nav-drawer {
    opacity: 1;
    transform: translateY(0) scaleY(1);
    pointer-events: auto;
}

.nav-drawer-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    margin-bottom: 16px;
}
.nav-drawer-logo {
    display: inline-flex;
    align-items: baseline;
    gap: 3px;
    font-family: var(--font-en);
    color: #ffffff;
    line-height: 1;
}
.nav-drawer-logo .vpop-mark {
    font-size: 1.5rem;
    font-weight: 900;
    font-style: italic;
    letter-spacing: -0.02em;
}
.nav-drawer-logo .vpop-mark-thin {
    font-size: 0.85rem;
    font-weight: 700;
    font-style: italic;
    letter-spacing: 0.06em;
}
.nav-drawer-close {
    background: none;
    border: none;
    color: #ffffff;
    font-size: 1.8rem;
    line-height: 1;
    padding: 4px;
}
.nav-drawer-close:hover { color: var(--accent-light); }

.nav-drawer-list {
    display: flex;
    flex-direction: column;
    gap: 12px;
    border-top: 1px solid #ffffff;
    padding-top: 16px;
}
.nav-drawer-item {
    font-family: var(--font-en);
    font-size: 1.1rem;
    font-weight: 700;
    letter-spacing: 0.08em;
    color: #ffffff;
    transition: color 0.2s ease, transform 0.2s ease;
}
/* HOME — Orbitron Medium, font size −2px */
.nav-drawer-item-top {
    font-size: 0.975rem;
    font-weight: 500;
}
.nav-drawer-item:hover {
    color: var(--accent-light);
    transform: translateX(4px);
}
/* HIGHLIGHTS / HOST / THE 15 STARS / LATEST NEWS — Orbitron Regular, −2px */
.nav-drawer-sub {
    padding-left: 22px;
    font-size: 0.875rem;
    font-weight: 400;
    opacity: 0.92;
}
.nav-drawer-divider {
    height: 1px;
    background: #ffffff;
    margin: 18px 0 14px;
}
/* WHAT'S V-POP ASIA — Orbitron Medium, font size −2px */
.nav-drawer-footer-link {
    font-family: var(--font-en);
    font-size: 0.875rem;
    font-weight: 500;
    letter-spacing: 0.08em;
    color: #ffffff;
}
.nav-drawer-footer-link:hover { color: var(--accent-light); }

/* Invisible click-catcher — only used to close the drawer when clicking
   outside it. Stays fully transparent so the rest of the page (including
   the cluster) is NOT darkened when the drawer opens. */
.nav-backdrop {
    position: fixed;
    inset: 0;
    background: transparent;
    pointer-events: none;
    z-index: 1250;
}
body.nav-open .nav-backdrop {
    pointer-events: auto;
}


/* ==========================================================================
   HERO — transparent spacer that reveals the fixed background video
   ========================================================================== */
.hero {
    position: relative;
    width: 100%;
    height: 100vh;                 /* full-screen — homepage shows opening.mp4 first */
    min-height: 540px;
    background: transparent;
    overflow: hidden;
}

/* Marquee — full width, low-key grey text */
.hero-marquee {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: var(--marquee-h);
    background: #000000;
    display: flex;
    align-items: center;
    overflow: hidden;
    z-index: 5;
}
.hero-marquee-track {
    display: flex;
    align-items: center;
    will-change: transform;
    animation: marqueeScroll 65s linear infinite; /* slower */
}
/* Two identical groups inside the track; animating to translateX(-50%)
   lands exactly on the start of the 2nd group — fully seamless loop. */
.hero-marquee-group {
    display: inline-flex;
    align-items: center;
    gap: 28px;
    padding-right: 28px;
    flex-shrink: 0;
    white-space: nowrap;
}
.hero-marquee-item,
.hero-marquee-sep {
    font-family: var(--font-en);
    font-size: 1.25rem;            /* +2px on top of previous 1.1rem */
    font-weight: 600;
    letter-spacing: 0.02em;
    color: #b1b1b1;                /* lighter grey per spec */
    white-space: nowrap;
}
.hero-marquee-sep { font-weight: 700; }
@keyframes marqueeScroll {
    from { transform: translateX(0); }
    to   { transform: translateX(-50%); }
}


/* ==========================================================================
   MID BLOCK — shared solid grey panel for HIGHLIGHTS + HOST + 15 STARS
   (full width, no gaps between the 3 sections inside)
   ========================================================================== */
.mid-block {
    position: relative;
    /* Inset from both sides — page-bg video shows in the left/right strips */
    margin-left: var(--mid-gap);
    margin-right: var(--mid-gap);
    background: var(--bg-mid);
    color: var(--text-main);
    z-index: 1;
    overflow-x: hidden;            /* clip any inner transform overflow */
}

/* HOME VIDEO — title + big embed placed at the top of the grey panel, above 精彩片段.
   Vertical stack (title on top, video below) on the grey mid-block (no dark band). */
.home-yt-section {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 22px;
    padding: 48px 20px 24px;
}
.home-yt-title {
    text-align: center;
    color: var(--title-pink);                  /* same colour as 精彩片段 (.host-title) */
    font-size: clamp(2.5rem, 4.2vw, 3rem);     /* same size as 精彩片段 */
    margin: 0;
    /* 改為允許換行：原本 nowrap 是假設標題很短（如「EP.02 幕後花絮」），
       字級用 vw 縮放就能維持單行；但標題一旦變長（例如中文版的
       「EP.03 全新篇章精彩預告開啟！選手火力全開征服評審」），
       強制單行會讓文字縮到下限仍撐出畫面外。改成 normal 後，
       放得下時維持單行、放不下才自然折行，短標題的呈現不受影響。 */
    white-space: normal;
    overflow-wrap: anywhere;                   /* 極窄螢幕時允許在任意處斷，杜絕橫向溢出 */
}
/* English part — same font as "MEET THE NEXT VPOP IDOLS" (.stars-subtitle), but bold */
.home-yt-title .hyt-en { font-family: var(--font-en); font-weight: 700; letter-spacing: 0.06em; }
/* Chinese part — same font as "精彩片段" (.host-title) */
.home-yt-title .hyt-zh { font-family: 'Chiron Hei HK', sans-serif; font-weight: 500; letter-spacing: 0.02em; }
.home-yt-wrap {
    width: 100%;
    max-width: 1000px;
    aspect-ratio: 16 / 9;          /* YouTube's real 16:9 ratio — no forced crop */
    margin: 0 auto;
    background: #000;
    border-radius: 8px;
    box-shadow: 0 14px 34px rgba(0, 0, 0, 0.55);
}
/* border-radius on the iframe itself (not overflow:hidden on the wrap) avoids the
   macOS-Chrome venetian-blind banding over a playing iframe. */
.home-yt-iframe { width: 100%; height: 100%; border: 0; display: block; border-radius: 8px; }
@media (max-width: 799px) {
    .home-yt-section { padding: 28px 16px 16px; gap: 16px; }
}

/* Sections inside mid-block fill width, no own bg, just inner padding */
.mid-block > section {
    width: 100%;
    margin: 0;
    background: transparent;
    border-radius: 0;
}

/* HOST section keeps its bg2 image (higher specificity than the rule above,
   which would otherwise force it transparent) */
.mid-block > .host-section {
    background: url('../resource/bg2.jpg') center / cover no-repeat;
}

/* 評審陣容（圖 + 文案 + 背景）整區開關。
   display:none 會連同 .mid-block > .host-section 的 bg2.jpg 背景、
   上下 padding 與底部粉紅分隔線一起收掉，不會留下空白帶。
   要重新開啟：移除 HTML 上的 is-hidden class（這條規則可以留著備用）。 */
.host-section.judges-intro.is-hidden {
    display: none;
}


/* JUDGES (host-section) shows the grey mid-block panel — no own background. */
/* Higher specificity than `.mid-block > section { background: transparent }`
   so the judges backdrop image actually shows. */
.mid-block > .jcards-section {
    background: url('../resource/judges/judgesBG.jpg') center center / cover no-repeat #e9e9ea;
}

/* ==========================================================================
   JUDGE CARDS — looping right-to-left marquee on a photo backdrop
   ========================================================================== */
.jcards-section {
    position: relative;
    overflow: hidden;
    padding: 70px 0 64px;
}
/* 1px grey line — above the backdrop, below the cards, ~20px above card tops */
.jcards-line {
    position: absolute;
    left: 0;
    right: 0;
    top: 86px;                       /* ~20px above the card tops */
    height: 1px;
    background: rgba(0, 0, 0, 0.28);
    z-index: 1;
}
.jcards-viewport {
    position: relative;
    z-index: 2;                      /* cards sit above the line */
    overflow: hidden;
    width: 100%;
    top: -25px;                      /* nudge the whole card strip up (accumulated) */
}
.jcards-track {
    display: flex;
    width: max-content;
    /* 捲動速度：每張卡 184.344px + gap 56px = 240.344px（瀏覽器實測）。
       29 張／組 → 每組 6970px，軌道總寬 13940px，動畫位移一半 6970px。
       6970 ÷ 116s ≈ 60.09 px/s。
       沿革：24 張／144s ≈ 40 px/s → 新增 EP12 的 4 張並縮到 112s，速度變成
       1.5 倍（60.09 px/s）→ 再加入 12missko 這張（28→29 張），秒數同步從
       112s 調整到 116s，維持同樣的 60.09 px/s，觀感速度不變。
       注意：新增或移除卡片會改變軌道長度，秒數要一起重算，否則速度會跟著跑掉。 */
    animation: jcardsScroll 116s linear infinite;
}
/* 滑鼠移到卡片上時暫停。
   限定在有真正 hover 能力的裝置：iOS 觸控後 :hover 會「黏」在被點的元素上，
   不限定的話使用者點一下卡片，輪播就會停住不動，要點別處才恢復。 */
@media (hover: hover) and (pointer: fine) {
    .jcards-track:hover {
        animation-play-state: paused;
    }
}
.jcards-group {
    display: flex;
    gap: 56px;
    padding-right: 56px;             /* keeps the gap consistent across the loop seam */
}
.jcard {
    flex: 0 0 auto;
    transition: transform 0.3s ease;
    transform-origin: top center;    /* tilt swings from the clip at the top */
}
.jcard img {
    display: block;
    height: 330px;                   /* 300px × 1.1 */
    width: auto;
}
/* hovered card tilts slightly to the right (clockwise), like being picked
   （同樣限定桌機，避免 iOS 點過的卡片一直保持傾斜） */
@media (hover: hover) and (pointer: fine) {
    .jcards-track:hover .jcard:hover {
        transform: rotate(4deg);
    }
}
@keyframes jcardsScroll {
    from { transform: translateX(0); }
    to   { transform: translateX(-50%); }
}
@media (prefers-reduced-motion: reduce) {
    .jcards-track { animation-duration: 26s; }   /* 軌道變短，維持原本的捲動速度感 */
}

/* VIEW ALL — bottom-right, black text + arrow.
   Temporarily hidden per request (change `none` → `inline-flex` to restore). */
.jcards-viewall {
    display: none;
    position: absolute;
    right: 60px;
    bottom: 26px;
    z-index: 3;
    align-items: center;
    gap: 14px;
    font-family: var(--font-en);
    font-size: 1rem;
    font-weight: 400;
    letter-spacing: 0.14em;
    color: #111111;
    text-decoration: none;
}
.jcards-arrow {
    display: inline-block;
    font-size: 1.1rem;
    transition: transform 0.2s ease;
}
.jcards-viewall:hover .jcards-arrow {
    transform: translateX(6px);
}


/* ==========================================================================
   HIGHLIGHTS — 精彩片段（左文字 / 右靜態圖）
   ========================================================================== */
.yt-section {
    padding: 80px 24px 40px;
}

/* #highlights 這一區要比預設的 .yt-section 再高 40px，全部加在下方。
   .yt-section 同時被 #highlights 和 #match-score 共用，所以只針對 ID 加高，
   積分賽況那區不受影響。上緣維持 80px，內容位置完全不動，
   只有區塊下緣往下多撐 40px。
   註：下方 1279px / 799px 兩個斷點各自有對應的 #highlights 覆寫，
   把 padding-bottom 還原成該斷點的值 —— 因為 ID 選擇器優先權高於
   .yt-section，少了那兩條的話手機版會被這裡的 80px 蓋掉。 */
#highlights.yt-section {
    padding-bottom: 80px;    /* 40 + 40 */
}
/* Left text column + right static image; the 1100px container is centred so
   the image's right edge lines up exactly where the old YouTube embed's right
   edge was. */
.yt-grid {
    max-width: 1100px;
    margin: 0 auto;
    display: grid;
    grid-template-columns: 0.82fr 1.18fr;
    gap: 48px;
    align-items: center;
}
.yt-info {
    align-self: center;
    /* up-shift via margin (not transform) so the reveal fade-in — which resets
       transform to none on .in-view — doesn't cancel the offset. */
    margin-top: -30px;
}
/* yt-section text sizes (HOST styles left untouched). */
.yt-info .host-eyebrow { font-size: 0.925rem; }
.yt-info .host-title   { font-size: clamp(2.625rem, 4.2vw, 3.125rem); }
.yt-info .host-name    { font-size: 1.125rem; }
/* 4-line white copy — colour inherits from .host-name; multi-line spacing. */
.yt-copy {
    line-height: 1.95;
}
.yt-media {
    display: flex;
    justify-content: flex-end;   /* push image to the container's right edge */
    min-width: 0;
}
.yt-still {
    display: block;
    width: 100%;
    height: auto;
    border-radius: 4px;
    transform: scale(1.2);          /* 1.2× larger */
    transform-origin: right center; /* keep the right edge anchored to YT's old right side */
}

/* --------------------------------------------------------------------------
   MATCH SCORE — 最新賽況（圖左 / 文字右）
   夾在首頁影片與 HIGHLIGHTS 之間，沿用 .yt-section / .yt-grid 的排版容器與
   .host-* 的字體樣式，這裡只處理兩點差異：
   （1）左右對調 —— DOM 保持「文字在前」，桌機版用 order 把圖片移到左欄；
   （2）積分圖是直式 1080×1350，不沿用 .yt-still 為橫圖設的 1.2× 放大
        （transform 不佔版面空間，放大後會壓到左側文字欄），改用 max-width
        控制尺寸；不限寬的話整區會被撐到 700px 以上高。
   -------------------------------------------------------------------------- */
.score-grid {
    /* 兩欄都依內容寬度收合，再把整組往容器中央靠攏。
       用 fr 分欄的話兩欄會各自撐滿 1100px 的一半，圖片貼左緣、文字右側留下
       一大片空白，整組看起來會偏左。 */
    /* 圖片欄固定 460px（= .score-still 的 max-width），文字欄吃剩下的空間。
       原本兩欄都用 auto，文字一長（英日泰譯文都比中文長）就會把圖片欄壓小，
       score.jpg 跟著縮水。釘死之後圖片在各語系都是同一個比例與尺寸。
       2026-10-05：一度放大到 690px（1.5 倍），依需求已回復原本的 460px。
       這一欄的寬度必須跟 .score-still 的 max-width 一起改，只改 max-width
       的話圖片仍會被欄寬夾住，看不出變化。 */
    grid-template-columns: 460px auto;
    justify-content: center;
    gap: 56px;
    align-items: center;
}
.score-grid .yt-media {
    order: -1;                      /* 圖片移到左欄 */
    justify-content: flex-end;      /* 靠向中央側 */
}
.score-grid .yt-info {
    margin-top: 0;                  /* 蓋掉 .yt-info 為 HIGHLIGHTS 設的 -30px 上移 */
}
.score-still {
    max-width: 460px;               /* 必須與 .score-grid 的第一欄寬同步，見上方註解。 */
    transform: none;                /* 蓋掉 .yt-still 的 1.2× 放大。
                                       這裡不用 transform: scale() 放大，因為 transform
                                       不佔版面空間，放大後圖片會壓到左側文字欄上。 */
    border-radius: 8px;
}

/* ------------------------------------------------------------------
   HIGHLIGHTS：避免內文被右側照片蓋住
   ------------------------------------------------------------------
   .yt-still 帶 transform: scale(1.2) + transform-origin: right center，
   也就是右緣固定、往「左」長出 0.2 × 圖片欄寬 ≈ 124px。扣掉 48px 的 gap
   之後，還有約 76px 疊在左側文字欄上；而 .yt-media 在 DOM 中排在 .yt-info
   後面，所以照片會蓋在文字上。

   中文每行最長約 224px，離那 76px 的重疊區還很遠，所以一直沒事；
   但英日泰譯文折行後最寬可達整欄 431px，右半就正好被照片壓住。

   解法是替文字欄補上等量的右內距，讓文字提前折行、自己避開照片：
       76.14 / 431.31 ≈ 17.65%  →  取 18%，留一點餘裕
   padding 只縮小文字的內容盒，欄寬與所有區塊的位置完全不動。

   例外：
     * MATCH SCORE（.score-grid）圖片在左且 transform: none，沒有重疊 → 排除
     * 手機版（≤799px）改單欄且 .yt-still transform: none → 於該斷點歸零
   ------------------------------------------------------------------ */
.yt-grid:not(.score-grid) .yt-info {
    box-sizing: border-box;
    padding-right: 18%;
}


/* ==========================================================================
   JUDGES — 評審陣容（圖左 / 文字右）
   ========================================================================== */
.host-section {
    padding: 60px 24px 0;
    /* 1px divider in the title pink — sits flush against the bottom of the
       photo since host-section has no padding-bottom. */
    border-bottom: 1px solid var(--title-pink);
}
.host-grid {
    max-width: 1100px;
    margin: 0 auto;
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 30px;
    align-items: end;
    min-height: 380px;
}
.host-info {
    padding: 30px 0 60px;
    display: flex;
    justify-content: flex-end;     /* text block hugs the right side */
    align-self: center;            /* vertically centred while photo stays bottom-aligned */
    padding-right: 20px;
}
.host-info-inner {
    display: inline-block;
    text-align: left;
}
/* All HOST text uses the same font family, normal weight throughout (NO bold),
   title in #e984fc pink, copy in white. */
.host-eyebrow {
    font-family: 'Chiron Hei HK', sans-serif;
    font-size: 0.925rem;           /* HIGHLIGHTS eyebrow +2px */
    font-weight: 500;              /* Medium */
    letter-spacing: 0.32em;
    color: var(--title-pink);
    margin: 0 0 14px;
}
.host-title {
    font-family: 'Chiron Hei HK', sans-serif;
    font-size: clamp(2.625rem, 4.2vw, 3.125rem);   /* 精彩片段/評審 title +2px */
    font-weight: 500;              /* Medium */
    color: var(--title-pink);
    margin: 0 0 40px;
    line-height: 1.15;
    letter-spacing: 0.02em;
    white-space: nowrap;
}
.host-name {
    font-family: 'Chiron Hei HK', sans-serif;
    font-size: 1.125rem;           /* HIGHLIGHTS/評審 copy +2px */
    font-weight: 500;              /* Medium */
    color: #ffffff;
    margin: 0;
    letter-spacing: 0.04em;
    line-height: 1.85;             /* multi-line copy */
    /* 原本是 white-space: nowrap，設計上假設每個 <br> 之間的句子都夠短，
       靠 vw 縮放就能維持單行。中文成立，但英日泰譯文長得多，禁止換行的結果是
       文字直接溢出容器：手機會衝出灰底面板、桌機會被右側圖片蓋住。
       改成 normal 之後，放得下就維持單行（中文的呈現不變），放不下才自然折行，
       文案就會乖乖留在容器內。泰文詞間不寫空格，補 overflow-wrap 以防整串無處可斷。 */
    white-space: normal;
    overflow-wrap: break-word;
}
.host-photo-wrap {
    display: flex;
    justify-content: flex-start;   /* image hugs the LEFT edge */
    align-items: flex-end;         /* bottom aligns to the purple divider line */
}
.host-photo {
    display: block;
    width: 100%;
    max-width: 640px;
    height: auto;
    filter: drop-shadow(0 16px 28px rgba(0, 0, 0, 0.55));
    margin-left: -10px;
}

/* HOST（Lulu）的人物照往上微調 2px。
   注意：.host-photo 同時也用在下方評審陣容的 ep1.webp，直接改 .host-photo
   會把兩張一起移動，所以這裡用 .host-photo + .reveal-from-right 的組合鎖定
   Lulu 那張（評審那張掛的是 .reveal-from-left）。
   用 position/top 而不是 margin，是因為 .host-photo-wrap 走 align-items:flex-end，
   純粹的視覺位移不會去改變容器高度或影響其他元素的排版。 */
.host-photo.reveal-from-right {
    position: relative;
    top: -2px;
}


/* ------------------------------------------------------------------
   評審陣容主圖（ep1.webp）放大 1.3 倍 —— 僅桌機版
   ------------------------------------------------------------------
   需求：這張圖要變成「目前顯示的 1.3 倍」。
   實測基準（視窗 2170px、.host-grid 1100px）：
     圖片欄寬 535px → 原顯示 535 × 473.4
     ×1.3 → 695.5 × 615.4

   有三道尺寸限制要一起解掉，少一道就放不大：
     1) width: 100%      → 只會等於欄寬 535px，改成 130%（535 × 1.3 = 695.5）
     2) max-width: 640px → 640 < 695.5 會被卡住，改成 none
                           （寬度已由 130% × 欄寬決定，欄寬又受 .host-grid
                             的 max-width:1100px 約束，不會無限長大）
     3) flex-shrink: 1   → .host-photo-wrap 是 flex 容器，圖片比容器寬時
                           會被壓回 535px，必須設 0

   為什麼不用 transform: scale()：
   這張圖掛著 .reveal，而 .reveal.in-view 會把 transform 重設為 none，
   捲進畫面後縮放會被整個抹掉（本檔其他地方也有同樣的註記，例如 .yt-info
   選擇用 margin 而不是 transform 來位移）。所以改用 width 來放大。

   版面影響：圖片往右長 160.5px，右緣 1045 → 1205.5，距離右側文案左緣
   1281.8 還有 76.3px，不會蓋到文字。圖片原始解析度 1347×1192，放大後
   顯示 695.5px 仍是縮小顯示，不會糊。
   只掛在 ≥1280px：1279px 以下另有 .host-photo { width:auto; max-width:100% }
   的行動版規則，這裡不去干擾它。
   ------------------------------------------------------------------ */
@media (min-width: 1280px) {
    .judges-intro .host-photo {
        width: 130%;
        max-width: none;
        flex-shrink: 0;
    }
}


/* ==========================================================================
   THE 15 STARS — artist grid (inside mid-block)
   ========================================================================== */
.stars-section {
    padding: 70px 0 90px;         /* mid-block already insets 60px each side */
}
.stars-header {
    text-align: center;
    margin-bottom: 40px;
}
.stars-title {
    font-family: 'Orbitron', 'Share Tech Mono', system-ui, sans-serif;
    font-size: clamp(2.5rem, 4.6vw, 3.8rem);   /* 對照主持人字級 */
    font-weight: 500;                 /* Orbitron Medium */
    letter-spacing: 0.02em;           /* 字距更密 */
    color: var(--title-pink);
    margin: 0 0 8px;
}
.stars-subtitle {
    font-family: var(--font-en);
    font-size: 1.02rem;               /* +2 級 */
    font-weight: 400;                 /* no bold */
    letter-spacing: 0.18em;           /* 字距更密 */
    color: #ffffff;
    margin: 0;
}

.stars-grid {
    display: grid;
    /* 5 cards per row; each capped at 295px (the spec width), shrinks below
       that when the viewport can't fit 5 × 395 + gaps. */
    grid-template-columns: repeat(5, minmax(0, 295px));
    justify-content: center;
    gap: 14px;
    padding: 0 22px;
}

.star-card {
    position: relative;
    width: 100%;
    max-width: 295px;
    background: #000000;
    border: 1px solid rgba(255, 255, 255, 0.06);
    overflow: hidden;
    cursor: pointer;
    transition: transform 0.3s ease, border-color 0.3s ease, box-shadow 0.3s ease;
}

/* Single artist portrait, 295px wide, natural proportional height. */
.star-img {
    display: block;
    width: 100%;
    height: auto;
    aspect-ratio: 3 / 4;     /* reserve space before the lazy image loads — keeps
                                page height stable so #game anchor lands correctly */
    object-fit: cover;
    transition: filter 0.3s ease;
}
.star-card:hover .star-img {
    filter: blur(8px);
}

.star-card:hover {
    transform: translateY(-4px);
    border-color: rgba(155, 77, 255, 0.55);
    box-shadow: 0 12px 28px rgba(155, 77, 255, 0.35);
}

/* Name label — frosty grey semi-transparent panel, slight rounded corners.
   Stays GREY on hover (no colour shift). */
.star-card-name {
    position: absolute;
    left: 14px;
    right: 14px;
    bottom: 14px;
    padding: 8px 14px;
    background: rgba(110, 110, 110, 0.55);     /* frosty grey */
    color: #ffffff;
    border-radius: 10px;                       /* slightly rounded, not pill */
    text-align: center;
    font-family: var(--font-tc);
    font-size: 0.95rem;
    font-weight: 400;
    letter-spacing: 0.02em;
    backdrop-filter: blur(8px);
    -webkit-backdrop-filter: blur(8px);
    border: 1px solid rgba(255, 255, 255, 0.08);
    /* keep every name on ONE line so the pills stay the same height / aligned */
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
/* (no .star-card:hover .star-card-name rule — colour stays the same) */


/* ==========================================================================
   Artist detail modal
   ========================================================================== */
.artist-modal-overlay {
    position: fixed;
    inset: 0;
    background: rgba(0, 0, 0, 0.85);
    backdrop-filter: blur(6px);
    -webkit-backdrop-filter: blur(6px);
    z-index: 2000;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 30px;
    opacity: 0;
    pointer-events: none;
    transition: opacity 0.3s ease;
}
.artist-modal-overlay.visible {
    opacity: 1;
    pointer-events: auto;
}

.artist-modal-content {
    position: relative;
    width: 100%;
    max-width: 920px;
    max-height: 90vh;
    background: linear-gradient(135deg, #1a1424 0%, #0f0a1b 100%);
    border: 1px solid rgba(155, 77, 255, 0.4);
    border-radius: 18px;
    padding: 40px;
    color: #ffffff;
    overflow: auto;
    transform: scale(0.96);
    transition: transform 0.35s cubic-bezier(0.22, 1, 0.36, 1);
    box-shadow: 0 30px 80px rgba(0, 0, 0, 0.6);
}
.artist-modal-layout {
    display: flex;
    gap: 36px;
    align-items: flex-start;
}
.artist-modal-overlay.visible .artist-modal-content {
    transform: scale(1);
}

.artist-modal-close {
    position: absolute;
    top: 12px;
    right: 16px;
    width: 36px;
    height: 36px;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 0;
    background: rgba(255, 255, 255, 0.08);
    border: 1px solid rgba(255, 255, 255, 0.2);
    color: #ffffff;
    font-size: 1.6rem;
    line-height: 1;
    text-align: center;
    border-radius: 50%;
    cursor: pointer;
    z-index: 3;
    transition: background 0.2s ease;
}
.artist-modal-close:hover {
    background: rgba(255, 0, 100, 0.4);
    border-color: rgba(255, 100, 200, 0.6);
}

.artist-modal-gallery {
    flex: 0 0 340px;
    width: 340px;
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 10px;
}
.artist-modal-photo {
    width: 100%;
    aspect-ratio: 3 / 4;
    max-height: 70vh;
    background: #000;
    border-radius: 12px;
    overflow: hidden;
    position: relative;
}
.artist-modal-photo img,
.artist-modal-photo video {
    width: 100%;
    height: 100%;
    object-fit: cover;
    object-position: top center;
    display: block;
}

.artist-modal-thumbs {
    display: grid;
    grid-template-columns: repeat(12, 1fr);
    gap: 8px;
    width: 100%;
    margin-top: 20px;
}
.artist-thumb {
    aspect-ratio: 3 / 4;
    background: #000;
    border-radius: 6px;
    overflow: hidden;
    cursor: pointer;
    opacity: 0.7;
    border: 1.5px solid transparent;
    transition: opacity 0.2s ease, border-color 0.2s ease, transform 0.2s ease;
}
.artist-thumb img,
.artist-thumb video {
    width: 100%; height: 100%; object-fit: cover; display: block;
}
.artist-thumb:hover { opacity: 1; transform: translateY(-2px); }
.artist-thumb.active {
    opacity: 1;
    border-color: var(--accent-pink);
}

.artist-modal-info {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 14px;
    padding-right: 6px;
}
.artist-modal-socials {
    display: flex;
    gap: 12px;
    flex-wrap: wrap;
    margin-top: 8px;
}
.modal-social-icon {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 40px;
    height: 40px;
    border-radius: 50%;
    background: rgba(155, 77, 255, 0.12);
    border: 1px solid rgba(155, 77, 255, 0.4);
    color: rgba(255, 255, 255, 0.78);
    text-decoration: none;
    transition: background 0.2s ease, color 0.2s ease, transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease;
}
.modal-social-icon svg {
    width: 18px;
    height: 18px;
    fill: currentColor;
}
.modal-social-icon:hover {
    background: var(--accent-pink, #e984fc);
    border-color: var(--accent-pink, #e984fc);
    color: #ffffff;
    transform: translateY(-2px);
    box-shadow: 0 6px 18px rgba(233, 132, 252, 0.45);
}
.artist-modal-number {
    font-family: var(--font-en);
    font-size: calc(0.85rem + 3px);
    font-weight: 700;
    letter-spacing: 0.3em;
    color: var(--accent-light);
}
.artist-modal-name {
    font-family: var(--font-en);
    font-size: calc(2.2rem + 3px);
    font-weight: 400;
    letter-spacing: 0.04em;
    color: #ffffff;
    margin: 0;
    line-height: 1.1;
    text-shadow: 0 0 14px rgba(155, 77, 255, 0.45);
}
.artist-modal-tags {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
}
.artist-modal-tags .tag {
    display: inline-block;
    padding: 4px 12px;
    background: rgba(155, 77, 255, 0.18);
    border: 1px solid rgba(155, 77, 255, 0.45);
    border-radius: 999px;
    font-family: var(--font-en);
    font-size: 0.72rem;
    font-weight: 600;
    letter-spacing: 0.08em;
    color: var(--accent-light);
}
.artist-modal-bio {
    font-size: calc(0.95rem + 3px);
    line-height: 1.7;
    color: rgba(255, 255, 255, 0.85);
    margin: 0;
}

/* ==========================================================================
   GAME / 賽制 — tabbed rounds + video + blurred overlay card (inside mid-block)
   ========================================================================== */
.game-section {
    padding: 30px 24px 80px;
}
.game-tabs {
    max-width: 1100px;
    margin: 0 auto 16px;
    display: flex;
    gap: 28px;
    align-items: center;
    border-bottom: 1px solid rgba(255, 255, 255, 0.14);
}
.game-tab {
    font-family: var(--font-en);
    font-size: calc(1.1rem + 3px);
    font-weight: 400;
    letter-spacing: 0.06em;
    color: rgba(255, 255, 255, 0.4);     /* inactive = grey */
    background: none;
    border: none;
    padding: 10px 4px 14px;
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    gap: 14px;
    transition: color 0.2s ease;
}
.game-tab::after {
    content: '';
    width: 30px;
    height: 30px;
    flex: 0 0 auto;
    background: url('../resource/Vector2.png') no-repeat center center;
    background-size: contain;
}
.game-tab:hover { color: rgba(255, 255, 255, 0.7); }
.game-tab.is-active {
    color: var(--title-pink);            /* active = pink */
    border-bottom: 2px solid var(--title-pink);
    margin-bottom: -1px;
}
.game-tab.is-active::after {
    background-image: url('../resource/Vector1.png');
}

.game-stage {
    max-width: 1100px;
    width: 100%;
    margin: 0 auto;
    position: relative;
    border-radius: 12px;
    overflow: hidden;
    box-shadow: 0 16px 40px rgba(0, 0, 0, 0.5);
}
.game-video {
    width: 100%;
    aspect-ratio: 4 / 3;
    object-fit: contain;     /* show the whole frame, no cropping */
    display: block;
    background: #000;
}
/* blurred semi-transparent card pinned over the bottom of the video */
.game-overlay {
    position: absolute;
    left: 18px; right: 18px; bottom: 18px;
    display: flex;
    align-items: center;
    gap: 22px;
    padding: 26px 26px;
    border-radius: 14px;
    background: rgba(22, 16, 34, 0.55);
    backdrop-filter: blur(12px);
    -webkit-backdrop-filter: blur(12px);
    border: 1px solid rgba(255, 255, 255, 0.12);
}
.game-overlay-head {
    flex: 0 0 auto;
    width: 270px;
    box-sizing: border-box;
    display: flex;
    align-items: center;
    justify-content: center;   /* centre the title between the card edge and the desc */
    text-align: center;
}   /* fixed title column so the desc area is consistent across rounds */
/* tab-switch fade-in — content is applied synchronously by JS (so the text is
   ALWAYS present, never stuck invisible); this is just a one-shot fade-in
   animation that replays each time the .is-switching class is re-added. */
@keyframes gameInfoFade { from { opacity: 0; } to { opacity: 1; } }
.game-overlay.is-switching .game-overlay-head,
.game-overlay.is-switching .game-desc,
.game-overlay.is-switching .game-stars {
    animation: gameInfoFade 0.3s ease;
}
.game-badge {
    position: absolute;
    top: -18px;
    left: 0;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 205px;
    height: 60px;
    box-sizing: border-box;
    padding: 0 0 6px;          /* bottom-only padding nudges the text up ~3px */
    background: url('../resource/Vector.png') no-repeat center center;
    background-size: contain;  /* fixed plate, never scaled to the text width */
    color: #ffffff;
    font-family: var(--font-en);
    font-weight: 400;
    font-size: calc(0.95rem + 3px);
    letter-spacing: 0.06em;
    text-align: center;
    filter: drop-shadow(2px 4px 6px rgba(0, 0, 0, 0.45));
}
.game-title {
    font-family: var(--font-tc);
    font-size: calc(clamp(1.6rem, 2.2vw, 2.1rem) + 3px);
    font-weight: 700;
    color: var(--title-pink);
    margin: 0;
    line-height: 1.15;
    white-space: nowrap;   /* never wraps; only an explicit <br> breaks (desktop only) */
}

/* 非中文語系：標題譯文比中文長得多，.game-overlay-head 是固定 270px 的欄，
   維持 nowrap 會讓文字往左右兩側溢出、蓋住說明文字（泰文最明顯，因為詞與詞
   之間不寫空格，整串會被當成一個很長的字）。這裡只覆寫非 zh-TW 的頁面：
   允許換行、必要時可斷字，字級也縮一階讓它塞得進 270px。中文頁完全不受影響。 */
html:not([lang="zh-TW"]) .game-title {
    white-space: normal;
    overflow-wrap: break-word;
    font-size: clamp(1.15rem, 1.6vw, 1.5rem);
    line-height: 1.28;
}

/* 同理，MATCH SCORE 的大標繼承了 .host-title 的 nowrap。中文「第一階段 積分賽況」
   很短沒問題，但英日泰譯文長得多，單行寬度會超過文字欄，把整個 grid 撐出
   1100px 容器之外。非中文語系改成可換行（優先斷在兩個 <span> 之間的空格），
   泰文沒有詞間空格，所以額外允許必要時斷字。中文頁維持原本的單行呈現。
   （2026-10-05：圖片放大期間曾讓中文頁一併放行換行，圖片回復 460px、
     文字欄回到 420px 之後不再需要，已還原。） */
html:not([lang="zh-TW"]) .score-grid .host-title {
    white-space: normal;
    overflow-wrap: break-word;
}
/* Stacked layout (≤900): drop the two-line title break + indent so the title
   is a single line. Above 900 the overlay is a row, so the title keeps its
   desktop two-line break and won't overflow the title column. */
@media (max-width: 900px) {
    .game-title .t-break,
    .game-title .t-indent { display: none; }
}
.game-desc {
    flex: 1;
    font-family: var(--font-tc);
    font-size: calc(0.95rem + 4px);
    line-height: 1.85;
    color: rgba(255, 255, 255, 0.92);
    margin: 0;
    margin-left: -20px;   /* extend the text area ~20px further left */
}
/* "限制1/2/3" tag — replaces the ▶️ emoji with an on-theme pink pill */
.game-desc .game-rule { display: inline-block; }
.game-desc .rule-no {
    display: inline-block;
    margin-right: 10px;
    padding: 1px 10px;
    border-radius: 5px;
    background: rgba(233, 132, 252, 0.18);
    border: 1px solid rgba(233, 132, 252, 0.45);
    color: var(--title-pink);
    font-weight: 700;
    letter-spacing: 0.04em;
}
.game-stars {
    flex: 0 0 auto;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 10px;
}
.game-stars-img {
    width: auto;
    height: 96px;        /* fixed height so all 3 rounds' star graphics match —
                            keeps the card height consistent (stars3 is tall/narrow) */
    display: block;
}
/* stars.svg / stars2.svg (round 1 & 2 grids) shown at 95% */
.game-stars-img.is-grid { height: 91px; }
.game-stars-label {
    font-family: var(--font-en);
    font-size: 0.78rem;
    font-weight: 700;
    letter-spacing: 0.12em;
    color: #ffffff;
}


/* ==========================================================================
   NEWS section — calendar + BROADCAST + EVENTS
   Background: resource/event.jpg, inset matches the mid-block width
   ========================================================================== */
.news-section {
    margin: 0 var(--mid-gap);
    padding: 70px 30px 90px;
    /* Background image — its centre point aligns with the section centre,
       cover-cropped so anything beyond the section bounds is hidden. */
    background: url('../resource/on air-v.jpg') center center / cover no-repeat #1a1a1a;
    overflow: hidden;
}
/* Event banners — overlapping vinyl+poster strip that overhangs the card top. */
.event-banners {
    /* Temporarily hidden per request (唱盤 + BANNER). To restore, change
       `display: none` back to `display: flex`. Everything else is untouched. */
    display: none;
    position: relative;
    justify-content: center;
    align-items: flex-end;
    margin: -150px 0 34px;          /* pull up so banners overhang the card top */
}
.evb {
    display: block;
    line-height: 0;
    transition: transform 0.3s ease;
}
.evb img {
    height: 240px;
    width: auto;
    display: block;
    filter: drop-shadow(0 14px 26px rgba(0, 0, 0, 0.45));
}
.evb-1 { z-index: 1; }                            /* bottom layer, leftmost */
.evb-2 { z-index: 3; margin-left: -46px; }        /* overlaps onto 01 */
.evb-3 { z-index: 4; margin-left: 7px; }          /* ~7px gap */
.evb-4 { z-index: 5; margin-left: 7px; }          /* ~7px gap */
.evb-5 { z-index: 2; margin-left: -70px; }        /* tucked behind 04, above 01 */
/* only the zooming banners (02/03/04) lift to the top on hover;
   01 & 05 keep their original layer so they slide UNDER their neighbour */
.evb-2:hover,
.evb-3:hover,
.evb-4:hover { z-index: 10; transform: scale(1.2); }   /* zoom in place, on top */
.evb-1:hover { transform: translateX(-25px); }         /* slide left, stays under 02 */
.evb-5:hover { transform: translateX(25px); }          /* slide right, stays under 04 */
.news-card {
    /* +10 % overall — content + text inside scale together */
    position: relative;
    max-width: 1188px;
    margin: 0 auto;
    background: #ffffff;
    border-radius: 14px;
    padding: 77px 55px 70px;
    color: #1a1a1a;
    box-shadow: 0 20px 50px rgba(0, 0, 0, 0.35);
}
.news-grid {
    display: grid;
    /* Right side (BROADCAST + EVENTS) gets more width than the calendar */
    grid-template-columns: 1fr 1.3fr;
    gap: 55px;
    align-items: start;
}
/* Let grid tracks shrink below their content's min-content so nothing (the
   calendar, tables or long tokens) can blow the layout wider than the card and
   get clipped off-screen on narrow phones. */
.news-grid > * { min-width: 0; }

/* -------- Calendar (left) -------- */
.cal-header {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 16px;
    margin-bottom: 20px;
}
.cal-nav {
    background: none;
    border: none;
    font-size: 1.55rem;
    color: #1a1a1a;
    padding: 4px 11px;
    line-height: 1;
    cursor: pointer;
    transition: color 0.2s ease;
}
.cal-nav:hover { color: #9237f5; }
.cal-month-label {
    font-family: 'Noto Sans TC', sans-serif;
    font-size: 1.4rem;
    font-weight: 700;
    color: #1a1a1a;
    margin: 0;
    min-width: 154px;
    text-align: center;
}

.cal-weekdays {
    display: grid;
    grid-template-columns: repeat(7, 1fr);
    margin-bottom: 9px;
    transform: translate(-8px, 5px);   /* nudge weekday labels left 8 / down 5 */
}
.cal-weekdays span {
    font-family: 'Chiron Hei HK', sans-serif;
    font-size: 0.86rem;
    font-weight: 700;                   /* bold per spec */
    color: rgba(0, 0, 0, 0.4);          /* clearly grey */
    text-align: center;
    padding: 7px 0;
}

.cal-days {
    display: grid;
    grid-template-columns: repeat(7, 1fr);
}
.cal-day {
    aspect-ratio: 1 / 1.44;                    /* height doubled, width unchanged */
    border: 1px solid rgba(0, 0, 0, 0.1);
    margin: -0.5px;                            /* collapse borders */
    padding: 9px 11px;
    display: flex;
    align-items: flex-start;
    justify-content: flex-start;
    background: #ffffff;
    transition: background 0.2s ease;
    position: relative;
}
.cal-day-num {
    font-family: 'Noto Sans TC', sans-serif;
    font-size: 1.05rem;
    font-weight: 700;                   /* bold per spec */
    color: #1a1a1a;
    line-height: 1;
}
.cal-day-empty .cal-day-num {
    color: rgba(0, 0, 0, 0.25);
}
/* Days with an event — number turns brand purple so users know they can click */
.cal-day.has-event {
    cursor: pointer;
}
.cal-day.has-event .cal-day-num {
    color: #9237f5;
}
.cal-day.has-event:hover {
    background: rgba(146, 55, 245, 0.08);
}
/* Currently-selected event day — also gets a tinted background + bolder text
   to differentiate from "has-event but not selected". */
.cal-day.is-selected {
    background: rgba(146, 55, 245, 0.12);
}
.cal-day.is-selected .cal-day-num {
    color: #9237f5;
    font-weight: 700;
}

/* -------- Right column: BROADCAST + EVENTS -------- */
/* Offset so BROADCAST title lines up with the TOP of the calendar's first
   week row (clears the month-label + weekday-header band on the left). */
.news-right {
    /* 原本是 padding-top: 74px，用來讓 BROADCAST 標題的高度對齊左側月曆標頭。
       2026-10-05 BROADCAST 整塊移除後，這段留白會把 EVENTS 往下推 74px，
       與「EVENTS 版面整個上移」的需求相反，故歸零。 */
    padding-top: 0;
}
.news-block-title {
    font-family: var(--font-en);
    font-size: 2.05rem;
    font-weight: 400;
    letter-spacing: 0.04em;
    color: #1a1a1a;
    margin: 0 0 16px;
    line-height: 1;
}

/* Larger bottom gap pushes the EVENTS title down to ~middle of the 3rd week */
.broadcast-table { margin-bottom: 86px; }
.bc-head, .bc-row {
    display: grid;
    grid-template-columns: 0.7fr 1.6fr 1.7fr;
    gap: 13px;
    padding: 10px 0;
    border-bottom: 1px dashed rgba(0, 0, 0, 0.18);
    font-size: 1.1rem;
    align-items: start;              /* every column's first line starts at the same top */
}
/* Shared fixed line-height so EP / channel / date rows all align, even when the
   date font differs slightly. */
.bc-col-ep, .bc-col-title, .bc-col-date { line-height: 1.7rem; }
.bc-head {
    font-family: 'Chiron Hei HK', sans-serif;
    font-size: 1.02rem;                 /* +2 級 */
    color: rgba(0, 0, 0, 0.55);
}
.bc-row {
    text-decoration: none;
    color: #1a1a1a;
    transition: background 0.2s ease;
    border-bottom: 1px dashed #000000;   /* black dashed under EP rows */
}
.bc-row:hover { background: rgba(146, 55, 245, 0.05); }
.bc-col-ep {
    font-family: 'Chiron Hei HK', sans-serif;
    font-weight: 700;
    letter-spacing: 0.04em;
}
.bc-col-title {
    font-family: 'Noto Sans TC', sans-serif;
    font-weight: 700;
}
.bc-col-date {
    font-family: 'Chiron Hei HK', sans-serif;
    text-align: right;
    font-weight: 400;
    color: #000000;
    white-space: nowrap;
    /* same size as the channel column so the row lines up (no separate size) */
}
/* The "Date" column HEADER stays grey (only the row dates are black) */
.bc-head .bc-col-date {
    color: rgba(0, 0, 0, 0.55);
    font-family: 'Noto Sans TC', sans-serif;   /* match "Save The Date" */
    font-size: 1.02rem;
    font-weight: 700;                           /* bold */
}

/* Follow-calendar buttons — pinned to the card's top-right, level with the
   calendar month selector (‹ July 2026 ›). Aligned to the card's top/right padding. */
.news-follow {
    position: absolute;
    top: 77px;
    right: 55px;
    z-index: 2;
    display: flex;
    flex-direction: column;
    align-items: flex-end;
    gap: 6px;
}

.news-events-header {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    margin-bottom: 7px;
}
.events-view-all {
    font-family: var(--font-en);
    font-size: 0.88rem;
    font-weight: 400;
    letter-spacing: 0.08em;
    color: #000000;
    text-decoration: none;
    pointer-events: none;          /* 點擊無作用 */
    cursor: default;
}
.events-view-all:hover { color: #000000; }

.ev-head {
    display: grid;
    grid-template-columns: 1fr auto;
    gap: 13px;
    padding: 10px 0;
    border-bottom: 1px dashed rgba(0, 0, 0, 0.18);
    font-family: 'Noto Sans TC', sans-serif;
    font-size: 1.02rem;                 /* +2 級 */
    font-weight: 700;                   /* 粗體 */
    color: rgba(0, 0, 0, 0.55);
}
.ev-col-date { text-align: right; }

/* Single event row inside .events-panel */
.events-panel { min-height: 100px; }
.event-row {
    display: grid;
    grid-template-columns: 1fr auto;
    gap: 12px;
    padding: 14px 0;
    border-bottom: 1px dashed #000000;   /* black dashed line under the event row */
}
/* space-between drops the time/location meta to the BOTTOM of the row so it
   sits on the dashed line, level with the last calendar link on the right. */
.event-left { display: flex; flex-direction: column; justify-content: space-between; gap: 8px; }
.event-right { display: flex; flex-direction: column; align-items: flex-end; gap: 4px; }
.event-title {
    font-family: 'Noto Sans TC', sans-serif;
    font-size: 1.1rem;
    font-weight: 700;
    color: #1a1a1a;
    margin: 0;
    line-height: 1.3;
}
.event-title-link {
    color: inherit;
    text-decoration: none;
    background-image: linear-gradient(#9237F5, #9237F5);
    background-repeat: no-repeat;
    background-position: 0 100%;
    background-size: 0% 2px;
    transition: background-size 0.25s ease, color 0.2s ease;
}
.event-title-link:hover {
    color: #9237F5;
    background-size: 100% 2px;
}
.event-meta {
    font-family: 'Noto Sans TC', sans-serif;
    font-size: 0.9rem;
    color: rgba(0, 0, 0, 0.6);
}
.event-date {
    font-family: 'Chiron Hei HK', sans-serif;
    font-size: 1.05rem;
    font-weight: 400;
    color: #1a1a1a;
    margin-bottom: 4px;
}
.ev-cal-btn {
    font-family: 'Noto Sans TC', sans-serif;
    font-size: 0.88rem;
    color: #000000;                     /* was purple — now black per 美術 */
    text-decoration: none;
    line-height: 1.5;
    transition: color 0.2s ease;
}
.ev-cal-btn:hover { color: rgba(0, 0, 0, 0.6); }
.cal-events-empty {
    color: rgba(0, 0, 0, 0.45);
    text-align: center;
    padding: 18px 0;
    font-size: 0.9rem;
}


/* ==========================================================================
   Stubs (NEWS no longer a stub — 15 STARS implemented; this block kept for
   any future stub usage)
   ========================================================================== */
.section-stub {
    text-align: center;
    padding: 80px 24px;
    color: var(--text-main);
}
.stub-eyebrow {
    font-family: var(--font-en);
    font-size: 0.85rem;
    font-weight: 700;
    letter-spacing: 0.25em;
    color: var(--primary-bright);
    margin: 0 0 12px;
}
.stub-title {
    font-family: var(--font-en);
    font-size: 2.2rem;
    font-weight: 900;
    letter-spacing: 0.05em;
    color: rgba(255, 255, 255, 0.85);
    margin: 0 0 14px;
}
.stub-note {
    color: var(--text-muted);
    font-size: 1rem;
    max-width: 700px;
    margin: 0 auto;
}
.stub-note code {
    background: rgba(155, 77, 255, 0.18);
    border: 1px solid rgba(155, 77, 255, 0.35);
    border-radius: 6px;
    padding: 2px 8px;
    color: var(--accent-light);
    font-family: var(--font-mono);
}


/* ==========================================================================
   Footer
   ========================================================================== */
.site-footer {
    /* Inset to the same width as the mid-block + news-section so the
       page-bg video shows through on both sides */
    margin: 0 var(--mid-gap);
    background: var(--bg-mid);
    color: rgba(255, 255, 255, 0.55);
    padding: 28px 40px 22px;
    font-family: var(--font-en);
}
.footer-inner {
    max-width: 1080px;
    margin: 0 auto;
}
.footer-top {
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: 16px;
    padding-bottom: 18px;
    border-bottom: 1px solid rgba(255, 255, 255, 0.12);
}
.footer-brand-group {
    display: flex;
    flex-direction: column;       /* 法規 sits BELOW V-POP ASIA */
    align-items: flex-start;
    gap: 10px;
}
.footer-brand {
    font-size: 1.05rem;
    letter-spacing: 0.16em;
    color: rgba(255, 255, 255, 0.65);
    transition: color 0.2s ease;
}
.footer-brand:hover { color: #ffffff; }
/* "法規" label sitting next to the brand */
.footer-legal-label {
    font-family: 'Chiron Hei HK', sans-serif;
    font-size: 1.025rem;          /* +2 級 */
    letter-spacing: 0.06em;
    color: rgba(255, 255, 255, 0.55);
}
/* Two privacy links below the divider line, left-aligned, stacked */
.footer-legal-links {
    display: flex;
    flex-direction: column;
    gap: 8px;
    margin-top: 14px;
}
.footer-legal-link {
    font-family: 'Chiron Hei HK', sans-serif;
    font-size: 0.945rem;          /* +2 級 */
    letter-spacing: 0.04em;
    color: rgba(255, 255, 255, 0.55);
    text-decoration: none;
    width: fit-content;
    transition: color 0.2s ease;
}
.footer-legal-link:hover { color: var(--accent-light); }
.footer-email {
    font-family: 'Chiron Hei HK', sans-serif;
    font-size: 0.85rem;
    letter-spacing: 0.04em;
    color: rgba(255, 255, 255, 0.55);
    transition: color 0.2s ease;
}
.footer-email:hover { color: var(--accent-light); }

/* Contact block — plain text (no mailto link), two lines */
.footer-contact {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 10px;
}
/* 聯絡信箱：— same style as the V-POP ASIA brand */
.footer-contact-label {
    font-size: 1.05rem;
    letter-spacing: 0.16em;
    color: rgba(255, 255, 255, 0.65);
}
/* info@vpopasia.com — same style as the 法規 label */
.footer-contact-mail {
    font-family: 'Chiron Hei HK', sans-serif;
    font-size: 1.025rem;
    letter-spacing: 0.06em;
    color: rgba(255, 255, 255, 0.55);
}

/* Footer social icon strip — centred between V-POP ASIA brand and the email.
   Uses the same SVGs as the artist modal; links are placeholders for now. */
.footer-socials {
    display: flex;
    gap: 10px;
    flex-wrap: wrap;
    justify-content: center;
}
.footer-social-icon {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 34px;
    height: 34px;
    border-radius: 50%;
    background: rgba(155, 77, 255, 0.10);
    border: 1px solid rgba(155, 77, 255, 0.32);
    color: rgba(255, 255, 255, 0.65);
    text-decoration: none;
    transition: background 0.2s ease, color 0.2s ease, transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease;
}
.footer-social-icon svg {
    width: 15px;
    height: 15px;
    fill: currentColor;
}
/* SVG-file icons (e.g. Threads) linked via <img>; tinted white to match inline-SVG siblings */
.footer-social-icon .social-ic {
    width: 15px;
    height: 15px;
    display: block;
    object-fit: contain;
    filter: brightness(0) invert(1);
    opacity: 0.65;
    transition: opacity 0.2s ease;
}
.footer-social-icon:hover .social-ic { opacity: 1; }
.footer-social-icon:hover {
    background: var(--accent-pink, #e984fc);
    border-color: var(--accent-pink, #e984fc);
    color: #ffffff;
    transform: translateY(-2px);
    box-shadow: 0 6px 16px rgba(233, 132, 252, 0.4);
}

/* Partner / institutional logo strip — sits below the social-icon divider,
   centred, evenly spaced. Logos render in white via brightness filter so dark
   source PNGs stay visible on the dark footer. */
.footer-logos {
    display: flex;
    align-items: center;
    justify-content: center;
    flex-wrap: nowrap;            /* keep all 5 logos on one row (desktop) */
    gap: 34px;
    margin: 38px 0 4px;
}
.footer-logo {
    height: 75px;                 /* 68 × 1.1 */
    width: auto;
    object-fit: contain;
    opacity: 0.85;
    transition: opacity 0.2s ease;
}
.footer-logo-wide { height: 95px; }   /* 86 × 1.1 — culture.png has extra text lines */
.footer-logo:hover { opacity: 1; }

.footer-copy {
    font-family: 'Chiron Hei HK', sans-serif;
    text-align: center;
    margin: 18px 0 0;
    font-size: 0.78rem;
    color: rgba(255, 255, 255, 0.45);
    letter-spacing: 0.05em;
}

@media (max-width: 799px) {
    .site-footer { padding: 22px 22px 18px; }
    .footer-top {
        flex-direction: column;
        gap: 8px;
        padding-bottom: 14px;
    }
    .footer-brand { font-size: 1rem; }
    .footer-email { font-size: 0.8rem; }
    .footer-logos { flex-direction: column; gap: 28px; margin: 28px 0 4px; }
    .footer-logo { height: 66px; max-width: 86%; }
    .footer-logo-wide { height: 84px; }
    .footer-copy { font-size: 0.72rem; margin-top: 14px; }
}


/* ==========================================================================
   RWD — Tablet (800-1279)
   ========================================================================== */
@media (max-width: 1279px) {
    :root {
        --marquee-h: 54px;          /* 90% of original 60 */
        --nav-cluster-h: 58px;
    }
    .hero-marquee-item, .hero-marquee-sep { font-size: 1.15rem; }
    .hero-marquee-group { gap: 24px; padding-right: 24px; }
    /* RWD 平板/手機：首頁影片標題隨視窗寬度等比縮放（vw 為主），上限≈桌機 -2px。
       已不再強制單行（見基礎規則的 white-space），因此下限不必為了「塞進一行」
       而壓到過小；1.05rem 是窄螢幕仍可閱讀的字級，放不下時會自然折成兩行。 */
    .home-yt-title { font-size: clamp(1.05rem, 3.4vw, 2.875rem); }
    /* RWD 平板/手機：精彩片段 + 評審陣容 文字縮回原尺寸（比桌機 -2px） */
    .yt-info .host-eyebrow, .host-eyebrow { font-size: 0.8rem; }
    .yt-info .host-title,   .host-title   { font-size: clamp(2.5rem, 4.2vw, 3rem); }
    .yt-info .host-name,    .host-name    { font-size: clamp(0.75rem, 4.6vw, 1rem); }
    .yt-section { padding: 60px 20px 30px; }
    /* 還原：蓋掉桌機版 #highlights 的 +40px（ID 優先權較高） */
    #highlights.yt-section { padding-bottom: 30px; }
    /* RWD: stack the highlights text above the image, centred */
    .yt-grid {
        grid-template-columns: 1fr;
        gap: 24px;
        text-align: center;
    }
    .yt-media { justify-content: center; }
    /* stacked layout: no up-shift and no 1.2× zoom, or the enlarged image
       overflows its cell and covers the text above */
    .yt-info  { margin-top: 0; }
    /* 單欄堆疊 + 取消 1.2× 放大之後就沒有左右重疊，桌機補的右內距要歸零 */
    .yt-grid:not(.score-grid) .yt-info { padding-right: 0; }
    .yt-still { transform: none; }
    /* 最新賽況：窄螢幕跟 HIGHLIGHTS 一樣直向堆疊，取消桌機的左右對調，
       文字回到圖片上方；圖片置中並讓出邊距。 */
    .score-grid { grid-template-columns: 1fr; }
    .score-grid .yt-media { order: 0; justify-content: center; }
    .score-still { max-width: min(360px, 78vw); margin: 0 auto; }
    /* 「第一階段 積分賽況」比其他標題長很多，窄螢幕維持 nowrap 會撐破畫面；
       放行換行後會自然斷在中間的空格，變成兩行等長，字級也不必縮小。 */
    .score-grid .host-title { white-space: normal; }
    .score-grid .host-title span { white-space: nowrap; }   /* 只允許斷在兩段之間 */
    .host-section { padding: 48px 20px 0; }
    /* RWD: stack JUDGES text + photo vertically and centre everything */
    .host-grid {
        grid-template-columns: 1fr;
        min-height: auto;
        gap: 18px;
        place-items: center;
    }
    .host-info {
        padding: 8px 0 14px;
        text-align: center;
        justify-content: center;
    }
    .host-info-inner {
        position: static !important;
        left: 0 !important;
        top: 0 !important;
    }
    .host-photo-wrap { justify-content: center; }
    .host-photo {
        width: auto;
        max-width: 100%;
        flex-shrink: 1;
        margin-left: 0;
    }
    /* Tablet (800–1279px): 3 cards per row so they stay a comfortable size
       instead of being squeezed into 5 tiny columns. Phones (≤799px) drop to
       a single column in the mobile block below. */
    .stars-grid {
        grid-template-columns: repeat(3, minmax(0, 295px));
        justify-content: center;
        gap: 16px;
        padding: 0 18px;
    }
    .star-card { width: 100%; max-width: 295px; }
    .stars-section { padding: 56px 0 70px; }
    .stars-subtitle { font-size: calc(1.02rem - 4px); }   /* 平板字級 -4 */
    .artist-modal-content { padding: 30px; }
    .artist-modal-layout { gap: 24px; }
    .artist-modal-gallery { flex: 0 0 290px; width: 290px; }
    .artist-modal-name { font-size: calc(1.9rem + 3px); }

    .news-section { padding: 50px 18px 70px; }   /* banners hidden — no overhang room needed (restore to 150px top when re-enabling .event-banners) */
    .evb img { height: 190px; }
    .event-banners { margin-top: -120px; }
    /* Tablet + mobile: single flow — calendar → follow buttons → BROADCAST.
       display:contents lifts the grid's children up so the follow block (a
       sibling of the grid) can be ordered BETWEEN calendar and the right column. */
    .news-card { padding: 36px 32px; display: flex; flex-direction: column; }
    .news-grid { display: contents; }
    .news-cal    { order: 1; }
    .news-follow {
        position: static;
        order: 2;
        flex-direction: row;
        flex-wrap: wrap;
        align-items: flex-start;
        gap: 10px;
        margin: 20px 0 8px;
    }
    .news-right  { order: 3; padding-top: 0; margin-top: 24px; }
    .news-block-title { font-size: 1.55rem; }
    /* 平板的 cluster 寬度沒變（270px）但 --nav-cluster-h 變大、LOGO 跟著變寬，
       內容區只剩 230px。gap 維持 16px 的話加上地球圖示會超出 18px，flex 會把
       LOGO 壓扁，所以這裡收成 8px 並縮小地球。 */
    .nav-cluster { padding: 0 18px 0 22px; gap: 8px; }
    .nav-lang          { margin-left: 0; margin-right: 14px; }
    .nav-lang-trigger  { width: 32px; height: 32px; }
    .nav-lang-trigger svg { width: 21px; height: 21px; }
    /* RWD: logos stack one per row, centred */
    .footer-logos { flex-direction: column; gap: 32px; margin: 34px 0 4px; }
    .footer-logo { height: 75px; }
    .footer-logo-wide { height: 93px; }
}


/* ==========================================================================
   RWD — Event banners carousel (<1024)
   Narrow tablets can't fit all five 190px-tall banners side by side (the
   global img{max-width:100%} then squeezes the vinyls out of shape), so the
   one-poster carousel mode kicks in below 1024px, not just on phones.
   ========================================================================== */
@media (max-width: 1023px) {
    /* One banner at a time. The left/right vinyl discs (01/05) are the
       prev/next controls (arrows baked into the PNGs); only the current poster
       (02/03/04) shows in the centre — default 03. */
    .event-banners {
        margin-top: -72px;
        justify-content: center;
        align-items: center;
        flex-wrap: nowrap;
        gap: 0;
        padding: 6px 6px 14px;
    }
    .evb { flex: 0 0 auto; margin-left: 0; }
    /* vinyl prev/next controls */
    .evb-1, .evb-5 { cursor: pointer; z-index: 1; }
    .evb-1 { margin-right: -22px; }
    .evb-5 { margin-left: -22px; }
    .evb-1 img, .evb-5 img { height: 120px; width: auto; max-width: none; }
    /* only the current poster is visible */
    .evb-2, .evb-3, .evb-4 { display: none; position: relative; z-index: 2; }
    .evb-2.is-current, .evb-3.is-current, .evb-4.is-current { display: block; }
    .evb-2 img, .evb-3 img, .evb-4 img { height: 210px; width: auto; max-width: none; }
}


/* ==========================================================================
   RWD — Mobile (<800)
   ========================================================================== */
@media (max-width: 799px) {
    :root {
        --marquee-h: 52px;          /* 90% of original 58 */
        --nav-cluster-h: 45px;       /* 90 % of original 50px */
        --edge-gap: 16px;           /* smaller gap so the cluster fits on phones */
        --mid-gap:  16px;           /* mid-block side gap on mobile */
    }
    .nav-cluster { width: 216px; }   /* 90 % of original 240px */
    .nav-drawer  { width: 216px; }
    .hero { min-height: 88vh; }
    .hero-marquee-item, .hero-marquee-sep { font-size: 1.1rem; }
    .hero-marquee-group { gap: 22px; padding-right: 22px; }
    .hero-marquee-track { animation-duration: 48s; }

    .nav-cluster {
        padding: 0 14px 0 16px;
        /* 手機 cluster 只有 216px（內容區 186px）。LOGO 104 + 地球 28 + 間隔 8
           + 漢堡 26 = 166，兩道 gap 各 8 共 16，合計 182，剛好留 4px 餘裕。
           gap 若維持 12px 會超出 8px，flex 會把 LOGO 壓扁。 */
        gap: 8px;
    }
    .nav-trigger { width: 26px; height: 26px; }
    .nav-trigger span { width: 18px; }
    /* 語系切換：按鈕縮小、與漢堡的間隔收窄但仍保留約 18px 死區。 */
    .nav-lang          { margin-left: 0; margin-right: 8px; }
    .nav-lang-trigger  { width: 28px; height: 28px; }
    .nav-lang-trigger svg { width: 18px; height: 18px; }
    .nav-lang-menu     { min-width: 112px; padding: 14px 16px; gap: 11px; margin-top: 6px; }
    .nav-lang-item     { font-size: 0.9rem; }

    /* Drawer stays 300x380 dropdown on mobile too (spec) */

    .yt-section { padding: 36px 14px 24px; }
    #highlights.yt-section { padding-bottom: 24px; }
    .host-section { padding: 30px 16px 0; }
    .host-grid {
        grid-template-columns: 1fr;
        min-height: auto;
        gap: 0;
    }
    .host-info { padding: 8px 0 14px; text-align: center; justify-content: center !important; }
    /* margin:auto on a flex item absorbs free space equally → always centred,
       regardless of any leaked justify-content:flex-end from wider breakpoints. */
    .host-info-inner {
        position: static !important;
        left: 0 !important;
        top: 0 !important;
        text-align: center;
        margin-left: auto !important;
        margin-right: auto !important;
    }
    .host-photo-wrap { justify-content: center; }
    /* Mobile: same natural-scale behaviour; no fixed cap so the image is free
       to size itself based on container + intrinsic dimensions. */
    .host-photo {
        width: auto;
        max-width: 100%;
        margin-left: 0;
        flex-shrink: 1;
    }

    .stars-section { padding: 40px 0 56px; }
    /* Mobile: keep a fixed 3-per-row grid (same as tablet) instead of 1-by-1 */
    .stars-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); justify-content: center; gap: 8px; padding: 0 12px; }
    .star-card { width: 100%; max-width: none; }
    .stars-title { font-size: 1.8rem; }
    .stars-subtitle { font-size: 0.72rem; letter-spacing: 0.1em; white-space: nowrap; }   /* 手機縮小且不斷行 */
    /* Name scales with the phone width (clamp) so long names like Checkmate /
       TJ 王太極 fit on one line across all phone sizes and stay aligned. */
    .star-card-name { font-size: clamp(0.5rem, 2.9vw, 0.85rem); padding: 4px 5px; left: 5px; right: 5px; bottom: 5px; }

    /* NEWS section — stack vertically on mobile */
    .news-section { padding: 36px 12px 56px; }   /* banners hidden (restore to 110px top when re-enabling .event-banners) */
    /* Phones: scale the whole vinyl+poster group with the viewport (vw with a
       px cap) so the discs can never run off-screen — 26vw + 50vw + 26vw minus
       the two 6vw overlaps ≈ 90vw, always inside the card. */
    .evb-1 img, .evb-5 img { height: min(26vw, 120px); }
    .evb-2 img, .evb-3 img, .evb-4 img { height: min(50vw, 210px); }
    .evb-1 { margin-right: -6vw; }
    .evb-5 { margin-left: -6vw; }
    .event-banners { margin-top: -56px; }
    .news-card { padding: 26px 20px 24px; border-radius: 12px; }
    .news-follow { position: static; flex-direction: row; flex-wrap: wrap; align-items: flex-start; gap: 10px; margin: 16px 0 6px; }
    .news-grid { grid-template-columns: 1fr; gap: 32px; }
    .news-right { padding-top: 0; }       /* no cross-column offset when stacked */
    .broadcast-table { margin-bottom: 32px; }
    .news-block-title { font-size: 1.4rem; }
    .cal-day { padding: 6px 4px; }
    .cal-day-num { font-size: 0.8rem; }
    .cal-weekdays span { font-size: 0.7rem; }
    /* don't let the month label force a fixed width on tiny screens */
    .cal-month-label { min-width: 0; font-size: 1.25rem; }
    /* follow-calendar buttons + event text wrap instead of pushing off-screen */
    .news-follow { width: 100%; }
    .news-follow .ev-cal-btn, .event-title, .event-meta { white-space: normal; overflow-wrap: anywhere; }
    /* Give the Time column the widest share (borrowing from Episodes + channel)
       so every date+time stays on ONE line and can extend left toward the
       channel column instead of ever wrapping. */
    /* Uniform row font (EP / channel / date) so they line up; +1 (was +3, which
       overflowed). Wider Time column + nowrap on the channel keeps "首播/上線" and
       every date on one line, inside the white card. */
    .bc-head, .bc-row { grid-template-columns: 0.6fr 1fr 1.4fr; gap: 4px; font-size: calc(0.82rem + 1px); align-items: start; }
    .bc-col-title, .bc-col-date { white-space: nowrap; }
    .event-title { font-size: 0.95rem; }
    .ev-cal-btn { font-size: 0.78rem; }

    /* Modal: stack vertically on mobile */
    .artist-modal-overlay { padding: 14px; }
    .artist-modal-layout { flex-direction: column; gap: 18px; }
    .artist-modal-gallery { flex: 1 1 auto; width: 100%; max-width: 260px; margin: 0 auto; }
    .artist-modal-info { width: 100%; }
    .artist-modal-content {
        padding: 22px 18px 18px;
        max-height: 92vh;
    }
    .artist-modal-name { font-size: calc(1.6rem + 3px); }
    .modal-social-icon { width: 36px; height: 36px; }
    .modal-social-icon svg { width: 16px; height: 16px; }

    .section-stub { padding: 48px 18px; }
    .stub-title { font-size: 1.6rem; }
}

/* GAME / 賽制 — stack the overlay card on narrow screens */
@media (max-width: 900px) {
    .game-section { padding: 24px 14px 56px; }
    /* Mobile: drop the star icon and keep each label on ONE line (no wrap).
       Smaller font lets the three 4-char tabs fit a phone row. */
    .game-tabs { gap: 8px; justify-content: space-between; }
    .game-tab {
        display: block;
        flex: 0 0 auto;
        font-size: 0.85rem;
        width: auto;
        padding: 8px 6px 10px;
        white-space: nowrap;     /* 第一階段 stays on one line */
        text-align: center;
        line-height: 1.2;
    }
    .game-tab::after { display: none; }
    .game-overlay {
        position: relative;          /* badge anchors to the card top-left */
        inset: auto;                 /* clear desktop left/right/bottom:18px so it isn't pushed off-centre */
        margin-top: 14px;
        flex-direction: column;
        align-items: flex-start;
        gap: 18px;
        padding: 58px 22px 26px;     /* extra top padding so the title clears the badge */
        min-height: 0;               /* size to content — no oversized empty card */
        box-sizing: border-box;
        justify-content: flex-start;
    }
    .game-overlay-head { width: auto; }
    .game-desc { margin-left: 0; }
    .game-stage { overflow: visible; }
    /* stars sit right under the desc (no margin-top:auto pushing them to the bottom) */
    .game-stars { flex-direction: row; align-self: center; margin-top: 4px; }
    .game-stars-img { width: auto; height: 76px; }
    .game-stars-img.is-grid { height: 72px; }
}


/* ==========================================================================
   POPULARITY — 人氣值排行（橫向長條圖）
   位於 mid-block 最上方、首頁影片之前。資料由 js/popularity.js 於載入時
   讀取根目錄的 popularity.json 後動態產生。
   本段只新增 .pop-* 類別，未修改任何既有選擇器。
   ========================================================================== */
.pop-section { padding: 80px 24px 20px; }
/* JS 讀取成功前（或讀取失敗時）整區不顯示 */
.pop-section[hidden] { display: none; }

.pop-head {
    max-width: 1100px;
    margin: 0 auto 40px;
    text-align: center;
}
/* 人氣投票活動說明。
   字型／字級／字重／顏色完全沿用 .host-name（同 MATCH SCORE 下方那段白字），
   但必須解除 .host-name 的 white-space: nowrap —— 這段有 50 字以上的長句，
   不換行的話桌機會撐破 1100px 容器、手機更是直接橫向溢出。
   標題原本的 40px 下緣改由本段接手，所以把 .host-title 的下留白抵銷掉。 */
.pop-copy {
    white-space: normal;
    margin: 0;
    line-height: 1.95;              /* 同 .yt-copy，密集文字才不擁擠 */
}
/* 前三行：招募文，置中。 */
.pop-copy--lead  { margin-top: -18px; text-align: center; }
/* 後三行：活動辦法，同樣置中，字級比上半段小 4px。 */
.pop-copy--rules { text-align: center; font-size: 0.875rem; }   /* 1.125rem(18px) − 4px */
/* 兩段之間的紫色分隔線，顏色沿用站上既有的 --title-pink。 */
.pop-divider {
    width: 100%;
    height: 0;
    border: 0;
    border-top: 1px solid var(--title-pink);
    opacity: 0.55;
    margin: 26px 0 22px;
}
.pop-updated {
    font-family: var(--font-mono);
    font-size: 0.8rem;
    letter-spacing: 0.08em;
    color: var(--text-dim);
    margin: 18px 0 0;
}
.pop-updated:empty { display: none; }

.pop-chart {
    max-width: 1100px;
    margin: 0 auto;
    padding: 0;
    list-style: none;
    display: flex;
    flex-direction: column;
    gap: 14px;
}
.pop-item { display: block; }
/* 一列本身就是連結（有對到 IG 時是 <a>，對不到時退回 <div>） */
.pop-row {
    display: grid;
    /* 欄序：選手名稱＋IG 圖示 → 百分比數字 → 長條圖。
       數字改放長條左側，長條因此往右挪；DOM 順序在 js/popularity.js 也是同一順序。 */
    grid-template-columns: 142px 72px 1fr;
    align-items: center;
    gap: 14px;
    text-decoration: none;
    color: inherit;
}
a.pop-row { cursor: pointer; }
.pop-name {
    display: flex;
    align-items: center;
    gap: 6px;
    min-width: 0;                  /* 讓裡面的文字能正常省略 */
    font-family: 'Chiron Hei HK', sans-serif;
    font-size: 1rem;
    font-weight: 500;
    letter-spacing: 0.02em;
    color: var(--text-main);
}
/* 選手頭像：26×26 圓形。26px 正好等於長條軌道高度，是不會把列撐高的上限
   （實測 28px 就會讓每列從 26px 變成 28px），同時看起來像是刻意對齊長條。 */
.pop-av {
    flex: 0 0 auto;
    width: 26px;
    height: 26px;
    border-radius: 50%;
    object-fit: cover;
    background: rgba(255, 255, 255, 0.08);   /* 圖片載入前的底色，避免閃白 */
}
.pop-name-text {
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
/* IG 圖示：平常淡淡的，滑過該列才亮起來，用來提示這列可以點 */
.pop-ig {
    width: 13px;
    height: 13px;
    flex: 0 0 auto;
    opacity: 0.38;
    transition: opacity .2s ease, color .2s ease;
}
/* 灰底軌道 = 最高人氣值的滿刻度，所有長條共用同一把尺 */
.pop-track {
    position: relative;
    height: 26px;                   /* 夠厚才看得出裡面的流光 */
    background: rgba(255, 255, 255, 0.06);
    border-radius: 6px;
    overflow: hidden;
}
.pop-bar {
    position: absolute;
    top: 0; bottom: 0; left: 0;
    width: var(--pop-w, 0%);
    /* 人氣值差距很大（最低約為最高的 1%），純比例會讓末段幾條細到幾乎消失，
       所以給一個最小寬度。但這個值不能設大 —— 設成 30px 以上時，末三名
       （544 / 454 / 254）會被一起撐成同樣長度，反而看不出彼此差距。
       12px 剛好保住可見度又保留比例。實際數值一律以左側數字為準。 */
    min-width: 12px;
    border-radius: 6px;
    background: linear-gradient(90deg, var(--primary), var(--title-pink));
    overflow: hidden;
}
/* 流光：固定寬度的高光帶沿著長條掃過。
   長條本身的寬度是直接給定、不做進場動畫（開頁即為正確長度），
   會動的只有這一層高光。 */
.pop-bar::after {
    content: '';
    position: absolute;
    inset: 0;
    background-image: linear-gradient(100deg,
        rgba(255, 255, 255, 0)    0%,
        rgba(255, 255, 255, 0.55) 50%,
        rgba(255, 255, 255, 0)    100%);
    background-size: 160px 100%;
    background-repeat: no-repeat;
    animation: popShine var(--pop-dur, 3s) linear var(--pop-delay, 0s) infinite;
}
@keyframes popShine {
    from { background-position: -160px 0; }
    to   { background-position: calc(100% + 160px) 0; }
}
/* 整列滑過時微微提亮：名稱在最左、數值在最右，中間隔著長長的長條，
   有一條淡淡的底色比較好對照同一列。 */
.pop-row:hover .pop-track { background: rgba(255, 255, 255, 0.10); }
.pop-row:hover .pop-name,
.pop-row:hover .pop-value { color: #ffffff; }
a.pop-row:hover .pop-ig   { opacity: 1; color: var(--title-pink); }
a.pop-row:focus-visible   { outline: 2px solid var(--title-pink); outline-offset: 4px; border-radius: 4px; }
.pop-name, .pop-value, .pop-track { transition: color .2s ease, background-color .2s ease; }

.pop-value {
    font-family: var(--font-mono);
    font-size: 1.075rem;            /* 0.95rem(15.2px) + 2px */
    color: var(--text-muted);
    /* 靠右：數字的右緣會對齊長條起點，長短不一的數值看起來仍是一直線。 */
    text-align: right;
    font-variant-numeric: tabular-nums;
}
@media (prefers-reduced-motion: reduce) {
    .pop-bar::after { animation: none; }
}
@media (max-width: 799px) {
    .pop-section { padding: 48px 16px 12px; }
    .pop-head    { margin-bottom: 28px; }
    .pop-chart   { gap: 10px; }
    /* 名稱欄加寬、數值欄縮窄：加了頭像之後 96px 放不下「頭像＋Checkmate＋IG 圖示」，
       名字會被截成「Checkm…」。數值最長只有「51.9%」，58px 用不到，勻 14px 過去。 */
    .pop-row     { grid-template-columns: 120px 56px 1fr; gap: 7px; }
    .pop-av      { width: 20px; height: 20px; }   /* 20px 是手機不撐高列的上限（列高 21.06px） */
    .pop-ig      { width: 11px; height: 11px; }
    .pop-name    { gap: 5px; }
    .pop-name    { font-size: 0.85rem; }
    .pop-value   { font-size: 0.905rem; }   /* 0.78rem(12.5px) + 2px */
    .pop-copy--rules { font-size: 0.75rem; }
    .pop-divider { margin: 20px 0 16px; }
    .pop-track   { height: 20px; }
    .pop-bar     { min-width: 10px; }
}
