/* ============================================================
   CORALHAZE — Shade Intelligence Commerce
   FreeT Ocean · 개발 프로토타입
   외부 폰트/스크립트 없음(오프라인·CSP 안전). 색은 브랜드 자산에서 추출.
   ============================================================ */

/* ── 본문 서체 : KoPub돋움 ─────────────────────────────
   원본 TTF 14.8MB → 한글 전체를 담은 WOFF2 653KB (95.7% 감소).
   swap 이므로 폰트를 받는 동안에도 글자가 먼저 보인다(빈 화면 없음).
   제목(--serif)은 손대지 않는다. */
@font-face{font-family:'KoPub Dotum';font-style:normal;font-weight:300;font-display:swap;
  src:url('../assets/fonts/kopub-dotum-300.woff2') format('woff2')}
@font-face{font-family:'KoPub Dotum';font-style:normal;font-weight:500;font-display:swap;
  src:url('../assets/fonts/kopub-dotum-500.woff2') format('woff2')}
@font-face{font-family:'KoPub Dotum';font-style:normal;font-weight:700;font-display:swap;
  src:url('../assets/fonts/kopub-dotum-700.woff2') format('woff2')}

/* ── 손글씨 : 나눔손글씨 펜 ─────────────────────────────
   히어로 한 줄과 체험 표지에만 쓴다. 그래서 «그 문장에 쓰이는 글자»만 담았다 —
   3.2MB TTF → **3.9KB WOFF2**. 본문에 쓰면 글자가 없어서 통째로 대체된다.

   ★ 담긴 글자는 이것뿐이다 :  나만의 색을 찾아줘  /  Find the colour that is mine
     문구를 고치면 폰트도 다시 잘라야 한다. 안 자르면 새 글자가 대체 서체로
     나와 한 줄 안에서 서체가 섞인다.

     다시 자르는 법 (fontTools) :
       python -c "from fontTools import subset; subset.main(['nanum-pen-full.ttf',
         '--text=<새 문구>','--flavor=woff2','--output-file=nanum-pen.woff2',
         '--layout-features=','--no-hinting','--desubroutinize'])"

   ★ 라이선스 — Google Fonts 배포본(SIL OFL). 임베딩·상업사용이 허용된 계열이라
     골랐다. 시스템 폰트(맑은고딕·굴림 등)는 배포본에 박으면 위반이다.
     다만 브랜드 자산으로 확정하기 전에 사람이 한 번 확인할 일이다(B-13 옆).

   ★ 붓 서체도 같이 잘라 두었다 — assets/fonts/nanum-brush.woff2 (4.6KB).
     바꾸려면 아래 url 과 font-family 이름만 붓 쪽으로 돌리면 된다. */
@font-face{font-family:'Nanum Hand';font-style:normal;font-weight:400;font-display:swap;
  src:url('../assets/fonts/nanum-brush.woff2') format('woff2')}

:root{
  /* ★ 돌핀 번안 — 변수 «이름»은 코럴헤이즈 그대로 두고 «값»만 바꾼다.
     2001줄이 이 이름들을 쓴다. 이름을 바꾸면 전부 손대야 하고, 그건 사고의 길이다.
     --coral 이 곧 «브랜드 색»이다 (돌핀 = 청록). */
  --ink:#171d20;         /* 본문 — 차가운 잉크 */
  --ink-2:#54606a;       /* 보조 */
  --ink-3:#87929b;       /* 캡션 */
  --line:#e2e8ea;
  --paper:#fcfdfd;
  --paper-2:#f2f6f7;
  --coral:#1f8a91;       /* 브랜드 청록 (돌핀) */
  --coral-d:#14666c;
  --blush:#e2f0f1;
  --gold:#8a7a54;        /* 헤리티지 골드 — 1966 표기용 */
  --ok:#15734a;
  --warn:#a4501a;

  /* 제목 전용 — 지금 모습 그대로 둔다 */
  /* 손글씨 — 히어로·표지 한 줄 전용. 담긴 글자가 그 문장뿐이다(위 @font-face) */
  --hand:'Nanum Hand','Nanum Pen Script',var(--serif);
  --serif:Georgia,'Times New Roman','Nanum Myeongjo',Batang,serif;
  /* 본문·버튼·라벨 전용 */
  --sans:'KoPub Dotum','Apple SD Gothic Neo','Malgun Gothic','맑은 고딕',system-ui,sans-serif;

  --w:1280px;
  --r:14px;
  --sh-1:0 1px 2px rgba(25,19,22,.05),0 8px 24px rgba(25,19,22,.06);
  --sh-2:0 2px 6px rgba(25,19,22,.07),0 22px 60px rgba(25,19,22,.13);
  --ease:cubic-bezier(.22,.61,.36,1);
}

*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{
  margin:0;background:var(--paper);color:var(--ink);
  font-family:var(--sans);font-size:16px;line-height:1.65;
  -webkit-font-smoothing:antialiased;overflow-x:hidden;
}
img{max-width:100%;display:block}
a{color:inherit;text-decoration:none}
button{font:inherit;color:inherit;border:0;background:none;cursor:pointer}
:focus-visible{outline:2px solid var(--coral);outline-offset:3px;border-radius:4px}
.wrap{max-width:var(--w);margin:0 auto;padding:0 24px}
.sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}

/* ─── 고지 바 ─────────────────────────────────────────── */
.notice{
  background:#191316;color:#fff;font-size:13px;line-height:1.5;
  padding:9px 24px;text-align:center;position:relative;z-index:60;
}
.notice b{color:#ffd9a8}
.notice a{text-decoration:underline;text-underline-offset:2px}
/* ★ 2026-08-08 — 폰에서는 고지줄을 숨긴다(사람 지시 — 폰 화면 1/3을 먹었다).
   ⛔ 지운 것이 아니다: PC에는 그대로, 폰에서도 구매 단추는 전부 「공식몰에서 보기」라
      주문되는 것처럼 보일 길이 없다. 본문 배너 높이는 site.js 가 «실측»하므로
      고지줄이 0이 되어도 스스로 맞는다. 문구 검사(smoke)는 textContent 라 무사하다. */
@media (max-width:820px){ .notice{display:none} }

/* ─── 헤더 ────────────────────────────────────────────── */
/* ★ 2026-08-04 — 맨 위에서는 머리가 «배너 위에» 얹힌다(사람 지시).
   공식몰이 그렇게 되어 있어서 배너가 한 화면에 딱 맞는다. 우리는 머리가
   자리를 차지해 배너가 화면 밖으로 밀렸고, 조금 내려야 맞아 보였다.
   ⛔ 내려가면 배경이 돌아와야 한다. 글 위에 투명한 머리가 떠 있으면
     본문과 메뉴가 겹쳐 읽힌다. .scrolled 가 그 경계다(scrollY > 8). */
.hd{
  position:sticky;top:0;z-index:50;
  background:rgba(255,253,252,.86);
  backdrop-filter:saturate(180%) blur(14px);-webkit-backdrop-filter:saturate(180%) blur(14px);
  border-bottom:1px solid var(--line);
  transition:background .25s var(--ease),border-color .25s var(--ease),box-shadow .3s var(--ease);
}
/* 넓은 화면에서만 맨 위에서 투명해진다 — 배너 위에 얹히는 자리다.
   폰에서는 배너가 짧아 머리가 그림을 가려 버리므로 그대로 둔다. */
@media (min-width:900px){
  .hd:not(.scrolled){background:transparent;border-bottom-color:transparent;
    backdrop-filter:none;-webkit-backdrop-filter:none}
}
.hd.scrolled{
  background:rgba(255,253,252,.86);
  backdrop-filter:saturate(180%) blur(14px);-webkit-backdrop-filter:saturate(180%) blur(14px);
  border-bottom-color:var(--line);
  box-shadow:0 1px 0 var(--line),0 10px 30px rgba(25,19,22,.06);
}
.hd .in{display:flex;align-items:center;gap:28px;height:66px;max-width:var(--w);margin:0 auto;padding:0 24px;
  min-width:0}
/* 로고는 브랜드 실제 워드마크 이미지를 쓴다 — 서체로 흉내 내지 않는다 */
.brand{flex:0 0 auto;display:block;line-height:0}
.brand img{display:block;width:168px;height:auto}
.nav{display:flex;gap:6px;margin-left:6px}
.nav a{
  padding:8px 13px;border-radius:9px;font-size:14.5px;font-weight:500;color:var(--ink-2);
  transition:background .18s,color .18s;position:relative;
}
.nav a:hover{background:var(--paper-2);color:var(--ink)}
.nav a.on{color:var(--coral-d)}
.nav a.on::after{content:'';position:absolute;left:13px;right:13px;bottom:3px;height:2px;background:var(--coral);border-radius:2px}

/* ── 공식몰 문 이식 (2026-08-08) — Online Service·회원·장바구니 ──────
   기능의 진실은 공식몰이다 — 여기는 «같은 자리의 같은 문»이고, 누르면
   몰의 그 페이지가 새 창으로 열린다(도메인 통합 뒤에는 한 지붕이 된다). */
.svc{position:relative}
.svc-top{
  display:block;padding:8px 13px;border-radius:9px;font-size:14.5px;font-weight:500;
  color:var(--ink-2);transition:background .18s,color .18s;
}
.svc-top:hover{background:var(--paper-2);color:var(--ink)}
.svc .ext{font-size:10px;margin-left:4px;color:var(--ink-3);vertical-align:2px}
/* ▾ 는 폰 아코디언 전용 — PC 에서는 hover 가 열므로 숨긴다(아래 900px 블록이 켠다) */
.svc .chev{display:none}
.svc-drop{
  position:absolute;top:100%;left:6px;min-width:158px;background:var(--paper);
  border:1px solid var(--line);border-radius:12px;box-shadow:var(--sh-1);
  padding:6px 0;display:none;z-index:80;
}
/* hover 만이 아니라 focus-within 도 — 키보드로도 하위 다섯 문이 열려야 한다 */
.svc:hover .svc-drop,.svc:focus-within .svc-drop{display:block}
.svc-drop a{display:block;padding:9px 16px;font-size:13.5px;color:var(--ink-2)}
.svc-drop a:hover{background:var(--paper-2);color:var(--ink)}
/* 회원·장바구니 — 몰 머리글 우측 그대로. 큰 화면(1200px+)에서만 한 줄에 함께 서고,
   중간 폭에서는 숨는다(자리가 없다 — 폰은 아래 버거 목록이 받는다). */
.nav-util{
  display:none;align-items:center;gap:2px;margin-left:10px;
  padding-left:12px;border-left:1px solid var(--line);
}
.nav-util a{padding:8px 9px;border-radius:9px;font-size:12.5px;color:var(--ink-3)}
.nav-util a:hover{background:var(--paper-2);color:var(--ink)}
/* Login/Register 와 +2,000원 을 «한 줄»로 묶는 틀 (2026-08-08 폰 피드백) */
.u-row{display:flex;align-items:center}
.nav-util .u-pill{
  /* 세로 7px — 접근성 검사(터치 타깃 28px)에 걸리지 않는 최소 높이 */
  background:#191316;color:#fff;border-radius:999px;padding:7px 11px;
  font-size:11px;font-weight:600;margin-left:6px;
}
.nav-util .u-pill:hover{background:#191316;color:#ffd9a8}
@media(min-width:1200px){.nav-util{display:flex}}
.hd .sp{flex:1}
.iconbtn{
  width:38px;height:38px;border-radius:10px;display:grid;place-items:center;
  transition:background .18s;color:var(--ink-2);
}
.iconbtn:hover{background:var(--paper-2);color:var(--ink)}
/* 언어 — 알약 둘(KO·EN)에서 목록으로. 24개를 알약으로 늘어놓을 수 없다.
   <select> 라 키보드·스크린리더가 공짜로 되고, 휴대폰에서는 OS 피커가 뜬다.
   생김새만 기존 알약과 같은 결로 맞춘다(테두리·둥근 모서리·종이색). */
.langsel{
  display:flex;background:var(--paper-2);border:1px solid var(--line);
  border-radius:10px;padding:3px;
}
.langsel select{
  appearance:none;-webkit-appearance:none;
  border:0;background:transparent;color:var(--ink);
  font:inherit;font-size:12.5px;font-weight:600;
  padding:4px 22px 4px 10px;border-radius:7px;cursor:pointer;
  max-width:9.5rem;text-overflow:ellipsis;
  /* 화살표를 직접 그린다 — 기본 화살표는 브라우저마다 크기가 달라 머리글이 흔들린다 */
  background-image:linear-gradient(45deg,transparent 50%,var(--ink-3) 50%),
                   linear-gradient(135deg,var(--ink-3) 50%,transparent 50%);
  background-position:calc(100% - 12px) 52%,calc(100% - 7px) 52%;
  background-size:5px 5px,5px 5px;background-repeat:no-repeat;
}
.langsel select:focus-visible{outline:2px solid var(--coral,#e2492f);outline-offset:2px}
/* 목록 안은 시스템 글꼴이 낫다 — 24개 언어의 글자를 브랜드 폰트가 다 갖고 있지 않다 */
.langsel option{font-family:system-ui,-apple-system,'Segoe UI',sans-serif;color:#1f2937}
.burger{display:none}

/* ─── 읽을거리 — 지식백서 열람실 ─────────────────────────
   51쪽·133편이다. 한 번에 다 보여 주면 아무도 안 읽는다 —
   «찾거나(검색) 고르거나(목차)» 해야 본문이 열린다. */
.editorial{display:block}

/* 검색줄 */
.bsearch{display:flex;align-items:center;gap:12px;margin-bottom:18px}
.bsearch input{
  flex:1;min-width:0;font:inherit;font-size:15px;color:var(--ink);
  padding:14px 18px;border-radius:999px;border:1px solid var(--line);background:#fff;
  transition:border-color .18s,box-shadow .18s;
}
.bsearch input:focus{outline:none;border-color:var(--coral,#e2492f);
  box-shadow:0 0 0 3px rgba(226,73,47,.1)}
.bsearch input::placeholder{color:var(--ink-3);opacity:.7}
.bcount{flex:none;font-size:12.5px;color:var(--ink-3)}

/* 목차 — 접었다 편다 */
.btoc{display:grid;grid-template-columns:repeat(2,1fr);gap:10px;align-items:start}
.bch{border:1px solid var(--line);border-radius:14px;background:#fff;overflow:hidden;
  transition:border-color .18s,box-shadow .18s}
.bch.on{border-color:var(--coral,#e2492f);box-shadow:0 8px 24px rgba(25,19,22,.07);
  grid-column:1/-1}
.bchh{
  display:flex;align-items:center;gap:11px;width:100%;text-align:left;
  padding:15px 17px;background:transparent;border:0;cursor:pointer;font:inherit;
}
.bchh:hover .t,.bchh:focus-visible .t{color:var(--coral,#e2492f)}
.bchh .n{flex:none;width:26px;height:26px;border-radius:8px;display:flex;align-items:center;
  justify-content:center;font-size:12px;font-weight:700;
  background:var(--paper-2,#faf5f3);color:var(--coral,#e2492f)}
.bchh .t{flex:1;min-width:0;font-size:14.5px;font-weight:700;color:var(--ink);line-height:1.4}
.bchh .c{flex:none;font-size:11.5px;color:var(--ink-3)}
.bch.on .bchh .n{background:var(--coral,#e2492f);color:#fff}
.bitems{padding:0 12px 12px;display:grid;grid-template-columns:repeat(2,1fr);gap:6px}
.bitem{
  display:flex;align-items:baseline;gap:9px;text-align:left;padding:11px 13px;
  border-radius:10px;border:0;background:var(--paper-2,#faf5f3);cursor:pointer;font:inherit;
  transition:background .16s,color .16s;
}
.bitem:hover,.bitem:focus-visible{background:rgba(226,73,47,.09)}
.bitem .no{flex:none;font-size:11.5px;font-weight:700;color:var(--coral,#e2492f)}
.bitem .ti{flex:1;min-width:0;font-size:13.5px;line-height:1.45;color:var(--ink-2)}

/* 검색 결과 */
.bhits{display:grid;grid-template-columns:repeat(2,1fr);gap:12px}
.bhit{
  display:flex;flex-direction:column;align-items:flex-start;gap:6px;text-align:left;
  padding:18px 18px 16px;border-radius:14px;cursor:pointer;font:inherit;
  background:#fff;border:1px solid var(--line);
  transition:transform .18s,border-color .18s,box-shadow .18s;
}
.bhit:hover,.bhit:focus-visible{transform:translateY(-2px);border-color:var(--coral,#e2492f);
  box-shadow:0 10px 26px rgba(25,19,22,.08)}
.bhit .bk{font-size:11px;letter-spacing:.1em;font-weight:700;color:var(--coral,#e2492f)}
.bhit .bt{font-size:16px;line-height:1.4;font-weight:700;color:var(--ink)}
.bhit .bx{font-size:13px;line-height:1.6;color:var(--ink-3)}
.bempty{padding:20px 4px 24px;font-size:14px;color:var(--ink-3);line-height:1.7}
@media (max-width:820px){
  .btoc,.bhits,.bitems{grid-template-columns:1fr}
  .bsearch{flex-wrap:wrap}
  .bcount{width:100%;order:2}
}

/* 글 한 편 */
.jart{position:fixed;inset:0;z-index:115;display:flex;align-items:center;justify-content:center;padding:18px}
.jart .jbg{position:absolute;inset:0;background:rgba(25,19,22,.5);backdrop-filter:blur(3px)}
.jart .jbox{
  position:relative;background:#fff;border-radius:20px;padding:30px 28px 26px;
  max-width:600px;width:100%;max-height:84vh;overflow-y:auto;
  box-shadow:0 24px 60px rgba(25,19,22,.28);
}
.jart .jx-close{
  position:absolute;right:14px;top:14px;width:34px;height:34px;border-radius:999px;
  border:1px solid var(--line);background:#fff;cursor:pointer;font-size:14px;color:var(--ink-2)
}
.jart .jk{font-size:11px;letter-spacing:.14em;font-weight:700;color:var(--coral,#e2492f);text-transform:uppercase}
.jart h3{font-size:22px;line-height:1.35;margin:8px 0 14px;color:var(--ink)}
.jart .jbody{font-size:15px;line-height:1.85;color:var(--ink-2);white-space:pre-wrap;margin:0}
.jart .jimg{display:block;width:100%;height:auto;border-radius:12px;margin:0 0 16px;
  border:1px solid var(--line)}
/* 앞뒤로 이어 읽기 — 백서는 순서가 있는 글이다 */
.jart .jnav{display:flex;gap:8px;margin:20px 0 0;flex-wrap:wrap}
.jart .jnav button{
  flex:1 1 44%;min-width:0;padding:11px 14px;border-radius:11px;cursor:pointer;font:inherit;
  font-size:12.5px;line-height:1.4;text-align:left;color:var(--ink-2);
  background:var(--paper-2,#faf5f3);border:1px solid var(--line);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.jart .jnav button:hover,.jart .jnav button:focus-visible{
  border-color:var(--coral,#e2492f);color:var(--coral,#e2492f)}
.jart .jnext{text-align:right!important}
.jart .jsrc{margin:18px 0 0;font-size:12.5px;line-height:1.6;color:var(--ink-3);
  padding-top:14px;border-top:1px solid var(--line)}
.jart .jnote{margin:10px 0 0;font-size:11.5px;line-height:1.6;color:var(--ink-3);opacity:.85}
@media (max-width:600px){ .jart .jbox{padding:26px 20px 22px;max-height:88vh} .jart h3{font-size:19px} }

/* ─── 세 입구 카드 ──────────────────────────────────────
   히어로 오른쪽 빈자리에 선다. 가운데 카드가 크고 옆은 작고 흐릿하다 —
   참조 문서의 «역할 회전» 방식이다. 650ms 로 한꺼번에 건너간다. */
/* ★ 카드를 위아래로 10% 더 키웠다(사람 지시 2026-08-02) — 330 → 365px.
   배경이 사진이라 세로가 짧으면 모델이 잘린다. */
.deck{position:relative;min-height:470px;display:flex;align-items:center;justify-content:center}
.deckwrap{position:relative;width:100%;height:450px}
.dcard{
  position:absolute;top:50%;left:50%;width:min(320px,80%);min-height:365px;
  display:flex;flex-direction:column;align-items:flex-start;gap:8px;text-align:left;
  padding:30px 26px 26px;border-radius:22px;cursor:pointer;font:inherit;border:0;
  color:#fff;box-shadow:0 18px 40px rgba(25,19,22,.18);overflow:hidden;
  transition:transform .65s cubic-bezier(.4,0,.2,1),opacity .65s cubic-bezier(.4,0,.2,1),
             filter .65s cubic-bezier(.4,0,.2,1),box-shadow .3s ease;
  will-change:transform,opacity,filter;
}
/* 배경 그림 — ★ 원본 그대로다(사람 지시 2026-08-02).
   흐리지도 흐리게 하지도 않는다. 모델이 보여야 한다는 것이 요청이었다.
   대신 «글씨를 세우는» 쪽으로 푼다 — 아래 .dtxt 와 text-shadow. */
.dcard .dbg{
  position:absolute;inset:0;z-index:0;
  background-size:cover;background-position:50% 40%;
}
.dcard > *:not(.dbg){position:relative;z-index:2}
.dcard.c1{background:linear-gradient(150deg,#F2856B 0%,#E2492F 100%)}
.dcard.c2{background:linear-gradient(150deg,#E8A0A8 0%,#C9576E 100%)}
.dcard.c3{background:linear-gradient(150deg,#8FA9C9 0%,#4A6285 100%)}
/* ★ 글이 앉는 자리에만 어둠을 깐다.
   배너는 대체로 밝은 분홍이라 흰 글씨가 그냥은 안 읽힌다. 사진 전체를 어둡게
   덮으면 «원본 그대로»가 아니게 되므로, 위아래 끝에만 그늘을 준다 —
   모델 얼굴이 있는 가운데는 건드리지 않는다. */
.dcard::after{
  content:'';position:absolute;inset:0;z-index:1;pointer-events:none;
  background:linear-gradient(180deg,rgba(20,12,14,.52) 0%,rgba(20,12,14,.14) 30%,
             rgba(20,12,14,.10) 46%,rgba(20,12,14,.40) 72%,rgba(20,12,14,.78) 100%);
}
/* 글씨 — 흰색으로, 그림자를 여러 겹 겹쳐 입체로.
   한 겹으로는 밝은 배경에서 진다. 가까운 짙은 그림자(윤곽)와 넓은 그림자(바탕)를
   함께 쓴다 — 윤곽이 글자 모양을 세우고, 넓은 쪽이 배경과 떼어 놓는다. */
.dcard .dk,.dcard .dt,.dcard .dp,.dcard .di,.dcard .dgo{color:#fff}
.dcard .dt{
  text-shadow:0 1px 2px rgba(12,6,8,.9), 0 2px 10px rgba(12,6,8,.7),
              0 0 26px rgba(12,6,8,.45);
}
.dcard .dk,.dcard .di,.dcard .dgo{
  text-shadow:0 1px 3px rgba(12,6,8,.85), 0 2px 12px rgba(12,6,8,.5);
}
.dcard .dp{
  text-shadow:0 1px 3px rgba(12,6,8,.95), 0 2px 10px rgba(12,6,8,.6);
  margin-top:auto;
}
.dcard .di{font-size:24px;line-height:1;opacity:.9}
.dcard .dk{font-size:10.5px;letter-spacing:.2em;font-weight:700;opacity:.82}
.dcard .dt{font-size:20px;font-weight:800;line-height:1.3}
.dcard .dp{font-size:12.5px;line-height:1.6;opacity:.88;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.dcard .dgo{margin-top:6px;font-size:17px;opacity:.9}
/* 역할 — 가운데 하나만 또렷하다 */
.dcard.is-c{transform:translate(-50%,-50%) scale(1);opacity:1;filter:none;z-index:3}
.dcard.is-l{transform:translate(-88%,-50%) scale(.78) rotate(-5deg);opacity:.42;filter:blur(1.5px);z-index:1}
.dcard.is-r{transform:translate(-12%,-50%) scale(.78) rotate(5deg);opacity:.42;filter:blur(1.5px);z-index:2}
.dcard.is-c:hover{box-shadow:0 24px 52px rgba(25,19,22,.26)}
.dcard:focus-visible{outline:3px solid #fff;outline-offset:3px}
.deckdots{position:absolute;left:0;right:0;bottom:2px;display:flex;gap:7px;justify-content:center}
/* 몰 배너 점과 같은 수법 — 보이는 막대는 4px 지만 누를 수 있는 곳은 28px 이다.
   검사가 배너에서 한 번 잡아 준 자리라 여기서는 처음부터 그렇게 만들었어야 했다. */
.deckdots button{width:26px;height:28px;padding:12px 0;border:0;cursor:pointer;border-radius:2px;
  background:rgba(25,19,22,.18);background-clip:content-box;transition:background .25s}
.deckdots button[aria-current=true]{background:var(--coral,#e2492f);background-clip:content-box}
@media (max-width:900px){
  .deck{min-height:0;margin-top:26px}
  .deckwrap{height:400px}
  .dcard{width:min(290px,88%);min-height:330px;padding:26px 22px 22px}
  .dcard .dt{font-size:18px}
}
@media (prefers-reduced-motion:reduce){ .dcard{transition:none} }

/* ─── 몰 배너 ──────────────────────────────────────────
   공식몰의 큰 배너를 그대로 쓰는 자리(사람 지시 2026-08-02).
   ★ 화면 폭을 꽉 채운다 — 몰의 첫인상이 그렇기 때문이다.
   ★ 높이를 «비율»로 잡지 않고 화면 높이에 맞춘다. 1920×1080 을 비율대로
     펼치면 넓은 화면에서 배너 하나가 첫 화면을 다 먹고, 우리 내용이
     스크롤 아래로 사라진다 — 임원이 보는 화면에서 그러면 안 된다. */
.mallhero{
  position:relative;width:100%;overflow:hidden;background:#f6eeea;
  /* ★ 배너는 «자르지 않는다». 2026-08-04 에 두 번 고쳐 여기까지 왔다.

       처음  height:clamp(320,46vw,560)  → 1900px 화면에서 절반 가까이 잘렸다
       1차   aspect-ratio + max-height:82vh → 위아래 22% 가 남아 잘렸다
       지금  aspect-ratio 만               → 어느 창에서도 안 잘린다

     배너 자산은 PC(1920x1080)·모바일(1280x720) 모두 16:9 다.
     비율만 맞춰 두면 cover 가 자를 것이 없다.

     ⛔ 대가는 알고 택했다 — 넓은 화면에서 배너가 첫 화면을 거의 다 먹는다.
       공식몰도 그렇다(fullpage 로 화면 높이를 채운다). 「우리 내용이 스크롤
       아래로 사라진다」가 처음에 높이를 고정했던 이유였는데, 사람이 두 번
       «잘리지 않게»를 지시했다. 잘리지 않는 쪽을 택한다.
     ⛔ min-height 를 넣었다가 뺐다. 390px 폰에서 300px 을 강제하니 세로가
       남아 «좌우»가 잘렸다 — 가로로 긴 배너에서 좌우를 자르는 것이 제일
       나쁘다. 모델은 왼쪽, 제품은 오른쪽에 있다. */
  aspect-ratio:16/9;
}

/* ★ 넓은 화면에서만 «한 화면에 딱» 맞춘다 (2026-08-04, 사람 지시).
   공식몰처럼 머리가 배너 위에 얹히고, 배너가 고지줄을 뺀 화면을 채운다.

   ⛔ 모바일에는 «적용하지 않는다». 390x844 폰에서 세로를 꽉 채우게 했더니
     가로로 긴 배너의 «좌우 71% 가 잘렸다» — 모델도 제품도 사라졌다.
     세로로 긴 화면에 가로 그림을 채우는 것은 애초에 될 일이 아니다.
     폰에서는 비율 그대로 두고, 머리도 제자리에 둔다.

   ★ 높이에 min() 을 쓴다 — «화면에 맞추되, 원래 비율보다 커지지는 않게».
     그래서 좌우는 어느 폭에서도 안 잘린다. 1440px 처럼 화면이 여유로우면
     배너가 조금 짧게 서고 아래 내용이 살짝 비친다 — 더 있다는 신호가 된다. */
@media (min-width:900px){
  .mallhero{
    aspect-ratio:auto;
    /* --hd 머리 높이, --topbar 고지줄 높이. js/site.js 가 «재서» 넣는다 —
       고지줄은 글이 길거나 언어가 바뀌면 두 줄이 된다. 짐작하면 어긋난다. */
    margin-top:calc(-1 * var(--hd, 66px));
    height:min(calc(100vh - var(--topbar, 40px)), calc(100vw / (16/9)));
    height:min(calc(100svh - var(--topbar, 40px)), calc(100vw / (16/9)));
  }
}
.mallhero #mallSlides{position:absolute;inset:0}
.mallhero .mslide{
  position:absolute;inset:0;opacity:0;transition:opacity .9s ease;
  display:block;
}
.mallhero .mslide.on{opacity:1}
.mallhero .mslide img{width:100%;height:100%;object-fit:cover;object-position:50% 50%;display:block}
.mallhero .mdots{
  position:absolute;left:0;right:0;bottom:14px;z-index:3;
  display:flex;gap:8px;justify-content:center;
}
/* ★ 보이는 것은 얇은 막대(4px)지만 «누를 수 있는 곳»은 손가락 크기여야 한다.
   막대 자체를 키우면 디자인이 무너지므로, 투명한 패딩으로 터치 영역만 넓히고
   배경은 안쪽 막대에만 그린다(background-clip: content-box).
   실측에서 검사가 「터치 타깃 4px」로 잡아 준 자리다. */
.mallhero .mdots button{
  width:30px;height:28px;border:0;cursor:pointer;padding:12px 0;
  background:rgba(255,255,255,.5);background-clip:content-box;
  border-radius:2px;transition:background .25s;
}
.mallhero .mdots button[aria-current=true]{background:#fff;background-clip:content-box}
.mallhero .mdots button:focus-visible{outline:2px solid #fff;outline-offset:3px}
/* 공식몰로 가는 문 — 구매는 그쪽에서 일어난다(우리는 결제를 갖지 않는다) */
.mallhero .mallgo{
  position:absolute;right:16px;bottom:16px;z-index:3;
  display:inline-flex;align-items:center;gap:6px;
  padding:9px 16px;border-radius:999px;font-size:13px;font-weight:700;
  background:rgba(25,19,22,.62);color:#fff;text-decoration:none;
  backdrop-filter:blur(6px);
}
.mallhero .mallgo:hover,.mallhero .mallgo:focus-visible{background:rgba(25,19,22,.82)}
.mallhero .mallgo::after{content:'↗';font-size:12px}
@media (max-width:760px){
  /* ★ 2026-08-04 — 모바일 높이 고정을 뺐다. 390px 폰에서 289px 을 강제하니
     세로가 남아 «좌우»가 잘렸다(76%만 보임). 배너는 모바일 자산도 16:9 라
     비율만 두면 통째로 들어온다. 가로로 긴 그림에서 좌우를 자르는 것이 제일
     나쁘다 — 모델은 왼쪽, 제품은 오른쪽에 있다. */
  .mallhero .mallgo{right:12px;bottom:12px;padding:8px 13px;font-size:12px}
  .mallhero .mdots{bottom:10px}
}
@media (prefers-reduced-motion:reduce){
  .mallhero .mslide{transition:none}
}

/* ─── 히어로 ──────────────────────────────────────────── */
/* 캠페인 배너는 자체 타이포가 들어 있는 완성 크리에이티브다.
   그 위에 헤드라인을 얹으면 글자가 겹친다 → 좌 카피 / 우 배너로 나눈다. */
.hero{position:relative;overflow:hidden;padding:62px 0 66px;
  /* ★ 돌핀 번안 — 코럴헤이즈 분홍 그라데이션이 배포 캡처에서 그대로 드러났다(실측).
     hex 하드코딩이라 토큰 교체로 안 바뀐 자리다. 청록 물빛으로. */
  background:
    radial-gradient(90% 120% at 8% 0%,#fff 0%,rgba(255,255,255,0) 60%),
    linear-gradient(150deg,#eef7f7 0%,#e2f0f1 45%,#eef3f4 100%);}
.hero::before{
  content:'';position:absolute;width:620px;height:620px;right:-180px;top:-260px;border-radius:50%;
  background:radial-gradient(circle,rgba(31,138,145,.14),rgba(31,138,145,0) 68%);pointer-events:none;
}
.hero .in{position:relative;z-index:2;max-width:var(--w);margin:0 auto;padding:0 24px;
  display:grid;grid-template-columns:1fr 1fr;gap:52px;align-items:center}
.hero .copy{min-width:0}
.hero .eyebrow{font-size:12px;letter-spacing:.3em;color:var(--gold);font-weight:600;text-transform:uppercase}
/* ★ 2026-08-04 — 두 배로 키웠다가 30% 되돌렸다(사람 지시 2회).
   40~74 → 80~148 → 56~104px. 두 배는 화면을 먹었다.
   ⛔ 「원래대로」가 아니다. 처음보다는 여전히 40% 크다 — 손글씨 제목이
     이 화면의 주인공이라는 판단은 그대로이고, 정도만 맞춘 것이다. */
.hero h1{font-family:var(--hand);font-size:clamp(56px,7.84vw,104px);line-height:1.02;margin:12px 0 0;font-weight:400;letter-spacing:-.01em}
/* 손글씨는 글자가 작고 성글게 보인다 — 명조보다 크게, 자간은 조이지 않는다 */
.hero h1 em{font-style:normal;color:var(--coral-d)}   /* 손글씨엔 이탤릭이 없다 */
.hero p{font-size:clamp(15px,1.4vw,18px);color:var(--ink-2);margin:18px 0 0;max-width:29em;line-height:1.75}
.hero .cta{display:flex;gap:12px;margin-top:28px;flex-wrap:wrap}

/* 캠페인 카드 — 배너를 잘라내지 않고 원래 비율로 보여 준다 */
.camp{position:relative;border-radius:20px;overflow:hidden;box-shadow:var(--sh-2);background:#efe6e3;
  aspect-ratio:16/9;min-width:0}
.camp .slide{position:absolute;inset:0;opacity:0;transition:opacity 1s var(--ease);
  background-size:cover;background-position:center}
.camp .slide.on{opacity:1}
@media (prefers-reduced-motion:no-preference){
  .camp .slide.on{animation:kb 11s var(--ease) forwards}
  @keyframes kb{from{transform:scale(1.05)}to{transform:scale(1)}}
}
.camp .dots{position:absolute;left:0;right:0;bottom:13px;z-index:3;display:flex;gap:7px;justify-content:center}
.camp .dots button{width:22px;height:3px;border-radius:3px;background:rgba(255,255,255,.55);
  transition:background .25s,width .25s;box-shadow:0 1px 2px rgba(0,0,0,.2)}
.camp .dots button[aria-current=true]{background:#fff;width:40px}
.camp .badge{position:absolute;top:12px;left:12px;z-index:3;background:rgba(25,19,22,.62);color:#fff;
  font-size:10.5px;letter-spacing:.14em;font-weight:700;padding:5px 10px;border-radius:6px;
  backdrop-filter:blur(6px)}

/* ─── 버튼 ────────────────────────────────────────────── */
.btn{
  display:inline-flex;align-items:center;gap:9px;padding:13px 24px;border-radius:999px;
  font-size:15px;font-weight:600;letter-spacing:-.01em;
  transition:transform .2s var(--ease),box-shadow .2s var(--ease),background .2s;
  will-change:transform;
}
.btn.p{background:var(--ink);color:#fff;box-shadow:var(--sh-1)}
.btn.p:hover{background:#000;transform:translateY(-2px);box-shadow:var(--sh-2)}
.btn.c{background:var(--coral);color:#fff}
.btn.c:hover{background:var(--coral-d);transform:translateY(-2px);box-shadow:0 12px 30px rgba(31,138,145,.34)}
.btn.g{background:#fff;color:var(--ink);border:1px solid var(--line);box-shadow:var(--sh-1)}
.btn.g:hover{border-color:var(--ink-3);transform:translateY(-2px)}
.btn:active{transform:translateY(0)}

/* ─── 섹션 ────────────────────────────────────────────── */
.sec{padding:82px 0}
.sec.alt{background:var(--paper-2)}
.sechd{display:flex;align-items:flex-end;justify-content:space-between;gap:22px;margin-bottom:34px;flex-wrap:wrap}
.sechd .k{font-size:11.5px;letter-spacing:.3em;color:var(--gold);font-weight:700;text-transform:uppercase}
.sechd h2{font-family:var(--serif);font-size:clamp(26px,3.4vw,40px);margin:10px 0 0;font-weight:400;letter-spacing:-.02em;line-height:1.2}
.sechd p{margin:10px 0 0;color:var(--ink-2);max-width:46em;font-size:16px}

/* ─── 셰이드 파인더 ──────────────────────────────────── */
.finder{
  background:linear-gradient(160deg,#fff 0%,var(--blush) 120%);
  border:1px solid var(--line);border-radius:24px;padding:32px;box-shadow:var(--sh-1);
}
.fgrid{display:grid;grid-template-columns:repeat(3,1fr);gap:22px}
.fgroup .lab{font-size:12px;letter-spacing:.16em;font-weight:700;color:var(--ink-3);text-transform:uppercase;margin-bottom:10px}
.chips{display:flex;gap:8px;flex-wrap:wrap}
.chip{
  padding:9px 16px;border-radius:999px;border:1px solid var(--line);background:#fff;
  font-size:14px;font-weight:500;color:var(--ink-2);transition:all .18s var(--ease);
}
.chip:hover{border-color:var(--ink-3);color:var(--ink)}
.chip[aria-pressed=true]{background:var(--ink);color:#fff;border-color:var(--ink)}
.chip .sw{width:12px;height:12px;border-radius:50%;display:inline-block;margin-right:7px;vertical-align:-1px;
  box-shadow:inset 0 0 0 1px rgba(0,0,0,.12)}
.fbar{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-top:24px;
  padding-top:22px;border-top:1px solid var(--line);flex-wrap:wrap}
.fcount{font-size:15px;color:var(--ink-2)}
.fcount b{color:var(--ink);font-size:21px;font-family:var(--serif)}

/* 셰이드 결과 */
.shades{display:grid;grid-template-columns:repeat(auto-fill,minmax(146px,1fr));gap:16px;margin-top:26px}
/* button 안의 span 은 기본이 inline 이라 비율·여백이 무너진다 → 전부 block */
.shade,.shade>*,.shade .tx>*{display:block}
.shade{
  border:1px solid var(--line);border-radius:var(--r);overflow:hidden;background:#fff;
  transition:transform .25s var(--ease),box-shadow .25s var(--ease),border-color .2s;
  position:relative;text-align:left;width:100%;padding:0;
}
.shade:hover{transform:translateY(-4px);box-shadow:var(--sh-2);border-color:transparent}
.shade .ph{aspect-ratio:1/1;overflow:hidden;background:var(--paper-2);position:relative}
/* 분가루 스와치 (2026-08-08) — 제품컷 공용 카드(볼·눈)에서 «이 색»을 사진 아래
   1/3에 눌러 찍은 파우더처럼. 바탕은 색 hex(요소 style), 여기선 질감(광·눌림)만.
   배지(.outb/.lastb, z4)보다 아래·사진보다 위. */
.ph>.powder,.im>.powder{position:absolute;left:0;right:0;bottom:0;height:34%;z-index:2;
  background-image:
    radial-gradient(circle at 30% 32%, rgba(255,255,255,.5), transparent 55%),
    radial-gradient(circle at 74% 72%, rgba(255,255,255,.28), transparent 46%),
    radial-gradient(circle at 55% 15%, rgba(0,0,0,.07), transparent 60%);
  box-shadow:inset 0 8px 12px -8px rgba(0,0,0,.28)}
.shade .ph img{width:100%;height:100%;object-fit:cover;transition:transform .55s var(--ease)}
.shade:hover .ph img{transform:scale(1.07)}
.shade .bar{height:6px}
.shade .tx{padding:11px 13px 13px}
.shade .nm{font-size:13.5px;font-weight:600;letter-spacing:-.01em;line-height:1.35}
.shade .mt{font-size:11.5px;color:var(--ink-3);margin-top:3px}
.shade .pr{font-size:11.5px;color:var(--ink-2);margin-top:5px}
.shade.sel{border-color:var(--coral);box-shadow:0 0 0 2px rgba(31,138,145,.28)}
.empty{padding:46px 20px;text-align:center;color:var(--ink-3);border:1px dashed var(--line);border-radius:var(--r);margin-top:26px}

/* 비교 트레이 */
/* ⛔⛔ 「비교 중 0/3」 상자가 폰에서 «늘» 떠 있었다 (사람이 잡음 2026-08-05).
      숨김을 translateY(140%) — «제 키의» 140% — 로만 잡았던 게 원인이다.
      폰에서는 bottom:88px 만큼 이미 떠 있어서 그만큼을 «더» 내려가야 한다.
        비었을 때 키 73px → 140% = 102px, 필요한 값은 73 + 88 = 161px.
        59px 이 화면에 남았다. elementFromPoint 로 재 보니 그 자리는 .tray 였다 —
        보이기만 한 게 아니라 밑의 «글자를 가리고» 손가락을 먹고 있었다.
      데스크톱은 bottom:18px 이라 102 > 73+18 로 «우연히» 가려졌던 것이다.
    ★ 그래서 두 겹으로 막는다.
      ① 내려가는 거리를 calc(100% + 140px) 로 — bottom 값을 나중에 바꿔도 덮는다.
      ② visibility·pointer-events 로 «없는 것»으로 만든다. 계산이 또 모자라도
         손가락과 화면낭독기에는 안 걸리고, 탭 순서에서도 빠진다.
    ⛔ visibility 는 서서히 바뀌지 않는다 — 나타날 때는 «곧바로»,
       사라질 때는 미끄러짐이 끝난 뒤(.38s)로 미룬다. 안 그러면 슥 내려가는
       모습이 안 보이고 그냥 사라진다. */
.tray{
  position:fixed;left:50%;transform:translateX(-50%) translateY(calc(100% + 140px));bottom:18px;z-index:70;
  background:rgba(25,19,22,.95);backdrop-filter:blur(10px);color:#fff;border-radius:16px;
  padding:12px 14px;display:flex;align-items:center;gap:14px;box-shadow:var(--sh-2);
  transition:transform .38s var(--ease),opacity .3s var(--ease),visibility 0s linear .38s;
  max-width:calc(100vw - 32px);
  visibility:hidden;opacity:0;pointer-events:none;
}
.tray.on{
  transform:translateX(-50%) translateY(0);
  visibility:visible;opacity:1;pointer-events:auto;
  transition:transform .38s var(--ease),opacity .3s var(--ease),visibility 0s;
}
@media (prefers-reduced-motion:reduce){ .tray{transition:none} }
.tray .items{display:flex;gap:8px}
.tray .it{width:52px;height:52px;border-radius:10px;overflow:hidden;position:relative;background:#333}
.tray .it img{width:100%;height:100%;object-fit:cover}
.tray .it .x{position:absolute;top:2px;right:2px;width:17px;height:17px;border-radius:50%;
  background:rgba(0,0,0,.62);color:#fff;font-size:11px;display:grid;place-items:center;line-height:1}
.tray .lab{font-size:13px;color:#e6dcd9}

/* ── 폰에서는 «두 줄»로 — 색 윗줄, 단추 아랫줄 (사람 지시 2026-08-05) ──
   ⛔ 한 줄(nowrap)이라 좁은 화면에서 단추가 눌려 「이 색 사 러 가 기」처럼
      글자가 세로로 쪼개졌다. 폭이 모자라면 «줄을 바꾸는» 것이 맞다.
   ★ HTML 을 안 건드리고 나눈다 — ::after 에 flex-basis:100% 를 주어
     그 자리에서 «줄바꿈»을 만든다. order 로 색(2) 다음, 단추(4) 앞에 세운다. */
@media (max-width:640px){
  .tray{
    flex-wrap:wrap;justify-content:center;gap:10px;
    width:calc(100vw - 24px);padding:12px;
    /* ⛔ 상담 단추(우하단)와 겹쳤다 — 그 위로 올린다 */
    bottom:88px;
  }
  .tray .lab{order:1;flex:0 0 auto}
  .tray .items{order:2;flex:1 1 auto;justify-content:flex-start}
  .tray::after{content:"";order:3;flex-basis:100%;height:0;margin:0}
  .tray .chip{order:4;flex:1 1 auto;white-space:nowrap;text-align:center;padding:11px 12px}
  .tray .it{width:46px;height:46px}
}

/* 아주 좁은 폰(360 등) — 단추 셋을 «한 줄»에 넣는다.
   ⛔ flex-basis 를 44% 로 주었더니 둘만 올라가고 「비우기」가 혼자 내려갔다.
      글자를 조금 줄이는 편이 낫다 — 줄이 늘면 상자가 화면을 더 먹는다. */
@media (max-width:400px){
  .tray{gap:8px;padding:11px 10px}
  .tray .chip{flex:0 1 auto;font-size:12.5px;padding:10px 9px}
  .tray .lab{font-size:12px}
  .tray .it{width:42px;height:42px}
}

/* ─── 제품 그리드 ────────────────────────────────────── */
.cats{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:26px}
.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(258px,1fr));gap:26px}
.card{
  background:#fff;border:1px solid var(--line);border-radius:18px;overflow:hidden;
  transition:transform .3s var(--ease),box-shadow .3s var(--ease),border-color .25s;
  display:flex;flex-direction:column;text-align:left;position:relative;
}
.card:hover{transform:translateY(-6px);box-shadow:var(--sh-2);border-color:transparent}
.card .ph{aspect-ratio:4/5;overflow:hidden;background:var(--paper-2);position:relative}
.card .ph img{width:100%;height:100%;object-fit:cover;transition:transform .6s var(--ease),opacity .5s}
.card:hover .ph img.a{transform:scale(1.06)}
.card .ph img.b{position:absolute;inset:0;opacity:0}
.card:hover .ph img.b{opacity:1}
.card .tx{padding:16px 17px 18px;flex:1;display:flex;flex-direction:column}
.card .cat{font-size:11px;letter-spacing:.18em;color:var(--gold);font-weight:700;text-transform:uppercase}
.card h3{font-size:16px;margin:8px 0 0;font-weight:600;line-height:1.42;letter-spacing:-.015em}
.card .price{font-family:var(--serif);font-size:19px;margin-top:auto;padding-top:12px}
.card .price s{font-size:13px;color:var(--ink-3);margin-right:6px}
.card .row{display:flex;gap:4px;margin-top:11px;flex-wrap:wrap}
.card .row i{width:15px;height:15px;border-radius:50%;box-shadow:inset 0 0 0 1px rgba(0,0,0,.13)}
.card .row .more{font-size:11px;color:var(--ink-3);align-self:center;margin-left:3px}
.tag{
  position:absolute;top:12px;left:12px;z-index:2;background:rgba(25,19,22,.86);color:#fff;
  font-size:10.5px;font-weight:700;letter-spacing:.1em;padding:5px 10px;border-radius:6px;
}
.tag.new{background:var(--coral)}

/* ─── 블러업 ──────────────────────────────────────────── */
.bu{position:relative;overflow:hidden;display:block;width:100%;height:100%}
.bu .lq{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;filter:blur(14px);transform:scale(1.1)}
.bu .hi{position:relative;opacity:0;transition:opacity .55s var(--ease)}
.bu .hi.rdy{opacity:1}

/* ─── 상세 패널 ──────────────────────────────────────── */
.ov{position:fixed;inset:0;z-index:100;display:none}
.ov.on{display:block}
.ov .bg{position:absolute;inset:0;background:rgba(25,19,22,.5);backdrop-filter:blur(3px);animation:fade .3s}
@keyframes fade{from{opacity:0}to{opacity:1}}
.pane{
  position:absolute;right:0;top:0;bottom:0;width:min(920px,100%);background:var(--paper);
  overflow-y:auto;box-shadow:-20px 0 70px rgba(25,19,22,.22);animation:slidein .42s var(--ease);
}
@keyframes slidein{from{transform:translateX(34px);opacity:.6}to{transform:none;opacity:1}}
.pane .top{position:sticky;top:0;z-index:5;background:rgba(255,253,252,.92);backdrop-filter:blur(12px);
  border-bottom:1px solid var(--line);display:flex;align-items:center;gap:12px;padding:13px 20px}
.pane .top .t{font-size:14.5px;font-weight:600;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pane .body{padding:24px}
.gal{display:grid;grid-template-columns:1fr;gap:12px}
.gal .main{border-radius:var(--r);overflow:hidden;background:var(--paper-2);aspect-ratio:4/5;max-height:min(56vh,540px)}
.gal .main img{width:100%;height:100%;object-fit:cover}
.gal .strip{display:flex;gap:8px;overflow-x:auto;padding-bottom:4px;scrollbar-width:thin}
.gal .strip button{width:66px;height:66px;flex:0 0 auto;border-radius:9px;overflow:hidden;border:2px solid transparent;background:var(--paper-2)}
.gal .strip button[aria-current=true]{border-color:var(--ink)}
.gal .strip img{width:100%;height:100%;object-fit:cover}
.pinfo h2{font-family:var(--serif);font-size:27px;font-weight:400;margin:0;line-height:1.28;letter-spacing:-.02em}
.pinfo .p{font-family:var(--serif);font-size:26px;margin:14px 0 0}
.pinfo .meta{font-size:13px;color:var(--ink-3);margin-top:8px;line-height:1.6}
.swrap{margin-top:24px}
.swrap .h{font-size:12px;letter-spacing:.16em;font-weight:700;color:var(--ink-3);text-transform:uppercase;margin-bottom:11px}
.sgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(88px,1fr));gap:10px}
.sitem,.sitem>*{display:block}
.sitem{border:1px solid var(--line);border-radius:10px;overflow:hidden;background:#fff;text-align:left;
  width:100%;padding:0;transition:transform .2s var(--ease),box-shadow .2s}
.sitem:hover{transform:translateY(-3px);box-shadow:var(--sh-1)}
.sitem[aria-pressed=true]{border-color:var(--ink);box-shadow:0 0 0 2px rgba(25,19,22,.16)}
.sitem .im{aspect-ratio:1/1;overflow:hidden}
.sitem .im img{width:100%;height:100%;object-fit:cover}
.sitem .b{height:5px}
.sitem .n{font-size:10.5px;padding:6px 7px 7px;line-height:1.3;color:var(--ink-2)}
.buy{display:flex;gap:10px;margin-top:26px;flex-wrap:wrap}
.disc{margin-top:20px;background:#fff8ef;border:1px solid #f0dfc6;border-radius:12px;padding:13px 15px;
  font-size:13px;line-height:1.65;color:#6b5433}
.disc b{color:#4c3a20}

@media(min-width:840px){
  .pane .body{display:grid;grid-template-columns:1.05fr 1fr;gap:30px;align-items:start}
}

/* ─── 브랜드/저널 ────────────────────────────────────── */
.story{display:grid;grid-template-columns:1.1fr 1fr;gap:46px;align-items:center}
.story .im{border-radius:20px;overflow:hidden;box-shadow:var(--sh-2);aspect-ratio:4/5}
.story .im img{width:100%;height:100%;object-fit:cover}
.story h2{font-family:var(--serif);font-size:clamp(26px,3.2vw,38px);font-weight:400;margin:0;line-height:1.24;letter-spacing:-.02em}
.story p{color:var(--ink-2);margin:18px 0 0;line-height:1.85}
.facts{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin-top:28px}
.fact{background:#fff;border:1px solid var(--line);border-radius:13px;padding:16px}
.fact .n{font-family:var(--serif);font-size:29px;line-height:1;color:var(--coral-d)}
.fact .l{font-size:12.5px;color:var(--ink-3);margin-top:7px;line-height:1.45}

.editorial{display:grid;grid-template-columns:repeat(3,1fr);gap:24px}
.ed{border-radius:18px;overflow:hidden;position:relative;aspect-ratio:3/4;background:#eee;display:block}
.ed img{width:100%;height:100%;object-fit:cover;transition:transform .7s var(--ease)}
.ed:hover img{transform:scale(1.06)}
.ed .cap{position:absolute;left:0;right:0;bottom:0;padding:24px 20px 20px;color:#fff;text-align:left;
  background:linear-gradient(0deg,rgba(20,14,16,.82),rgba(20,14,16,0))}
.ed .cap>*{display:block}
.ed .cap .k{font-size:10.5px;letter-spacing:.24em;text-transform:uppercase;opacity:.86}
.ed .cap .t{font-family:var(--serif);font-size:20px;margin-top:6px;line-height:1.3}

/* ─── 푸터 ────────────────────────────────────────────── */
.ft{background:#191316;color:#c9bec2;padding:56px 0 30px;font-size:14px}
.ft .cols{display:grid;grid-template-columns:1.5fr 1fr 1fr 1.2fr;gap:34px}
.ft .brand{color:#fff}
.ft h4{color:#fff;font-size:12px;letter-spacing:.18em;text-transform:uppercase;margin:0 0 13px}
.ft a{display:block;padding:4px 0;color:#c9bec2;transition:color .18s}
.ft a:hover{color:#fff}
.ft .bot{border-top:1px solid #332a2d;margin-top:34px;padding-top:20px;font-size:12.5px;color:#8a7c81;line-height:1.75}

/* ─── 스크롤 리빌 ────────────────────────────────────── */
.rv{opacity:0;transform:translateY(22px);transition:opacity .7s var(--ease),transform .7s var(--ease)}
.rv.in{opacity:1;transform:none}

/* ─── 토스트 ─────────────────────────────────────────── */
.toast{position:fixed;left:50%;bottom:96px;transform:translate(-50%,20px);opacity:0;z-index:120;
  background:var(--ink);color:#fff;padding:11px 18px;border-radius:999px;font-size:14px;
  transition:opacity .3s,transform .3s var(--ease);pointer-events:none;box-shadow:var(--sh-2)}
.toast.on{opacity:1;transform:translate(-50%,0)}

/* ─── 반응형 ─────────────────────────────────────────── */
@media(max-width:980px){
  .hero{padding:44px 0 52px}
  .hero .in{grid-template-columns:1fr;gap:30px}
  .camp{order:-1}
}
@media(max-width:900px){
  .fgrid{grid-template-columns:1fr}
  .story{grid-template-columns:1fr;gap:28px}
  .editorial{grid-template-columns:1fr}
  .ft .cols{grid-template-columns:1fr 1fr}
  .nav{display:none}
  /* ⛔ 햄버거는 «안 줄어든다». 줄여서 자리를 만들면 손가락이 못 맞춘다 —
       좁아지는 몫은 언어 고르개가 받는다(아래 max-width:560 블록). */
  .burger{display:grid;flex:0 0 auto}
  .nav.open{
    display:flex;position:absolute;top:66px;left:0;right:0;flex-direction:column;gap:2px;
    background:var(--paper);border-bottom:1px solid var(--line);padding:10px 16px 16px;
    box-shadow:var(--sh-1);
  }
  /* 버거 목록 안 — 몰의 문들도 세로로 다 편다.
     ★ 2026-08-08 폰 피드백: 하위 다섯 문은 «접혀» 있다가 Online Service 탭으로
       펼친다(.svc.open — js/site.js). 늘 펼쳐 두니 메뉴가 너무 길었다.
     ⛔ 위쪽 :focus-within 규칙(같은 특이도)이 다시 열지 못하는 이유는
       이 블록이 파일에서 «뒤»이기 때문 — 순서를 바꾸면 탭 전에 열려 버린다. */
  .nav.open .svc-drop{
    position:static;border:0;box-shadow:none;border-radius:0;
    padding:0 0 4px 14px;min-width:0;display:none;
  }
  .nav.open .svc.open .svc-drop{display:block}
  .nav.open .svc-top .ext{display:none}   /* 탭=펼치기가 되므로 «새 창» 표시는 거짓 */
  .nav.open .svc-top .chev{display:inline-block;margin-left:5px;transition:transform .18s}
  .nav.open .svc.open .svc-top .chev{transform:rotate(180deg)}
  .nav.open .nav-util{
    display:flex;flex-direction:column;align-items:stretch;gap:2px;
    border-left:0;margin:8px 0 0;padding:8px 0 0;border-top:1px solid var(--line);
  }
  .sec{padding:58px 0}
  .finder{padding:22px;border-radius:18px}
  .facts{grid-template-columns:1fr}
}
@media(max-width:560px){
  .hd .in{gap:10px;padding:0 16px}
  .brand img{width:128px}

  /* ── 좁은 폰에서 머리글이 «가로로» 삐져나가던 자리 (2026-08-05) ──────
     ⛔ 머리 한 줄은 로고 128 + 언어 139 + 햄버거 32 + 사이 20 + 안여백 32
        = 351px «최소»였다. 344px 폰에서 2px, 320px 에서 25px 이 삐져나가
        페이지 전체가 옆으로 굴렀다. 바닥과는 무관한, 원래 있던 탈이다.
     ⛔ 「좁으면 로고를 줄인다」로 막지 않는다. 언어 이름이 길면
        (Bahasa Indonesia·Tiếng Việt) 360px 에서도 같은 일이 난다 —
        폭으로 조건을 걸면 그 언어에서 다시 터진다.
     ★ 그래서 «언어 고르개가 줄어들게» 한다. 밀어내지 않고 자기가 좁아진다.
       min-width:0 이 없으면 flex 항목은 글자 폭 밑으로 안 줄어든다 — 이 한 줄이
       핵심이다. 넘칠 때만 줄고, 넘치는 글자는 이미 달려 있는 말줄임표가 받는다.
     ⛔ 로고와 햄버거는 안 줄인다. 로고는 브랜드 워드마크고, 햄버거는
        줄이면 손가락 자리가 무너진다. */
  .langsel{flex:0 1 auto;min-width:0}
  .langsel select{max-width:100%}
  .grid{grid-template-columns:repeat(2,1fr);gap:14px}
  .card h3{font-size:14px}
  .card .price{font-size:16px}
  .shades{grid-template-columns:repeat(2,1fr)}
  .wrap{padding:0 16px}

  /* ── 바닥 — 폰에서 «세 칸»으로 (사람 지시 2026-08-05) ──────────
     ⛔ 한 칸으로 세워 두었더니 링크 여덟 줄이 세로로 늘어서, 바닥만
        화면 하나를 넘게 먹었다. 「쇼핑」을 보고 「안내」까지 가려면
        엄지로 두 번을 쓸어야 했다 — 바닥은 그렇게 긴 곳이 아니다.
     ★ 로고·회사 소개만 한 줄 통으로 두고, 묶음 셋은 나란히 세운다.
       375px 기준 한 칸 106px — 「셰이드 파인더」가 들어가는 폭이다.
     ⛔ word-break:keep-all 이 있어야 「주문·배송 문의」가 글자 가운데서
        끊기지 않는다. 없으면 「주문·배송 문」 / 「의 ↗」 처럼 잘린다.
     ⛔ 칸을 좁히면서 글씨도 줄었다 — 그만큼 위아래 여백을 «늘려»
        손가락 자리를 지킨다(약 37px). 줄인 만큼 다시 좁히면 안 된다. */
  .ft{padding:40px 0 26px}
  .ft .cols{grid-template-columns:repeat(3,1fr);gap:24px 12px}
  .ft .cols>:first-child{grid-column:1/-1}
  .ft h4{font-size:11px;letter-spacing:.14em;margin:0 0 6px}
  .ft .cols a{font-size:13px;padding:9px 0;line-height:1.4;word-break:keep-all}
  .ft .bot{margin-top:26px}
}

/* ─── 접근성 : 모션 최소화 ───────────────────────────── */
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.01ms!important;animation-iteration-count:1!important;
    transition-duration:.01ms!important;scroll-behavior:auto!important}
  .rv{opacity:1;transform:none}
}

/* ═══ 가상 발색 (Virtual Try-on) ═══════════════════════════
   사진은 기기 밖으로 나가지 않는다. 아래는 그 화면의 스타일. */
.ty{position:fixed;inset:0;z-index:110;display:none}
.ty.on{display:block}
.ty-bg{position:absolute;inset:0;background:rgba(25,19,22,.55);backdrop-filter:blur(4px)}
.ty-pane{position:absolute;inset:0;margin:auto;width:min(1120px,100%);height:min(94vh,100%);
  background:var(--paper);border-radius:0;overflow:auto;box-shadow:var(--sh-2);
  animation:tyin .34s var(--ease)}
@media(min-width:920px){.ty-pane{border-radius:20px;height:min(90vh,940px)}}
@keyframes tyin{from{transform:translateY(18px);opacity:.5}to{transform:none;opacity:1}}
.ty-top{position:sticky;top:0;z-index:6;display:flex;align-items:center;gap:14px;
  padding:13px 18px;background:rgba(255,253,252,.94);backdrop-filter:blur(12px);
  border-bottom:1px solid var(--line)}
.ty-t{flex:1;min-width:0;line-height:1.3}
.ty-t b{display:block;font-size:16px;font-weight:700}
.ty-t span{display:block;font-size:12.5px;color:var(--ink-3)}
.ty-priv{font-size:12px;color:var(--ok);background:#E7F6EE;border:1px solid #9AD6B5;
  border-radius:999px;padding:5px 11px;white-space:nowrap}
/* ★ 2026-08-08 — 폰에서 개인정보 칩(nowrap ~260px)이 한 줄 머리의 자리를 다 먹어
   제목이 한 글자씩 세로로 무너졌다(실측 스크린샷). 폰에서는 줄을 바꾼다 —
   1행: 「가상 발색」+설명(+닫기), 2행: 칩. 제목·설명은 각자 «한 줄»을 지킨다. */
@media(max-width:600px){
  .ty-top{flex-wrap:wrap;gap:8px 10px;padding:12px 14px}
  .ty-t{flex:1 1 200px}
  .ty-t b{white-space:nowrap}
  .ty-t span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .ty-top .iconbtn{order:1;margin-left:auto}
  .ty-priv{order:2}
}
.ty-body{padding:22px}

/* 동의 */
.ty-consent{max-width:640px;margin:10px auto 0}
.ty-consent h3{font-family:var(--serif);font-size:25px;font-weight:400;margin:0 0 12px}
.ty-consent .lead{font-size:16px;line-height:1.7;color:var(--ink-2);margin:0 0 18px}
.ty-consent ul{margin:0;padding:0 0 0 4px;list-style:none;display:flex;flex-direction:column;gap:10px}
.ty-consent li{position:relative;padding-left:26px;font-size:15px;line-height:1.65;color:var(--ink-2)}
.ty-consent li::before{content:'';position:absolute;left:6px;top:9px;width:7px;height:7px;
  border-radius:50%;background:var(--coral)}
.ty-consent .age{margin:16px 0 0;font-size:13.5px;color:var(--warn);background:#FFF8EF;
  border:1px solid #F0DFC6;border-radius:10px;padding:11px 13px}
.ty-chk{display:flex;gap:10px;align-items:flex-start;margin-top:16px;font-size:14.5px;
  line-height:1.6;cursor:pointer;color:var(--ink)}
.ty-chk input{margin-top:3px;width:17px;height:17px;accent-color:var(--coral);flex:0 0 auto}
.ty-chk.small{font-size:13.5px;margin-top:10px}
.ty-row{display:flex;gap:10px;margin-top:22px}
.ty-row.wrap{flex-wrap:wrap;margin-top:16px}
.ty-row .btn{padding:11px 20px;font-size:14.5px}
.ty-row .btn:disabled{opacity:.4;cursor:not-allowed;transform:none;box-shadow:none}

/* 사진 선택 */
.ty-pick{max-width:560px;margin:22px auto 0;text-align:center}
.ty-ic{font-size:46px;line-height:1}
.ty-pick .hint{color:var(--ink-2);margin:12px 0 0;font-size:15px}
.ty-pick .ty-row{justify-content:center}
.disc{font-size:12.5px;color:var(--ink-3);line-height:1.6;margin-top:18px}

/* 편집 */
.ty-edit{display:grid;grid-template-columns:1.25fr 1fr;gap:22px;align-items:start}
@media(max-width:860px){.ty-edit{grid-template-columns:1fr}}
.ty-stage{position:relative;background:#f2ecea;border-radius:14px;overflow:hidden;
  display:flex;align-items:center;justify-content:center;min-height:220px}
.ty-cv{max-width:100%;max-height:min(62vh,560px);display:block;object-fit:contain}
.ty-ell{position:absolute;border:2px dashed rgba(31,138,145,.95);border-radius:50%;
  box-shadow:0 0 0 9999px rgba(25,19,22,.08) inset;cursor:move;touch-action:none}
.ty-ell:focus-visible{outline:3px solid var(--coral);outline-offset:2px}
/* ★ 얼굴을 찾았으면 이 원은 할 일이 없다 — 사진을 어지럽히지 않게 감춘다.
   display:none 이 아니라 여기서 감추는 이유는, 못 찾은 사진으로 바뀌면
   같은 요소를 그대로 다시 쓰기 때문이다(자리 계산이 이미 붙어 있다). */
.ty-ell.off{opacity:0;pointer-events:none;visibility:hidden}
.ty-ell .h{position:absolute;width:16px;height:16px;border-radius:50%;background:#fff;
  border:2px solid var(--coral);box-shadow:0 1px 4px rgba(0,0,0,.28)}
.ty-ell .h-mv{left:calc(50% - 8px);top:-8px}
.ty-ell .h-rz{right:-8px;bottom:-8px;cursor:nwse-resize}
.ty-ctl{display:flex;flex-direction:column;gap:14px}
.ty-shades .lab,.ty-sl .lab{font-size:11.5px;letter-spacing:.16em;font-weight:700;
  color:var(--ink-3);text-transform:uppercase;margin-bottom:8px}
.ty-sl .lab{display:flex;justify-content:space-between}
.ty-sl .lab b{color:var(--ink);letter-spacing:0;font-variant-numeric:tabular-nums}
/* ★ 2026-08-03 — 색을 «제품별 책»으로 세운다(내 색 도감과 같은 배치).
   전에는 이름 없는 동그라미 36개가 세 줄로 늘어서 있어, 마음에 든 색을
   다시 찾지 못했다. 도감은 처음부터 제품마다 묶고 색 아래 이름을 적는다. */
.ty-books{display:flex;flex-direction:column;gap:16px}
.ty-book .hd{display:flex;align-items:baseline;gap:8px;margin-bottom:8px}
.ty-book .hd b{font-size:13px;font-weight:700;letter-spacing:-.01em;color:var(--ink)}
.ty-book .hd .c{font-size:11.5px;color:var(--ink-3);font-variant-numeric:tabular-nums}
.ty-book .sws{display:grid;grid-template-columns:repeat(auto-fill,minmax(56px,1fr));gap:10px 6px}
.ty-book .cell{display:flex;flex-direction:column;align-items:center;gap:5px;min-width:0}
.ty-book .cell .nm{font-size:10.5px;line-height:1.25;color:var(--ink-3);text-align:center;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}
@media (max-width:520px){
  .ty-book .sws{grid-template-columns:repeat(auto-fill,minmax(48px,1fr))}
  .ty-book .cell .nm{font-size:9.5px}
}
.ty-shades .strip{display:flex;flex-wrap:wrap;gap:6px}
.ty-shades .sw{width:28px;height:28px;border-radius:50%;box-shadow:inset 0 0 0 1px rgba(0,0,0,.16);
  transition:transform .16s var(--ease),box-shadow .16s}
.ty-shades .sw:hover{transform:scale(1.12)}
.ty-shades .sw.on{box-shadow:0 0 0 2px #fff,0 0 0 4px var(--ink)}
/* ⛔ «직계» 자식만. 색마다 이름표(.cell .nm)가 생겼는데 후손 선택자로 두면
   그 작은 이름표까지 13px 로 키우고 여백을 준다 — 격자가 무너진다.
   JS 의 paintName() 도 같은 이유로 '.ty-shades > .nm' 을 쓴다. */
.ty-shades > .nm{font-size:13px;color:var(--ink-2);margin-top:9px;min-height:1.3em}
.ty-sl input[type=range]{width:100%;accent-color:var(--coral)}
.ty-hint{font-size:13px;color:var(--ink-3);line-height:1.6;margin:2px 0 0;
  background:var(--paper-2);border:1px solid var(--line);border-radius:10px;padding:10px 12px}

/* 저장한 사진 */
.ty-gal{max-width:640px;margin:30px auto 0;border-top:1px solid var(--line);padding-top:20px}
.ty-gal .hd{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:12px}
.ty-gal .hd b{font-size:14px}
.chip.small{padding:5px 12px;font-size:12.5px}
.ty-gal .grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(104px,1fr));gap:10px}
.ty-gal .empty{grid-column:1/-1;text-align:center;color:var(--ink-3);font-size:14px;
  border:1px dashed var(--line);border-radius:12px;padding:24px}
.ty-gal .it{position:relative;border:1px solid var(--line);border-radius:11px;overflow:hidden;background:#fff}
.ty-gal .it img{width:100%;aspect-ratio:3/4;object-fit:cover;display:block}
.ty-gal .it .b{display:block;height:4px}
.ty-gal .it .n{display:block;font-size:10.5px;padding:5px 6px 6px;color:var(--ink-2);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ty-gal .it .x{position:absolute;top:5px;right:5px;width:22px;height:22px;border-radius:50%;
  background:rgba(0,0,0,.6);color:#fff;font-size:14px;line-height:1;display:grid;place-items:center}

.ty-toast{position:fixed;left:50%;bottom:26px;transform:translate(-50%,16px);opacity:0;z-index:130;
  background:var(--ink);color:#fff;padding:11px 18px;border-radius:999px;font-size:14px;
  transition:opacity .28s,transform .28s var(--ease);pointer-events:none;box-shadow:var(--sh-2)}
.ty-toast.on{opacity:1;transform:translate(-50%,0)}

/* 셰이드 카드의 «입혀보기» 버튼 */
.shade{position:relative}
.tryon-btn{position:absolute;top:7px;right:7px;z-index:3;background:rgba(25,19,22,.72);
  color:#fff;font-size:11px;font-weight:600;border-radius:999px;padding:5px 10px;
  opacity:0;transform:translateY(-4px);transition:opacity .2s,transform .2s var(--ease);
  backdrop-filter:blur(6px)}
.shade:hover .tryon-btn,.shade:focus-within .tryon-btn{opacity:1;transform:none}
@media(hover:none){.tryon-btn{opacity:1;transform:none}}

/* ═══ 내 색 도감 ═══════════════════════════════════════════ */
.cx-head{display:flex;align-items:center;gap:16px;flex-wrap:wrap;margin-bottom:16px}
.cx-num{font-size:15px;color:var(--ink-2);white-space:nowrap}
.cx-num b{font-family:var(--serif);font-size:26px;color:var(--ink)}
.cx-prog{flex:1;min-width:160px;height:6px;background:var(--line);border-radius:6px;overflow:hidden}
.cx-prog span{display:block;height:100%;background:linear-gradient(90deg,var(--coral),var(--gold));
  border-radius:6px;transition:width .6s var(--ease)}
.cx-sig{background:#fff;border:1px solid var(--line);border-radius:14px;padding:14px 16px;margin-bottom:18px}
.cx-sig .l{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.cx-sig .k{font-size:11.5px;letter-spacing:.16em;font-weight:700;color:var(--ink-3);text-transform:uppercase}
.cx-sig .c{width:20px;height:20px;border-radius:50%;box-shadow:inset 0 0 0 1px rgba(0,0,0,.15)}
.cx-sig .none{font-size:14px;color:var(--ink-3)}
.cx-sig .h{margin:8px 0 0;font-size:13px;color:var(--ink-3);line-height:1.6}
.cx-first{background:var(--paper-2);border:1px solid var(--line);border-radius:16px;
  padding:22px;margin-bottom:20px;text-align:center}
.cx-first p{margin:0 0 16px;color:var(--ink-2);font-size:15px}
.cx-ways{display:grid;grid-template-columns:1fr 1fr;gap:14px}
@media(max-width:600px){.cx-ways{grid-template-columns:1fr}}
.cx-ways .way{background:#fff;border:1px solid var(--line);border-radius:13px;padding:16px}
.cx-ways .wt{font-size:14px;color:var(--ink-2);margin-bottom:12px;line-height:1.5}
.cx-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:10px}
.cx,.cx>*{display:block}
.cx{border:1px solid var(--line);border-radius:13px;background:#fff;padding:12px;text-align:left;
  width:100%;transition:transform .2s var(--ease),box-shadow .2s var(--ease),border-color .2s}
.cx:hover{transform:translateY(-3px);box-shadow:var(--sh-1);border-color:var(--ink-3)}
.cx .sw{width:34px;height:34px;border-radius:50%;box-shadow:inset 0 0 0 1px rgba(0,0,0,.14);margin-bottom:9px}
.cx .sw.q{background:repeating-linear-gradient(45deg,#f3eeef,#f3eeef 5px,#eae3e4 5px,#eae3e4 10px);
  color:var(--ink-3);font-size:15px;font-weight:700;line-height:34px;text-align:center;
  box-shadow:inset 0 0 0 1px var(--line)}
.cx .n{font-size:12.5px;font-weight:600;line-height:1.35;letter-spacing:-.01em}
.cx .m{font-size:11px;color:var(--ink-3);margin-top:3px;line-height:1.35}
.cx.got{border-color:transparent;box-shadow:var(--sh-1)}
.cx:not(.got){background:var(--paper-2)}
.cx:not(.got) .n{color:var(--ink-3)}
.cx-local{font-size:12px;color:var(--ok);margin-top:14px}

/* ═══ CHRONO NOMADS — 공통 ═════════════════════════════ */
.gm{position:fixed;inset:0;z-index:112;display:none}
.gm.on{display:block}
.gm-bg{position:absolute;inset:0;background:rgba(10,8,14,.74);backdrop-filter:blur(5px)}
.gm-pane{position:absolute;inset:0;margin:auto;width:min(1000px,100%);height:min(94vh,100%);
  background:#12101a;color:#e8e3ea;overflow:auto;box-shadow:var(--sh-2);animation:tyin .34s var(--ease)}
@media(min-width:920px){.gm-pane{border-radius:20px;height:min(92vh,920px)}}
.gm-top{position:sticky;top:0;z-index:9;display:flex;align-items:center;gap:12px;padding:13px 18px;
  background:rgba(18,16,26,.95);backdrop-filter:blur(12px);border-bottom:1px solid #2a2635}
.gm-t{flex:1;min-width:0;line-height:1.3}
.gm-t b{display:block;font-size:15px;font-weight:700;letter-spacing:.14em}
.gm-t span{display:block;font-size:12.5px;color:#9a93a6;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.gm .iconbtn{color:#b9b1c4}
.gm .iconbtn:hover{background:#221f2d;color:#fff}
.gm-body{padding:24px}
.gm-body h3{font-family:var(--serif);font-size:27px;font-weight:400;margin:8px 0 0;color:#fff;line-height:1.3}
.gm-body .k{font-size:11px;letter-spacing:.3em;color:#c9a14a;font-weight:700}
.gm-body .lead{font-size:15.5px;line-height:1.8;color:#c8c1d2;margin:14px 0 0}
.gm-body .hint{font-size:13px;color:#8f8799;margin:6px 0 0;line-height:1.6}
.gm-body .lab{font-size:11.5px;letter-spacing:.16em;font-weight:700;color:#9a93a6;
  text-transform:uppercase;margin-top:26px}
.gm-row{display:flex;gap:10px;align-items:center;margin-top:22px;flex-wrap:wrap}
.gm .btn.c{background:var(--coral);color:#fff}
.gm .btn.c:disabled{opacity:.35;cursor:not-allowed;transform:none}
.gm .btn.g{background:#221f2d;color:#e8e3ea;border:1px solid #332e40;box-shadow:none}
.gm .btn.g:hover{border-color:#4a4459;transform:translateY(-2px)}
.gm .chip{background:#221f2d;border-color:#332e40;color:#cfc8da;margin-top:14px}
.gm-cur{display:inline-flex;align-items:center;gap:8px;font-size:13.5px;color:#c8c1d2}
.gm-cur i{width:16px;height:16px;border-radius:50%;box-shadow:inset 0 0 0 1px rgba(255,255,255,.25)}
.gm-sigs{display:flex;flex-direction:column;gap:14px;margin-top:12px}
.gm-sigs .gl{font-size:12px;color:#9a93a6;margin-bottom:7px}
.gm-sigs .row{display:flex;gap:7px;flex-wrap:wrap}
.gm-sigs .sw{width:30px;height:30px;border-radius:50%;box-shadow:inset 0 0 0 1px rgba(255,255,255,.2);
  transition:transform .16s var(--ease),box-shadow .16s}
.gm-sigs .sw:hover{transform:scale(1.14)}
.gm-sigs .sw.on{box-shadow:0 0 0 2px #12101a,0 0 0 4px #fff}
.gm-hint{font-size:13px;color:#8f8799;margin:10px 0 0;text-align:center}
.gm-panel{margin-top:18px;background:#191627;border:1px solid #2a2635;border-radius:14px;padding:16px}
.gm-ph{display:flex;align-items:baseline;justify-content:space-between;gap:12px;margin-bottom:12px}
.gm-ph b{font-size:14px;color:#fff}
.gm-ph span{font-size:12.5px;color:#8f8799;font-variant-numeric:tabular-nums}
.gm-clues{display:flex;flex-direction:column;gap:9px}
.gm-clues .cl{display:flex;gap:10px;align-items:flex-start;font-size:14.5px;line-height:1.6;color:#cfc8da}
.gm-clues .cl i{width:9px;height:9px;border-radius:50%;margin-top:7px;flex:0 0 auto}
.gm-clues .cl.faint span{color:#8f8799;font-style:italic}
.gm-clues .cl.faint i{opacity:.5}
.gm-panel .btn{margin-top:16px}
.gm-msg{background:#241d2e;border:1px solid #3a2f47;border-radius:11px;padding:12px 14px;
  font-size:13.5px;line-height:1.65;color:#d9cfe4;margin-bottom:14px}
.gm-msg.flash{animation:flash .5s var(--ease)}
@keyframes flash{from{background:#3a2b48}to{background:#241d2e}}
.gm-opts{display:flex;flex-direction:column;gap:9px;margin-top:18px}
.gm-opts .op{text-align:left;background:#191627;border:1px solid #2a2635;border-radius:12px;
  padding:14px 16px;font-size:15px;line-height:1.6;color:#cfc8da;transition:border-color .18s,background .18s}
.gm-opts .op:hover{border-color:#4a4459;background:#1e1a2c}
.gm-opts .op.on{border-color:var(--coral);background:#2a1d22;color:#fff}
.gm-fb{font-size:14px;margin:14px 0 0;min-height:1.4em;color:#9a93a6}
.gm-fb.bad{color:#f0a08f}
.gm-deduce .gm-clues{margin-top:14px;background:#191627;border:1px solid #2a2635;
  border-radius:12px;padding:14px}
.gm-card{display:flex;align-items:center;gap:16px;margin-top:20px;background:#191627;
  border:1px solid #2a2635;border-radius:16px;padding:18px;position:relative;overflow:hidden}
.gm-card .sw{width:62px;height:62px;border-radius:50%;background:var(--c);flex:0 0 auto;
  box-shadow:0 0 0 1px rgba(255,255,255,.2),0 0 34px var(--c)}
.gm-card .mt{min-width:0}
.gm-card .mt b{display:block;font-family:var(--serif);font-size:21px;color:#fff}
.gm-card .mt span{display:block;font-size:13px;color:#a79fb4;margin-top:3px}
.gm-card .mt .p{color:#8f8799;font-size:12.5px}
.gm-note{margin-top:18px;background:#1b2330;border:1px solid #2b3a4d;border-radius:12px;
  padding:13px 15px;font-size:13.5px;line-height:1.7;color:#a9c0d6}
.gm-note span{color:#7f93a8}
/* 셰이드 카드의 게임 진입 버튼 */
.game-btn{position:absolute;top:7px;left:7px;z-index:3;background:rgba(18,16,26,.78);
  color:#fff;font-size:11px;font-weight:600;border-radius:999px;padding:5px 10px;
  opacity:0;transform:translateY(-4px);transition:opacity .2s,transform .2s var(--ease);
  backdrop-filter:blur(6px)}
.shade:hover .game-btn,.shade:focus-within .game-btn{opacity:1;transform:none}
@media(hover:none){.game-btn{opacity:1;transform:none}}

/* ═══ CHRONO NOMADS — 웹툰 연출 ═══════════════════════════ */
.gm-svg{position:absolute;inset:0;width:100%;height:100%;display:block}
/* 스크린톤 — 웹툰의 망점 */
/* ★ 2026-08-01 — 화면에서 그림을 «다시» 어둡게 하고 있었다.
   .tone 은 검은 망점을 30% 곱연산으로 덮었고, .vig 는 가장자리를 검정 55% 로
   눌렀다. 그림을 아무리 밝게 뽑아도 화면에서 되돌아갔다.
   세계관 3판은 아침이다. 망점은 웹툰의 질감이니 남기되 «아주 옅게», 
   비네트는 검정 대신 «따뜻한 그늘»로 바꾼다. */
.tone{position:absolute;inset:0;pointer-events:none;opacity:.10;
  background-image:radial-gradient(#000 0.6px,transparent 0.8px);
  background-size:5px 5px;mix-blend-mode:multiply}
.vig{position:absolute;inset:0;pointer-events:none;
  background:radial-gradient(78% 72% at 50% 45%,rgba(0,0,0,0) 55%,rgba(90,60,45,.16) 100%)}
/* 집중선 */
.lines{position:absolute;inset:0;pointer-events:none;opacity:.34;
  background:repeating-conic-gradient(from 0deg at 50% 50%,
    rgba(255,255,255,.55) 0deg 0.7deg,rgba(255,255,255,0) 0.7deg 5deg);
  mask-image:radial-gradient(circle at 50% 50%,transparent 26%,#000 76%);
  -webkit-mask-image:radial-gradient(circle at 50% 50%,transparent 26%,#000 76%)}

/* ── 사건 목록 ─────────────────────────────────── */
.gm-list .lead{max-width:44em}
.gm-count{margin-top:14px;font-size:13px;letter-spacing:.1em;color:#c9a14a;font-weight:700}
.gm-cases{display:grid;grid-template-columns:repeat(auto-fill,minmax(196px,1fr));gap:14px;margin-top:18px}
.cs{position:relative;aspect-ratio:4/3;border-radius:14px;overflow:hidden;border:2px solid #2a2635;
  background:#0b0a11;transition:transform .25s var(--ease),border-color .2s,box-shadow .25s var(--ease)}
.cs:hover{transform:translateY(-4px);border-color:#c9a14a;box-shadow:0 14px 34px rgba(0,0,0,.5)}
.cs .ov{position:absolute;inset:0;display:flex;flex-direction:column;justify-content:flex-end;
  padding:12px 13px;text-align:left;
  background:linear-gradient(0deg,rgba(8,6,14,.92) 0%,rgba(8,6,14,.25) 55%,rgba(8,6,14,0) 100%)}
.cs .ov>*{display:block}
.cs .no{font-size:10px;letter-spacing:.22em;color:#c9a14a;font-weight:700}
.cs .pl{font-family:var(--serif);font-size:21px;color:#fff;margin-top:2px;line-height:1.1}
.cs .wh{font-size:11.5px;color:#9a93a6;margin-top:3px}
.cs .st{position:absolute;top:10px;right:11px;font-size:10.5px;font-weight:700;
  padding:3px 8px;border-radius:999px;background:rgba(0,0,0,.5);color:#9a93a6;
  border:1px solid #3a3446}
.cs.done .st{background:rgba(21,115,74,.85);color:#fff;border-color:transparent}
.cs.done{border-color:#2f5f49}

/* ── 웹툰 인트로 패널 ──────────────────────────── */
.wt{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-top:16px}
@media(max-width:700px){.wt{grid-template-columns:1fr;gap:10px}}
.wp{position:relative;aspect-ratio:4/3;border:3px solid #0a0810;border-radius:4px;overflow:hidden;
  background:#0b0a11;box-shadow:0 6px 18px rgba(0,0,0,.5);opacity:0;transform:translateY(14px)}
@media (prefers-reduced-motion:no-preference){
  .wp{animation:wpin .55s var(--ease) forwards}
  @keyframes wpin{to{opacity:1;transform:none}}
}
@media (prefers-reduced-motion:reduce){.wp{opacity:1;transform:none;animation:none}}
.wp .cap{position:absolute;left:0;right:0;bottom:0;padding:20px 12px 11px;font-size:12.5px;
  line-height:1.55;color:#efe9f3;text-align:left;
  background:linear-gradient(0deg,rgba(6,5,10,.94),rgba(6,5,10,0))}
.wp .sfx{position:absolute;top:12%;left:8%;font-family:var(--serif);font-style:italic;
  font-size:30px;font-weight:700;color:#fff;letter-spacing:-.02em;opacity:0;
  text-shadow:2px 2px 0 #0a0810,-1px -1px 0 #0a0810,0 0 18px rgba(255,255,255,.4);
  transform:rotate(-8deg) scale(.7)}
@media (prefers-reduced-motion:no-preference){
  .wp .sfx{animation:sfxin .45s var(--ease) forwards}
  @keyframes sfxin{to{opacity:1;transform:rotate(-8deg) scale(1)}}
}
@media (prefers-reduced-motion:reduce){.wp .sfx{opacity:1;transform:rotate(-8deg)}}
.wp.b .sfx{left:auto;right:10%;font-size:24px}
.wp.c .sfx{left:auto;right:8%;top:16%;font-size:34px;color:#ffd9a8}

/* ── 현장 ─────────────────────────────────────── */
.gm-stage{position:relative;aspect-ratio:16/7.4;max-height:min(46vh,420px);border-radius:4px;
  overflow:hidden;border:3px solid #0a0810;box-shadow:0 10px 30px rgba(0,0,0,.55);background:#0b0a11}
.gm-place{position:absolute;top:10px;left:12px;z-index:4;text-align:left;
  text-shadow:1px 1px 0 rgba(0,0,0,.8)}
.gm-place b{display:block;font-family:var(--serif);font-size:20px;color:#fff;line-height:1.1}
.gm-place i{display:block;font-style:normal;font-size:11.5px;color:#c9a14a;letter-spacing:.12em}
.gm-stage .tr{position:absolute;width:46px;height:46px;transform:translate(-50%,-50%);
  border-radius:50%;display:grid;place-items:center;z-index:5}
.gm-stage .tr .dot{width:14px;height:14px;border-radius:50%;background:var(--c);
  box-shadow:0 0 16px var(--c),0 0 0 1px rgba(255,255,255,.35);transition:transform .2s var(--ease)}
.gm-stage .tr .ring{position:absolute;width:30px;height:30px;border-radius:50%;
  border:1.5px solid var(--c);opacity:.5}
.gm-stage .tr:hover .dot{transform:scale(1.3)}
@media (prefers-reduced-motion:no-preference){
  .gm-stage .tr:not(.lock):not(.got) .ring{animation:ping 2.6s ease-out infinite}
  @keyframes ping{0%{transform:scale(.7);opacity:.75}70%,100%{transform:scale(1.7);opacity:0}}
}
.gm-stage .tr.lock .dot{background:#4a4459;box-shadow:none;opacity:.5}
.gm-stage .tr.lock .ring{display:none}
.gm-stage .tr.faint .dot{opacity:.5;box-shadow:0 0 8px var(--c)}
.gm-stage .tr.got .dot{background:#fff;box-shadow:0 0 22px rgba(255,255,255,.85)}
.gm-stage .tr.got .ring{border-color:#fff;opacity:.7;animation:none;transform:scale(1.25)}
/* 잉크 튀김 */
.ink{position:absolute;width:8px;height:8px;transform:translate(-50%,-50%);border-radius:50%;
  background:var(--c);pointer-events:none;z-index:6;
  box-shadow:14px -8px 0 -2px var(--c),-12px 9px 0 -3px var(--c),9px 13px 0 -3px var(--c),
             -15px -6px 0 -4px var(--c),4px -16px 0 -4px var(--c);
  animation:splash .85s var(--ease) forwards}
@keyframes splash{0%{opacity:.95;transform:translate(-50%,-50%) scale(.2)}
  100%{opacity:0;transform:translate(-50%,-50%) scale(2.4)}}

/* ── 결말 컷 ──────────────────────────────────── */
.gm-close{position:relative;aspect-ratio:21/8;border:3px solid #0a0810;border-radius:4px;
  overflow:hidden;box-shadow:0 10px 30px rgba(0,0,0,.55);display:grid;place-items:center;
  margin-bottom:20px;background:#0b0a11}
.gm-close .q{position:relative;z-index:3;font-family:var(--serif);font-size:clamp(17px,2.4vw,25px);
  color:#fff;text-align:center;padding:0 22px;line-height:1.5;
  text-shadow:0 2px 12px rgba(0,0,0,.9)}
.gm-all{margin-top:16px;background:linear-gradient(90deg,rgba(201,161,74,.22),rgba(201,161,74,.05));
  border:1px solid #6b5528;border-radius:12px;padding:13px 15px;font-size:14.5px;color:#ffd9a8}
.gm-back{background:none;color:#b9b1c4;font-size:13px;padding:6px 10px;border-radius:8px;
  white-space:nowrap;transition:background .18s,color .18s}
.gm-back:hover{background:#221f2d;color:#fff}

/* ═══ 웹툰 뷰어 ═══════════════════════════════════════════ */
.wv{position:fixed;inset:0;z-index:114;display:none}
.wv.on{display:block}
.wv-bg{position:absolute;inset:0;background:rgba(8,6,12,.8);backdrop-filter:blur(6px)}
.wv-pane{position:absolute;inset:0;margin:auto;width:min(760px,100%);height:min(96vh,100%);
  background:#100e16;color:#eae5ef;overflow:auto;box-shadow:var(--sh-2);animation:tyin .34s var(--ease)}
@media(min-width:820px){.wv-pane{border-radius:20px;height:min(94vh,900px)}}
.wv-top{position:sticky;top:0;z-index:9;display:flex;align-items:center;gap:12px;padding:12px 16px;
  background:rgba(16,14,22,.95);backdrop-filter:blur(12px);border-bottom:1px solid #292437}
.wv-t{flex:0 1 auto;min-width:0;line-height:1.25}
.wv-t b{display:block;font-size:14px;font-weight:700}
.wv-t span{display:block;font-size:11.5px;color:#928aa4;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.wv-prog{flex:1;height:3px;background:#292437;border-radius:3px;overflow:hidden;min-width:40px}
.wv-prog span{display:block;height:100%;width:0;background:linear-gradient(90deg,var(--coral),#c9a14a);
  transition:width .5s var(--ease)}
.wv .iconbtn{color:#b6aec6}
.wv .iconbtn:hover{background:#211d2e;color:#fff}
.wv-body{padding:20px}
.wv .btn.c{background:var(--coral);color:#fff}
.wv .btn.g{background:#211d2e;color:#e8e3ea;border:1px solid #332e42;box-shadow:none}
.wv .btn.g:hover{border-color:#4a4459;transform:translateY(-2px)}
.wv .chip{background:#211d2e;border-color:#332e42;color:#cfc8da}
.wv-row{display:flex;gap:10px;align-items:center;margin-top:20px;flex-wrap:wrap}
.wv-row.wrap{flex-wrap:wrap}
.wv-hint{font-size:12.5px;color:#847c96;line-height:1.6;margin:10px 0 0}
.wv-svg{position:absolute;inset:0;width:100%;height:100%}

/* 표지 */
.wv-cover{position:relative;border-radius:6px;overflow:hidden;border:3px solid #0a0810;
  min-height:min(64vh,520px);display:grid;place-items:end start}
.wv-cover .in{position:relative;z-index:3;padding:26px 24px 26px;width:100%;
  background:linear-gradient(0deg,rgba(8,6,12,.94) 20%,rgba(8,6,12,0))}
.wv-cover .k{font-size:11px;letter-spacing:.3em;color:#c9a14a;font-weight:700}
.wv-cover h2{font-family:var(--hand);font-size:clamp(32px,6vw,48px);font-weight:400;color:#fff;
  margin:10px 0 0;line-height:1.24;letter-spacing:-.02em}
.wv-cover p{color:#c3bbd0;font-size:15px;line-height:1.8;margin:14px 0 0;white-space:pre-line}
.wv-cover .m{font-size:12px;color:#847c96;margin-top:12px}
.wv-cover .row{display:flex;gap:10px;margin-top:20px;flex-wrap:wrap}
.wv-cover .hint{font-size:12px;color:#6f6883;margin-top:12px}

/* 승인된 작화 — 도형 위, 색보정(.tone/.vig) 아래.
   승인은 한 컷씩 되므로 도형 컷과 그림 컷이 오래 섞여 있는다.
   두 상태가 같은 자리·같은 비율이어야 화면이 들썩이지 않는다. */
.wv-art{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block}
/* 인물은 잘리면 안 된다. 비율을 지키고 바닥에 붙인다. */
.wv-art.ch{object-fit:contain;object-position:50% 100%}

/* AI 생성물 표기 (docs/v3/40 §6-5) — 그림과 같이 붙고 같이 걷힌다.
   색·아이콘만으로 알리지 않는다. 글자로 적고, 접근성 트리에 남긴다. */
.wv-ai{position:absolute;right:8px;bottom:7px;z-index:5;display:inline-flex;align-items:center;gap:5px;
  font-size:10.5px;font-weight:600;color:#efe9f5;background:rgba(10,8,16,.84);
  border:1px solid rgba(255,255,255,.3);border-radius:999px;padding:3px 9px;
  text-shadow:0 1px 2px rgba(0,0,0,.85);pointer-events:none}
.wv-ai i{font-size:8px;color:#c9a14a;font-style:normal}
/* ★ 미승인 그림은 «눈에 띄게» 다르다. 조용히 섞이면 승인 절차가 무의미해진다.
   이 상태는 로컬 미리보기에서만 나온다 — 배포본에는 미승인 목록이 없다(R4). */
.wv-ai.is-pending{background:rgba(240,194,106,.92);color:#2a2010;font-weight:700}
.wv-ai.is-pending i{color:#7a5c10}
[data-art-pending]{outline:2px solid rgba(240,194,106,.55);outline-offset:-2px}
@media (max-width:520px){.wv-ai{font-size:9.5px;padding:2px 7px;right:6px;bottom:5px}}

/* 컷 */
.wv-panel{position:relative;aspect-ratio:4/3;border:3px solid #0a0810;border-radius:4px;
  overflow:hidden;box-shadow:0 8px 24px rgba(0,0,0,.55);background:#0b0a11}
.wv-panel.sm{aspect-ratio:16/7}
.wv-panel .sfx{position:absolute;top:11%;right:8%;z-index:4;font-family:var(--serif);font-style:italic;
  font-size:clamp(22px,5vw,34px);font-weight:700;color:#fff;transform:rotate(-7deg);
  text-shadow:2px 2px 0 #0a0810,-1px -1px 0 #0a0810,0 0 18px rgba(255,255,255,.35)}
/* ★ 내레이션도 그림을 덮지 않는다.
   검은 막을 95% 로 깔았더니 그림이 거의 안 보였다. 그림을 보여 주려고
   만든 화면인데 글 상자가 그림을 가렸다.
   막을 옅게 하고 글자는 외곽선으로 버틴다 — 말풍선과 같은 원칙이다. */
.wv-narr{position:absolute;left:0;right:0;bottom:0;z-index:3;padding:34px 20px 18px;
  font-size:clamp(15px,2.4vw,18px);line-height:1.85;color:#fff;white-space:pre-line;
  text-shadow:0 1px 2px rgba(0,0,0,.98), 0 0 7px rgba(0,0,0,.9);
  background:linear-gradient(0deg,rgba(8,6,12,.42) 25%,rgba(8,6,12,0))}
/* ★ 말풍선은 «테두리만» 그린다.
   흰 바탕을 96% 불투명으로 깔았더니 그림을 거의 다 가렸다 —
   그림을 보여 주려고 만든 화면인데 그림이 안 보였다.
   안은 비우고, 글씨는 흰색에 외곽선으로 버틴다. 웹툰의 방식이다. */
.wv-bubble{position:absolute;left:16px;right:16px;bottom:16px;z-index:3;
  background:rgba(12,10,18,.20);
  color:#fff;border:2px solid rgba(255,255,255,.92);
  border-radius:16px;padding:13px 16px;
  text-shadow:0 1px 2px rgba(0,0,0,.98), 0 0 6px rgba(0,0,0,.85);
  filter:drop-shadow(0 3px 8px rgba(0,0,0,.5))}
/* 꼬리 — 겹친 삼각형 둘로 «테두리 있는 꼬리»를 만든다 */
.wv-bubble::before, .wv-bubble::after{content:'';position:absolute;left:26px;width:0;height:0;
  border:9px solid transparent;border-bottom:0}
.wv-bubble::before{bottom:-11px;border-top-color:rgba(255,255,255,.92)}
.wv-bubble::after{bottom:-8px;border-top-color:rgba(12,10,18,.20)}
.wv-bubble .who{display:block;font-size:11px;letter-spacing:.16em;font-weight:700;
  color:#ffc7ba;text-shadow:0 1px 2px rgba(0,0,0,.98)}
.wv-bubble .sp{display:block;font-size:15px;line-height:1.75;margin-top:5px;white-space:pre-line}

/* 서사 컷 — 위쪽 내레이션(장르 목소리 / 이어지는 문장) */
.wv-narr.top{top:0;bottom:auto;padding:16px 108px 34px 20px;
  background:linear-gradient(180deg,rgba(8,6,12,.42) 25%,rgba(8,6,12,0));
  font-size:clamp(14px,2.2vw,16.5px);color:#fff}
/* ★ 장르 목소리는 «다른 사람이 말하는 것»으로 읽혀야 한다.

   장르마다 다섯 박자 전부에 그 장르의 목소리 한 줄이 얹힌다(50줄이 쓰여 있다).
   그런데 이어지는 지문과 글꼴·색·크기가 같아서, 장르를 골라도 무엇이 바뀌었는지
   보이지 않았다 — 실제로 「장르가 아무것도 안 바꾸는 것 아니냐」는 말을 들었다.
   바꾸고 있었는데 화면이 그걸 말하지 않았다.

   한국어에 이탤릭은 없다(합성 기울임이 되어 지저분해진다). 색과 표식으로 가른다. */
.wv-narr.gv{color:#ffd2c6;font-size:clamp(13.5px,2.1vw,16px)}
.wv-narr.gv::before{content:'';display:inline-block;width:15px;height:1px;
  background:var(--coral);vertical-align:middle;margin-right:9px;opacity:.95}

/* 두 내레이션이 한 패널에 겹치지 않도록 */
.wv-panel.sc{aspect-ratio:16/9;margin-top:12px}
.wv-panel.sc + .wv-panel.sc{margin-top:8px}
/* ★ 한 박자의 «두 번째» 컷 — 같은 장소를 가까이 본다.
   전에는 위아래 두 컷이 완전히 같은 그림이었다(같은 인자로 만들고 있었다).
   도시마다 컷이 4장뿐이라 새로 그리는 대신 화각을 바꾼다.
   틀 비율도 같이 바꿔야 «다른 컷»으로 읽힌다 — 확대만 하면 같은 컷의 확대로 보인다.
   .wv-panel 에 overflow:hidden 이 있어 넘치는 부분은 잘린다. */
/* ★ :not(.ch) — 인물 컷은 키우지 않는다.
   .wv-art.ch 도 .wv-art 라서, 범위를 안 좁히면 배경과 함께 사람까지 확대된다. */
.wv-panel.sc.push{aspect-ratio:16/7}
.wv-panel.sc.push .wv-art:not(.ch){transform:scale(1.34);transform-origin:52% 38%}

/* 장소마다 같은 실루엣을 다르게 칠한다.
   실내는 창 하나만 남기고 덮고, 창가는 유리 프레임을 얹고, 거리는 더 깊게 눌러 준다. */
.wv-panel[data-scene] .sc-ov{position:absolute;inset:0;z-index:2;pointer-events:none}
/* 실내는 전용 SVG 를 쓰므로 덮개는 가장자리만 살짝 눌러 준다 */
.wv-panel[data-scene="room"]::before{content:'';position:absolute;inset:0;z-index:2;
  background:radial-gradient(115% 95% at 62% 34%,rgba(6,5,10,0) 34%,rgba(6,5,10,.62) 100%)}
.wv-panel[data-scene="window"]::before{content:'';position:absolute;inset:0;z-index:2;
  background:linear-gradient(0deg,rgba(6,5,10,.55),rgba(6,5,10,.05) 40%),
    repeating-linear-gradient(90deg,transparent 0 49%,rgba(10,8,16,.85) 49% 50.4%,transparent 50.4% 100%),
    repeating-linear-gradient(0deg,transparent 0 63%,rgba(10,8,16,.85) 63% 64.4%,transparent 64.4% 100%)}
.wv-panel[data-scene="window"]::after{content:'';position:absolute;inset:6px;z-index:2;
  border:5px solid rgba(10,8,16,.9);border-radius:2px}
.wv-panel[data-scene="street"]::before{content:'';position:absolute;inset:0;z-index:2;
  background:radial-gradient(90% 70% at 50% 78%,rgba(6,5,10,0) 0%,rgba(6,5,10,.72) 100%)}

/* 선택 */
.wv-pick{margin-top:18px}
.wv-pick h3{font-family:var(--serif);font-size:clamp(19px,3.4vw,25px);font-weight:400;color:#fff;
  margin:0;line-height:1.4}
.wv-pick .opts{display:flex;flex-direction:column;gap:9px;margin-top:16px}
.wv-pick .op{text-align:left;background:#191625;border:1px solid #292437;border-radius:13px;
  padding:15px 17px;font-size:15.5px;line-height:1.6;color:#d3cbe0;
  transition:border-color .18s,background .18s,transform .18s var(--ease)}
.wv-pick .op:hover{border-color:var(--coral);background:#221a24;color:#fff;transform:translateX(3px)}

/* 발색 3장 */
.wv-swatch h3{font-family:var(--serif);font-size:clamp(19px,3.4vw,25px);font-weight:400;color:#fff;
  margin:0 0 16px;line-height:1.4}
.sw3{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}
.sw3 .sw,.sw3 .sw>*{display:block}
.sw3 .sw{border:2px solid #292437;border-radius:14px;overflow:hidden;background:#191625;padding:0;
  transition:transform .22s var(--ease),border-color .2s,box-shadow .22s}
.sw3 .sw:hover{transform:translateY(-5px);border-color:#fff;box-shadow:0 14px 30px rgba(0,0,0,.5)}
.sw3 .im{aspect-ratio:1/1;overflow:hidden}
.sw3 .im img{width:100%;height:100%;object-fit:cover}
.sw3 .bar{height:7px}

/* 드러남 */
.wv-reveal{position:relative;display:flex;align-items:center;gap:18px;margin-top:6px;
  background:#191625;border:1px solid #292437;border-radius:18px;padding:18px;overflow:hidden}
.wv-reveal .halo{position:absolute;inset:0;
  background:radial-gradient(50% 120% at 18% 50%,var(--c),rgba(0,0,0,0) 62%);opacity:.30}
.wv-reveal .ph{position:relative;width:104px;height:104px;border-radius:16px;overflow:hidden;flex:0 0 auto;
  box-shadow:0 0 0 1px rgba(255,255,255,.18),0 0 40px var(--c)}
.wv-reveal .ph img{width:100%;height:100%;object-fit:cover}
.wv-reveal .mt{position:relative;min-width:0}
.wv-reveal .mt .k{font-size:10.5px;letter-spacing:.28em;color:#c9a14a;font-weight:700}
.wv-reveal .mt b{display:block;font-family:var(--serif);font-size:26px;color:#fff;margin-top:4px;line-height:1.15}
.wv-reveal .mt span{display:block;font-size:12.5px;color:#a79fb4;margin-top:3px}
.wv-reveal .mt .p{color:#847c96;font-size:12px}
.wv-rt{font-family:var(--serif);font-size:clamp(21px,4vw,29px);font-weight:400;color:#fff;
  margin:22px 0 0;line-height:1.45;letter-spacing:-.02em}
.wv-basis{margin-top:18px;background:#151321;border:1px solid #262133;border-radius:14px;padding:16px}
.wv-basis .k{font-size:10.5px;letter-spacing:.22em;color:#8e86a2;font-weight:700}
.wv-basis .chain{display:flex;flex-wrap:wrap;gap:6px;margin-top:11px;align-items:center}
.wv-basis .tg{font-size:12.5px;background:#241f33;border:1px solid #342d47;border-radius:999px;
  padding:4px 11px;color:#cfc8da}
.wv-basis .tg.last{background:var(--coral);border-color:transparent;color:#fff;font-weight:600}
.wv-basis .why{margin-top:12px;font-size:13.5px;line-height:1.85;color:#9d95b0}
.wv-basis .nd{margin:12px 0 0;font-size:12.5px;color:#7d7591;line-height:1.6;
  border-top:1px solid #262133;padding-top:10px}

/* 이야기에 쓰인 답 — 색의 근거와 시각적으로 분리한다.
   테두리를 다르게 주는 것이 «이건 색을 정한 게 아니다»를 가장 빨리 전달한다. */
.wv-usedt{margin-top:14px;padding:13px 14px;border:1px dashed #302a42;border-radius:11px;
  background:#12101c}
.wv-usedt .k{color:#7f7894}
.wv-usedt .chain{margin-top:9px}
.wv-basis .tg.soft{background:transparent;border-style:dashed;border-color:#3a3350;color:#a49bb8;
  font-size:12px}
.wv-usedt .nd{border-top:0;padding-top:8px;margin-top:9px;font-size:12px;color:#726a86}

/* 하제가 당신의 답에 반응하는 컷 */
.wv-panel.echo{aspect-ratio:16/8}
/* 하제가 «당신이 말해 준 것»에 답하는 컷 — 테두리를 코럴로 구분한다 */
.wv-panel.echo .wv-bubble{border-color:var(--coral)}
.wv-panel.echo .wv-bubble::before{border-top-color:var(--coral)}
.wv-echo{position:absolute;left:16px;top:14px;z-index:4;display:inline-flex;align-items:center;gap:7px;
  background:rgba(10,8,16,.72);border:1px solid rgba(255,255,255,.16);border-radius:999px;
  padding:4px 11px;backdrop-filter:blur(3px)}
.wv-echo i{font-style:normal;font-size:9.5px;letter-spacing:.16em;color:#b6adc6;font-weight:700}
.wv-echo b{font-size:12px;color:#fff;font-weight:600}
@media (max-width:640px){
  .wv-panel.echo{aspect-ratio:4/3}
  .wv-echo{left:10px;top:10px;padding:3px 9px}
  .wv-echo b{font-size:11px}
}

/* 이름 */
.wv-name h3{font-family:var(--serif);font-size:clamp(20px,3.6vw,26px);font-weight:400;color:#fff;
  margin:8px 0 0;line-height:1.4}
.wv-name input{width:100%;margin-top:16px;background:#191625;border:1px solid #332e42;border-radius:12px;
  padding:14px 16px;font:inherit;font-size:16px;color:#fff}
.wv-name input:focus{outline:2px solid var(--coral);outline-offset:2px;border-color:transparent}

/* 완료 */
.wv-done .card{display:flex;align-items:center;gap:16px;background:#191625;border:1px solid #292437;
  border-radius:18px;padding:18px;position:relative;overflow:hidden}
.wv-done .card .sw{width:64px;height:64px;border-radius:50%;background:var(--c);flex:0 0 auto;
  box-shadow:0 0 0 1px rgba(255,255,255,.2),0 0 36px var(--c)}
.wv-done .card .m{min-width:0}
.wv-done .card b{display:block;font-family:var(--serif);font-size:23px;color:#fff}
.wv-done .card span{display:block;font-size:12.5px;color:#a79fb4;margin-top:3px}
.wv-done .card .tg{color:#c9a14a}

/* ═══ 페르소나 카드 (도감 안) ═══════════════════════════ */
.pn{position:relative;display:flex;align-items:center;gap:16px;background:#fff;
  border:1px solid var(--line);border-radius:16px;padding:16px 18px;margin-bottom:18px}
.pn.empty{display:block;background:var(--paper-2)}
.pn .k{font-size:11px;letter-spacing:.2em;font-weight:700;color:var(--ink-3);text-transform:uppercase}
.pn .n{font-size:15px;color:var(--ink-2);margin-top:6px}
.pn .h{font-size:13px;color:var(--ink-3);margin:4px 0 12px}
.pn .av{position:relative;width:58px;height:58px;border-radius:50%;flex:0 0 auto;
  background:var(--c);box-shadow:0 0 0 1px rgba(0,0,0,.1),0 6px 20px color-mix(in srgb,var(--c) 45%,transparent)}
.pn .av .ring{position:absolute;inset:-5px;border-radius:50%;border:1px solid var(--c);opacity:.45}
.pn .m{min-width:0;flex:1}
.pn .m b{display:block;font-family:var(--serif);font-size:21px;color:var(--ink);margin-top:4px;line-height:1.2}
.pn .m .c{display:block;font-size:12.5px;color:var(--ink-3);margin-top:3px}
.pn .tags{display:flex;flex-wrap:wrap;gap:5px;margin-top:9px;align-items:center}
.pn .tags .l{font-size:10.5px;color:var(--ink-3);letter-spacing:.1em;margin-right:2px}
.pn .tags i{font-style:normal;font-size:11.5px;background:var(--paper-2);border:1px solid var(--line);
  border-radius:999px;padding:3px 9px;color:var(--ink-2)}
.pn .lo{display:block;font-size:11px;color:var(--ok);margin-top:9px}
.pn .x{position:absolute;top:10px;right:12px;width:26px;height:26px;border-radius:50%;
  color:var(--ink-3);font-size:17px;line-height:1;display:grid;place-items:center}
.pn .x:hover{background:var(--paper-2);color:var(--ink)}

/* ═══ 히어로의 웹툰 진입 ═══════════════════════════════ */
.hero-story{margin-top:26px;display:flex;align-items:center;gap:14px;flex-wrap:wrap}
.hero-story .ep{font-size:12px;color:var(--ink-3)}
.hero-alt{display:inline-flex;align-items:center;min-height:34px;padding:6px 10px;
  font-size:14px;font-weight:500;color:var(--ink-2);border-radius:9px;
  text-decoration:underline;text-underline-offset:3px;transition:background .18s,color .18s}
.hero-alt:hover{background:rgba(255,255,255,.55);color:var(--ink)}

/* ═══ 웹툰 v2 — 도시 · 장르 · 취향 · 3색 ═══════════════════ */
.wv-back{background:none;color:#b6aec6;font-size:13px;padding:6px 10px;border-radius:8px;
  white-space:nowrap;transition:background .18s,color .18s}
.wv-back:hover{background:#211d2e;color:#fff}
.wv-k{font-size:11px;letter-spacing:.28em;color:#c9a14a;font-weight:700}
.wv-h{font-family:var(--serif);font-size:clamp(21px,3.8vw,29px);font-weight:400;color:#fff;
  margin:10px 0 0;line-height:1.35;letter-spacing:-.02em}
.wv-h.sm{font-size:clamp(18px,3vw,23px);margin-top:20px}
.wv-p{font-size:14.5px;line-height:1.75;color:#a79fb4;margin:10px 0 0}
.wv-p b{color:#e0d8ec}
.wv-why{font-size:12.5px;color:#8f86a4;margin:8px 0 0;line-height:1.6}
.wv-local{font-size:12.5px;color:#6fd6a8;margin:12px 0 0;background:rgba(111,214,168,.08);
  border:1px solid rgba(111,214,168,.25);border-radius:10px;padding:9px 12px;line-height:1.6}
.wv-teen{font-size:12.5px;color:#f0c98a;background:rgba(240,201,138,.08);
  border:1px solid rgba(240,201,138,.28);border-radius:10px;padding:9px 12px;margin:14px 0 0;line-height:1.6}

/* 도시 격자 */
.wv-cities{display:grid;grid-template-columns:repeat(auto-fill,minmax(122px,1fr));gap:9px;margin-top:18px}
.ct{position:relative;aspect-ratio:4/3;border-radius:11px;overflow:hidden;border:2px solid #292437;
  background:#0b0a11;transition:transform .22s var(--ease),border-color .2s}
.ct:hover{transform:translateY(-3px);border-color:#c9a14a}
.ct.on{border-color:var(--coral);box-shadow:0 0 0 2px rgba(31,138,145,.35)}
.ct .ov{position:absolute;inset:0;display:flex;align-items:flex-end;padding:8px 9px;
  background:linear-gradient(0deg,rgba(8,6,12,.9) 10%,rgba(8,6,12,0) 70%)}
.ct .n{font-size:13px;font-weight:600;color:#fff;text-shadow:0 1px 3px rgba(0,0,0,.7)}

/* 장르 */
.wv-genres{display:grid;grid-template-columns:repeat(auto-fill,minmax(108px,1fr));gap:9px;margin-top:18px}
.gn{display:flex;flex-direction:column;align-items:center;gap:7px;padding:16px 8px;
  background:#191625;border:1px solid #292437;border-radius:14px;
  transition:transform .2s var(--ease),border-color .2s,background .2s}
.gn:hover{transform:translateY(-3px);border-color:var(--coral);background:#221a24}
.gn.on{border-color:var(--coral);background:#2a1d22}
.gn .i{font-size:24px;line-height:1}
.gn .n{font-size:13.5px;font-weight:600;color:#d3cbe0}

/* 선택지 (취향·이야기 공통) */
.wv-opts{display:flex;flex-direction:column;gap:9px;margin-top:16px}
.wv-opts .op{text-align:left;background:#191625;border:1px solid #292437;border-radius:13px;
  padding:15px 17px;font-size:15.5px;line-height:1.6;color:#d3cbe0;
  transition:border-color .18s,background .18s,transform .18s var(--ease)}
.wv-opts .op:hover{border-color:var(--coral);background:#221a24;color:#fff;transform:translateX(3px)}
.wv-opts .op.on{border-color:var(--coral);background:#2a1d22;color:#fff}

/* 장소 이름은 만화의 «장면 표제»처럼 오른쪽 위에 둔다.
   왼쪽 위는 내레이션 자리라 서로 겹친다(실제로 겹쳤다). */
.wv-place{position:absolute;top:9px;right:12px;z-index:4;text-shadow:1px 1px 0 rgba(0,0,0,.8);
  background:rgba(10,8,16,.62);border-radius:4px;padding:2px 9px}
.wv-place b{font-family:var(--serif);font-size:15px;color:#fff;letter-spacing:.02em}
.wv-input{width:100%;margin-top:16px;background:#191625;border:1px solid #332e42;border-radius:12px;
  padding:14px 16px;font:inherit;font-size:16px;color:#fff}
.wv-input:focus{outline:2px solid var(--coral);outline-offset:2px;border-color:transparent}

/* 3색 제안 */
.wv-three{display:grid;grid-template-columns:repeat(3,1fr);gap:11px;margin-top:18px}
@media(max-width:640px){.wv-three{grid-template-columns:1fr}}
.th{background:#191625;border:1px solid #292437;border-radius:16px;overflow:hidden;
  transition:transform .22s var(--ease),border-color .2s,box-shadow .22s}
.th:hover{transform:translateY(-4px);border-color:var(--c);box-shadow:0 14px 32px rgba(0,0,0,.45)}
.th .im{aspect-ratio:1/1;overflow:hidden;position:relative}
.th .im::after{content:'';position:absolute;inset:0;box-shadow:inset 0 -30px 40px -20px var(--c)}
.th .im img{width:100%;height:100%;object-fit:cover}
.th .m{padding:12px 13px 4px}
.th .m b{display:block;font-family:var(--serif);font-size:17px;color:#fff;line-height:1.2}
.th .m span{display:block;font-size:11.5px;color:#9a92a8;margin-top:3px}
.th .r{display:flex;flex-direction:column;gap:6px;padding:10px 13px 13px}
.wv .btn.sm{padding:9px 14px;font-size:13px;justify-content:center}

/* 카메라 */
.ty-cam{max-width:560px;margin:8px auto 0;text-align:center}
.ty-cam .camstage{position:relative;border-radius:16px;overflow:hidden;background:#0f0d14;
  aspect-ratio:4/3;display:grid;place-items:center}
.ty-cam video{width:100%;height:100%;object-fit:cover;transform:scaleX(-1);display:block}
.ty-cam .guide{position:absolute;left:50%;top:62%;transform:translate(-50%,-50%);
  width:34%;height:13%;border:2px dashed rgba(31,138,145,.85);border-radius:50%;pointer-events:none}
.ty-cam .hint{font-size:14px;color:var(--ink-2);margin:12px 0 0}
.ty-cam .priv{font-size:12.5px;color:var(--ok);margin:8px 0 0}
.ty-cam .ty-row{justify-content:center}

/* 부위 선택 — 얼굴 인식이 됐을 때만 나타난다 */
.ty-parts{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin:2px 0 12px}
.ty-parts .k{width:100%;font-size:10.5px;letter-spacing:.18em;color:#9b93ab;font-weight:700;
  margin-bottom:2px}
.ty-parts .pt{min-height:34px;padding:6px 13px;border-radius:999px;font-size:13px;
  background:#191625;border:1px solid #2d2740;color:#c9c1d6;cursor:pointer}
.ty-parts .pt:hover{border-color:#463c60}
.ty-parts .pt.on{background:var(--coral);border-color:transparent;color:#fff;font-weight:600}
.ty-parts .pt:focus-visible{outline:2px solid var(--coral);outline-offset:2px}
.ty-lmon{width:100%;margin:6px 0 0;font-size:11.5px;color:#7f8f76}
.ty-lmoff{width:100%;margin:0;font-size:12px;color:#8d859d;line-height:1.6}

/* 추천의 성격을 밝히는 안내 — 결과 아래.
   접어 두되 요약 한 줄은 항상 보인다. 경고문을 쌓으면 아무도 안 읽는다. */
.wv-note{margin-top:14px;background:#141220;border:1px solid #262133;border-radius:14px;padding:15px 16px}
.wv-note .lead{margin:0;font-size:13.5px;line-height:1.8;color:#bdb5cc}
.wv-note .lead b{color:#efe9f6}
.wv-note .more{margin-top:11px}
.wv-note summary{cursor:pointer;font-size:12.5px;color:#9d94b2;padding:5px 0;min-height:32px;
  display:flex;align-items:center;gap:6px}
.wv-note summary:hover{color:#cfc7dc}
.wv-note summary:focus-visible{outline:2px solid var(--coral);outline-offset:3px;border-radius:6px}
.wv-note .in{padding:4px 0 2px;border-top:1px solid #262133;margin-top:6px}
.wv-note .in .k{font-size:10.5px;letter-spacing:.2em;color:#8a81a0;font-weight:700;margin:12px 0 6px}
.wv-note .in p{margin:0 0 7px;font-size:12.5px;line-height:1.8;color:#948ca8}
.wv-note .in p b{color:#c4bcd4;font-weight:600}
.wv-note .chip{margin-top:12px;min-height:36px}

/* 측정값 — 접어 두되 열면 한계까지 같은 상자 안에 있다 */
.ty-meas{margin:0 0 14px}
.ty-mdet summary{cursor:pointer;font-size:12.5px;color:#9d94b2;min-height:32px;
  display:flex;align-items:center}
.ty-mdet summary:hover{color:#cfc7dc}
.ty-mdet summary:focus-visible{outline:2px solid var(--coral);outline-offset:3px;border-radius:6px}
.ty-mdet .in{border-top:1px solid #262133;margin-top:6px;padding-top:9px}
.ty-mdet .mrow{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:7px;font-size:12.5px}
.ty-mdet .mrow .k{color:#8d85a1;min-width:104px}
.ty-mdet .mrow b{color:#efe9f6;font-variant-numeric:tabular-nums;font-weight:600}
.ty-mdet .mrow i{font-style:normal;color:#7f7794;font-size:11.5px}
.ty-mdet .chipc{width:15px;height:15px;border-radius:4px;border:1px solid rgba(255,255,255,.22);
  flex:0 0 auto}
.ty-mdet .lim{margin:9px 0 0;font-size:11.5px;line-height:1.75;color:#847c98}
.ty-mdet .lim b{color:#a79ebb;font-weight:600}

/* 측정값 기반 재추천 */
.ty-reco{margin:0 0 14px}
.ty-rdet summary{cursor:pointer;font-size:12.5px;color:#9d94b2;min-height:32px;
  display:flex;align-items:center}
.ty-rdet summary:hover{color:#cfc7dc}
.ty-rdet summary:focus-visible{outline:2px solid var(--coral);outline-offset:3px;border-radius:6px}
.ty-rdet .in{border-top:1px solid #262133;margin-top:6px;padding-top:9px}
.ty-rdet .k{font-size:10.5px;letter-spacing:.16em;color:#8a81a0;font-weight:700;margin:11px 0 3px}
.ty-rdet .k:first-child{margin-top:0}
.ty-rdet .why{margin:0 0 8px;font-size:11.5px;line-height:1.7;color:#877f9c}
.ty-rdet .why b{color:#a79ebb;font-weight:600}
.ty-rdet .row{display:flex;flex-wrap:wrap;gap:7px}
.ty-rdet .rs{display:flex;align-items:center;gap:7px;background:#191625;border:1px solid #2d2740;
  border-radius:10px;padding:6px 10px 6px 7px;min-height:36px;cursor:pointer;text-align:left}
.ty-rdet .rs:hover{border-color:var(--coral)}
.ty-rdet .rs:focus-visible{outline:2px solid var(--coral);outline-offset:2px}
.ty-rdet .rs .sw{width:16px;height:16px;border-radius:5px;background:var(--c);
  border:1px solid rgba(255,255,255,.2);flex:0 0 auto}
.ty-rdet .rs .nm{display:flex;flex-direction:column;line-height:1.3}
.ty-rdet .rs .nm b{font-size:12px;color:#e7e1ef;font-weight:600}
.ty-rdet .rs .nm i{font-style:normal;font-size:10.5px;color:#8a819f;font-variant-numeric:tabular-nums}
.ty-rdet .cmp{margin:13px 0 0;padding:9px 11px;border-radius:9px;background:#16131f;
  font-size:12px;line-height:1.75;color:#a89fbb}
.ty-rdet .cmp.diff{background:#1d1524;border:1px solid #3a2a44}
.ty-rdet .cmp b{color:#e7e1ef;font-weight:600}
.ty-rdet .lim{margin:9px 0 0;font-size:11.5px;line-height:1.75;color:#847c98}
.ty-rdet .lim b{color:#a79ebb;font-weight:600}

/* 빌드 식별자 — 함께 검토할 때 «어느 버전인가»를 맞추기 위해 */
.notice .bid{display:inline-block;margin-left:10px;padding:1px 8px;border-radius:999px;
  background:rgba(255,255,255,.13);font-size:11px;letter-spacing:.06em;
  font-variant-numeric:tabular-nums;color:rgba(255,255,255,.72)}

/* ═══ 가상 발색 v2 — 바르는 법·조명 손잡이 ═══════════════════
   히어로(herolip.css)와 «같은 뜻»의 조작을 가상 발색에도 둔다.
   herolip.css 를 여기서 불러 쓰지 않는다 — 저쪽은 히어로 짜임(2단 그리드)에
   묶여 있고, 이쪽은 모달 안이다. 공유하는 것은 계산(lipengine.js)이지
   레이아웃이 아니다. */
.ty-wear { margin-top: 14px }
.ty-wear .lab {
  font-size: 11px; letter-spacing: .2em; font-weight: 700;
  color: var(--ink-2, #6b5b60); text-transform: uppercase;
}
.ty-wear .modes { display: flex; gap: 6px; margin-top: 7px; flex-wrap: wrap }
.ty-wear .md {
  flex: 1 1 90px; min-width: 0; cursor: pointer;
  border: 1px solid rgba(25, 19, 22, .12); border-radius: 10px;
  background: #fff; padding: 8px 9px; font-size: 12.5px; font-weight: 500;
  transition: border-color .18s, background .18s, color .18s;
}
.ty-wear .md:hover { border-color: rgba(25, 19, 22, .3) }
.ty-wear .md.on { background: var(--ink, #191316); color: #fff; border-color: var(--ink, #191316) }
.ty-wear .md:focus-visible { outline: 2px solid var(--coral, #1f8a91); outline-offset: 2px }

.ty-wear .slots { display: flex; gap: 6px; margin-top: 7px }
.ty-wear .sl {
  flex: 1 1 0; min-width: 0; cursor: pointer; text-align: left;
  display: flex; align-items: center; gap: 7px;
  border: 1px solid rgba(25, 19, 22, .12); border-radius: 10px;
  background: var(--paper-2, #f6efec); padding: 6px 8px;
}
.ty-wear .sl .sw {
  width: 22px; height: 22px; border-radius: 6px; flex: none;
  box-shadow: 0 0 0 1px rgba(0, 0, 0, .08) inset;
}
.ty-wear .sl .tx { min-width: 0 }
.ty-wear .sl i {
  display: block; font-style: normal; font-size: 9.5px; letter-spacing: .1em;
  color: var(--ink-2, #6b5b60); text-transform: uppercase;
}
.ty-wear .sl b {
  display: block; font-size: 11.5px; font-weight: 600;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
/* 지금 채워 넣을 자리 — 테두리와 «점»으로 같이 알린다(색만으로 알리지 않는다) */
.ty-wear .sl.on { border-color: var(--ink, #191316); box-shadow: 0 0 0 1px var(--ink, #191316) }
.ty-wear .sl.on i::after { content: ' ●'; color: var(--coral, #1f8a91) }
.ty-wear .sl:focus-visible { outline: 2px solid var(--coral, #1f8a91); outline-offset: 2px }

/* 조명 손잡이 — 무대 어디를 눌러도 그 자리로 빛이 간다 */
.ty-puck {
  position: absolute; z-index: 6;
  width: 30px; height: 30px; margin: -15px 0 0 -15px;
  border: 0; border-radius: 50%; padding: 0; cursor: grab;
  background: rgba(255, 252, 244, .92); color: #8a6a2f;
  box-shadow: 0 0 0 1px rgba(0, 0, 0, .12), 0 3px 12px rgba(0, 0, 0, .3),
              0 0 18px 5px rgba(255, 224, 170, .5);
  display: grid; place-items: center; touch-action: none;
  transition: transform .18s cubic-bezier(.4, 0, .2, 1), opacity .18s;
}
.ty-puck svg { width: 18px; height: 18px; fill: currentColor; stroke: currentColor; stroke-width: 1.6 }
.ty-puck svg circle { stroke: none }
.ty-puck:hover { transform: scale(1.1) }
.ty-puck:active { cursor: grabbing; transform: scale(.96) }
.ty-puck.off { opacity: .35 }
.ty-puck:focus-visible { outline: 2px solid #fff; outline-offset: 3px }

@media (prefers-reduced-motion: reduce) {
  .ty-puck, .ty-wear .md, .ty-wear .sl { transition: none !important }
}


/* 각도(사용자가 직접 찍은 여러 장) · 피부톤 호수 */
.ty-shots, .ty-tone { margin-top: 14px }
.ty-shots .lab, .ty-tone .lab {
  font-size: 11px; letter-spacing: .2em; font-weight: 700;
  color: var(--ink-2, #6b5b60); text-transform: uppercase;
}
.ty-shots .row { display: flex; gap: 7px; margin-top: 7px; flex-wrap: wrap }
.ty-shots .sh {
  position: relative; padding: 0; border: 0; cursor: pointer;
  width: 54px; height: 54px; border-radius: 10px; overflow: hidden;
  background: var(--paper-2, #f6efec);
  box-shadow: 0 0 0 1px rgba(25, 19, 22, .12);
}
.ty-shots .sh img { width: 100%; height: 100%; object-fit: cover; display: block }
.ty-shots .sh.on { box-shadow: 0 0 0 2px var(--ink, #191316) }
.ty-shots .sh .del {
  position: absolute; right: 2px; top: 2px; width: 17px; height: 17px;
  border: 0; border-radius: 50%; cursor: pointer; padding: 0;
  background: rgba(25, 19, 22, .8); color: #fff; font-size: 12px; line-height: 17px;
}
.ty-shots .add {
  width: 54px; height: 54px; border-radius: 10px; cursor: pointer;
  border: 1px dashed rgba(25, 19, 22, .3); background: none;
  font-size: 20px; color: var(--ink-2, #6b5b60);
}
.ty-shots .add:hover { border-color: var(--ink, #191316); color: var(--ink, #191316) }
.ty-shots .hint, .ty-tone .note {
  margin: 6px 0 0; font-size: 11px; line-height: 1.55; color: var(--ink-3, #9b8b90);
}
.ty-tone .note b { color: var(--ink-2, #6b5b60) }

.ty-tone .row { display: flex; gap: 5px; margin-top: 7px }
.ty-tone .tn {
  flex: 1 1 0; min-width: 0; cursor: pointer; padding: 0; border: 0; background: none;
  display: flex; flex-direction: column; align-items: center; gap: 3px;
  color: var(--ink-2, #6b5b60);
}
.ty-tone .tn .sw {
  width: 100%; height: 24px; border-radius: 7px;
  box-shadow: 0 0 0 1px rgba(0, 0, 0, .09) inset;
}
.ty-tone .tn .no { font-size: 10px; font-weight: 600 }
/* 고른 호수는 테두리와 «굵은 글씨»로 같이 알린다(색만으로 알리지 않는다) */
.ty-tone .tn.on { color: var(--ink, #191316) }
.ty-tone .tn.on .sw { box-shadow: 0 0 0 2px var(--ink, #191316), 0 0 0 4px rgba(25, 19, 22, .12) }
.ty-tone .tn.on .no { font-weight: 800 }
.ty-tone .tn:focus-visible { outline: 0 }
.ty-tone .tn:focus-visible .sw { outline: 2px solid var(--coral, #1f8a91); outline-offset: 3px }

@media (prefers-reduced-motion: reduce) {
  .ty-shots .sh, .ty-tone .tn .sw { transition: none !important }
}

/* 피부톤은 접어 둔다 — 펼 때 계산한다(번져 나가기가 무겁다) */
.ty-tonebox { margin-top: 14px; border-top: 1px solid rgba(25,19,22,.08); padding-top: 12px }
.ty-tonebox > summary {
  cursor: pointer; list-style: none;
  font-size: 11px; letter-spacing: .2em; font-weight: 700;
  color: var(--ink-2, #6b5b60); text-transform: uppercase;
}
.ty-tonebox > summary::-webkit-details-marker { display: none }
.ty-tonebox > summary::after { content: " +"; color: var(--coral, #1f8a91) }
.ty-tonebox[open] > summary::after { content: " 2" }
.ty-tonebox > summary:focus-visible { outline: 2px solid var(--coral, #1f8a91); outline-offset: 2px }
.ty-tonebox .ty-tone { margin-top: 8px }

/* ═══ 인스타그램 — 공식몰과 같은 위젯 ═══════════════════════════
   ⛔ 남의 서비스(SnapWidget)를 우리 화면에 들이는 유일한 자리다.
     방문자 IP 가 그쪽으로 간다 — 개인정보처리방침 초안(docs/17)에
     처리자로 적어 두었다. 화면에 들어올 때까지 안 부른다(loading=lazy).
   ★ 높이는 «비율»로 잡는다. 공식몰은 iframe 크기를 재주는 스크립트를
     하나 더 부르는데, 우리는 그 스크립트 없이 같은 모양을 낸다 —
     6칸 2줄 격자라 폭의 1/3 이 높이다(실측 1140x382 ≈ 3:1).
     외부 스크립트를 하나라도 덜 부르는 쪽을 택했다. */
.insta{padding:70px 0 78px}
.insta .ihead{text-align:center;margin-bottom:28px}
.insta h2{font-size:clamp(18px,2vw,22px);letter-spacing:.22em;font-weight:600;color:var(--ink)}
.insta .ihandle{margin:10px 0 6px}
.insta .ihandle a{font-size:clamp(15px,1.6vw,18px);font-weight:600;color:var(--ink);
  text-decoration:none;border-bottom:1px solid transparent}
.insta .ihandle a:hover,.insta .ihandle a:focus-visible{border-bottom-color:var(--ink)}
.insta .ip{font-size:14px;color:var(--ink-2);margin:0}
.insta .iframe-box{position:relative;width:100%;aspect-ratio:3/1;overflow:hidden}
.insta iframe{width:100%;height:100%;border:0;display:block}
@media (max-width:760px){
  .insta{padding:52px 0 56px}
  /* ★ 비율을 바꾸지 않는다. 「좁아지면 줄을 바꾸겠지」로 3/2 를 줬다가
     빈 공간만 생겼다 — 이 위젯은 폭이 좁아져도 6칸을 유지한다.
     남의 위젯이 어떻게 접히는지는 «짐작하지 말고 재야» 한다. */
}

/* ═══ 폰에서의 셰이드 파인더 — 아홉 줄을 세 줄로 ═══════════════
   ★ 2026-08-04 사람 지적: 톤·깊이·제형이 줄바꿈으로 늘어서 화면을 다 먹었다.
     폰에서만 각 묶음을 «한 줄로 옆으로 넘기는 띠»로 바꾼다. PC 는 그대로다.

   왜 드롭다운이 아닌가 — 색 점을 잃는다. 「웜·코랄」 옆의 주황 점이 이 화면의
   핵심이다. 그리고 한 번 눌러 고르던 것이 두 번(열고·고르고)이 된다.
   ⛔ 옆으로 넘기는 띠는 «넘길 수 있다는 것이 보여야» 쓸모가 있다.
     오른쪽 끝을 흐리게 해서 «더 있다»를 알린다. 안 보이면 아무도 안 넘긴다. */
@media (max-width:900px){
  .fgrid{grid-template-columns:1fr;gap:16px}
  .fgroup{position:relative;min-width:0}
  .fgroup .lab{margin-bottom:7px}
  .chips{
    flex-wrap:nowrap;
    overflow-x:auto;
    /* 손을 떼면 가까운 칩에 붙는다 — 반쯤 걸린 칩이 남지 않는다 */
    scroll-snap-type:x proximity;
    -webkit-overflow-scrolling:touch;
    scrollbar-width:none;
    /* 띠는 카드 «가장자리까지» 흘러야 «더 있다»가 자연스럽다.
       카드 padding 만큼 밖으로 내고, 안쪽 여백으로 첫 칩 자리를 되돌린다. */
    margin:0 -22px;
    padding:2px 22px 6px;
    scroll-padding-left:22px;
  }
  .chips::-webkit-scrollbar{display:none}
  .chips .chip{flex:0 0 auto;scroll-snap-align:start}
  /* 오른쪽 끝 흐림 — «더 있다»는 신호.
     ⛔ pointer-events:none 이 없으면 이 그림자가 마지막 칩의 터치를 먹는다. */
  .fgroup::after{
    content:'';position:absolute;right:-22px;bottom:6px;width:34px;height:38px;
    pointer-events:none;
    background:linear-gradient(90deg,rgba(255,251,250,0),rgba(255,251,250,.96));
  }
  /* 끝까지 넘겼으면 흐림을 지운다 — 더 없는데 있다고 하면 거짓말이다 */
  .fgroup.at-end::after{opacity:0;transition:opacity .2s var(--ease)}
}

/* ═══ 비교 트레이의 «그다음» 단추 · 사러 가기 ══════════════════
   ★ 2026-08-04 — 비교를 넷에서 셋으로 줄이고, 셋이 다 차면 다음 걸음을 낸다.
     비교로 끝내지 않는다 — 고른 색을 «발라 보거나» «사러» 갈 수 있어야 한다. */
.tray .chip.go{background:#fff;color:var(--ink);border-color:transparent;font-weight:600}
/* ⛔ 이름이 «buy» 였다가 상품 상세의 .buy 규칙에 걸렸다(2026-08-05).
   .buy{display:flex;gap:10px;margin-top:26px} 이 통째로 먹어서
   이 단추만 26px 아래로 내려가 있었다 — 트레이가 align-items:center 인데도.
   ★ sp-card 때와 같은 사고다. 흔한 낱말을 클래스로 쓰면 언젠가 부딪친다. */
.tray .chip.tray-buy{background:var(--coral-d);color:#fff;border-color:transparent;font-weight:600}
.tray .chip.tray-buy:hover{filter:brightness(1.06)}
.tray .chip.go:hover{background:#f4efee}

.buysheet{position:fixed;inset:0;z-index:120;display:flex;align-items:flex-end;justify-content:center}
.buysheet[hidden]{display:none}
.bs-scrim{position:absolute;inset:0;background:rgba(25,19,22,.46);backdrop-filter:blur(2px)}
.bs-box{position:relative;width:min(560px,100%);max-height:86vh;overflow:auto;
  background:var(--paper);border-radius:22px 22px 0 0;padding:22px 20px 26px;box-shadow:var(--sh-2)}
@media (min-width:700px){
  .buysheet{align-items:center}
  .bs-box{border-radius:22px}
}
.bs-hd{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:14px}
.bs-hd h3{font-family:var(--serif);font-size:20px;margin:0}
.bs-hd .x{width:36px;height:36px;border-radius:999px;border:1px solid var(--line);
  background:#fff;cursor:pointer;flex:none}
.bs-item{display:flex;align-items:center;gap:14px;padding:14px 12px;border-radius:16px;
  border:1px solid var(--line);background:#fff;text-decoration:none;color:inherit;margin-bottom:10px;
  transition:border-color .18s var(--ease),transform .18s var(--ease)}
.bs-item:hover,.bs-item:focus-visible{border-color:var(--ink-3);transform:translateY(-1px)}
.bs-item .sws{display:flex;flex:none}
/* 색 점을 겹쳐 놓는다 — 한 제품에서 두세 색을 골랐다는 것이 한눈에 보인다 */
.bs-item .sws .sw{width:26px;height:26px;border-radius:50%;box-shadow:inset 0 0 0 1px rgba(0,0,0,.12),0 0 0 2px #fff;
  margin-left:-8px}
.bs-item .sws .sw:first-child{margin-left:0}
.bs-item .tx{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}
.bs-item .tx b{font-size:15px;font-weight:600;line-height:1.35}
.bs-item .tx .sh{font-size:12.5px;color:var(--ink-3)}
.bs-item .tx .pr{font-size:14px;color:var(--ink-2);font-weight:600}
.bs-item .go{flex:none;color:var(--ink-3);font-size:15px}
.bs-note{font-size:12px;color:var(--ink-3);line-height:1.6;margin:14px 2px 0}

/* ── 이야기 선반 ────────────────────────────────────────
   ⛔ 이것이 없어서 EP02 가 «배포됐는데 닿을 수 없던» 자리다(2026-08-05).
      공개 편이 둘 이상일 때만 나온다 — 카드 하나짜리 선반은 길만 늘린다. */
.sp-shelf{display:grid;gap:14px;padding:18px 16px 40px;max-width:640px;margin:0 auto}
/* ⛔ 흰 카드인데 글자색을 «물려받고» 있었다. 감싸는 .spv 가 어두운 배경용이라
   color:#f2eef6(밝은 글자)여서, 제목이 흰 카드 위 흰 글씨로 거의 안 보였다.
   요약(.sm)·시간(.dur)만 자기 색이 있어 읽혔던 것이다 — 그래서 눈에 덜 띄었다.
   ★ 카드는 «밝은 바탕»이므로 글자색을 여기서 못 박는다. */
.sp-ep{display:flex;gap:14px;align-items:stretch;width:100%;text-align:left;
  color:var(--ink,#191316);
  background:#fff;border:1px solid var(--line,#e7e0d8);border-radius:14px;
  padding:12px;cursor:pointer;font:inherit;color:inherit}
.sp-ep:hover{border-color:#d6c9ba;box-shadow:0 2px 10px rgba(0,0,0,.06)}
.sp-ep:focus-visible{outline:2px solid var(--ac,#D8604A);outline-offset:2px}
.sp-ep .ph{flex:none;width:88px;border-radius:10px;overflow:hidden;background:#eee9e1}
.sp-ep .ph img{width:100%;height:100%;object-fit:cover;display:block;aspect-ratio:3/4}
.sp-ep .tx{display:flex;flex-direction:column;gap:4px;justify-content:center;min-width:0}
.sp-ep .g{font-size:11px;letter-spacing:.14em;color:var(--ac,#D8604A);font-weight:700}
.sp-ep strong{font-size:16px;line-height:1.35;color:var(--ink,#191316);font-weight:700}
.sp-ep .sm{font-size:13px;line-height:1.55;color:var(--ink-2,#5b5158)}
.sp-ep .dur{font-size:12px;color:var(--ink-3,#8d838a)}
@media (max-width:400px){.sp-ep .ph{width:72px}.sp-ep strong{font-size:15px}}

/* 발색 «사진»이 없는 색 — 색 자체로 자리를 채운다(2026-08-05).
   ⛔ 빈 칸으로 두면 손님은 그 색이 없는 줄 안다. 몰에는 파는 색이다. */
/* ★ 지금은 «쓰이지 않는다» — 48색 모두 실사진이 붙었다(2026-08-05).
   새 색이 사진 없이 들어오면 다시 쓰인다. 그래서 지우지 않는다.
   ⛔ .shade .ph 가 1/1 이므로 여기도 1/1 이어야 한다(전에 4/5 라 아래가 잘렸다). */
.bu.chip{display:block;width:100%;aspect-ratio:1/1;border-radius:inherit}
.it .chip{display:block;width:100%;height:100%;border-radius:inherit}

/* 품절 — 글자로 말한다. 흐림은 «거들 뿐»이다(색 하나로만 알리지 않는다). */
/* ⛔ 흐리게 하는 것은 «그림»이지 배지가 아니다. 배지를 사진 안으로
   옮기고 나서(2026-08-05) 이 규칙이 배지까지 흐리게 만들었다 —
   품절을 «알리는» 글자가 품절 표시 때문에 안 읽히는 꼴이었다.
   그래서 .ph 가 아니라 그 «안의 그림(.bu)»만 흐리게 한다. */
.shade.out .ph>.bu,.shade.out .bar{opacity:.42}
.shade,.sitem{position:relative}
/* ⛔ 사진 «아래»다. 위 두 모서리는 .game-btn(조사하기·입혀보기)이 쓴다.
   거기 두면 폰에서 늘 가려진다(hover 가 없어 단추가 늘 보인다).
   z-index 는 .game-btn(3)보다 위로 — 겹칠 일은 없지만 순서를 못 박아 둔다. */
.outb{position:absolute;bottom:8px;left:8px;z-index:4;background:rgba(25,19,22,.82);color:#fff;
  font-size:11px;line-height:1;letter-spacing:.02em;padding:5px 8px;border-radius:999px}
.sitem.out .im>.bu{opacity:.42}
.sitem .outb{bottom:4px;left:4px;font-size:10px;padding:4px 6px}

/* ── 임박 특가 (2026-08-08, 주간 재고 연동) ─────────────────────
   단종인데 재고가 남은 색 — 품절과 반대로 «지금 사면 된다»는 신호라
   코랄로 밝게, 은은한 숨쉬기(pulse)로 눈길만 끈다.
   ⛔ 이유를 숨기지 않는다 — 상세 패널에 유통기한 임박 사유가 함께 나간다. */
.lastb{position:absolute;bottom:8px;left:8px;z-index:4;background:var(--coral,#E0685F);
  color:#fff;font-size:11px;line-height:1;letter-spacing:.02em;padding:5px 8px;
  border-radius:999px;font-weight:700;animation:lastpulse 2.2s ease-in-out infinite}
.sitem .lastb{bottom:4px;left:4px;font-size:10px;padding:4px 6px}
.shade.last .bar,.sitem.last .b{box-shadow:0 0 0 2px var(--coral,#E0685F)}
@keyframes lastpulse{0%,100%{opacity:1}50%{opacity:.62}}
@media (prefers-reduced-motion:reduce){.lastb{animation:none}}

/* ── 셰이드 파인더의 «바르는 부위» 머리 (2026-08-05) ──────────
   ⛔ 립·치크·섀도가 한 줄에 섞이면 손님이 카드 그림으로 «무엇에 바르는가»를
      잘못 읽는다. 나눠 세우고, 그 경계를 눈에 보이게 한다. */
.sarea{display:flex;align-items:baseline;gap:10px;margin:34px 0 14px;
  padding-bottom:9px;border-bottom:1px solid var(--line)}
.sarea:first-child{margin-top:4px}
/* ⛔ 세리프(--serif)는 Georgia 라 한글 글리프가 없다 — 「볼」·「눈」 같은
   한 글자 제목이 시스템 명조로 떨어져 다른 서체처럼 보였다.
   사람 지시로 KoPub 돋움(--sans)으로 바꾼다(2026-08-05).
   ★ 세 머리(입술·볼·눈)를 «다 같이» 바꾼다. 둘만 바꾸면 그게 더 어긋나 보인다. */
.sarea b{font-family:var(--sans);font-size:19px;font-weight:700;letter-spacing:-.01em}
.sarea span{font-size:13px;color:var(--ink-3)}
@media(max-width:640px){
  .sarea{margin:26px 0 12px}
  .sarea b{font-size:17px}
}

/* 제품컷 카드 — 색을 말해 주는 것이 «띠 하나»뿐이라 더 두껍게 (2026-08-05).
   ⛔ 이 띠를 얇게 만들거나 지우면 볼·눈 카드에서 색을 알 길이 사라진다. */
.shade.prodpic .bar{height:11px}

/* ═══ AI 가이드 (서연) — 외부 데모 오버레이 ═══════════════════════
   2026-08-06 사람 지시: 메뉴 「브랜드」 자리를 「AI 가이드」로.
   데모는 외부(chatgpt.site)에 살고 여기서는 «틀»만 세운다 — 영상이 계속
   새로 발행되므로 복사해 오면 그날로 낡는다(js/site.js openGuide 참조). */
.gv{position:fixed;inset:0;z-index:74;background:var(--paper,#faf7f4);
  display:flex;flex-direction:column;opacity:0;pointer-events:none;visibility:hidden;
  transition:opacity .25s var(--ease),visibility 0s linear .25s}
/* ⛔ 로그인 덮개에서 배운 그 함정 — display 를 주는 요소는 숨김도 «직접» 적는다.
   hidden 속성 대신 클래스로 켜고 끄되, 꺼진 상태가 기본값이다. */
.gv.on{opacity:1;pointer-events:auto;visibility:visible;transition:opacity .25s var(--ease)}
.gv .gbar{display:flex;align-items:center;gap:12px;background:var(--paper,#fff);
  padding:10px 16px;border-bottom:1px solid var(--line);flex:0 0 auto}
.gv .gbar b{font-size:15.5px}
.gv .gback{width:44px;height:44px;border-radius:10px;display:grid;place-items:center;
  font-size:20px;color:var(--ink-2);flex:0 0 auto}
.gv .gback:hover{background:var(--paper-2);color:var(--ink)}
.gv .gchip{font-size:11px;border:1px solid var(--line);border-radius:20px;
  padding:3px 10px;color:var(--ink-2);white-space:nowrap}
.gv .gbody{flex:1 1 auto;position:relative;background:#fff;min-height:0}
.gv iframe{width:100%;height:100%;border:0;display:block}
.gv .gnote{position:absolute;left:0;right:0;top:42%;text-align:center;
  color:var(--ink-2);font-size:14.5px;margin:0;padding:0 24px}
@media (max-width:560px){
  .gv .gbar b{font-size:14px}
  .gv .gchip{font-size:10px;padding:3px 8px}
}
@media (prefers-reduced-motion:reduce){ .gv{transition:none} }

/* ─── 카카오톡 채널 «C» (2026-08-08) — 공식몰 우하단 단추 이식 ──────────
   pf.kakao.com 채널로 가는 문이다(회원가입·장바구니가 아니다 — 상담 창구).
   ★ 정정(돌핀) — 돌핀 몰에는 «떠 있는» 카카오 단추가 없다(실측: 바닥 아이콘뿐).
      그래서 이 단추는 몰 이식이 아니라 «우리 장치»다. 색은 남의 몰 실측값을 물려받지 않고
      카카오 공식 노랑(#FEE500) + 짙은 글리프를 쓴다.
     (글리프 PNG 는 흰색 단색이라 노란 카카오색이면 안 보인다 — 몰도 코랄 원이다.)
   상담(H) 버블이 bottom 16/76 을 쓰므로 그 «위층» 136 에 앉는다.
   z-index 58: 붙는 머리글(50)보다 위, 안내띠(60)·위젯(21억)보다 아래. */
.kakao-ch{
  position:fixed;right:16px;bottom:136px;z-index:58;
  width:52px;height:52px;border-radius:50%;
  background:#FEE500;display:grid;place-items:center;
  box-shadow:0 2px 3px rgba(0,0,0,.1);
  transition:transform .18s;
}
.kakao-ch:hover{transform:translateY(-2px)}
.kakao-ch img{width:20px;height:auto;display:block}
@media(max-width:560px){
  .kakao-ch{right:12px;bottom:128px;width:46px;height:46px}
  .kakao-ch img{width:18px}
}
@media (prefers-reduced-motion:reduce){ .kakao-ch,.svc-top .chev{transition:none} }

/* ══════════ 돌핀 전용 부품 (번안 추가분 — 코럴헤이즈 뼈대 위) ══════════ */
/* 세 입구 카드 — 시계 사진을 바닥에 깔고 어둡게 눌러 글자를 지킨다 */
.dcard.c1{background:linear-gradient(150deg,#2ba7ae 0%,#14666c 100%)}
.dcard.c2{background:linear-gradient(150deg,#3a4a58 0%,#1c262e 100%)}
.dcard.c3{background:linear-gradient(150deg,#9a8a5e 0%,#6d5f3e 100%)}
.dcard .dbg{opacity:.28}

/* 파인더 — 질문 3열, 각 열은 제목 + 알약들 */
.fcol h4{margin:0 0 10px;font-size:14px;font-weight:600}
.fcol .fops{display:flex;flex-wrap:wrap;gap:8px}
.chip.on{background:var(--coral);border-color:var(--coral);color:#fff}

/* 상품 카드 — 이름·변형 칩(사진)·할인·품절·단추 */
.card .nm{margin-top:6px;font-size:14.5px;line-height:1.45;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.card .row img{width:22px;height:22px;border-radius:50%;object-fit:cover;
  box-shadow:inset 0 0 0 1px rgba(0,0,0,.13)}
.card .badge{position:absolute;top:10px;left:10px;z-index:3;background:rgba(23,29,32,.72);
  color:#fff;font-size:11px;font-weight:600;padding:4px 9px;border-radius:999px}
.card .offp{font-size:12px;color:var(--coral-d);font-style:normal;margin-left:6px}
.card .acts{display:flex;gap:6px;margin-top:12px}
.card .acts .chip{flex:1;text-align:center;justify-content:center;display:inline-flex;
  padding-top:7px;padding-bottom:7px}      /* 터치 28px 확보 */
.card .acts .go2{background:var(--coral);border-color:var(--coral);color:#fff;text-decoration:none}
.card .acts [aria-pressed=true]{background:var(--blush);border-color:var(--coral);color:var(--coral-d)}

/* 상세 패널 — 변형 목록 */
.pvars{display:grid;grid-template-columns:1fr;gap:8px}
.pvar{display:flex;align-items:center;gap:10px;padding:8px 10px;border:1px solid var(--line);
  border-radius:12px;text-decoration:none;color:var(--ink)}
.pvar:hover{border-color:var(--coral)}
.pvar img{border-radius:8px;object-fit:cover}
.pvar span{flex:1;font-size:13.5px;line-height:1.4}
.pvar .pv-out{font-style:normal;font-size:11px;color:#fff;background:rgba(23,29,32,.6);
  padding:3px 8px;border-radius:999px}

/* 사러 가기 시트 — 항목 */
.bs-item{display:flex;align-items:center;gap:12px;padding:10px 12px;border:1px solid var(--line);
  border-radius:12px;text-decoration:none;color:var(--ink);margin-bottom:8px}
.bs-item:hover{border-color:var(--coral)}
.bs-item img{border-radius:8px;object-fit:cover}
.bs-item .bs-nm{flex:1;font-size:13.5px;line-height:1.4}
.bs-item .bs-pr{font-family:var(--serif)}

/* 브랜드 4이름 칩 */
.bchips{display:flex;gap:8px;flex-wrap:wrap;margin-top:18px}

/* 히어로 제목 두 토막 — 첫 토막이 브랜드 색 */
.hero h1 #heroT{color:var(--coral)}

/* 터치 28px — 로고 링크는 그림이 26px 라 세로가 모자랐다(스모크 실측). 링크를 키운다 */
.brand{display:flex;align-items:center;min-height:44px}

/* 재고 배지 — 발행본(stock_overlay)이 켠다. 라스트 피스는 눈에 띄게(pulse) */
.card .badge.st-last{background:var(--coral);animation:stPulse 1.6s ease-in-out infinite}
.card .badge.st-wait{background:rgba(84,96,106,.85)}
@keyframes stPulse{0%,100%{transform:scale(1)}50%{transform:scale(1.06)}}
@media (prefers-reduced-motion:reduce){.card .badge.st-last{animation:none}}
