/* ============================================================================
   사운즈바디 · assets/site.css  (디자인 시스템 정본 — 단일 파일)

   로드 순서 : 이 파일 하나. 기존 site.css → responsive.css → motion.css 3벌을
               대체한다. 폭 분기·모션이 컴포넌트 바로 옆에 있어야 규칙을 고칠 때
               세 파일을 왕복하지 않는다. 파일 최하단의 §17(좁은 폭 일괄 축소)과
               §18(모션)만 예외적으로 뒤로 뺀다 — 나중 선언이 이겨야 하는 것들이다.

   출처     : 기획팀 샘플(sample.css 577줄)의 레이아웃·컴포넌트를 그대로 옮겼다.
               클래스명도 샘플을 따른다(.hdr .rail .det .trk .axis …).
               색만 브랜드 팔레트(handoff-package 2 / 04-brand / app_colors.dart)로
               갈아끼웠고, 접근성·검수 위반 지점만 고쳤다. 고친 곳에는 전부
               "★ 샘플과 다름" 주석과 근거를 붙였다.

   금지 사항
     1) 다크모드 일절 금지 — color-scheme, prefers-color-scheme, [data-theme],
        그리고 샘플의 다크 값 #171E22 #131A1E #A8B4BA #98A5AB #66737A #F5867C.
        브랜드 원전에 대응값이 없다. 라이트 전용으로 확정됐다.
     2) 팔레트 밖 색 생성 금지. 새 색이 필요해 보이면 기존 값의 알파 파생으로
        푼다(--rule = --line α.38, --border = --ink α.50). 실패하면 색을 안 쓴다.
     3) 오렌지는 '행동'에만. 면(#F37021)은 CTA 버튼 하나, 글자(#B14A08)는 링크와
        화살표. 진행 막대·차트·판정은 잉크로 그린다. 헤더처럼 전 페이지 반복되는
        자리에 솔리드 오렌지를 두면 히어로 CTA 의 주목도를 깎는다.
     4) 이미지 속 글자 금지. 도해는 전부 HTML + CSS 다. SVG <text> 0개.
        이미지에 갇힌 문장은 검색·인용·스크린리더 어디에도 안 잡힌다.
     5) 외부 JS 라이브러리 금지. 여닫힘은 <details>/<summary> 와 :focus-within 으로
        낸다. 이 파일이 전제하는 JS 는 0줄이다.
     6) 등장 애니메이션 금지. 초기 HTML 에 안 보이는 것은 없는 것이다.
        모션은 감속 곡선 하나(--ease)만 쓰고 transform/opacity 밖으로 나가지 않는다.
     7) body/html 에 overflow-x:hidden 금지. .hdr 과 .rail 이 position:sticky 이고,
        조상에 overflow 가 걸리면 sticky 가 뷰포트가 아니라 그 조상을 기준으로
        잡혀 둘 다 죽는다. 가로 넘침은 원인 쪽(.dp 폭)에서 막는다 — §6 참조.

   검수(verify.py) 전제 — CSS 가 흔드는 지점
     · <footer> 는 클래스 없이 태그 셀렉터로 스타일한다. verify.py 가 리터럴
       문자열 "<footer>" 를 전 페이지에서 요구한다.
     · id="gnb"(header) · id="mmenu"(모바일 패널) · id="floating"(모바일 CTA) 를
       마크업이 갖는다. 이 파일은 클래스로 스타일하되 그 id 를 지우면 안 된다.
     · 시트에 없는 문구는 절대 h1~h4 로 내지 않는다("자세한 내용" · "이어서 볼 문서" ·
       "복용 관리 안에서 볼 문서" · 푸터 묶음명 · 도해 캡션). 전부 .sec-lab / .ftr-h /
       .gx-cap 처럼 <p>/<span> 용 클래스를 이 파일이 제공한다. 헤딩처럼 보이되
       헤딩이 아닌 것이 요점이다.
     · 반대로 아코디언 제목은 <summary> 안에 <h2> 를 넣어 헤딩 아웃라인을 지킨다.
       그 h2 를 summary 스타일에 녹이는 규칙은 §12 에 있다.
   ============================================================================ */


/* ══ 1. 서체 ═══════════════════════════════════════════════════════════════
   브랜드 원전(04-brand): "서체 Wanted Sans 600, 자간 -3.5%. 본문과 UI는 Pretendard".
   현행 사이트의 Space Grotesk 는 브랜드 값이 아니라 여기서 폐기한다.
   가변 폰트 2벌로 400~900 전 구간을 덮으므로 정적 웨이트 링크보다 요청 수가 줄고,
   font-display:swap 이라 FOIT 가 없다(글자가 늦게 와도 빈 화면이 되지 않는다).
   CSP: security-headers.conf 가 font-src/style-src 에 cdn.jsdelivr.net 을 이미
   허용한다. 대신 fonts.googleapis.com / fonts.gstatic.com 은 CSP 에서 뺄 수 있다. */
@font-face{
  font-family:"Wanted Sans Variable";
  src:url("https://cdn.jsdelivr.net/npm/wanted-sans@1.0.3/fonts/webfonts/variable/complete/woff2/WantedSansVariable.woff2") format("woff2-variations");
  font-weight:400 900;font-style:normal;font-display:swap;
}
@font-face{
  font-family:"Pretendard Variable";
  src:url("https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/variable/woff2/PretendardVariable.woff2") format("woff2-variations");
  /* 45 920 은 Pretendard Variable 의 실제 축 범위다. 400 900 으로 좁혀 적으면
     .body a{font-weight:500} 같은 중간값이 축 밖으로 나가 합성 볼드가 섞인다. */
  font-weight:45 920;font-style:normal;font-display:swap;
}


/* ══ 2. 토큰 ═══════════════════════════════════════════════════════════════ */
:root{
  /* ── 면 3단 ──────────────────────────────────────────────────────────────
     ★ 샘플과 역할이 뒤집혀 있다. 샘플은 #F7F8F9 를 '지면', #FFFFFF 를 '떠 있는
     면'으로 쓴다. 우리 브랜드 지면은 순백 + 26px 격자이므로 그대로 옮기면 흰
     지면 위에 회색 헤더 띠가 얹힌다. 값은 둘 다 팔레트 안이니 역할만 뒤집는다.
       --paper   지면 (body · 헤더 · 격자가 보이는 바닥)
       --surface 지면 위에 떠 있는 면 (카드 · 드롭다운 · 도해 패널 · 틴트 밴드)
       --dim     그 위 서브틴트 (타일 · hover 배경 · 빈 상태) */
  --paper:#FFFFFF;      /* royal        · surface       */
  --surface:#F7F8F9;    /* royal2       · surface-tint  */
  --dim:#F0F3F4;        /* on-dark 와 같은 값. 밝은 면의 서브틴트로도 쓴다 */

  /* ── 잉크 3단 (전부 on #FFFFFF 기준. 위 세 면 어디서도 AA 를 넘긴다) ── */
  --ink:#0E1417;        /* 18.57:1 — 제목·본문·진행 막대·판정 */
  --muted:#5A676E;      /* 5.83:1  — 보조 설명·내비 링크 기본 */
  --subtle:#5F6B71;     /* 5.49:1  — 라벨·캡션. 텍스트 대비 하한선 */

  /* ── 선 2단 ──────────────────────────────────────────────────────────────
     --rule  장식용 구분선. base RGB 139,151,157 = hairline #8B979D 이므로
             팔레트 안이다. 합성 대비는 순백 위 1.45:1 — 순수 장식은 1.4.11
             적용 대상이 아니라 무해하지만, 만질 수 있는 것의 경계로는 못 쓴다.
     --border 상호작용 컴포넌트 경계 · 정보를 나르는 선(파선 vs 실선 등).
             ★ 샘플의 #78848A 는 팔레트 밖이다. hairline #8B979D 로 단순 대체도
             불가하다 — 순백 위 실측 2.9952:1 로 3:1 을 미달한다(주석의 3.00 은
             반올림값). --ink 의 α.50 으로 접으면 --rule 과 완전히 같은 근거로
             팔레트 안이면서 순백 3.49 · #F7F8F9 3.46 · #F0F3F4 3.39 로 전부 통과한다. */
  --rule:rgba(139,151,157,.38);
  --border:rgba(14,20,23,.50);

  /* ── 오렌지 2자리 ────────────────────────────────────────────────────────
     --accent      면 전용. 순백 위 2.94:1 이라 글자·링·1px 선으로는 못 쓴다.
     --accent-text 흰 바탕 위 오렌지 '텍스트' 전용. 5.45:1.
     --on-accent   오렌지 면 위 글자. 값이 --ink 그대로라 새 색이 아니다.
                   #0E1417 on #F37021 = 6.32:1 (AA 통과).
                   흰색이면 2.94:1 로 대형·굵은 글자 최소선 3:1 조차 못 넘긴다 —
                   즉 흰 글자는 어떤 크기에서도 통과 경로가 없다.
                   ※ 브랜드 자리 풀블리드 오렌지 면의 흰 글자 규정(R1)과 충돌하지
                     않는다. 그쪽은 '브랜드 자리', 여기는 '행동 자리'다. */
  --accent:#F37021;
  --accent-text:#B14A08;
  --on-accent:#0E1417;
  /* --risk 는 만들지 않는다. 샘플의 #A8221B 는 팔레트 밖이고, 유일 사용처였던
     .capx-bar 좌측 2px 선은 --ink 로 접었다(§15). 정보 손실 0 — 옆의
     '상한섭취량' 라벨이 의미를 100% 담당한다. 저장소가 --rose 를 지운 선례와 같다. */

  /* ── 서체 ── */
  --f-t:"Wanted Sans Variable","Pretendard Variable",-apple-system,system-ui,sans-serif;
  --f-b:"Pretendard Variable",-apple-system,system-ui,"Malgun Gothic",sans-serif;
  --ls-head:-.035em;   /* 브랜드 규정 자간 -3.5%. 샘플의 -.032em 이 아니라 이쪽이 정본 */

  /* ── 치수 ────────────────────────────────────────────────────────────────
     ★ --wrap 은 샘플 75rem(1200) 이 아니라 현행 1160px 로 통일한다. 샘플은
     헤더가 .wrap 을 쓰지 않고 폭을 복제해 헤더만 40px 넓어지고 본문 좌측선과
     어긋난다 — 우리는 헤더도 .wrap 을 합성해 쓴다(§6). */
  --wrap:1160px;
  --measure:42rem;     /* 읽기 폭. .body 와 .det .inner 가 공유한다 */
  --gutter:24px;
  --grid-size:26px;                /* 지면 격자 한 칸 */
  --grid:rgba(14,20,23,.05);       /* 그 선 색. ★ 샘플은 이 색을 --gridline,
                                      크기를 --grid 라 부른다. 현행 --grid 가
                                      '색'이라 이름이 정면 충돌하므로 크기 쪽을
                                      --grid-size 로 개명해 두 정의가 서로를
                                      덮지 않게 했다. */
  --hdr-h:68px;                    /* .hdr-in padding 20 + 최대 자식 48 = 68.
                                      실측이 아니라 계약값이다. 헤더 자식의
                                      min-height 를 바꾸면 이 값도 같이 바꾼다. */
  --anchor-offset:calc(var(--hdr-h) + 24px);  /* 앵커 착지 오프셋.
                                      샘플은 88/96/96 세 상수를 손으로 박아 뒀는데
                                      한 군데만 고치면 어긋난다 — 한 토큰에 묶는다. */
  --safe-t:env(safe-area-inset-top,0px);
  --safe-b:env(safe-area-inset-bottom,0px);
  --safe-l:env(safe-area-inset-left,0px);
  --safe-r:env(safe-area-inset-right,0px);

  --shadow:0 2px 6px rgba(14,20,23,.05),0 30px 70px rgba(14,20,23,.13);
  --ease:cubic-bezier(.23,1,.32,1);  /* 감속 곡선은 사이트 전체에서 이것 하나다.
                                        두 곡선이 공존하면 같은 동작이 화면마다
                                        다른 속도로 느껴진다. */
}
@media(min-width:768px){:root{--gutter:40px}}


/* ══ 3. 리셋 · 기반 ════════════════════════════════════════════════════════ */
*,*::before,*::after{box-sizing:border-box}
html{
  -webkit-text-size-adjust:100%;
  scroll-behavior:smooth;
  /* sticky 헤더 아래로 제목이 숨지 않게 한다. .body h2 · <details> · .rail 이
     전부 이 한 값을 쓴다. */
  scroll-padding-top:calc(var(--anchor-offset) + var(--safe-t));
}
body{
  margin:0;min-height:100vh;display:flex;flex-direction:column;
  background-color:var(--paper);
  /* 26px 격자는 장식이 아니라 지면 사양이다. body 가 한 번만 깔아 캔버스
     전체로 전파시킨다 — 섹션이 다시 깔면 섹션 시작 y 가 26 의 배수가 아니라
     경계마다 격자 위상이 어긋난다. */
  background-image:
    repeating-linear-gradient(0deg,var(--grid) 0 1px,transparent 1px var(--grid-size)),
    repeating-linear-gradient(90deg,var(--grid) 0 1px,transparent 1px var(--grid-size));
  color:var(--ink);font-family:var(--f-b);font-size:17px;line-height:1.75;
  word-break:keep-all;overflow-wrap:break-word;-webkit-font-smoothing:antialiased;
  /* ★ overflow-x:hidden 을 넣지 않는다 — .hdr/.rail 의 position:sticky 가 죽는다.
     가로 넘침은 .dp 쪽에서 막는다(§6). */
}
h1,h2,h3,h4{font-family:var(--f-t);font-weight:600;margin:0;text-wrap:pretty;
  letter-spacing:var(--ls-head)}
p{margin:0}
a{color:var(--accent-text);text-underline-offset:3px}
img{max-width:100%;height:auto;display:block}
main{display:block}


/* ══ 4. 접근성 유틸 ════════════════════════════════════════════════════════ */

/* 포커스 링 — 순백/틴트 면 위에서는 --accent-text(5.45:1).
   --accent(#F37021)는 2.94:1 이라 링으로 쓸 수 없다. */
:focus-visible{outline:2px solid var(--accent-text);outline-offset:2px;border-radius:3px}
/* 오렌지 면 위에서만 잉크로 뒤집는다 — #B14A08 on #F37021 은 2.17:1 로 사라진다.
   잉크는 6.32:1. */
.btn-p:focus-visible,.mdl a:focus-visible{outline-color:var(--ink)}

/* 시각적 숨김 — 샘플의 .sr 은 white-space:nowrap 과 clip 폴백이 없어 긴 캡션이
   1px 폭 안에서 줄바꿈되며 레이아웃 높이에 기여한다. 저장소의 .sr-only 가
   상위호환이라 그쪽 스펙으로 통일하고, 샘플 마크업의 class="sr" 도 같이 받는다. */
.sr,.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;
  overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0}

/* 본문 바로가기 — 샘플에는 아예 없다. 최근 커밋이 명시적으로 고친 항목이라
   구조를 갈아입히면서 떨어뜨리면 회귀다. 포커스를 받으면 헤더 위로 뜬다
   (z-index 는 .hdr 의 30 보다 커야 한다). */
.skip{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}
.skip:focus,.sr-only:focus{position:fixed;left:16px;top:16px;z-index:200;
  width:auto;height:auto;margin:0;clip:auto;clip-path:none;
  display:inline-flex;align-items:center;min-height:48px;padding:0 18px;
  background:var(--paper);color:var(--ink);border:1px solid var(--border);
  border-radius:12px;box-shadow:var(--shadow);font-family:var(--f-t);font-weight:600}
main:focus{outline:none}   /* tabindex="-1" 착지 시 링을 그리지 않는다 */


/* ══ 5. 레이아웃 프리미티브 ════════════════════════════════════════════════ */

/* 폭·거터·safe-area 를 한 곳에서만 관리한다. 헤더·푸터도 이 클래스를 합성해
   쓴다(class="wrap hdr-in"). 샘플처럼 규칙을 복제하면 노치 가로모드에서
   로고가 노치에 물린다. */
.wrap{width:100%;max-width:var(--wrap);margin:0 auto;
  padding-inline:max(var(--gutter),var(--safe-l)) max(var(--gutter),var(--safe-r))}

/* 섹션 — 본문의 유일한 리듬 단위. 세로 여백·구분선·h2 스케일을 여기서만 잡는다.
   h2/.sub 선택자가 직계자식이라 h2 를 무엇으로든 감싸면 타입 스케일이 죽는다. */
.sec{padding:104px 0}
.sec+.sec{border-top:1px solid var(--rule)}
.sec.on-surface{background:var(--surface);border-top:1px solid var(--rule)}
.sec.on-surface .card{background:var(--paper)}
.sec.on-surface .related a{background:var(--paper)}
.sec>.wrap>h2{font-size:clamp(28px,3.6vw,40px);line-height:1.22;max-width:24ch}
.sec>.wrap>.sub{margin-top:18px;font-size:20px;line-height:1.66;color:var(--muted);
  max-width:34rem}
/* ★ 샘플에 .sub 베이스 규칙이 없어 직계자식이 아닌 곳에서는 스타일이 전혀 안 먹는다. */
.sub{font-size:20px;line-height:1.66;color:var(--muted);max-width:34rem}

/* 섹션 라벨 — "자세한 내용" · "이어서 볼 문서" · "복용 관리 안에서 볼 문서".
   ★★ 샘플은 이걸 <h2> 로 냈다. 시트에 없는 헤딩이라 33페이지 전부에서 검수가
   깨진다(이 저장소가 과거에 똑같이 실수했다). 헤딩처럼 보이되 <p>/<span> 이다.
   위에 id 를 남겨 ul[aria-labelledby] 로 묶으면 의미도 보존된다. */
.sec-lab{font-family:var(--f-t);font-weight:600;font-size:15px;color:var(--subtle);
  letter-spacing:-.01em;margin:0}


/* ══ 6. 헤더 크롬 ══════════════════════════════════════════════════════════ */

/* 자기 높이를 상수로 갖지 않고 가장 큰 자식이 높이를 만든다.
   ≥900px 는 .drop-t/.ghost 48 + padding 20 = 68, <900px 는 summary 48 + 20 = 68.
   --hdr-h 와 일치한다. */
.hdr{position:sticky;top:0;z-index:30;background:var(--paper);
  border-bottom:1px solid var(--rule);padding-top:var(--safe-t)}
.hdr-in{display:flex;align-items:center;gap:16px;padding-block:10px}

.brand{display:flex;align-items:center;gap:10px;min-height:48px;
  font-family:var(--f-t);font-weight:600;font-size:19px;letter-spacing:var(--ls-head);
  color:var(--ink);text-decoration:none}
.brand img{height:22px;width:auto}
/* ★ 샘플은 min-height 가 없어 실측 28px 이다. 홈으로 가는 링크인데 터치 타깃
   미달이고, 헤더가 68px 이라 48px 로 올려도 레이아웃을 밀지 않는다. */

/* 메뉴는 로고 바로 옆(좌측). 우측 묶음만 auto 마진으로 밀어낸다 */
.gnb{display:none;margin-left:12px}
.gnb>ul{display:flex;gap:2px;list-style:none;margin:0;padding:0}
.drop{position:relative}
.drop-t{display:flex;align-items:center;min-height:48px;padding:0 14px;
  font-family:var(--f-t);font-weight:600;font-size:15px;color:var(--ink);
  text-decoration:none;border-radius:10px}
.drop-t:hover{background:var(--dim)}
/* 현재 묶음 표시 — 샘플에는 없다. build.py 가 /care /plan /guide 에
   aria-current="page" 를 찍으므로 시각 표시를 새로 만든다. 밑줄은 잉크로 긋는다
   (오렌지는 행동에만). */
.drop-t[aria-current]{box-shadow:inset 0 -2px 0 var(--ink)}

/* ── 상단 메뉴 펼침 ──────────────────────────────────────────────────────
   누르기 전에 그 묶음에 뭐가 있는지 보이게 한다. JS 0줄.
   padding-top:8px 은 장식이 아니라 기능이다 — 트리거에서 패널로 커서가 넘어가는
   동안 hover 가 끊기지 않게 하는 '호버 다리'다. 지우면 패널이 닫힌다. */
.dp{position:absolute;left:-10px;top:100%;padding-top:8px;z-index:5;display:none}

/* ★ 샘플과 다름 — 터치 기기 대응.
   샘플은 .drop:hover 에 미디어 가드가 없다. .gnb 는 ≥900px 에서만 뜨므로 대상은
   iPad 가로·안드로이드 태블릿·터치 노트북이고, 이들은 실제로 여기 도달한다.
     · iOS Safari : 첫 탭에 hover 를 합성해 우연히 열린다(명세가 아니라 휴리스틱).
     · Android Chrome : hover 합성이 없다. 탭 → 즉시 이동. 패널은 한 번도 안 열린다.
       = 안드로이드 태블릿에서 2뎁스 메뉴는 존재하지 않는 기능이었다.
   해법: hover 는 (hover:hover) and (pointer:fine) 로 가두고, :focus-within 은
   무조건 남겨 키보드를 살린다. 그리고 hover 가 없는 기기에서는 GNB 자체를 접고
   <details> 햄버거를 모든 폭에서 노출한다 — details/summary 는 탭으로 확실히
   열리는 유일한 JS-없는 개시 장치다. 정보 손실은 없다: .drop-t 는 허브 링크이고
   허브 페이지의 .rail 이 하위 문서를 전부 나열한다. */
@media (hover:hover) and (pointer:fine){
  .drop:hover>.dp{display:block}
}
.drop:focus-within>.dp{display:block}

.dp-in{background:var(--paper);border:1px solid var(--rule);border-radius:16px;
  box-shadow:var(--shadow);padding:10px;
  /* ★ 샘플 실버그 수정 — .dp 에 right/max-width 가 없어 '영양제 가이드'의 3열
     패널(최소 ≈496px)이 900~1000px 구간에서 뷰포트 밖으로 넘친다. body 에
     overflow-x:hidden 을 걸 수 없으므로(§금지 7) 패널 쪽을 잘라 막는다. */
  max-width:calc(100vw - 2 * var(--gutter))}
.dp ul{display:block;list-style:none;margin:0;padding:0}
.dp a{display:flex;align-items:center;gap:8px;min-height:48px;padding:0 12px;
  font-family:var(--f-b);font-weight:400;font-size:14.5px;line-height:1.35;
  color:var(--muted);text-decoration:none;border-radius:9px;white-space:nowrap}
.dp a:hover{background:var(--dim);color:var(--ink)}
/* ★ 마지막 패널을 오른쪽 끝에 붙이지 않는다 — 되돌린 규칙이다.
   한때 `.gnb>ul>li.drop:last-child .dp{left:auto;right:-10px}` 를 두었다.
   메뉴는 로고 옆(좌측)에 있으므로 오른쪽 기준으로 펼치면 왼쪽으로 넘친다.
   '영양제 가이드' 3열 패널은 498px 인데 그 항목의 오른쪽 끝이 x=439 라
   49px 가 창 밖으로 잘렸다 — 창 폭과 무관하게 언제나. 라벨 앞이 날아가
   '영양제 조합'이 '제 조합'으로 보였다.
   오른쪽 넘침은 바로 위 .dp-in 의 max-width 가 이미 막고 있다. 여기서
   left 를 다시 만지면 반대편이 잘린다. */

.dp .dp-flat{display:grid;grid-template-columns:1fr 1fr;gap:2px 8px;min-width:23rem}
/* 특이도 트릭 — .dp ul{display:block}(0,1,1)을 이기려고 .dp 를 앞에 붙였다.
   셀렉터를 줄이면 2열이 무너진다. */
.dp-cols{display:grid;grid-template-columns:repeat(var(--n,3),minmax(9.5rem,1fr));
  gap:4px 10px}
.dp-cols li a{padding-left:22px;font-size:14px}

/* 열 머리(2뎁스 그룹명). ★ 이름이 -h 지만 헤딩이 아니다 — <a> 또는 <p> 다.
   시트에 없는 텍스트가 전 페이지 헤더에서 반복되므로 절대 <h_> 로 올리지 않는다.
   문서가 있는 그룹명만 <a>, 없는 것('성분 사전')은 <p> 로 낸다 — 없는 페이지에
   링크를 만들지 않는다. */
.dp .dp-h{font-family:var(--f-t);font-weight:600;font-size:15px;color:var(--ink);
  margin-bottom:2px}
/* ★ 샘플은 여기에 !important 4개를 박았다. .dp a(0,1,1)를 못 이겨서인데
   .dp .dp-h(0,2,0)로 쓰면 전부 뺄 수 있다. */
.dp p.dp-h{display:flex;align-items:center;min-height:48px;padding:0 12px;margin:0 0 2px}

.dp-all{display:flex;align-items:center;min-height:48px;margin-top:8px;padding:0 12px;
  border-top:1px solid var(--rule);font-family:var(--f-b);font-size:13.5px;
  color:var(--subtle);text-decoration:none}
.dp-all:hover{color:var(--ink)}

.hdr-r{display:flex;align-items:center;gap:8px;margin-left:auto}

/* 헤더는 전 페이지 반복 → 솔리드 오렌지 금지. 오렌지는 히어로 CTA 몫이다.
   외곽선 버튼으로 둔다. */
.ghost{display:none;align-items:center;justify-content:center;min-height:48px;
  padding:0 18px;border:1px solid var(--border);border-radius:10px;
  font-family:var(--f-t);font-weight:600;font-size:15px;color:var(--ink);
  text-decoration:none}
.ghost:hover{border-color:var(--ink)}
/* ★ hover 를 --border 로 올리던 샘플 관용구는 못 쓴다 — 기본선을 이미 --border 로
   올렸기 때문에 무변화가 된다. 한 단계 더 위인 --ink 로 대체한다.
   이 치환은 .nextdoc / .ftr-map / .related a / .steps a 에도 똑같이 적용했다. */

@media(min-width:900px){
  .gnb{display:block}
  .ghost{display:inline-flex}
  .menu{display:none}
}

/* ★ 위 900px 블록보다 뒤에 와야 이긴다. hover 없는 기기 = 항상 햄버거. */
@media (hover:none){
  .gnb{display:none}
  .menu{display:block}
}


/* ══ 7. 모바일 메뉴 · 플로팅 CTA ═══════════════════════════════════════════ */

/* <details>/<summary> — JS 0줄로 여닫고 aria-expanded 를 브라우저가 붙여 준다.
   summary 의 aria-label 은 '전체 메뉴' 로 두고 '열기'를 쓰지 않는다 —
   details 가 상태를 이미 노출하므로 열린 뒤에도 '열기'로 읽히면 거짓말이 된다. */
.menu{position:relative}
.menu>summary{display:flex;align-items:center;justify-content:center;
  min-height:48px;min-width:48px;border:1px solid var(--border);border-radius:10px;
  cursor:pointer;list-style:none;color:var(--ink)}
.menu>summary::-webkit-details-marker{display:none}
.menu>summary::marker{content:""}

.mpanel{position:absolute;right:0;top:calc(100% + 8px);width:16rem;
  background:var(--paper);border:1px solid var(--rule);border-radius:16px;
  box-shadow:var(--shadow);padding:8px;z-index:5}
.mpanel ul{list-style:none;margin:0;padding:0}
.mpanel a{display:flex;align-items:center;min-height:48px;padding:0 12px;
  font-size:15px;color:var(--ink);text-decoration:none;border-radius:10px}
/* ★ 샘플은 .mpanel a 에 상태 표시가 전혀 없다. 터치 전용 영역이라 :hover 대신
   :active 로 준다 — 눌린 것이 보이지 않으면 안 눌린 줄 알고 두 번 누른다. */
.mpanel a:active{background:var(--dim)}
.mpanel a[aria-current]{background:var(--dim);font-weight:600;
  box-shadow:inset 2px 0 0 var(--ink)}

/* 패널 안 마지막 항목만 솔리드 오렌지. '헤더에 오렌지 금지'와 모순처럼 보이지만
   이건 열었을 때만 보이는 것이라 반복 노출이 아니다 — 규칙의 취지에 어긋나지 않는다. */
.mdl{margin-top:4px;border-top:1px solid var(--rule);padding-top:4px}
.mdl a{background:var(--accent);color:var(--on-accent);font-family:var(--f-t);
  font-weight:600;justify-content:center}

/* 모바일 고정 CTA. 마크업은 <a class="float" id="floating">(verify.py 가 id 를 요구).
   ★ 샘플 대비 보강 2가지 — 둘 다 실제 결함이었다.
     (1) safe-area: bottom:18px 고정이면 iPhone 홈인디케이터와 겹친다.
     (2) body 하단 자리 확보: 없으면 푸터의 면책 문구 마지막 줄을 영구히 덮는다.
         법적 고지를 가리는 것은 취향 문제가 아니다. */
.float{position:fixed;z-index:20;
  right:calc(18px + var(--safe-r));bottom:calc(18px + var(--safe-b));
  display:inline-flex;align-items:center;justify-content:center;
  min-height:52px;padding:0 24px;border-radius:99px;
  background:var(--ink);color:var(--paper);
  font-family:var(--f-t);font-weight:600;font-size:16px;text-decoration:none;
  box-shadow:var(--shadow)}
body{padding-bottom:calc(84px + var(--safe-b))}
@media(min-width:900px){
  .float{display:none}
  body{padding-bottom:0}
}


/* ══ 8. 이름표(브레드크럼) ═════════════════════════════════════════════════
   방금 누른 이름을 제목 바로 위에 그대로 둔다. 홈에는 없다.
   현재 페이지는 링크가 아니라 <b aria-current="page"> 로 낸다. */
.eyebrow{display:flex;flex-wrap:wrap;justify-content:center;align-items:center;gap:7px;
  margin-bottom:22px;font-family:var(--f-t);font-size:15px;line-height:1.5}
/* 실측 23px 이었다. 히트 영역만 48px 로 올리고 시각 간격은 margin 으로 상쇄해
   이름표 줄 높이가 늘어나지 않게 한다(글자 크기는 건드리지 않는다). */
.eyebrow a,.eyebrow span:not(.eb-s){display:inline-flex;align-items:center;min-height:48px;
  margin-block:-12px;color:var(--muted);text-decoration:none}
.eyebrow a:hover{color:var(--ink);text-decoration:underline}
.eyebrow b{font-weight:600;color:var(--ink)}
/* ★ 샘플은 구분자에 --rule 을 '글자색'으로 썼다 — 합성 1.45:1 이라 / 가 사실상
   사라진다. aria-hidden 장식이라 위반은 아니지만 보이라고 넣은 글리프다. */
.eb-s{color:var(--subtle)}
.hero.narrow .eyebrow,.shell .eyebrow{justify-content:flex-start}
/* 터치 타깃 — 링크에 min-height 가 없어 실측 ≈26px 이다. 음수 마진으로 늘려
   줄 간격을 밀지 않으면서 48px 을 만든다. */
@media (pointer:coarse){
  .eyebrow a{display:inline-flex;align-items:center;min-height:48px;
    padding-inline:6px;margin-inline:-6px}
}


/* ══ 9. 히어로 ═════════════════════════════════════════════════════════════ */
.hero{position:relative;padding:96px 0 104px;text-align:center}
.hero>.wrap,.cta-f>.wrap{position:relative;z-index:1}
.hero h1{font-size:clamp(36px,6vw,66px);line-height:1.08;max-width:22ch;margin-inline:auto}
.hero .lead{margin:30px auto 0;font-size:20px;line-height:1.66;color:var(--muted);
  max-width:36rem}
.hero.narrow{padding:80px 0 72px}
.hero.narrow h1{font-size:clamp(32px,4.6vw,50px);max-width:24ch}

/* 사실 띠 — 기획 카피의 metrics 줄을 하나씩 끊어 보여준다 */
.facts{display:flex;flex-wrap:wrap;justify-content:center;margin:28px 0 0;padding:0;
  list-style:none;font-family:var(--f-t);font-weight:600;
  font-variant-numeric:tabular-nums;font-size:16px;letter-spacing:-.015em;color:var(--ink)}
.facts li{padding:0 16px}
.facts li+li{border-left:1px solid var(--rule)}

/* 버튼 */
.btn{display:inline-flex;align-items:center;justify-content:center;min-height:52px;
  padding:0 26px;border-radius:12px;font-family:var(--f-t);font-weight:600;font-size:17px;
  text-decoration:none;
  /* border:1px solid transparent 가 핵심이다 — .btn-p(테두리 없음)와
     .btn-s(테두리 있음)의 실제 크기를 맞춘다. 지우면 두 변종이 2px 어긋난다.
     강제 색상 모드에서 버튼 윤곽이 남는 부수 효과도 여기서 얻는다. */
  border:1px solid transparent;
  transition:transform 160ms var(--ease),border-color 160ms var(--ease)}
.btn:active{transform:translateY(1px)}
.btn-p{background:var(--accent);color:var(--on-accent)}
.btn-s{color:var(--ink);border-color:var(--border);
  /* ★ 샘플의 .btn-s 는 background 선언이 없어 26px 격자선이 버튼 안을 지나간다.
     지면이 격자를 깐 이상 실제로 발생하는 문제라 면을 명시한다. */
  background:var(--paper)}
.btn-s:hover{border-color:var(--ink)}   /* ★ 샘플엔 hover 가 아예 없다 */
.btns{display:flex;flex-wrap:wrap;gap:10px;margin-top:38px;justify-content:center}
/* ★ 좁은 히어로는 이름표가 왼쪽 정렬인데 버튼만 가운데라 어긋난다 — 샘플의 실수 */
.hero.narrow .btns,.shell .btns{justify-content:flex-start}


/* ══ 10. 떠 있는 알약 (순수 장식) ══════════════════════════════════════════
   글자가 하나도 들어가지 않는다. 초기 HTML 을 가리지 않으므로 '스크롤 등장'
   금지에 걸리지 않는다. transform 만 움직여 컴포지터에서 돌고 15~24초로 아주
   느리다. 눈길을 끌면 실패다. 오렌지는 쓰지 않는다 — 오렌지는 행동에만.
   delay 가 전부 0 또는 음수인 것이 중요하다: 음수 delay 는 이미 진행된 상태로
   시작시켜 '등장' 자체를 없앤다. */
.flo{--keep:23.5rem;position:absolute;inset:0;z-index:0;overflow:hidden;
  pointer-events:none}
/* 글자 블록 바깥(--keep)에만 놓는다. 좌표를 손으로 찍으면 화면 폭이 바뀔 때마다
   글자 위로 올라온다 — 19% 잉크라도 본문 대비가 4.5:1 아래로 떨어진다.
   그래서 원점을 화면 왼쪽이 아니라 '가운데'로 두고 밀어내는 방식으로 잡았다. */
.flo>i.l{right:calc(50% + var(--keep) + var(--o))}
.flo>i.r{left:calc(50% + var(--keep) + var(--o))}
.flo>i{position:absolute;top:var(--y);display:block;color:var(--ink);opacity:.19;
  will-change:transform;
  animation:flo var(--d) cubic-bezier(.45,0,.55,1) var(--t) infinite alternate}
.flo>i svg{display:block;width:var(--s);height:auto}
@keyframes flo{
  from{transform:translate3d(0,var(--f0),0) rotate(var(--r0))}
  to{transform:translate3d(0,var(--f1),0) rotate(var(--r1))}}
/* 좁은 화면엔 글자 옆에 자리가 없다. 억지로 두면 본문 위로 올라온다 */
@media(max-width:900px){.flo{display:none}}


/* ══ 11. 셸 · 좌측 레일 ════════════════════════════════════════════════════
   이 묶음에 뭐가 있고 내가 어디인지 항상 보이게 한다.
   .wrap 과 .shell-in 은 같은 요소에 붙는다(class="wrap shell-in"). */
.shell-in{display:grid;gap:40px;align-items:start;padding-bottom:80px}
@media(min-width:1024px){.shell-in{grid-template-columns:14rem minmax(0,1fr);gap:56px}}

.shell .sec{padding:56px 0}
.shell .sec:first-child{padding-top:44px}
.shell .sec+.sec{border-top:0}   /* 아코디언이 이미 아래 선으로 닫힌다 — 이중선 방지 */
/* ★ 샘플은 .shell 안에서 on-surface 배경만 죽이고 자식 반전 규칙은 살려 뒀다.
   결과적으로 흰 밴드가 없는데 카드만 뒤집힌다. 자식 반전도 함께 되돌린다. */
.shell .sec.on-surface{background:none}
.shell .sec.on-surface .card{background:var(--surface)}
.shell .sec.on-surface .related a{background:var(--surface)}
.shell .sec>.wrap{max-width:none;padding-left:0;padding-right:0}
/* 레일 옆에서는 섹션 제목이 히어로만큼 클 이유가 없다 */
.shell .sec>.wrap>h2{font-size:clamp(24px,2.4vw,30px)}
.shell .sec>.wrap>.sub{font-size:18px}
.shell .det{margin-top:34px}

.rail{font-family:var(--f-t);padding-top:44px}
@media(min-width:1024px){
  .rail{position:sticky;top:calc(var(--hdr-h) + 20px);
    max-height:calc(100vh - var(--hdr-h) - 40px);
    overflow-y:auto;overscroll-behavior:contain;padding-bottom:20px}
}
.rail-h{display:flex;align-items:baseline;justify-content:space-between;gap:10px;
  margin:0 0 4px;padding:0 12px 10px;border-bottom:1px solid var(--rule);
  font-size:15px;font-weight:600;color:var(--ink);letter-spacing:-.02em;
  text-decoration:none}
a.rail-h{min-height:48px;align-items:center}
a.rail-h:hover{color:var(--accent-text)}
a.rail-h[aria-current]{box-shadow:inset 2px 0 0 var(--ink)}
/* 허브가 없는 묶음(회사·고객지원·법적 고지)에서는 <p class="rail-h"> 다 —
   문서가 없는 곳에 링크를 만들지 않는다. */
/* ★ .rail-n('문서 N' 개수 배지)은 뺐다. 기획이 항목 수를 검수하려고 잠시
   띄워 둔 확인용 표기였고 확인이 끝났다. 규칙까지 지우는 이유는, 남겨 두면
   다음 사람이 마크업만 되살렸을 때 스타일이 붙어 버려 의도된 것처럼 보이기
   때문이다. build.py 의 rail_html 에도 같은 메모를 남겼다. */
.rail ol{list-style:none;margin:0;padding:0}
.rail a{display:flex;align-items:center;gap:7px;min-height:48px;padding:6px 12px;
  font-size:14px;font-weight:500;line-height:1.4;color:var(--muted);
  text-decoration:none;border-radius:9px}
.rail a:hover{background:var(--dim);color:var(--ink)}
.rail a[aria-current]{background:var(--dim);color:var(--ink);font-weight:600;
  box-shadow:inset 2px 0 0 var(--ink)}
/* 계층 어휘 — rl-0 평면 / rl-1 하위 / rl-2 2차 하위 / rl-g 링크 없는 묶음 라벨.
   사이트맵의 sm-0/1/2/g 와 같은 어휘를 쓴다. */
.rl-1 a{padding-left:20px}
.rl-2 a{padding-left:32px;font-size:13.5px}
.rl-g{padding:16px 12px 4px;font-size:12px;color:var(--subtle)}
/* 긴 글의 소제목 — 지금 문서 밑에만 이어 붙는다(aria-current 가 붙은 li 의 다음 형제) */
.rl-toc>ol{margin:2px 0 6px 26px;padding-left:12px;border-left:1px solid var(--rule)}
.rl-toc a{min-height:48px;padding:4px 10px;font-family:var(--f-b);font-weight:400;
  font-size:13px;color:var(--subtle);line-height:1.45}
.rl-toc a:hover{background:none;color:var(--ink);text-decoration:underline}
.rail-all{display:flex;align-items:center;min-height:48px;margin-top:10px;padding:0 12px;
  border-top:1px solid var(--rule);font-size:13px;color:var(--subtle);text-decoration:none}
.rail-all:hover{color:var(--ink)}
/* <1024px: 레일이 가로 pill 목록으로 접힌다 */
@media(max-width:1023px){
  .rail{padding-top:32px;border-bottom:1px solid var(--rule);padding-bottom:22px}
  .rail>ol{display:flex;flex-wrap:wrap;gap:6px;margin-top:12px}
  .rail>ol>li{flex:0 0 auto}
  .rail>ol>li>a,.rl-1 a,.rl-2 a{min-height:48px;padding:0 14px;
    border:1px solid var(--border);border-radius:99px;font-size:14px}
  .rail a[aria-current]{box-shadow:none;border-color:var(--ink)}
  .rl-g{width:100%;padding:8px 2px 0}
  .rl-toc{width:100%}
  .rl-toc>ol{margin:6px 0 2px}
  .rail-all{display:inline-flex;width:fit-content;margin-top:14px;padding:0 14px;
    border:1px solid var(--border);border-radius:99px}
}

/* ★ 이식하지 않은 것 — .cols / .toc / .toc-in / .crumbs.
   샘플 CSS 에만 있고 마크업 사용처가 0건인 죽은 코드다. .cols/.toc 는 우측 목차
   2단 레이아웃의 잔재인데 좌측 .rl-toc 가 그 역할을 가져갔다 — 되살리면 목차가
   두 번 생긴다. .crumbs 는 .eyebrow 에 밀린 초안이다. */


/* ══ 12. 본문 블록 ═════════════════════════════════════════════════════════ */

/* ── 카드 ─────────────────────────────────────────────────────────────────
   제목이 <strong>, 설명이 <span> 이다 — 헤딩이 아니다. 하위 문서 그리드를
   헤딩 아웃라인에서 빼주는 장치이므로 그대로 유지한다. */
.cards{display:grid;gap:20px;margin-top:52px;list-style:none;padding:0}
@media(min-width:760px){.cards{grid-template-columns:1fr 1fr}}
@media(min-width:1120px){
  .cards.three{grid-template-columns:repeat(3,1fr)}
  /* 3열에서 마지막 카드가 혼자 남는 자리(7·10번째)일 때 2칸을 먹여 빈칸을 없앤다 */
  .cards.three>.card:nth-child(3n+1):nth-last-child(1){grid-column:span 2}
}
.card{background:var(--surface);border:1px solid var(--border);border-radius:20px;
  overflow:hidden;transition:transform 160ms var(--ease),box-shadow 160ms var(--ease)}
.card:hover{transform:translateY(-2px);box-shadow:var(--shadow)}
.card>a{display:block;text-decoration:none;height:100%}  /* 카드 전체가 타깃 */
.card-sh{height:216px;background-color:var(--dim);background-size:cover;
  background-position:top center;border-bottom:1px solid var(--rule);
  -webkit-mask-image:linear-gradient(#000 66%,rgba(0,0,0,.1));
  mask-image:linear-gradient(#000 66%,rgba(0,0,0,.1))}
.card-tx{padding:30px 32px 34px}
.card-tx strong{display:block;font-family:var(--f-t);font-size:23px;font-weight:600;
  letter-spacing:-.03em;line-height:1.3;color:var(--ink)}
.card-tx span{display:block;margin-top:12px;font-size:17px;line-height:1.7;color:var(--muted)}

/* ── 펼치기(아코디언) ─────────────────────────────────────────────────────
   여닫힘은 브라우저 네이티브 <details> 에 전부 맡긴다. JS 0줄.
   각 .det 의 첫 항목만 open — 히어로 보조 CTA 가 그 id 로 점프하므로 이미
   펼쳐진 상태로 착지한다. <details> 는 :target 이 되어도 자동으로 열리지 않으니
   두 번째 이후 항목으로 딥링크를 걸면 닫힌 채 스크롤된다. */
.det{border-top:1px solid var(--rule);margin-top:52px}
.det details{border-bottom:1px solid var(--rule);scroll-margin-top:var(--anchor-offset)}
.det summary{display:flex;align-items:center;justify-content:space-between;gap:24px;
  min-height:84px;padding:16px 0;cursor:pointer;list-style:none;
  font-family:var(--f-t);font-weight:600;font-size:22px;line-height:1.35;
  letter-spacing:-.03em;color:var(--ink)}
/* 마커 제거 3중 안전장치 — display:flex(Chromium/Safari) + list-style:none +
   ::-webkit-details-marker. 구버전 Safari 를 위해 ::marker 도 함께 비운다. */
.det summary::-webkit-details-marker{display:none}
.det summary::marker{content:""}
/* ★★ 샘플의 <summary> 86개는 전부 순수 텍스트 노드다. 우리는 시트 확정 H2 를
   지켜야 하므로 <summary><h2>…</h2></summary> 로 낸다. HTML 명세상 summary 의
   콘텐츠 모델이 phrasing + heading content 라 유효하다. 접이식 UI 와 헤딩
   아웃라인을 동시에 지키는 유일한 방법이다. 아래 3줄이 그 h2 를 summary 에 녹인다:
     font:inherit  — 전역 h1~h4 가 font-size 를 안 정해 UA 기본 1.5em 이 살아
                     22px→33px 로 튄다.
     letter-spacing:inherit — 전역 -.035em vs summary -.03em 이 어긋난다.
     min-width:0   — h2 가 flex 아이템이라 긴 한국어 제목이 셰브런을 밀어낸다.
   ※ 이 h2 안에 <a> 를 넣지 말 것 — summary 안의 링크는 클릭이 충돌한다. */
.det summary>h2{font:inherit;letter-spacing:inherit;color:inherit;margin:0;
  min-width:0;text-wrap:pretty}
/* 셰브런은 ::after 두 변의 45° 회전이다 — 화살표 글리프가 아니라 CSS 도형이라
   텍스트 레이어에 들어가지 않는다(복사·인용·읽기 모드에 안 섞인다). */
.det summary::after{content:"";width:12px;height:12px;flex:none;
  border-right:1.7px solid var(--muted);border-bottom:1.7px solid var(--muted);
  transform:rotate(45deg);margin-right:6px;
  transition:transform 160ms var(--ease)}
.det details[open] summary::after{transform:rotate(225deg)}

.det .inner{padding-bottom:34px;max-width:var(--measure)}
.det .inner>p:first-child{font-size:19px;line-height:1.68;color:var(--ink)}
/* ★ 첫 자식이 <h3> 인 문서(시트 카피에 따라 실제로 있다)에서는 위 리드 규칙이
   안 걸리고 h3 의 margin-top:28px 만 남아 summary 바로 아래가 빈다. */
.det .inner>h3:first-child{margin-top:8px}
.det .inner h3{margin:28px 0 8px;font-size:19px}
.det .inner h4{margin:0 0 8px;font-size:17px}
.det .inner p{color:var(--muted);font-size:17px;line-height:1.72}
.det .inner h3+p,.det .inner h4+p{margin-top:0}
/* 헤딩 위계가 summary(h2) → .inner(h3) → .tile(h4) 로 정확히 이어진다.
   .inner 안에 h2 는 한 번도 오지 않는다. */

/* ── 타일 (h4 가 연달아 오는 구간) ────────────────────────────────────────
   ★ 샘플은 720px 이상에서 무조건 3열이라 타일이 2개면 세 번째 칸이 빈다.
   실제 개수가 2~4로 유동적이므로 auto-fit 으로 바꾼다. */
.tiles{display:grid;gap:14px;margin:22px 0;
  grid-template-columns:repeat(auto-fit,minmax(15rem,1fr))}
.tile{padding:24px;background:var(--dim);border-radius:16px}
.tile h4{font-size:17px;margin-bottom:8px}
.tile p{font-size:16px;line-height:1.66;color:var(--muted)}
.tile p+p{margin-top:8px}   /* ★ 샘플은 두 문단이 붙는다 */

/* ── 읽기용 본문(아티클) ──────────────────────────────────────────────────
   .det 와의 분업: 하위 문서가 남은 허브·기능 페이지는 아코디언, 더 내려갈 곳이
   없는 리프 문서·회사 페이지는 펼친 글. 이쪽은 시트 H2 가 문서 흐름에 그대로
   노출돼 헤딩 검수와 가장 궁합이 좋다. 목차 역할은 레일의 .rl-toc 가 맡는다. */
.body{max-width:var(--measure)}
.body>*+*{margin-top:22px}
.body h2{margin:64px 0 18px;padding-top:24px;border-top:1px solid var(--rule);
  font-size:clamp(25px,2.8vw,31px);line-height:1.28;
  scroll-margin-top:var(--anchor-offset)}
.body h2:first-child{margin-top:0}
.body h2+p{margin-top:0;font-size:19px;line-height:1.68;color:var(--ink)}
.body h3{margin:40px 0 10px;font-size:20px}
.body h4{margin:0 0 8px;font-size:17px}
.body p{color:var(--muted)}
.body h3+p,.body h4+p{margin-top:0}
.body a{color:var(--accent-text);font-weight:500}
/* ★ 샘플의 .body>p:last-child 는 '마지막 문단'을 무조건 잔글씨로 만든다.
   면책 문구가 마지막인 페이지에서는 의도대로지만, 본문 문장이 마지막인 페이지
   에서는 멀쩡한 카피가 14px 회색으로 강등된다. 위치가 아니라 이름으로 잡는다 —
   면책은 .note 클래스로 명시한다(§13). 그 규칙은 여기서 삭제했다. */


/* ══ 13. 문서 하단 · 전환 블록 ═════════════════════════════════════════════ */

/* 이어서 볼 문서 — 위에 붙는 라벨은 .sec-lab(<p>)다. 헤딩이 아니다. */
.related{list-style:none;margin:28px 0 0;padding:0;display:grid;gap:10px}
@media(min-width:760px){.related{grid-template-columns:1fr 1fr}}
.related a{display:flex;align-items:center;justify-content:space-between;gap:16px;
  min-height:56px;padding:0 20px;background:var(--surface);
  border:1px solid var(--border);border-radius:12px;
  font-size:16px;color:var(--ink);text-decoration:none}
.related a:hover{border-color:var(--ink)}
.related .ar{color:var(--accent-text)}   /* 화살표는 텍스트 글리프 + aria-hidden */

/* 다음 문서 — .shell-b 의 마지막 자식. 어떤 .sec 에도 속하지 않는다.
   3줄 + 화살표를 grid-column/row 로 좌표 지정하므로 마크업 순서를 바꿔도 안전하다.
   .nd-t 는 22px 이라 시각적으로 h3 급이지만 <span> 이다 — 헤딩 아님을 유지한다. */
.nextdoc{display:grid;grid-template-columns:1fr auto;align-items:center;gap:6px 16px;
  margin-top:8px;padding:26px 28px;border:1px solid var(--border);border-radius:20px;
  text-decoration:none;background:var(--surface)}
.nextdoc:hover{border-color:var(--ink)}
.nd-l{grid-column:1;font-family:var(--f-b);font-size:13px;color:var(--subtle)}
.nd-t{grid-column:1;grid-row:2;font-family:var(--f-t);font-weight:600;font-size:22px;
  line-height:1.3;color:var(--ink)}
.nd-g{grid-column:1;grid-row:3;font-size:13px;color:var(--subtle)}
.nd-a{grid-column:2;grid-row:1/4;font-size:20px;color:var(--accent-text)}

/* 면책 잔글씨 — 사이트의 모든 면책 문구는 이 한 클래스로 통일한다.
   샘플은 같은 문장을 .note / .det .inner 마지막 p / .body>p:last-child 세 경로로
   다르게 스타일했다. 위치 의존 셀렉터를 없애면 카피가 바뀌어도 깨지지 않는다. */
.note{margin:44px auto 0;padding-top:20px;border-top:1px solid var(--rule);
  font-size:14px;line-height:1.65;color:var(--subtle);max-width:44rem}

/* 스토어 버튼 — 배지 이미지를 쓰지 않아 외부 에셋 의존이 0이다.
   스토어 주소는 심사 통과 후 연결되므로 링크는 자리표시자 규약을 따른다. */
.stores{list-style:none;margin:38px auto 0;padding:0;display:grid;gap:12px;max-width:40rem}
@media(min-width:640px){.stores{grid-template-columns:1fr 1fr}}
.stores a{display:flex;flex-direction:column;justify-content:center;min-height:76px;
  padding:16px 20px;border:1px solid var(--border);border-radius:16px;
  text-decoration:none;text-align:left;background:var(--paper)}
.stores a:hover{border-color:var(--ink)}
.stores strong{font-family:var(--f-t);font-size:16px;font-weight:600;color:var(--ink)}
.stores span{margin-top:2px;font-size:13px;color:var(--subtle)}
/* 자리표시자 상태 — 아직 연결할 주소가 없는 동안 '눌러도 아무 일 없는 링크'가
   되지 않게 한다. 링크가 아니라는 사실을 커서와 대비로 함께 말한다. */
.stores a[aria-disabled="true"]{cursor:default;border-style:dashed;color:var(--subtle)}
.stores a[aria-disabled="true"]:hover{border-color:var(--border)}

/* 마지막 CTA — 히어로와 대칭(격자 배경 + 장식 알약 + 가운데 정렬) */
.cta-f{position:relative;padding:112px 0;border-top:1px solid var(--rule);
  text-align:center;overflow:hidden}
.cta-f h2{font-size:clamp(32px,4.4vw,52px);line-height:1.14}
/* ★ 샘플은 .cta-f p(0,1,1)가 .note(0,1,0)를 이겨 면책 문구가 본문 크기로 나온다.
   :not(.note) 로 좁혀 잔글씨를 되돌린다. */
.cta-f>.wrap>p:not(.note){margin:24px auto 0;color:var(--muted);max-width:34rem;
  font-size:20px;line-height:1.66}

/* 홈: 큰 숫자 — .sec 가 아니라 자체 상하선 + 면을 가진 독립 밴드다.
   숫자는 <strong>, 설명은 <span> — 헤딩 아님. */
.stats{border-top:1px solid var(--rule);border-bottom:1px solid var(--rule);
  background:var(--surface)}
.stats ul{display:grid;list-style:none;margin:0;padding:0}
@media(min-width:800px){
  .stats ul{grid-template-columns:repeat(3,1fr)}
  .stats li+li{border-left:1px solid var(--rule)}
}
@media(max-width:799px){.stats li+li{border-top:1px solid var(--rule)}}
.stats li{padding:64px 28px;text-align:center}
.stats strong{display:block;font-family:var(--f-t);font-size:clamp(46px,6vw,72px);
  font-weight:600;letter-spacing:-.045em;font-variant-numeric:tabular-nums;
  color:var(--ink);line-height:1}
.stats span{display:block;margin-top:16px;font-size:17px;line-height:1.6;color:var(--muted)}


/* ══ 14. 앱 화면 ═══════════════════════════════════════════════════════════
   ★ 샘플은 빈 <div> 에 base64 배경 이미지를 꽂는다. 스타일시트에 이미지가 박혀
   첫 페인트를 막고(샘플 180KB 의 대부분) lazy-load 도 불가능하다. 우리는
   <img src width height loading="lazy" alt=""> 로 내고 여기서는 비율·모서리만
   맡는다. 그러면 아래 .flow 의 특이도 문제도 자연히 사라진다.
   --ar 폴백이 있어 인덱스를 틀려도 레이아웃이 안 깨지고 '조용히 잘리는' 실패가
   되므로, build.py 에서 이미지와 비율의 짝을 강제해야 한다. */
.ph{border-radius:34px;box-shadow:var(--shadow);overflow:hidden;
  background-size:cover;background-position:top center;background-repeat:no-repeat;
  background-color:var(--dim);
  aspect-ratio:var(--ar,344/700)}
.ph img{width:100%;height:100%;object-fit:cover;object-position:top center}

.shot{margin:72px auto 0;max-width:300px}
.shot .ph{width:min(300px,72vw);margin-inline:auto}
.shot figcaption{margin-top:20px;text-align:center;font-size:15px;line-height:1.6;
  color:var(--subtle)}

/* 홈: 흐름 3단계 */
.flow{display:grid;gap:40px;margin-top:88px;align-items:start}
@media(min-width:860px){.flow{grid-template-columns:repeat(3,1fr);gap:44px}}
.flow figure{margin:0}
/* 세 화면의 원본 높이가 달라 흐름 안에서만 높이를 통일하고 아래를 흐리게 끊는다 */
.flow .ph{width:min(272px,100%);margin-inline:auto;aspect-ratio:344/620;
  -webkit-mask-image:linear-gradient(#000 84%,rgba(0,0,0,.06));
  mask-image:linear-gradient(#000 84%,rgba(0,0,0,.06))}
.flow figcaption{margin-top:20px;text-align:center}
.flow b{display:block;font-family:var(--f-t);font-size:22px;font-weight:600;
  letter-spacing:-.03em;color:var(--ink)}
/* ★ 샘플은 .flow span(0,1,1)이 .flow-n(0,1,0)을 덮어 번호 배지의 display·크기·
   여백이 전부 설명 문단 스타일로 바뀐다(원형만 겨우 남는다). 설명 쪽 셀렉터를
   좁혀 배지를 되살린다. */
.flow figcaption>span:not(.flow-n){display:block;margin-top:8px;font-size:16px;
  line-height:1.68;color:var(--muted);max-width:20rem;margin-inline:auto}
.flow .flow-n{display:inline-flex;align-items:center;justify-content:center;
  width:30px;height:30px;margin-bottom:14px;border:1px solid var(--border);
  border-radius:99px;font-family:var(--f-t);font-size:14px;font-weight:600;
  font-variant-numeric:tabular-nums;color:var(--muted)}


/* ══ 15. 그래픽 ════════════════════════════════════════════════════════════
   전부 HTML + CSS 다. SVG 안에 글자를 넣지 않는다 — 이미지 속 문장은 검색·인용·
   스크린리더 어디에도 안 잡힌다. 등장 애니메이션도 없다: 초기 HTML 에 안 보이는
   것은 없는 것이고, 페이지를 열 때마다 보는 그래픽에 모션을 넣으면 느려 보이기만
   한다. 진행 막대·차트·판정은 잉크로 그린다 — 오렌지는 행동에만.
   도해 제목은 <figcaption class="gx-cap"> 이다(헤딩 아님). 샘플이 구조 문구를
   h2 로 낸 것과 정반대인 이 처리가 우리 검수 조건에서 모범이다.
   ★ 배치 규칙: 확정 카피 블록 '안'이 아니라 블록과 블록 '사이'에 형제로 놓는다.
     verify.py 의 텍스트 추출이 태그를 공백 없이 지우므로, 확정 <p> 안에 도해를
     끼우면 그 문단이 두 조각으로 갈라져 '카피 누락'으로 실패한다. */
figure.gx{margin:44px 0 0;padding:0}
.shell figure.gx{margin-top:36px}
.gx-cap{display:flex;flex-wrap:wrap;align-items:baseline;gap:10px;margin-bottom:16px;
  font-family:var(--f-t);font-size:15px;font-weight:600;color:var(--ink)}
/* ★ flex-wrap 은 샘플에 없다. 제목+부연이 한 줄에 강제돼 좁은 폭에서 어긋난다. */
.gx-cap span{font-family:var(--f-b);font-weight:400;font-size:13px;color:var(--subtle)}

/* ── 타임 액시스 — 웹 시그니처. 배경 격자 한 칸이 한 시간이다 ──────────────
   --n:18 = 6시~24시. 컬럼 k 의 시작선이 (5+k)시이고 하단 눈금이 그걸 고정한다.
   격자 주기가 calc(100%/18) 이라 폭이 변해도 '한 칸 = 한 시간'이 항상 참이다. */
.axis{--n:18}
.axis-in{position:relative;padding:16px 0 0;border-top:1px solid var(--border);
  background-image:repeating-linear-gradient(90deg,
    var(--grid) 0 1px,transparent 1px calc(100%/var(--n)))}
.axis-row{display:grid;grid-template-columns:repeat(var(--n),1fr);list-style:none;
  margin:0;padding:0;align-items:start}
.axis-row>li{grid-row:1;grid-column:var(--a)/var(--b);padding-right:12px;
  border-left:2px solid var(--ink);padding-left:11px;min-width:0}
.as-h{margin:0;font-family:var(--f-t);font-size:14px;font-weight:600;color:var(--ink);
  line-height:1.35}
.as-h span{display:block;font-family:var(--f-b);font-weight:400;font-size:12px;
  color:var(--subtle)}
.as-l{list-style:none;margin:10px 0 0;padding:0}
.as-l li{font-size:13px;line-height:1.75;color:var(--muted)}
.axis-sc{display:grid;grid-template-columns:repeat(var(--n),1fr);list-style:none;
  margin:18px 0 0;padding:8px 0 0;border-top:1px solid var(--rule)}
.axis-sc li{grid-row:1;grid-column:var(--a)/span 1;font-family:var(--f-b);font-size:12px;
  color:var(--subtle);font-variant-numeric:tabular-nums}
/* ★ 붕괴 기준을 샘플의 719px 에서 899px 로 올렸다. 720~900px 구간에서 2칸짜리
   슬롯의 가용폭이 ≈48px 인데 word-break:keep-all 이라 한국어 어절이 안 끊겨
   옆 컬럼으로 삐져나온다(overflow 처리도 없다). 격자가 없어지는 대신 슬롯
   이름('기상' '아침 식후')이 시간을 대신 말하도록 카피가 설계돼 있어 성립한다. */
@media(max-width:899px){
  .axis .gx-cap span{display:none}   /* 격자가 없는데 '격자 한 칸'이라 하면 거짓말이다 */
  .axis-in{background-image:none;border-top:0;padding-top:0}
  .axis-row{display:block}
  .axis-row>li{padding:0 0 0 13px;margin-bottom:20px}
  .axis-sc{display:none}
}

/* ── 공복 · 식사 · 식후 ───────────────────────────────────────────────────
   가운데 '식사'가 세로쓰기 축선이 된다. 축은 CSS border 이고 글자는 진짜 텍스트다. */
.split{display:grid;gap:14px;grid-template-columns:1fr}
@media(min-width:640px){.split{grid-template-columns:1fr auto 1fr;align-items:stretch}}
.split>li{list-style:none;padding:20px 22px;border:1px solid var(--rule);
  border-radius:16px;background:var(--surface)}
/* .split .meal(0,2,0)이 .split>li(0,1,1)를 이겨 '카드가 아닌 li' 로 되돌린다 */
.split .meal{display:flex;align-items:center;justify-content:center;padding:20px 18px;
  border:0;background:none;font-family:var(--f-t);font-weight:600;font-size:14px;
  color:var(--ink)}
@media(min-width:640px){
  .split .meal{border-left:2px solid var(--ink);border-radius:0;
    writing-mode:vertical-rl;text-orientation:mixed;letter-spacing:.08em}
}
.split b{display:block;font-family:var(--f-t);font-size:15px;font-weight:600;color:var(--ink)}
.split ul{list-style:none;margin:10px 0 0;padding:0}
.split ul li{font-size:14px;line-height:1.8;color:var(--muted)}

/* ── 시간 띄우기 ──────────────────────────────────────────────────────────
   가운데 칸의 경계가 논리 축으로 뒤집힌다: 세로 스택에선 위아래 실선(구분),
   가로 띠에선 좌우 파선(틈). 파선이 '띄운다'는 의미를 직접 나른다.
   gap:0 + overflow:hidden 이라 세 칸이 하나의 연속된 띠로 읽힌다 — gap 을 주면
   '세 개의 카드'가 되어 주제와 충돌한다. */
.gapx{display:grid;grid-template-columns:1fr;gap:0;align-items:center;
  border:1px solid var(--rule);border-radius:16px;background:var(--surface);
  overflow:hidden}
@media(min-width:640px){.gapx{grid-template-columns:1fr auto 1fr}}
.gapx>*{padding:20px 22px;font-family:var(--f-t);font-size:15px;font-weight:600;
  color:var(--ink)}
.gapx .mid{background:var(--dim);text-align:center;border-block:1px solid var(--rule)}
@media(min-width:640px){.gapx .mid{border-block:0;border-inline:1px dashed var(--border)}}
/* 파선은 실선보다 잉크가 적어 더 진해야 보인다 — 여기만 --border 를 쓰는 이유다 */
.gapx .mid b{display:block;font-size:20px;letter-spacing:-.03em}
.gapx .mid span{display:block;margin-top:2px;font-family:var(--f-b);font-weight:400;
  font-size:13px;color:var(--subtle)}
.gapx .end{color:var(--muted);font-weight:500}
@media(min-width:640px){.gapx .end:last-child{text-align:right}}

/* ── 권장량 · 상한량 — 진행 막대는 잉크로 그린다 ──────────────────────────
   왼쪽은 채운 막대, 오른쪽은 테두리만 있는 빈 막대. '채워진 값'과 '넘으면 안 되는
   경계'를 색조 없이 채움 여부로만 구분한다.
   ★ 샘플 수정 2건:
     (1) 5fr:4fr → 1fr:1fr. 두 막대가 같은 수평선에 나란히 놓여 길이 비교가 즉시
         일어나므로, 권장량 칸이 더 길면 '권장량 > 상한량'이라는 거짓 진술이 된다.
         카피는 못 바꾸니 기하를 고친다 — 길이를 같게 해 '길이 = 데이터'라는
         오독 자체를 차단하는 쪽이 가장 안전하다.
     (2) 좌측 2px 선의 --risk(#A8221B) → --ink. 팔레트 밖 색이고, 이 선은 정보를
         단독으로 나르지 않는다('상한섭취량' 라벨이 의미를 100% 담당). 대비는
         7.22:1 → 18.57:1 로 오히려 오른다. */
.capx{border:1px solid var(--rule);border-radius:16px;background:var(--surface);
  overflow:hidden}
.capx-bar{display:grid;grid-template-columns:1fr;list-style:none;margin:0;padding:0}
@media(min-width:640px){.capx-bar{grid-template-columns:1fr 1fr}}
.capx-bar>li{padding:22px 24px}
.capx-bar>li+li{border-top:1px solid var(--rule)}
@media(min-width:640px){.capx-bar>li+li{border-top:0;border-left:2px solid var(--ink)}}
.capx-bar b{display:flex;align-items:center;gap:8px;font-family:var(--f-t);
  font-size:16px;font-weight:600;color:var(--ink)}
.capx-bar p{margin:8px 0 0;font-size:14px;line-height:1.7;color:var(--muted)}
.capx-bar .lv{display:block;height:6px;margin-bottom:16px;border-radius:99px;
  background:var(--ink)}
.capx-bar>li+li .lv{background:var(--dim);border:1px solid var(--border)}

/* ── 겹침 합산 — 여러 제품의 같은 성분이 한 줄로 모인다 ────────────────────
   위계를 테두리 명도로만 만든다: 입력 카드는 --rule(1.45:1), 출력 상자는
   --ink(18.57:1). 같은 1px 인데 입력/출력이 즉시 읽힌다. 배경색·오렌지·그림자 0. */
.mrg-src{display:grid;gap:12px;grid-template-columns:1fr;list-style:none;margin:0;padding:0}
/* ★ 샘플은 repeat(3,1fr) 하드코딩이다. .steps 가 --c 를 쓰는 것과 맞춰 일반화한다. */
@media(min-width:640px){.mrg-src{grid-template-columns:repeat(var(--n,3),1fr)}}
.mrg-src>li{padding:16px 18px;border:1px solid var(--rule);border-radius:14px;
  background:var(--surface)}
/* 카드 제목 자리인데 <p> + 12px + --subtle 이다 — '이건 제목이 아니라 꼬리표'라고
   타이포로 말한다. 시트에 없는 문구를 헤딩 아닌 채로 내는 표준값이고,
   .pairs .k 가 같은 스펙을 공유한다. */
.mrg-k,.pairs .k{font-family:var(--f-b);font-size:12px;color:var(--subtle)}
.chips{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0 0;padding:0;list-style:none}
/* 칩은 표시 전용이다. 절대 <a> 로 만들지 말 것 — 링크가 되는 순간 28px 짜리
   터치 타깃 위반이 된다. */
.chips li{display:inline-flex;align-items:center;gap:6px;padding:5px 11px;
  border:1px solid var(--border);border-radius:99px;font-family:var(--f-t);
  font-size:13.5px;font-weight:600;color:var(--ink)}
/* 연결자 — 보통 ↓ 아이콘을 넣는 자리에 완결된 문장을 놓고 선만 의사요소로 그었다.
   그래서 '제품 셋을 합치면 하루 총량이 된다'는 명제가 인용 가능한 형태로 남는다.
   이 한 줄이 '이미지 속 글자 금지' 원칙 전체를 요약한다. */
.mrg-j{display:flex;align-items:center;justify-content:center;gap:10px;
  padding:14px 0 2px;font-family:var(--f-b);font-size:13px;color:var(--subtle)}
.mrg-j::before,.mrg-j::after{content:"";flex:1;height:1px;background:var(--rule)}
.mrg-out{padding:18px 20px;border:1px solid var(--ink);border-radius:14px;
  background:var(--surface)}
/* 같은 .chips 가 문맥만으로 크기를 바꾼다 — 자식 클래스를 늘리지 않는다 */
.mrg-out .chips li{padding:7px 13px;font-size:14.5px}
.mrg-out .chips b{font-family:var(--f-b);font-weight:400;font-size:12px;color:var(--subtle)}
/* 겹친 성분 강조를 색조 없이 2겹 잉크 링으로만 낸다 — 색맹·흑백 인쇄에서도 산다 */
.mrg-out .chips .dup{border-color:var(--ink);box-shadow:inset 0 0 0 1px var(--ink)}
.mrg-out .chips .dup b{color:var(--ink)}

/* ── 회차 띠 — 상태는 색이 아니라 글자로 ──────────────────────────────────
   5개 상태에 색조를 하나도 쓰지 않는다. 축은 (1) 막대 높이 0/14/30px,
   (2) 채움 solid vs 빈속 ring, (3) 테두리 실선 vs 파선, (4) 셀 배경, (5) 라벨 텍스트.
   빠진 회차를 붉게 칠하지 않는다는 카피의 주장을 도해가 스스로 실행한다.
   .c::before 는 공통 규칙에 height 가 없다 — skip/soon 은 높이 0 이라 안 보인다.
   '없음'을 별도 규칙 없이 표현하는 장치다. */
.trk{display:grid;grid-template-columns:repeat(7,1fr);gap:6px;list-style:none;
  margin:0;padding:0}
.trk>li{display:flex;flex-direction:column;gap:8px;min-width:0}
.trk .d{font-family:var(--f-b);font-size:12px;color:var(--subtle);text-align:center}
/* 셀 테두리는 실선/파선이 상태를 나르므로 장식이 아니다 → --border(3:1 이상) */
.trk .c{display:flex;align-items:flex-end;justify-content:center;height:56px;
  padding-bottom:8px;border:1px solid var(--border);border-radius:10px;
  background:var(--paper)}
.trk .c::before{content:"";width:60%;border-radius:3px}
.trk .s{font-family:var(--f-t);font-size:11.5px;font-weight:600;color:var(--muted);
  text-align:center;line-height:1.3;word-break:keep-all}
.trk .done .c{border-color:var(--ink)}
.trk .done .c::before{height:30px;background:var(--ink)}
.trk .part .c::before{height:14px;background:var(--ink)}   /* 30:14 ≈ 2:1 = '절반쯤' */
.trk .late .c{border-color:var(--ink);border-style:dashed}
.trk .late .c::before{height:30px;background:none;box-shadow:inset 0 0 0 2px var(--ink);
  border-radius:3px}                                        /* 했지만 제때는 아니다 */
.trk .skip .c{border-style:dashed}
.trk .soon .c{background:var(--dim)}
.trk .done .s,.trk .late .s{color:var(--ink)}               /* '한 것'이 더 진하다 */
/* ★ 샘플은 여기만 max-width:640px 을 써서, 정확히 640px 폭에서 이 도해는 모바일
   4열인데 옆의 .split/.gapx/.capx/.mrg-src/.pairs 는 데스크톱 다열이 된다. */
@media(max-width:639.98px){
  .trk{grid-template-columns:repeat(4,1fr);gap:8px}
  .trk .c{height:46px}
  .trk .s{font-size:11px}
}

/* ── 단계 레일 — 아코디언 안으로 바로 들어가는 번호 목차 ──────────────────
   도해 15종 중 유일하게 포커스 가능한 요소를 갖는다. 실측 높이 ≈94px 로 터치
   타깃 충족. 번호는 CSS counter 라 항목을 추가·삭제해도 자동으로 맞고, 텍스트
   레이어에 안 들어가 인용·검수에 걸리지 않는다(부모가 <ol> 이라 스크린리더에는
   순서가 그대로 전달된다 — 이중 안전장치).
   ★ 카피 주의: 샘플은 여기 라벨을 대응 <summary> 의 앞머리('하나,')를 떼어 썼다.
   시트 카피를 잘라 쓰는 것이므로 우리는 summary 원문을 그대로 넣는다. */
.steps{counter-reset:st;display:grid;gap:10px;list-style:none;margin:0;padding:0}
@media(min-width:820px){.steps{grid-template-columns:repeat(var(--c,4),1fr)}}
.steps>li{counter-increment:st}
.steps a{display:flex;flex-direction:column;gap:10px;height:100%;padding:18px 20px;
  border:1px solid var(--border);border-radius:16px;background:var(--surface);
  text-decoration:none;transition:border-color 160ms var(--ease)}
.steps a:hover{border-color:var(--ink)}
.steps a::before{content:counter(st);display:flex;align-items:center;
  justify-content:center;width:26px;height:26px;border:1px solid var(--ink);
  border-radius:99px;font-family:var(--f-t);font-size:13px;font-weight:600;
  color:var(--ink);font-variant-numeric:tabular-nums}
.steps b{font-family:var(--f-t);font-size:16px;font-weight:600;line-height:1.4;
  color:var(--ink);word-break:keep-all}

/* ── 같이 둘 짝 · 갈라둘 짝 ───────────────────────────────────────────────
   태그 스타일은 동일하고 구분자 <i>·</i> 하나가 '한 묶음'과 '갈라진 둘'을 가른다.
   판정을 초록/빨강으로 칠하지 않는다 — 색이 아니라 문장으로 낸다. */
.pairs{display:grid;gap:14px;list-style:none;margin:0;padding:0}
@media(min-width:640px){.pairs{grid-template-columns:1fr 1fr}}
.pairs>li{padding:22px 24px;border:1px solid var(--rule);border-radius:16px;
  background:var(--surface)}
.pairs .v{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-top:10px}
.pairs .v span{padding:6px 12px;border:1px solid var(--border);border-radius:99px;
  font-family:var(--f-t);font-size:14px;font-weight:600;color:var(--ink)}
.pairs .v i{font-style:normal;color:var(--subtle)}
.pairs p{margin:12px 0 0;font-size:14px;line-height:1.7;color:var(--muted)}


/* ══ 16. 사이트맵 ══════════════════════════════════════════════════════════
   레일 대신 표 6개로 전체를 편다. sm-0/1/2/g 는 레일의 rl-0/1/2/g 와 같은
   계층 어휘다. 여기 <h2> 는 시트의 묶음 이름 그대로라 정당한 헤딩이다 — 내리지 않는다.
   ★ .sm-n(묶음별 '문서 N' 배지)은 뺐다 — .rail-n 과 같은 판단이다. 기획이
   항목 수를 검수하려고 띄워 둔 확인용 표기였고 확인이 끝났다. 규칙까지 지우는
   이유는, 남겨 두면 다음 사람이 마크업만 되살렸을 때 스타일이 붙어 의도된
   것처럼 보이기 때문이다. h1 의 '문서 33개'는 시트 카피라 그대로 둔다. */
.sm+.sm{margin-top:56px}
.sm h2{font-size:22px}
.sm table{width:100%;border-collapse:collapse;margin-top:14px;text-align:left}
.sm th,.sm td{padding:14px 0;border-top:1px solid var(--rule);vertical-align:baseline}
.sm th{width:34%;font-family:var(--f-t);font-size:16px;font-weight:600}
.sm td{color:var(--muted);font-size:15px;line-height:1.6;padding-left:20px}
/* ★ 샘플은 min-height 가 없어 링크 높이가 글자 높이(≈24px)다. 사이트맵은 링크
   밀도가 가장 높은 페이지라 여기서 걸리면 가장 눈에 띈다. */
.sm a{display:inline-flex;align-items:center;gap:8px;min-height:48px;
  color:var(--ink);text-decoration:none}
.sm a:hover{color:var(--accent-text);text-decoration:underline}
.sm-1 th{padding-left:16px}
.sm-2 th{padding-left:32px;font-weight:500;font-size:15px}
.sm-g th{padding-top:22px;border-top:1px solid var(--rule);font-family:var(--f-b);
  font-size:12px;font-weight:500;color:var(--subtle)}
/* ★ 샘플에 반응형 규칙이 아예 없다. 34%/66% 고정이라 320px 에서 좌측 열이 108px 로
   짜부라져 '개인정보처리방침' 같은 이름이 4줄로 쪼개진다. 좁은 폭은 행을 세운다. */
@media(max-width:639.98px){
  .sm table,.sm tbody,.sm tr,.sm th,.sm td{display:block;width:auto}
  .sm tr{border-top:1px solid var(--rule);padding:10px 0}
  .sm th,.sm td{border-top:0;padding:0}
  .sm td{padding-left:0;margin-top:2px}
  .sm-1 th{padding-left:14px}
  .sm-2 th{padding-left:28px}
}


/* ══ 17. 푸터 ══════════════════════════════════════════════════════════════
   ★ 클래스 없이 <footer> 태그 셀렉터로 스타일한다 — verify.py 가 리터럴 문자열
   "<footer>" 를 전 페이지에서 요구하므로 class 를 붙이면 33페이지가 전부 실패한다.
   margin-top:auto 는 body 의 flex column + min-height:100vh 를 전제한다(§3). */
footer{margin-top:auto;border-top:1px solid var(--rule)}
.ftr-in{padding-top:56px;padding-bottom:56px}

/* 전체 문서 배너 — 푸터 요소 중 유일하게 터치 타깃이 넉넉하다.
   '만질 수 있는 것의 경계'라 선을 --border 로 올린다. */
.ftr-map{display:flex;align-items:center;gap:12px;min-height:60px;margin-bottom:36px;
  padding:0 22px;border:1px solid var(--border);border-radius:14px;
  text-decoration:none;font-family:var(--f-t);color:var(--ink)}
.ftr-map:hover{border-color:var(--ink)}
.ftr-map-a{margin-left:auto;color:var(--accent-text)}

.ftr-cols{display:grid;gap:32px}
@media(min-width:640px){.ftr-cols{grid-template-columns:1fr 1fr}}
@media(min-width:1024px){.ftr-cols{grid-template-columns:repeat(4,1fr)}}
/* ★★ 샘플은 묶음명 4개를 <h2> 로 냈다. 시트에 없는 텍스트가 33페이지 전부에서
   반복되므로 헤딩 대조가 전 페이지에서 깨진다 — .sec-lab 과 같은 유형의 사고다.
   <p class="ftr-h"> 로 낸다. <nav aria-label> 이 이미 같은 문자열로 묶음 이름을
   노출하므로 접근성 손실은 없다. */
.ftr-h{font-family:var(--f-b);font-size:13px;font-weight:500;color:var(--subtle);margin:0}
footer ul{list-style:none;margin:10px 0 0;padding:0}
footer ul a{display:flex;align-items:center;min-height:48px;font-size:15px;
  color:var(--muted);text-decoration:none}
footer ul a:hover{color:var(--ink)}

/* 브랜드명은 <strong> 이다 — 헤딩 아웃라인을 오염시키지 않는 올바른 처리라 그대로 채택 */
.ftr-legal{margin-top:40px;padding-top:20px;border-top:1px solid var(--rule)}
.ftr-legal strong{display:flex;align-items:center;gap:9px;font-family:var(--f-t);
  font-size:15px;font-weight:600;color:var(--ink)}
.ftr-legal strong img{height:18px;width:auto}
.ftr-legal p{margin:10px 0 0;font-size:13px;line-height:1.7;color:var(--subtle);
  max-width:52rem}
/* 미확정 값(사업자등록번호 등)은 자리표시자 형식을 유지한다 — 실값처럼 박아 두면
   검수도 못 잡고 그대로 배포된다. */


/* ══ 18. 좁은 폭 일괄 축소 ═════════════════════════════════════════════════
   컴포넌트별 분기는 각 절에 있다. 여기는 '세로 리듬만 줄이는' 규칙 모음이라
   맨 뒤에 두어 앞의 기본값을 이긴다. */
@media(max-width:640px){
  .hero{padding:60px 0 72px}
  .sec{padding:72px 0}
  .cta-f{padding:80px 0}
  .shot{margin-top:52px}
  .flow{margin-top:60px}
  .stats li{padding:44px 24px}
  .body h2{margin-top:48px}
  .det summary{min-height:72px;font-size:19px}
  .facts{font-size:14px}
  .facts li{padding:0 11px}
}
@media(max-width:600px){
  .btns{flex-direction:column;align-items:stretch}
  /* ★ 샘플은 .btn{width:100%} 을 전역으로 걸어 .btns 밖의 버튼(.mdl a 등)까지
     늘렸다. 범위를 .btns 안으로 좁힌다. */
  .btns .btn{width:100%}
}


/* ══ 19. 모션 · 감축모션 · 강제 색상 ═══════════════════════════════════════
   이 파일의 모션은 셋뿐이다: .btn:active 의 1px 하강, hover 시 border-color,
   .det 셰브런 회전, 그리고 장식 알약(.flo). 전부 transform/색 속성이라
   레이아웃을 다시 계산하지 않는다.
   감축모션 블록은 반드시 파일 최하단에 온다 — 나중 선언이 이긴다. */
@media(prefers-reduced-motion:reduce){
  *,*::before,*::after{
    animation-duration:.01ms!important;animation-iteration-count:1!important;
    transition-duration:.01ms!important;scroll-behavior:auto!important}
  html{scroll-behavior:auto}
  .flo>i{animation:none;transform:none}
}

/* 강제 색상 모드(Windows 고대비) — 배경·테두리가 시스템 색으로 치환되면서
   '면으로만 구분되던 것'이 사라진다. 잉크 링으로 그린 강조(.dup)와 상태 막대는
   currentColor 로 되살린다. .btn 의 투명 1px 테두리가 여기서 값을 한다. */
@media (forced-colors:active){
  .btn,.card,.related a,.nextdoc,.steps a,.ftr-map,.dp-in,.mpanel,.trk .c{
    border-color:currentColor}
  .mrg-out .chips .dup{outline:2px solid currentColor;outline-offset:-2px}
  .capx-bar .lv,.trk .c::before{forced-color-adjust:none}
  .drop-t[aria-current],.rail a[aria-current]{outline:2px solid currentColor;
    outline-offset:-2px}
}

/* ══ 20. 검수 계약 · 누락 보완 ═══════════════════════════════════════════════
   19절까지가 샘플 이식분이고, 여기부터는 우리 저장소 사정으로 추가한 것들이다.
   섞어 두면 "샘플에 이런 게 있었나" 하고 되짚게 되므로 따로 뺐다. */

/* ── .facts 구분자 — 장식이 아니라 검수 계약이다 ───────────────────────────
   시트의 metrics 줄은 "사진 한 장 · 30초 · 탭 한 번" 처럼 가운뎃점으로 이어진
   한 문자열이고, verify.py 는 태그를 지운 평문에서 이 문자열을 통째로 찾는다.
   .facts 는 이걸 li 로 끊어 보여주는데, 끊기만 하면 평문에서 ' · ' 가 사라져
   확정 카피가 깨진다. 그래서 li 사이에 <i class="facts-s"> · </i> 를 넣어
   평문을 원문 그대로 복원하고, 화면에서는 숨긴다(경계선은 li+li 의 border 가 그린다).
   ★ display:none 을 지우면 가운뎃점이 두 번 보인다. 지우지 말 것.
   ★ 이 <i> 를 마크업에서 빼면 verify.py 가 "카피 누락" 으로 잡는다. */
.facts-s{display:none}

/* 항목이 하나뿐인 페이지 — 구분선이 그릴 이웃이 없다. 가운데 정렬만 유지한다. */
.facts.facts-1 li{padding-inline:0}

/* ── 최종 CTA 밴드 제목 ────────────────────────────────────────────────────
   시트 헤딩 목록에 없는 페이지에서는 h2 로 낼 수 없다(32/34 페이지가 불일치가 난다).
   샘플의 .cta-f h2 와 시각적으로 같되 태그만 p 인 짝이다. */
.cta-f-t{font-family:var(--f-t);font-weight:600;font-size:clamp(32px,4.4vw,52px);
  line-height:1.14;letter-spacing:var(--ls-head);color:var(--ink);margin:0}

/* ── 산문 목록 ─────────────────────────────────────────────────────────────
   샘플에는 ul/ol 규칙이 아예 없다. 샘플 본문에 목록이 없었기 때문인데,
   우리 방침 문서에는 있다 — content/terms.html 29개, content/privacy.html 49개.
   규칙이 없으면 브라우저 기본 40px 들여쓰기가 걸려 본문 좌측선이 어긋난다. */
.body ul,.body ol,.det .inner ul,.det .inner ol{margin:0;padding-left:22px}
.body li,.det .inner li{font-size:16.5px;line-height:1.78;color:var(--muted);margin-bottom:7px}
.body li:last-child,.det .inner li:last-child{margin-bottom:0}
.body li::marker,.det .inner li::marker{color:var(--subtle)}
/* 중첩 목록은 한 단만 더 들어간다 */
.body li>ul,.body li>ol,.det .inner li>ul,.det .inner li>ol{margin-top:7px;padding-left:18px}

/* ── 스토어 링크 준비 중 ───────────────────────────────────────────────────
   URL 이 확정되기 전에는 <a href> 가 아니라 <span aria-disabled="true"> 다.
   링크로 두면 눌렀을 때 /download/%7B%7BAPP_STORE_URL%7D%7D 404 로 간다. */
.stores span[aria-disabled="true"]{display:flex;flex-direction:column;justify-content:center;
  min-height:76px;padding:16px 20px;border:1px solid var(--border);border-radius:16px;
  text-align:left;opacity:.55;cursor:default}
.stores span[aria-disabled="true"] strong{font-family:var(--f-t);font-size:16px;
  font-weight:600;color:var(--ink)}
.stores span[aria-disabled="true"] span{margin-top:2px;font-size:13px;color:var(--subtle)}

/* ── 스킵 링크 ─────────────────────────────────────────────────────────────
   샘플에는 없다. 키보드 사용자가 전 페이지 반복되는 헤더 내비를 건너뛰는 통로다. */
.skip{position:absolute;left:-9999px;top:0;z-index:200}
.skip:focus{left:var(--gutter);top:8px;display:inline-flex;align-items:center;
  min-height:48px;padding:0 18px;border-radius:10px;background:var(--ink);
  color:var(--surface);font-family:var(--f-t);font-weight:600;text-decoration:none}
/* 스킵 대상. 프로그램적 포커스인데 일부 브라우저가 :focus-visible 을 띄워
   본문 전체에 링을 그린다. */
main[tabindex="-1"]:focus,main[tabindex="-1"]:focus-visible{outline:none}


/* ── 자주 묻는 질문 (handoff-package 3 개정 기획본) ─────────────────────────
   기존 .det 아코디언을 그대로 쓰되 한 단 작다 — 본문 아코디언이 문서의 뼈대이고
   FAQ 는 그 뒤에 붙는 보조라, 같은 크기로 두면 어느 쪽이 본문인지 흐려진다.
   ★ 제목은 p.sec-lab 이다. 샘플의 <h2>자주 묻는 질문</h2> 을 그대로 쓰면
     시트에 없는 헤딩이 36페이지에 생겨 검수가 전부 깨진다. */
.faq-s{background:var(--surface)}
.shell .faq-s{background:none;border-top:1px solid var(--rule)}
.det.faq{margin-top:26px}
.det.faq summary{min-height:68px;font-size:19px}
.det.faq .inner>p:first-child{font-size:17px}

/* ── 브랜드 마크 ───────────────────────────────────────────────────────────
   handoff-package 3 / 05-logo-spec: Logo B 단색 확정. 배경별 3종만 쓴다
   (흰 바탕→오렌지 · 오렌지 바탕→흰색 · 잉크 바탕→오렌지).
   ★ 하지 않는 것: 그라데이션 되돌리기 · 갭 없애기 · 늘리기/기울이기/회전 ·
     그림자/외곽선/광택 · 오렌지 외의 색으로 칠하기.
   ★ 최소 28px — 그 아래로는 두 조각을 가르는 갭이 메워져 한 덩어리로 보인다. */
.brand img{height:26px;width:auto;display:block}
.ftr-legal strong img{height:22px;width:auto}

/* ── 알약 커서 (SoundsBody_web CustomCursor 와 같은 값) ────────────────────
   브랜드 문서 10h "캡슐, 반은 듣고 반은 실행" · 11a 기울기.
   마우스가 있는 기기에서만 site.js 가 html.has-custom-cursor 를 켠다.
   위치는 JS 가 transform 으로 바로 넣고, 크기·쪼개짐만 CSS transition 이다. */
html.has-custom-cursor,
html.has-custom-cursor *{cursor:none}
#sb-cursor{
  position:fixed;left:0;top:0;z-index:9999;pointer-events:none;
  width:0;height:0;overflow:visible;will-change:transform}
#sb-cursor[hidden]{display:none}
.sb-cursor-plate{
  position:absolute;width:46px;height:46px;left:-23px;top:-23px;
  border-radius:50%;background:var(--paper);
  box-shadow:0 0 0 1px rgba(255,255,255,.92),0 0 0 2.2px rgba(0,0,0,.62),
    0 3px 12px rgba(0,0,0,.32);
  transform:scale(.74);opacity:1;
  transition:transform 260ms var(--ease),opacity 260ms var(--ease);
  will-change:transform,opacity}
#sb-cursor[data-cursor-variant="link"] .sb-cursor-plate,
#sb-cursor[data-cursor-variant="view"] .sb-cursor-plate,
#sb-cursor[data-cursor-variant="drag"] .sb-cursor-plate{transform:scale(1)}
#sb-cursor[data-cursor-pressed="true"] .sb-cursor-plate{transform:scale(.7178)}
#sb-cursor[data-cursor-variant="link"][data-cursor-pressed="true"] .sb-cursor-plate,
#sb-cursor[data-cursor-variant="view"][data-cursor-pressed="true"] .sb-cursor-plate,
#sb-cursor[data-cursor-variant="drag"][data-cursor-pressed="true"] .sb-cursor-plate{
  transform:scale(.97)}
#sb-cursor[data-cursor-variant="hidden"] .sb-cursor-plate{transform:scale(0);opacity:0}
.sb-cursor-pill{
  position:absolute;left:0;top:0;
  transform:rotate(17deg) scale(.88);
  transition:transform 260ms var(--ease);will-change:transform}
#sb-cursor[data-cursor-variant="link"] .sb-cursor-pill,
#sb-cursor[data-cursor-variant="view"] .sb-cursor-pill,
#sb-cursor[data-cursor-variant="drag"] .sb-cursor-pill{
  transform:rotate(17deg) scale(1.25)}
#sb-cursor[data-cursor-variant="hidden"] .sb-cursor-pill{
  transform:rotate(17deg) scale(0)}
.sb-cursor-half{
  position:absolute;width:10px;height:9.5px;top:-4.75px;
  transition:transform 180ms var(--ease);will-change:transform}
.sb-cursor-left{
  left:-10px;background:var(--accent);border-radius:99px 0 0 99px;
  transform-origin:100% 50%}
.sb-cursor-right{
  left:0;border:1.8px solid var(--accent);border-left-width:0;
  border-radius:0 99px 99px 0;transform-origin:0 50%}
#sb-cursor[data-cursor-pressed="true"] .sb-cursor-left{
  transform:rotate(27deg) translateX(-1px)}
#sb-cursor[data-cursor-pressed="true"] .sb-cursor-right{
  transform:rotate(-27deg) translateX(1px)}
.sb-cursor-label{
  position:absolute;left:0;top:34px;transform:translateX(-50%);
  white-space:nowrap;font-size:11px;font-weight:500;color:var(--accent-text)}
@media(prefers-reduced-motion:reduce){
  html.has-custom-cursor,html.has-custom-cursor *{cursor:auto}
  #sb-cursor{display:none!important}
}
