/* ═══════════════════════════════════════════════════════════════════════════
   OddsDiff 웹 디자인 시스템 — v2 (플래시스코어형 · 라이트/다크 전환)
   ───────────────────────────────────────────────────────────────────────────
   구조 원칙 (플래시스코어에서 가져온 것)
     · 좌측 리그 트리 → 본문 리그별 그룹 → 초압축 경기 행. 3단 그리드.
     · 헤더는 라이트/다크 모두 어둡게 유지한다(브랜드 식별의 축).
     · 경기 행은 40px 안팎. 정보가 화면을 채우는 것이 이 도메인의 미학이다.
     · 날짜 스트립으로 어제/오늘/내일을 한 번에 이동한다.

   색 규칙 (의뢰인 확정 사항 — 절대 바꾸지 않는다)
     · 국내(배트맨)가 유리 = 붉은색   · 해외가 유리 = 푸른색
     · 리그 배지는 리그명 해시로 hue를 배정해 언제나 같은 색

   테마
     · 토큰 이름은 v1과 동일하다 → 기존 페이지가 수정 없이 두 테마를 탄다.
     · <html data-theme="light|dark">. 미지정이면 OS 설정을 따른다.
     · 최초 페인트 전에 wwwroot/theme.js가 data-theme을 세팅해 깜빡임을 막는다.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── 1. 토큰 ───────────────────────────────────────────────────────────── */

:root {
    /* 헤더는 두 테마 공통으로 어둡다 */
    --hdr: #171a1e;
    --hdr-2: #1f242a;
    --hdr-line: #2b3239;
    --hdr-text: #e7eaee;
    --hdr-text-2: #9aa4ae;

    /* 의미색 — 테마와 무관하게 같은 뜻을 갖는다 */
    --dom: #e0574c;
    --for: #3d82d0;
    --ok: #1faa6c;
    --warn: #d99b2b;
    --danger: #d64a45;

    /* 타이포 */
    --font: -apple-system, "Segoe UI", Roboto, "Malgun Gothic", "Apple SD Gothic Neo", "Noto Sans KR", sans-serif;
    --mono: ui-monospace, "SF Mono", "Cascadia Mono", Consolas, "D2Coding", monospace;

    /* 치수 */
    --hdr-h: 50px;
    --sport-h: 38px;
    --sub-h: 40px;
    --shell: 1500px;
    --nav-w: 212px;
    --aside: 286px;
    /* sticky 요소가 헤더 아래에 붙는 높이. 헤더는 1행(로고)+2행(종목탭)이 함께 고정되므로 둘을 더한다.
       종목탭이 없는 페이지에서는 38px만큼 여유가 더 생기는데, 모자라서 내용이 가리는 것보다 낫다. */
    --stick: calc(var(--hdr-h) + var(--sport-h));
    --r: 3px;
    --r-2: 6px;
    --r-3: 10px;
}

/* 다크 (기본) */
:root, :root[data-theme="dark"] {
    color-scheme: dark;

    --bg: #14171a;
    --surface: #1b1f23;
    --surface-2: #23282d;
    --surface-3: #2b3137;
    --surface-4: #343b42;

    --line: #303840;
    --line-soft: #23292f;
    --line-strong: #3e474f;

    --text: #e4e8ec;
    --text-2: #a2acb5;
    /* 표면 대비 AA(4.5:1)를 넘기면서 3→4 위계를 유지한다. 이전 #79838d/#5b646d는 4.30/2.75로 낮았다. */
    --text-3: #8d969f;
    --text-4: #7e8892;

    --accent: #4d90d8;
    /* 흰 글자를 얹는 <b>채워진 면</b> 전용. --accent(#4d90d8)는 흰색 대비 3.3:1로 AA(4.5:1) 미달이라
       주 버튼 라벨이 밝은 곳에서 묻힌다. --accent 자체를 낮추면 이 토큰을 글자색으로 쓰는 곳
       (.faq .qm, .tbl.grouped .gh-for)이 반대로 미달이 되므로, 배경용만 따로 갈라 둔다.
       색상(210°)은 그대로 두고 명도만 낮춘 값이다 — 흰색 대비 5.4:1,
       :hover 의 brightness(1.1) 상태에서도 4.7:1로 AA를 유지한다.
       라이트 테마의 --accent(#1f6dc0)는 이미 5.3:1이라 같은 값을 그대로 쓴다. */
    --accent-solid: #2a6bb0;
    --accent-2: #74aae6;
    --accent-dim: rgba(77, 144, 216, .14);
    --accent-line: #3a5f8a;

    --dom-soft: #f09a92;
    --dom-tint: rgba(224, 87, 76, .17);
    --dom-sw: rgba(224, 87, 76, .72);
    --for-soft: #93c0ee;
    --for-tint: rgba(61, 130, 208, .07);
    --for-sw: rgba(61, 130, 208, .72);

    --ok-soft: #6fd6a6;
    --ok-dim: rgba(31, 170, 108, .14);
    --warn-soft: #e6bd6e;
    --warn-dim: rgba(217, 155, 43, .14);
    --danger-soft: #ef9490;
    --danger-dim: rgba(214, 74, 69, .14);

    /* PREMIUM TIP 강조(보라) — 국내(적)·해외(청)·가치(녹)와 겹치지 않는 유일한 계열.
       -2는 행 테두리 그라데이션 링의 밝은 끝이다(§16 .mrow.is-tip). */
    --tippick: #977ef0;
    --tippick-2: #bfa8fa;
    --tippick-dim: rgba(139, 92, 246, .16);

    --pop: 0 12px 34px rgba(0, 0, 0, .55), 0 2px 6px rgba(0, 0, 0, .35);
    --pop-sm: 0 6px 18px rgba(0, 0, 0, .45);
    --row-alt: rgba(255, 255, 255, .016);
    --row-hover: rgba(255, 255, 255, .05);
    --lg-l: 27%;      /* 리그 배지 명도 — 다크에선 어둡게 */
    --lg-bl: 40%;
    --lg-fg: #eef2f7;
}

/* 라이트 */
:root[data-theme="light"] {
    color-scheme: light;

    --bg: #eceef1;
    --surface: #ffffff;
    --surface-2: #f5f7f9;
    --surface-3: #e9edf1;
    --surface-4: #dde3e9;

    --line: #dadfe5;
    --line-soft: #e8ecf0;
    --line-strong: #c3cbd4;

    --text: #14181c;
    --text-2: #4b555f;
    /* WCAG AA(4.5:1) 충족을 위해 어둡게 잡는다 — 흰 배경에서 #6f7a85는 4.38로 미달이었다. */
    --text-3: #5f6973;
    --text-4: #6a747e;

    --accent: #1f6dc0;
    --accent-solid: #1f6dc0;   /* 라이트는 이미 흰색 대비 5.3:1 — 다크와 달리 나눌 필요가 없다 */
    --accent-2: #17559a;
    --accent-dim: rgba(31, 109, 192, .09);
    --accent-line: #a9c6e6;

    --dom-soft: #c43024;
    --dom-tint: rgba(224, 87, 76, .13);
    --dom-sw: rgba(196, 48, 36, .8);
    --for-soft: #1c5fa8;
    --for-tint: rgba(61, 130, 208, .06);
    --for-sw: rgba(28, 95, 168, .8);

    --ok-soft: #10784b;
    --ok-dim: rgba(31, 170, 108, .12);
    --warn-soft: #8f6410;
    --warn-dim: rgba(217, 155, 43, .16);
    --danger-soft: #b32e29;
    --danger-dim: rgba(214, 74, 69, .11);

    --tippick: #6d3fd1;
    --tippick-2: #9a6cf0;
    --tippick-dim: rgba(124, 58, 237, .1);

    --pop: 0 12px 30px rgba(23, 32, 43, .16), 0 2px 6px rgba(23, 32, 43, .08);
    --pop-sm: 0 4px 14px rgba(23, 32, 43, .12);
    --row-alt: rgba(16, 24, 32, .022);
    --row-hover: rgba(16, 24, 32, .05);
    --lg-l: 38%;
    --lg-bl: 32%;
    --lg-fg: #ffffff;
}

/* OS 설정이 라이트인데 사용자가 고르지 않았으면 라이트로 */
@media (prefers-color-scheme: light) {
    :root:not([data-theme]) {
        color-scheme: light;
        --bg: #eceef1; --surface: #ffffff; --surface-2: #f5f7f9; --surface-3: #e9edf1; --surface-4: #dde3e9;
        --line: #dadfe5; --line-soft: #e8ecf0; --line-strong: #c3cbd4;
        --text: #14181c; --text-2: #4b555f; --text-3: #5f6973; --text-4: #6a747e;
        --accent: #1f6dc0; --accent-solid: #1f6dc0; --accent-2: #17559a; --accent-dim: rgba(31, 109, 192, .09); --accent-line: #a9c6e6;
        --dom-soft: #c43024; --dom-tint: rgba(224, 87, 76, .13); --dom-sw: rgba(196, 48, 36, .8);
        --for-soft: #1c5fa8; --for-tint: rgba(61, 130, 208, .06); --for-sw: rgba(28, 95, 168, .8);
        --ok-soft: #10784b; --ok-dim: rgba(31, 170, 108, .12);
        --warn-soft: #8f6410; --warn-dim: rgba(217, 155, 43, .16);
        --danger-soft: #b32e29; --danger-dim: rgba(214, 74, 69, .11);
        --tippick: #6d3fd1; --tippick-2: #9a6cf0; --tippick-dim: rgba(124, 58, 237, .1);
        --pop: 0 12px 30px rgba(23, 32, 43, .16), 0 2px 6px rgba(23, 32, 43, .08);
        --pop-sm: 0 4px 14px rgba(23, 32, 43, .12);
        --row-alt: rgba(16, 24, 32, .022); --row-hover: rgba(16, 24, 32, .05);
        --lg-l: 38%; --lg-bl: 32%; --lg-fg: #ffffff;
    }
}

/* ── 1-b. 테마 전환 페이드 ──────────────────────────────────────────────
   theme.js가 토글 순간에만 <html>에 .theme-fade를 걸어 두었다가 340ms(전환 300ms + 여유) 뒤 벗긴다.
   그 창 동안 모든 요소의 색 계열 속성이 이어져 라이트↔다크가 서서히 갈아탄다(iOS의 외형 전환 느낌).
   상시로 걸지 않는 이유는 theme.js 주석에 있다(재렌더 출렁임·컴포지팅 비용).
   !important는 이 창 동안 개별 요소의 transition 선언(transform 등)을 잠시 덮지만,
   320ms 내 상호작용 애니메이션 손실은 체감되지 않고 색 전환의 일관성이 더 중요하다. */
html.theme-fade,
html.theme-fade *,
html.theme-fade *::before,
html.theme-fade *::after {
    transition: background-color .3s ease, color .3s ease, border-color .3s ease,
                fill .3s ease, stroke .3s ease, box-shadow .3s ease, outline-color .3s ease !important;
}

/* ── 2. 리셋 ───────────────────────────────────────────────────────────── */
*, *::before, *::after { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; }

body {
    margin: 0; min-height: 100%;
    background: var(--bg); color: var(--text);
    /* 기준 14px — 13px에서 상향(2026-08-23 의뢰인: "전체적으로 폰트가 너무 작아서 안 보인다"). */
    font-family: var(--font); font-size: 14px; line-height: 1.5;
    -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility;
    transition: background-color .16s ease, color .16s ease;
}

h1, h2, h3, h4, h5, h6 { margin: 0; font-weight: 700; line-height: 1.3; }
p { margin: 0; }
ul, ol { margin: 0; padding: 0; list-style: none; }
a { color: inherit; text-decoration: none; }
button { font-family: inherit; font-size: inherit; color: inherit; }
img { max-width: 100%; display: block; }
table { border-collapse: collapse; width: 100%; }
:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; border-radius: 2px; }

/*  사용자가 써 넣은 본문에만 강제 줄바꿈을 건다. 한글은 어디서나 끊기지만 라틴 연속(URL)은 안 끊겨서,
    .panel { overflow: hidden } 안에서는 넘친 글자가 스크롤도 없이 그냥 잘려 나간다(읽을 방법이 없다).
    body 전역에 걸지 않는 이유 — 배당 그리드·숫자 셀의 줄바꿈까지 바뀌어 표 정렬이 흔들린다. */
.post-body, .cmt-body, .doc, .modal-body { overflow-wrap: anywhere; }

.mono { font-family: var(--mono); font-variant-numeric: tabular-nums; }
.muted { color: var(--text-3); }
.dim { color: var(--text-2); }
.nowrap { white-space: nowrap; }
.tr { text-align: right; }
.tc { text-align: center; }
.sr { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }

* { scrollbar-width: thin; scrollbar-color: var(--line-strong) transparent; }
*::-webkit-scrollbar { width: 10px; height: 10px; }
*::-webkit-scrollbar-thumb { background: var(--line-strong); border-radius: 5px; border: 2px solid var(--bg); }
*::-webkit-scrollbar-track { background: transparent; }

/* ── 3. 셸 ─────────────────────────────────────────────────────────────── */
.site { display: flex; flex-direction: column; min-height: 100vh; }
.wrap { width: 100%; max-width: var(--shell); margin: 0 auto; padding: 0 14px; }

/* 3-1. 헤더 (두 테마 공통 다크) */
.head {
    flex: none; position: sticky; top: 0; z-index: 60;
    background: var(--hdr); color: var(--hdr-text);
    border-bottom: 1px solid var(--hdr-line);
}
.head-main { height: var(--hdr-h); display: flex; align-items: center; gap: 18px; }

.logo { display: flex; align-items: center; gap: 8px; flex: none; }
/* 심볼(logo-mark.svg)의 두 막대는 청=해외 / 적=국내로, 화면의 의미색과 같은 뜻이다. */
.logo-sym { flex: none; display: block; width: 22px; height: 22px; }
.logo-mark { font-size: 17px; font-weight: 800; letter-spacing: .05em; color: var(--hdr-text); }
.logo-mark em { font-style: normal; color: #5aa0e6; }
.logo-sub { font-size: 11.5px; color: var(--hdr-text-2); padding-left: 8px; border-left: 1px solid var(--hdr-line); }

/* 주 메뉴(GNB) — 헤더 1행. 좁아지면 감추고 햄버거로 넘긴다. */
.gnb { display: flex; align-items: stretch; height: var(--hdr-h); flex: 1 1 auto; min-width: 0; overflow: hidden; }
.gnb a {
    position: relative; display: inline-flex; align-items: center; gap: 5px;
    padding: 0 12px; color: var(--hdr-text-2); font-size: 14.5px; font-weight: 600; white-space: nowrap;
    transition: color .12s, background .12s;
}
.gnb a:hover { color: var(--hdr-text); background: rgba(255, 255, 255, .04); }
.gnb a.on { color: #fff; }
.gnb a.on::after { content: ""; position: absolute; left: 10px; right: 10px; bottom: 0; height: 2px; background: #5aa0e6; border-radius: 2px 2px 0 0; }

.head-act { display: flex; align-items: center; gap: 7px; flex: none; margin-left: auto; }

/* 테마 토글 */
.themetog {
    display: inline-flex; align-items: center; gap: 5px; height: 28px; padding: 0 9px;
    background: transparent; border: 1px solid var(--hdr-line); border-radius: 999px;
    color: var(--hdr-text-2); font-size: 11.5px; font-weight: 600; cursor: pointer;
    transition: color .12s, border-color .12s;
}
.themetog:hover { color: var(--hdr-text); border-color: #434c56; }
.themetog .ti { font-size: 12px; line-height: 1; }
/* 아이콘은 테마에 따라 하나만 보인다 — JS가 클래스를 갈아끼우지 않아도 CSS가 처리한다 */
.themetog .t-dark { display: none; }
:root[data-theme="light"] .themetog .t-dark { display: inline; }
:root[data-theme="light"] .themetog .t-light { display: none; }
@media (prefers-color-scheme: light) {
    :root:not([data-theme]) .themetog .t-dark { display: inline; }
    :root:not([data-theme]) .themetog .t-light { display: none; }
}

.feed {
    display: inline-flex; align-items: center; gap: 6px; height: 28px; padding: 0 10px;
    background: var(--hdr-2); border: 1px solid var(--hdr-line); border-radius: 999px;
    font-size: 12px; font-weight: 600; color: var(--hdr-text-2);
}
.feed .pip { width: 6px; height: 6px; border-radius: 50%; background: var(--ok); box-shadow: 0 0 0 3px var(--ok-dim); animation: pip 2s ease-in-out infinite; }
@keyframes pip { 0%, 100% { opacity: 1; } 50% { opacity: .3; } }
/* (삭제) .feed.is-stale/.is-down — 배지가 상시 '실시간' 상수가 되면서(2026-09-01 writing-for-pros)
   상태 클래스를 붙이는 코드가 사라진 고아 규칙이었다. */
.feed b { font-family: var(--mono); font-variant-numeric: tabular-nums; font-weight: 700; }

.hbtn {
    display: inline-flex; align-items: center; height: 28px; padding: 0 11px;
    background: transparent; border: 1px solid var(--hdr-line); border-radius: var(--r-2);
    color: var(--hdr-text-2); font-size: 13px; font-weight: 600; cursor: pointer; white-space: nowrap;
    transition: color .12s, border-color .12s, background .12s;
}
.hbtn:hover { color: var(--hdr-text); border-color: #434c56; }
.hbtn-solid { background: #2a5d96; border-color: #3574b8; color: #eaf2fb; }
.hbtn-solid:hover { background: #326ba9; color: #fff; }

.burger { display: none; width: 34px; height: 28px; flex: none; align-items: center; justify-content: center; flex-direction: column; gap: 4px; background: transparent; border: 1px solid var(--hdr-line); border-radius: var(--r); cursor: pointer; }
.burger i { display: block; width: 15px; height: 1.5px; background: var(--hdr-text-2); }

/* 3-2. 종목 탭 — 플래시스코어의 축구/야구/농구 줄 */
.sports { height: var(--sport-h); background: var(--hdr-2); border-top: 1px solid var(--hdr-line); overflow-x: auto; overflow-y: hidden; }
.sports .wrap { height: 100%; display: flex; align-items: stretch; gap: 0; }
.sports a, .sports button {
    position: relative; display: inline-flex; align-items: center; gap: 6px;
    padding: 0 14px; background: transparent; border: 0; cursor: pointer;
    color: var(--hdr-text-2); font-size: 14px; font-weight: 600; white-space: nowrap;
    transition: color .12s, background .12s;
}
.sports a:hover, .sports button:hover { color: var(--hdr-text); background: rgba(255, 255, 255, .04); }
.sports a.on, .sports button.on { color: #fff; background: rgba(255, 255, 255, .06); }
.sports a.on::after, .sports button.on::after {
    content: ""; position: absolute; left: 0; right: 0; bottom: 0; height: 2px; background: #5aa0e6;
}
.sports .n { font-size: 11px; color: var(--hdr-text-2); font-family: var(--mono); }

/*  종목 단색 아이콘(Ui.SportIcon — 2026-09-18 의뢰인: 이모지 대신 흑백만). 글자색(currentColor)을 그대로 쓰므로
    헤더의 밝은 글자, 본문의 어두운 글자, 켜진 탭의 흰 글자를 자동으로 따른다. 크기는 글자 크기에 맞춘다. */
.sico { display: inline-block; width: 1.05em; height: 1.05em; vertical-align: -0.17em; flex: none; }
.sports .sico { width: 16px; height: 16px; opacity: .9; }
.sports a.on .sico, .sports button.on .sico { opacity: 1; }

/* 3-3. 서브바 — 마켓 탭 · 날짜 · 검색 */
.subnav { flex: none; background: var(--surface); border-bottom: 1px solid var(--line); }
.subnav .wrap { min-height: var(--sub-h); display: flex; align-items: center; gap: 10px; flex-wrap: wrap; padding-top: 5px; padding-bottom: 5px; }
.subnav a, .subnav button {
    display: inline-flex; align-items: center; height: 30px; padding: 0 12px;
    background: transparent; border: 1px solid transparent; border-radius: var(--r);
    font-size: 13.5px; color: var(--text-3); cursor: pointer; white-space: nowrap;
    transition: color .12s, background .12s, border-color .12s;
}
.subnav a:hover, .subnav button:hover { color: var(--text); background: var(--surface-2); }
.subnav a.on, .subnav button.on { color: var(--text); background: var(--surface-3); border-color: var(--line); font-weight: 600; }
.subnav .vr { width: 1px; height: 16px; background: var(--line); flex: none; }

/* 날짜 스트립 */
/*  overflow를 hidden으로 두면 좁은 폭에서 넘친 버튼이 <b>스크롤도 안 되고 그냥 잘려 나간다</b> —
    자식은 nowrap이라 안 줄고, 이 상자는 스크롤 컨테이너라 플렉스 최소크기가 0으로 풀려 컨테이너까지 줄기 때문이다.
    x축만 auto로 열어 잘리는 대신 스트립 안에서 밀리게 한다(모바일에서는 아래 .d 숨김으로 애초에 다 들어간다). */
.datestrip { display: inline-flex; align-items: center; gap: 2px; max-width: 100%; border: 1px solid var(--line); border-radius: var(--r-2); overflow-x: auto; overflow-y: hidden; }
.datestrip button {
    height: 30px; padding: 0 11px; border: 0; border-radius: 0; background: transparent;
    font-size: 13px; color: var(--text-3); cursor: pointer; white-space: nowrap;
}
.datestrip button + button { border-left: 1px solid var(--line); }
.datestrip button:hover { background: var(--surface-2); color: var(--text); }
.datestrip button.on { background: var(--surface-4); color: var(--text); font-weight: 700; }
.datestrip .d { font-family: var(--mono); font-size: 11.5px; color: var(--text-4); margin-left: 4px; }
.datestrip button.on .d { color: var(--text-2); }

/* 3-4. 3단 본문 */
.main { flex: 1 1 auto; padding: 12px 0 40px; }
.shell { display: grid; grid-template-columns: var(--nav-w) minmax(0, 1fr) var(--aside); gap: 12px; align-items: start; }
.shell.no-left { grid-template-columns: minmax(0, 1fr) var(--aside); }
.shell.no-aside { grid-template-columns: var(--nav-w) minmax(0, 1fr); }
.shell.solo { grid-template-columns: minmax(0, 1fr); }

/* 기존 페이지 호환 — v1의 .cols를 그대로 유지한다 */
.cols { display: grid; grid-template-columns: minmax(0, 1fr) var(--aside); gap: 12px; align-items: start; }
.cols.narrow { grid-template-columns: minmax(0, 1fr); max-width: 880px; margin: 0 auto; }
.cols.wide { grid-template-columns: minmax(0, 1fr); }

/*  z-index: 8 — sticky는 스택 컨텍스트를 만들어 안의 fixed 모달(가상영수증 등)이 갇힌다.
    표 sticky 머리글(z 2·5·6)보다 위, 사이트 크롬(헤더 60·탭바 70·독 80·드로어 90)보다 아래로 둬야
    모달이 표 위로 뜨면서도 아사이드가 크롬을 덮지 않는다(2026-09-02 실측 — 영수증 모달 위로 표 머리글이 떴다). */
.leftnav, .aside { position: sticky; top: calc(var(--stick) + 8px); z-index: 8; display: flex; flex-direction: column; gap: 10px; }

.phead { display: flex; align-items: flex-end; justify-content: space-between; gap: 16px; margin-bottom: 12px; flex-wrap: wrap; }
.phead h1 { font-size: 20px; letter-spacing: -.01em; }
.phead .lede { margin-top: 5px; font-size: 13.5px; color: var(--text-3); max-width: 64ch; line-height: 1.6; }
.phead-act { display: flex; align-items: center; gap: 8px; }
.crumb { display: flex; align-items: center; gap: 6px; font-size: 11.5px; color: var(--text-4); margin-bottom: 8px; }
.crumb a:hover { color: var(--text-2); }
.crumb i { font-style: normal; }

/* ── 4. 리그 트리(좌측) ────────────────────────────────────────────────── */
.tree { background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-2); overflow: hidden; }
.tree-head {
    display: flex; align-items: center; justify-content: space-between;
    padding: 8px 11px; background: var(--surface-2); border-bottom: 1px solid var(--line);
    font-size: 12px; font-weight: 700; color: var(--text-2); letter-spacing: .03em;
}
.tree-head button { background: transparent; border: 0; color: var(--text-4); font-size: 12px; cursor: pointer; }
.tree-head button:hover { color: var(--text-2); }
/* 정적 SSR 화면(/proto)은 버튼 대신 링크로 같은 자리를 쓴다 — 겉모습은 버튼과 같아야 한다. */
.tree-head a { color: var(--text-4); font-size: 12px; font-weight: 400; }
.tree-head a:hover { color: var(--text-2); }
.tree-body { max-height: calc(100vh - var(--hdr-h) - 140px); overflow-y: auto; }
.tree-sec { padding: 5px 0; border-bottom: 1px solid var(--line-soft); }
.tree-sec:last-child { border-bottom: 0; }
.tree-sec h5 { padding: 4px 11px 3px; font-size: 11px; color: var(--text-4); letter-spacing: .06em; }
.tree-item {
    display: flex; align-items: center; gap: 7px; width: 100%; padding: 6px 11px;
    background: transparent; border: 0; cursor: pointer; text-align: left;
    font-size: 13.5px; color: var(--text-2); transition: background .1s, color .1s;
}
.tree-item:hover { background: var(--surface-2); color: var(--text); }
.tree-item.on { background: var(--accent-dim); color: var(--text); font-weight: 600; }
.tree-item .sw { flex: none; }
.tree-item .nm { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.tree-item .n { flex: none; font-family: var(--mono); font-size: 11.5px; color: var(--text-4); }
.tree-item .star { flex: none; font-size: 12.5px; color: var(--text-4); }
.tree-item .star.on { color: var(--warn); }

/* ── 5. 경기 목록 (플래시스코어형) ─────────────────────────────────────── */
/*  ⚠ overflow는 반드시 clip이다 — hidden으로 두면 .mcols가 첫 경기 행을 덮는다.
    hidden은 <b>스크롤 컨테이너</b>를 만들기 때문에, 자식의 position:sticky가 뷰포트가 아니라 이 상자를 기준으로
    풀린다. 그러면 sticky의 top(=--stick, 88px)이 보드 안쪽 88px 지점으로 해석돼 컬럼 헤더가 제자리(보드 최상단)가
    아니라 첫 행 한가운데에 얹힌다(실측: 헤더 y=311, 첫 행 286~351 — 팀명이 가려졌다).
    clip은 같은 모서리 잘라내기를 하면서 스크롤 컨테이너를 만들지 않아 sticky가 뷰포트 기준으로 정상 동작한다. */
.board { background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-2); overflow: clip; }

/* 컬럼 헤더 — 목록 상단에 한 번만, sticky */
.mcols {
    position: sticky; top: var(--stick); z-index: 5;
    display: grid; align-items: center; gap: 0;
    padding: 6px 10px; background: var(--surface-2); border-bottom: 1px solid var(--line);
    font-size: 12px; font-weight: 700; letter-spacing: .05em; color: var(--text-4);
}
.mcols .g { text-align: center; }

/*  컬럼 정렬 — 헤더(.mcols)와 행(.mrow)이 같은 트랙을 쓴다.
    셀렉션 수는 2(승패)와 3(승무패)뿐이라 가변 repeat() 대신 클래스 두 벌로 못박는다.
    가변 개수를 var()로 넘기는 방법은 브라우저별 지원이 갈려 정렬이 어긋날 위험이 있다. */
.mcols, .mrow { grid-template-columns: 26px 72px minmax(0, 1fr) repeat(3, 76px) 96px 64px; }
.mcols.n2, .mrow.n2 { grid-template-columns: 26px 72px minmax(0, 1fr) repeat(2, 76px) 96px 64px; }

/*  배당 셀 묶음. 데스크톱에선 display:contents로 부모 그리드에 그대로 참여하고,
    모바일에선 한 줄을 통째로 차지하는 자체 그리드가 된다(경기명이 눌리지 않는다). */
.m-os { display: contents; }

/* 리그 그룹 */
.mgroup + .mgroup { border-top: 1px solid var(--line); }
.mgroup-head {
    display: flex; align-items: center; gap: 8px; width: 100%;
    padding: 7px 10px; background: var(--surface-2); border: 0; border-bottom: 1px solid var(--line-soft);
    cursor: pointer; text-align: left; transition: background .1s;
}
.mgroup-head:hover { background: var(--surface-3); }
.mgroup-head .ch { flex: none; width: 10px; font-size: 9px; color: var(--text-4); transition: transform .15s; }
.mgroup-head.closed .ch { transform: rotate(-90deg); }
.mgroup-head .lg { flex: none; }
.mgroup-head .nm { font-size: 13.5px; font-weight: 700; color: var(--text); }
.mgroup-head .sp { font-size: 12px; color: var(--text-4); }
.mgroup-head .n { margin-left: auto; font-family: var(--mono); font-size: 12px; color: var(--text-4); }

/* 경기 행 — 그리드로 컬럼을 맞춘다(테이블 없이도 정렬이 어긋나지 않는다) */
.mrow {
    display: grid; align-items: center; gap: 0;
    padding: 5px 10px; border-bottom: 1px solid var(--line-soft);
    transition: background .1s;
}
.mrow:last-child { border-bottom: 0; }
.mrow:nth-child(even) { background: var(--row-alt); }
.mrow:hover { background: var(--row-hover); }
.mrow.is-off { opacity: .5; }
.mrow.is-value { box-shadow: inset 3px 0 0 var(--dom); }

.m-star { background: transparent; border: 0; padding: 0 2px; cursor: pointer; color: var(--text-4); font-size: 14px; line-height: 1; }
.m-star:hover { color: var(--warn); }
.m-star.on { color: var(--warn); }

.m-when { font-family: var(--mono); font-variant-numeric: tabular-nums; }
.m-when .t { font-size: 13.5px; color: var(--text); }
.m-when .c { font-size: 11.5px; color: var(--text-4); }
.m-when .c[data-state="soon"] { color: var(--warn); font-weight: 700; }

.m-no { font-family: var(--mono); font-size: 12px; color: var(--text-4); }

/* 팀 셀은 2줄로 고정한다(홈/원정). 경기번호·라인 칩은 홈 줄에 같이 실어 행 높이를 44px 안쪽으로 잡는다 —
   플래시스코어의 행 리듬이 이 정도이고, 한 화면에 담기는 경기 수가 이 화면의 값어치다. */
.m-teams { min-width: 0; }
.m-teams .h { display: flex; align-items: center; gap: 6px; font-size: 14px; font-weight: 600; color: var(--text); min-width: 0; }
.m-teams .h .nm { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.m-teams .a { font-size: 13px; color: var(--text-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* 배당 셀 — 큰 값=국내, 작은 값=해외, 배경 틴트=유불리 */
.m-o {
    text-align: center; padding: 2px 3px; margin: 0 1px; border-radius: var(--r);
    border: 1px solid transparent;
}
.m-o .lbl { display: none; }   /* 데스크톱은 상단 컬럼 헤더가 승/무/패를 알려준다 */
.m-o .v { display: block; font-family: var(--mono); font-variant-numeric: tabular-nums; font-size: 15px; font-weight: 700; color: var(--text); line-height: 1.25; }
.m-o .f { display: block; font-family: var(--mono); font-variant-numeric: tabular-nums; font-size: 11px; color: var(--text-3); line-height: 1.3; }
.m-o .d { font-size: 11px; font-weight: 700; margin-left: 3px; }
.m-o.is-na .v { color: var(--text-4); font-weight: 400; }
.m-o.adv-dom { background: var(--dom-tint); border-color: rgba(224, 87, 76, .45); }
.m-o.adv-dom .v { color: var(--dom-soft); }
.m-o.adv-dom .d { color: var(--dom-soft); }
.m-o.adv-for { background: var(--for-tint); border-color: transparent; }
.m-o.adv-for .v { color: var(--for-soft); }
.m-o.adv-for .d { color: var(--for-soft); }

/*  별도 해외 — 북을 가리지 않은 전량 중 최저 하나 + 그 사이트.
    승/무/패 칸(.m-o)과 같은 리듬을 쓰되, 값 아래에 북 칩이 한 줄 더 들어가므로 글자를 한 단계 줄인다. */
.m-alt {
    text-align: center; padding: 2px 3px; margin: 0 1px; border-radius: var(--r);
    border: 1px solid transparent; min-width: 0;
}
.m-alt .v { display: block; font-family: var(--mono); font-variant-numeric: tabular-nums; font-size: 15px; font-weight: 700; color: var(--text); line-height: 1.25; }
.m-alt .bk { display: block; line-height: 1; margin: 1px 0; }
.m-alt .f { display: flex; align-items: center; justify-content: center; gap: 3px; font-family: var(--mono); font-variant-numeric: tabular-nums; font-size: 11px; color: var(--text-3); line-height: 1.3; }
.m-alt .f .lbl { font-family: var(--font); font-size: 10.5px; color: var(--text-4); font-weight: 700; }
.m-alt .d { font-weight: 700; }
.m-alt.is-na .v { color: var(--text-4); font-weight: 400; }
.m-alt.adv-dom { background: var(--dom-tint); border-color: rgba(224, 87, 76, .45); }
.m-alt.adv-dom .v, .m-alt.adv-dom .d { color: var(--dom-soft); }
.m-alt.adv-for { background: var(--for-tint); }
.m-alt.adv-for .v, .m-alt.adv-for .d { color: var(--for-soft); }
.m-alt.clickable { cursor: pointer; }
.m-alt.clickable:hover { outline: 1px solid var(--accent-line); }
.m-alt.is-open { outline: 1px solid var(--accent); }

/*  해외 배당 <b>익명 기호</b> 칩(해외 A·B·C…) — 리그 배지(.lg)와 같은 테마 변수를 쓴다.
    다크가 기본이고 라이트가 오버라이드인 이 사이트에서 명도를 여기서 새로 정하면 한쪽 테마가 깨진다.
    2026-08-30 법률 검토로 배당사 <b>실명·로고 표시를 없앴다</b> — .bklogo(로고 이미지) 규칙도 함께 지웠다.
    남은 것은 이 칩 하나뿐이고, 담기는 글자는 Ui.BookAnon이 만든 순번 기호다. */
.bkchip {
    display: inline-block; max-width: 100%; vertical-align: middle;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
    padding: 3px 9px; border-radius: 4px; line-height: 1.5;
    background: hsl(var(--h, 210) 38% var(--lg-l));
    border: 1px solid hsl(var(--h, 210) 44% var(--lg-bl));
    font-size: 13.5px; font-weight: 700; color: var(--lg-fg);
}
.bkchip.sm { font-size: 12px; padding: 1px 6px; line-height: 1.45; }

.m-tag { text-align: center; }

/* 해외 칸 — 전체 평균은 붉은색(2026-08-26 의뢰인: "해외배당 전체 평균도 붉은색으로"),
   주요 4곳 평균은 작은 병기 줄. 붉은색(--dom)이 '국내 유리' 의미색과 같은 축임은 의뢰인 지정. */
.bi-o.for .o-now.o-avg-all { color: var(--dom); }
.bi-o.for .o-avg4 { display: block; font-size: 10.5px; line-height: 1.3; color: var(--text-4); font-family: var(--mono); }

/* ── 가상영수증(저장 조합, 2026-08-26) — 실물 영수증풍: 좁은 폭·점선 절취선·도장.
   실제 구매로 오인되지 않게 머리/바닥 문구가 '가상'임을 박는다(컴포넌트 주석). */
.receipt {
    max-width: 360px; margin: 0 auto; padding: 14px 14px 16px;
    background: var(--surface-2); border: 1px solid var(--line); border-radius: 6px;
    font-size: 12.5px; position: relative; overflow: hidden;
}
.receipt .rc-head { text-align: center; }
.receipt .rc-brand { font-size: 16px; font-weight: 800; letter-spacing: 4px; color: var(--text); }
.receipt .rc-sub { font-size: 11px; color: var(--text-4); margin-top: 2px; }
.receipt .rc-meta { display: flex; justify-content: space-between; margin-top: 8px; color: var(--text-3); font-size: 11.5px; }
.receipt .rc-cut { border-top: 1px dashed var(--line); margin: 10px -14px; }
.receipt .rc-item { padding: 6px 0; }
.receipt .rc-item + .rc-item { border-top: 1px solid var(--line-soft); }
.receipt .rc-line1 { display: flex; align-items: center; gap: 6px; }
.receipt .rc-no { color: var(--accent-2); font-weight: 700; }
.receipt .rc-mkt { color: var(--text-3); font-size: 11.5px; }
.receipt .rc-line1 .badge { margin-left: auto; }
.receipt .rc-line2 { margin-top: 3px; font-weight: 600; color: var(--text); }
.receipt .rc-line2 .x { color: var(--text-4); padding: 0 4px; font-weight: 400; }
.receipt .rc-line2 .sc { color: var(--dom); }
.receipt .rc-line3 { display: flex; justify-content: space-between; margin-top: 2px; color: var(--text-3); font-size: 11.5px; }
.receipt .rc-pick b { color: var(--text); }
.receipt .rc-sum div { display: flex; justify-content: space-between; padding: 2px 0; color: var(--text-3); }
.receipt .rc-sum b { color: var(--text); }
.receipt .rc-total { border-top: 1px solid var(--line); margin-top: 6px; padding-top: 6px !important; font-size: 14px; }
.receipt .rc-total b { color: var(--accent-2); }
.receipt .rc-stamp {
    position: absolute; right: 14px; top: 44px; transform: rotate(12deg);
    border: 2px solid var(--text-4); color: var(--text-4); border-radius: 6px;
    padding: 3px 9px; font-weight: 800; font-size: 13px; letter-spacing: 2px; opacity: .85;
}
.receipt .rc-stamp.hit { border-color: var(--dom); color: var(--dom); }
.receipt .rc-stamp.miss { border-color: var(--for); color: var(--for); }
.receipt .rc-foot { margin-top: 10px; text-align: center; font-size: 10.5px; color: var(--text-4); }

/* 저장 조합 목록(/myslips) */
.sliplist { display: flex; flex-direction: column; gap: 4px; }
.sliprow {
    display: grid; grid-template-columns: 84px 48px 64px minmax(0, 1fr) auto;
    gap: 8px; align-items: center; width: 100%; text-align: left;
    padding: 9px 11px; background: var(--surface-2); border: 1px solid var(--line-soft);
    border-radius: 6px; color: var(--text-2); cursor: pointer; font-size: 12.5px;
}
.sliprow:hover, .sliprow.is-on { background: var(--surface-3); border-color: var(--line); }
.slipdetail { padding: 10px 4px 14px; }
@media (max-width: 480px) {
    .sliprow { grid-template-columns: 74px 40px 56px minmax(0, 1fr) auto; font-size: 12px; }
}

/* 동일배당 — 배당을 누르면 그 행 아래로 조용히 펼쳐지는 얇은 띠.
   떠 있는 팝오버로 만들면 .board 의 overflow 에 잘리고 모바일에서 자리를 못 잡는다.
   의뢰인 요구도 "와이즈토토처럼 요란하지 않게"였다. */
.sostrip {
    padding: 10px 12px 12px; background: var(--surface-2);
    border-bottom: 1px solid var(--line); animation: sofade .14s ease;
}
@keyframes sofade { from { opacity: 0; } to { opacity: 1; } }
.sostrip-head { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; font-size: 13px; color: var(--text-3); }
.sostrip-head b { color: var(--text); font-size: 14px; }
.sostrip-head .x { margin-left: auto; background: transparent; border: 0; color: var(--text-4); cursor: pointer; font-size: 15px; }
.sostrip-head .x:hover { color: var(--text); }

.sobar { display: flex; height: 9px; margin: 9px 0 6px; border-radius: 2px; overflow: hidden; background: var(--surface-4); }
.sobar i { display: block; height: 100%; }
.sobar .b-h { background: var(--dom); }
.sobar .b-d { background: var(--text-3); }
.sobar .b-a { background: var(--for); }

.solegend { display: flex; gap: 14px; flex-wrap: wrap; font-size: 12.5px; }
.solegend span { display: inline-flex; align-items: center; gap: 5px; color: var(--text-2); }
.solegend b { font-family: var(--mono); font-variant-numeric: tabular-nums; color: var(--text); }

/* 동일배당 — 셀렉션별 단일 배당 통계(2026-09-19, 와이즈토토 상단 표) + 조합 머리글 + 더 보기 */
.so-singles { display: grid; grid-template-columns: 1fr; gap: 4px 16px; margin-top: 8px; }   /* 블록당 한 줄 — 승·무·패 분포가 길어 2열이면 겹친다(2026-09-21 실측) */
.so-single { display: flex; align-items: center; gap: 8px; font-size: 12.5px; color: var(--text-2); min-height: 24px; padding: 2px 8px; margin: 0 -8px; border-radius: 6px; cursor: pointer; border-left: 2px solid transparent; }
.so-single:hover { background: var(--surface-2); }
.so-single.on { background: var(--surface-2); border-left-color: var(--dom); }
.so-combo { cursor: pointer; border-radius: 6px; padding: 4px 8px; margin: 8px -8px 0; border-left: 2px solid transparent; }
.so-combo:hover { background: var(--surface-2); }
.so-combo.on { background: var(--surface-2); border-left-color: var(--dom); }
.so-combo .so-combo-head { margin-top: 0; }
.so-combo-head .so-cnt { margin-left: 6px; font-family: var(--mono); font-variant-numeric: tabular-nums; font-weight: 600; }
.so-tabline { margin-top: 12px; font-size: 12.5px; color: var(--text-2); }
.so-tabline b { color: var(--text); }
.sostrip .pb-odds.q { box-shadow: inset 0 -2px 0 var(--dom); }
.so-single-sel { flex: none; min-width: 92px; }
.so-single-bar.three { max-width: 160px; }
.sostrip .so-info { white-space: nowrap; }
.so-single-sel b { color: var(--text); }
.so-single-bar { flex: 1 1 60px; height: 6px; border-radius: 2px; background: var(--surface-4); overflow: hidden; }
.so-single-bar i { display: block; height: 100%; background: var(--dom); }
.so-single-bar.three { display: flex; }
.so-single-bar.three .b-h { background: var(--dom); }
.so-single-bar.three .b-d { background: var(--text-3); }
.so-single-bar.three .b-a { background: var(--for); }
.so-single-dist { flex: none; display: inline-flex; gap: 8px; white-space: nowrap; color: var(--text-3); }
.so-single-dist span.me { color: var(--text); }
.so-single-dist span.me b { color: var(--text); }
.so-single-dist b { color: var(--text-2); }
.sostrip .so-line { color: var(--text-2); font-size: 12px; white-space: nowrap; }
.so-single-rate { flex: none; white-space: nowrap; }
.so-single-rate b { color: var(--text); }
.so-single-none { color: var(--text-4); }
.so-singles-note { grid-column: 1 / -1; margin-top: 0; }
.so-combo-head { margin-top: 12px; font-size: 13px; color: var(--text); font-weight: 600; }
.so-more { margin-top: 6px; height: 28px; padding: 0 12px; font-size: 12.5px; }
@media (max-width: 760px) {
    .so-singles { grid-template-columns: 1fr; gap: 4px; }
}

.solist { margin-top: 8px; display: flex; flex-direction: column; gap: 3px; }
.solist div { display: flex; gap: 8px; font-size: 12.5px; color: var(--text-3); }
.solist .o { flex: none; width: 34px; font-weight: 700; }
.solist .o-h { color: var(--dom-soft); }
.solist .o-d { color: var(--text-2); }
.solist .o-a { color: var(--for-soft); }

.m-o.clickable { cursor: pointer; }
.m-o.clickable:hover { outline: 1px solid var(--accent-line); }
.m-o.is-open { outline: 1px solid var(--accent); }

/*  해외 북 상세 — 동일배당 띠와 같은 톤. 목록이 20~35줄이라 세로 스크롤을 띠 안쪽에 가둔다
    (그대로 두면 행 하나가 화면 서너 개를 밀어내 목록을 훑을 수 없다).
    글자는 본문 표보다 오히려 크게 간다(2026-08-23 의뢰인) — 이 표의 목적이 배당사 이름 식별이다. */
.bkstrip { padding: 12px 14px 14px; background: var(--surface-2); border-bottom: 1px solid var(--line); animation: sofade .14s ease; }
.bkstrip .tablewrap { max-height: 440px; overflow-y: auto; border: 1px solid var(--line); border-radius: var(--r); background: var(--surface); }
.bktbl { width: 100%; }
.bktbl td:first-child, .bktbl th:first-child { width: 45%; }
.bktbl tbody td { font-size: 14.5px; padding-top: 7px; padding-bottom: 7px; }
.bktbl tbody td .badge { margin-left: 6px; }
/* 기준선(국내·평균·최저) — 목록과 섞이지 않게 위에 붙여 두고 배경을 달리한다. */
.bktbl tbody tr.bkref td { background: var(--surface-2); font-weight: 600; border-bottom: 1px solid var(--line); }
.bktbl tbody tr.bkref.is-min td { color: var(--dom-soft); }
.bktbl tbody tr.bkref .bkchip { margin-left: 5px; }
/* 셀렉션별 최저 셀 — 이 열의 기준값이 어느 북에서 나왔는지 표에서 바로 보이게. */
.bktbl tbody td.is-min { color: var(--dom-soft); font-weight: 700; background: var(--dom-tint); }

/* ── 가치 판정(2026-09-17 의뢰인 공식: 해외 마진 제거 × 국내 환급률 = 적정 국내배당) ──
   판정 열(72px)의 세 가지 버튼과, 눌렀을 때 행 아래로 펼쳐지는 근거 띠(.vbstrip).
     · 가치 ▼     — 적정선 초과(적색 알약). ▼ 해외 하락=우선 · ▲ 해외 상승=후순위(.v-low: 테두리만)
     · 미달 / 보류 — 점선 고스트(판정은 했지만 기준 미만 / 적정선을 만들지 않음)
   셋 다 <button>이다 — 배지처럼 보이되 눌린다는 것을 커서와 hover로 알린다. 숫자는 배지에 넣지 않는다
   (2026-09-18 의뢰인 — 두 줄로 깨진 배지). 초과율은 툴팁·근거 띠·가치 경기 TOP이 말한다. */
button.badge-value { cursor: pointer; font-family: var(--font); }
button.badge-value:hover, button.badge-value.on { box-shadow: 0 0 0 3px var(--dom-tint); }
.badge-value .vd { font-style: normal; font-size: 7.5px; opacity: .95; }
.badge-value.v-low { background: transparent; color: var(--dom-soft); border-color: var(--dom-sw); }
.bi-why {
    height: 22px; padding: 0 8px; background: transparent;
    border: 1px dashed var(--line-strong); border-radius: var(--r);
    color: var(--text-4); font-family: var(--font); font-size: 11px; font-weight: 700; letter-spacing: .04em; cursor: pointer;
}
.bi-why:hover, .bi-why.on { color: var(--text-2); border-style: solid; border-color: var(--accent-line); background: var(--accent-dim); }
.bi-verdict { cursor: pointer; font-family: var(--font); }
.bi-verdict.on { outline: 2px solid var(--warn); outline-offset: 1px; }
.mrow.is-value.is-value-low { box-shadow: inset 3px 0 0 var(--dom-sw); }
/* 사이드 위젯(가치 경기 TOP)의 초과율 + 방향 */
.vb-top { display: inline-flex; align-items: center; gap: 4px; }
.vb-top .vd { font-style: normal; font-size: 9px; }
.vb-top .vd.dn { color: var(--dom-soft); }
.vb-top .vd.up { color: var(--for-soft); }

/*  근거 띠 — 동일배당·해외 분포 띠와 같은 톤(surface-2 바닥, 얇은 선). 구성은 위에서 아래로
      본문(이 경기의 숫자를 넣은 문장 두세 개) + 오른쪽 요약 카드(초과율·픽·적정/실제·기준·방향)
      → 근거 표(셀렉션별 해외→적정확률→적정 국내→국내→초과, 역수 열 없음) → 계산 흐름 한 줄.
    숫자는 전부 mono·tabular, 픽 줄은 국내 유리색 틴트 + 왼쪽 막대(본문 행의 is-value와 같은 문법).
    (2026-09-18 개작 — 의뢰인: "표와 숫자만이 아니라 문장으로, 역수는 보여줄 필요 없음, 디자인은 세련되게") */
.vbstrip { padding: 14px 16px 16px; background: var(--surface-2); border-bottom: 1px solid var(--line); animation: sofade .14s ease; }
.vb-body { display: grid; grid-template-columns: minmax(0, 1fr) 210px; gap: 14px; align-items: start; margin-top: 10px; }
.vb-body.no-key { grid-template-columns: minmax(0, 1fr); }
.vb-prose { font-size: 13.5px; line-height: 1.75; color: var(--text-2); }
.vb-prose p { margin: 0; }
.vb-prose p + p { margin-top: 6px; }
.vb-prose b.mono { color: var(--text); font-weight: 700; font-variant-numeric: tabular-nums; }
.vb-key {
    display: flex; flex-direction: column; gap: 5px; padding: 11px 13px 12px;
    background: var(--surface); border: 1px solid var(--line); border-top: 3px solid var(--dom); border-radius: var(--r-2);
}
.vb-key.is-miss { border-top-color: var(--line-strong); }
.vb-key .k-tag { font-size: 11px; font-weight: 800; letter-spacing: .08em; color: var(--dom-soft); }
.vb-key.is-miss .k-tag { color: var(--text-4); }
.vb-key .k-edge { font-family: var(--mono); font-variant-numeric: tabular-nums; font-size: 28px; font-weight: 800; line-height: 1; margin-top: 1px; }
.vb-key .k-sel { font-size: 12.5px; font-weight: 700; color: var(--text); margin-bottom: 4px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.vb-key .k-line { display: flex; justify-content: space-between; align-items: baseline; font-size: 12px; color: var(--text-3); }
.vb-key .k-line b { font-family: var(--mono); font-variant-numeric: tabular-nums; color: var(--text); font-size: 13px; }
.vb-key .k-drift { margin-top: 6px; padding-top: 7px; border-top: 1px solid var(--line-soft); font-size: 12px; font-weight: 700; color: var(--text-3); }
.vb-key .k-drift.dn { color: var(--dom-soft); }
.vb-key .k-drift.up { color: var(--for-soft); }

/*  ⚠ 선택자는 전부 .vbstrip 아래로 한 단계 더 특정한다 — §10의 `.tbl thead th`/`.tbl tbody td`가 이 블록보다
    <b>뒤에</b> 있어 같은 특정도(0,1,2)면 이 규칙이 전부 진다(2026-09-17 검토에서 실제로 죽어 있었다). */
.vbstrip .tablewrap { margin-top: 12px; border: 1px solid var(--line); border-radius: var(--r); background: var(--surface); }
.vbstrip .vbtbl { width: 100%; }
.vbstrip .vbtbl thead th { font-size: 11px; position: static; }
.vbstrip .vbtbl tbody td { font-size: 13.5px; padding-top: 6px; padding-bottom: 6px; }
.vbstrip .vbtbl td.mono { font-variant-numeric: tabular-nums; }
.vbstrip .vbtbl .sub { display: block; font-size: 10.5px; line-height: 1.25; color: var(--text-4); font-family: var(--mono); }
.vbstrip .vbtbl .sub .arr { font-size: 9px; }
.vbstrip .vbtbl tbody tr.is-pick td { background: var(--dom-tint); color: var(--text); }
.vbstrip .vbtbl tbody tr.is-pick td:first-child { box-shadow: inset 3px 0 0 var(--dom); font-weight: 700; }
.vbstrip .vbtbl td.vb-exp { font-weight: 800; color: var(--text); }
.vbstrip .vbtbl tbody tr.vb-sum td { background: var(--surface-2); color: var(--text-3); font-size: 12px; border-top: 1px solid var(--line); }
.vbstrip .vbtbl tbody tr.vb-sum td b { color: var(--text-2); }
.vb-flow { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; margin-top: 10px; font-size: 12px; color: var(--text-3); }
.vb-flow .st { display: inline-flex; align-items: center; gap: 5px; height: 24px; padding: 0 9px; background: var(--surface); border: 1px solid var(--line); border-radius: var(--r); color: var(--text-2); white-space: nowrap; }
.vb-flow .st b { font-family: var(--mono); font-variant-numeric: tabular-nums; color: var(--text); }
.vb-flow .ar { color: var(--text-4); }
@media (max-width: 760px) {
    .vbstrip { padding: 10px 10px 12px; }
    .vb-body { grid-template-columns: minmax(0, 1fr); gap: 10px; }
    .vb-prose { font-size: 13px; line-height: 1.7; }
    .vb-key { flex-direction: row; flex-wrap: wrap; align-items: center; gap: 4px 12px; }
    .vb-key .k-edge { font-size: 22px; }
    .vb-key .k-sel { flex-basis: 100%; margin-bottom: 0; }
    .vb-key .k-drift { margin-top: 0; padding-top: 0; border-top: 0; margin-left: auto; }
    .vbstrip .vbtbl thead th, .vbstrip .vbtbl tbody td { padding-left: 5px; padding-right: 5px; }
    .vbstrip .vbtbl tbody td { font-size: 12.5px; }
}

/* ── 6. 패널 · 위젯 ────────────────────────────────────────────────────── */
.panel { background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-2); overflow: hidden; }
.panel + .panel { margin-top: 12px; }
.panel-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; min-height: 40px; padding: 8px 13px; background: var(--surface-2); border-bottom: 1px solid var(--line); }
.panel-head h2, .panel-head h3 { font-size: 14.5px; }
.panel-head .sub { font-size: 12px; color: var(--text-3); font-weight: 400; margin-left: 8px; }
.panel-head-act { display: flex; align-items: center; gap: 6px; }
.panel-body { padding: 13px; }
.panel-body.flush { padding: 0; }
.panel-body.tight { padding: 9px 11px; }
.panel-foot { padding: 9px 13px; background: var(--surface-2); border-top: 1px solid var(--line); display: flex; align-items: center; justify-content: space-between; gap: 12px; font-size: 13px; color: var(--text-3); flex-wrap: wrap; }

.widget { background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-2); overflow: hidden; }
.widget-head { display: flex; align-items: center; justify-content: space-between; padding: 8px 11px; background: var(--surface-2); border-bottom: 1px solid var(--line-soft); font-size: 13.5px; font-weight: 700; color: var(--text); }
.widget-head a, .widget-head button { font-size: 12px; font-weight: 500; color: var(--text-3); background: transparent; border: 0; cursor: pointer; }
.widget-head a:hover, .widget-head button:hover { color: var(--accent-2); }
.widget-body { padding: 10px 11px; }
.widget-body.flush { padding: 0; }

/* ── 7. 버튼 ───────────────────────────────────────────────────────────── */
.btn {
    display: inline-flex; align-items: center; justify-content: center; gap: 6px;
    height: 32px; padding: 0 14px; border-radius: var(--r-2);
    background: var(--surface-3); border: 1px solid var(--line);
    color: var(--text-2); font-size: 13.5px; font-weight: 600; cursor: pointer; white-space: nowrap;
    transition: background .12s, border-color .12s, color .12s;
}
.btn:hover { color: var(--text); border-color: var(--line-strong); background: var(--surface-4); }
.btn:active { transform: translateY(.5px); }
.btn:disabled, .btn[disabled] { opacity: .45; cursor: not-allowed; transform: none; }

/* 흰 글자를 얹으므로 --accent 가 아니라 --accent-solid 를 쓴다(토큰 주석 참조 — 다크에서 대비 미달). */
.btn-primary { background: var(--accent-solid); border-color: var(--accent-solid); color: #fff; }
.btn-primary:hover { filter: brightness(1.1); background: var(--accent-solid); border-color: var(--accent-solid); color: #fff; }
.btn-ghost { background: transparent; }
.btn-ghost:hover { background: var(--surface-2); }
.btn-line { background: transparent; border-color: var(--accent-line); color: var(--accent-2); }
.btn-line:hover { background: var(--accent-dim); color: var(--accent-2); }
.btn-danger { background: var(--danger-dim); border-color: rgba(214, 74, 69, .42); color: var(--danger-soft); }
.btn-danger:hover { background: var(--danger-dim); border-color: var(--danger); color: var(--danger-soft); }

.btn-sm { height: 28px; padding: 0 11px; font-size: 12.5px; border-radius: var(--r); }
.btn-lg { height: 40px; padding: 0 20px; font-size: 14px; }
.btn-block { width: 100%; }
.btn-icon { width: 32px; padding: 0; }
.btn-icon.btn-sm { width: 26px; }

.btngroup { display: inline-flex; border: 1px solid var(--line); border-radius: var(--r-2); overflow: hidden; }
.btngroup button { height: 30px; padding: 0 13px; background: transparent; border: 0; font-size: 13px; color: var(--text-3); cursor: pointer; transition: background .12s, color .12s; }
.btngroup button + button { border-left: 1px solid var(--line); }
.btngroup button:hover { color: var(--text); background: var(--surface-2); }
.btngroup button.on { background: var(--surface-4); color: var(--text); font-weight: 600; }

.btn-social { display: flex; align-items: center; justify-content: center; gap: 8px; width: 100%; height: 44px; border-radius: var(--r-2); border: 1px solid transparent; font-size: 13.5px; font-weight: 700; cursor: pointer; transition: filter .12s; }
.btn-social:hover { filter: brightness(1.06); }
.btn-social .si { width: 18px; height: 18px; flex: none; display: grid; place-items: center; font-size: 13px; font-weight: 900; border-radius: 3px; }
.sc-kakao { background: #FEE500; color: #191600; }
.sc-kakao .si { background: #191600; color: #FEE500; }
.sc-naver { background: #03C75A; color: #fff; }
.sc-naver .si { background: #fff; color: #03C75A; }
.sc-google { background: #fff; color: #1f1f1f; border-color: #dadce0; }
.sc-google .si { background: #1f1f1f; color: #fff; }
/*  소셜 로그인 폼(카카오, 2026-09-10) — 로그인 폼·모달·가입 1단계에 같은 모양으로 놓인다. */
.login-social { margin: 0; }
.login-social + .auth-alt { margin-top: 14px; }

/* ── 8. 폼 ─────────────────────────────────────────────────────────────── */
.field { display: block; margin-bottom: 14px; }
.field > label, .flabel { display: block; margin-bottom: 6px; font-size: 13px; font-weight: 600; color: var(--text-2); }
.field .req { color: var(--dom); margin-left: 3px; }

.input, .select, .textarea {
    width: 100%; height: 36px; padding: 0 11px;
    background: var(--surface-2); border: 1px solid var(--line); border-radius: var(--r-2);
    color: var(--text); font-family: inherit; font-size: 14px; outline: none;
    transition: border-color .12s, background .12s;
}
.textarea { height: auto; min-height: 110px; padding: 9px 11px; line-height: 1.6; resize: vertical; }
.input:hover, .select:hover, .textarea:hover { border-color: var(--line-strong); }
.input:focus, .select:focus, .textarea:focus { border-color: var(--accent); background: var(--surface); }
.input::placeholder, .textarea::placeholder { color: var(--text-4); }
.input:disabled, .select:disabled, .textarea:disabled { opacity: .55; cursor: not-allowed; }
.input.is-bad, .select.is-bad, .textarea.is-bad { border-color: var(--danger); }
.select {
    appearance: none; padding-right: 28px; cursor: pointer;
    background-image: linear-gradient(45deg, transparent 50%, var(--text-3) 50%), linear-gradient(135deg, var(--text-3) 50%, transparent 50%);
    background-position: calc(100% - 15px) 15px, calc(100% - 10px) 15px;
    background-size: 5px 5px, 5px 5px; background-repeat: no-repeat;
}
.input-sm { height: 30px; font-size: 13px; padding: 0 9px; }

.fhelp { margin-top: 5px; font-size: 12.5px; color: var(--text-4); line-height: 1.55; }
/* α — 프라임 전용 추가 해외 소스 칩(배당비교 핸디캡 칸) */
.o-alpha { color: var(--accent-2); font-weight: 700; font-size: 10.5px; margin-left: 4px; white-space: nowrap; }

/* 인증번호 남은 시간 — 정적(auth.js 카운트다운)·대화형(Alerts C# 틱) 공용 표시 */
.vtimer-row .vtimer { color: var(--text); font-weight: 600; }
.vtimer-row.expired { color: var(--danger); }
.ferr { margin-top: 5px; font-size: 12.5px; color: var(--danger-soft); }
.inline-form { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
.inline-form .input, .inline-form .select { width: auto; min-width: 0; }
.grid-form { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0 14px; }
.grid-form .span2 { grid-column: 1 / -1; }

.check { display: inline-flex; align-items: flex-start; gap: 8px; cursor: pointer; font-size: 13.5px; color: var(--text-2); line-height: 1.5; }
.check input { margin: 2px 0 0; accent-color: var(--accent); width: 14px; height: 14px; flex: none; cursor: pointer; }
.check:hover { color: var(--text); }
.check b { color: var(--text); font-weight: 600; }
.checklist { display: flex; flex-direction: column; gap: 10px; }

.switch { display: inline-flex; align-items: center; gap: 9px; cursor: pointer; font-size: 12.5px; color: var(--text-2); }
.switch input { position: absolute; opacity: 0; width: 0; height: 0; }
.switch .track { width: 34px; height: 19px; border-radius: 999px; flex: none; background: var(--surface-4); border: 1px solid var(--line); position: relative; transition: background .16s, border-color .16s; }
.switch .track::after { content: ""; position: absolute; top: 2px; left: 2px; width: 13px; height: 13px; border-radius: 50%; background: var(--text-3); transition: transform .16s, background .16s; }
.switch input:checked + .track { background: var(--accent); border-color: var(--accent); }
.switch input:checked + .track::after { transform: translateX(15px); background: #fff; }

.searchbox { position: relative; }
.searchbox .input { padding-left: 30px; }
.searchbox::before { content: "⌕"; position: absolute; left: 10px; top: 50%; transform: translateY(-52%); color: var(--text-4); font-size: 15px; pointer-events: none; }

/* ── 9. 배지 · 칩 ──────────────────────────────────────────────────────── */
.badge { display: inline-flex; align-items: center; gap: 4px; height: 22px; padding: 0 8px; border-radius: var(--r); background: var(--surface-3); border: 1px solid var(--line); font-size: 12px; font-weight: 700; color: var(--text-2); letter-spacing: .02em; white-space: nowrap; }
.badge-ok { color: var(--ok-soft); border-color: rgba(31, 170, 108, .38); background: var(--ok-dim); }
.badge-warn { color: var(--warn-soft); border-color: rgba(217, 155, 43, .38); background: var(--warn-dim); }
.badge-danger { color: var(--danger-soft); border-color: rgba(214, 74, 69, .38); background: var(--danger-dim); }
.badge-accent { color: var(--accent-2); border-color: var(--accent-line); background: var(--accent-dim); }
.badge-dom { color: var(--dom-soft); border-color: rgba(224, 87, 76, .4); background: var(--dom-tint); }

/*  '가치' 배지 — 알약형 한 줄. 판정 열(72px)에서 절대 줄바꿈되지 않아야 한다(2026-09-18: 숫자를 넣었다가 "가/치"로
    두 줄이 깨졌다). 글자는 '가치'와 방향 화살표(▼ 해외 하락=우선 · ▲ 상승=후순위)뿐이고 숫자는 넣지 않는다. */
.badge-value {
    display: inline-flex; align-items: center; gap: 3px; height: 21px; padding: 0 9px;
    background: var(--dom); border: 1px solid var(--dom); border-radius: 999px;
    color: #fff; font-size: 11.5px; font-weight: 800; letter-spacing: .06em; line-height: 1; white-space: nowrap;
}

/*  리그 배지 — 인라인 스타일로는 색상(--h)만 받고 명도·채도는 테마가 정한다.
    (라이트 모드에서 배지만 어둡게 남는 사고를 막는 유일한 방법이다.) */
.lg {
    display: inline-block; min-width: 42px; max-width: 132px; text-align: center;
    padding: 2px 8px; border-radius: var(--r);
    background: hsl(var(--h, 210) 38% var(--lg-l));
    border: 1px solid hsl(var(--h, 210) 44% var(--lg-bl));
    font-size: 12px; font-weight: 700; color: var(--lg-fg); letter-spacing: .02em;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap; vertical-align: middle;
}

.chip { display: inline-flex; align-items: center; height: 20px; padding: 0 6px; background: var(--surface-2); border: 1px solid var(--line); border-radius: 2px; font-size: 11.5px; color: var(--text-2); font-weight: 600; white-space: nowrap; }
.chip-mkt { color: var(--accent-2); border-color: var(--accent-line); background: var(--accent-dim); }
.chip-line { font-family: var(--mono); }

/* ── 10. 표 ────────────────────────────────────────────────────────────── */
.tablewrap { width: 100%; overflow-x: auto; }
.tbl { font-size: 14px; }
.tbl thead th { position: sticky; top: 0; z-index: 2; background: var(--surface-2); padding: 8px 10px; text-align: left; white-space: nowrap; font-size: 12px; font-weight: 700; letter-spacing: .05em; color: var(--text-3); border-bottom: 1px solid var(--line); }
.tbl tbody td { padding: 8px 10px; border-bottom: 1px solid var(--line-soft); vertical-align: middle; }
.tbl tbody tr { transition: background .1s; }
.tbl tbody tr:hover { background: var(--row-hover); }
.tbl tbody tr:last-child td { border-bottom: 0; }
.tbl.compact tbody td { padding: 5px 10px; }
.tbl.zebra tbody tr:nth-child(even) { background: var(--row-alt); }
.tbl.zebra tbody tr:nth-child(even):hover { background: var(--row-hover); }
.tbl tbody tr.is-off { opacity: .48; }
.tbl tbody tr.is-off .diff { color: var(--text-3) !important; }
.tbl .rowlink { cursor: pointer; }

.tbl.grouped thead tr.g1 th { top: 0; height: 28px; padding: 5px 8px; text-align: center; }
.tbl.grouped thead tr.g2 th { top: 28px; height: 24px; padding: 3px 8px; font-size: 11px; text-align: right; }
.tbl.grouped thead th.gh { border-left: 1px solid var(--line); }
.tbl.grouped thead th.gh-for { color: var(--accent); }
.tbl.grouped thead th.gh-bm { color: var(--dom-soft); background: var(--dom-tint); }
.tbl.grouped thead th.gh-df { color: var(--text-2); }
.tbl.grouped thead th.sh-bm { background: var(--dom-tint); }

.c-no { width: 60px; text-align: right; color: var(--text-3); font-size: 13px; }
.c-when { width: 102px; }
.c-lg { width: 112px; }
.c-vs { min-width: 180px; }
.c-o { width: 74px; text-align: right; padding: 5px 8px !important; }
.c-d { width: 70px; text-align: right; }
.c-rec { width: 70px; text-align: center; }

.when-d { font-size: 13.5px; color: var(--text); }
.when-c { font-size: 11.5px; color: var(--text-3); margin-top: 1px; }
.when-c[data-state="soon"] { color: var(--warn); font-weight: 700; }

.vs-h { font-weight: 600; color: var(--text); display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.vs-a { color: var(--text-2); font-size: 13.5px; margin-top: 1px; }
.vs-a::before { content: "vs "; color: var(--text-4); font-size: 11px; }

.o-now { font-size: 15px; font-weight: 700; color: var(--text); font-family: var(--mono); font-variant-numeric: tabular-nums; }
.o-open { font-size: 11.5px; color: var(--text-4); margin-top: 1px; font-family: var(--mono); font-variant-numeric: tabular-nums; }
.o-sel { font-size: 10.5px; color: var(--text-4); font-weight: 700; letter-spacing: .04em; }
.c-o.is-na .o-now { font-weight: 400; color: var(--text-4); }
.c-o.for { background: var(--accent-dim); }
.c-o.bm.adv-dom { background: var(--dom-tint); }
.c-o.bm.adv-dom .o-now { color: var(--dom-soft); }
.c-o.bm.adv-for { background: var(--for-tint); }
.c-o.bm.adv-for .o-now { color: var(--for-soft); }

.arr { font-style: normal; font-size: 9.5px; margin-left: 2px; vertical-align: 1px; }
.arr.up { color: var(--dom); }
.arr.dn { color: var(--for); }

.diff { font-family: var(--mono); font-variant-numeric: tabular-nums; font-weight: 700; font-size: 13.5px; }
.diff.pos { color: var(--dom-soft); }
.diff.neg { color: var(--for-soft); }
.diff.zero { color: var(--text-2); }
.diff.na { color: var(--text-4); font-weight: 400; }

/* ── 11. 게시판 · 글 ───────────────────────────────────────────────────── */
.blist li { border-bottom: 1px solid var(--line-soft); }
.blist li:last-child { border-bottom: 0; }
.blist a { display: flex; align-items: center; gap: 10px; padding: 10px 13px; transition: background .1s; }
.blist a:hover { background: var(--row-hover); }
.blist .bcat { flex: none; width: 58px; font-size: 11px; color: var(--accent-2); font-weight: 600; }
.blist .bti { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 13px; }
.blist .bti .cnt { color: var(--warn); font-size: 11px; font-weight: 700; margin-left: 5px; }
.blist .bti .new { color: var(--dom); font-size: 9px; font-weight: 800; margin-left: 5px; vertical-align: 2px; }
.blist .bmeta { flex: none; display: flex; align-items: center; gap: 12px; font-size: 11px; color: var(--text-4); }
.blist .bmeta .au { color: var(--text-3); min-width: 62px; text-align: right; }
.blist .bmeta .vw, .blist .bmeta .dt { min-width: 40px; text-align: right; font-family: var(--mono); }

.post-head { padding: 15px 15px 12px; border-bottom: 1px solid var(--line); }
.post-head h1 { font-size: 18px; line-height: 1.45; }
.post-meta { display: flex; align-items: center; gap: 12px; margin-top: 10px; font-size: 11.5px; color: var(--text-4); flex-wrap: wrap; }
.post-meta .au { color: var(--text-2); font-weight: 600; }
.post-body { padding: 18px 15px 26px; font-size: 13.5px; line-height: 1.85; color: var(--text-2); }
.post-body p + p { margin-top: 14px; }
.post-body b, .post-body strong { color: var(--text); }
.post-act { display: flex; align-items: center; justify-content: center; gap: 8px; padding: 0 15px 18px; }

.cmt { padding: 12px 13px; border-bottom: 1px solid var(--line-soft); }
.cmt:last-child { border-bottom: 0; }
.cmt-head { display: flex; align-items: center; gap: 8px; font-size: 11.5px; margin-bottom: 5px; }
.cmt-head .au { color: var(--text); font-weight: 700; }
.cmt-head .dt { color: var(--text-4); }
.cmt-body { font-size: 13px; line-height: 1.7; color: var(--text-2); }
.cmt.reply { padding-left: 34px; background: var(--row-alt); position: relative; }
.cmt.reply::before { content: "↳"; position: absolute; left: 15px; top: 12px; color: var(--text-4); font-size: 12px; }

.av { width: 26px; height: 26px; border-radius: 50%; flex: none; display: grid; place-items: center; font-size: 11px; font-weight: 800; color: #fff; background: var(--text-3); }
.av-lg { width: 44px; height: 44px; font-size: 17px; }

.pager { display: flex; align-items: center; justify-content: center; gap: 4px; padding: 15px 0 4px; }
.pager a, .pager button, .pager span { min-width: 30px; height: 30px; padding: 0 8px; border-radius: var(--r); display: inline-flex; align-items: center; justify-content: center; background: transparent; border: 1px solid transparent; font-size: 12.5px; color: var(--text-3); cursor: pointer; font-family: var(--mono); transition: color .12s, background .12s, border-color .12s; }
.pager a:hover, .pager button:hover { color: var(--text); background: var(--surface-2); }
.pager .on { background: var(--surface-4); border-color: var(--line); color: var(--text); font-weight: 700; }
.pager .gap { cursor: default; }

/* ── 12. 상태 ──────────────────────────────────────────────────────────── */
.empty { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 8px; padding: 50px 20px; text-align: center; color: var(--text-3); }
.empty .ei { font-size: 26px; opacity: .38; }
.empty h4 { font-size: 15px; color: var(--text-2); font-weight: 600; }
.empty p { font-size: 13.5px; color: var(--text-4); max-width: 44ch; line-height: 1.65; }

.notice { display: flex; gap: 10px; padding: 11px 13px; border-radius: var(--r-2); background: var(--surface-2); border: 1px solid var(--line); border-left: 2px solid var(--text-3); font-size: 13.5px; line-height: 1.65; color: var(--text-2); }
.notice b { color: var(--text); }
.notice .ni { flex: none; font-size: 13px; line-height: 1.4; }
.notice-info { border-left-color: var(--accent); }
.notice-warn { border-left-color: var(--warn); background: var(--warn-dim); }
.notice-danger { border-left-color: var(--danger); background: var(--danger-dim); }
.notice-ok { border-left-color: var(--ok); background: var(--ok-dim); }

.sk { background: linear-gradient(90deg, var(--surface-2) 25%, var(--surface-3) 37%, var(--surface-2) 63%); background-size: 400% 100%; animation: shimmer 1.3s ease infinite; border-radius: var(--r); }
@keyframes shimmer { 0% { background-position: 100% 50%; } 100% { background-position: 0 50%; } }
.sk-line { height: 11px; margin: 6px 0; }

.tiles { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 10px; }
.tile { padding: 11px 13px; background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-2); }
.tile .tl { font-size: 12px; color: var(--text-3); }
.tile .tv { margin-top: 4px; font-size: 21px; font-weight: 800; color: var(--text); font-family: var(--mono); font-variant-numeric: tabular-nums; letter-spacing: -.02em; }
.tile .td { margin-top: 3px; font-size: 12px; color: var(--text-4); }
.tile .tv.pos { color: var(--dom-soft); }
.tile .tv.acc { color: var(--accent-2); }
.tile .tv.ok { color: var(--ok-soft); }

/* ── 13. 모달 · 드롭다운 ───────────────────────────────────────────────── */
.modal-veil { position: fixed; inset: 0; z-index: 100; display: grid; place-items: center; padding: 20px; background: rgba(6, 9, 12, .6); backdrop-filter: blur(3px); animation: fade .16s ease; }
@keyframes fade { from { opacity: 0; } to { opacity: 1; } }
.modal { width: min(560px, 100%); max-height: 86vh; display: flex; flex-direction: column; background: var(--surface); border: 1px solid var(--line-strong); border-radius: var(--r-3); box-shadow: var(--pop); animation: pop .18s cubic-bezier(.2, .8, .3, 1); }
@keyframes pop { from { opacity: 0; transform: translateY(8px) scale(.99); } to { opacity: 1; transform: none; } }
.modal-sm { width: min(420px, 100%); }
.modal-lg { width: min(820px, 100%); }
.modal-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 14px 18px; border-bottom: 1px solid var(--line); flex: none; }
.modal-head h3 { font-size: 16px; }
.modal-x { background: transparent; border: 0; color: var(--text-3); font-size: 16px; cursor: pointer; line-height: 1; padding: 4px; }
.modal-x:hover { color: var(--text); }
.modal-body { padding: 16px 18px; overflow-y: auto; font-size: 14px; line-height: 1.7; color: var(--text-2); }
.modal-foot { display: flex; justify-content: flex-end; gap: 8px; padding: 12px 18px; border-top: 1px solid var(--line); flex: none; }

/*  로그인 모달 — 항상 DOM에 있고 hidden 으로만 닫힌다(auth.js). .modal-veil 의 display:grid 가
    UA 의 [hidden]{display:none} 을 이기므로 반드시 명시적으로 꺼야 한다(.pop-win 과 같은 함정).
    등장은 일반 모달(.16s/.18s)보다 느긋하게 — "스멀스멀"(2026-09-02 의뢰인). 닫았다 다시 열면
    display 가 none→grid 로 바뀌며 애니메이션이 처음부터 다시 돈다. */
.modal-veil[hidden] { display: none !important; }
.login-veil { animation: fade .38s ease both; }
.login-modal { position: relative; width: min(400px, 100%); padding: 28px 26px 22px; animation: loginrise .46s cubic-bezier(.16, .84, .28, 1) both; }
@keyframes loginrise { from { opacity: 0; transform: translateY(16px) scale(.98); } to { opacity: 1; transform: none; } }
.login-x { position: absolute; top: 10px; right: 10px; }
.login-hero { text-align: center; margin-bottom: 18px; }
.login-hero .logo-mark { font-size: 19px; }
.login-hero h3 { margin-top: 12px; font-size: 17px; }
.login-hero p { margin-top: 6px; font-size: 12.5px; line-height: 1.6; color: var(--text-3); }
.login-form .field { margin-bottom: 10px; }
.login-form .btn { margin-top: 4px; }
/* (삭제) .login-keep — "2주간 유지" 안내 문구를 뺐다(2026-09-02 의뢰인). 유지 동작 자체는 그대로다. */
.login-modal .auth-alt { margin-top: 14px; text-align: center; font-size: 12.5px; }

.pop { position: relative; }
.pop-panel { position: absolute; right: 0; top: calc(100% + 6px); z-index: 50; min-width: 210px; padding: 8px; background: var(--surface); border: 1px solid var(--line-strong); border-radius: var(--r-2); box-shadow: var(--pop-sm); display: flex; flex-direction: column; gap: 4px; }
.pop-panel .pi { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 7px 9px; border-radius: var(--r); background: transparent; border: 0; font-size: 12.5px; color: var(--text-2); cursor: pointer; text-align: left; width: 100%; }
.pop-panel .pi:hover { background: var(--surface-2); color: var(--text); }
.pop-panel .pi.on { color: var(--accent-2); }
.pop-sep { height: 1px; background: var(--line); margin: 4px 0; }
.pop-label { padding: 4px 9px; font-size: 10px; color: var(--text-4); letter-spacing: .06em; }

/* ── 14. 인증 · 요금제 · 관리자 · 계산기 · 문서 ────────────────────────── */
.auth { display: grid; place-items: center; min-height: calc(100vh - var(--hdr-h) - var(--sport-h)); padding: 34px 14px 60px; }
.auth-card { width: min(400px, 100%); }
.auth-card .logo { justify-content: center; margin-bottom: 6px; }
.auth-card .logo-mark { color: var(--text); }
.auth-title { text-align: center; font-size: 17px; margin-bottom: 4px; }
.auth-lede { text-align: center; font-size: 12.5px; color: var(--text-3); margin-bottom: 20px; line-height: 1.6; }
.auth-box { background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-3); padding: 22px; }
.auth-socials { display: flex; flex-direction: column; gap: 8px; }
.auth-or { display: flex; align-items: center; gap: 12px; margin: 18px 0; color: var(--text-4); font-size: 11px; }
.auth-or::before, .auth-or::after { content: ""; flex: 1; height: 1px; background: var(--line); }
.auth-alt { margin-top: 16px; text-align: center; font-size: 12.5px; color: var(--text-3); }
.auth-alt a { color: var(--accent-2); font-weight: 600; }
.auth-legal { margin-top: 18px; font-size: 11px; color: var(--text-4); line-height: 1.7; text-align: center; }
.auth-legal a { color: var(--text-3); text-decoration: underline; text-underline-offset: 2px; }

.steps { display: flex; align-items: center; gap: 0; margin-bottom: 20px; }
.steps .st { flex: 1 1 0; display: flex; flex-direction: column; align-items: center; gap: 6px; font-size: 11px; color: var(--text-4); position: relative; }
.steps .st .sn { width: 24px; height: 24px; border-radius: 50%; display: grid; place-items: center; background: var(--surface-3); border: 1px solid var(--line); font-size: 11px; font-weight: 700; color: var(--text-3); }
.steps .st.on .sn { background: var(--accent-solid); border-color: var(--accent-solid); color: #fff; }
.steps .st.on { color: var(--text); font-weight: 600; }
.steps .st.done .sn { background: var(--ok-dim); border-color: rgba(31, 170, 108, .45); color: var(--ok-soft); }
.steps .st + .st::before { content: ""; position: absolute; left: -50%; top: 12px; width: 100%; height: 1px; background: var(--line); z-index: -1; }

.plans { display: grid; grid-template-columns: repeat(auto-fit, minmax(238px, 1fr)); gap: 12px; }
.plan { position: relative; background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-3); padding: 22px 20px; display: flex; flex-direction: column; }
.plan.is-best { border-color: var(--accent); box-shadow: 0 0 0 1px var(--accent-dim); }
.plan-tag { position: absolute; top: -9px; left: 20px; height: 18px; padding: 0 9px; display: inline-flex; align-items: center; border-radius: var(--r); background: var(--accent-solid); border: 1px solid var(--accent-solid); color: #fff; font-size: 10px; font-weight: 800; letter-spacing: .04em; }
.plan h3 { font-size: 15px; }
.plan .pd { margin-top: 5px; font-size: 12px; color: var(--text-3); line-height: 1.6; min-height: 38px; }
.plan .pp { margin: 14px 0 4px; font-size: 26px; font-weight: 800; letter-spacing: -.02em; font-family: var(--mono); font-variant-numeric: tabular-nums; }
.plan .pp small { font-size: 12px; font-weight: 500; color: var(--text-3); font-family: var(--font); letter-spacing: 0; margin-left: 3px; }
.plan .pn { font-size: 11px; color: var(--text-4); }
.plan ul { margin: 16px 0 20px; display: flex; flex-direction: column; gap: 9px; font-size: 12.5px; color: var(--text-2); }
.plan ul li { display: flex; gap: 8px; align-items: flex-start; line-height: 1.55; }
.plan ul li::before { content: "✓"; color: var(--ok); font-weight: 800; flex: none; font-size: 11px; margin-top: 2px; }
.plan ul li.no { color: var(--text-4); }
.plan ul li.no::before { content: "·"; color: var(--text-4); }
.plan .btn { margin-top: auto; }

.adm { display: grid; grid-template-columns: 194px minmax(0, 1fr); gap: 14px; align-items: start; }
.adm-nav { background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-2); padding: 8px; position: sticky; top: calc(var(--stick) + 8px); }
.adm-nav h5 { padding: 8px 10px 5px; font-size: 10px; color: var(--text-4); letter-spacing: .06em; }
.adm-nav a { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 7px 10px; border-radius: var(--r); font-size: 12.5px; color: var(--text-2); cursor: pointer; transition: background .1s, color .1s; }
.adm-nav a:hover { background: var(--surface-2); color: var(--text); }
.adm-nav a.on { background: var(--surface-4); color: var(--text); font-weight: 600; }
.adm-nav a .n { font-size: 10.5px; color: var(--text-4); font-family: var(--mono); }
.adm-nav .sep { height: 1px; background: var(--line-soft); margin: 6px 4px; }

.calc-slip { display: flex; flex-direction: column; gap: 6px; }
.calc-row { display: grid; grid-template-columns: minmax(0, 1fr) 84px 28px; gap: 8px; align-items: center; padding: 8px 10px; background: var(--surface-2); border: 1px solid var(--line); border-radius: var(--r-2); }
.calc-row .cm { min-width: 0; }
.calc-row .cm .t { font-size: 14px; font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.calc-row .cm .s { font-size: 12px; color: var(--text-4); margin-top: 2px; display: flex; align-items: center; gap: 5px; flex-wrap: wrap; }
.calc-row .input { height: 30px; text-align: right; font-family: var(--mono); font-variant-numeric: tabular-nums; font-weight: 700; }
.calc-sum { margin-top: 12px; padding: 13px; background: var(--surface-2); border: 1px solid var(--line); border-radius: var(--r-2); }
.calc-line { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; padding: 6px 0; font-size: 14px; color: var(--text-2); }
.calc-line + .calc-line { border-top: 1px solid var(--line-soft); }
.calc-line b { font-family: var(--mono); font-variant-numeric: tabular-nums; font-weight: 700; color: var(--text); font-size: 15px; }
.calc-line.total { margin-top: 4px; padding-top: 12px; border-top: 1px solid var(--line); }
.calc-line.total span { font-size: 14px; color: var(--text); font-weight: 600; }
.calc-line.total b { font-size: 23px; color: var(--ok-soft); letter-spacing: -.02em; }
.calc-pick { display: inline-flex; align-items: center; gap: 5px; height: 30px; padding: 0 10px; border-radius: var(--r); background: var(--surface-3); border: 1px solid var(--line); font-size: 13.5px; color: var(--text-2); cursor: pointer; transition: all .12s; }
.calc-pick:hover { border-color: var(--accent-line); color: var(--text); }
.calc-pick.on { background: var(--accent-solid); border-color: var(--accent-solid); color: #fff; font-weight: 700; }
/*  선택 버튼 안의 차이율은 <b>보조 정보</b>다 — 배당(굵은 mono)보다 작고 흐리게 두어야
    "무엇을 고르는 버튼인지"가 먼저 읽힌다. 담긴 상태(.on)에서는 흰 글자 위라 색을 물려받는다. */
.calc-pick .diff { font-weight: 600; }
.calc-pick.on .diff { color: #fff; opacity: .9; }

/*  '최대차' 칸의 셀렉션 표기 — (승) -4.7% 처럼 숫자 앞에 붙는다(의뢰인 2026-08-30).
    숫자와 같은 크기로 두면 어느 쪽이 값인지 헷갈리므로 한 단계 작고 흐리게 둔다. */
.c-d-sel { display: block; font-size: 11.5px; color: var(--text-4); line-height: 1.4; white-space: nowrap; }

/*  다중 조합 대기 목록(2026-09-02 의뢰인: "여러 조합을 동시에") — 조합 1·2·3… 카드 스택.
    슬립·조합기와 같은 면(surface-2) 위에 조합 카드(surface)를 얹어 계층이 읽히게 한다. */
.heldbox { margin-top: 12px; padding: 10px; background: var(--surface-2); border: 1px solid var(--line); border-radius: var(--r-2); display: flex; flex-direction: column; gap: 8px; }
/* 한 열로 쌓는다 — 좁은 아사이드(286px)에서 옆 배치는 요약 줄이 두 자씩 꺾인다(실측). */
.heldrow { display: flex; flex-direction: column; gap: 6px; padding: 8px 10px; background: var(--surface); border: 1px solid var(--line-soft); border-radius: var(--r-2); }
.heldrow .hm { min-width: 0; display: flex; flex-direction: column; gap: 3px; }
.heldrow .hm .t { display: flex; align-items: center; gap: 6px; font-size: 12.5px; flex-wrap: wrap; }
.heldrow .hm .s { font-size: 11.5px; color: var(--text-3); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.heldrow .ha { display: flex; justify-content: flex-end; gap: 4px; }
.heldbox .calc-sum { margin-top: 2px; padding: 10px 12px; background: var(--surface); }

/*  마이페이지 이용권 구매 카드(2026-09-02 토스 연동) — /pricing 카드의 축약형. 3열, 좁으면 접힌다. */
.buyplans { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 10px; }
.buyplan { display: flex; flex-direction: column; gap: 8px; padding: 14px; background: var(--surface-2); border: 1px solid var(--line); border-radius: var(--r-2); }
.buyplan.best { border-color: var(--accent-line); background: var(--accent-dim); }
.buyplan .bp-head { display: flex; align-items: center; gap: 6px; font-size: 14.5px; }
.buyplan .bp-price { font-size: 19px; font-weight: 800; font-family: var(--mono); font-variant-numeric: tabular-nums; letter-spacing: -.02em; }
.buyplan .bp-price small { font-size: 11.5px; font-weight: 400; color: var(--text-4); font-family: var(--sans); }
.buyplan .bp-desc { font-size: 12px; line-height: 1.6; color: var(--text-3); min-height: 36px; }
.buyplan .bp-points { display: flex; flex-direction: column; gap: 3px; font-size: 12px; color: var(--text-2); flex: 1; }
.buyplan .bp-points li { list-style: none; padding-left: 14px; position: relative; }
.buyplan .bp-points li::before { content: "✓"; position: absolute; left: 0; color: var(--ok-soft); font-size: 11px; }

/*  내 조합 목록의 제목 칸 — 길면 말줄임(제목은 60자까지 저장된다). */
.sliprow .slip-title { font-weight: 700; color: var(--text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 160px; }

/*  가상영수증 미리보기 모달 — 영수증(.receipt, max-width 360px)을 가운데 세운다. */
.rc-modal .rc-center { display: flex; justify-content: center; margin-top: 4px; }
.rc-title { margin-top: 7px; font-size: 13.5px; font-weight: 800; letter-spacing: .02em; }
.rc-memo { margin-top: 2px; font-size: 11.5px; color: var(--text-3); }

/*  조합기 — 슬립 아래로 펼쳐지는 조합표. 계산기 독(우측 하단)에서도 쓰이므로 폭을 넘기지 않는다. */
.combo-box { padding: 11px; background: var(--surface-2); border: 1px solid var(--line); border-radius: var(--r-2); }
/*  조합 목록 — 카드(머리줄 + 경기 줄). 표 5열은 아사이드 폭(≈210px)에서 가로로 넘쳐 카드로 바꿨다(2026-09-10).
    경기 줄은 번호·홈 : 원정·(라인)·선택·배당 — 이름 칸만 말줄임하고 선택·배당은 절대 안 잘린다
    (2026-09-09 의뢰인: 번호 배지만으로는 어떤 경기·몇 배당인지 알 수 없다). */
.combo-legend { display: flex; gap: 8px; font-size: 11px; color: var(--text-4); padding: 0 2px 4px; border-bottom: 1px solid var(--line); }
.combo-legend span:first-child { min-width: 18px; }
.combo-legend .tr { margin-left: auto; }
.combo-list { display: flex; flex-direction: column; gap: 6px; margin-top: 6px; }
.combo-item { padding: 6px 8px; border: 1px solid var(--line); border-radius: var(--r-2); background: var(--surface); min-width: 0; }
.combo-hd { display: flex; align-items: center; gap: 6px; font-size: 12.5px; }
.combo-hd .cno { min-width: 18px; color: var(--text-3); font-weight: 700; }
.combo-hd .combo-odds { margin-left: auto; color: var(--text-2); }
.combo-hd .combo-pay { color: var(--accent-2); }
.combo-hd .btn { height: 24px; padding: 0 8px; }
.combo-legs { margin-top: 4px; overflow: hidden; }
.combo-leg { display: flex; align-items: center; gap: 5px; min-width: 0; line-height: 18px; white-space: nowrap; }
.combo-leg + .combo-leg { margin-top: 2px; }
.combo-leg .slip-no { margin-right: 0; flex: none; }
.combo-leg-name { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; color: var(--text-2); }
.combo-leg-name .muted { margin: 0 1px; }
.combo-leg .chip-line { flex: none; }
.combo-leg-sel { flex: none; color: var(--text); }
.combo-leg-odds { flex: none; min-width: 34px; text-align: right; color: var(--accent-2); font-weight: 700; }
/*  슬립 번호 — 슬립 목록과 조합표의 경기 줄이 같은 모양으로 찍어 눈으로 대조한다. */
.slip-no {
    display: inline-flex; align-items: center; justify-content: center;
    min-width: 18px; height: 18px; margin-right: 3px; padding: 0 4px;
    border-radius: 4px; background: var(--surface-3); border: 1px solid var(--line);
    font-size: 11px; font-weight: 700; color: var(--text-3); line-height: 1;
}

.doc { font-size: 13px; line-height: 1.85; color: var(--text-2); }
.doc h2 { font-size: 14.5px; color: var(--text); margin: 24px 0 10px; padding-bottom: 8px; border-bottom: 1px solid var(--line-soft); }
.doc h2:first-child { margin-top: 0; }
.doc h3 { font-size: 13px; color: var(--text); margin: 16px 0 6px; }
.doc p + p { margin-top: 10px; }
.doc ul { margin: 8px 0; padding-left: 16px; list-style: disc; }
.doc ol { margin: 8px 0; padding-left: 18px; list-style: decimal; }
.doc li { margin: 4px 0; }
.doc .updated { font-size: 11.5px; color: var(--text-4); margin-bottom: 18px; }

.faq li { border-bottom: 1px solid var(--line-soft); }
.faq li:last-child { border-bottom: 0; }
.faq .q { display: flex; align-items: center; gap: 10px; width: 100%; padding: 13px 13px; background: transparent; border: 0; text-align: left; cursor: pointer; font-size: 13px; color: var(--text); font-weight: 500; transition: background .1s; }
.faq .q:hover { background: var(--row-hover); }
.faq .q .qm { flex: none; width: 18px; color: var(--accent); font-weight: 800; font-size: 12px; }
.faq .q .ch { margin-left: auto; color: var(--text-4); font-size: 10px; transition: transform .16s; }
.faq .q.on .ch { transform: rotate(180deg); }
.faq .a { padding: 0 13px 15px 41px; font-size: 12.5px; line-height: 1.8; color: var(--text-2); }

/* ── 15. 푸터 · 모바일 ─────────────────────────────────────────────────── */
.foot { flex: none; background: var(--surface); border-top: 1px solid var(--line); padding: 24px 0 28px; font-size: 12px; color: var(--text-3); }
.foot-top { display: flex; justify-content: space-between; gap: 32px; flex-wrap: wrap; padding-bottom: 18px; border-bottom: 1px solid var(--line-soft); }
.foot-brand { max-width: 340px; }
.foot-brand .logo-mark { font-size: 15px; color: var(--text); }
.foot-brand p { margin-top: 9px; line-height: 1.65; color: var(--text-4); font-size: 11.5px; }
.foot-links { display: flex; gap: 38px; flex-wrap: wrap; }
.foot-links section { min-width: 94px; }
.foot-links h4 { font-size: 11.5px; color: var(--text-2); margin-bottom: 9px; }
.foot-links li + li { margin-top: 6px; }
.foot-links a { color: var(--text-4); transition: color .12s; }
.foot-links a:hover { color: var(--text-2); }
.foot-legal { padding-top: 15px; display: flex; justify-content: space-between; gap: 20px; flex-wrap: wrap; font-size: 11px; color: var(--text-4); line-height: 1.7; }
.foot-legal b { color: var(--text-3); font-weight: 600; }
/*  합법 이용 안내(LegalUseNotice) — 축약형은 표 아래·푸터처럼 안내 띠를 세울 수 없는 자리에 쓴다.
    기본형은 .notice 규칙을 그대로 타므로 여기서는 축약형만 정의한다. */
.legal-use.compact { font-size: 11.5px; line-height: 1.7; color: var(--text-3); }
.legal-use.compact b { color: var(--text-2); }

.foot-disc { margin-top: 12px; padding: 10px 12px; border: 1px solid var(--line-soft); border-left: 2px solid var(--warn); border-radius: 0 var(--r) var(--r) 0; background: var(--warn-dim); color: var(--text-3); font-size: 11px; line-height: 1.65; }

.tabbar { display: none; position: fixed; left: 0; right: 0; bottom: 0; z-index: 70; height: calc(52px + env(safe-area-inset-bottom)); padding-bottom: env(safe-area-inset-bottom); background: var(--surface); border-top: 1px solid var(--line); }
.tabbar ul { display: flex; height: 52px; }
.tabbar li { flex: 1 1 0; }
.tabbar a, .tabbar label { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 3px; height: 100%; font-size: 11px; color: var(--text-3); font-weight: 600; cursor: pointer; }
.tabbar a.on { color: var(--accent-2); }
.tabbar .ic { font-size: 16px; line-height: 1; }

/* 드로어는 <input type=checkbox #nav-open> 하나로 연다.
   @onclick 으로 열던 시절에는 <b>정적 SSR 페이지(랜딩·약관·계정)에서 회로가 없어 햄버거가 죽어 있었다</b> —
   그 폭(≤860px)에서는 GNB도 숨겨지므로 모바일 방문자에게 이동 수단이 아예 없었다.
   체크박스는 회로가 있든 없든 똑같이 동작하므로 두 렌더 모드에서 같은 코드로 열린다. */
.nav-open { position: fixed; top: 0; left: 0; width: 1px; height: 1px; opacity: 0; pointer-events: none; }
.drawer-veil { display: none; position: fixed; inset: 0; z-index: 90; background: rgba(6, 9, 12, .62); backdrop-filter: blur(2px); animation: fade .18s ease; }
.drawer { position: fixed; top: 0; right: 0; bottom: 0; z-index: 91; width: min(310px, 86vw); background: var(--surface); border-left: 1px solid var(--line); display: flex; flex-direction: column; overflow-y: auto; visibility: hidden; transform: translateX(100%); transition: transform .2s cubic-bezier(.2, .8, .3, 1), visibility .2s; }
.nav-open:checked ~ .drawer-veil { display: block; }
.nav-open:checked ~ .drawer { visibility: visible; transform: none; }
.drawer-head { display: flex; align-items: center; justify-content: space-between; height: var(--hdr-h); padding: 0 14px; border-bottom: 1px solid var(--line); flex: none; }
.drawer-head .logo-mark { color: var(--text); }
.drawer-body { padding: 8px 0 20px; }
.drawer-sec { padding: 10px 0; border-bottom: 1px solid var(--line-soft); }
.drawer-sec h5 { padding: 0 16px 6px; font-size: 10.5px; color: var(--text-4); letter-spacing: .06em; }
.drawer a.dl { display: flex; align-items: center; justify-content: space-between; padding: 9px 16px; font-size: 13.5px; color: var(--text-2); font-weight: 500; }
.drawer a.dl:hover, .drawer a.dl.on { color: var(--text); background: var(--surface-2); }
.drawer-foot { padding: 14px 16px; display: flex; gap: 8px; }

/* ── 16. 유틸 ──────────────────────────────────────────────────────────── */
.row { display: flex; align-items: center; gap: 8px; }
.row.wrap { flex-wrap: wrap; }
.row.between { justify-content: space-between; }
.row.end { justify-content: flex-end; }
.col { display: flex; flex-direction: column; gap: 8px; }
.grow { flex: 1 1 auto; min-width: 0; }
.gap4 { gap: 4px; } .gap12 { gap: 12px; } .gap16 { gap: 16px; }
.mt8 { margin-top: 8px; } .mt12 { margin-top: 12px; } .mt16 { margin-top: 16px; } .mt24 { margin-top: 24px; }
.mb8 { margin-bottom: 8px; } .mb12 { margin-bottom: 12px; } .mb16 { margin-bottom: 16px; }
.hide { display: none !important; }
.sw { display: inline-block; width: 9px; height: 9px; border-radius: 2px; vertical-align: -1px; flex: none; }
.sw-dom { background: var(--dom-sw); }
.sw-for { background: var(--for-sw); }

tr.expired-row, .mrow.expired-row, .mcard.expired-row { display: none; }

/* v1 모바일 카드 — 다른 페이지가 아직 쓰고 있어 유지한다 */
.mcards { display: none; flex-direction: column; gap: 8px; }
.mcard { background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-2); border-left: 3px solid var(--line-strong); overflow: hidden; }
.mcard.is-value { border-left-color: var(--dom); }
.mcard.is-off { opacity: .5; }
.mcard-top { display: flex; align-items: center; gap: 8px; padding: 8px 10px; background: var(--surface-2); border-bottom: 1px solid var(--line-soft); font-size: 12px; }
.mcard-top .no { color: var(--text-3); font-family: var(--mono); }
.mcard-top .when { margin-left: auto; color: var(--text-2); font-family: var(--mono); }
.mcard-vs { padding: 9px 10px 4px; }
.mcard-vs .h { font-size: 15px; font-weight: 700; }
.mcard-vs .a { font-size: 13.5px; color: var(--text-2); margin-top: 2px; }
.mcard-odds { display: grid; padding: 8px 10px 10px; grid-template-columns: 44px repeat(3, minmax(0, 1fr)); }
.mcard-odds .rl { display: flex; align-items: center; font-size: 11.5px; color: var(--text-4); font-weight: 700; }
.mcard-odds .cell { text-align: center; padding: 5px 2px; border-radius: var(--r); background: var(--surface-2); border: 1px solid var(--line-soft); }
.mcard-odds .cell .v { font-family: var(--mono); font-variant-numeric: tabular-nums; font-weight: 700; font-size: 15px; }
.mcard-odds .cell.adv-dom { background: var(--dom-tint); border-color: rgba(224, 87, 76, .3); }
.mcard-odds .cell.adv-dom .v { color: var(--dom-soft); }
.mcard-odds .cell.adv-for { background: var(--for-tint); border-color: rgba(61, 130, 208, .3); }
.mcard-odds .cell.adv-for .v { color: var(--for-soft); }
.mcard-odds .hd { font-size: 11px; color: var(--text-4); text-align: center; font-weight: 700; padding-bottom: 3px; }
.mcard-foot { display: flex; align-items: center; gap: 8px; padding: 7px 10px; border-top: 1px solid var(--line-soft); font-size: 12px; color: var(--text-3); }

/* ── 17. 반응형 ────────────────────────────────────────────────────────── */
@media (max-width: 1360px) {
    :root { --aside: 258px; --nav-w: 196px; }
}

/*  좌측 리그 트리는 1460px부터 접는다(종전 1180) — 본문(경기 목록)이 우선이다.
    §20 트랙이 굵어진 뒤로는(고정폭 648px + 경기명) 그 아래 폭에서 트리·경기명이 공존할 수 없다
    (실측: 1500px에서도 트리를 두면 경기명이 140px로 눌려 글자가 세로로 깨졌다).
    .shell 3단(leftnav 포함)은 배당 비교 화면 전용이라 다른 화면에는 영향이 없다. */
@media (max-width: 1460px) {
    .shell { grid-template-columns: minmax(0, 1fr) var(--aside); }
    .shell > .leftnav { display: none; }
}

@media (max-width: 1180px) {
    .shell.no-aside { grid-template-columns: minmax(0, 1fr); }
}

@media (max-width: 1000px) {
    .shell, .shell.no-left, .cols { grid-template-columns: minmax(0, 1fr); }
    .aside { position: static; flex-direction: row; flex-wrap: wrap; }
    .aside > * { flex: 1 1 258px; }
    .adm { grid-template-columns: minmax(0, 1fr); }
    .adm-nav { position: static; display: flex; flex-wrap: wrap; gap: 2px; }
    .adm-nav h5, .adm-nav .sep { display: none; }
    .adm-nav a { flex: 0 0 auto; }
}

/*  GNB→햄버거 임계는 <b>1300px</b>이다(1120 아님 — 2026-08-23 재산정).
    .gnb 는 overflow:hidden 인데 그 안의 링크는 nowrap 이라 한 픽셀도 줄지 않는다 —
    폭이 모자라면 말줄임 없이 <b>글자 중간에서 잘린다</b>. 메뉴가 8개('전체 경기' 추가)로 늘고
    폰트가 14.5px로 커져 (padding 24×8 + 한글 27자) ≈ 570px 이 필요하고, 로고(≈250)와
    로그인 시 계정 영역(쪽지·닉네임·로그아웃 ≈ 415px)·gap을 빼면 뷰포트 약 1300px 부터다.
    임계가 낮던 시절에는 그 사이 구간에서 '커뮤니티'가 통째로 잘린 채 <b>햄버거도 없어</b>
    그 메뉴로 갈 방법이 화면에서 사라졌다 — 메뉴·폰트를 바꾸면 이 수치를 다시 계산할 것.
    계정 버튼(.opt)을 숨기는 임계는 860 그대로 둔다 — 그 폭까지는 로그인·회원가입이 보이는 편이 낫다. */
@media (max-width: 1300px) {
    .gnb { display: none; }
    .burger { display: flex; }
    .logo-sub { display: none; }
    .head-main { gap: 10px; }
}

@media (max-width: 860px) {
    .head-act .opt { display: none; }
}

@media (max-width: 760px) {
    :root { --hdr-h: 48px; --sport-h: 36px; }
    .main { padding: 10px 0 74px; }
    .wrap { padding: 0 10px; }
    .tabbar { display: block; }

    /*  탭바는 fixed·불투명이고 <b>푸터는 .main 의 형제</b>다 — .main 의 하단 74px 은 푸터를 지켜 주지 못한다.
        이게 없으면 문서 최하단의 법정 고지문("미성년자는 이용할 수 없습니다")이 탭바 뒤로 잘린다
        (안드로이드 13px, 노치 기기 47px ≈ 2.6줄). 하필 잘리는 문장이라 반드시 확보한다. */
    .foot { padding-bottom: calc(28px + 52px + env(safe-area-inset-bottom)); }
    .phead h1 { font-size: 17px; }
    .board { border-left: 0; border-right: 0; border-radius: 0; margin: 0 -10px; }

    /*  날짜 스트립에서 날짜칩(08/16 13시)을 뺀다. 칩까지 그리면 버튼 5개가 약 510px라
        360~430px 화면에서 '12시간·24시간'이 통째로 잘려 나가 필터를 아예 못 쓴다.
        칩을 빼면 약 270px라 그대로 들어간다 — 가로 스크롤 UI를 새로 만드는 것보다 안전하고,
        라벨(3·6·12·24시간)만으로 뜻이 통한다. */
    .datestrip .d { display: none; }

    /* 경기 행을 2줄로 접는다: 위=별·시각·팀·판정, 아래=배당 3칸.
       좁은 화면에서 팀명과 배당을 한 줄에 밀어 넣으면 둘 다 못 읽는다. */
    .mcols { display: none; }
    /* 첫 칼럼은 별 버튼 자리. 20px이면 아래에서 넓힌 히트 영역이 칼럼에 막혀 눌리는 폭이 그대로다. */
    .mcols, .mrow, .mcols.n2, .mrow.n2 { grid-template-columns: 24px 52px minmax(0, 1fr) auto; }
    .mrow { padding: 7px 10px; row-gap: 6px; }

    /*  터치 타겟 — 시각 크기는 그대로 두고 히트 영역만 넓힌다(패딩만큼 음수 마진을 줘 배치는 불변).
        별(★)은 스크롤되는 목록 안에서 12px짜리라 자주 빗나가고, 띠의 ✕는 그 띠의 유일한 닫기 수단이다.
        ✕는 margin-left:auto 로 오른쪽 끝에 붙어 있으므로 왼쪽 마진만은 auto를 유지해야 한다. */
    .m-star { padding: 10px; margin: -10px; }
    .sostrip-head .x { padding: 10px; margin: -10px -10px -10px auto; }

    /* 배당 묶음은 2행 전체를 쓰고, 판정 배지는 1행 오른쪽 끝에 고정한다.
       자동 배치에 맡기면 배지가 3행으로 밀려 혼자 왼쪽 아래에 떨어진다. */
    .m-tag { grid-row: 1; grid-column: 4; }
    .m-os { display: grid; grid-row: 2; grid-column: 1 / -1; gap: 4px; }
    .mrow.n3 .m-os { grid-template-columns: repeat(3, minmax(0, 1fr)); }
    .mrow.n2 .m-os { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .m-o { padding: 4px 3px; margin: 0; border: 1px solid var(--line-soft); background: var(--surface-2); }
    .m-o .lbl { display: block; font-size: 10.5px; color: var(--text-4); font-weight: 700; }

    /*  별도 해외는 3행 전체를 쓰는 한 줄로 눕힌다. 좁은 화면에서 배당 3칸 옆에 끼워 넣으면
        네 칸 모두 못 읽는 폭이 되고, 북 이름은 잘려서 "어느 사이트인지"를 못 말하게 된다. */
    .m-alt {
        grid-row: 3; grid-column: 1 / -1; margin: 0; padding: 4px 7px;
        display: flex; align-items: center; gap: 6px; text-align: left;
        border: 1px solid var(--line-soft); background: var(--surface-2);
    }
    .m-alt::before { content: "별도 해외"; flex: none; font-size: 10.5px; font-weight: 700; color: var(--text-4); }
    .m-alt .v { display: inline; }
    .m-alt .bk { display: inline; margin: 0; }
    .m-alt .f { margin-left: auto; }
    .m-alt.is-na { display: none; }   /* 값이 없는 행(핸디캡·언더오버)은 모바일에서 줄을 낭비하지 않는다 */

    .bkstrip { padding: 9px 10px 10px; }
    .bkstrip .tablewrap { max-height: 260px; }
    .bktbl td:first-child, .bktbl th:first-child { width: auto; }

    /*  동일배당 사례 표 — 8열 594px는 375px 화면에서 승/무/패·결과가 화면 밖으로 밀려
        "동일배당이 안 보인다"가 된다(2026-08-26 모바일 실측). 게임정보(회차#번호)·리그를 숨기고
        밀도를 줄이면 남는 열(일시·팀:스코어·배당 3칸·결과)이 한 화면에 들어온다 —
        적중 칸 강조와 결과 배지가 이 표의 핵심이라 그 둘은 반드시 화면 안에 있어야 한다. */
    .sostrip .so-info, .sostrip .so-lg, .sostrip .so-line { display: none; }
    .sostrip .tbl { font-size: 12px; }
    .sostrip .tbl thead th { padding: 6px 4px; }
    .sostrip .tbl tbody td { padding: 6px 4px; }
    /*  table-layout:fixed — 자동 레이아웃은 셀 min-content("25.10.05(일)" 71px 등) 밑으로 못 줄어
        지정 폭이 무시된다. 고정 레이아웃 + 줄바꿈 허용으로 375px 안에 강제로 맞춘다. */
    .sostrip .tbl { table-layout: fixed; width: 100%; }
    .sostrip .so-when { width: 56px !important; white-space: normal; word-break: break-all; }
    .sostrip .tbl .pb-odds { width: 40px !important; padding-left: 2px; padding-right: 2px; }
    .sostrip .so-res { width: 48px !important; padding-left: 2px; padding-right: 2px; }
    .sostrip .so-res .badge { padding: 2px 4px; font-size: 10.5px; }
    .sostrip .pb-team { white-space: normal; overflow-wrap: anywhere; }

    .tbl { font-size: 13px; }
    .tbl thead th { padding: 7px 8px; font-size: 11px; }
    .tbl tbody td { padding: 7px 8px; }

    .blist .bcat { display: none; }
    .blist .bmeta .vw { display: none; }
    .blist a { padding: 10px 12px; gap: 8px; }
    .blist .bti { font-size: 12.5px; }

    .panel-body { padding: 11px; }
    .grid-form { grid-template-columns: minmax(0, 1fr); }
    .tiles { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .foot-links { gap: 22px; }
    .modal { max-height: 92vh; }
    .modal-veil { padding: 10px; }
    .auth { min-height: auto; padding: 22px 10px 70px; }
    .calc-row { grid-template-columns: minmax(0, 1fr) 66px 24px; }
    .board-table { display: none; }
    .mcards { display: flex; }
}

@media (max-width: 420px) {
    .tiles { grid-template-columns: minmax(0, 1fr); }
    .mcard-odds { grid-template-columns: 38px repeat(3, minmax(0, 1fr)); }
    .plan { padding: 18px 16px; }
}

@media print {
    .head, .sports, .subnav, .tabbar, .foot, .phead-act, .leftnav, .aside { display: none !important; }
    body { background: #fff; color: #111; }
    .panel, .board { border-color: #ccc; }
}

@media (prefers-reduced-motion: reduce) {
    *, *::before, *::after { animation-duration: .01ms !important; animation-iteration-count: 1 !important; transition-duration: .01ms !important; }
}

#blazor-error-ui { display: none; position: fixed; bottom: 0; left: 0; right: 0; z-index: 200; background: #7a1f1f; color: #fff; padding: 9px 16px; font-size: 13px; }
#blazor-error-ui .reload { color: #fff; text-decoration: underline; }
#blazor-error-ui .dismiss { cursor: pointer; float: right; }

/* ══════════════════════════════════════════════════════════════════════════
   18. 랜딩(/) — 비로그인 방문자 전용 표면
   ──────────────────────────────────────────────────────────────────────────
   여기만 다른 리듬을 쓴다. 앱 화면(.wrap/.phead/.panel)은 13px 밀도로 "일하는 화면"이지만,
   랜딩은 처음 온 사람이 3초 안에 무엇인지 알아야 하는 "읽는 화면"이다. 그래서 이 섹션에서만
   유동 타이포(clamp)와 섹션 리듬(48~88px)을 쓴다 — 대신 DESIGN.md §2의 금지는 그대로 지킨다:
   장식 그라데이션 없음(격자는 1px 헤어라인 패턴이다), 라운드는 --r-3(10px)이 상한,
   그림자는 히어로 데모 카드 하나만, 색은 의미색(--dom 국내 / --for 해외)만 쓴다.

   ※ 랜딩 루트는 .wrap 이 아니라 .ld 다. 배경 띠(.ld-band)가 화면 폭을 꽉 채워야 하고,
     읽기 폭은 .ld-in(1180px)이 따로 잡기 때문이다. 이 예외는 DESIGN.md §7에 적어 두었다.
   ══════════════════════════════════════════════════════════════════════════ */

.ld { margin-top: -12px; }
.ld-in { max-width: 1180px; margin: 0 auto; padding: 0 clamp(14px, 3vw, 28px); }
.ld-band { padding: clamp(44px, 6.5vw, 84px) 0; border-top: 1px solid var(--line-soft); }
.ld-band.alt { background: var(--surface-2); }
.ld-band.tight { padding: clamp(28px, 4vw, 46px) 0; }

/* 타이포 — 랜딩 전용 스케일 */
.ld-eyebrow { display: inline-flex; align-items: center; gap: 7px; font-family: var(--mono); font-size: 11px; letter-spacing: .1em; text-transform: uppercase; color: var(--text-3); margin-bottom: 14px; }
.ld-eyebrow .dot { width: 6px; height: 6px; border-radius: 50%; background: var(--ok); box-shadow: 0 0 0 3px var(--ok-dim); animation: pip 2s ease-in-out infinite; }
h1.ld-h1 { font-size: clamp(25px, 4.2vw, 43px); line-height: 1.22; letter-spacing: -.022em; font-weight: 800; color: var(--text); margin: 0; }
.ld-h1 .em { color: var(--dom-soft); }
.ld-lede { margin-top: 16px; font-size: clamp(13.5px, 1.35vw, 15.5px); line-height: 1.75; color: var(--text-2); max-width: 47ch; }
.ld-h2 { font-size: clamp(18px, 2.2vw, 26px); line-height: 1.3; letter-spacing: -.015em; font-weight: 750; color: var(--text); margin: 0; }
.ld-h2s { margin-top: 9px; font-size: 13px; line-height: 1.7; color: var(--text-2); max-width: 62ch; }
.ld-head { margin-bottom: clamp(20px, 2.6vw, 32px); }

/* 히어로 */
.ld-hero { position: relative; overflow: hidden; border-top: 0; padding-top: clamp(34px, 5vw, 66px); }
/* 데이터 표를 연상시키는 1px 격자. 장식 그라데이션이 아니라 선 패턴이며, 중간 회색 알파라
   라이트·다크 양쪽에서 같은 세기로 보인다(테마 토큰이 필요 없다). */
.ld-hero::before {
    content: ""; position: absolute; inset: 0; pointer-events: none;
    background-image: linear-gradient(to right, rgba(128, 140, 152, .085) 1px, transparent 1px),
                      linear-gradient(to bottom, rgba(128, 140, 152, .085) 1px, transparent 1px);
    background-size: 44px 44px;
    -webkit-mask-image: radial-gradient(115% 80% at 20% 0%, #000 35%, transparent 78%);
    mask-image: radial-gradient(115% 80% at 20% 0%, #000 35%, transparent 78%);
}
.ld-hero > * { position: relative; }
.ld-hero-cols { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.06fr); gap: clamp(26px, 4.4vw, 54px); align-items: center; }
.ld-cta-row { display: flex; flex-wrap: wrap; gap: 9px; margin-top: 24px; }
.ld-cta-note { margin-top: 11px; font-size: 12px; color: var(--text-3); }
.ld-cta-note b { color: var(--text-2); }

/* 히어로 데모 — 실제 배당 화면의 축약. 지어낸 수치가 아니라 '화면 예시'임을 라벨로 못 박는다. */
.ld-demo { border: 1px solid var(--line); border-radius: var(--r-3); background: var(--surface); box-shadow: var(--pop-sm); overflow: hidden; }
.ld-demo-head { display: flex; align-items: center; gap: 8px; padding: 9px 12px; background: var(--surface-2); border-bottom: 1px solid var(--line); }
.ld-demo-head .t { font-size: 11.5px; font-weight: 700; color: var(--text-2); }
.ld-demo-head .sp { flex: 1; }
.ld-dcols { display: grid; grid-template-columns: minmax(0, 1fr) 64px 64px 62px; gap: 8px; padding: 7px 12px; background: var(--surface-2); border-bottom: 1px solid var(--line-soft); font-size: 10.5px; color: var(--text-3); letter-spacing: .02em; }
.ld-dcols span:not(:first-child) { text-align: right; }
.ld-drow { display: grid; grid-template-columns: minmax(0, 1fr) 64px 64px 62px; gap: 8px; align-items: center; padding: 9px 12px; border-bottom: 1px solid var(--line-soft); }
.ld-drow:last-child { border-bottom: 0; }
.ld-drow .lg { flex: none; }
.ld-dteam { min-width: 0; }
.ld-dteam .h { font-size: 12.5px; font-weight: 650; color: var(--text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.ld-dteam .a { font-size: 12.5px; color: var(--text-2); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.ld-dteam .m { margin-top: 2px; font-size: 10.5px; color: var(--text-4); }
.ld-dv { font-family: var(--mono); font-size: 13.5px; font-weight: 700; text-align: right; }
.ld-dv.dom { color: var(--dom-soft); }
.ld-dv.for { color: var(--for-soft); }
.ld-dv .u { display: block; font-size: 9.5px; font-weight: 500; color: var(--text-4); letter-spacing: .02em; }
.ld-ddiff { text-align: right; font-family: var(--mono); font-size: 12.5px; font-weight: 800; padding: 3px 0; }
.ld-drow.hit { background: var(--dom-tint); }
.ld-demo-foot { padding: 8px 12px; background: var(--surface-2); border-top: 1px solid var(--line); font-size: 11px; color: var(--text-3); }

/* 스펙 스트립 — 지어낸 홍보 수치가 아니라 수집 범위의 사실을 적는다 */
.ld-spec { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); border: 1px solid var(--line); border-radius: var(--r-2); background: var(--surface); overflow: hidden; }
.ld-spec-i { padding: 15px 16px; border-left: 1px solid var(--line-soft); }
.ld-spec-i:first-child { border-left: 0; }
.ld-spec-v { font-family: var(--mono); font-size: clamp(17px, 2vw, 21px); font-weight: 800; color: var(--text); letter-spacing: -.01em; }
.ld-spec-v small { font-size: 12px; font-weight: 600; color: var(--text-3); margin-left: 2px; }
.ld-spec-l { margin-top: 5px; font-size: 11.5px; line-height: 1.55; color: var(--text-3); }

/* 3단계 도해 */
.ld-steps { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 14px; }
.ld-step { position: relative; padding: 20px 18px; border: 1px solid var(--line); border-radius: var(--r-2); background: var(--surface); }
.ld-step-n { display: inline-flex; align-items: center; justify-content: center; width: 24px; height: 24px; border-radius: var(--r); background: var(--surface-3); font-family: var(--mono); font-size: 11.5px; font-weight: 800; color: var(--text-2); }
.ld-step svg { display: block; margin: 14px 0 12px; color: var(--accent); }
.ld-step h3 { font-size: 14px; font-weight: 700; margin: 0 0 7px; color: var(--text); }
.ld-step p { font-size: 12.5px; line-height: 1.72; color: var(--text-2); margin: 0; }

/* 기능 카드 */
.ld-feats { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 14px; }
.ld-feat { padding: 18px; border: 1px solid var(--line); border-radius: var(--r-2); background: var(--surface); transition: border-color .16s, transform .16s; }
.ld-feat:hover { border-color: var(--line-strong); transform: translateY(-2px); }
.ld-feat h3 { display: flex; align-items: center; gap: 8px; font-size: 13.5px; font-weight: 700; margin: 0 0 8px; color: var(--text); }
.ld-feat h3 svg { color: var(--accent); flex: none; }
.ld-feat p { font-size: 12.5px; line-height: 1.72; color: var(--text-2); margin: 0; }
.ld-mini { margin-top: 13px; padding: 9px 10px; border: 1px solid var(--line-soft); border-radius: var(--r); background: var(--surface-2); font-family: var(--mono); font-size: 11.5px; color: var(--text-2); display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }

/* FAQ — 정적 SSR이라 details/summary로 연다(회로 불필요) */
.ld-faq { border: 1px solid var(--line); border-radius: var(--r-2); background: var(--surface); overflow: hidden; }
.ld-faq details { border-bottom: 1px solid var(--line-soft); }
.ld-faq details:last-child { border-bottom: 0; }
.ld-faq summary { display: flex; align-items: center; gap: 10px; padding: 15px 16px; cursor: pointer; font-size: 13.5px; font-weight: 650; color: var(--text); list-style: none; }
.ld-faq summary::-webkit-details-marker { display: none; }
.ld-faq summary::after { content: "+"; margin-left: auto; font-family: var(--mono); font-size: 15px; color: var(--text-3); transition: transform .16s; }
.ld-faq details[open] summary::after { transform: rotate(45deg); }
.ld-faq summary:hover { background: var(--row-hover); }
.ld-faq .a { padding: 0 16px 16px 16px; font-size: 12.5px; line-height: 1.8; color: var(--text-2); }

/* 마무리 CTA */
.ld-end { display: flex; align-items: center; justify-content: space-between; gap: 20px; flex-wrap: wrap; padding: clamp(22px, 3vw, 32px); border: 1px solid var(--line); border-radius: var(--r-2); background: var(--surface); }
.ld-end h2 { font-size: clamp(17px, 2vw, 22px); font-weight: 750; margin: 0 0 7px; color: var(--text); }
.ld-end p { font-size: 12.5px; color: var(--text-2); margin: 0; }

/* 등장 애니메이션 — land.js가 <html>에 .js-reveal을 붙일 때만 숨긴다(JS 실패 시 그냥 다 보인다) */
.js-reveal .ld-reveal { opacity: 0; transform: translateY(9px); }
.js-reveal .ld-reveal.is-in { opacity: 1; transform: none; transition: opacity .52s cubic-bezier(.22, .61, .36, 1), transform .52s cubic-bezier(.22, .61, .36, 1); }
.js-reveal .ld-reveal[data-d="1"].is-in { transition-delay: .07s; }
.js-reveal .ld-reveal[data-d="2"].is-in { transition-delay: .14s; }
.js-reveal .ld-reveal[data-d="3"].is-in { transition-delay: .21s; }

@media (max-width: 1000px) {
    .ld-hero-cols { grid-template-columns: minmax(0, 1fr); gap: 30px; }
    .ld-lede { max-width: none; }
    .ld-steps, .ld-feats { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .ld-feats > :last-child:nth-child(odd) { grid-column: 1 / -1; }
}

@media (max-width: 760px) {
    /* .ld의 음수 마진은 .main 의 위쪽 패딩을 정확히 상쇄하려는 것인데, 이 폭에서 그 패딩이
       12px→10px로 줄어 2px만큼 헤더 위로 파고들었다. 같은 값으로 맞춘다. */
    .ld { margin-top: -10px; }

    .ld-spec { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .ld-spec-i:nth-child(3) { border-left: 0; }
    .ld-spec-i:nth-child(n+3) { border-top: 1px solid var(--line-soft); }
    .ld-steps, .ld-feats { grid-template-columns: minmax(0, 1fr); }
    .ld-cta-row .btn { flex: 1 1 auto; justify-content: center; }
    .ld-dcols, .ld-drow { grid-template-columns: minmax(0, 1fr) 54px 54px 56px; gap: 6px; padding-left: 10px; padding-right: 10px; }
    .ld-end { flex-direction: column; align-items: stretch; }
    .ld-end .btn { justify-content: center; }
}

@media (max-width: 420px) {
    .ld-dcols span:nth-child(3), .ld-drow > .ld-dv.for { display: none; }
    .ld-dcols, .ld-drow { grid-template-columns: minmax(0, 1fr) 56px 58px; }
}

/* ══════════════════════════════════════════════════════════════════════════
   19. 이용권 잠금(플랜 게이트)

   상위 이용권에서만 열리는 기능을 만났을 때의 표면이다. 두 가지를 동시에 해야 한다:
     (1) 왜 막혔는지 즉시 알린다 — "권한이 없습니다" 같은 오류 화면으로 보이면 안 된다.
     (2) 여기서 바로 결제로 갈 수 있게 한다 — 무엇이 열리는지 · 얼마인지 · 어디를 누르는지.

   장식은 넣지 않는다(DESIGN.md §2). 강조는 좌측 3px 강조선과 자물쇠 하나뿐이고,
   나머지는 본문과 같은 밀도·같은 글자 크기를 쓴다.
   ═══════════════════════════════════════════════════════════════════════ */

.plock {
    position: relative;
    background: var(--surface);
    border: 1px solid var(--line);
    border-left: 3px solid var(--accent-2);
    border-radius: var(--r-3);
    padding: 20px 22px 18px;
}

.plock-top { display: flex; align-items: flex-start; gap: 12px; }

.plock-ic {
    flex: none; width: 34px; height: 34px; display: grid; place-items: center;
    background: var(--surface-2); border: 1px solid var(--line); border-radius: var(--r-2);
    color: var(--accent-2);
}
.plock-ic svg { width: 17px; height: 17px; display: block; }

.plock-kicker {
    display: flex; align-items: center; gap: 6px; flex-wrap: wrap;
    font-size: 12px; color: var(--text-4); letter-spacing: .02em;
}
.plock h3 { font-size: 17px; margin-top: 3px; }
.plock-lede { margin-top: 8px; font-size: 13.5px; line-height: 1.75; color: var(--text-2); }

/* 무엇이 열리는지 — 잠긴 화면에서 가장 많이 읽히는 부분이라 본문 밀도로 촘촘히 쌓는다. */
.plock-pts { margin-top: 12px; display: flex; flex-direction: column; gap: 6px; }
.plock-pts li {
    position: relative; padding-left: 17px;
    font-size: 13px; line-height: 1.65; color: var(--text-2);
}
.plock-pts li::before {
    content: ""; position: absolute; left: 2px; top: 7px;
    width: 5px; height: 5px; border-radius: 50%; background: var(--accent-2);
}

.plock-buy {
    margin-top: 16px; padding-top: 14px; border-top: 1px solid var(--line-soft);
    display: flex; align-items: center; justify-content: space-between; gap: 14px; flex-wrap: wrap;
}
.plock-price { display: flex; align-items: baseline; gap: 4px; }
.plock-price b { font-size: 20px; color: var(--text); }
.plock-price small { font-size: 11.5px; color: var(--text-4); }
.plock-act { display: flex; gap: 8px; flex-wrap: wrap; }

.plock-foot { margin-top: 12px; font-size: 11px; line-height: 1.7; color: var(--text-4); }

/* 사이드 위젯·행 안에 끼우는 축소판. 값이 아니라 안내가 목적이라 가격·버튼만 남긴다. */
.plock.sm { padding: 14px 15px 13px; }
.plock.sm h3 { font-size: 14.5px; }
.plock.sm .plock-lede { font-size: 12.5px; margin-top: 6px; }
.plock.sm .plock-buy { margin-top: 12px; padding-top: 11px; }
.plock.sm .plock-price b { font-size: 16px; }

/* 잠긴 버튼(서브내비 등) — 누를 수는 있고, 누르면 잠금 안내가 뜬다.
   disabled로 두지 않는 이유: 클릭이 곧 결제 동선의 시작점이기 때문이다. */
.lockbtn { opacity: .72; }
.lockbtn .lk {
    display: inline-flex; align-items: center; margin-left: 5px;
    font-size: 10.5px; font-weight: 800; letter-spacing: .06em;
    color: var(--accent-2); border: 1px solid var(--accent-2);
    border-radius: 3px; padding: 0 3px; line-height: 1.5;
}
.lockbtn:hover { opacity: 1; }

/* 드로어·GNB의 잠금 표시 — 메뉴 폭을 늘리지 않도록 배지만 얹는다. */
.gnb a .lk, .drawer a.dl .lk {
    font-size: 10.5px; font-weight: 800; letter-spacing: .05em;
    color: var(--accent-2); border: 1px solid var(--accent-2);
    border-radius: 3px; padding: 0 3px; margin-left: 4px;
}

/* /pricing 에서 어떤 카드로 가라는 것인지 표시 — 링크로 넘어왔을 때만 붙는다. */
.plan.is-target { border-color: var(--accent-2); box-shadow: 0 0 0 1px var(--accent-2) inset; }

@media (max-width: 620px) {
    .plock { padding: 16px 15px 15px; }
    .plock-buy { align-items: stretch; }
    .plock-act { width: 100%; }
    .plock-act .btn { flex: 1 1 auto; justify-content: center; }
}

/* ═══════════════ §18-b 랜딩 전체 경기 목록(프로토 보드, Home.razor) ═══════════════
   와이즈토토형 전 경기 표. 회차·종목 탭은 정적 SSR이라 쿼리스트링 링크(?round=&sport=)다. */
.pb-bar { display: flex; flex-direction: column; gap: 8px; }
.pb-tabs { display: flex; flex-wrap: wrap; gap: 6px; }
.pb-tab {
    display: inline-flex; align-items: center; gap: 6px; height: 32px; padding: 0 13px;
    border: 1px solid var(--line); border-radius: var(--r); background: var(--surface);
    color: var(--text-2); font-size: 13.5px; font-weight: 700; text-decoration: none; white-space: nowrap;
}
.pb-tab:hover { background: var(--surface-2); }
.pb-tab.is-on { color: var(--accent-2); border-color: var(--accent-line); background: var(--accent-dim); }
.pb-tab .n { font-family: var(--mono); font-size: 11.5px; font-weight: 600; color: var(--text-3); }
.pb-tab.is-on .n { color: var(--accent-2); }

/* 표가 화면을 다 먹지 않게 자체 스크롤 — 회차당 수백 행이라 페이지 스크롤로 두면 아래 소개 섹션이 묻힌다. */
.pb-wrap { max-height: 640px; overflow-y: auto; }
.pb-no { color: var(--accent); font-weight: 700; }
.pb-team .h { font-weight: 700; }
.pb-team .x { color: var(--text-3); font-size: 11.5px; padding: 0 2px; }
.pb-team .a { color: var(--text-2); }
.pb-odds { font-family: var(--mono); text-align: right; font-size: 15px; font-weight: 700; }
.pb-score { margin-left: 6px; color: var(--text-2); font-size: 12.5px; }

@media (max-width: 620px) {
    .pb-wrap { max-height: 520px; }
}

/* ═══════════════ §20 벳인포형 3단 배치 (/odds, .board.bi) ═══════════════
   2026-08-19 의뢰인 요구. 예전 배치는 한 칸에 국내(13px)·해외(10px)·차이를 겹쳐 쌓고
   글자 크기로 값의 출처를 인코딩했는데, "눈에 안 들어오고 헷갈린다"는 지적을 받았다.
   크기 대신 <b>열</b>로 가른다: 국내 3칸 | 해외 3칸 | 차이 3칸. 모든 배당이 같은 크기다. */

/*  트랙: [★ 24][시작 60][경기 1fr][국내×3 56][해외×3 56][차이×3 54][판정 66]
    합계 고정폭 = 24+60+168+168+162+66 = 648px + 경기명 가변. --shell 1500에서 트리(212)·사이드바(286)를
    빼면 경기명에 약 270px가 남는다(실측 2026-08-23 — 748px였을 때 경기명이 140px로 눌려 세로로 깨졌다).
    배당 숫자는 16px(의뢰인: "시원시원하게")이고 "0.00" 네 자리가 56px 안에 들어간다. */
/*  ⚠ 열 폭 재배분(2026-08-25) — 해외 칸에만 배당사 칩이 붙어 글자 예산이 필요하다(의뢰인: "로고가 너무 작다").
    레이아웃 전체 폭은 못 늘린다(shell 1448px가 이미 노트북 뷰포트에 꽉 참) → 남는 데서 가져온다.
    실측 최대 내용: 국내 47px("14.00") · 차이 49px("-10.8%") · 해외는 칩이 지배한다.
    국내 56→51 · 차이 54→51 · 해외 56→64. <b>합계는 498px로 정확히 동일</b>하므로
    경기명(minmax(0,1fr))이 받는 폭은 1px도 변하지 않는다 — 팀명 잘림 위험 없음. */
/*  판정 열 66→72(2026-09-02 의뢰인: "핸디→일반승이 잘려 보인다") — 국내·차이 51→50에서 가져와
    합계는 그대로다(국내 실측 최대 47px·차이 49px라 50px로도 안 잘린다). */
.board.bi .bicols, .board.bi .bigroups, .board.bi .mrow {
    grid-template-columns: 24px 60px minmax(0, 1fr) repeat(3, 50px) repeat(3, 64px) repeat(3, 50px) 72px;
}
.board.bi .bicols.n2, .board.bi .bigroups.n2, .board.bi .mrow.n2 {
    grid-template-columns: 24px 60px minmax(0, 1fr) repeat(2, 50px) repeat(2, 64px) repeat(2, 50px) 72px;
}

/* 1단: 그룹 이름(국내·해외·차이). 각 그룹이 제 칸 수만큼 span 한다.
   높이를 고정한다 — 아래 .bicols 의 sticky top 이 이 높이에 정확히 이어져야 한다. */
.board.bi .bigroups {
    position: sticky; top: var(--stick); z-index: 6;
    display: grid; align-items: center; height: 30px; padding: 0 10px;
    background: var(--surface-2); border-bottom: 1px solid var(--line-soft);
    font-size: 12.5px; font-weight: 700; letter-spacing: .04em;
}
.board.bi .bigroups .gg { grid-column: span 3; text-align: center; border-left: 1px solid var(--line); }
.board.bi .bigroups.n2 .gg { grid-column: span 2; }
.board.bi .bigroups .gg-bm { color: var(--dom-soft); background: var(--dom-tint); }
.board.bi .bigroups .gg-for { color: var(--for-soft); }
.board.bi .bigroups .gg-df { color: var(--text-2); }

/*  2단: 셀렉션 라벨(승·무·패). 그룹 색을 옅게 이어받아 어느 그룹의 칸이었는지 유지한다.
    ⚠ 이 요소는 .mcols 클래스를 달지 않는다 — grid·sticky·배경을 <b>여기서 전부</b> 줘야 한다.
    top 만 주면 display 가 기본값이라 span 들이 "시작경기승무패승무패…" 한 줄로 뭉개진다(실측 2026-08-23). */
.board.bi .bicols {
    position: sticky; top: calc(var(--stick) + 30px); z-index: 5;
    display: grid; align-items: center; gap: 0;
    padding: 6px 10px; background: var(--surface-2); border-bottom: 1px solid var(--line);
    font-size: 12px; font-weight: 700; letter-spacing: .04em; color: var(--text-4);
}
.board.bi .bicols .g { text-align: center; }
.board.bi .bicols .gh-bm { background: var(--dom-tint); color: var(--dom-soft); }
.board.bi .bicols .gh-for { color: var(--for-soft); }
.board.bi .bicols .gh-df { color: var(--text-3); }

/* 배당·차이 칸 — 세 그룹 모두 같은 글자 크기(출처는 열이 말한다) */
.board.bi .bi-o { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 1px; min-height: 38px; }
.board.bi .bi-o .o-now { font-size: 16px; }
/*  칸 이름(언더/오버 · 승/무/패) — 2026-09-21 의뢰인: "어디가 오버인지 언더인지 헷갈린다".
    마크업에는 항상 싣고 <b>보일 자리만</b> 여기서 정한다(뷰포트는 서버가 모른다).
    ① 기본(넓은 화면 + 탭 보기)은 숨긴다 — 열 머리글(.bicols)이 이미 언더/오버를 적는다.
    ② 추출·프라임 추출은 머리글이 ①②③이다(마켓이 섞여 행마다 뜻이 다르다) → 세 묶음 전부 켠다.
    ③ 좁은 화면(≤1180)은 머리글이 통째로 접힌다 → 아래 §16에서 국내 줄에만 켠다. */
.board.bi .bi-o .o-sel { display: none; font-size: 10px; line-height: 1.15; white-space: nowrap; }
.board.bi.is-extract .bi-o .o-sel { display: block; }
/*  추출 화면은 해외 칸에 '4곳 평균'(prime이면 α까지) 줄이 더 붙어 칸마다 높이가 다르다. .mrow가
    align-items:center라 그대로 두면 같은 행의 '언더' 라벨이 국내·해외·차이에서 서로 다른 높이에
    앉는다 — 이름이 어긋나 보이면 이름을 붙인 뜻이 없다. 칸을 행 높이에 맞춰 늘리고 위에서부터 쌓는다. */
.board.bi.is-extract .bi-o { align-self: stretch; justify-content: flex-start; }
.board.bi .bi-o .o-open { font-size: 11px; display: inline-flex; align-items: center; gap: 1px; }
.board.bi .bi-o .diff { font-size: 14px; }
/* 핸디캡·언더오버 칸의 출처 배당사(의뢰인 2026-08-23 요구). 값이 하나뿐인 마켓이라 출처가 단일 북으로
   확정된다 — 승무패(평균) 칸에는 붙이지 않는다.
   ⚠ 처음엔 BookChip(로고 우선)을 그대로 넣었는데 <b>칸 폭이 56px</b>이라 로고가 높이 10px로 뭉개져
/*  (삭제) .o-book — 배당 칸에 배당사 실명을 찍던 칩이다. 2026-08-30 법률 검토로
    해외 업체의 상호를 어떤 표면에도 내보내지 않기로 하면서 마크업과 함께 규칙도 지웠다. */
/*  좁은 화면(≤1180)에서는 보드가 3행으로 접혀 해외 행이 폭을 통째로 나눠 쓴다(칸이 오히려 넓어진다) —
    글자를 줄일 이유가 없다. 줄바꿈만은 절대 금지(white-space: nowrap): 칩이 두 줄이 되면 행 높이가 폭발한다. */
/* 계산기 독에 담긴 픽 — 어느 칸이 슬립에 있는지 표에서 바로 보이게 */
.board.bi .bi-o.in-slip { outline: 2px solid var(--accent); outline-offset: -2px; border-radius: var(--r); }

/*  판정 열(배지 무더기) — 세로로 쌓는다. 핸디 배지 + 해외N 버튼이 옆으로 나란히 서면 72px를 넘는다.
    배지 글자는 10px — "핸디→일반승" 여섯 자가 72px 안에 들어가는 크기다(2026-09-02 의뢰인: 잘림 수정). */
.board.bi .m-tag { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 3px; }
.board.bi .m-tag .badge { font-size: 10px; padding: 2px 4px; white-space: nowrap; letter-spacing: -.01em; }

/*  PREMIUM TIP 예상 픽 칸(2026-09-02 의뢰인: "보라색으로 굵게, 다만 세련되게") — 굵은 단색 테두리 대신
    보라 이중 링: 안쪽 1.5px 실선 + 옅은 보라 면. 프라임(FreeTips) 세션에만 클래스가 붙는다. */
.board.bi .bi-o.tip-pick {
    box-shadow: inset 0 0 0 1.5px var(--tippick);
    background: var(--tippick-dim);
    border-radius: var(--r);
}
.board.bi .bi-o.tip-pick .o-now { color: var(--tippick); }

/*  PREMIUM TIP 경기 행(2026-09-02 의뢰인: "테두리를 보라색으로 — 단순 보라 말고 세련되게,
    좌상단에 PREMIUM TIP 팻말"). 굵은 단색 테두리 대신 행을 카드처럼 살짝 띄우고:
      · 마스크로 속을 뚫은 1.5px 보라 그라데이션 링(::before) — 내용은 전혀 가리지 않는다
      · 링을 6초에 한 번 훑고 지나가는 광택(그라데이션 팬) — 동작 최소화 설정에선 멈춘다.
        그라데이션은 시작·끝 색이 같은 2주기 반복이라 루프 이음새가 보이지 않는다.
      · 좌상단 팻말(::after) — 마크업 없이 CSS content로 세워 그리드 배치에 끼어들지 않는다
    ⚠ 좌우 마진은 주지 않는다 — 고정폭 배당 칼럼이 머리글(.bicols)과 어긋난다. 수직 마진만 줘
      팻말이 앞 행을 덮지 않을 방을 만든다. */
.board.bi .mrow.is-tip {
    position: relative;
    margin: 14px 0 8px;
    border-radius: 10px;
    border-bottom-color: transparent;
    background: linear-gradient(165deg, var(--tippick-dim), transparent 52%);
    box-shadow: 0 4px 18px rgba(109, 63, 209, .12);
}
.board.bi .mrow.is-tip::before {
    content: ""; position: absolute; inset: 0; border-radius: inherit; padding: 1.5px;
    background: linear-gradient(115deg,
        var(--tippick), var(--tippick-2) 25%, var(--tippick) 50%, var(--tippick-2) 75%, var(--tippick))
        0 0 / 200% 100%;
    -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
    -webkit-mask-composite: xor;
    mask-composite: exclude;
    pointer-events: none;
    animation: tipring 6s linear infinite;
}
@keyframes tipring { to { background-position: 100% 0; } }
@media (prefers-reduced-motion: reduce) { .board.bi .mrow.is-tip::before { animation: none; } }
.board.bi .mrow.is-tip::after {
    content: "PREMIUM TIP";
    position: absolute; top: -9px; left: 12px; z-index: 1;
    padding: 3px 8px;
    border-radius: 4px;
    background: linear-gradient(120deg, #6d28d9, #9333ea);
    color: #fff; font-size: 9.5px; font-weight: 800; letter-spacing: .14em; line-height: 1;
    box-shadow: 0 2px 6px rgba(76, 29, 149, .35), inset 0 1px 0 rgba(255, 255, 255, .25);
}
.board.bi .bi-o.is-na .o-now { font-weight: 400; color: var(--text-4); }
/* 국내 칸만 유불리 틴트를 받는다 — 셋 다 칠하면 행 전체가 색으로 덮여 오히려 안 읽힌다. */
.board.bi .bi-o.dom.adv-dom { background: var(--dom-tint); }
.board.bi .bi-o.dom.adv-dom .o-now { color: var(--dom-soft); }
.board.bi .bi-o.dom.adv-for { background: var(--for-tint); }
.board.bi .bi-o.dom.adv-for .o-now { color: var(--for-soft); }
.board.bi .bi-o.clickable { cursor: pointer; }
.board.bi .bi-o.clickable:hover { background: var(--surface-3); }
.board.bi .bi-o.is-open { box-shadow: inset 0 -2px 0 var(--accent); }
/* 그룹 경계 세로선을 본문까지 이어 내린다(헤더에서만 그으면 열이 흩어져 보인다) */
.board.bi .bi-dom > .bi-o:first-child,
.board.bi .bi-for > .bi-o:first-child,
.board.bi .bi-dif > .bi-o:first-child { border-left: 1px solid var(--line); }

/* 경기 표기 "#4816 김포FC : 김천상무" — 한 줄, 홈은 굵게 원정은 흐리게 */
.bi-teams { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; min-width: 0; }
.bi-teams .h { font-size: 14.5px; font-weight: 700; color: var(--text); }
.bi-teams .x { font-size: 12px; color: var(--text-4); }
.bi-teams .a { font-size: 14.5px; color: var(--text-2); }
.bi-teams .m-no { flex: none; font-family: var(--mono); font-size: 12.5px; font-weight: 700; color: var(--accent); }

/* 판정 칸의 전 북 펼침 버튼 */
.bi-books {
    height: 24px; padding: 0 8px; margin-left: 4px;
    background: var(--surface-3); border: 1px solid var(--line); border-radius: 3px;
    font-size: 12px; font-weight: 700; color: var(--text-3); cursor: pointer;
}
.bi-books:hover, .bi-books.on { color: var(--accent-2); border-color: var(--accent-line); background: var(--accent-dim); }

/*  좁은 화면: 13열은 접는다. 1행 경기명, 2행 국내, 3행 해외, 4행 차이 —
    DESIGN.md §5의 "760px 이하에서 가로 스크롤 금지"를 지킨다.
    임계는 1180(종전 980) — 981~1180 구간에서 13열을 유지하면 경기명이 130px대로 눌린다(폰트 확대 여파). */
@media (max-width: 1180px) {
    .board.bi .bigroups, .board.bi .bicols { display: none; }
    .board.bi .mrow {
        grid-template-columns: 24px 60px minmax(0, 1fr);
        grid-auto-rows: auto; row-gap: 3px; padding: 7px 10px;
    }
    .board.bi .mrow.n2 { grid-template-columns: 24px 60px minmax(0, 1fr); }
    .board.bi .m-tag { grid-row: auto; grid-column: 1 / -1; }
    /*  ⚠ ≤760의 구 보드용 규칙(.m-os { grid-row: 2 })이 여기도 걸린다 — bi 보드의 세 묶음이
        전부 2행에 겹쳐 숫자가 포개진다(실측 2026-08-23). grid-row를 자동으로 되돌려 소스 순서대로
        국내→해외→차이가 한 줄씩 내려가게 한다. */
    .board.bi .bi-dom, .board.bi .bi-for, .board.bi .bi-dif {
        display: grid; grid-row: auto; grid-column: 1 / -1;
        grid-template-columns: 34px repeat(3, minmax(0, 1fr)); align-items: center; gap: 3px;
    }
    .board.bi .mrow.n2 .bi-dom, .board.bi .mrow.n2 .bi-for, .board.bi .mrow.n2 .bi-dif {
        grid-template-columns: 34px repeat(2, minmax(0, 1fr));
    }
    /* 행 앞에 무슨 값인지 라벨을 붙인다(헤더가 접혔으므로) */
    .board.bi .bi-dom::before, .board.bi .bi-for::before, .board.bi .bi-dif::before {
        font-size: 11.5px; font-weight: 700; color: var(--text-4); letter-spacing: .03em;
    }
    .board.bi .bi-dom::before { content: "국내"; color: var(--dom-soft); }
    .board.bi .bi-for::before { content: "해외"; color: var(--for-soft); }
    .board.bi .bi-dif::before { content: "차이"; }
    .board.bi .bi-dom > .bi-o:first-child,
    .board.bi .bi-for > .bi-o:first-child,
    .board.bi .bi-dif > .bi-o:first-child { border-left: 0; }
    .board.bi .bi-o { min-height: 32px; }
    /*  열 머리글(.bicols)이 위에서 display:none이 됐으므로 <b>언더/오버·승/무/패를 말해 줄 곳이 없다</b>
        (2026-09-21 의뢰인 신고의 실제 화면). 국내 줄에만 붙인다 — 해외·차이 줄은 같은 열 위치를
        공유하므로 세 줄 모두 붙이면 뜻은 그대로인 채 행 높이만 세 배가 된다. */
    .board.bi .bi-dom .bi-o .o-sel { display: block; }
    .board.bi .bi-for .bi-o .o-sel, .board.bi .bi-dif .bi-o .o-sel { display: none; }
}

/*  시작된 경기를 <b>숨기지 않고 흐리게</b> 한다(§20 전용 재정의).
    live.js는 킥오프가 지난 행에 expired-row를 붙이고 §16이 그것을 display:none으로 지운다 —
    "차이나는 경기를 골라내지 말고 전 경기를 경기번호 순으로"(2026-08-19 의뢰인 요구)에서는
    그 숨김이 목록 한가운데 번호를 건너뛰게 만들어, 사용자가 다시 배트맨에서 찾아야 한다.
    발매는 이미 마감된 경기이므로 흐리게 + '마감' 인상만 주고 자리는 지킨다. */
.board.bi .mrow.expired-row { display: grid; opacity: .42; }
.board.bi .mrow.expired-row .diff { color: var(--text-3) !important; }

/*  발매전 회차 안내 띠(메인 전체 경기 목록). 배당 칸이 전부 "—"인 이유를 그 자리에서 밝힌다 —
    안내가 없으면 "배당이 전부 없다"(2026-08-21 실보고)로 읽힌다. */
.pb-note {
    display: flex; flex-wrap: wrap; align-items: center; gap: 5px;
    padding: 9px 11px; border: 1px solid var(--accent-line); border-radius: var(--r);
    background: var(--accent-dim); font-size: 12px; color: var(--text-2);
}
.pb-note b { color: var(--text); }
.pb-note a { color: var(--accent-2); font-weight: 700; }

/* ── §18-b 확장(2026-08-23): 메인 전면 개편 — 경기판 하나가 곧 페이지다 ──
   와이즈토토·벳인포의 정보 어휘(종목 아이콘·적중 강조·스코어 인라인)만 가져오고
   색·모양은 기존 토큰 그대로(의뢰인: "기존 색감·추세 유지, 저곳들의 장점만"). */

/* 종목 이모지 열 — 이모지 자체가 색이라 배경·테두리 없이 크기만 준다 */
.pb-ico { text-align: center; font-size: 15px; line-height: 1; padding-left: 2px !important; padding-right: 2px !important; color: var(--text-2); }
.pb-ico .sico { vertical-align: middle; }
.pb-tab .ico { font-size: 13px; margin-right: 1px; }

/* 팀 사이 스코어 인라인(끝난 경기) — "텍사레인 2 : 0 워싱내셔" */
.pb-team .sc { font-family: var(--mono); font-weight: 800; font-size: 14px; color: var(--text); margin: 0 1px; }

/* 적중 셀렉션 배당 강조 — 와이즈토토의 주황 배경 역할을 우리 dom 틴트로 */
.pb-odds.hit { background: var(--dom-tint); color: var(--dom-soft); font-weight: 800; box-shadow: inset 0 0 0 1px rgba(224, 87, 76, .25); }

/* 메인이 경기판 하나뿐이므로 표가 화면을 넉넉히 쓴다(종전 640px 고정은 마케팅 밴드와 공존하던 시절 값) */
.pb-wrap.pb-tall { max-height: calc(100vh - 240px); min-height: 480px; }
@media (max-width: 620px) {
    .pb-wrap.pb-tall { max-height: calc(100vh - 200px); min-height: 400px; }
}

/* 팀 구분자 ':' 간격 — Razor if 블록이 스팬 사이 공백을 먹어 팀명이 붙어 보인다(실측) */
.pb-team .x { margin: 0 4px; }
.pb-team .sc + .x, .pb-team .x + .sc { margin: 0 2px; }

/* ═══════════════ §18-c 메인 포털 레이아웃(Home.razor) ═══════════════
   2026-08-23 의뢰인: "아직 비어 보인다 — 있는 기능 전부 넣고 색감까지". 와이즈토토식 밀도를
   우리 토큰으로 옮겼던 화면인데, 2026-09-01 의뢰인 지시로 좌측을 배당 비교(Board)의 트리 문법으로
   다시 줄였다: 리그 트리(.tree) + 발매 현황(.pb-sale)만 남는다(로그인·도구·바로가기 CSS도 함께 삭제). */
.pb-portal { display: grid; grid-template-columns: 236px minmax(0, 1fr); gap: 14px; align-items: start; }
.pb-side { position: sticky; top: calc(var(--stick) + 8px); display: flex; flex-direction: column; gap: 10px; }

/* 발매 현황 — 상태 점 · 게임명 · 회차 · 상태 배지 한 줄. 현재 보고 있는 회차는 켜져 보인다. */
.pb-sale { display: flex; flex-direction: column; gap: 2px; padding: 5px; }
.pb-sale a {
    display: flex; align-items: center; gap: 7px; padding: 7px 9px; font-size: 13px;
    border: 1px solid transparent; border-radius: var(--r-2);
    transition: background .1s, border-color .1s;
}
.pb-sale a:hover { background: var(--surface-2); border-color: var(--line-soft); }
.pb-sale a.is-on { background: var(--accent-dim); border-color: var(--accent-line); }
.pb-sale .nm { font-weight: 700; color: var(--text); }
.pb-sale .rd { font-family: var(--mono); font-size: 12.5px; color: var(--text-3); }
.pb-sale .badge { margin-left: auto; }
/* 상태 점 — 발매중은 헤더의 실시간 배지와 같은 초록 점멸(.feed .pip), 발매전은 주황, 마감은 무채색 */
.pb-sale .st { flex: none; width: 7px; height: 7px; border-radius: 50%; background: var(--line-strong); }
.pb-sale .st.live { background: var(--ok); box-shadow: 0 0 0 3px var(--ok-dim); animation: pip 2s ease-in-out infinite; }
.pb-sale .st.pre { background: var(--warn); box-shadow: 0 0 0 3px var(--warn-dim); }

/* 본문 표 헤더를 네이비 밴드로 — 와이즈토토의 인상. --accent-solid는 흰 글자 대비(AA)가
   보장된 유일한 파랑 면 토큰이다(§1 주석). 스크롤 시 sticky 헤더가 이 색으로 떠 있는다. */
.pb-main .pb-wrap .tbl thead th {
    background: var(--accent-solid); color: #fff;
    border-bottom: 1px solid var(--accent-solid);
}

/* 번호 링크(→ /odds?q=) — 눌러진다는 것이 보여야 한다 */
a.pb-no { text-decoration: none; }
a.pb-no:hover { text-decoration: underline; }

/* 검색 폼(GET) — panel-head 우측. 정적 SSR이라 @bind 대신 폼 제출이다(2026-09-02). */
.pb-search { margin-left: auto; }

/* 배당 → 계산기 담기 링크. 칸 전체가 눌리게 블록으로 펴고, 링크 티는 호버에서만 낸다 —
   상시 밑줄·파랑이면 배당표가 링크 무더기로 보인다(의뢰인 색감 유지 원칙). */
.pb-odds a.pb-calc { display: block; margin: -6px -8px; padding: 6px 8px; color: inherit; border-radius: var(--r); }
.pb-odds a.pb-calc:hover { background: var(--accent-dim); color: var(--accent-2); }

@media (max-width: 1000px) {
    /* 모바일: 경기판 먼저, 사이드바 패널들은 아래에 2열로(sticky는 세로 흐름에서만 뜻이 있어 푼다) */
    .pb-portal { grid-template-columns: minmax(0, 1fr); }
    .pb-side { position: static; order: 2; display: grid; grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); align-items: start; }
}

/* ═══════════════ §21 우측 하단 독 — 계산기·PREMIUM TIP (배당 비교) ═══════════════
   2026-08-23 의뢰인 요구: "계산기를 배당비교 페이지 안에서, PREMIUM TIP은 우측 하단 사이드바처럼".
   버튼 두 개가 항상 떠 있고, 패널은 한 번에 하나만 열린다. z-index는 탭바(70) 위 · 드로어(90) 아래. */
.dock { position: fixed; right: 16px; bottom: 16px; z-index: 80; display: flex; flex-direction: column; align-items: flex-end; gap: 10px; }
.dock-btns { display: flex; gap: 8px; }
.dock-btn {
    display: inline-flex; align-items: center; gap: 6px; height: 42px; padding: 0 17px;
    border-radius: 999px; background: var(--accent-solid); border: 1px solid var(--accent-solid);
    color: #fff; font-size: 14.5px; font-weight: 700; cursor: pointer; box-shadow: var(--pop-sm);
    transition: filter .12s, background .12s, color .12s, border-color .12s;
}
.dock-btn:hover { filter: brightness(1.08); transform: translateY(-1px); }
.dock-btn { transition: filter .12s, background .12s, color .12s, border-color .12s, transform .12s; }
.dock-btn.on { background: var(--surface); border-color: var(--accent); color: var(--accent-2); filter: none; transform: none; }
.dock-btn .ic { font-size: 16px; line-height: 1; }
.dock-btn .n {
    min-width: 21px; height: 21px; padding: 0 6px; display: inline-flex; align-items: center; justify-content: center;
    border-radius: 999px; background: rgba(255, 255, 255, .24); font-size: 12.5px; font-weight: 800;
}
.dock-btn.on .n { background: var(--accent-dim); color: var(--accent-2); }

/*  패널 — 2026-09-02 상용화급 정돈: 폭 430px(다중 조합 목록이 눕지 않게), 머리에 기능명·이동 링크·
    닫기만 남기고 본문 여백을 12px로 통일. 과한 라운드·그라데이션은 금지(DESIGN.md §2). */
.dock-panel {
    width: min(430px, calc(100vw - 32px)); max-height: min(76vh, 700px);
    display: flex; flex-direction: column; overflow: hidden;
    background: var(--surface); border: 1px solid var(--line-strong); border-radius: var(--r-3);
    box-shadow: var(--pop); animation: pop .18s cubic-bezier(.2, .8, .3, 1);
}
.dock-head { display: flex; align-items: center; gap: 10px; padding: 12px 16px; background: var(--surface-2); border-bottom: 1px solid var(--line); flex: none; }
.dock-head b { font-size: 15px; letter-spacing: -.01em; }
.dock-head a { margin-left: auto; font-size: 12.5px; color: var(--text-3); }
.dock-head a:hover { color: var(--accent-2); }
.dock-body { overflow-y: auto; padding: 12px; }
/* 패널 자체가 카드라 내부 widget의 테두리는 이중선이 된다 — 지운다. */
.dock-body .widget { border: 0; }
.dock-hint {
    margin-bottom: 10px; padding: 9px 11px; border: 1px solid var(--accent-line); border-radius: var(--r);
    background: var(--accent-dim); font-size: 13px; line-height: 1.6; color: var(--text-2);
}
.dock-hint b { color: var(--text); }

@media (max-width: 760px) {
    /* 탭바(52px + safe-area)가 하단을 차지한다 — 그 위로 띄운다. */
    .dock { right: 8px; bottom: calc(62px + env(safe-area-inset-bottom)); }
    .dock-panel { width: calc(100vw - 16px); max-height: 60vh; }
}

/* PREMIUM TIP 미니 리스트(독 패널 안) */
.tipmini { padding: 10px 11px; border-bottom: 1px solid var(--line-soft); }
.tipmini:last-child { border-bottom: 0; }
.tipmini .tm { margin-top: 6px; font-size: 14px; color: var(--text-2); }
.tipmini .tm b { color: var(--text); }
.tipmini .tm .x { color: var(--text-4); }
.tipmini .pk { margin-top: 6px; flex-wrap: wrap; }
/* (삭제) .tipmini .src — 출처 상호 비표시(2026-08-30) 이후 .src 요소가 없는 고아 규칙이었다. */

/* (삭제) .board.veiled — 회차 전환기 가림막은 상태 안내 전면 금지(2026-09-01 writing-for-pros)로
   안내 띠와 함께 제거됐다. 보드는 언제나 그대로 그린다. */

/* ═══════════════ §22 관리자 팝업 · 상단 배너 · 알림함 (2026-08-27) ═══════════════

   팝업은 관리자가 쓴 HTML을 담는 <b>그릇</b>만 제공한다. 안쪽 서식은 관리자가 정하므로
   여기서는 위치·크기·머리띠·바닥만 잡고 본문에는 최소한의 기본값(문단 간격·이미지 폭)만 준다.
   그 최소값마저 없으면 <p> 두 줄이 붙어 나와 "고장 난 것처럼" 보인다.

   ⚠ 팝업은 hidden 으로 렌더되고 popup.js 가 벗긴다(닫아 둔 팝업의 깜빡임 방지). 그래서
     .pop-win[hidden] 에 display:none 을 다시 적지 않는다 — hidden 기본 동작으로 충분하다. */

.pop-veil {
    position: fixed; inset: 0; z-index: 78;
    background: rgba(8, 10, 12, .58);
    backdrop-filter: blur(1.5px);
}

.pop-win {
    position: fixed; z-index: 80;
    max-width: calc(100vw - 16px); max-height: calc(100vh - 16px);
    display: flex; flex-direction: column;
    background: var(--surface); border: 1px solid var(--line);
    border-radius: var(--r-3); box-shadow: var(--pop);
    overflow: hidden;
}
/* 좌표를 지정하지 않은 팝업은 화면 중앙. 드래그가 시작되면 popup.js가 left/top으로 바꾼다. */
.pop-win.is-center { left: 50%; top: 50%; transform: translate(-50%, -50%); }
.pop-win.is-dragging { user-select: none; cursor: grabbing; box-shadow: var(--pop-lg, var(--pop)); }

.pop-head {
    flex: none; display: flex; align-items: center; gap: 8px;
    padding: 11px 12px 11px 14px; border-bottom: 1px solid var(--line);
    background: var(--surface-2); cursor: grab;
}
.pop-win[data-draggable="0"] .pop-head { cursor: default; }
.pop-head b { font-size: 13.5px; flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* 머리띠가 없는 전면 배너형의 닫기 — 본문 위에 겹쳐 띄운다. */
.pop-x {
    position: absolute; top: 8px; right: 8px; z-index: 2;
    width: 26px; height: 26px; border-radius: 50%;
    display: grid; place-items: center;
    background: rgba(12, 14, 16, .62); border: 0; color: #fff;
    font-size: 12px; cursor: pointer; transition: background .12s;
}
.pop-x:hover { background: rgba(12, 14, 16, .84); }

.pop-body { flex: 1 1 auto; overflow: auto; padding: 16px; font-size: 13px; line-height: 1.75; color: var(--text-2); }
.pop-body.flush { padding: 0; }

/* 관리자가 쓴 본문의 기본값. 여기 없는 모양은 관리자가 인라인 style로 정한다. */
.pop-body > :first-child { margin-top: 0; }
.pop-body > :last-child { margin-bottom: 0; }
.pop-body p { margin: 0 0 10px; }
.pop-body h1, .pop-body h2, .pop-body h3 { margin: 0 0 8px; color: var(--text); line-height: 1.4; }
.pop-body h1 { font-size: 19px; } .pop-body h2 { font-size: 16px; } .pop-body h3 { font-size: 14px; }
.pop-body ul, .pop-body ol { margin: 8px 0; padding-left: 18px; }
.pop-body ul { list-style: disc; } .pop-body ol { list-style: decimal; }
.pop-body li { margin: 3px 0; }
.pop-body a { color: var(--accent-2); text-decoration: underline; text-underline-offset: 2px; }
.pop-body img { max-width: 100%; height: auto; display: block; border-radius: var(--r); }
.pop-body.flush img { border-radius: 0; }
.pop-body hr { margin: 12px 0; border: 0; border-top: 1px solid var(--line-soft); }
.pop-body table { width: 100%; border-collapse: collapse; margin: 8px 0; font-size: 12.5px; }
.pop-body th, .pop-body td { padding: 6px 8px; border: 1px solid var(--line-soft); text-align: left; }
.pop-body th { background: var(--surface-2); font-weight: 600; }
.pop-body strong, .pop-body b { color: var(--text); }

.pop-foot {
    flex: none; display: flex; align-items: center; gap: 12px; flex-wrap: wrap;
    padding: 9px 12px; border-top: 1px solid var(--line); background: var(--surface-2);
}
.pop-foot .check { font-size: 12px; color: var(--text-3); }
.pop-foot .btn { margin-left: auto; }

@media (max-width: 520px) {
    /* 좁은 화면에서는 관리자가 정한 폭·좌표를 무시하고 화면에 맞춘다 — 420px 팝업이
       375px 화면에서 잘리면 닫기 버튼에 손이 닿지 않는다. */
    .pop-win {
        left: 8px !important; right: 8px !important;
        width: auto !important; max-width: none;
        transform: none !important;
        top: auto !important; bottom: calc(62px + env(safe-area-inset-bottom)) !important;
        max-height: 72vh;
    }
}

/* ── 상단 띠 배너 ── .notice 를 그대로 쓰고 닫기 버튼 자리만 잡는다. */
.gbanner { position: relative; align-items: center; }
.gbanner .modal-x { flex: none; margin-left: 4px; }
.gbanner a { color: var(--accent-2); }

/* ── 알림함(/notifications) ── 목록 자체가 아코디언이다. 제목 줄만 보고 훑다가 필요한 것만 편다. */
.notilist { display: flex; flex-direction: column; }
.notilist li { border-bottom: 1px solid var(--line-soft); }
.notilist li:last-child { border-bottom: 0; }
.notilist li.is-new { background: var(--accent-dim); }

.nt-head {
    display: flex; align-items: center; gap: 9px; width: 100%;
    padding: 11px 13px; background: transparent; border: 0; text-align: left; cursor: pointer;
    font-size: 13px; color: var(--text); transition: background .1s;
}
.nt-head:hover { background: var(--row-hover); }
.nt-head .nt-ti { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.notilist li.is-new .nt-head .nt-ti { font-weight: 700; }
.nt-head .nt-dt { flex: none; font-size: 11px; color: var(--text-4); }
.nt-head .ch { flex: none; font-size: 9px; color: var(--text-4); }
.nt-body { padding: 2px 13px 15px 13px; }

/* ═══════════════ §23 관리자 콘솔 확장 (2026-08-27) ═══════════════

   구획이 7개에서 13개로 늘면서 좌측 내비가 길어졌고, 로그·팝업 편집처럼 폭을 크게 쓰는 화면이
   생겼다. §14의 .adm/.adm-nav 는 그대로 두고 여기서 필요한 조각만 더한다. */

/* 구획 안의 하위 탭(로그의 감사/접근/커뮤니티/앱). .btngroup 과 달리 개수가 늘어도 줄바꿈된다. */
.adm-sub { display: flex; flex-wrap: wrap; gap: 4px; margin-bottom: 12px; }
.adm-sub button {
    height: 28px; padding: 0 11px; border-radius: var(--r);
    background: var(--surface-2); border: 1px solid var(--line);
    font-size: 12.5px; color: var(--text-3); cursor: pointer; transition: all .12s;
}
.adm-sub button:hover { color: var(--text); border-color: var(--accent-line); }
.adm-sub button.on { background: var(--accent-solid); border-color: var(--accent-solid); color: #fff; font-weight: 600; }

/* 로그 표 — 행이 많고 열이 좁다. 폰트를 한 단계 줄이고 줄 높이를 낮춘다. */
.logtbl { font-size: 12px; }
.logtbl td, .logtbl th { padding: 5px 8px; vertical-align: top; }
.logtbl .lg-when { white-space: nowrap; font-family: var(--mono); color: var(--text-4); font-size: 11px; }
.logtbl .lg-ip { font-family: var(--mono); font-size: 11px; color: var(--text-3); }
.logtbl .lg-msg { color: var(--text-2); word-break: break-word; }
.logtbl .lg-ex {
    margin-top: 4px; padding: 6px 8px; border-radius: var(--r);
    background: var(--surface-3); border: 1px solid var(--line-soft);
    font-family: var(--mono); font-size: 10.5px; line-height: 1.6; color: var(--warn-soft, var(--text-3));
    white-space: pre-wrap; max-height: 132px; overflow: auto;
}
.logtbl .lv { font-family: var(--mono); font-size: 10px; font-weight: 700; }
.logtbl .lv-w { color: var(--warn); } .logtbl .lv-e { color: var(--danger, #d9534f); } .logtbl .lv-i { color: var(--text-4); }

/* 키-값 표(회원 상세·감사 상세). .tbl compact 보다 촘촘하고 라벨 폭이 고정이다. */
.kv { width: 100%; font-size: 12.5px; }
.kv td { padding: 4px 0; vertical-align: top; }
.kv td:first-child { width: 92px; color: var(--text-4); white-space: nowrap; }
.kv td:last-child { color: var(--text-2); word-break: break-word; }

/* 14일 추이 막대. 라이브러리를 쓰지 않는다 — 높이를 %로 주는 것으로 충분하다. */
.spark { display: flex; align-items: flex-end; gap: 3px; height: 46px; }
.spark i { flex: 1 1 0; min-width: 3px; background: var(--accent-line); border-radius: 2px 2px 0 0; display: block; }
.spark i.on { background: var(--accent-solid); }
.spark-x { display: flex; gap: 3px; margin-top: 4px; font-size: 9.5px; color: var(--text-4); font-family: var(--mono); }
.spark-x span { flex: 1 1 0; text-align: center; overflow: hidden; }

/* HTML 편집기 + 미리보기 2단. 좁아지면 세로로 쌓인다. */
.htmled { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 12px; align-items: start; }
.htmled textarea { min-height: 260px; font-family: var(--mono); font-size: 12px; line-height: 1.65; }
.htmled .prev {
    min-height: 260px; max-height: 460px; overflow: auto;
    background: var(--surface-2); border: 1px solid var(--line); border-radius: var(--r-2); padding: 14px;
}
.htmled .prev-h { font-size: 11px; color: var(--text-4); margin-bottom: 7px; letter-spacing: .04em; }
@media (max-width: 900px) { .htmled { grid-template-columns: minmax(0, 1fr); } }

/* 서식 넣기 버튼 줄 — 관리자가 태그를 외우지 않아도 되게. */
.htmlbar { display: flex; flex-wrap: wrap; gap: 4px; margin-bottom: 6px; }
.htmlbar button {
    height: 25px; padding: 0 8px; border-radius: var(--r);
    background: var(--surface-3); border: 1px solid var(--line);
    font-size: 11.5px; color: var(--text-3); cursor: pointer;
}
.htmlbar button:hover { color: var(--text); border-color: var(--accent-line); }

/* 업로드한 이미지 목록 */
.medialist { display: flex; flex-wrap: wrap; gap: 8px; }
.medialist figure { width: 104px; margin: 0; }
.medialist img { width: 104px; height: 72px; object-fit: cover; border-radius: var(--r); border: 1px solid var(--line); display: block; }
.medialist figcaption { margin-top: 3px; font-size: 10px; color: var(--text-4); font-family: var(--mono); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* 좌측 내비가 13항목이 되면서 화면 높이를 넘긴다 — 자체 스크롤을 준다. */
@media (min-width: 1081px) {
    .adm-nav { max-height: calc(100vh - var(--stick) - 24px); overflow-y: auto; }
}
@media (max-width: 1080px) {
    /* 좁은 화면에서는 내비를 위로 눕힌다(§14는 2단 그리드 그대로였다). */
    .adm { grid-template-columns: minmax(0, 1fr); }
    .adm-nav { position: static; display: flex; flex-wrap: wrap; gap: 4px; }
    .adm-nav h5 { width: 100%; padding: 4px 4px 0; }
    .adm-nav a { flex: 0 0 auto; }
}

/* ═══════════════ §24 팝업 캔버스 편집기 (2026-08-28) ═══════════════

   "그림판처럼 텍스트·사진을 얹고 마우스로 옮긴다"(의뢰인). 3단이다 —
   왼쪽 도구·레이어 / 가운데 캔버스(실제 크기 1:1) / 오른쪽 속성.

   ⚠ 캔버스 안의 요소는 <b>인라인 style이 정본</b>이다. 끄는 동안 popup-editor.js가 그 값을 직접 고치고
     손을 뗄 때 서버로 보낸다. 그래서 여기서는 .pc-el 의 left/top/width/height 를 건드리지 않는다. */

.pc { display: grid; grid-template-columns: 176px minmax(0, 1fr) 232px; gap: 10px; align-items: start; }
@media (max-width: 1240px) { .pc { grid-template-columns: 152px minmax(0, 1fr); } .pc-props { grid-column: 1 / -1; } }
@media (max-width: 820px) { .pc { grid-template-columns: minmax(0, 1fr); } }

.pc-side { background: var(--surface-2); border: 1px solid var(--line); border-radius: var(--r-2); padding: 9px; }
.pc-side h4 { font-size: 10.5px; color: var(--text-4); letter-spacing: .05em; margin: 0 0 6px; }
.pc-side + .pc-side { margin-top: 8px; }

/* 요소 추가 버튼 — 큼직해야 "여기서 얹는다"가 읽힌다. */
.pc-add { display: grid; grid-template-columns: 1fr 1fr; gap: 5px; }
.pc-add button {
    height: 46px; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px;
    background: var(--surface); border: 1px solid var(--line); border-radius: var(--r);
    font-size: 11px; color: var(--text-2); cursor: pointer; transition: all .12s;
}
.pc-add button:hover { border-color: var(--accent-line); color: var(--text); background: var(--surface-3); }
.pc-add button .ic { font-size: 15px; line-height: 1; color: var(--text-4); }
.pc-add button:hover .ic { color: var(--accent-2); }

/* 레이어 목록 — 겹친 요소를 캔버스에서 고르기 어려울 때의 유일한 손잡이다. */
.pc-layers { display: flex; flex-direction: column; gap: 2px; max-height: 210px; overflow-y: auto; }
.pc-layers button {
    display: flex; align-items: center; gap: 6px; width: 100%; padding: 5px 7px;
    background: transparent; border: 1px solid transparent; border-radius: var(--r);
    font-size: 11.5px; color: var(--text-3); text-align: left; cursor: pointer;
}
.pc-layers button:hover { background: var(--surface-3); color: var(--text); }
.pc-layers button.on { background: var(--accent-dim); border-color: var(--accent-line); color: var(--text); font-weight: 600; }
.pc-layers button .k { flex: none; width: 13px; color: var(--text-4); font-size: 10px; }
.pc-layers button .t { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* 캔버스 무대 — 격자 배경이라 팝업의 실제 경계가 눈에 보인다. */
.pc-stage {
    background:
        linear-gradient(45deg, var(--surface-3) 25%, transparent 25%, transparent 75%, var(--surface-3) 75%),
        linear-gradient(45deg, var(--surface-3) 25%, transparent 25%, transparent 75%, var(--surface-3) 75%);
    background-size: 16px 16px; background-position: 0 0, 8px 8px;
    background-color: var(--surface-2);
    border: 1px solid var(--line); border-radius: var(--r-2);
    padding: 18px; overflow: auto; max-height: 620px;
    display: flex; justify-content: center;
}
.pc-canvas {
    position: relative; flex: none;
    box-shadow: 0 0 0 1px var(--line), var(--pop-sm, 0 2px 10px rgba(0,0,0,.18));
    overflow: hidden; user-select: none; touch-action: none;
}

.pc-el { position: absolute; cursor: move; }
/* box-sizing은 여기서 준다 — TextStyle에서 뺐기 때문이다(최종 HTML은 BoxStyle이 넣는다).
   없으면 padding이 100% 위에 더해져 편집기에서만 글상자가 넘친다. */
.pc-el .pc-text { width: 100%; height: 100%; display: flex; outline: 0; box-sizing: border-box; }
.pc-el img { pointer-events: none; }
.pc-el.is-sel { outline: 1px solid var(--accent-solid); outline-offset: 0; }
.pc-el.is-moving { outline: 1px dashed var(--accent-solid); }

/* 크기 손잡이 8개. 선택된 요소에만 그린다. */
.pc-handle {
    position: absolute; width: 9px; height: 9px; background: #fff;
    border: 1px solid var(--accent-solid); border-radius: 2px; z-index: 2;
}
.pc-handle[data-dir="nw"] { left: -5px; top: -5px; cursor: nwse-resize; }
.pc-handle[data-dir="n"]  { left: calc(50% - 5px); top: -5px; cursor: ns-resize; }
.pc-handle[data-dir="ne"] { right: -5px; top: -5px; cursor: nesw-resize; }
.pc-handle[data-dir="w"]  { left: -5px; top: calc(50% - 5px); cursor: ew-resize; }
.pc-handle[data-dir="e"]  { right: -5px; top: calc(50% - 5px); cursor: ew-resize; }
.pc-handle[data-dir="sw"] { left: -5px; bottom: -5px; cursor: nesw-resize; }
.pc-handle[data-dir="s"]  { left: calc(50% - 5px); bottom: -5px; cursor: ns-resize; }
.pc-handle[data-dir="se"] { right: -5px; bottom: -5px; cursor: nwse-resize; }

/* 속성 패널 — 선택한 요소 하나만 다룬다. */
.pc-props .field { margin-bottom: 8px; }
.pc-props label { font-size: 10.5px; color: var(--text-4); display: block; margin-bottom: 3px; }
.pc-props .input, .pc-props .select, .pc-props .textarea { height: 28px; font-size: 12px; padding: 0 7px; }
.pc-props .textarea { height: auto; min-height: 62px; padding: 6px 7px; line-height: 1.5; }
.pc-props .row2 { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; }
.pc-props input[type="color"] { width: 100%; height: 28px; padding: 2px; background: var(--surface); border: 1px solid var(--line); border-radius: var(--r); cursor: pointer; }
.pc-seg { display: flex; gap: 3px; }
.pc-seg button {
    flex: 1; height: 28px; background: var(--surface); border: 1px solid var(--line); border-radius: var(--r);
    font-size: 11.5px; color: var(--text-3); cursor: pointer;
}
.pc-seg button.on { background: var(--accent-solid); border-color: var(--accent-solid); color: #fff; font-weight: 700; }

.pc-empty { text-align: center; padding: 22px 10px; font-size: 12px; color: var(--text-4); line-height: 1.7; }

/* 캔버스에 넣을 이미지 고르기 */
.pc-pick { display: grid; grid-template-columns: repeat(auto-fill, minmax(58px, 1fr)); gap: 5px; max-height: 168px; overflow-y: auto; }
.pc-pick img { width: 100%; height: 42px; object-fit: cover; border-radius: var(--r); border: 1px solid var(--line); cursor: pointer; display: block; }
.pc-pick img:hover { border-color: var(--accent-solid); }

/* 캔버스는 끌기 중 글자가 선택되지 않게 user-select:none 이다. 다만 화면에서 바로 고치는
   중(contenteditable)에는 선택이 되어야 커서를 옮길 수 있다 — 그때만 되돌린다. */
.pc-canvas [contenteditable] { user-select: text; cursor: text; }

/* ═══════════════ §25 위지윅 편집기 (공지·알림, 2026-08-28) ═══════════════

   팝업은 캔버스(§24), 공지·알림은 이 편집기다 — 흐르는 문서라 문단이 위에서 아래로 쌓인다.
   편집 영역에 .doc 를 함께 걸어 <b>고객센터에서 보게 될 서식 그대로</b> 편집한다. */

.rt { border: 1px solid var(--line); border-radius: var(--r-2); background: var(--surface); overflow: hidden; }

.rt-bar {
    display: flex; flex-wrap: wrap; align-items: center; gap: 3px;
    padding: 6px 7px; background: var(--surface-2); border-bottom: 1px solid var(--line);
}
.rt-grp { display: flex; gap: 2px; align-items: center; }
.rt-grp + .rt-grp { margin-left: 5px; padding-left: 6px; border-left: 1px solid var(--line); }
.rt-bar button {
    min-width: 26px; height: 26px; padding: 0 7px;
    background: transparent; border: 1px solid transparent; border-radius: var(--r);
    font-size: 11.5px; color: var(--text-2); cursor: pointer; transition: all .1s;
}
.rt-bar button:hover { background: var(--surface-3); border-color: var(--line); color: var(--text); }
.rt-bar button.on { background: var(--accent-solid); border-color: var(--accent-solid); color: #fff; font-weight: 700; }
.rt-bar .rt-color { width: 18px; min-width: 18px; height: 18px; padding: 0; border-radius: 50%; border: 1px solid var(--line); }
.rt-bar .rt-color:hover { transform: scale(1.15); }

.rt-sub {
    display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
    padding: 7px 9px; background: var(--surface-3); border-bottom: 1px solid var(--line);
}
.rt-sub.col { flex-direction: column; align-items: stretch; }

.rt-edit {
    min-height: 260px; max-height: 520px; overflow-y: auto;
    padding: 14px 15px; outline: 0; background: var(--surface);
}
.rt-edit:focus { box-shadow: inset 0 0 0 2px var(--accent-dim); }
/* 빈 편집 영역이 완전히 비면 클릭할 곳이 없어 보인다 — 안내를 깔아 준다. */
.rt-edit:empty::before { content: "내용을 적으세요."; color: var(--text-4); }
.rt-edit img { max-width: 100%; height: auto; border-radius: var(--r); }

.rt-src {
    min-height: 260px; border: 0; border-radius: 0;
    font-family: var(--mono); font-size: 12px; line-height: 1.65;
}

/* ⚠ hidden 이 실제로 먹게 한다.
   .pop-win 은 display:flex, .gbanner 는 .notice(flex)라 <b>브라우저 기본 [hidden] 규칙(UA 스타일시트)이
   작성자 규칙에 밀린다</b> — 즉 hidden 을 세워도 그대로 보인다. popup.js가 Blazor 소유 노드를
   지우지 않고 숨기기만 하도록 바뀌었으므로(회로가 죽던 원인) 여기서 반드시 막아 줘야 한다. */
.pop-win[hidden], .pop-veil[hidden], .gbanner[hidden] { display: none !important; }
