/* ============================================================================
   KBF 공개 화면 — 서브페이지 셸 (Sub Hero · LNB · Main Area)
   ----------------------------------------------------------------------------
   KBF-36 (KBA-37) · Paper `S00b — 서브페이지 셸 마스터 KRDS · Desktop 1440` (FMZ-0)

   9종 11 URL 이 전부 이 파일을 쓴다. 화면별 본문 규칙도 여기 둔다
   (2,000줄을 넘으면 그때 분리 — kbf-home.css 1,700 · kbf-team.css 1,300 선례).

   ⚠️ 반드시 krds.min.css · kbf-public.css **뒤**에 로드된다.
   ⚠️ 색은 로컬 사본을 만들지 않고 `var(--krds-color-light-*)` 를 직접 쓴다.
      krds.min.css `:root` 가 정의하고 값이 Paper 토큰과 정확히 일치한다(8종 실측 대조).
      KBF 고유색 3종(--kbf-navy-subhero 등)만 kbf-public.css `:root` 에 있다.
   ========================================================================= */

/* ── 1. Sub Hero Band (FO0-0) ─────────────────────────────────────────────
   1440×275 · padding 56/48 · flex column · bg #011F51 */
.kbf-sub-hero {
  /* ⚠️ KBF-96 1단계 — 이것은 **밴드가 아니라 래퍼**다. 배경도 패딩도 없다.
     남색 띠는 아래 `__band` 가 지고, 바(`__bar`)는 그 **형제**로 나와 67px 겹친다.
     🚨 이름을 바꾸지 말 것 — 모바일 재점등 규칙 4개가
        `.kbf-sub-hero:has(form.kbf-filter-bar) .kbf-sub-hero__bar` 형태라
        바가 이 래퍼의 **자손으로 남는 것**에 기대고 있다. */
  display: flex;
  flex-direction: column;
  width: 100%;
}

/* Sub Hero Band — 구 `.kbf-sub-hero` 의 세로·배경을 그대로 물려받는다. */
.kbf-sub-hero__band {
  box-sizing: border-box;
  /* 배경 아트의 기준 박스. `overflow` 는 아트가 띠 밖으로 새지 않게 자른다(`D-45` 계열). */
  position: relative;
  overflow: hidden;
  /* ⚠️ KBF-68 — 가로 3속성을 공용 `.kbf-bleed` 로 넘겼다(`kbf-public.css`). 여기는 세로만 맡는다.
     🚨 `width: 100%` 나 `padding-inline` 을 되살리지 말 것 — 이 파일이 `kbf-public.css` 보다
        **나중에 로드**되므로 특이도가 같아도 순서로 이겨 **이 띠만 셸(1440)에 갇힌다.**
        `KBF-66` 의 `.kbf-hero` 가 똑같은 구조였고 같은 방법으로 풀었다.
     ⭐ 단축형 `padding` 도 쓰지 말 것 — 뒤에 오는 `padding-inline` 을 만나도 세로까지 재설정한다.
     ⭐ 아래 미디어쿼리(`≤1439`)는 단축형 그대로 둔다 — 그 구간은 셸 == 뷰포트라 bleed 가
        no-op 이고, 나중 로드로 이겨 24px·20px 이 그대로 유지된다(의도한 동작). */
  padding-block: 56px;
  background-color: var(--kbf-navy-subhero);
}

/* 🔑 **바가 있을 때만** 아래를 늘려 340 을 만든다 (KBF-96 1단계).
     56 + 163(크럼 23 + 제목 100 + 리드 40) + 121 = 340 — 팀소개 `S31b` 밴드와 같은 값이다.

   ⚠️ **`min-height` 를 쓰지 않는 이유가 둘이다.**
     ① `min-height` 는 미디어쿼리의 `padding` 재선언으로 중화되지 않아 모바일 밴드가 340 이
        된다 — `league-stage3.mjs` 의 151/231/242/192 계약이 통째로 깨진다.
     ② 바가 없는 상세 화면(`post`·`gibo-view`·`match-detail`)에도 걸려 제목 아래에
        **죽은 네이비 65px** 이 생긴다. 패딩은 바가 있는 화면에만 붙는다.
   ⭐ 덤 — h1 이 2줄이 돼도 패딩이 함께 밀리므로 카드가 글자에 닿지 않는다. */
.kbf-sub-hero:has(.kbf-sub-hero__bar) .kbf-sub-hero__band { padding-bottom: 121px; }

/* 배경 장식 — KBF-96 2단계부터 **이 규칙 한 벌이 13화면을 맡는다**(팀소개 포함).
   옛 `kbf-team.css` 의 `.kbf-team-hero__art` 는 같은 커밋에서 사라졌다.
   ⭐ `left: 820px`(= 1440 − 620) 이 아니라 `right: 0` 이다 — 820 은 셸 1440 고정을 전제한
      값이라 띠가 화면 폭으로 넓어지면 우측이 빈다(`KBF-68` 에서 팀소개가 같은 길을 갔다). */
.kbf-sub-hero__art { position: absolute; left: auto; right: 0; top: 0; }

/* 🚨 **글자를 배경 아트 위로 올린다.** 이 3줄이 없으면 h1 과 lead 가 바둑판 SVG 뒤로 사라진다
   — absolute 요소는 `z-index: auto` 라도 흐름 안의 비위치 요소보다 나중에 그려지기 때문이다.
   이 함정은 옛 `kbf-team.css` 가 주석으로 남겨 둔 것을 승계한 것이다(그 파일은 이제 없다). */
.kbf-sub-hero .krds-breadcrumb-wrap,
.kbf-sub-hero__title,
.kbf-sub-hero__lead,
.kbf-sub-hero__variant { position: relative; }

/* 브레드크럼 — KRDS 원본 컴포넌트를 다크 배경용으로 재선언한다.
   ⚠️ --krds-breadcrumb--* 는 `.krds-breadcrumb-wrap` **자신**이 선언하므로 조상에
      재선언하면 무시된다. 컴포넌트 루트를 (0,2,0) 으로 잡는다(팀소개 선례 승계).
   ⚠️ S00b 실측은 15/23 이다 — 팀소개(S31b)의 14/18 은 Gen-1 셸 계보라 다르다.
      신규 9종은 마스터를 따른다. */
.kbf-sub-hero .krds-breadcrumb-wrap {
  --krds-breadcrumb--pc-font-size:  15px;
  --krds-breadcrumb--color-action:  transparent;
  --krds-breadcrumb--padding-x:     0;
  --krds-breadcrumb--margin-bottom: 0;
  --krds-light-color-text-basic:    #7C93BE;   /* 구분자 마스크 색 — 컴포넌트가 아니라 전역 토큰이다 */
  width: auto;
  /* 🚨 KRDS 원본이 `.krds-breadcrumb-wrap` 에 padding-top 24 를 건다. 시안에는 없다.
        그대로 두면 Sub Hero 가 275 → **299**(=24+275)로 정확히 24px 커진다.
        값은 `--krds-pc-gap-layout-header-breadcrumb` 인데 **컴포넌트 토큰이 아니라 전역
        레이아웃 토큰**이라 여기서 0 으로 재선언하면 다른 레이아웃까지 흔든다.
        ⇒ 토큰을 건드리지 않고 padding 자체를 (0,2,0) 특이도로 덮는다. */
  padding-top: 0;
}
.kbf-sub-hero .breadcrumb { gap: 9px; }   /* gap 토큰이 없다 */

/* ⚠️ 색은 토큰으로 못 바꾼다 — --krds-breadcrumb--color-text 는 선언만 되고 var() 로
      소비되는 곳이 0건인 죽은 토큰이다.
   ⚠️ 특이도: KRDS 의 `.krds-breadcrumb-wrap .breadcrumb li a.txt`(0,3,2)를 이겨야
      밑줄이 지워진다. 아래는 (0,4,1) 이라 클래스 수로 이긴다. */
.kbf-sub-hero .krds-breadcrumb-wrap .breadcrumb li .txt {
  color: var(--kbf-subhero-text);
  font-size: 15px;
  line-height: 23px;
  font-weight: 400;
  letter-spacing: 0;
  text-decoration: none;
}
.kbf-sub-hero .krds-breadcrumb-wrap .breadcrumb li:last-child .txt {
  color: var(--krds-color-light-gray-0);
  font-weight: 500;
}

/* ⚠️⚠️ 외부 의존 차단 — krds.min.css 는 krds.go.kr 의 SVG 아이콘 76종을 350회 참조한다.
   구분자도 그중 하나(ico_angle.svg)를 mask-image 로 불러오므로 그대로 두면
   수용 기준 「외부 요청 0건」이 깨진다. KRDS 원본은 무수정이어야 하므로 여기서
   마스크를 끄고 로컬 data URI 로 대체한다. KRDS 의 rotate(-90deg) 도 함께 해제한다. */
.kbf-sub-hero .krds-breadcrumb-wrap .breadcrumb li:not(:last-child)::after {
  -webkit-mask-image: none;
  mask-image: none;
  background-color: transparent;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'%3E%3Cpath d='M4.2 2.2L8 6L4.2 9.8' fill='none' stroke='%237C93BE' stroke-width='1.4' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: center;
  background-size: contain;
  width: 12px;
  height: 12px;
  margin-left: 0;      /* .breadcrumb 의 gap 9 가 간격을 준다 */
  transform: none;
}

/* Page Title (FO9-0 pt22 · FOA-0 52/78/700) · Lead (FOB-0 pt14 · FOC-0 17/26/400) */
.kbf-sub-hero__title {
  margin: 22px 0 0;
  color: var(--krds-color-light-gray-0);
  font-size: 52px;
  font-weight: 700;
  line-height: 78px;
  letter-spacing: 0;
}
/* ⚠️ **block** 이어야 한다. inline 으로 두면 `<p>` 안에 인라인 strut 이 생겨
   line-height 26 인데도 박스가 26.5 가 되고 Sub Hero 가 432 → 433 이 된다(실측). */
.kbf-sub-hero__lead-full  { display: block; }
.kbf-sub-hero__lead-short { display: none; }   /* 모바일에서만 보인다 */
.kbf-sub-hero__lead {
  margin: 14px 0 0;
  color: var(--kbf-subhero-text);
  font-size: 17px;
  font-weight: 400;
  line-height: 26px;
  letter-spacing: 0;
}
/* Hero 변형 A(필터바)·B(검색바) 슬롯 — KBF-96 1단계부터 Band 의 **형제**다.
   −67 로 띠에 잠겨 「네이비 위에 얹힌 흰 카드」가 된다. 팀소개 `S31b` 와 같은 값이며
   실측으로 두 화면의 바 상단이 y=365 로 일치한다.
   ⚠️ `position: relative` 가 필수다 — 띠가 relative 라 static 인 형제보다 위에 그려진다.
   ⚠️ 가로는 `--kbf-gutter` 로 들여 밴드 내용과 좌표를 맞춘다(둘 다 48). 태블릿은 24 라
      아래 미디어쿼리가 다시 잡는다. */
.kbf-sub-hero__bar {
  position: relative;
  z-index: 1;
  margin: -67px var(--kbf-gutter) 0;
}


/* ── 2. Main Area (FOE-0) ─────────────────────────────────────────────────
   padding 24/48/44 · gap 24 · align-items flex-start · bg gray-5 */
.kbf-sub-main {
  display: flex;
  align-items: flex-start;
  box-sizing: border-box;
  width: 100%;
  padding: 24px var(--kbf-gutter) 44px;
  gap: 24px;
  background-color: var(--krds-color-light-gray-5);
}


/* ── 3. LNB (FOF-0) ───────────────────────────────────────────────────────
   320 고정 · bg gray-0 · border-top 2px gray-95 · border-bottom 1px gray-20

   ⭐ KBF-128 — 사이드바 치수·글자·색을 **여기 한 곳에서만** 정한다.
      팀소개(`/team`)에는 LNB 가 없다. `nav.php` 의 team 그룹이 `children` 0 이라
      `$hasLnb` 가 false 이고, 그 320 자리를 **팀 목록이 대신 쓴다**(`nav.php:22` 설계).
      두 컴포넌트가 같은 자리에 다른 모양으로 있어서 발주처가 차이를 지적했다.

      값을 베껴 두 벌로 두면 한쪽만 고쳐 다시 갈라진다. 그래서 변수로 뺐다.
      LNB 는 아래에서, 팀 목록은 §3-b 에서 **같은 변수**를 읽는다.
      ⚠️ 셀렉터를 나란히 적는 방법은 쓸 수 없었다 — 모바일에서 둘의 거동이 반대다
         (LNB 제목은 숨고 · 팀 목록 제목은 각주로 바뀐다). 한 규칙에 묶으면
         한쪽 모바일 규칙이 다른 쪽을 덮는다. */
:root {
  --kbf-lnb-tit-h:        64px;
  --kbf-lnb-tit-size:     19px;
  --kbf-lnb-tit-lh:       29px;
  --kbf-lnb-tit-color:    var(--krds-color-light-gray-95);
  --kbf-lnb-pi:           20px;
  --kbf-lnb-item-h:       56px;
  --kbf-lnb-item-size:    17px;
  --kbf-lnb-item-lh:      26px;
  --kbf-lnb-item-color:   var(--krds-color-light-gray-70);
  --kbf-lnb-line:         var(--krds-color-light-gray-10);
  --kbf-lnb-edge-top:     var(--krds-color-light-gray-95);
  --kbf-lnb-edge-bottom:  var(--krds-color-light-gray-20);
  --kbf-lnb-active-bg:    var(--krds-color-light-primary-5);
  --kbf-lnb-active-color: var(--krds-color-light-primary-60);
}

.kbf-lnb {
  display: flex;
  flex-direction: column;
  box-sizing: border-box;
  /* ⚠️ flex 3속성을 세트로 준다 — flex-basis 기본값이 width 를 이겨 240px 이 111px 로
        찌그러진 적이 있다(D-41-01 ⑤). 폭을 고정하려면 basis 까지 고정한다. */
  flex: 0 0 320px;
  width: 320px;
  background-color: var(--krds-color-light-gray-0);
  border-top: 2px solid var(--kbf-lnb-edge-top);
  border-bottom: 1px solid var(--kbf-lnb-edge-bottom);
}
.kbf-lnb__tit {                      /* FOG-0 h64 · pi 20 · FOH-0 19/29/700 */
  display: flex;
  align-items: center;
  box-sizing: border-box;
  height: var(--kbf-lnb-tit-h);
  margin: 0;
  padding-inline: var(--kbf-lnb-pi);
  flex-shrink: 0;
  color: var(--kbf-lnb-tit-color);
  font-size: var(--kbf-lnb-tit-size);
  font-weight: 700;
  line-height: var(--kbf-lnb-tit-lh);
  letter-spacing: 0;
}
.kbf-lnb__list { margin: 0; padding: 0; list-style: none; }
.kbf-lnb__item {                     /* FOK-0 h56 · pi 20 · FOL-0 17/26/400 gray-70 */
  display: flex;
  align-items: center;
  box-sizing: border-box;
  height: var(--kbf-lnb-item-h);
  padding-inline: var(--kbf-lnb-pi);
  border-bottom: 1px solid var(--kbf-lnb-line);
  color: var(--kbf-lnb-item-color);
  font-size: var(--kbf-lnb-item-size);
  font-weight: 400;
  line-height: var(--kbf-lnb-item-lh);
  letter-spacing: 0;
  text-decoration: none;
}
.kbf-lnb__item.is-active {           /* FOI-0 bg primary-5 · FOJ-0 17/26/700 primary-60 */
  background-color: var(--kbf-lnb-active-bg);
  color: var(--kbf-lnb-active-color);
  font-weight: 700;
}
.kbf-lnb__item:hover { color: var(--kbf-lnb-active-color); }


/* ── 3-b. 팀 목록이 LNB 와 같은 모양을 쓴다 (KBF-128) ──────────────────────
   팀소개 왼쪽 320 칸은 LNB 가 아니라 **팀 목록**이다(§3 머리말 참조). 위와 같은
   변수를 읽어 치수·글자·색을 맞춘다.

   🚨 **여기(kbf-sub.css)에 두는 이유는 로드 순서다.** `/team` 은 자식 뷰가 먼저
      `kbf-team.css` 를 push 하고 레이아웃이 나중에 이 파일을 push 한다 ⇒ 순서가
      `team → sub` 라 **이 파일이 이긴다.** 팀 전용 조정을 `kbf-team.css` 에 두면
      특이도가 같을 때 져서 무효가 된다.
      `TeamShellTest::test_the_sub_stylesheet_wins_on_team` 이 그 순서를 잠근다.
      `.kbf-filter-bar--team` 변형이 이 파일에 있는 이유도 같다.

   🚨 **마크업에 `kbf-lnb` 클래스를 붙이지 않는다.** `TeamShellTest::test_team_has_no_lnb`
      가 `/team` 렌더에 그 문자열이 **0 건**일 것을 요구한다(320 열이 둘이 되는 것을 막는
      계약). 그래서 팀 목록의 기존 클래스를 셀렉터로 집는다.

   ⚠️ **767 이하는 건드리지 않는다**(사용자 결정 3A). 그 구간에서 팀 목록은 숨고 제목만
      각주로 남는다(`D-39`). 그래서 이 블록 전체를 `min-width: 768px` 로 가둔다. */
@media (min-width: 768px) {
  /* 제목 칸 — LNB 의 `__tit` 자리. 팀은 칸(`__head`)과 글자(`__title`)가 갈려 있어
     칸에 글자 스타일을 주고 자식이 상속받게 한다. */
  .kbf-team-list__head {
    height: var(--kbf-lnb-tit-h);
    padding-inline: var(--kbf-lnb-pi);
    background-color: var(--krds-color-light-gray-0);
    border: 0;
    border-top: 2px solid var(--kbf-lnb-edge-top);
    border-radius: 0;
    color: var(--kbf-lnb-tit-color);
    font-size: var(--kbf-lnb-tit-size);
    font-weight: 700;
    line-height: var(--kbf-lnb-tit-lh);
    letter-spacing: 0;
  }
  .kbf-team-list__title {
    font: inherit;
    color: inherit;
    letter-spacing: inherit;
  }

  /* 항목 컨테이너 — LNB 는 감싸는 `.kbf-lnb` 가 아래 테두리를 그린다.
     팀은 head 와 tabs 가 grid 형제라 tabs 가 그 몫을 맡는다. 좌우 테두리는 없앤다. */
  .kbf-team-list__tabs {
    background-color: var(--krds-color-light-gray-0);
    border-inline: 0;
    border-bottom: 1px solid var(--kbf-lnb-edge-bottom);
  }

  /* 항목 — LNB 의 `__item` 자리. `.btn-tab` 은 button 이라 KRDS 기본을 덮어야 한다. */
  .kbf-team-list__tabs.tab .btn-tab {
    height: var(--kbf-lnb-item-h);
    padding-inline: var(--kbf-lnb-pi);
    border: 0;
    border-bottom: 1px solid var(--kbf-lnb-line);
    color: var(--kbf-lnb-item-color);
    font-size: var(--kbf-lnb-item-size);
    font-weight: 400;
    line-height: var(--kbf-lnb-item-lh);
    letter-spacing: 0;
  }
  /* 🚨 KRDS 탭은 높이·글자를 **자기 토큰**으로 정한다. `.tab` 자신이 선언하므로
        조상에 써도 무시되고, 위의 직접 선언과 경쟁한다 ⇒ 토큰도 함께 맞춘다. */
  .kbf-team-list__tabs.tab {
    --krds-tab--button-size-height:  var(--kbf-lnb-item-h);
    --krds-tab--button-pc-font-size: var(--kbf-lnb-item-size);
    --krds-tab--button-color-text:   var(--kbf-lnb-item-color);
  }

  .kbf-team-list__tabs.tab > ul > li.active .btn-tab {
    background-color: var(--kbf-lnb-active-bg);
    color: var(--kbf-lnb-active-color);
    font-weight: 700;
  }
  .kbf-team-list__tabs.tab .btn-tab:hover { color: var(--kbf-lnb-active-color); }
}


/* ── 4. Main Content (FOO-0) ──────────────────────────────────────────────
   flexGrow 1 · column · gap 20 · padding 34/34/38 · radius 8 · border 1px gray-10
   ⇒ 내용 폭  LNB 있음 1000 − 2 − 68 = 930  ·  LNB 없음 1344 − 2 − 68 = 1274 */
.kbf-sub-content {
  display: flex;
  flex-direction: column;
  box-sizing: border-box;
  flex: 1 1 0;
  min-width: 0;                      /* flex 비율은 flex 3속성 + min-width:0 이 한 세트다(D-45-06) */
  gap: 20px;
  padding: 34px 34px 38px;
  border: 1px solid var(--krds-color-light-gray-10);
  border-radius: 8px;
  background-color: var(--krds-color-light-gray-0);
}
.kbf-sub-placeholder {               /* Phase 1 골격 표시 — Phase 2 에서 사라진다 */
  margin: 0;
  color: var(--krds-color-light-gray-50, #6D7882);
  font-size: 17px;
  line-height: 26px;
}


/* ── 5. 태블릿 768~1439 ───────────────────────────────────────────────────
   시안이 1440 절대값이라 그대로 두면 좁은 폭에서 LNB 320 이 본문을 압박한다.
   ⚠️ 「시안 없는 구간」이며 우리가 규칙을 정한다(D-45-05). */
@media (min-width: 768px) and (max-width: 1439px) {
  .kbf-sub-hero__band  { padding: 40px 24px; }
  /* 🚨 `:has()` 규칙은 특이도 (0,3,0) 이라 위의 (0,1,0) 이 **순서로도 못 이긴다.**
     같은 형태로 다시 선언해야 데스크톱의 121 이 이 구간까지 새지 않는다. */
  .kbf-sub-hero:has(.kbf-sub-hero__bar) .kbf-sub-hero__band { padding-bottom: 40px; }
  /* 🚨 `--kbf-gutter` 는 이 구간에서 **48** 이다(20 이 되는 것은 ≤767 뿐).
     밴드와 본문이 24 라 그대로 두면 바만 24px 씩 안쪽으로 밀려 어긋난다. */
  .kbf-sub-hero__bar   { margin-inline: 24px; }
  .kbf-sub-hero__title { font-size: 40px; line-height: 58px; margin-top: 16px; }
  .kbf-sub-main        { padding: 20px 24px 32px; gap: 16px; }
  .kbf-lnb             { flex: 0 0 240px; width: 240px; }
  .kbf-sub-content     { padding: 24px; }
}


/* ── 6. 모바일 ≤767 ───────────────────────────────────────────────────────
   S00bm — LNB 320 세로 컬럼은 390px 에서 성립하지 않아 **가로 칩 스트립**이 된다.
   항목과 현재 위치는 100% 보존하고 배치 축만 수직→수평이다(S24 반응형 계약).
   ⚠️ 마크업은 하나다. 두 벌로 만들면 갈라진다.
   ⚠️ 아래 치수는 홈의 `.kbf-subnav__chip`(h40 · px16 · radius 20) 선례를 따른 임시값이다.
      Paper 08 Public Mobile 실측은 Phase 2 각 묶음에서 하고 그때 교정한다. */
@media (max-width: 767px) {
  /* Paper `S00bm`·`S46b`(J6H-0) 실측 — 임시값을 전부 교체했다.
     Sub Hero 151 = padding 16 + Breadcrumb 20 + Title 58(pt10) + Context 29(pt6) + padding 28 */
  .kbf-sub-hero__band  { padding: 16px 20px 28px; }
  .kbf-sub-hero:has(.kbf-sub-hero__bar) .kbf-sub-hero__band { padding-bottom: 28px; }
  /* 배경 장식 — 원본 620×340 을 그대로 두면 151px 띠를 넘는다. 팀소개 모바일과 같은 168 로 줄인다.
     ⚠️ SVG 자신이 `.kbf-sub-hero__art` 다(래퍼가 없다) — 자손 셀렉터는 매칭되지 않는다. */
  .kbf-sub-hero__art   { width: 168px; height: auto; }
  .kbf-sub-hero__title { font-size: 32px; line-height: 48px; margin-top: 10px; }
  .kbf-sub-hero__lead  { font-size: 15px; line-height: 23px; font-weight: 500; margin-top: 6px; }
  .kbf-sub-hero__lead-full  { display: none; }
  .kbf-sub-hero__lead-short { display: block; }

  /* 🚨 모바일 Sub Hero 계약은 **두 값**이다 — 목록형 151 · 상세형 199.
     위 주석의 「151 = ... Title 58(pt10)」은 **목록형 계약**이다. 상세 화면은 결정 `G5`
     로 h1 이 **콘텐츠 제목**이 되는데, 모바일 1줄 예산은 한글 **12자**뿐이라 실측 초과율이
       press 448/448 · notice 119/119 · news 206/210 · gibo 4,656/4,659
     다. ⇒ 「151 고정」과 `G5` 는 **동시에 성립하지 않는다.** h1 을 2줄까지 허용하고 그 위를
     잘라 상세형을 199 로 고정한다(= padding 16 + 크럼 20 + pt10 + Title 96 + pt6 + Context 23 + padding 28).

     ⚠️ 문자수로 자르지 않는다(`Str::limit` 기각) — 350px 안에 한글 26자 · 숫자 40자 ·
        `M` 27자가 들어간다. 폭 단위당 픽셀이 **2배** 벌어지므로 문자수는 계약이 못 된다.
     ⚠️ `display` 를 여기서 켜도 `hero-mobile` 변형(개인순위·경기상세)은 안 깨진다 —
        `.kbf-sub-hero__variant ~ .kbf-sub-hero__title` 이 2클래스라 특이도가 더 높다. */
  .kbf-sub-hero__title {
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
  }
  /* Context 는 언제나 1줄이다. 2줄이 되면 목록형이 151 → 174 로 밀린다(news/1 실측 221). */
  .kbf-sub-hero__lead-short {
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  }
  .kbf-sub-hero .breadcrumb { gap: 7px; }
  .kbf-sub-hero .krds-breadcrumb-wrap .breadcrumb li .txt { font-size: 13px; line-height: 20px; }

  /* 🚨🚨 KRDS 모바일 브레드크럼 접기 해제 — **외부 요청 2건의 출처였다.**
     KRDS 는 ≤767 에서 중간 항목을 sr-only 로 숨기고 `…` 를 넣는다:
       li:not(.home):not(:last-child)            → 숨김 (!important)
       li:not(.home):not(:nth-child(2)):last-child::before → ico_ellipsis.svg  ← krds.go.kr
       그 ::after                                → ico_angle.svg               ← krds.go.kr
     ⇒ 우리는 `.home` 클래스를 쓰지 않으므로(시안 첫 항목이 아이콘이 아니라 텍스트 HOME)
        **HOME 까지 함께 숨겨져** `… > 인사말` 이 되고 이동 수단이 0이 된다. 접근성 후퇴다.
     ⇒ 우리 브레드크럼은 최대 3단(HOME > 그룹 > 항목 ≈ 200px)이라 390px 에 충분히 들어간다.
        접기가 필요 없다. 접기를 끄면 외부 SVG 2건도 함께 사라진다.

     ⚠️ 팀소개(2단)는 마지막이 `:nth-child(2)` 라 이 규칙에서 빠져 그동안 안 걸렸다.
        **3단을 쓰는 서브페이지가 처음 밟은 것**이고, 그래서 KBF-28·41 검증은 통과했다.
     ⚠️ KRDS 권장 밖으로 나가므로 완화책을 둔다 — 13px 축소 + nowrap + 넘치면 가로 스크롤.
        (D-1 노선 C: 권장 이탈 시 완화책 설계 + 분류 B 기록)
     ⚠️ 특이도 (0,5,1) 로 KRDS (0,4,1) 를 이기지만 KRDS 가 !important 를 썼으므로 함께 쓴다. */
  .kbf-sub-hero .krds-breadcrumb-wrap .breadcrumb { overflow-x: auto; }
  .kbf-sub-hero .krds-breadcrumb-wrap .breadcrumb li { flex-shrink: 0; }
  .kbf-sub-hero .krds-breadcrumb-wrap .breadcrumb li:not(.home):not(:last-child) {
    position: static !important;
    width: auto !important;
    height: auto !important;
    padding: 0 !important;
    margin: 0 !important;
    overflow: visible !important;
    clip: auto !important;
    clip-path: none !important;
    white-space: nowrap !important;
  }
  /* `…`(ico_ellipsis) 와 마지막 항목 뒤 꺾쇠(ico_angle) 를 끈다 — 둘 다 외부 SVG 다. */
  .kbf-sub-hero .krds-breadcrumb-wrap .breadcrumb li:not(.home):not(:nth-child(2)):last-child::before,
  .kbf-sub-hero .krds-breadcrumb-wrap .breadcrumb li:not(.home):not(:nth-child(2)):last-child::after {
    display: none;
  }
  /* KRDS 가 `…` 를 앞에 두려고 텍스트를 order:3 으로 밀어 둔다. 접기를 껐으니 되돌린다. */
  .kbf-sub-hero .krds-breadcrumb-wrap .breadcrumb li:not(.home):not(:nth-child(2)):last-child .txt { order: 0; }

  /* Main Area (mobile) — J70-0 실측 · padding 16/0/20 · gap 16.
     ⚠️ display:block 으로 두면 gap 이 죽는다. flex column 을 유지한다. */
  .kbf-sub-main {
    flex-direction: column;
    align-items: stretch;
    padding: 16px 0 20px;
    gap: 16px;
  }

  /* Sub Nav 가로 칩 — J74-0 실측 · padding-inline 20 · gap 8 · 칩 h40 pi16 radius20.
     활성은 **채움**(bg primary-60 + 흰 글씨)이고 비활성은 흰 배경 + gray-20 테두리다. */
  .kbf-lnb {
    flex-direction: row;
    width: auto;
    flex: 0 0 auto;
    gap: 8px;
    padding: 0 20px;
    border-top: 0;
    border-bottom: 0;
    background: none;
    overflow-x: auto;                /* 항목이 많으면 가로 스크롤 — 잘라내지 않는다 */
    -webkit-overflow-scrolling: touch;
  }
  .kbf-lnb__tit  { display: none; }  /* 페이지 타이틀이 같은 말을 이미 하고 있다 */
  .kbf-lnb__list { display: flex; gap: 8px; }
  .kbf-lnb__row  { flex-shrink: 0; }
  .kbf-lnb__item {
    height: 40px;
    padding-inline: 16px;
    border: 1px solid var(--krds-color-light-gray-20);
    border-radius: 20px;
    background-color: var(--krds-color-light-gray-0);
    font-size: 15px;
    line-height: 23px;
    font-weight: 400;
    white-space: nowrap;
  }
  .kbf-lnb__item.is-active {
    background-color: var(--krds-color-light-primary-60);
    border-color: var(--krds-color-light-primary-60);
    color: var(--krds-color-light-gray-0);
    font-weight: 700;
  }

  /* Main Content (mobile) — J71-0 실측 · padding 20 · gap 12 · 좌우 테두리 없음 */
  .kbf-sub-content {
    padding: 20px;
    gap: 12px;
    border-inline: 0;
    border-top: 1px solid var(--krds-color-light-gray-10);
    border-radius: 0;
  }
}


/* ============================================================================
   화면별 — 묶음 1 리그소개
   ========================================================================= */

/* ── S28b 인사말 (FUN-0 실측) ─────────────────────────────────────────────
   Main Content 를 가로 2단으로 쓴다 — 기본은 column 이므로 이 화면만 row 로 바꾼다. */
.kbf-greeting {
  display: flex;
  align-items: flex-start;
  gap: 36px;
}
.kbf-greeting__author {
  display: flex;
  flex-direction: column;
  /* flex 3속성 세트 — basis 를 빼면 콘텐츠가 비율을 이긴다(D-41-01 ⑤) */
  flex: 0 0 220px;
  width: 220px;
  gap: 16px;
}
.kbf-greeting__photo {
  display: block;
  width: 220px;
  height: 280px;
  object-fit: cover;
  border-radius: 8px;
  background-color: var(--krds-color-light-gray-5);
}
.kbf-greeting__sign { display: flex; flex-direction: column; gap: 4px; margin: 0; }
.kbf-greeting__role {
  color: var(--krds-color-light-gray-70);
  font-size: 15px;
  font-weight: 400;
  line-height: 23px;
}
.kbf-greeting__name {
  color: var(--krds-color-light-gray-95);
  font-size: 19px;
  font-weight: 700;
  line-height: 29px;
}
.kbf-greeting__letter {
  display: flex;
  flex-direction: column;
  flex: 1 1 0;
  min-width: 0;
  gap: 26px;
}
.kbf-greeting__title {
  /* KBF-108 — 관리자가 저장한 인사말 제목. 화면에 자리가 없어 신설했다.
     본문 소제목(19/29/700 gray-95)과 같은 규격을 쓴다. */
  margin: 0;
  color: var(--krds-color-light-gray-95);
  font-size: 19px;
  font-weight: 700;
  line-height: 29px;
}
.kbf-greeting__para {
  margin: 0;
  color: var(--krds-color-light-gray-80);
  font-size: 17px;
  font-weight: 400;
  line-height: 26px;
  white-space: pre-line;      /* 배열 안 \n = 레거시의 홑 <br> */
}
.kbf-greeting__closing {
  margin: 0;
  padding-top: 14px;
  color: var(--krds-color-light-gray-95);
  font-size: 19px;
  font-weight: 700;
  line-height: 29px;
}

/* 모바일 — S46b(J8B-0) 실측.
   ⚠️ 변경이력 L1432 는 「2단 → 세로 스택」이라 적었으나 **실측은 다르다.**
      Author 자체가 `row · align center · gap 16` 이고 사진이 84×104 로 작아진다.
      「세로 스택」은 Author 와 Letter 의 관계를 말한 것이고 Author 내부는 가로다. */
@media (max-width: 767px) {
  .kbf-greeting { flex-direction: column; gap: 12px; }
  .kbf-greeting__author {
    flex: 0 0 auto;
    width: 100%;
    flex-direction: row;      /* ⬅ 사진 옆에 서명 */
    align-items: center;
    gap: 16px;
  }
  .kbf-greeting__photo { width: 84px; height: 104px; border-radius: 4px; }
  .kbf-greeting__name  { font-size: 22px; line-height: 32px; }
  .kbf-greeting__letter { gap: 14px; }
  .kbf-greeting__para   { color: var(--krds-color-light-gray-90); }
  .kbf-greeting__closing { padding-top: 0; font-size: 15px; line-height: 23px; }
}


/* ── 공통 표 (S30b `Table / 일정` 실측 — 다른 화면도 이 규칙을 승계한다) ────
   border-top 2px gray-95 · border-bottom 1px gray-20
   Head  h56 · pi 20 · bg gray-5 · bb 1px gray-20 · 15/23/700 gray-70
   Row   min-height 64 · padding 19/20 · bb 1px gray-10 · align flex-start
   ⚠️ `<table>` 이 아니라 flex 행이다 — KRDS 의 요소 셀렉터 리셋과 충돌하지 않게.
      시맨틱은 role=table/row/columnheader/cell 로 보강한다(홈 순위표 선례). */
.kbf-table {
  display: flex;
  flex-direction: column;
  width: 100%;
  border-top: 2px solid var(--krds-color-light-gray-95);
  border-bottom: 1px solid var(--krds-color-light-gray-20);
}
.kbf-table__head {
  display: flex;
  align-items: center;
  box-sizing: border-box;
  height: 56px;
  flex-shrink: 0;
  padding-inline: 20px;
  background-color: var(--krds-color-light-gray-5);
  border-bottom: 1px solid var(--krds-color-light-gray-20);
}
.kbf-table__head .kbf-table__cell {
  color: var(--krds-color-light-gray-70);
  font-size: 15px;
  font-weight: 700;
  line-height: 23px;
}
.kbf-table__row {
  display: flex;
  align-items: flex-start;
  box-sizing: border-box;
  min-height: 64px;
  flex-shrink: 0;
  padding: 19px 20px;
  border-bottom: 1px solid var(--krds-color-light-gray-10);
}
.kbf-table__row:last-child { border-bottom: 0; }   /* 컨테이너의 bottom 이 마감한다 */
.kbf-table__cell {
  color: var(--krds-color-light-gray-80);
  font-size: 17px;
  font-weight: 400;
  line-height: 26px;
}

/* 일정 — 열폭 200 / 220 / 470. 「구분」만 강조(레거시 <strong> 승계). */
.kbf-table--schedule .kbf-table__cell--0 { width: 200px; flex-shrink: 0; }
.kbf-table--schedule .kbf-table__cell--1 { width: 220px; flex-shrink: 0; }
.kbf-table--schedule .kbf-table__cell--2 { flex: 1 1 0; min-width: 0; }
.kbf-table--schedule .kbf-table__row .kbf-table__cell--1 {
  color: var(--krds-color-light-gray-95);
  font-weight: 700;
}

/* 모바일 — S48b(JCO-0) 실측. 「3열 표 → 카드 목록」이며 **2줄**이다:
     1줄  날짜            17/26/500 gray-90
     2줄  「구분 · 장소」   15/23/400 gray-50   ← 두 열을 가운뎃점으로 합친다
   Row  padding-block 14 · gap 2 · border-bottom 1px gray-10 (좌우 패딩은 Main Content 몫)
   ⚠️ 시안 데이터(06.23·06.24·07.06)는 **목업 표본**이다 — 같은 아트보드의 `Note` 가
      *"데스크톱 3열 표를 카드 목록으로 전환 (S24 계약)"* 이라고 밝힌다.
      실데이터는 레거시 5행이며 데스크톱과 같다. */
@media (max-width: 767px) {
  .kbf-table--schedule { border-top: 0; border-bottom: 0; }
  .kbf-table--schedule .kbf-table__head { display: none; }
  .kbf-table--schedule .kbf-table__row {
    flex-wrap: wrap;            /* 날짜만 첫 줄을 통째로 쓰고 나머지 둘이 다음 줄에 나란히 */
    align-items: baseline;
    min-height: 0;
    padding: 14px 0;
    gap: 2px;
  }
  .kbf-table--schedule .kbf-table__cell--0 {
    width: 100%;
    color: var(--krds-color-light-gray-90);
    font-size: 17px;
    font-weight: 500;
    line-height: 26px;
  }
  .kbf-table--schedule .kbf-table__row .kbf-table__cell--1,
  .kbf-table--schedule .kbf-table__cell--2 {
    width: auto;
    flex: 0 0 auto;
    color: var(--krds-color-light-gray-50);
    font-size: 15px;
    font-weight: 400;
    line-height: 23px;
  }
  .kbf-table--schedule .kbf-table__cell--2::before { content: " · "; }
}


/* ── S29b 대회소개 (G29-0 실측) ────────────────────────────────────────── */
.kbf-about { display: flex; flex-direction: column; gap: 32px; }

/* 목차 — 3,300px 문서라 없으면 훑기가 어렵다. padding 20/24 · radius 8 · bg gray-5 */
.kbf-about__toc {
  display: flex;
  flex-direction: column;
  padding: 20px 24px;
  gap: 14px;
  border-radius: 8px;
  background-color: var(--krds-color-light-gray-5);
}
.kbf-about__toc-tit {
  margin: 0;
  color: var(--krds-color-light-gray-70);
  font-size: 15px;
  font-weight: 700;
  line-height: 23px;
}
.kbf-about__chips { display: flex; flex-wrap: wrap; gap: 12px; }
.kbf-about__chip {
  display: inline-flex;
  align-items: center;
  height: 38px;
  padding-inline: 16px;
  border: 1px solid var(--krds-color-light-gray-20);
  border-radius: 19px;
  background-color: var(--krds-color-light-gray-0);
  color: var(--krds-color-light-gray-70);
  font-size: 15px;
  line-height: 23px;
  text-decoration: none;
}
.kbf-about__chip:hover {
  border-color: var(--krds-color-light-primary-60);
  color: var(--krds-color-light-primary-60);
}

/* 조 — pb 32 · gap 20 · border-bottom 1px gray-10 (마지막은 선 없음) */
.kbf-about__sec {
  display: flex;
  flex-direction: column;
  padding-bottom: 32px;
  gap: 20px;
  border-bottom: 1px solid var(--krds-color-light-gray-10);
  scroll-margin-top: 24px;      /* 목차 앵커 이동 시 상단에 붙지 않게 */
}
.kbf-about__sec:last-child { padding-bottom: 0; border-bottom: 0; }

.kbf-about__head { display: flex; align-items: center; margin: 0; gap: 12px; }
.kbf-about__badge {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 62px;
  height: 30px;
  flex-shrink: 0;
  border-radius: 4px;
  background-color: var(--krds-color-light-primary-5);
  color: var(--krds-color-light-primary-60);
  font-size: 15px;
  font-weight: 700;
  line-height: 23px;
}
.kbf-about__title {
  color: var(--krds-color-light-gray-95);
  font-size: 19px;
  font-weight: 700;
  line-height: 29px;
}

/* 조문 — 재귀. 마커 슬롯 L1 28 · L2 이하 30 · gap 8.
   하위 Group 은 「마커폭 + gap」만큼 들여쓰고 L3 부터 왼쪽 안내선을 둔다(실측). */
.kbf-clause__group { display: flex; flex-direction: column; }
.kbf-clause__group--l1 { gap: 14px; }
.kbf-clause__group--l2 { padding-left: 36px; gap: 18px; }
.kbf-clause__group--l3,
.kbf-clause__group--l4,
.kbf-clause__group--l5 {
  padding-left: 37px;
  gap: 14px;
  border-left: 1px solid var(--krds-color-light-gray-10);
}
.kbf-clause__item  { display: flex; flex-direction: column; gap: 14px; }
.kbf-clause__row   { display: flex; gap: 8px; }
.kbf-clause__marker {
  width: 30px;
  flex-shrink: 0;
  color: var(--krds-color-light-primary-60);
  font-size: 17px;
  font-weight: 700;
  line-height: 26px;
}
.kbf-clause__group--l1 > .kbf-clause__item > .kbf-clause__row > .kbf-clause__marker {
  width: 28px;
  color: var(--krds-color-light-gray-90);
}
.kbf-clause__text {
  flex: 1 1 0;
  min-width: 0;
  color: var(--krds-color-light-gray-80);
  font-size: 17px;
  font-weight: 400;
  line-height: 26px;
  white-space: pre-line;        /* 데이터 안의 \n = 레거시의 홑 <br> */
}
.kbf-clause__img { display: block; max-width: 100%; height: auto; }

/* 시상 — 표 규격은 일정표와 같다(.kbf-table 재사용). 열폭만 다르다. */
.kbf-about__award { display: flex; flex-direction: column; gap: 12px; }
.kbf-about__award-label {
  margin: 0;
  color: var(--krds-color-light-gray-90);
  font-size: 17px;
  font-weight: 700;
  line-height: 26px;
}
.kbf-table--award-team   .kbf-table__cell { flex: 1 1 0; min-width: 0; }
.kbf-table--award-person .kbf-table__cell--0 { width: 222px; flex-shrink: 0; }
.kbf-table--award-person .kbf-table__cell--1 { width: 178px; flex-shrink: 0; }
.kbf-table--award-person .kbf-table__cell--2 { flex: 1 1 0; min-width: 0; white-space: pre-line; }
.kbf-about__note {
  margin: 0;
  color: var(--krds-color-light-gray-70);
  font-size: 15px;
  font-weight: 400;
  line-height: 23px;
}

/* 모바일 — `S47b` 는 「4단 요강 표 → **조별 목록**」이다(변경이력 L1433).
   계층 들여쓰기를 줄이고 안내선은 유지해 계층이 읽히게 한다. */
@media (max-width: 767px) {
  .kbf-about { gap: 24px; }
  /* 목차 — S47b(JAH-0) 실측. 가로 칩이 아니라 **세로 행 목록 + 꺾쇠**다.
     Row h64 · space-between · border-bottom 1px gray-10 · 텍스트 17/26.
     ⚠️ 시안의 조 목록은 본문을 대체하는 것이 아니라 목차다 — 같은 아트보드 `Note` 가
        *"데스크톱 4단 요강 표를 조별 목록으로 전환 (S24 계약)"* 이라고 밝히며,
        844 고정 뷰포트라 그 아래 본문이 화면 밖에 있을 뿐이다. 본문을 지우면 감산이다. */
  .kbf-about__toc {
    padding: 0;
    border-radius: 0;
    background: none;
    gap: 0;
  }
  .kbf-about__toc-tit { display: none; }   /* 행 목록이 스스로 목차임을 보인다 */
  .kbf-about__chips { flex-direction: column; gap: 0; }
  .kbf-about__chip {
    justify-content: space-between;
    height: 64px;
    padding-inline: 0;
    border: 0;
    border-bottom: 1px solid var(--krds-color-light-gray-10);
    border-radius: 0;
    background: none;
    color: var(--krds-color-light-gray-90);
    font-size: 17px;
    line-height: 26px;
  }
  .kbf-about__chip::after {
    content: "›";
    color: var(--krds-color-light-gray-50);
    font-size: 17px;
    line-height: 26px;
  }
  .kbf-clause__group--l2 { padding-left: 18px; gap: 14px; }
  .kbf-clause__group--l3,
  .kbf-clause__group--l4,
  .kbf-clause__group--l5 { padding-left: 14px; gap: 12px; }
  .kbf-clause__marker,
  .kbf-clause__group--l1 > .kbf-clause__item > .kbf-clause__row > .kbf-clause__marker { width: 26px; }
  .kbf-clause__text { font-size: 15px; line-height: 23px; }
  .kbf-table--award-person .kbf-table__cell--0 { width: 84px; }
  .kbf-table--award-person .kbf-table__cell--1 { width: 78px; }
  .kbf-table--award-person .kbf-table__cell { font-size: 14px; line-height: 21px; }
  .kbf-table--award-team   .kbf-table__cell { font-size: 15px; line-height: 23px; }
}


/* ============================================================================
   화면별 — 묶음 2 대진표/결과
   ========================================================================= */

/* ── Hero 변형 A · Filter Bar (S25b `FQ9-0` 실측) ─────────────────────────
   1344×129 · pi 44 · radius 10 · gap 26 · bg gray-5 · border 1px gray-10 */
.kbf-filter-bar {
  display: flex;
  align-items: center;
  box-sizing: border-box;
  height: 129px;
  padding-inline: 44px;
  gap: 26px;
  border: 1px solid var(--krds-color-light-gray-10);
  border-radius: 10px;
  /* KBF-96 1단계 — 네이비 밖으로 나오면서 gray-5 로는 페이지 배경과 구분이 약해진다.
     팀소개 카드와 같은 `--kbf-surface-head`(#FAFAFB) 를 쓴다. */
  background-color: var(--kbf-surface-head);
}
.kbf-filter-bar__label {
  flex-shrink: 0;
  color: var(--krds-color-light-gray-95);
  font-size: 17px;
  font-weight: 700;
  line-height: 26px;
}
.kbf-filter-bar__label--league { padding-left: 22px; }
.kbf-filter-bar__select {
  display: flex;
  align-items: center;
  justify-content: space-between;
  box-sizing: border-box;
  width: 168px;
  height: 52px;
  flex-shrink: 0;
  padding-inline: 16px;
  border: 1px solid var(--krds-color-light-gray-20);
  border-radius: 6px;
  background-color: var(--krds-color-light-gray-0);
  color: var(--krds-color-light-gray-95);
  font-size: 17px;
  font-weight: 400;
  line-height: 26px;
}
.kbf-filter-bar__tabs { display: flex; align-items: center; gap: 16px; }
.kbf-filter-bar__tab {
  display: flex;
  align-items: center;
  justify-content: center;
  box-sizing: border-box;
  height: 52px;
  flex-shrink: 0;
  padding-inline: 20px;
  border: 1px solid var(--krds-color-light-gray-20);
  border-radius: 6px;
  background-color: var(--krds-color-light-gray-0);
  color: var(--krds-color-light-gray-70);
  font-size: 17px;
  font-weight: 400;
  line-height: 26px;
  white-space: nowrap;
  /* KBF-96 1단계 — 팀소개의 넉넉한 탭(256·268·236)을 전 화면에 준다(사용자 결정 2026-09-07).
     ⚠️ 팀소개처럼 `nth-child` 로 고정하지 않는다 — 리그는 `leagues` 행 수를 그대로 따르므로
        4개가 되면 네 번째에 폭 규칙이 없고, 관리자가 이름을 늘리면 글자가 넘친다.
     ⚠️ 데스크톱 전용이다. 236×3 은 768·390 에 안 들어가 아래 두 미디어쿼리가 0 으로 되돌린다. */
  min-width: 236px;
}
.kbf-filter-bar__tab.is-active {
  border-color: var(--kbf-accent-active);
  background-color: var(--kbf-accent-active);
  color: var(--krds-color-light-gray-0);
  font-weight: 700;
}

/* ── 준비중 탭 (KBF-42) ────────────────────────────────────────────────
   데이터가 없는 리그다. 지우지 않고 「왜 안 되는지」를 보여준다.
   ⚠️ 활성 탭에는 절대 붙지 않는다 — 지금 보고 있는 화면이기 때문이다. */
.kbf-filter-bar__tab.is-pending {
  gap: 6px;
  border-style: dashed;
  color: var(--krds-color-light-gray-50);
  cursor: pointer;
}
.kbf-filter-bar__badge {
  padding: 1px 6px;
  border-radius: 4px;
  background-color: var(--krds-color-light-gray-10);
  color: var(--krds-color-light-gray-60);
  font-size: 13px;
  font-weight: 400;
  line-height: 20px;
}

/* 준비중 탭을 눌렀을 때의 안내. `hidden` 이면 안 보인다(브라우저 기본). */
.kbf-filter-bar__notice {
  flex-basis: 100%;
  margin: 0;
  color: var(--krds-color-light-gray-70);
  font-size: 15px;
  line-height: 24px;
}

/* ── 리그 선택 바 — 리그소개 전용 (KBF-80 · S28b·S29b·S30b 실측) ────────
   `.kbf-filter-bar` 를 그대로 입고 **다른 점만** 얹는다. 생김새가 같으니 값을 베끼면
   두 벌이 되고, 한쪽만 고쳐지는 날이 온다.

   ⚠️ 덮어야 할 것이 둘 있고 **둘 다 원본을 읽어서 알았다**(`D-41-01` 5회 재발 자리).
     ① `.kbf-filter-bar__label--league { padding-left: 22px }` — 시즌 셀렉트와 띄우려던
        값이다. 여기엔 셀렉트가 없어 첫 요소가 44 가 아니라 66 에서 시작한다.
     ② 탭이 `<a>` 라 브라우저 기본 밑줄이 붙는다. `.kbf-filter-bar__tab` 은
        `text-decoration` 을 정하지 않아 UA 값이 그대로 남는다. */
.kbf-filter-bar--league .kbf-filter-bar__label--league { padding-left: 0; }
.kbf-filter-bar--league .kbf-filter-bar__tab { text-decoration: none; }
/* 정식명칭·약칭을 함께 싣고 뷰포트가 하나만 보인다. 데스크톱은 정식명칭이다. */
.kbf-filter-bar--league .kbf-filter-bar__tab-short { display: none; }

/* ── 팀소개 필터 바 — 팀소개 전용 (KBF-96 2단계 · S31b 실측) ──────────────
   `.kbf-filter-bar` 를 그대로 입고 **다른 점만** 얹는다. `--league` 와 같은 방식이다.

   ⚠️ 데스크톱에 필요한 것은 **두 줄뿐이다.** 나머지(h129 · pi44 · gap26 · radius10 ·
      배경 · 셀렉트 168×52 · 탭 min-width 236 · 활성색 #0036A5 · 셰브론 · `__native`)는
      공통 규칙이 **이미 같은 값**이다. 재선언하면 그 순간 두 벌이 되고 한쪽만 고쳐지는
      날이 온다 — 이 티켓이 없애러 온 바로 그것이다.
   ⭐ 옛 `kbf-team.css` 의 탭 폭 `nth-child(1)=256 / (2)=268` 은 되살리지 않는다.
      1단계가 `min-width: 236px` 를 전 화면에 주면서 버린 하드코딩이고, 리그가 4개가
      되면 네 번째에 폭 규칙이 없다. */
/* 데스크톱은 정식명칭을 쓴다. 약칭은 390 에서만 보인다. */
.kbf-filter-bar--team .kbf-filter-bar__tab-short { display: none; }
/* 팀 셀렉트는 **모바일 전용**이다 — 데스크톱은 좌측 팀 목록 탭이 같은 일을 한다.
   ⚠️ 숨겨도 **제출은 된다.** 연도를 바꿀 때 `data-kbf-drop="id"` 가 이 값을 버리지
      않으면 2025 팀 id 를 들고 2024 로 가서 404 가 난다(`kbf-public.js`). */
.kbf-filter-bar__select--team { display: none; }


/* ── 회차 헤더 (S34b `GZG-0` 실측) — pb12 · gap10 · bb 2px gray-95 ────── */
.kbf-round-head {
  display: flex;
  align-items: center;
  padding-bottom: 12px;
  gap: 10px;
  border-bottom: 2px solid var(--krds-color-light-gray-95);
}
.kbf-round-head__title {
  margin: 0;
  color: var(--krds-color-light-gray-95);
  font-size: 19px;
  font-weight: 700;
  line-height: 29px;
}
.kbf-round-head__meta {
  color: var(--krds-color-light-gray-50);
  font-size: 15px;
  font-weight: 400;
  line-height: 23px;
}

/* 모바일 전용 — 라운드 탭 · Summary (S52b). 데스크톱은 회차 헤더가 대신한다. */
.kbf-round-tabs, .kbf-round-summary { display: none; }


/* ── 경기 카드 (S34b `GZL-0` 실측 · 정규리그·포스트시즌 공용) ────────────
   ⚠️ `<details>` 다. 데스크톱은 항상 펼침(시안), 모바일은 접힘(감산 방지). */
.kbf-match {
  box-sizing: border-box;
  width: 294px;
  flex-shrink: 0;
  border: 1px solid var(--krds-color-light-gray-10);
  border-radius: 8px;
  overflow: clip;
}
.kbf-match__summary { display: block; list-style: none; }
.kbf-match__summary::-webkit-details-marker { display: none; }

.kbf-match__time {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 36px;
  background-color: var(--krds-color-light-gray-5);
  color: var(--krds-color-light-gray-70);
  font-size: 15px;
  font-weight: 500;
  line-height: 23px;
}
.kbf-match__emblems {
  display: flex;
  align-items: center;
  box-sizing: border-box;
  height: 84px;
  padding-inline: 16px;
}
.kbf-match__slot { display: flex; width: 100px; flex-shrink: 0; justify-content: center; }
.kbf-match__emblem {                    /* 시안 GZQ-0 — 원 56 · 팀명 앞 2글자 */
  display: flex;
  align-items: center;
  justify-content: center;
  width: 56px;
  height: 56px;
  flex-shrink: 0;
  border: 1px solid var(--krds-color-light-gray-20);
  border-radius: 28px;
  background-color: var(--krds-color-light-gray-5);
  color: var(--krds-color-light-gray-50);
  font-size: 15px;
  font-weight: 700;
  line-height: 23px;
}
.kbf-match__vs {
  display: flex;
  width: 60px;
  flex-shrink: 0;
  justify-content: center;
  color: var(--krds-color-light-gray-30);
  font-size: 15px;
  font-weight: 700;
  line-height: 23px;
}
.kbf-match__names {
  display: flex;
  align-items: center;
  box-sizing: border-box;
  height: 48px;
  padding-inline: 16px;
  border-bottom: 1px solid var(--krds-color-light-gray-10);
}
.kbf-match__team {
  width: 100px;
  flex-shrink: 0;
  text-align: center;
  color: var(--krds-color-light-gray-80);
  font-size: 15px;
  font-weight: 500;
  line-height: 23px;
}
.kbf-match__score {
  width: 60px;
  flex-shrink: 0;
  text-align: center;
  color: var(--krds-color-light-gray-90);
  font-size: 19px;
  font-weight: 700;
  line-height: 29px;
}

/* 1~5국 — h36 · pi16 · bg gray-5 · 선수 100 · OX 60 gap8 · 구분선 1×12 */
.kbf-match__order {
  display: flex;
  align-items: center;
  box-sizing: border-box;
  height: 36px;
  padding-inline: 16px;
  background-color: var(--krds-color-light-gray-5);
}
.kbf-match__player {
  width: 100px;
  flex-shrink: 0;
  text-align: center;
  color: var(--krds-color-light-gray-50);
  font-size: 15px;
  font-weight: 400;
  line-height: 23px;
}
.kbf-match__ox {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 60px;
  flex-shrink: 0;
  gap: 8px;
}
.kbf-match__mark {
  width: 16px;
  flex-shrink: 0;
  text-align: center;
  color: var(--krds-color-light-gray-50);
  font-size: 15px;
  font-weight: 400;
  line-height: 23px;
}
.kbf-match__bar { width: 1px; height: 12px; flex-shrink: 0; background-color: var(--krds-color-light-gray-20); }

/* 토글 — 시안의 「경기 상세」 자리(h44 · bt1px · primary-60).
   ⚠️ 데스크톱에서는 5국이 항상 보이므로 **토글을 숨긴다**(시안 그대로). */
.kbf-match__toggle {
  display: none;
  align-items: center;
  justify-content: center;
  height: 44px;
  gap: 6px;
  border-top: 1px solid var(--krds-color-light-gray-10);
  color: var(--krds-color-light-primary-60);
  font-size: 15px;
  font-weight: 500;
  line-height: 23px;
  cursor: pointer;
}
.kbf-match__toggle-close { display: none; }

.kbf-match-grid { display: flex; flex-wrap: wrap; gap: 24px; }


/* ── 포스트시즌 단계 흐름 (S36b `HM7-0` 실측) ────────────────────────── */
.kbf-stage-flow { display: flex; align-items: stretch; }
.kbf-stage {
  display: flex;
  flex-direction: column;
  flex-grow: 1;
  min-width: 0;
  border: 1px solid var(--krds-color-light-gray-10);
  border-radius: 8px;
  overflow: clip;
}
.kbf-stage.is-current { border-color: var(--krds-color-light-primary-60); }
.kbf-stage-arrow { display: flex; align-items: center; justify-content: center; width: 24px; flex-shrink: 0; }

.kbf-stage__head {
  display: flex;
  flex-direction: column;
  padding: 14px 16px;
  gap: 2px;
  border-bottom: 1px solid var(--krds-color-light-gray-10);
}
.kbf-stage__meta { display: flex; align-items: center; justify-content: space-between; }
.kbf-stage__no {
  color: var(--krds-color-light-gray-50);
  font-size: 12px;
  font-weight: 500;
  line-height: 20px;
  letter-spacing: 0.08em;
}
.kbf-stage__state {
  color: var(--krds-color-light-gray-50);
  font-size: 13px;
  font-weight: 400;
  line-height: 20px;
}
.kbf-stage__label {
  margin: 0;
  color: var(--krds-color-light-gray-95);
  font-size: 17px;
  font-weight: 700;
  line-height: 26px;
}
.kbf-stage__body { display: flex; flex-direction: column; padding: 16px; gap: 10px; }
.kbf-stage__row { display: flex; align-items: center; justify-content: space-between; }
.kbf-stage__team {
  color: var(--krds-color-light-gray-70);
  font-size: 15px;
  font-weight: 400;
  line-height: 23px;
}
.kbf-stage__score {
  color: var(--krds-color-light-gray-70);
  font-size: 19px;
  font-weight: 400;
  line-height: 29px;
}
.kbf-stage__row.is-win .kbf-stage__team,
.kbf-stage__row.is-win .kbf-stage__score {
  color: var(--krds-color-light-gray-95);
  font-weight: 700;
}
.kbf-stage__foot {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 12px 16px;
  border-top: 1px solid var(--krds-color-light-gray-10);
}
.kbf-stage__date {
  color: var(--krds-color-light-gray-50);
  font-size: 13px;
  font-weight: 400;
  line-height: 20px;
}

/* 모바일 전용 — 단계 탭 · 현재 경기 · 이전 단계 (S54b) */
.kbf-stage-tabs, .kbf-current, .kbf-prev-head, .kbf-prev { display: none; }

/* 단계별 대국 결과 — ⚠️ 시안에 없는 블록(감산 방지). DISPLAY RULE 자리를 쓴다. */
.kbf-stage-matches__head {
  margin: 12px 0 0;
  color: var(--krds-color-light-gray-95);
  font-size: 19px;
  font-weight: 700;
  line-height: 29px;
}
.kbf-stage-matches { display: flex; flex-wrap: wrap; gap: 24px; }
.kbf-stage-matches__item { display: flex; flex-direction: column; gap: 10px; }
.kbf-stage-matches__label {
  margin: 0;
  color: var(--krds-color-light-gray-70);
  font-size: 15px;
  font-weight: 700;
  line-height: 23px;
}


/* ── 묶음 2 · 태블릿 768~1439 ─────────────────────────────────────────── */
@media (min-width: 768px) and (max-width: 1439px) {
  .kbf-filter-bar { height: auto; flex-wrap: wrap; padding: 16px 20px; gap: 12px; }
  .kbf-filter-bar__label--league { padding-left: 0; }
  /* `min-width: 236px` 를 되돌린다 — 236×3 + gap 은 768 에 안 들어간다. */
  .kbf-filter-bar__tab { height: 44px; padding-inline: 14px; font-size: 15px; line-height: 23px; min-width: 0; }
  /* ⚠️ 카드 294 고정이면 LNB 240 을 뺀 본문(실측 416)에 **1장만** 들어가 낭비된다.
     시안 없는 구간이므로 유동화한다 — 하한 260 으로 2열까지 접힌다(D-45-05). */
  .kbf-match-grid, .kbf-stage-matches { gap: 16px; }
  .kbf-match { width: auto; flex: 1 1 260px; min-width: 0; }
  .kbf-stage-matches__item { flex: 1 1 260px; min-width: 0; }
  .kbf-stage-flow { flex-wrap: wrap; gap: 12px; }
  .kbf-stage { flex: 1 1 200px; }
  .kbf-stage-arrow { display: none; }   /* 줄바꿈이 생기면 화살표가 방향을 오도한다 */
}


/* ── 묶음 2 · 모바일 ≤767 (S52b · S54b 실측) ─────────────────────────── */
@media (max-width: 767px) {
  /* 🚨 래퍼까지 숨긴다 — `.kbf-filter-bar` 만 끄면 `.kbf-sub-hero__bar` 의 margin-top 28
     이 남아 Sub Hero 가 151 → **179** 가 된다(실측). 필터바를 감춘 흔적이 높이로 남는 것이다. */
  .kbf-sub-hero__bar { display: none; }   /* 모바일은 Sub Nav 칩이 같은 일을 한다 */
  .kbf-filter-bar { display: none; }

  /* 🚨 **연도 셀렉트만은 되살린다** (KBF-42 4단계 · 사용자 확정 2026-08-24).
     위 주석의 「모바일은 Sub Nav 칩이 같은 일을 한다」는 **연도가 없는 화면에만** 맞는 말이다.
     칩은 화면 이동이지 연도 필터가 아니다. 대진표·결과는 연도가 1차 컨트롤이고,
     **레거시는 모바일에서도 연도 셀렉트를 보여준다**(실측 120×40 · 조작 가능).
     숨기면 D3 기준으로 감산이다.

     ⚠️ `form.kbf-filter-bar` 만 잡는다 — 배선 안 된 화면(순위 등)은 `<span>` 장식이라
        그대로 숨겨진다. 「데이터가 태그를 고른다」가 CSS 에서도 경계가 된다.
     ⚠️ 리그 탭은 계속 숨긴다 — `league_id in (2,3)` 이 0건이고 레거시에 탭 자체가 없다.
     ⚠️ 데스크톱 치수(h129 · pi44 · gap26)를 그대로 두면 Sub Hero 가 151 → **308** 이 된다.
        모바일용으로 줄여 **약 230** 에 맞춘다. 시안에 없는 구간이라 우리가 정의한다. */
  .kbf-sub-hero:has(form.kbf-filter-bar) .kbf-sub-hero__bar { display: block; margin-top: 14px; }
  form.kbf-filter-bar {
    display: flex;
    height: auto;
    padding: 10px 12px;
    gap: 10px;
    border-radius: 8px;
  }
  form.kbf-filter-bar .kbf-filter-bar__label { font-size: 15px; line-height: 23px; }
  form.kbf-filter-bar .kbf-filter-bar__select { width: auto; flex: 1 1 0; min-width: 0; height: 44px; }
  form.kbf-filter-bar .kbf-filter-bar__label--league,
  form.kbf-filter-bar .kbf-filter-bar__tabs { display: none; }

  /* ── 리그 선택 바 · 모바일 (KBF-80 · S46b·S47b·S48b 실측) ──────────────
     🚨 **이 바는 그냥 두면 390px 에서 사라진다. 끄는 규칙이 둘이다.**
       ① `.kbf-sub-hero__bar { display: none }`  래퍼를 끈다
       ② `.kbf-filter-bar { display: none }`     바 자체를 끈다
     둘 다 되켜야 한다. `form.kbf-filter-bar` 변형은 `:has(form…)` 로 ①을,
     `display: flex` **재선언**으로 ②를 되켠다 — 이 바도 똑같이 해야 한다.
     이 바는 `<form>` 이 아니라서(시즌 셀렉트가 없어 제출할 것이 없다) 그 규칙에 안 걸린다.

     🚨🚨 **`display` 를 빼먹으면 높이 0 으로 조용히 죽는다** — 실측으로 겪었다.
        `height: auto` 만 얹었더니 특이도가 같아 뒤에 온 내 규칙이 이겼는데도
        **선언하지 않은 `display` 는 ②가 그대로 이겨** 바가 `display:none` 이었다.
        래퍼만 켜져 Sub Hero 가 151 → **165**(=151+margin 14)가 됐고, 화면에는
        아무것도 안 보였다. ⇒ **덮어쓸 때는 「이겨야 할 셀렉터」가 아니라
        「그 셀렉터가 켠 속성」을 본다.** 안 쓴 속성은 이길 것이 없다(`D-41-01` 계열).

     ⚠️ 줄 번호로 가리키지 않는다 — 이 파일은 위쪽에 규칙이 추가되면 번호가 밀린다.

     리그소개는 이 바가 **유일한 리그 이동 수단**이라 숨기면 모바일 사용자는
     리그를 바꿀 방법이 없다.
     🚨 활성 칩이 `--kbf-accent-active`(#0036A5)인데 Sub Hero 가 `#011F51` 이라
        **남색 위의 남색**이 된다. 회색 바탕(`.kbf-filter-bar` 의 gray-5)이 그 사이를
        받쳐야 선택 상태가 보인다 — 작도에서 배경을 빼 봤다가 실제로 안 보였다.
        ⇒ **대비는 색의 속성이 아니라 색과 배경의 관계다.** 배경이 바뀌면 다시 잰다. */
  .kbf-sub-hero:has(.kbf-filter-bar--league) .kbf-sub-hero__bar { display: block; margin-top: 14px; }
  .kbf-filter-bar--league {
    display: flex;   /* ← ②를 되켠다. 이 한 줄이 없으면 위 주석의 「높이 0」이 난다 */
    align-items: center;
    height: auto;
    padding: 10px 12px;
    gap: 10px;
    border-radius: 8px;
  }
  /* 라벨을 뺀다 — 350 에서 자리를 73px 먹는데, 칩이 리그 이름을 이미 말한다. */
  .kbf-filter-bar--league .kbf-filter-bar__label--league { display: none; }
  .kbf-filter-bar--league .kbf-filter-bar__tab {
    height: 44px;
    padding-inline: 14px;
    font-size: 15px;
    line-height: 23px;
    min-width: 0;   /* 236×3 = 708 은 350 에 못 들어간다 */
  }
  /* 정식명칭 3개는 350 에 안 들어간다. 약칭 3개는 295 로 들어간다(실측 여유 55). */
  .kbf-filter-bar--league .kbf-filter-bar__tab-full { display: none; }
  .kbf-filter-bar--league .kbf-filter-bar__tab-short { display: inline; }

  /* ── 팀소개 필터 바 · 모바일 (KBF-96 2단계 · S31bm 실측) ────────────────
     카드를 벗고 [리그 칩 스트립] + [시즌 104 · 팀 셀렉트 남는 폭] **2줄**로 만든다.

     🚨 **재점등 쌍을 새로 만들지 않는다.** 팀 바는 `<form class="kbf-filter-bar …">` 라
        위 `:has(form.kbf-filter-bar)` 와 `form.kbf-filter-bar { display:flex }` 에
        **이미 걸린다.** 여기서 할 일은 그 둘이 켠 값을 덮는 것뿐이다.

     🚨 **특이도가 `--league` 와 다르다.** 저쪽은 `<div>` 라 `.kbf-filter-bar--league`
        (0,1,0)로 충분했지만, 팀은 `form.kbf-filter-bar .X`(0,2,1)을 이겨야 한다.
        그래서 모든 셀렉터에 `form` 을 붙인다. 클래스만 쓰면 **순서로도 못 이긴다**
        (`D-41-01` 계열 — 한 속성을 바꾸면 그 전제를 받치던 속성도 함께 봐야 한다). */
  form.kbf-filter-bar--team {
    flex-wrap: wrap;
    gap: 8px;
    /* 좌우는 `.kbf-sub-hero__bar` 의 margin-inline(= --kbf-gutter 20)이 이미 맡는다.
       여기서 gutter 를 또 주면 40 이 되어 바 왼쪽이 제목 왼쪽과 어긋난다
       (`sub-hero-unify.mjs` 의 `barLeft === textLeft` 가 그것을 잡는다). */
    padding: 0;
    background-color: transparent;
    border: 0;
    border-radius: 0;
  }
  form.kbf-filter-bar--team .kbf-filter-bar__label,
  form.kbf-filter-bar--team .kbf-filter-bar__label--league { display: none; }

  /* Sub Nav 칩 스트립 — 시안은 필터 바 **위** 별도 줄이다. order 로 끌어올린다.
     🚨 `display: flex` 가 **필수다.** 위 `form.kbf-filter-bar .kbf-filter-bar__tabs`
        가 `display: none` 인데 `order`·`width` 만 쓰면 그 선언을 건드리지 못해
        **리그 칩이 통째로 사라진다.** 팀소개 모바일에서 칩은 유일한 리그 표시다.
        이 파일 위쪽 「`display` 를 빼먹으면 높이 0 으로 조용히 죽는다」와 같은 사고다. */
  form.kbf-filter-bar--team .kbf-filter-bar__tabs {
    display: flex;
    order: -1;
    width: 100%;
    gap: 8px;
    /* 🚨 칩 3개(391)가 350 에 안 들어간다 — 「준비중」 배지 두 개가 폭을 먹기 때문이다.
       리그소개 칩(`--league`)은 배지가 없어 291 로 들어간다(그래서 그쪽엔 이 줄이 없다).
       ⇒ **가로로 연다.** `body { overflow-x: hidden }` 이라 그냥 두면 스크롤이 아니라
         **영구 잘림**이 되어 세 번째 리그를 아예 못 본다 — `D-45-01` 이 *"「가로 스크롤」이
         아니라 영구 잘림이었다 … 밀 수 없다 … 스크롤보다 나쁘다"* 라고 기록한 그 상태다.
       ⭐ 같은 파일의 모바일 브레드크럼이 쓰는 기법 그대로다(`overflow-x:auto` + 자식 `flex-shrink:0`).
       ⚠️ 이식 전에도 넘쳤다(실측 404 > 390). 통합이 만든 결함이 아니라 **드러낸** 결함이다. */
    overflow-x: auto;
  }
  form.kbf-filter-bar--team .kbf-filter-bar__tab {
    flex-shrink: 0;          /* 위 overflow-x 와 한 세트다 — 줄어들면 스크롤이 생기지 않는다 */
    min-width: 0;            /* 데스크톱 236×3 은 350 에 안 들어간다 */
    height: 40px;
    padding-inline: 16px;
    border-radius: 20px;     /* 칩 */
    font-size: 15px;
    line-height: 23px;
  }
  form.kbf-filter-bar--team .kbf-filter-bar__tab-full  { display: none; }
  form.kbf-filter-bar--team .kbf-filter-bar__tab-short { display: inline; }

  /* 시즌은 104 고정, 팀은 남는 폭 전부.
     🚨 위 `form.kbf-filter-bar .kbf-filter-bar__select` 가 **단축형** `flex: 1 1 0` 이라
        `width: 104px` 만으로는 늘어남을 못 막는다. 단축형은 단축형으로 덮는다. */
  form.kbf-filter-bar--team .kbf-filter-bar__select {
    flex: 0 0 104px;
    width: 104px;
    height: 40px;
    padding-inline: 12px;
    border-radius: var(--kbf-radius-chip);
    font-size: 13px;
    line-height: 20px;
  }
  /* 🚨 **이 규칙은 반드시 바로 위 `__select` 뒤에 온다.** 특이도가 같아 순서로만
     갈리는데, 앞에 두면 `flex: 0 0 104px` 가 이겨 팀 이름이 104px 에 잘린다.
     그런데 폭이 0 은 아니라서 `select-chevron.mjs` 도 `team-roster.mjs` 도
     **통과한다** — 스크린샷으로만 보이는 결함이 된다. */
  form.kbf-filter-bar--team .kbf-filter-bar__select--team {
    display: flex;
    flex: 1 1 0;
    width: auto;
    min-width: 0;
  }

  /* 준비중 — 모바일은 화면이 짧아 여백을 줄이고 글자를 한 단 내린다(S48c 실측). */
  .kbf-empty-league { padding-block: 72px; gap: 6px; }
  .kbf-empty-league__tit { font-size: 17px; line-height: 26px; }
  .kbf-empty-league__desc { font-size: 15px; line-height: 23px; }

  /* 라운드 탭 — 350 · gap 6 · 탭 flexGrow h40 radius4
     비활성 bg gray-5 + 13/20/400 gray-70 / 활성 bg gray-95 + 13/20/700 흰글씨 */
  .kbf-round-tabs { display: flex; gap: 6px; }
  .kbf-round-tab {
    display: flex;
    align-items: center;
    justify-content: center;
    flex: 1 1 0;
    min-width: 0;
    height: 40px;
    border-radius: 4px;
    background-color: var(--krds-color-light-gray-5);
    color: var(--krds-color-light-gray-70);
    font-size: 13px;
    font-weight: 400;
    line-height: 20px;
  }
  .kbf-round-tab.is-active {
    background-color: var(--krds-color-light-gray-95);
    color: var(--krds-color-light-gray-0);
    font-weight: 700;
  }

  /* Summary — space-between · 15/23/700 gray-90 + 13/20/400 gray-50 */
  .kbf-round-summary { display: flex; align-items: center; justify-content: space-between; }
  .kbf-round-summary__label {
    color: var(--krds-color-light-gray-90);
    font-size: 15px;
    font-weight: 700;
    line-height: 23px;
  }
  .kbf-round-summary__date {
    color: var(--krds-color-light-gray-50);
    font-size: 13px;
    font-weight: 400;
    line-height: 20px;
  }
  /* 🚨 **M3-나 — 모바일에도 회차 헤더를 노출한다**(사용자 확정 2026-08-24).
     원래 「라운드 탭 + Summary 가 같은 정보를 담는다」고 껐는데, 그건 **한 회차만 그릴 때**
     맞는 말이었다. M3-가로 **연도 전체**를 쌓으면 66~171 카드에 회차 구분이 하나도 없어진다.
     ⇒ 헤더를 되살려 그룹 경계를 만든다. 데스크톱 43 → 모바일은 치수를 줄인다.
     ⚠️ Summary 는 계속 쓴다 — 헤더가 「11회차」, Summary 가 「11회차 · 6경기 / 12.19」로
        역할이 갈린다. 둘을 합치면 한 줄이 길어져 390 에서 넘친다. */
  .kbf-round-head {
    padding-bottom: 8px;
    gap: 8px;
    border-bottom-width: 2px;
  }
  .kbf-round-head__title { font-size: 17px; line-height: 26px; }
  .kbf-round-head__meta { font-size: 13px; line-height: 20px; }

  /* 경기 카드 — 350 · radius4 · border gray-20 · Status Bar h4 · Body padding 6/12
     🚨 여기서 5국이 **접힌다.** 레거시는 가로 스크롤로 보여줬고 우리는 접기로 바꾼다 —
        정보는 그대로다(S24 계약). 시안은 `›` 로 경기상세(2차)에 미뤘으나 그건 감산이 된다. */
  .kbf-match {
    width: auto;
    border-color: var(--krds-color-light-gray-20);
    border-radius: 4px;
  }
  .kbf-match::before {                  /* Status Bar 4px — 확정 상태색 */
    content: "";
    display: block;
    height: 4px;
    background-color: var(--color-public-success, #147D50);
  }
  .kbf-match__summary { padding: 6px 12px; cursor: pointer; }
  .kbf-match__time {
    height: auto;
    justify-content: flex-start;
    background: none;
    color: var(--krds-color-light-gray-50);
    font-size: 13px;
    font-weight: 400;
    line-height: 20px;
  }
  .kbf-match__emblems { display: none; }   /* 390 에서는 엠블럼이 자리를 못 낸다(시안도 없다) */
  .kbf-match__names {
    height: auto;
    padding: 0;
    gap: 8px;
    border-bottom: 0;
  }
  .kbf-match__team {
    width: auto;
    flex: 1 1 0;
    min-width: 0;
    text-align: left;
    color: var(--krds-color-light-gray-90);
    font-size: 15px;
    line-height: 24px;
  }
  .kbf-match__score {
    width: auto;
    flex-shrink: 0;
    color: var(--krds-color-light-gray-90);
    font-size: 15px;
    font-weight: 700;
    line-height: 24px;
  }
  .kbf-match__toggle { display: flex; height: 36px; margin-top: 6px; }
  .kbf-match[open] .kbf-match__toggle-open  { display: none; }
  .kbf-match[open] .kbf-match__toggle-close { display: inline; }
  .kbf-match[open] .kbf-match__toggle svg   { transform: rotate(180deg); }
  .kbf-match__order { padding-inline: 12px; }
  .kbf-match__player { width: auto; flex: 1 1 0; min-width: 0; }
  .kbf-match__player:last-child { text-align: right; }
  .kbf-match-grid { flex-direction: column; gap: 8px; }

  /* ── 포스트시즌 모바일 ── */
  .kbf-stage-flow { display: none; }    /* 단계 탭 + 현재 경기가 대신한다(S54b) */

  .kbf-stage-tabs { display: flex; gap: 6px; }
  .kbf-stage-tab {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    flex: 1 1 0;
    min-width: 0;
    padding-block: 8px;
    border-radius: 4px;
    background-color: var(--krds-color-light-gray-5);
  }
  .kbf-stage-tab__label { color: var(--krds-color-light-gray-70); font-size: 13px; font-weight: 400; line-height: 20px; }
  .kbf-stage-tab__state { color: var(--krds-color-light-gray-50); font-size: 12px; font-weight: 400; line-height: 16px; }
  .kbf-stage-tab.is-active { background-color: var(--krds-color-light-gray-95); }
  .kbf-stage-tab.is-active .kbf-stage-tab__label { color: var(--krds-color-light-gray-0); font-weight: 700; }
  .kbf-stage-tab.is-active .kbf-stage-tab__state { color: var(--kbf-broadcast); }

  /* 현재 경기 — padding 8/16 · radius4 · bg gray-95(검정) */
  .kbf-current {
    display: flex;
    flex-direction: column;
    padding: 8px 16px;
    border-radius: 4px;
    background-color: var(--krds-color-light-gray-95);
  }
  .kbf-current__head { display: flex; align-items: center; justify-content: space-between; }
  .kbf-current__series { color: var(--krds-color-light-gray-40); font-size: 12px; font-weight: 500; line-height: 20px; letter-spacing: 0.08em; }
  .kbf-current__game   { color: var(--krds-color-light-gray-0);  font-size: 12px; font-weight: 700; line-height: 20px; letter-spacing: 0.08em; }
  .kbf-current__row    { display: flex; align-items: center; justify-content: space-between; }
  .kbf-current__team   { color: var(--krds-color-light-gray-40); font-size: 17px; font-weight: 400; line-height: 30px; }
  .kbf-current__score  { color: var(--krds-color-light-gray-40); font-size: 24px; font-weight: 400; line-height: 30px; }
  .kbf-current__row.is-win .kbf-current__team,
  .kbf-current__row.is-win .kbf-current__score { color: var(--krds-color-light-gray-0); font-weight: 700; }
  .kbf-current__foot   { display: flex; align-items: center; justify-content: space-between; padding-top: 2px; }
  .kbf-current__note   { color: var(--krds-color-light-gray-40); font-size: 13px; font-weight: 400; line-height: 20px; }

  /* 이전 단계 — Row padding-block 8 · gap 8 · bb 1px gray-10 */
  .kbf-prev-head {
    display: block;
    margin: 0;
    color: var(--krds-color-light-gray-90);
    font-size: 15px;
    font-weight: 700;
    line-height: 23px;
  }
  .kbf-prev { display: flex; flex-direction: column; }
  .kbf-prev__row {
    display: flex;
    align-items: center;
    padding-block: 8px;
    gap: 8px;
    border-bottom: 1px solid var(--krds-color-light-gray-10);
  }
  .kbf-prev__stage  { flex-shrink: 0; color: var(--krds-color-light-gray-50); font-size: 13px; font-weight: 700; line-height: 20px; }
  .kbf-prev__result { color: var(--krds-color-light-gray-70); font-size: 13px; font-weight: 400; line-height: 20px; }

  .kbf-stage-matches { flex-direction: column; gap: 12px; }
  .kbf-stage-matches__head { font-size: 15px; line-height: 23px; }
}


/* ============================================================================
   화면별 — 묶음 3 기록실
   ⭐ 표는 `.kbf-table`(일정표에서 만든 것)을 그대로 쓴다. 시안 실측이 같은 규격이다
      — Head 56 · Row 65/64 · border-top 2px gray-95. 열폭만 화면별로 준다.
   ========================================================================= */

/* 팀순위 — ~~8열 (S37b `HTQ-0` 실측) 64·310·72·72·96·96·100·80 = 890 (930 − pi 20×2)~~
   ⇒ **6열** (`KBF-90`) — 64 · 팀명 flex · 72 · 72 · 96 · 96 = 400 + 팀명
   ⭐ **왜 팀명을 고정폭으로 안 주나** — 「상태」100 과 「상세」80 이 빠져 180 이 남는데,
      그 숫자를 팀명에 더해 적으면 나중에 열이 또 바뀔 때 다시 계산해야 한다.
      `flex:1` 은 남는 것을 스스로 먹는다 — 공지 제목 열이 이미 쓰던 방식이다. */
.kbf-table--rank-team .kbf-table__cell--0 { width: 64px;  flex-shrink: 0; }
.kbf-table--rank-team .kbf-table__cell--1 { flex: 1 1 0;  min-width: 0; }
.kbf-table--rank-team .kbf-table__cell--2,
.kbf-table--rank-team .kbf-table__cell--3 { width: 72px;  flex-shrink: 0; }
.kbf-table--rank-team .kbf-table__cell--4,
.kbf-table--rank-team .kbf-table__cell--5 { width: 96px;  flex-shrink: 0; }

/* 개인순위 — ~~7열 (S38b `I0K-0` 실측) 64·306·200·72·72·96·80 = 890~~
   ⇒ **6열** (`KBF-90`) — 64 · 선수 flex · 200 · 72 · 72 · 96 = 504 + 선수
   🚨 **없앤 `cell--6` 이 무엇이었나** — 「경력」의 `보기 →` 이고, 그 규칙은
      `color: gray-50` 에 「목적지가 없어 링크가 아니다(D-36-11)」는 주석을 달고 있었다.
      그 주석이 **낡은 것이었다** — `D-54-05` 가 그 셀을 모달 버튼으로 바꿨는데 CSS 는
      회색으로 남아, **눌리는데 비활성처럼 보이는** 상태가 이어졌다.
      트리거를 선수명으로 옮기며 함께 없앴다.
   ⚠️ 위 문장에 `/`+`*` 짝을 다시 넣지 말 것 — CSS 주석은 **중첩되지 않아** 바깥 주석이
      거기서 끝나 버리고, 바로 아래 `cell--0` 규칙이 통째로 죽는다(2026-09-06 실제 사고). */
.kbf-table--rank-person .kbf-table__cell--0 { width: 64px;  flex-shrink: 0; }
.kbf-table--rank-person .kbf-table__cell--1 { flex: 1 1 0;  min-width: 0; }
.kbf-table--rank-person .kbf-table__cell--2 { width: 200px; flex-shrink: 0; }
.kbf-table--rank-person .kbf-table__cell--3,
.kbf-table--rank-person .kbf-table__cell--4 { width: 72px;  flex-shrink: 0; }
.kbf-table--rank-person .kbf-table__cell--5 { width: 96px;  flex-shrink: 0; }
.kbf-table__link {
  color: var(--krds-color-light-primary-60);
  font-size: 15px;
  font-weight: 500;
  line-height: 26px;
  text-decoration: none;
}

/* ── 표 안에서 이름을 누르는 자리 (`KBF-90`) ──────────────────────────────
   팀명 → 팀소개 · 선수명 → 선수 모달 · 공지 제목 → 상세.
   ⭐ **왜 링크색을 주지 않나** — 표의 **모든 행**에서 이름 열이 파래지면 시선이
      그쪽으로만 쏠려 순위표가 읽히지 않는다. 공지 제목 링크가 원래 쓰던 규칙
      (평소 본문색 · 올렸을 때만 밑줄)을 세 곳이 함께 쓴다(사용자 결정 2026-09-06).
   ⚠️ `text-align: left` 가 필요한 이유 — 선수명은 `<button>` 이고 브라우저 기본이
      **가운데 정렬**이라, 안 주면 그 열만 다른 행과 어긋난다. */
.kbf-table--rank-team .kbf-table__cell-link,
.kbf-table--rank-person .kbf-table__cell--1.open-modal,
.kbf-table--notice .kbf-table__cell--1 a {
  color: inherit;
  text-align: left;
  text-decoration: none;
  cursor: pointer;
}
.kbf-table--rank-team .kbf-table__cell-link:hover,
.kbf-table--rank-team .kbf-table__cell-link:focus-visible,
.kbf-table--rank-person .kbf-table__cell--1.open-modal:hover,
.kbf-table--rank-person .kbf-table__cell--1.open-modal:focus-visible,
.kbf-table--notice .kbf-table__cell--1 a:hover,
.kbf-table--notice .kbf-table__cell--1 a:focus-visible { text-decoration: underline; }

/* 부문 섹션 (S38b `I0H-0` 실측) — gap 12 · 섹션 간 gap 40 · 제목 28/42/700 -0.02em */
.kbf-rank-section { display: flex; flex-direction: column; gap: 12px; }
.kbf-rank-section--sub { margin-top: 28px; }   /* Main Content gap 20 + 28 = 48 ≈ 시안 40 계열 */
.kbf-rank-section__title {
  margin: 0;
  color: var(--krds-color-light-gray-90);
  font-size: 28px;
  font-weight: 700;
  line-height: 42px;
  letter-spacing: -0.02em;
}

/* 각주 (S37b `HVA-0` 실측) — padding 16/20 · radius 4 · gap 4 · bg gray-5 */
.kbf-rank-note {
  display: flex;
  flex-direction: column;
  box-sizing: border-box;
  padding: 16px 20px;
  gap: 4px;
  border-radius: 4px;
  background-color: var(--krds-color-light-gray-5);
}
.kbf-rank-note__line {
  margin: 0;
  color: var(--krds-color-light-gray-70);
  font-size: 15px;
  font-weight: 400;
  line-height: 23px;
}
.kbf-rank-note__line--mobile { display: none; }

/* 모바일 전용 — 필터바 · 순위 목록 · 부문 탭 · TOP PLAYER 배너 */
.kbf-rank-filter, .kbf-rank-list, .kbf-group-tabs, .kbf-sub-hero__variant { display: none; }


/* ── 묶음 3 · 태블릿 768~1439 ─────────────────────────────────────────── */
@media (min-width: 768px) and (max-width: 1439px) {
  /* ~~8열/7열~~ **6열**이 464 폭에 안 들어간다. 가로 스크롤을 허용한다.
     ⚠️ 표는 잘라내지 않는다 — 셀이 사라지면 정보 손실이다(D-45-03).
     ⭐ `KBF-90` 으로 최소폭이 줄었다 — 890 → 640(팀순위) · 664(개인순위).
        ⚠️ **스크롤이 없어지지는 않는다.** 이 뷰포트에서 표가 쓰는 그릇은 실측 **414px**
           이라 6열은 어차피 안 들어간다. 줄어드는 것은 **미는 거리**다. */
  .kbf-table--rank-team, .kbf-table--rank-person { overflow-x: auto; }
  /* 🔑 **최소폭을 없애면 안 된다.** 이름 열이 `flex: 1 1 0; min-width: 0` 이라 그릇이
     좁아지면 **0px 까지 짜부라진다** — 2026-09-06 실측에서 팀명 칸이 실제로 0 이 됐다.
     그것이 `D-45-03` 이 말한 「셀이 사라지면 정보 손실」이다.
     ⇒ 고정폭 합 + 이름이 읽힐 만큼을 최소폭으로 준다. 남는 것은 가로 스크롤이고
       그것은 **의도된 동작**이다(표를 잘라내지 않는다). */
  /* ⚠️ `min-width` 에는 **행의 좌우 padding 40 이 포함된다**(`box-sizing: border-box`).
     빼먹으면 이름 칸이 계산보다 40px 좁아진다 — 2026-09-06 실측에서 120 을 의도한 칸이
     80px 로 나왔다. 아래 값은 전부 `고정폭 합 + 이름 최소 + 40` 이다. */
  .kbf-table--rank-team .kbf-table__head,
  .kbf-table--rank-team .kbf-table__row { min-width: 640px; }   /* 400 + 팀명 200 + 40 */
  .kbf-table--rank-person .kbf-table__head,
  .kbf-table--rank-person .kbf-table__row { min-width: 664px; } /* 504 + 선수 120 + 40 */
  .kbf-rank-section__title { font-size: 22px; line-height: 34px; }
}


/* ── 묶음 3 · 모바일 ≤767 (S55b · S56b 실측) ─────────────────────────── */
@media (max-width: 767px) {
  .kbf-table--rank-team, .kbf-table--rank-person { display: none; }   /* 목록이 대신한다 */
  .kbf-rank-section__title { display: none; }                          /* 부문 탭이 대신한다 */
  .kbf-rank-section--sub  { display: none; }                           /* 탭 1개만 보인다 */
  .kbf-rank-section { gap: 0; }

  /* 필터바 — S55b(K5A-0) 실측 350×40 · 셀렉트 104 + 238 */
  .kbf-rank-filter { display: flex; gap: 8px; }
  .kbf-rank-filter__select {
    display: flex;
    align-items: center;
    justify-content: space-between;
    box-sizing: border-box;
    flex: 1 1 0;
    min-width: 0;
    height: 40px;
    padding-inline: 12px;
    border: 1px solid var(--krds-color-light-gray-20);
    border-radius: 4px;
    background-color: var(--krds-color-light-gray-0);
    color: var(--krds-color-light-gray-70);
    font-size: 14px;
    line-height: 21px;
  }
  .kbf-rank-filter__select--season { flex: 0 0 104px; }

  /* 순위 목록 — S55b(K5I-0) 실측 · 순위 24 · 텍스트 222 · 상태 52 · › */
  .kbf-rank-list { display: flex; flex-direction: column; }
  .kbf-rank-row {
    display: flex;
    align-items: center;
    gap: 8px;
    padding-block: 8px;
    border-bottom: 1px solid var(--krds-color-light-gray-10);
    text-decoration: none;
  }
  .kbf-rank-row__no {
    width: 24px;
    flex-shrink: 0;
    color: var(--krds-color-light-gray-90);
    font-size: 17px;
    font-weight: 700;
    line-height: 26px;
  }
  .kbf-rank-row__text { display: flex; flex-direction: column; flex: 1 1 0; min-width: 0; }
  .kbf-rank-row__name {
    color: var(--krds-color-light-gray-90);
    font-size: 15px;
    font-weight: 500;
    line-height: 23px;
  }
  .kbf-rank-row__meta {
    color: var(--krds-color-light-gray-50);
    font-size: 13px;
    font-weight: 400;
    line-height: 20px;
  }
  /* 「동률 검토」 배지는 `KBF-90` 에서 없앴다 — 데스크톱 「상태」 열과 같은 값이라
     한쪽만 남기면 기기에 따라 정보가 달라진다(사용자 결정 2026-09-06).
     ⚠️ 동률 자체는 남아 있고 **순위 숫자가 같은 것**으로 드러난다. */
  .kbf-rank-row__arrow { flex-shrink: 0; color: var(--krds-color-light-gray-40); font-size: 17px; line-height: 26px; }

  /* 부문 탭 — S56b(K9K-0) 실측 350×40 */
  .kbf-group-tabs { display: flex; gap: 6px; }
  .kbf-group-tab {
    display: flex;
    align-items: center;
    justify-content: center;
    flex: 1 1 0;
    min-width: 0;
    height: 40px;
    border-radius: 4px;
    background-color: var(--krds-color-light-gray-5);
    color: var(--krds-color-light-gray-70);
    font-size: 13px;
    font-weight: 400;
    line-height: 20px;
  }
  .kbf-group-tab.is-active {
    background-color: var(--krds-color-light-gray-95);
    color: var(--krds-color-light-gray-0);
    font-weight: 700;
  }

  /* TOP PLAYER 배너 — S56b(K8I-0) 실측. Title·Lead 를 대신한다. */
  .kbf-sub-hero__variant { display: block; }
  .kbf-sub-hero__variant ~ .kbf-sub-hero__title,
  .kbf-sub-hero__variant ~ .kbf-sub-hero__lead { display: none; }
  /* ⚠️ 변형 Sub Hero 는 **gap 8** 을 쓴다(K8I-0 실측). 일반 Sub Hero 는 margin 기반이라
     여기서만 gap 을 켠다. 162 = 16 + 20 + 8 + 20 + 8 + 34 + 8 + 20 + 28 ✓ */
  .kbf-sub-hero__variant { display: flex; flex-direction: column; gap: 8px; margin-top: 8px; }
  .kbf-top-player__eyebrow {
    margin: 0;
    color: var(--kbf-subhero-text);
    font-size: 12px;
    font-weight: 500;
    line-height: 20px;
    letter-spacing: 0.08em;
  }
  /* 이름과 기록은 **space-between**, 기록 안은 baseline gap 8 (K9D-0 · K9F-0 실측) */
  .kbf-top-player__row { display: flex; align-items: flex-end; justify-content: space-between; }
  .kbf-top-player__name {
    color: var(--krds-color-light-gray-0);
    font-size: 24px;
    font-weight: 700;
    line-height: 34px;
  }
  .kbf-top-player__record { display: flex; align-items: baseline; gap: 8px; }
  .kbf-top-player__score  { color: var(--krds-color-light-gray-0); font-size: 17px; font-weight: 700; line-height: 26px; }
  .kbf-top-player__pct    { color: var(--kbf-subhero-text); font-size: 15px; font-weight: 400; line-height: 23px; }
  .kbf-top-player__context {
    margin: 0;
    color: var(--kbf-subhero-text);
    font-size: 13px;
    font-weight: 400;
    line-height: 20px;
  }

  /* 각주 — 모바일은 짧은 한 줄만 */
  .kbf-rank-note__line { display: none; }
  .kbf-rank-note__line--mobile {
    display: block;
    color: var(--krds-color-light-gray-50);
    font-size: 13px;
    line-height: 20px;
  }
  .kbf-rank-note { padding: 12px 14px; }
}


/* ============================================================================
   화면별 — 묶음 4 뉴스/공지
   ========================================================================= */

/* ── Hero 변형 B · Search Bar (S25b `FQV-0` 실측) — 129 · pi44 · radius10 · gap 16 ── */
.kbf-search-bar {
  display: flex;
  align-items: center;
  box-sizing: border-box;
  height: 129px;
  padding-inline: 44px;
  gap: 16px;
  border: 1px solid var(--krds-color-light-gray-10);
  border-radius: 10px;
  background-color: var(--kbf-surface-head);   /* KBF-96 1단계 — 필터바와 같은 흰 카드 */
}
.kbf-search-bar__select {
  display: flex;
  align-items: center;
  justify-content: space-between;
  box-sizing: border-box;
  width: 168px;
  height: 52px;
  flex-shrink: 0;
  padding-inline: 16px;
  border: 1px solid var(--krds-color-light-gray-20);
  border-radius: 6px;
  background-color: var(--krds-color-light-gray-0);
  color: var(--krds-color-light-gray-95);
  font-size: 17px;
  line-height: 26px;
}
.kbf-search-bar__input {
  display: flex;
  align-items: center;
  box-sizing: border-box;
  flex: 1 1 0;
  min-width: 0;
  height: 52px;
  padding-inline: 16px;
  border: 1px solid var(--krds-color-light-gray-20);
  border-radius: 6px;
  background-color: var(--krds-color-light-gray-0);
  color: var(--krds-color-light-gray-40);
  font-size: 17px;
  line-height: 26px;
}
.kbf-search-bar__btn {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 132px;
  height: 52px;
  flex-shrink: 0;
  gap: 8px;
  border-radius: 6px;
  background-color: var(--krds-color-light-primary-60);
  color: var(--krds-color-light-gray-0);
  font-size: 17px;
  font-weight: 700;
  line-height: 26px;
}

/* ── 소식 카드 (S39b `GOB-0` 실측) — pb 24 · gap 30 · bb 1px gray-10 ────── */
.kbf-news-list { display: flex; flex-direction: column; }
.kbf-news-card {
  display: flex;
  padding-block: 24px;
  gap: 30px;
  border-bottom: 1px solid var(--krds-color-light-gray-10);
}
.kbf-news-card__thumb {
  width: 200px;
  height: 125px;
  flex-shrink: 0;
  border-radius: 4px;
  background-color: var(--krds-color-light-gray-10);
}
.kbf-news-card__text { display: flex; flex-direction: column; flex: 1 1 0; min-width: 0; gap: 8px; }
.kbf-news-card__title {
  margin: 0;
  color: var(--krds-color-light-gray-90);
  font-size: 17px;
  font-weight: 700;
  line-height: 26px;
}
.kbf-news-card__summary {
  margin: 0;
  color: var(--krds-color-light-gray-70);
  font-size: 17px;
  font-weight: 400;
  line-height: 26px;
}
.kbf-news-card__meta {
  display: flex;
  align-items: center;
  margin: 0;
  gap: 8px;
  color: var(--krds-color-light-gray-50);
  font-size: 15px;
  font-weight: 400;
  line-height: 23px;
}
.kbf-news-card__bar { width: 1px; height: 12px; flex-shrink: 0; background-color: var(--krds-color-light-gray-20); }

/* ── 공지 ~~5열~~ **4열** 표 (결정 G3 — S41b 표 규칙 승계) ────────────────────
   `KBF-90` 이 「글쓴이」(90px)를 없애며 인덱스가 하나씩 당겨졌다 —
   제목 `--2`→`--1` · 작성일 `--3`→`--2` · 조회 `--4`→`--3`.
   제목이 이미 `flex:1` 이라 빠진 90px 을 **자동으로** 먹는다. */
.kbf-table--notice .kbf-table__cell--0 { width: 80px;  flex-shrink: 0; }
.kbf-table--notice .kbf-table__cell--1 { flex: 1 1 0;  min-width: 0; }
.kbf-table--notice .kbf-table__cell--2 { width: 140px; flex-shrink: 0; text-align: right; font-size: 15px; }
.kbf-table--notice .kbf-table__cell--3 { width: 100px; flex-shrink: 0; text-align: right; font-size: 15px; }

/* ── 페이저 (S39b `GPC-0` 실측) — 48×48 · gap 8 · pt 12 ────────────────── */
.kbf-pager {
  display: flex;
  align-items: center;
  justify-content: center;
  padding-top: 12px;
  gap: 8px;
}
.kbf-pager--mobile { display: none; }
.kbf-pager__link,
.kbf-pager__navi,
.kbf-pager__dot {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 48px;
  height: 48px;
  flex-shrink: 0;
  border-radius: 4px;
  color: var(--krds-color-light-gray-95);
  font-size: 17px;
  font-weight: 400;
  line-height: 26px;
}
.kbf-pager__navi { border: 1px solid var(--krds-color-light-gray-20); }
.kbf-pager__dot  { color: var(--krds-color-light-gray-40); }
.kbf-pager__link.is-active {
  background-color: var(--krds-color-light-primary-60);
  color: var(--krds-color-light-gray-0);
  font-weight: 700;
}

/* 모바일 전용 검색바 · 공지 목록 */
.kbf-msearch, .kbf-notice-list { display: none; }


/* ── 묶음 4 · 태블릿 768~1439 ─────────────────────────────────────────── */
@media (min-width: 768px) and (max-width: 1439px) {
  .kbf-search-bar { height: auto; flex-wrap: wrap; padding: 16px 20px; gap: 10px; }
  .kbf-search-bar__input { flex: 1 1 200px; }
  .kbf-search-bar__btn   { width: 100px; }
  .kbf-news-card { gap: 16px; padding-block: 16px; }
  .kbf-news-card__thumb { width: 140px; height: 88px; }
  .kbf-table--notice { overflow-x: auto; }
  /* `KBF-90` — 글쓴이 90px 이 빠져 700 → 610 이다. */
  .kbf-table--notice .kbf-table__head,
  .kbf-table--notice .kbf-table__row { min-width: 610px; }  /* 320 + 제목 250 + padding 40 */
}


/* ── 묶음 4 · 모바일 ≤767 (S57b 실측) ───────────────────────────────── */
@media (max-width: 767px) {
  .kbf-search-bar { display: none; }

  /* 검색바 — S57b(JMD-0) 실측 350×48 · Input flexGrow + Button 48 */
  .kbf-msearch { display: flex; gap: 8px; }
  .kbf-msearch__input {
    display: flex;
    align-items: center;
    box-sizing: border-box;
    flex: 1 1 0;
    min-width: 0;
    height: 48px;
    padding-inline: 12px;
    border: 1px solid var(--krds-color-light-gray-30);
    border-radius: 4px;
    background-color: var(--krds-color-light-gray-0);
    color: var(--krds-color-light-gray-40);
    font-size: 15px;
    line-height: 23px;
  }
  .kbf-msearch__btn {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 48px;
    height: 48px;
    flex-shrink: 0;
    border-radius: 4px;
    background-color: var(--krds-color-light-primary-60);
  }

  /* 소식 카드 — S57b(JMJ-0) 실측 · Row 84 · Thumb 96×64 · Text gap 2 */
  .kbf-news-card { padding-block: 8px; gap: 12px; }
  .kbf-news-card__thumb { width: 96px; height: 64px; }
  .kbf-news-card__text  { gap: 2px; }
  .kbf-news-card__title {
    font-size: 15px;
    line-height: 23px;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
  }
  .kbf-news-card__summary { display: none; }   /* 390 에서는 제목+메타만(시안) */
  .kbf-news-card__meta    { font-size: 13px; line-height: 20px; }

  /* 공지 — 표 대신 카드 목록(일정표 선례) */
  .kbf-table--notice { display: none; }
  .kbf-notice-list { display: flex; flex-direction: column; }
  .kbf-notice-row {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 4px;
    padding-block: 12px;
    border-bottom: 1px solid var(--krds-color-light-gray-10);
  }
  .kbf-notice-row__title {
    color: var(--krds-color-light-gray-90);
    font-size: 15px;
    font-weight: 500;
    line-height: 23px;
  }
  .kbf-notice-row__meta {
    color: var(--krds-color-light-gray-50);
    font-size: 13px;
    font-weight: 400;
    line-height: 20px;
  }

  /* 페이저 — S57b(JN1-0) 실측 44×44 · gap 2 · pt 4 · border-top */
  .kbf-pager { display: none; }
  .kbf-pager--mobile {
    display: flex;
    padding-top: 4px;
    gap: 2px;
    border-top: 1px solid var(--krds-color-light-gray-10);
  }
  .kbf-pager--mobile .kbf-pager__link,
  .kbf-pager--mobile .kbf-pager__navi {
    width: 44px;
    height: 44px;
    border: 0;
    color: var(--krds-color-light-gray-70);
    font-size: 15px;
    line-height: 23px;
  }
  .kbf-pager--mobile .kbf-pager__link.is-active {
    background-color: var(--krds-color-light-primary-60);
    color: var(--krds-color-light-gray-0);
    font-weight: 700;
  }
}


/* ============================================================================
   화면별 — 묶음 5 주요기보
   ⚠️ LNB 없이 **전폭 1274**다(결정 G2 — navsub 형제가 0이면 이동 기능이 없다).
      레이아웃은 `krds-sub` 가 `$hasLnb` 로 이미 처리한다.
   ========================================================================= */

/* 5열 (S41b `GFE-0` 실측) — 160·474·180·180·240 = 1234 = 1274 − pi 20×2 */
.kbf-table--gibo .kbf-table__cell--0 { width: 160px; flex-shrink: 0; }
.kbf-table--gibo .kbf-table__cell--1 { flex: 1 1 0;  min-width: 0; }
.kbf-table--gibo .kbf-table__cell--2,
.kbf-table--gibo .kbf-table__cell--3 { width: 180px; flex-shrink: 0; }
.kbf-table--gibo .kbf-table__cell--4 { width: 240px; flex-shrink: 0; }

.kbf-gibo-list { display: none; }

@media (min-width: 768px) and (max-width: 1439px) {
  .kbf-table--gibo { overflow-x: auto; }
  .kbf-table--gibo .kbf-table__head,
  .kbf-table--gibo .kbf-table__row { min-width: 1000px; }
}

@media (max-width: 767px) {
  /* ⚠️ 모바일은 **검색바가 없다**(S59b 실측 — Main Content 가 바로 목록이다).
     소식목록(S57b)에는 있었으니 화면별 차이이며 결함이 아니다. */
  .kbf-table--gibo { display: none; }
  .kbf-gibo-list { display: flex; flex-direction: column; }
  .kbf-gibo-row {
    display: flex;
    flex-direction: column;
    gap: 2px;
    padding-bottom: 12px;
    margin-bottom: 12px;
    border-bottom: 1px solid var(--krds-color-light-gray-10);
  }
  .kbf-gibo-row__title {
    color: var(--krds-color-light-gray-90);
    font-size: 15px;
    font-weight: 500;
    line-height: 23px;
  }
  .kbf-gibo-row__players {
    color: var(--krds-color-light-gray-70);
    font-size: 15px;
    font-weight: 400;
    line-height: 23px;
  }
  .kbf-gibo-row__meta {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding-top: 2px;
    color: var(--krds-color-light-gray-50);
    font-size: 13px;
    font-weight: 400;
    line-height: 20px;
  }
}


/* ============================================================================
   2차 — 상세 3종 (경기상세 · 게시물상세 · 기보뷰어)
   ⭐ 결정 G5 — 상세 3장 모두 **페이지 타이틀에 콘텐츠 제목**이 온다. 레거시는 h1 이
      그룹명이라 모든 상세의 h1 이 같아 정보가 0이었다.
   ========================================================================= */

/* 공통 — 각주 · 목록 버튼 (S35b `HDT-0`·`HDX-0` 실측) */
.kbf-detail-note {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin: 0;
  color: var(--krds-color-light-gray-70);
  font-size: 15px;
  font-weight: 400;
  line-height: 23px;
}
.kbf-detail-note__right { color: var(--krds-color-light-gray-50); font-weight: 500; }
.kbf-detail-note--mobile { display: none; }
.kbf-btn-slot { display: flex; justify-content: center; padding-top: 12px; }
.kbf-btn-outline {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 132px;
  height: 52px;
  flex-shrink: 0;
  border: 1px solid var(--krds-color-light-gray-30);
  border-radius: 6px;
  background-color: var(--krds-color-light-gray-0);
  color: var(--krds-color-light-gray-80);
  font-size: 17px;
  font-weight: 500;
  line-height: 26px;
  text-decoration: none;
}

/* ── 경기상세 (S35b `HCS-0`) — 5열 80·215·215·240·140 = 890 ────────────── */
.kbf-table--board .kbf-table__cell--0 { width: 80px;  flex-shrink: 0; }
.kbf-table--board .kbf-table__cell--1,
.kbf-table--board .kbf-table__cell--2 { width: 215px; flex-shrink: 0; }
.kbf-table--board .kbf-table__cell--3 { flex: 1 1 0;  min-width: 0; }
.kbf-table--board .kbf-table__cell--4 { width: 140px; flex-shrink: 0; text-align: right; font-size: 15px; }
.kbf-detail-head { display: none; }   /* 모바일 전용 — 데스크톱은 표 헤더가 대신한다 */

/* ── 게시물상세 (S40b `GUX-0`) — gap 24 ────────────────────────────────── */
.kbf-post { display: flex; flex-direction: column; gap: 24px; }
.kbf-post__p {
  margin: 0;
  color: var(--krds-color-light-gray-80);
  font-size: 17px;
  font-weight: 400;
  line-height: 26px;
}
.kbf-post__h {
  margin: 0;
  color: var(--krds-color-light-gray-95);
  font-size: 19px;
  font-weight: 700;
  line-height: 29px;
}
.kbf-post__list { display: flex; flex-direction: column; gap: 14px; }
.kbf-post__li   { display: flex; flex-direction: column; gap: 4px; }
.kbf-post__li-mark {
  color: var(--krds-color-light-gray-90);
  font-size: 17px;
  font-weight: 700;
  line-height: 26px;
}
.kbf-post__li-sub {
  padding-left: 16px;
  color: var(--krds-color-light-gray-70);
  font-size: 17px;
  font-weight: 400;
  line-height: 26px;
}
.kbf-post__fig { display: flex; flex-direction: column; margin: 0; gap: 10px; }
.kbf-post__img {
  display: block;
  width: 100%;
  height: 523px;
  border-radius: 8px;
  background-color: var(--krds-color-light-gray-10);
}
.kbf-post__cap {
  color: var(--krds-color-light-gray-70);
  font-size: 15px;
  font-weight: 400;
  line-height: 23px;
}

/* ── 기보뷰어 (S42b `GK6-0`) — canvas 600×670 · LNB 없이 전폭 ─────────── */
.kbf-gibo-info { display: none; }     /* 모바일 전용 */
.kbf-viewer { display: flex; flex-direction: column; align-items: center; gap: 12px; }
.kbf-viewer__board {
  /* KBF-42 — `<div>` 플레이스홀더가 실제 `<canvas>` 가 됐다(레거시 geditor.js 재사용).
     ⚠️ canvas 는 **픽셀 버퍼(width/height 속성)** 와 **표시 크기(CSS)** 가 분리돼 있다.
        CSS 로만 늘리면 비트맵을 리샘플링해 뭉갠다 — 여기 값은 버퍼와 **같아야** 하고,
        실제 크기 변경은 JS 가 버퍼 자체를 바꾼다.
     ⚠️ 격자·목재색 배경을 지웠다. 이제 geditor.js 가 canvas 안에 직접 그린다.
        남겨 두면 유실 기보에서 「바둑판처럼 보이는 빈 판」이 되어 G7 안내가 무의미해진다. */
  display: block;
  width: 600px;
  height: 670px;
  max-width: 100%;
  border-radius: 8px;
  outline: none;
}

/* 🔑 G7 — SGF 파일 유실(실측 406/4,660) 안내. 레거시는 빈 판만 보여주고 말이 없다. */
.kbf-viewer__missing {
  display: flex;
  align-items: center;
  justify-content: center;
  box-sizing: border-box;
  width: 600px;
  height: 670px;
  max-width: 100%;
  margin: 0;
  padding: 24px;
  border: 1px solid var(--krds-color-light-gray-20);
  border-radius: 8px;
  background-color: var(--krds-color-light-gray-5);
  color: var(--krds-color-light-gray-60);
  font-size: 17px;
  line-height: 26px;
  text-align: center;
}


/* ── 2차 · 태블릿 768~1439 ────────────────────────────────────────────── */
@media (min-width: 768px) and (max-width: 1439px) {
  .kbf-table--board { overflow-x: auto; }
  .kbf-table--board .kbf-table__head,
  .kbf-table--board .kbf-table__row { min-width: 760px; }
  .kbf-post__img { height: 360px; }
  /* ⚠️ KBF-42 — 예전엔 `width:100%; height:auto; aspect-ratio` 였다. canvas 에는 쓸 수
     없다 — 픽셀 버퍼를 그대로 둔 채 표시 크기만 늘려 **비트맵이 뭉개진다**.
     태블릿 콘텐츠 폭(≥768)이 600 보다 넓으므로 원본 치수를 그대로 둔다. */
  .kbf-viewer__missing { width: 100%; }
}


/* ── 2차 · 모바일 ≤767 (S53b · S58b · S60b 실측) ────────────────────── */
@media (max-width: 767px) {
  /* 경기상세 — Sub Hero **스코어보드 변형**(S53b · 200) */
  .kbf-score-eyebrow { display: flex; align-items: center; justify-content: space-between; }
  .kbf-score-eyebrow__label {
    color: var(--kbf-subhero-text);
    font-size: 12px;
    font-weight: 500;
    line-height: 20px;
    letter-spacing: 0.08em;
  }
  .kbf-score-eyebrow__badge {
    color: var(--krds-color-light-gray-0);
    font-size: 12px;
    font-weight: 700;
    line-height: 20px;
    letter-spacing: 0.08em;
  }
  .kbf-scoreboard { display: flex; flex-direction: column; }
  .kbf-scoreboard__row { display: flex; align-items: center; justify-content: space-between; height: 32px; }
  .kbf-scoreboard__team  { color: var(--kbf-subhero-text); font-size: 17px; font-weight: 400; line-height: 26px; }
  .kbf-scoreboard__score { color: var(--kbf-subhero-text); font-size: 22px; font-weight: 400; line-height: 32px; }
  .kbf-scoreboard__row.is-win .kbf-scoreboard__team,
  .kbf-scoreboard__row.is-win .kbf-scoreboard__score {
    color: var(--krds-color-light-gray-0);
    font-weight: 700;
  }
  .kbf-score-context {
    margin: 0;
    color: var(--kbf-subhero-text);
    font-size: 13px;
    font-weight: 400;
    line-height: 20px;
  }

  /* 장별 결과 — 표를 목록으로 편다 */
  .kbf-detail-head { display: flex; align-items: center; justify-content: space-between; }
  .kbf-detail-head__title {
    margin: 0;
    color: var(--krds-color-light-gray-90);
    font-size: 15px;
    font-weight: 700;
    line-height: 23px;
  }
  .kbf-detail-head__meta { color: var(--krds-color-light-gray-50); font-size: 13px; line-height: 20px; }
  .kbf-table--board .kbf-table__head { display: none; }
  .kbf-table--board .kbf-table__row {
    flex-wrap: wrap;
    align-items: baseline;
    min-height: 0;
    padding: 12px 0;
    gap: 0 8px;
  }
  .kbf-table--board .kbf-table__cell--0 {
    width: 40px;
    color: var(--krds-color-light-gray-50);
    font-size: 13px;
    line-height: 20px;
  }
  .kbf-table--board .kbf-table__cell--1,
  .kbf-table--board .kbf-table__cell--2 { width: auto; flex: 0 0 auto; font-size: 15px; line-height: 23px; }
  .kbf-table--board .kbf-table__cell--2::before { content: "vs "; color: var(--krds-color-light-gray-40); }
  .kbf-table--board .kbf-table__cell--3 {
    flex: 1 1 100%;
    padding-left: 48px;
    color: var(--krds-color-light-gray-50);
    font-size: 13px;
    line-height: 20px;
  }
  .kbf-table--board .kbf-table__cell--4 { display: none; }   /* 기보 링크는 목록에서 진입한다 */
  .kbf-detail-note { display: none; }
  .kbf-detail-note--mobile {
    display: block;
    color: var(--krds-color-light-gray-50);
    font-size: 13px;
    line-height: 20px;
  }

  /* 게시물상세 — ⚠️ 본문 이미지는 **350 을 넘지 않는다**(S58b 규칙 · 가로 스크롤 금지) */
  .kbf-post { gap: 16px; }
  .kbf-post__p, .kbf-post__li-sub { font-size: 15px; line-height: 23px; }
  .kbf-post__h  { font-size: 17px; line-height: 26px; }
  .kbf-post__li-mark { font-size: 15px; line-height: 23px; }
  .kbf-post__img { max-width: 350px; height: 197px; }
  .kbf-post__cap { font-size: 13px; line-height: 20px; }

  /* 기보뷰어 — Info Bar + Board 350×350 + Menu Strip 41 */
  .kbf-gibo-info { display: flex; align-items: center; justify-content: space-between; }
  .kbf-gibo-info__result {
    color: var(--krds-color-light-gray-90);
    font-size: 15px;
    font-weight: 700;
    line-height: 23px;
  }
  .kbf-gibo-info__hint { color: var(--krds-color-light-gray-50); font-size: 13px; line-height: 20px; }
  .kbf-viewer { gap: 0; }
  /* 🚨 KBF-42 — 시안 S60b 는 「Board 350×350 + Menu Strip 41」을 별개 DOM 으로 그렸고
     `KBA-33` U3 는 그래서 「모바일 실현 불가」로 판정했다. **판정 근거가 틀렸다** —
     geditor.js 는 좌표·재생메뉴를 canvas **안에** 그리므로 버퍼를 350×390 으로 주면
     시안 총높이(391)와 1px 차로 전부 들어간다(실측 2026-08-23).
     ⇒ `.kbf-viewer__menu` 는 뷰에서 제거했다. canvas 하나가 391 을 담당한다. */
  .kbf-viewer__board { width: 350px; height: 390px; max-width: 100%; border-radius: 4px; }
  .kbf-viewer__missing { width: 350px; height: 390px; font-size: 15px; line-height: 23px; }

  .kbf-btn-slot { padding-top: 8px; }
  .kbf-btn-outline { width: 100%; height: 48px; font-size: 15px; line-height: 23px; }
}

/* ══════════════════════════════════════════════════════════════════════
   2차 배선 — 목록 → 상세 (KBF-36)
   Phase 2 는 상세 화면이 없어 제목·「경기 상세」를 전부 `<span>` 으로 뒀다
   (`D-36-11` — 목적지 없으면 링크가 아니다). 2차에서 목적지가 생겨 승격한다.
   ⚠️ KRDS 전역 `a` 스타일(밑줄·파랑)이 카드/표 안에서 튀므로 상속으로 되돌린다.
   ══════════════════════════════════════════════════════════════════════ */

/* 경기 카드 하단 「경기 상세」 — 시안 S34b 상세 링크(h44 · bt · primary-60) */
.kbf-match__detail {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 44px;
  gap: 6px;
  border-top: 1px solid var(--krds-color-light-gray-10);
  color: var(--krds-color-light-primary-60);
  font-size: 15px;
  font-weight: 500;
  line-height: 23px;
  text-decoration: none;
}
.kbf-match__detail:hover,
.kbf-match__detail:focus-visible { text-decoration: underline; }

/* ── 경기 카드 안의 링크·트리거 (KBF-89 · KBA-90) ─────────────────────────
   🚨 레거시는 엠블럼·팀명·선수명이 **전부 눌렸다**(`result/regular_season.blade.php`
      `:28,30,33,43,59,81`). KRDS 로 옮기며 사라진 것을 되살린다.
   ⭐ **치수 규칙을 지는 클래스는 손대지 않는다** — `.kbf-match__slot`(100)·`__team`(100)·
      `__player`(100) 이 시안 `S34b` 의 294×394 를 만든다. 링크는 그 **안쪽**에 들어가므로
      여기서는 클릭 영역만 정한다.
   ⭐ 색·글꼴·밑줄 기본값을 다시 적지 않는다 — KRDS 전역이 `a{color:inherit;
      text-decoration:none}`(`krds.min.css` 268) 과 `button{font:inherit;color:inherit;
      background:transparent;border:none;cursor:pointer;padding:0}`(270) 을 이미 준다.
      포커스 링도 전역 `:focus`(254) 가 준다. */
.kbf-match__emblem-link { display: flex; border-radius: 28px; }
.kbf-match__team-link { display: inline-block; max-width: 100%; }
.kbf-match__player-btn {
  width: 100%;          /* 셀 폭을 채운다 — 글자에만 붙으면 클릭 영역이 너무 좁다 */
  text-align: inherit;  /* ⚠️ 버튼 기본값이 center 라, 없으면 모바일의
                               `.kbf-match__player:last-child { text-align: right }` 를 덮는다 */
}
.kbf-match__team-link:hover,
.kbf-match__team-link:focus-visible,
.kbf-match__player-btn:hover,
.kbf-match__player-btn:focus-visible { text-decoration: underline; }

/* 포스트시즌 Stage Foot 「경기 보기 →」 — .kbf-stage__date 와 같은 13/20 */
.kbf-stage__link {
  color: var(--krds-color-light-primary-60);
  font-size: 13px;
  font-weight: 500;
  line-height: 20px;
  text-decoration: none;
}
.kbf-stage__link:hover,
.kbf-stage__link:focus-visible { text-decoration: underline; }

/* 목록 제목 링크 — 뉴스/보도/공지 카드 · 기보목록 표 */
.kbf-news-card__title a,
.kbf-table--gibo .kbf-table__cell--1 a {
  color: inherit;
  text-decoration: none;
}
.kbf-news-card__title a:hover,
.kbf-news-card__title a:focus-visible,
.kbf-table--gibo .kbf-table__cell--1 a:hover,
.kbf-table--gibo .kbf-table__cell--1 a:focus-visible { text-decoration: underline; }

/* 기보목록 모바일 행 — <div> 에서 <a> 로 승격됐다. display:flex 는 기존 블록이
   이미 준다(1692행) — 여기서는 링크 기본 스타일만 되돌린다. */
.kbf-gibo-row {
  color: inherit;
  text-decoration: none;
}

/* 공지목록 — 데스크톱 제목 셀 · 모바일 행(<div>→<a> 승격) */
/* 공지 제목 링크 규칙은 `KBF-90` 에서 위쪽 「표 안에서 이름을 누르는 자리」 묶음으로
   옮겼다 — 열이 당겨져 `--2` 는 이제 **작성일**이다. 여기 두면 엉뚱한 열이 밑줄진다. */
.kbf-notice-row { color: inherit; text-decoration: none; }

/* ══ KBF-42 1단계 — 장식이 실제 컨트롤이 됐다 ═══════════════════════════════
   `<span aria-disabled>` 가 `<a>` · `<form>` · `<select>` · `<input>` · `<button>`
   으로 바뀌었다. 기존 규칙은 전부 클래스 셀렉터라 모양은 유지되지만, 폼 컨트롤은
   브라우저 기본 스타일(테두리·폰트·appearance)이 얹히므로 그것만 눌러 준다.
   ⚠️ 치수·색은 위 규칙이 정본이다. 여기서 다시 정의하지 않는다 — 두 벌이 되면
      한쪽만 고쳐져 갈라진다(`D-41-01` 계열). */

/* 셀렉트는 래퍼 안에서 전체를 덮어 어디를 눌러도 열리게 한다. 아이콘은 위에 얹고
   포인터를 통과시킨다 — 그러지 않으면 chevron 을 눌렀을 때 반응이 없다. */
.kbf-search-bar__select { position: relative; }
/* 🚨 `margin-left: auto` 가 **필수다.** 래퍼는 `justify-content: space-between` 인데
   그것은 **흐름에 남은 자식이 둘 이상일 때만** 「양끝」이 된다. 실동작 `<select>` 는
   `position:absolute` 라 **흐름에서 빠져** 셰브론 하나만 남고, 그러면 space-between 이
   그냥 **시작점**이 된다 ⇒ 아이콘이 왼쪽으로 가 「제목」 글자 위에 겹쳤다
   (실측 1440 · `/news` — svg x=110 vs 셀렉트 텍스트 시작점 110 · KBF-78).
   ⭐ `.kbf-filter-bar__select`(팀소개 포함)·`.kbf-related-select` 가
      **이미 쓰는 해법**이다. 2026-08-28 `b97b583` 이 필터바만 고치면서 같은 파일의
      이 규칙을 지나쳤고, 게이트가 없어 9일간 발주처 화면에 남아 있었다.
   ⚠️ 중복 선언처럼 보여도 지우지 말 것 — `space-between` 은 여기서 작동하지 않는다. */
.kbf-search-bar__select > svg,
.kbf-search-bar__select > img { pointer-events: none; margin-left: auto; }
.kbf-search-bar__native {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  padding-inline: 16px;
  padding-right: 40px;
  border: 0;
  border-radius: 6px;
  background: transparent;
  color: inherit;
  font: inherit;
  cursor: pointer;
  appearance: none;
  -webkit-appearance: none;
}

/* 라운드 탭이 `<a>` 가 됐다(KBF-42 4단계 · M3-나). 치수·색은 위 규칙이 정본이고
   여기서는 링크 기본 스타일만 눌러 준다. 초점 링은 KRDS 기본을 그대로 쓴다.
   ⚠️ 앵커 대상(`.kbf-round-head`)에 `tabindex="-1"` 이 붙어 클릭으로도 초점을 받는다 —
      `KBF-49`(빈 공간 클릭이 포커스 링을 새게 함)와 같은 유형이라 링을 막는다. */
a.kbf-round-tab { text-decoration: none; }
.kbf-round-head:focus { outline: none; box-shadow: none; }

/* 엠블럼이 실제 이미지가 됐다(KBF-42 4단계). 원 56 슬롯은 위 규칙이 정본이고
   여기서는 이미지 고유 속성만 맞춘다 — 로고 비율이 제각각이라 `contain` 으로 맞춘다.
   ⚠️ 배경·테두리는 그대로 둔다. 투명 배경 로고가 많아 원이 없으면 떠 보인다. */
img.kbf-match__emblem--img {
  box-sizing: border-box;   /* ⚠️ 없으면 padding 6+6 과 border 2 가 더해져 56 → 70 이 된다(실측) */
  object-fit: contain;
  padding: 6px;
  background-color: var(--krds-color-light-gray-0);
}

/* 필터바 시즌 셀렉트(KBF-42 4단계). 검색바와 같은 방식 — 래퍼를 덮고 아이콘은 얹는다. */
.kbf-filter-bar__select { position: relative; }
/* 🚨 `margin-left: auto` 가 **필수다.** 래퍼는 `justify-content: space-between` 인데
   그것은 **흐름에 남은 자식이 둘 이상일 때만** 「양끝」이 된다. 장식 `<span>`(텍스트+아이콘)
   시절에는 맞았으나, 실동작 `<select>` 는 `position:absolute` 라 **흐름에서 빠져** 셰브론
   하나만 남았고 그러면 space-between 이 그냥 **시작점**이 된다 ⇒ 아이콘이 왼쪽으로 가
   「2025」의 「2」 위에 겹쳤다(실측 · svg x=17 vs padding-left 16px).
   ⭐ `D-41-01` 계열 — 한 속성을 바꾸면 다른 속성의 전제가 무너진다. */
.kbf-filter-bar__select > svg,
.kbf-filter-bar__select > img { pointer-events: none; margin-left: auto; }
.kbf-filter-bar__native {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  padding-inline: 16px;
  padding-right: 40px;
  border: 0;
  border-radius: 6px;
  background: transparent;
  color: inherit;
  font: inherit;
  cursor: pointer;
  appearance: none;
  -webkit-appearance: none;
}
/* `<span>` 이 `<label>` 이 됐다 — 블록화되지 않게 상속만 맞춘다. */
label.kbf-filter-bar__label { cursor: pointer; }

/* input/button 은 폰트 상속이 안 되고, button 은 기본 테두리가 붙는다. */
input.kbf-search-bar__input,
input.kbf-msearch__input { font: inherit; color: var(--krds-color-light-gray-95); }
input.kbf-search-bar__input::placeholder,
input.kbf-msearch__input::placeholder { color: var(--krds-color-light-gray-40); }
button.kbf-search-bar__btn,
button.kbf-msearch__btn { border: 0; font: inherit; font-weight: 700; cursor: pointer; }
button.kbf-search-bar__btn { color: var(--krds-color-light-gray-0); }

/* 검색 타입 `type=search` 의 웹킷 기본 지우기 버튼 — 높이 계산을 흔든다. */
input[type="search"]::-webkit-search-decoration,
input[type="search"]::-webkit-search-cancel-button { -webkit-appearance: none; }

/* 페이저 링크가 `<a>` 가 됐다. 밑줄·색 상속만 맞춘다. */
a.kbf-pager__link,
a.kbf-pager__navi { color: inherit; text-decoration: none; }

/* 소식 카드 — 썸네일이 실제 이미지가 됐다. 슬롯 치수(200×125 / 140×88 / 96×64)는
   기존 규칙이 정하고, 여기서는 그 안을 채우는 방식만 정한다. */
a.kbf-news-card__thumb { display: block; overflow: hidden; }
.kbf-news-card__thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }

/* 카테고리 접두 — 레거시가 제목 앞에 대괄호로 붙이던 자리다. 제목과 같은 줄에
   흐르되 색만 낮춰 제목 본문과 구분한다. */
.kbf-news-card__cat { color: var(--krds-color-light-gray-60); font-weight: 400; }

/* 빈 상태 — 검색 결과 0건. 「200 인데 백지」를 막는 최소 문구 자리다. */
.kbf-empty {
  margin: 0;
  padding-block: 64px;
  color: var(--krds-color-light-gray-60);
  font-size: 17px;
  line-height: 26px;
  text-align: center;
}

/* ── 그 리그의 글이 아직 없을 때 (KBF-80 · S30c·S48c 실측) ──────────────
   `.kbf-empty` 와 왜 다른가 — 그쪽은 **목록 안이 비었다**(검색 결과 0건)이고
   이쪽은 **화면 전체가 아직 없다**이다. 한 줄로는 부서진 화면처럼 보여 제목을 세운다.
   ⚠️ 배경을 두지 않는다. 부모 `.kbf-sub-content` 가 이미 흰 카드라 상자가 겹친다. */
.kbf-empty-league {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 8px;
  padding-block: 112px;
}
.kbf-empty-league__tit {
  margin: 0;
  color: var(--krds-color-light-gray-95);
  font-size: 19px;
  font-weight: 700;
  line-height: 29px;
}
.kbf-empty-league__desc {
  margin: 0;
  color: var(--krds-color-light-gray-60);
  font-size: 17px;
  line-height: 26px;
  text-align: center;
}

/* 개편 이전 글의 대표 이미지(본문 위) — 레거시 `.view-img` 자리다. */
.kbf-post__thumb { max-width: 100%; height: auto; display: block; margin-bottom: 24px; }

/* ══ KBF-42 2단계 — 기보 ═══════════════════════════════════════════════════ */

/* 목록 빈 상태. 모바일은 `.kbf-gibo-list` 의 @empty 가 담당하므로 여기서 숨긴다 —
   둘 다 보이면 「검색 결과가 없습니다」가 두 번 나온다. */
.kbf-empty--desktop { display: block; }
@media (max-width: 767px) {
  .kbf-empty--desktop { display: none; }
}
