/* ============================================================
   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{
  --ink:#191316;         /* 본문 */
  --ink-2:#5b5158;       /* 보조 */
  --ink-3:#8d838a;       /* 캡션 */
  --line:#ece5e6;
  --paper:#fffdfc;
  --paper-2:#faf5f4;
  --coral:#e0685f;       /* 브랜드 코럴 */
  --coral-d:#c1483f;
  --blush:#f7e6e1;
  --gold:#ab8862;
  --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}

/* ─── 헤더 ────────────────────────────────────────────── */
.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:box-shadow .3s var(--ease);
}
.hd.scrolled{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}
.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)}
.langsel{
  display:flex;gap:2px;background:var(--paper-2);border:1px solid var(--line);
  border-radius:10px;padding:3px;
}
.langsel button{padding:4px 10px;border-radius:7px;font-size:12.5px;font-weight:600;color:var(--ink-3)}
.langsel button[aria-pressed=true]{background:#fff;color:var(--ink);box-shadow:0 1px 3px rgba(0,0,0,.08)}
.burger{display:none}

/* ─── 히어로 ──────────────────────────────────────────── */
/* 캠페인 배너는 자체 타이포가 들어 있는 완성 크리에이티브다.
   그 위에 헤드라인을 얹으면 글자가 겹친다 → 좌 카피 / 우 배너로 나눈다. */
.hero{position:relative;overflow:hidden;padding:62px 0 66px;
  background:
    radial-gradient(90% 120% at 8% 0%,#fff 0%,rgba(255,255,255,0) 60%),
    linear-gradient(150deg,#fdf3f0 0%,#f9e9e6 45%,#f6eeec 100%);}
.hero::before{
  content:'';position:absolute;width:620px;height:620px;right:-180px;top:-260px;border-radius:50%;
  background:radial-gradient(circle,rgba(224,104,95,.16),rgba(224,104,95,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}
.hero h1{font-family:var(--hand);font-size:clamp(40px,5.6vw,74px);line-height:1.05;margin:12px 0 0;font-weight:400;letter-spacing:0}
/* 손글씨는 글자가 작고 성글게 보인다 — 명조보다 크게, 자간은 조이지 않는다 */
.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(224,104,95,.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}
.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(224,104,95,.28)}
.empty{padding:46px 20px;text-align:center;color:var(--ink-3);border:1px dashed var(--line);border-radius:var(--r);margin-top:26px}

/* 비교 트레이 */
.tray{
  position:fixed;left:50%;transform:translateX(-50%) translateY(140%);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);max-width:calc(100vw - 32px);
}
.tray.on{transform:translateX(-50%) translateY(0)}
.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}

/* ─── 제품 그리드 ────────────────────────────────────── */
.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}
  .burger{display:grid}
  .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);
  }
  .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}
  .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}
  .ft .cols{grid-template-columns:1fr}
}

/* ─── 접근성 : 모션 최소화 ───────────────────────────── */
@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}
.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(224,104,95,.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}
.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}
.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)}
.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(224,104,95,.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(224,104,95,.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, #e0685f); 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, #e0685f) }
.ty-wear .sl:focus-visible { outline: 2px solid var(--coral, #e0685f); 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, #e0685f); 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, #e0685f) }
.ty-tonebox[open] > summary::after { content: " 2" }
.ty-tonebox > summary:focus-visible { outline: 2px solid var(--coral, #e0685f); outline-offset: 2px }
.ty-tonebox .ty-tone { margin-top: 8px }
