/* 강호명관 — 각성(覺醒) 레이어.
   조사(docs/research/design-showcase-2026-09-17)에서 반복 확인된 네 가지를 이 서비스의 언어로 옮긴다.
   1) 2~3색 극단 팔레트 위의 거대 타이포   2) 인터랙션 자체가 서사 장치
   3) 상징 하나(인장·세로획)의 전면 반복    4) 긴 서사를 견디게 하는 챕터형 스크롤
   색은 첫 강호명관(8b2d757)의 팔레트 토큰만 쓴다. 새 색을 만들지 않는다. */

:root{
 --awaken-ease:cubic-bezier(.22,.9,.28,1);
 --rail:78px;
 --gutter:clamp(18px,5vw,64px);
 /* 한 화면을 꽉 채우는 표제용 크기. 어워드 수상작의 공통 문법. */
 --display:clamp(52px,8.6vw,132px);
 --display-sm:clamp(30px,6vw,64px);
 --label:clamp(9px,1vw,11px);
}

/* ─────────────────────────────────────────────────────────
   1. 각성 — 첫 화면. 스크롤이 곧 눈을 뜨는 행위다.
   ───────────────────────────────────────────────────────── */
/* 헤더가 위에 있으므로 100svh를 그대로 쓰면 첫 화면이 한 번 더 밀린다. */
.awaken{position:relative;min-height:min(84svh,880px);display:grid;grid-template-rows:1fr auto;
 background:var(--bg);color:var(--shell-text);overflow:clip;isolation:isolate}

/* 눈꺼풀. 위아래에서 화면을 덮고 있다가 스크롤(--open: 0→1)에 따라 열린다. */
.awaken__lid{position:absolute;left:0;right:0;z-index:4;background:var(--bg);pointer-events:none;
 height:calc(50% * (1 - var(--open,0)))}
.awaken__lid--top{top:0;box-shadow:0 14px 34px -8px var(--bg)}
.awaken__lid--bottom{bottom:0;box-shadow:0 -14px 34px -8px var(--bg)}

/* 눈꺼풀 사이로 새어 나오는 빛. 열리는 동안만 보인다. */
.awaken__slit{position:absolute;left:12%;right:12%;top:50%;height:1px;z-index:5;pointer-events:none;
 transform:translateY(-.5px) scaleX(var(--slit,1));transform-origin:50% 50%;
 background:linear-gradient(90deg,transparent,var(--em),transparent);
 opacity:calc(1 - var(--open,0));filter:blur(.4px)}

.awaken__stage{position:relative;display:grid;place-items:center;
 padding:clamp(28px,7vh,74px) var(--gutter) clamp(56px,10vh,96px);z-index:2}

/* 강호. 원본의 능선 3겹을 유지하되 스크롤 시차를 준다. */
.awaken__land{position:absolute;inset:0;z-index:0;pointer-events:none;overflow:hidden}
/* 수묵 안개. 능선 아래에 깔리고 글·입력은 전부 위에 있다. */
.ink-layer{position:absolute;inset:0;width:100%;height:100%;pointer-events:none;z-index:2}
.awaken__land svg{z-index:1}
/* 수묵의 안개. 능선의 날선 삼각형을 아래에서 먹여 산수화처럼 번지게 한다. */
.awaken__land::after{content:'';position:absolute;left:0;right:0;bottom:0;height:52%;z-index:1;
 background:linear-gradient(180deg,transparent,var(--bg) 62%)}
.awaken__land svg{position:absolute;left:-2%;width:104%;height:46%;bottom:0;opacity:.85;
 transform:translate3d(0,calc(var(--scroll,0) * 42px),0)}
.awaken__moon{position:absolute;width:clamp(150px,22vw,260px);aspect-ratio:1;right:14%;top:12%;
 border-radius:50%;background:radial-gradient(circle at 35% 35%,var(--moon1),var(--moon2) 70%);
 box-shadow:0 0 110px var(--moon-glow);
 transform:translate3d(0,calc(var(--scroll,0) * -70px),0) scale(calc(.9 + var(--open,0) * .1));
 opacity:calc(.25 + var(--open,0) * .75)}

/* 표제. 세로획 한 줄과 가로 표제가 맞물린다. */
.awaken__copy{position:relative;z-index:3;width:min(1180px,100%);text-align:center;
 display:grid;justify-items:center;gap:clamp(14px,2.4vw,26px)}
/* 넓은 화면: 왼쪽에 표제, 오른쪽에 발급 카드. 첫 화면 안에서 읽고 바로 시작한다. */
@media (min-width:1080px){
 .awaken__copy{width:min(1280px,100%);text-align:left;justify-items:start;
  grid-template-columns:minmax(0,1.08fr) minmax(370px,.92fr);
  column-gap:clamp(32px,5vw,74px);row-gap:18px;align-items:center}
 .awaken__eyebrow{grid-column:1;align-self:end}
 .awaken__title{grid-column:1;line-height:.92}
 .awaken__lede{grid-column:1;align-self:start}
 .issue{grid-column:2;grid-row:1/4;width:100%;margin:0}
}
.awaken__eyebrow{margin:0;font:600 var(--label)/1 var(--sans);letter-spacing:.42em;
 text-transform:none;color:var(--gold);padding-left:.42em}
.awaken__title{margin:0;font-family:var(--serif);font-weight:500;font-size:var(--display);
 line-height:.94;letter-spacing:-.045em;color:var(--shell-text);text-wrap:balance}
.awaken__title em{font-style:normal;color:var(--em);position:relative}
/* 마지막 글자 아래 인장 붉은 획 — 상징의 첫 등장. */
.awaken__title em::after{content:'';position:absolute;left:0;right:0;bottom:.1em;height:.055em;
 background:var(--red);transform:scaleX(var(--open,0));transform-origin:0 50%;
 transition:transform .9s var(--awaken-ease)}
.awaken__lede{margin:0;max-width:34ch;font:14px/2 var(--sans);color:var(--shell-intro)}

/* 한 문장을 그래픽으로 반복(Pear·WeekSync 방식). */
.awaken__marquee{position:relative;z-index:3;overflow:hidden;border-block:1px solid var(--shell-line);
 padding:11px 0;mask-image:linear-gradient(90deg,transparent,#000 12%,#000 88%,transparent)}
.awaken__marquee ul{display:flex;gap:2.6rem;margin:0;padding:0;list-style:none;width:max-content;
 animation:awaken-drift 34s linear infinite}
.awaken__marquee li{display:flex;align-items:center;gap:2.6rem;font:500 12px/1 var(--serif);
 letter-spacing:.3em;color:var(--shell-small);white-space:nowrap}
.awaken__marquee li::after{content:'';width:5px;height:5px;background:var(--red);transform:rotate(45deg)}
@keyframes awaken-drift{to{transform:translate3d(-50%,0,0)}}

/* 스크롤 안내 — 인장 모티프의 반복. */
.awaken__hint{position:absolute;left:50%;bottom:calc(var(--gutter) + 8px);z-index:3;
 translate:-50% 0;display:grid;justify-items:center;gap:9px;
 font:500 10px/1 var(--sans);letter-spacing:.3em;color:var(--shell-small);
 opacity:calc(1 - var(--scroll,0) * 2.6);pointer-events:none}
.awaken__hint i{display:block;width:1px;height:38px;background:linear-gradient(var(--gold),transparent);
 animation:awaken-fall 2.2s var(--awaken-ease) infinite}
@keyframes awaken-fall{0%{transform:scaleY(0);transform-origin:50% 0}
 55%{transform:scaleY(1);transform-origin:50% 0}
 56%{transform:scaleY(1);transform-origin:50% 100%}
 100%{transform:scaleY(0);transform-origin:50% 100%}}

/* ─────────────────────────────────────────────────────────
   2. 세로 축 — 이 서비스만의 서명. 두루마리는 세로로 읽는다.
   ───────────────────────────────────────────────────────── */
.vrail{position:fixed;right:max(14px,2.2vw);top:50%;translate:0 -50%;z-index:30;
 display:none;writing-mode:vertical-rl;text-orientation:upright;
 font:500 12px/1 var(--serif);letter-spacing:.66em;color:var(--vertical);
 pointer-events:none;user-select:none}
.vrail b{font-weight:500;color:var(--em)}
@media (min-width:1100px){.vrail{display:block}}

/* ─────────────────────────────────────────────────────────
   3. 발급 — 생년월일 입력을 '문서를 받는 행위'로.
   ───────────────────────────────────────────────────────── */
.issue{position:relative;z-index:3;width:min(560px,100%);margin-inline:auto;
 background:color-mix(in srgb,var(--panel) 86%,transparent);
 border:1px solid var(--panel-line);padding:clamp(20px,3.2vw,30px);
 backdrop-filter:blur(7px);display:grid;gap:16px;text-align:left}
.issue__head{display:flex;align-items:baseline;justify-content:space-between;gap:12px;
 border-bottom:1px solid var(--shell-line);padding-bottom:12px}
.issue__head span{font:600 var(--label)/1 var(--sans);letter-spacing:.34em;color:var(--shell-label-sub)}
.issue__head b{font:500 15px/1 var(--serif);letter-spacing:.14em;color:var(--shell-label)}
/* 어두운 발급 카드 위에서는 입력칸도 어두워야 한다. 브라우저 기본 회색은 카드를 깨뜨린다. */
.issue input[type=date],.issue input[type=time]{
 background:var(--input-bg);border:1px solid var(--input-border);color:var(--input-text);
 border-radius:0;padding:12px 13px;font:14px/1.4 var(--sans);width:100%;
 color-scheme:dark;transition:border-color .2s}
.issue input[type=date]:hover,.issue input[type=time]:hover{border-color:var(--gold)}
.issue input[type=date]:focus-visible,.issue input[type=time]:focus-visible{border-color:var(--em)}
.issue label{color:var(--shell-label)}
.issue label small{color:var(--shell-label-sub)}
.issue .gender-choice legend{color:var(--shell-label)}
.issue .entry-note{color:var(--shell-small)}

/* ─────────────────────────────────────────────────────────
   3-B. 나머지 여섯 화면에 같은 언어를 확장한다.
   신분록·문파·설정실·취향소·입문첩·서가 모두 같은 머리를 쓴다.
   ───────────────────────────────────────────────────────── */
.page-heading{position:relative;padding:clamp(34px,7vh,72px) 0 clamp(24px,4vh,42px)}
.page-heading .eyebrow{font:600 var(--label)/1 var(--sans);letter-spacing:.42em;
 color:var(--gold);margin:0 0 clamp(12px,2vh,20px);padding-left:.42em}
.page-heading h1{font-family:var(--serif);font-weight:500;
 font-size:var(--display-sm)!important;line-height:1.02;letter-spacing:-.03em;
 margin:0 0 clamp(10px,1.6vh,16px);text-wrap:balance}
.page-heading>p:last-child{max-width:46ch;font-size:14px;line-height:1.95}
/* 인장의 붉은 획. 첫 화면의 표제 아래에 그은 것과 같은 획을 여기서도 반복한다. */
.page-heading::after{content:'';display:block;width:56px;height:2px;background:var(--red);
 margin-top:clamp(16px,3vh,28px)}
/* 화면 이름을 세로로 세운 표식. 데스크톱에서만 나타난다. */
.page-heading[data-mark]::before{content:attr(data-mark);position:absolute;
 right:0;top:clamp(34px,7vh,72px);writing-mode:vertical-rl;text-orientation:upright;
 font:500 13px/1 var(--serif);letter-spacing:.5em;color:var(--vertical);opacity:.8;display:none}
@media (min-width:1180px){.page-heading[data-mark]::before{display:block}}

/* 취향소는 page-heading 대신 자체 hero를 쓴다. 같은 머리로 맞춰 준다. */
.hero[data-mark]{position:relative}
.hero[data-mark] .hero-copy h1{font-family:var(--serif);font-weight:500;
 font-size:var(--display-sm);line-height:1.06;letter-spacing:-.03em}
.hero[data-mark] .hero-copy .eyebrow{font:600 var(--label)/1 var(--sans);
 letter-spacing:.42em;padding-left:.42em}
.hero[data-mark]::after{content:attr(data-mark);position:absolute;right:clamp(16px,2.4vw,34px);
 top:clamp(20px,4vh,40px);writing-mode:vertical-rl;text-orientation:upright;
 font:500 13px/1 var(--serif);letter-spacing:.5em;color:var(--vertical);opacity:.75;display:none}
@media (min-width:1180px){.hero[data-mark]::after{display:block}}

/* ─────────────────────────────────────────────────────────
   4. 챕터 — 긴 환생록을 견디게 하는 구조(Elektrokid 방식).
   ───────────────────────────────────────────────────────── */
/* 넓은 화면: 장 이름까지 펼친 세로 레일. */
.chapter-rail{position:fixed;left:max(12px,1.6vw);top:50%;translate:0 -50%;z-index:29;
 display:none;flex-direction:column;gap:14px;padding:0;margin:0;list-style:none}
.chapter-rail.is-live{display:flex}
.chapter-rail button{display:flex;align-items:center;gap:9px;background:none;border:0;padding:4px 0;
 font:500 10px/1 var(--serif);letter-spacing:.2em;color:var(--paper-label);cursor:pointer;
 opacity:.45;transition:opacity .25s,color .25s}
.chapter-rail button::before{content:'';width:16px;height:1px;background:currentColor;
 flex:none;transition:width .3s var(--awaken-ease),background .25s}
.chapter-rail button:hover{opacity:.85}
.chapter-rail [aria-current=true]{opacity:1;color:var(--red)}
.chapter-rail [aria-current=true]::before{width:30px;background:var(--red)}

/* 좁은 화면: 이름을 접고 눈금만 남긴다. 화면 폭을 거의 쓰지 않으면서 위치와 이동은 그대로다.
   지금 읽는 장의 이름만 눈금 옆에 잠깐 뜬다. */
@media (max-width:1239px){
 .chapter-rail{left:auto;right:0;gap:0;padding:6px 0;
  background:linear-gradient(90deg,transparent,#0000000f)}
 .chapter-rail button{gap:0;padding:5px 10px 5px 16px;opacity:1;color:var(--paper-label);
  font-size:0;letter-spacing:0;position:relative}
 /* 글자는 감추고 눈금만 남긴다. 화면낭독기에는 이름이 그대로 읽힌다. */
 .chapter-rail button::before{width:9px;height:2px;opacity:.38}
 .chapter-rail [aria-current=true]::before{width:20px;opacity:1}
 /* 지금 장의 이름을 눈금 왼쪽에 붙여 보여 준다. */
 .chapter-rail [aria-current=true]::after{content:attr(data-name);position:absolute;
  right:calc(100% - 4px);top:50%;translate:0 -50%;white-space:nowrap;
  font:500 11px/1 var(--serif);letter-spacing:.06em;color:var(--paper);
  background:#1d2723ee;border:1px solid var(--panel-line);padding:6px 10px;
  animation:rail-name 2.6s var(--awaken-ease) forwards;display:none}
 .chapter-rail.is-open{background:#151c19f2;border-left:1px solid var(--panel-line);
  max-height:76svh;overflow-y:auto;gap:2px}
 .chapter-rail.is-open button{font-size:11px;letter-spacing:.06em;padding:8px 14px 8px 12px;gap:8px}
 .chapter-rail.is-open button::before{width:10px;opacity:.5}
 .chapter-rail.is-open [aria-current=true]{color:var(--em)}
 .chapter-rail.is-open [aria-current=true]::before{width:16px;opacity:1}
 .chapter-rail.is-open [aria-current=true]::after{display:none}
}
@keyframes rail-name{0%{opacity:0;transform:translateX(6px)}
 12%{opacity:1;transform:none}72%{opacity:1;transform:none}100%{opacity:0;transform:none}}

/* 좁은 화면에서 눈금을 펼치고 접는 손잡이. */
.rail-toggle{position:fixed;right:0;bottom:calc(16px + env(safe-area-inset-bottom,0px));z-index:30;
 display:none;align-items:center;gap:7px;
 background:#1d2723ee;color:var(--shell-label);border:1px solid var(--panel-line);border-right:0;
 padding:10px 13px;font:500 11px/1 var(--sans);letter-spacing:.1em;cursor:pointer}
.rail-toggle b{color:var(--em);font-family:var(--serif);font-weight:500}
@media (max-width:1239px){.chapter-rail.is-live ~ .rail-toggle{display:flex}}


/* 챕터 번호를 세로로 세운 표식. 환생록 각 장의 머리. */
.chapter-mark{position:absolute;left:-46px;top:2px;writing-mode:vertical-rl;text-orientation:upright;
 font:500 12px/1 var(--serif);letter-spacing:.4em;color:var(--red);opacity:.75}
@media (max-width:900px){.chapter-mark{position:static;writing-mode:horizontal-tb;display:block;
 letter-spacing:.3em;margin-bottom:6px;opacity:.9}}

/* ─────────────────────────────────────────────────────────
   4-B. 공개 — 이름을 가장 나중에 준다.
   관주의 말 → 별호 → 이름(인장이 찍히듯) → 나머지. 서스펜스가 곧 연출이다.
   ───────────────────────────────────────────────────────── */
@keyframes reveal-up{from{opacity:0;transform:translate3d(0,14px,0)}to{opacity:1;transform:none}}
/* 인장이 내려찍히는 순간. 살짝 크게 시작해 제자리에 박힌다. */
@keyframes reveal-stamp{
 0%{opacity:0;transform:scale(1.14);letter-spacing:.14em;filter:blur(3px)}
 62%{opacity:1;filter:blur(0)}
 100%{opacity:1;transform:scale(1);letter-spacing:normal;filter:blur(0)}}
@keyframes reveal-rule{from{transform:scaleX(0)}to{transform:scaleX(1)}}

#life-result.stagein .life-catch{animation:reveal-up .62s both}
#life-result.stagein .life-narrator{animation:reveal-up .62s .34s both}
#life-reveal.stagein .reveal-copy>.eyebrow{animation:reveal-up .5s .86s both}
#life-reveal.stagein .reveal-copy>.reveal-alias{animation:reveal-up .5s 1.02s both}
#life-reveal.stagein .reveal-copy>h1{animation:reveal-stamp .78s 1.28s both cubic-bezier(.2,1.5,.36,1)}
#life-reveal.stagein .reveal-place{animation:reveal-up .5s 1.72s both}
#life-reveal.stagein .reveal-copy>blockquote,#life-reveal.stagein .reveal-stats{animation:reveal-up .5s 1.94s both}
#life-reveal.stagein .reveal-portrait{animation:reveal-up .6s 1.5s both}

/* 이름 아래로 붉은 획이 그어진다 — 첫 화면 표제와 같은 인장의 획. */
#life-reveal .reveal-copy>h1{position:relative}
#life-reveal.stagein .reveal-copy>h1::after{content:'';position:absolute;left:0;bottom:-.1em;
 width:2.1em;height:2px;background:var(--red);transform-origin:0 50%;
 animation:reveal-rule .5s 2s both}



/* ─────────────────────────────────────────────────────────
   5. 등장 — 한 번에 다 보여주지 않는다(罗小黑 방식).
   ───────────────────────────────────────────────────────── */
.rise{opacity:0;transform:translate3d(0,22px,0);
 transition:opacity .72s var(--awaken-ease),transform .72s var(--awaken-ease)}
.rise.is-in{opacity:1;transform:none}
.rise[data-delay="1"]{transition-delay:.09s}
.rise[data-delay="2"]{transition-delay:.18s}
.rise[data-delay="3"]{transition-delay:.27s}
.rise[data-delay="4"]{transition-delay:.36s}

/* 글자가 한 획씩 들어오는 표제. */
.stroke-word{display:inline-block;white-space:nowrap}
.stroke-ch{display:inline-block;opacity:0;transform:translate3d(0,.42em,0);
 transition:opacity .6s var(--awaken-ease),transform .6s var(--awaken-ease)}
.stroke-in.is-in .stroke-ch{opacity:1;transform:none}



/* ─────────────────────────────────────────────────────────
   6. 환생의 순간 — 먹이 덮고, 인장이 찍히고, 먹이 걷힌다.
   ───────────────────────────────────────────────────────── */
html.is-rebirthing{overflow:hidden}
.rebirth{position:fixed;inset:0;z-index:90;display:grid;place-items:center;
 opacity:1;transition:opacity .62s var(--awaken-ease);pointer-events:none}
.rebirth.is-off{opacity:0}

/* 명식 시퀀스를 그리는 캔버스. 먹·여덟 글자·오행·인장이 전부 여기서 그려진다. */
.rebirth__canvas{position:absolute;inset:0;width:100%;height:100%;display:block}

.rebirth__core{position:absolute;left:50%;bottom:clamp(54px,12vh,120px);translate:-50% 0;
 display:grid;justify-items:center;gap:14px;
 opacity:0;transition:opacity .5s var(--awaken-ease) .9s}
.rebirth.is-on .rebirth__core{opacity:1}
.rebirth.is-off .rebirth__core{opacity:0;transition-delay:0s;transition-duration:.3s}

.rebirth__word{margin:0;font:500 12px/1 var(--sans);letter-spacing:.42em;
 color:var(--shell-small);padding-left:.42em}
.rebirth__bar{display:block;width:clamp(120px,22vw,200px);height:1px;background:var(--shell-line);overflow:hidden}
.rebirth__bar i{display:block;height:100%;width:100%;background:var(--gold);
 transform-origin:0 50%;transform:scaleX(0);
 animation:seal-load 3.3s cubic-bezier(.3,.1,.2,1) .2s both}
@keyframes seal-load{to{transform:scaleX(1)}}



/* 호패의 빛결. 기울일 때 표면을 따라 움직인다. */
.token-tilt .token-sheen{opacity:.55;
 transform-origin:50% 50%;
 transition:transform .5s var(--awaken-ease),opacity .4s}
.token-peek:hover .token-sheen,.token-tilt:hover .token-sheen{opacity:.9}


/* ─────────────────────────────────────────────────────────
   7. 화면 전환 — 새 화면의 덩어리들이 차례로 올라온다.
   ───────────────────────────────────────────────────────── */
@keyframes view-in{from{opacity:0;transform:translate3d(0,18px,0)}to{opacity:1;transform:none}}
.view-enter>*{animation:view-in .6s var(--awaken-ease) both;
 animation-delay:calc(var(--enter-step,0) * .07s)}
/* 표제 아래 붉은 획은 나중에 그어진다. */
@keyframes view-rule{from{transform:scaleX(0)}to{transform:scaleX(1)}}
.view-enter .page-heading::after{transform-origin:0 50%;
 animation:view-rule .5s var(--awaken-ease) .34s both}


/* ─────────────────────────────────────────────────────────
   8. 환생록 스크롤 연출 — 읽는 동안 화면이 같이 움직인다.
   ───────────────────────────────────────────────────────── */

/* 사주 원국의 네 기둥이 차례로 세워진다. 명식 시퀀스에서 본 그 여덟 글자다. */
@keyframes pillar-rise{
 from{opacity:0;transform:translate3d(0,26px,0) rotateX(26deg)}
 to{opacity:1;transform:none}}
.pillar-figure.is-in .pillar-grid{perspective:900px}
.pillar-figure.is-in .pillar{animation:pillar-rise .62s var(--awaken-ease) both;
 transform-origin:50% 100%}
.pillar-figure.is-in .pillar:nth-child(1){animation-delay:.02s}
.pillar-figure.is-in .pillar:nth-child(2){animation-delay:.12s}
.pillar-figure.is-in .pillar:nth-child(3){animation-delay:.22s}
.pillar-figure.is-in .pillar:nth-child(4){animation-delay:.32s}

/* 오행 고리는 들어올 때 그려진다. 다 그려진 뒤에야 WebGL 층의 빛이 돈다. */
@keyframes ring-draw{from{clip-path:polygon(50% 50%,50% 0,50% 0)}
 to{clip-path:polygon(50% 50%,50% 0,100% 0,100% 100%,0 100%,0 0,50% 0)}}
.reading-figure.is-in .element-ring{animation:ring-draw .9s var(--awaken-ease) .1s both}
.reading-figure.is-in .ring-gl{animation:fade-in .6s linear .85s both}
@keyframes fade-in{from{opacity:0}to{opacity:1}}

/* 막대는 왼쪽에서 자란다. */
@keyframes bar-grow{from{transform:scaleX(0)}to{transform:scaleX(1)}}
.reading-figure.is-in .bar-track i{transform-origin:0 50%;
 animation:bar-grow .7s var(--awaken-ease) both}
.reading-figure.is-in .reading-bar:nth-child(1) .bar-track i{animation-delay:.16s}
.reading-figure.is-in .reading-bar:nth-child(2) .bar-track i{animation-delay:.24s}
.reading-figure.is-in .reading-bar:nth-child(3) .bar-track i{animation-delay:.32s}
.reading-figure.is-in .reading-bar:nth-child(4) .bar-track i{animation-delay:.40s}
.reading-figure.is-in .reading-bar:nth-child(5) .bar-track i{animation-delay:.48s}

/* 장의 제목은 붓이 지나가듯 왼쪽에서 드러난다. */
@keyframes wipe-in{from{clip-path:inset(0 100% 0 0)}to{clip-path:inset(0 0 0 0)}}
.reading-chapter.is-in>h3{animation:wipe-in .66s var(--awaken-ease) both}
.reading-chapter.is-in .chapter-mark{animation:fade-in .5s .3s both}



/* ─────────────────────────────────────────────────────────
   9. 3D 강호 — 불러와지면 2D 능선·달·안개 자리를 넘겨받는다.
   ───────────────────────────────────────────────────────── */
.gangho-3d{position:absolute;inset:0;width:100%;height:100%;display:block;z-index:0;
 opacity:0;transition:opacity 1.4s var(--awaken-ease)}
.awaken.has-3d .gangho-3d{opacity:1}
.awaken.has-3d .awaken__land svg,
.awaken.has-3d .awaken__moon,
.awaken.has-3d .ink-layer{opacity:0;transition:opacity 1.2s var(--awaken-ease)}
/* 3D 장면은 제 운무로 아래를 덮으므로 2D 안개 띠는 끝자락만 남긴다. */
.awaken.has-3d .awaken__land::after{height:22%}
/* 글이 산수 위에서 읽히도록 왼쪽 아래에 먹을 옅게 깐다. */
.awaken.has-3d .awaken__stage::before{content:'';position:absolute;inset:0;z-index:0;pointer-events:none;
 background:radial-gradient(46% 52% at 24% 56%,#070a0980,transparent 72%)}
.awaken.has-3d .awaken__copy{z-index:3}

/* 3D 강호는 페이지 상자 안에 갇히면 몰입이 안 된다. 화면 끝에서 끝까지, 거의 한 화면 높이로. */
.awaken{width:100vw;margin-left:calc(50% - 50vw);
 min-height:clamp(620px,calc(100svh - 64px),980px)}
.awaken__stage{align-items:start;
 padding-top:clamp(40px,11vh,120px)}
@media (min-width:1080px){
 .awaken__copy{width:min(1320px,calc(100vw - 2 * var(--gutter)))}
 /* 카드가 산수를 가리지 않게 먹을 옅게 해 뒤가 비치게 한다 */
 .awaken.has-3d .issue{background:color-mix(in srgb,var(--panel) 62%,transparent);
  backdrop-filter:blur(10px) saturate(1.1)}
}
/* 전폭 첫 화면을 조상(#life-entry)이 잘라내고 있었다. 풀되, 100vw가 스크롤바 폭만큼
   넘치며 생기는 가로 스크롤은 body에서 막는다. */
.life-entry{overflow:visible}
body{overflow-x:clip}
/* 모든 폭에서 발급 카드 뒤로 산수가 비치게 한다. 좁은 화면은 카드가 화면 대부분을 덮는다. */
.awaken.has-3d .issue{background:color-mix(in srgb,var(--panel) 60%,transparent);
 backdrop-filter:blur(10px) saturate(1.1)}

/* ─────────────────────────────────────────────────────────
   10. 소리 손잡이 — 왼쪽 아래. 켜지면 막대가 숨 쉰다.
   ───────────────────────────────────────────────────────── */
.sound-toggle{position:fixed;left:max(14px,1.6vw);bottom:calc(14px + env(safe-area-inset-bottom,0px));z-index:40;
 display:flex;align-items:center;gap:9px;padding:9px 13px 9px 11px;
 background:#141a18d9;border:1px solid var(--panel-line);color:var(--shell-label);
 font:500 11px/1 var(--sans);letter-spacing:.14em;cursor:pointer;backdrop-filter:blur(6px);
 transition:border-color .2s,color .2s}
.sound-toggle:hover{border-color:var(--gold);color:var(--em)}
.sound-toggle__bars{display:flex;align-items:flex-end;gap:2px;height:12px}
.sound-toggle__bars i{display:block;width:2px;height:3px;background:currentColor;opacity:.55;transform-origin:50% 100%}
.sound-toggle.is-on{color:var(--em);border-color:#c5a77966}
.sound-toggle.is-on .sound-toggle__bars i{opacity:1;height:12px;animation:snd 1.1s ease-in-out infinite}
.sound-toggle.is-on .sound-toggle__bars i:nth-child(2){animation-delay:-.3s}
.sound-toggle.is-on .sound-toggle__bars i:nth-child(3){animation-delay:-.6s}
.sound-toggle.is-on .sound-toggle__bars i:nth-child(4){animation-delay:-.15s}
@keyframes snd{0%,100%{transform:scaleY(.25)}50%{transform:scaleY(1)}}

/* 좁은 화면에서 장 차례 손잡이(오른쪽 아래)와 겹치지 않게 왼쪽에 둔다 */

/* ─────────────────────────────────────────────────────────
   11. 3D 호패 — 손에 쥐고 돌려 보는 목패.
   ───────────────────────────────────────────────────────── */
.token-peek.has-hopae-3d{position:relative;width:min(380px,84vw);aspect-ratio:4/5;margin-inline:auto;cursor:grab}
.token-peek.has-hopae-3d.is-grabbing{cursor:grabbing}
/* SVG 호패는 화면낭독기와 인장 확대를 위해 남겨 두고 눈에서만 감춘다 */
.token-peek.has-hopae-3d>svg{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);opacity:0;pointer-events:none}
.token-peek.has-hopae-3d>svg .token-seal{pointer-events:auto}
/* 가로로 끌면 돌고, 세로로는 페이지가 그대로 넘어가게 */
.hopae-3d{position:absolute;inset:0;width:100%;height:100%;display:block;touch-action:pan-y}
.token-peek.has-hopae-3d::after{content:'끌어서 돌려 보기';position:absolute;left:50%;bottom:-6px;translate:-50% 100%;
 font:500 11px/1 var(--sans);letter-spacing:.24em;color:var(--paper-label);white-space:nowrap;opacity:.75}
/* 3D 호패가 커졌으니 간직하기 줄을 두 칸 격자로: 왼쪽 호패, 오른쪽 글. 좁으면 위아래로. */
.keep-ending:has(.has-hopae-3d){display:grid;grid-template-columns:minmax(260px,380px) minmax(0,1fr);
 gap:clamp(24px,4vw,56px);align-items:center}
.keep-ending:has(.has-hopae-3d) .token-peek{width:100%}
@media (max-width:760px){.keep-ending:has(.has-hopae-3d){grid-template-columns:1fr}
 .keep-ending:has(.has-hopae-3d) .token-peek{width:min(320px,82vw)}}

/* ─────────────────────────────────────────────────────────
   12. 좁은 화면 첫 화면 — 발급 카드를 접어 산수를 드러낸다.
   화면 대부분을 카드가 덮으면 3D 산수를 그린 의미가 없다. 버튼 둘만 남기고,
   「생년월일로 환생하기」를 누르면 입력 칸이 펼쳐진다.
   ───────────────────────────────────────────────────────── */
.issue__more{display:none}
@media (max-width:760px){
 .awaken{min-height:calc(100svh - 58px)}
 .awaken__stage{padding-top:clamp(26px,7vh,60px);align-items:stretch}
 .awaken__copy{height:100%;grid-template-rows:auto auto auto 1fr;align-content:start}
 .issue{align-self:end;margin-top:auto;padding:14px 14px 12px;gap:10px}
 .issue:not(.is-open) .issue__head,
 .issue:not(.is-open) .birth-row,
 .issue:not(.is-open) .gender-choice,
 .issue:not(.is-open) .entry-note{display:none}
 .issue__more{display:flex;align-items:center;justify-content:center;gap:8px;width:100%;
  min-height:44px;background:transparent;border:1px solid var(--panel-line);color:var(--shell-label);
  font:500 13px/1 var(--sans);letter-spacing:.06em;cursor:pointer}
 .issue__more span{color:var(--gold);font-size:15px}
 .issue.is-open{animation:issue-open .38s var(--awaken-ease) both}
 @keyframes issue-open{from{opacity:.4;transform:translateY(10px)}to{opacity:1;transform:none}}
 .awaken__hint{display:none}
 /* 접힌 카드는 산수를 가리지 않게 더 투명하게 */
 .awaken.has-3d .issue:not(.is-open){background:color-mix(in srgb,var(--panel) 38%,transparent)}
}
@media (max-width:760px){
 /* 좁은 화면의 소리 손잡이는 오른쪽 위로. 아래는 접힌 카드와 장 차례 손잡이가 쓴다. */
 .sound-toggle{left:auto;right:12px;bottom:auto;top:calc(12px + env(safe-area-inset-top,0px))}
}

/* ─────────────────────────────────────────────────────────
   13. 환생록 편집 디자인 — 같은 모양의 글이 열다섯 번 이어지는 벽에 리듬을 준다.
   ───────────────────────────────────────────────────────── */
.reading-chapter:not(.reading-scope){position:relative;isolation:isolate;
 padding-block:clamp(40px,7vw,72px) clamp(30px,5vw,48px);border-bottom:0}
/* 주제 한자: 크게, 아주 흐리게, 제목 오른쪽 뒤에. */
.chapter-ghost{position:absolute;z-index:-1;right:-.04em;top:clamp(14px,3vw,28px);
 font:500 clamp(150px,24vw,270px)/1 var(--serif);color:var(--ink);opacity:.055;
 pointer-events:none;user-select:none;will-change:transform}
/* 스크롤에 따라 천천히 흐른다(지원하는 브라우저만). 지원하지 않으면 제자리에 머문다. */
@supports (animation-timeline: view()){
 .chapter-ghost{animation:ghost-drift linear both;animation-timeline:view();animation-range:entry 0% exit 100%}
 @keyframes ghost-drift{from{transform:translate3d(0,40px,0)}to{transform:translate3d(0,-60px,0)}}
}
.reading-chapter:not(.reading-scope)>h3{font-size:clamp(23px,3.4vw,31px)!important;letter-spacing:-.01em;
 margin:0 0 clamp(16px,2.4vw,24px)}
.reading-chapter:not(.reading-scope)>h3::before{content:none}
/* 드롭캡: 장의 첫 글자를 붉은 먹으로 크게 */
.reading-chapter:not(.reading-scope)>h3~p:first-of-type::first-letter{float:left;
 font:600 3.3em/.86 var(--serif);color:var(--red);margin:.08em .12em 0 0;padding:.02em .02em 0}
/* 인용구: 본문에서 뽑은 한 문장을 크게 */
.chapter-pull{margin:clamp(22px,3.6vw,34px) 0;padding:4px 0 4px clamp(16px,2.4vw,24px);
 border-left:3px solid var(--red);max-width:30ch;
 font:500 clamp(19px,2.6vw,24px)/1.6 var(--serif);color:var(--ink);text-wrap:balance}
@media (min-width:980px){.chapter-pull{float:right;width:42%;margin:6px 0 20px 32px;max-width:none}}
.reading-chapter:not(.reading-scope)::after{content:'';display:block;clear:both}
/* 장 사이 구분: 곧은 선 대신 붓 한 획. 들어올 때 왼쪽에서 그어진다. */
.reading-chapter:not(.reading-scope)+.reading-chapter:not(.reading-scope)::before{content:'';position:absolute;left:0;top:0;
 width:min(260px,52%);height:10px;background:var(--ink);opacity:.72;
 -webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 260 10' preserveAspectRatio='none'%3E%3Cpath d='M2 6.2C30 3.6 64 3 102 3.9 142 4.8 180 3.3 214 3.8 232 4 246 4.9 258 5.6 246 6.9 226 7.4 200 7 168 6.6 132 7.8 96 7.3 62 6.8 30 7.6 6 8.2 3 7.9 1.5 7 2 6.2Z'/%3E%3C/svg%3E") center/100% 100% no-repeat;
 mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 260 10' preserveAspectRatio='none'%3E%3Cpath d='M2 6.2C30 3.6 64 3 102 3.9 142 4.8 180 3.3 214 3.8 232 4 246 4.9 258 5.6 246 6.9 226 7.4 200 7 168 6.6 132 7.8 96 7.3 62 6.8 30 7.6 6 8.2 3 7.9 1.5 7 2 6.2Z'/%3E%3C/svg%3E") center/100% 100% no-repeat;
 transform-origin:0 50%;transform:scaleX(1)}
.reading-chapter.is-in:not(.reading-scope)+.reading-chapter:not(.reading-scope)::before,
.reading-chapter:not(.reading-scope)+.reading-chapter.is-in:not(.reading-scope)::before{animation:brush-in .9s var(--awaken-ease) both}
@keyframes brush-in{from{transform:scaleX(0)}to{transform:scaleX(1)}}

@media (max-width:760px){
 /* 좁은 화면의 소리 손잡이는 아이콘만. 첫 화면을 지나면 꺼져 있을 때 숨는다. */
 .sound-toggle{padding:10px 11px;transition:opacity .3s,transform .3s}
 .sound-toggle__label{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}
}
/* 첫 화면(3D 산수)을 벗어나면 — 환생록을 읽거나 다른 화면으로 가면 — 꺼진 소리 손잡이는 숨는다.
   켜져 있으면 끌 수 있게 남긴다. */
.sound-toggle{transition:opacity .3s,transform .3s}
.sound-toggle.is-away:not(.is-on){opacity:0;transform:translateY(8px);pointer-events:none}
/* 환생록 장 차례는 환생 화면의 것이다. 다른 화면에서는 걷는다. */
html:not([data-screen=reincarnation]) :is(.chapter-rail,.rail-toggle){display:none!important}

/* ─────────────────────────────────────────────────────────
   14. 여섯 화면 — 같은 강호의 바탕, 화면의 주제 한자, 빈 상태의 장면.
   ───────────────────────────────────────────────────────── */
.page-backdrop{position:fixed;inset:0;width:100vw;height:100vh;z-index:0;pointer-events:none;
 opacity:0;transition:opacity .8s var(--awaken-ease)}
.page-backdrop.is-on{opacity:1}
/* 바탕 위로 화면 내용이 오게 한다 */
.layout{position:relative;z-index:1}

/* 화면 주제 한자: 표제 뒤에 크게 흐리게. 세로 표식과 같은 글자다. */
.page-heading[data-mark],.hero[data-mark]{isolation:isolate}
.page-heading[data-mark]>h1{position:relative}
.page-heading[data-mark]>h1::after{content:attr(data-glyph);position:absolute;z-index:-1;left:-.06em;top:50%;
 translate:0 -52%;font:500 clamp(140px,22vw,260px)/1 var(--serif);color:var(--shell-text);opacity:.07;
 pointer-events:none;letter-spacing:0}

/* 빈 상태: 점선 상자 대신 인장과 함께 다음 행동을 권한다 */
.empty{position:relative;border:1px solid var(--panel-line)!important;background:
 radial-gradient(120% 90% at 50% 0%,#ffffff08,transparent 70%)!important;
 padding:clamp(34px,5vw,52px) 22px!important}
.empty::before{content:'還生';display:grid;place-items:center;width:58px;height:58px;margin:0 auto 16px;
 border:3px solid var(--red);color:var(--red);font:600 17px/1.05 var(--serif);letter-spacing:.02em;
 writing-mode:vertical-rl;text-orientation:upright;opacity:.85;transform:rotate(-4deg)}
.empty b{font-size:clamp(18px,2.4vw,22px)!important;letter-spacing:-.01em}
/* 종이 판 위의 빈 상태는 먹색으로 */
.panel .empty,.saved-card .empty{border-color:var(--line)!important}



/* 손을 대면 반응한다. 종이 판은 살짝 떠오르고, 단추는 먹이 차오른다. */
.panel,.saved-card,.book-card,.glossary-card,.node-card,.relation-card,.shelf-item{
 transition:transform .35s var(--awaken-ease),box-shadow .35s var(--awaken-ease)}
@media (hover:hover) and (pointer:fine){
 .saved-card:hover,.book-card:hover,.glossary-card:hover,.node-card:hover,.relation-card:hover,.shelf-item:hover{
  transform:translateY(-4px);box-shadow:0 18px 40px -18px #000c}
 .button:not(.primary):not(.light){background-image:linear-gradient(var(--shell-line),var(--shell-line));
  background-size:0 100%;background-repeat:no-repeat;transition:background-size .35s var(--awaken-ease),color .2s}
 .button:not(.primary):not(.light):hover{background-size:100% 100%}
 .text-button{background-image:linear-gradient(var(--gold),var(--gold));background-size:0 1px;
  background-position:0 100%;background-repeat:no-repeat;transition:background-size .35s var(--awaken-ease)}
 .text-button:hover{background-size:100% 1px;border-bottom-color:transparent}
}

/* 화면에 들어올 때 주제 한자가 인장처럼 크고 흐릿하게 내려와 제자리에 앉는다 */
@keyframes glyph-land{0%{opacity:0;transform:scale(1.18);filter:blur(8px)}100%{opacity:.07;transform:none;filter:none}}
.view-enter .page-heading[data-mark]>h1::after{animation:glyph-land 1.1s var(--awaken-ease) .1s both}


/* 종이 판 밖의 검색 칸은 밤 바탕에 맞춘다. 종이 판 안에서는 종이 칸 그대로. */
main .toolbar :is(input:not([type=checkbox]):not([type=radio]),select){background:var(--input-bg);border-color:var(--input-border);color:var(--input-text)}
main .toolbar input::placeholder{color:var(--shell-small)}
main :is(.panel,.saved-card,.shelf-item,.node-card) .toolbar :is(input:not([type=checkbox]):not([type=radio]),select){background:var(--dialog-input-bg);border-color:var(--dialog-input-border);color:var(--ink)}
main :is(.panel,.saved-card,.shelf-item,.node-card) .toolbar input::placeholder{color:var(--muted)}
/* 도구줄은 종이 판 안에서만 먹색. 밤 바탕에 바로 놓인 도구줄은 밝은 글씨로 — 검은 바탕에 검은 글씨가 되지 않게. */
main .toolbar{color:var(--shell-text)}
main :is(.panel,.saved-card,.shelf-item,.node-card,.issue,.identity-empty,.discovery-bottom) .toolbar{color:var(--ink)}
main .toolbar>.button:not(.primary){border-color:#adb09c80}
main .toolbar>.button:not(.primary):hover{border-color:var(--gold);color:var(--em)}
main :is(.panel,.saved-card,.shelf-item,.node-card,.issue) .toolbar>.button:not(.primary){border-color:var(--outline)}
main :is(.panel,.saved-card,.shelf-item,.node-card,.issue) .toolbar>.button:not(.primary):hover{color:inherit}

/* 신분록의 3D 호패: 종이 판 위에 밤빛 감실(龕室)을 두고 그 안에 매단다 */
.identity-token.has-hopae-3d{position:relative;aspect-ratio:4/5;border-radius:12px;cursor:grab;
 background:radial-gradient(90% 70% at 50% 38%,#2c3a33,#141a18 72%);box-shadow:0 20px 80px var(--paper-shadow),inset 0 0 0 1px #ffffff10}
.identity-token.has-hopae-3d.is-grabbing{cursor:grabbing}
.identity-token.has-hopae-3d>svg{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);opacity:0;pointer-events:none}
.identity-token.has-hopae-3d::after{content:'끌어서 돌려 보기';position:absolute;left:50%;bottom:14px;translate:-50% 0;
 font:500 11px/1 var(--sans);letter-spacing:.14em;color:#e5e4da88;pointer-events:none}

/* ─────────────────────────────────────────────────────────
   15. 우리 문파 — 전각(殿閣). 문 위의 현판, 양 기둥의 주련, 족자로 건 동문들, 인연의 붓선.
   ───────────────────────────────────────────────────────── */
.party-hall{position:relative;margin-bottom:23px;padding:clamp(26px,4vw,44px) clamp(14px,3vw,36px) clamp(30px,4vw,48px);
 text-align:center;border:1px solid var(--panel-line);color:var(--panel-text);overflow:hidden;
 background:radial-gradient(70% 55% at 50% 0%,#33413a,transparent 70%),linear-gradient(#1d2622,#151c19)}
/* 처마 그림자 */
.party-hall::before{content:'';position:absolute;inset:0 0 auto;height:14px;background:linear-gradient(#0008,transparent);pointer-events:none}
.party-hall>.eyebrow{color:var(--em);margin:0}
/* 현판: 짙은 나무판에 금빛으로 새긴 이름. 두 줄에 매달려 아주 조금 흔들린다. */
.hall-plaque{position:relative;display:inline-flex;align-items:center;gap:clamp(12px,2vw,20px);margin:40px auto 10px;
 padding:clamp(14px,2vw,20px) clamp(26px,5vw,52px);color:#e7c98c;transform-origin:50% -40px;
 background:repeating-linear-gradient(90deg,#ffffff05 0 2px,transparent 2px 9px),linear-gradient(#5b3e25,#3a2717);
 border:2px solid #86653c;box-shadow:inset 0 0 0 5px #2c1d10,inset 0 0 0 7px #8a6a4066,0 20px 44px #000a;
 animation:plaque-sway 7s ease-in-out infinite}
.hall-plaque h2{margin:0 -.28em 0 0;font:600 clamp(28px,4.6vw,50px)/1.15 var(--serif);letter-spacing:.28em;
 text-shadow:0 2px 0 #1a0f07,0 -1px 0 #fff0c433}
.hall-rope{position:absolute;top:-40px;width:2px;height:40px;background:linear-gradient(#974d3a55,#974d3a)}
.hall-rope:first-child{left:18%}.hall-rope:nth-child(2){right:18%}
.hall-seal{writing-mode:vertical-rl;text-orientation:upright;font:600 11px/1 var(--serif);letter-spacing:.05em;
 color:var(--seal-text);background:var(--red);padding:5px 3px;border-radius:1px;opacity:.9}
@keyframes plaque-sway{0%,100%{rotate:-.5deg}50%{rotate:.5deg}}
.hall-motto{margin:14px auto 0;max-width:36em;font:500 clamp(14px,1.5vw,16px)/1.8 var(--serif);color:var(--panel-quiet)}
.party-hall.has-couplet .hall-motto{display:none}
/* 기둥 사이: 주련 - 동문들 - 주련 */
.hall-body{position:relative;display:grid;grid-template-columns:minmax(0,1fr);align-items:start;justify-items:center;
 gap:clamp(14px,3vw,40px);margin-top:clamp(24px,3vw,36px);padding-bottom:var(--tie-room,0px)}
.party-hall.has-couplet .hall-body{grid-template-columns:auto minmax(0,1fr) auto}
.hall-couplet{margin:0;writing-mode:vertical-rl;padding:22px 11px;min-height:260px;
 font:500 clamp(15px,1.5vw,18px)/1.5 var(--serif);letter-spacing:.32em;color:#dcc08a;
 background:repeating-linear-gradient(0deg,#ffffff04 0 2px,transparent 2px 8px),linear-gradient(90deg,#2a2016,#3a2c1d 50%,#2a2016);
 border:1px solid #6d5232;box-shadow:0 14px 30px #0007}
/* 동문: 족자처럼 위 축에 걸린 종이 */
.party-hall .party-members{display:flex;justify-content:center;flex-wrap:wrap;gap:clamp(14px,2.4vw,26px);margin:0}
.party-hall .party-member{position:relative;width:clamp(128px,14vw,152px);margin:0;padding:12px 10px 12px;border:0;border-radius:0;
 background:linear-gradient(#f1ebdd,#e5dcc6);color:var(--ink);box-shadow:0 16px 34px #0008;transform-origin:50% -8px;
 animation:hang-in .9s cubic-bezier(.2,.8,.2,1) both,scroll-sway 6s ease-in-out infinite;animation-delay:calc(var(--i)*140ms),calc(var(--i)*-1.3s)}
.party-hall .party-member::before{content:'';position:absolute;left:-7px;right:-7px;top:-7px;height:7px;border-radius:4px;
 background:linear-gradient(#6b4a2c,#3b2716);box-shadow:0 2px 3px #0006}
.party-hall .party-member::after{content:'';position:absolute;left:-5px;right:-5px;bottom:-6px;height:6px;border-radius:3px;background:#3b2716}
.party-hall .party-member svg{display:block;width:100%;height:150px;object-fit:cover;outline:1px solid #29322c22}
.party-hall .party-member figcaption{margin-top:9px}
.party-hall .party-member b{display:block;font:600 17px/1.3 var(--serif);letter-spacing:.06em;margin:0}
.party-hall .party-member small{display:block;font-size:11px;color:var(--paper-label);margin-top:2px}
.party-hall .party-member button{margin-top:6px;color:var(--paper-label);font-size:10px}
@keyframes hang-in{from{opacity:0;transform:translateY(-26px) rotate(-3deg)}}
@keyframes scroll-sway{0%,100%{rotate:-.6deg}50%{rotate:.6deg}}
/* 인연의 붓선 */
.hall-ties{position:absolute;inset:0;width:100%;height:calc(100% + 200px);overflow:visible;pointer-events:none}
.hall-ties path{fill:none;stroke:var(--em);stroke-width:1.6;stroke-linecap:round;stroke-dasharray:1;stroke-dashoffset:1;opacity:.85;
 animation:tie-draw 1.2s cubic-bezier(.6,0,.2,1) forwards;animation-delay:calc(.7s + var(--k)*.25s)}
.hall-ties text{font:600 13px var(--serif);letter-spacing:.12em;text-anchor:middle;fill:var(--em);paint-order:stroke;stroke:#161d1a;stroke-width:5px;
 opacity:0;animation:tie-label .5s ease forwards;animation-delay:calc(1.4s + var(--k)*.25s)}
.hall-ties .tie--foe path{stroke:#c4574c}.hall-ties .tie--foe text{fill:#d9776c}
@keyframes tie-draw{to{stroke-dashoffset:0}}
@keyframes tie-label{to{opacity:1}}
@media (max-width:640px){
 .party-hall.has-couplet .hall-body{grid-template-columns:minmax(0,1fr)}
 .hall-couplet{display:none}
 .party-hall.has-couplet .hall-motto{display:block}
 .party-hall .party-member{width:calc(50% - 10px);max-width:150px}
}


/* ─────────────────────────────────────────────────────────
   16. 입문첩 — 강호도(江湖圖). 가장 넓은 먹 띠(강호)에서 좁아져(무림) 깃발 셋(문파·세가·표국)으로 갈린다.
   ───────────────────────────────────────────────────────── */
.world-map{gap:0;max-width:760px;margin:18px auto 26px}
.world-map>.wm-tier{position:relative;display:grid;justify-items:center;gap:2px;min-width:0;border:0;border-radius:0;
 color:var(--panel-text);overflow:hidden;isolation:isolate}
.world-map>.wm-tier i{position:absolute;z-index:-1;inset:auto 0 -.18em;font:600 clamp(58px,9vw,92px)/1 var(--serif);font-style:normal;
 letter-spacing:.2em;color:#ffffff0d;pointer-events:none}
.world-map>.wm-tier b{font:600 clamp(20px,2.4vw,24px)/1.3 var(--serif);letter-spacing:.3em;margin-right:-.3em}
.world-map>.wm-tier small{color:var(--panel-quiet);font-size:12px}
/* 강호: 폭 전체, 먼 능선이 깔린 먹 띠 */
.world-map>.wm-gangho{width:100%;padding:26px 20px 34px;
 background:linear-gradient(transparent 62%,#0000),
  radial-gradient(120% 90% at 50% 120%,#3d4b43 0 30%,transparent 31%),
  linear-gradient(#26302b,#1b2320)}
.world-map>.wm-gangho::after{content:'';position:absolute;z-index:-1;inset:auto 0 0;height:46%;background:#2f3b35;
 clip-path:polygon(0 100%,0 62%,9% 40%,17% 55%,28% 22%,37% 44%,46% 30%,57% 58%,66% 26%,76% 48%,86% 20%,94% 42%,100% 34%,100% 100%)}
/* 무림: 좁아진 띠 */
.world-map>.wm-murim{width:min(62%,460px);padding:18px 18px 22px;background:linear-gradient(#2b3631,#1f2824);box-shadow:0 12px 26px #0003}
/* 이음: 붓으로 내려 그은 한 획, 마지막은 셋으로 갈라진다 */
.wm-link{display:block;width:3px;height:30px;margin:0 auto;background:linear-gradient(var(--red),#974d3a88);border-radius:2px}
.wm-link--fork{position:relative;width:min(70%,520px);height:34px;background:none}
.wm-link--fork::before{content:'';position:absolute;left:50%;top:0;width:3px;height:14px;translate:-50% 0;background:var(--red);border-radius:2px}
.wm-link--fork::after{content:'';position:absolute;left:calc(100%/6);right:calc(100%/6);top:13px;height:21px;
 border:3px solid #974d3acc;border-bottom:0;border-radius:3px 3px 0 0}
/* 깃발 셋: 장대에 걸린 세로 깃발, 머리에 한자 인장 */
.world-map .map-branches{width:min(70%,520px);gap:clamp(8px,2vw,18px)}
.world-map .map-branches>div{position:relative;display:grid;justify-items:center;align-content:start;gap:3px;
 padding:34px 8px 30px;border:0;color:var(--panel-text);background:linear-gradient(#26302b,#1d2622);
 clip-path:polygon(0 0,100% 0,100% 100%,50% 88%,0 100%);transform-origin:50% 0;animation:banner-sway 6s ease-in-out infinite}
.world-map .map-branches>div:nth-child(2){animation-delay:-2s}.world-map .map-branches>div:nth-child(3){animation-delay:-4s}
.world-map .map-branches i{position:absolute;top:8px;font:600 11px/1 var(--serif);font-style:normal;letter-spacing:.08em;
 color:var(--seal-text);background:var(--red);padding:3px 4px}
.world-map .map-branches b{font:600 16px/1.3 var(--serif);margin-top:4px}
.world-map .map-branches small{color:var(--panel-quiet);font-size:11px}
@keyframes banner-sway{0%,100%{rotate:-.8deg}50%{rotate:.8deg}}
@media (max-width:520px){
 .world-map>.wm-murim{width:80%}.wm-link--fork,.world-map .map-branches{width:100%}
 .world-map .map-branches>div{padding:30px 4px 26px}
}

/* 좁은 화면의 드롭캡은 두 줄 높이로 가볍게 — 세 줄짜리는 좁은 단에서 글줄을 너무 깎는다 */
@media (max-width:560px){
 .reading-chapter:not(.reading-scope)>h3~p:first-of-type::first-letter{font-size:2.35em;line-height:.9;margin:.1em .1em 0 0}
}

/* ─────────────────────────────────────────────────────────
   17. 무림 설정실 — 종류별 인장과 사건 두루마리
   ───────────────────────────────────────────────────────── */
.node-card[data-type]{position:relative;padding-right:64px}
.node-card[data-type]::after{position:absolute;top:18px;right:18px;display:grid;place-items:center;width:34px;height:34px;
 font:600 19px/1 var(--serif);color:var(--seal-text);background:var(--red);border-radius:2px;transform:rotate(-3deg);
 box-shadow:inset 0 0 0 2px #ffffff22;opacity:.9}
.node-card[data-type=인물]::after{content:'人'}
.node-card[data-type=문파]::after{content:'派'}
.node-card[data-type=무공]::after{content:'武'}
.node-card[data-type=사건]::after{content:'事';background:#5d6a4f}
/* 사건 두루마리: 양 끝 나무 축 사이로 종이가 가운데서부터 펼쳐진다 */
.scroll-roll{display:flex;align-items:stretch;margin:18px 0 4px}
.roller{flex:0 0 14px;margin:-12px 0;border-radius:7px;position:relative;z-index:1;
 background:linear-gradient(90deg,#2e1f12,#8a6a40 45%,#3b2716);box-shadow:0 6px 14px #0004}
.scroll-paper{position:relative;flex:1;min-width:0;display:flex;margin:0;padding:30px 18px 26px;list-style:none;overflow-x:auto;
 scrollbar-width:thin;background:repeating-linear-gradient(90deg,#0000 0 118px,#6d523212 118px 119px),linear-gradient(#f3ecdd,#e9dfc9);
 box-shadow:inset 0 10px 14px -12px #0006,inset 0 -10px 14px -12px #0006;
 animation:unroll 1.1s cubic-bezier(.6,0,.2,1) both}
.scroll-paper::before{content:'';position:absolute;left:0;right:0;top:66px;height:2px;background:linear-gradient(90deg,transparent,#974d3a99 6%,#974d3a99 94%,transparent)}
.scroll-event{position:relative;flex:0 0 138px;display:grid;justify-items:center;align-content:start;gap:8px;text-align:center;padding:0 8px;
 animation:event-in .6s ease both;animation-delay:calc(.7s + var(--i)*90ms)}
.scroll-event strong{font:600 12px/1 var(--serif);letter-spacing:.06em;color:var(--seal-text);background:var(--red);padding:5px 7px;border-radius:1px}
.scroll-knot{width:12px;height:12px;border-radius:50%;background:#29322c;box-shadow:0 0 0 3px #efe7d6,0 0 0 4px #974d3a88;margin:5px 0 2px}
.scroll-event .text-button{font:600 16px/1.4 var(--serif);color:var(--ink);border-bottom:1px solid #29322c33}
.scroll-event small{font-size:11px;line-height:1.6;color:var(--muted)}
@keyframes unroll{from{clip-path:inset(0 50% 0 50%)}to{clip-path:inset(0 0 0 0)}}
@keyframes event-in{from{opacity:0;transform:translateY(6px)}}


/* ─────────────────────────────────────────────────────────
   18. 강호 서가 — 책등이 꽂힌 책장
   ───────────────────────────────────────────────────────── */
.shelf-case{margin:22px 0 8px}
.shelf-row{position:relative;display:flex;align-items:flex-end;justify-content:safe center;gap:3px;min-height:220px;padding:18px 18px 0;overflow-x:auto;scrollbar-width:thin;
 background:radial-gradient(90% 120% at 50% 100%,#2c2419,#171512 80%);border:1px solid #4a3a26;border-bottom:0;box-shadow:inset 0 16px 30px -18px #000}
/* 선반 널 */
.shelf-plank{height:16px;background:linear-gradient(#8a6a40,#5b3e25 40%,#2e1f12);border:1px solid #4a3a26;border-top:0;
 box-shadow:0 12px 22px #0007}
.spine{--c1:#3a4a5e;--c2:#233142;position:relative;flex:0 0 var(--w);height:var(--h);padding:22px 0 26px;border:0;border-radius:2px 2px 0 0;
 display:flex;justify-content:center;color:#efe3c6;cursor:pointer;transform-origin:50% 100%;
 background:linear-gradient(90deg,#0005,#0000 18%,#ffffff14 50%,#0000 82%,#0006),linear-gradient(var(--c1),var(--c2));
 box-shadow:inset 0 0 0 1px #0004,2px 0 3px #0005;transition:transform .25s var(--awaken-ease),filter .25s;
 animation:spine-in .7s var(--awaken-ease) both}
.spine:nth-child(3n+1){animation-delay:.05s}.spine:nth-child(3n+2){animation-delay:.12s}.spine:nth-child(3n){animation-delay:.19s}
.spine[style*="--tone:1"]{filter:saturate(.8) brightness(.92)}.spine[style*="--tone:2"]{filter:hue-rotate(-8deg) brightness(1.06)}
/* 금박 띠 두 줄 */
.spine::before{content:'';position:absolute;left:4px;right:4px;top:10px;height:5px;border-block:1px solid #d2b58799}
.spine span{writing-mode:vertical-rl;text-orientation:upright;font:600 13px/1.1 var(--serif);letter-spacing:.08em;max-height:100%;overflow:hidden;
 background:#efe3c61a;padding:6px 2px;border:1px solid #d2b58733}
.spine[data-status="읽는 중"]{--c1:#7a2f2a;--c2:#4f1d1a}
.spine[data-status="읽고 싶음"]{--c1:#3a4a5e;--c2:#233142}
.spine[data-status="완독"]{--c1:#3e5a44;--c2:#253829}
.spine[data-status="보류"]{--c1:#5d5a52;--c2:#3b3934;opacity:.85}
/* 읽는 중: 서표 끈이 위로 삐져나온다 */
.spine[data-status="읽는 중"]::after{content:'';position:absolute;top:-14px;right:8px;width:4px;height:26px;background:#d2b587;
 clip-path:polygon(0 0,100% 0,100% 100%,50% 82%,0 100%)}
/* 완독: 아래에 붉은 인장 */
.spine[data-status="완독"]::after{content:'讀';position:absolute;bottom:5px;left:50%;translate:-50% 0;font:600 10px/1 var(--serif);
 color:var(--seal-text);background:var(--red);padding:2px 2px}
.spine:hover,.spine:focus-visible{transform:translateY(-10px) rotate(-1.5deg);filter:brightness(1.15)}
.shelf-legend{display:flex;flex-wrap:wrap;align-items:center;gap:6px 14px;margin:12px 2px 0;font-size:11px;color:var(--shell-small)}
.shelf-legend i{display:inline-block;width:10px;height:14px;margin-right:-8px;border-radius:1px;vertical-align:-2px}
.shelf-legend i[data-status="읽는 중"]{background:#7a2f2a}.shelf-legend i[data-status="읽고 싶음"]{background:#3a4a5e}
.shelf-legend i[data-status="완독"]{background:#3e5a44}.shelf-legend i[data-status="보류"]{background:#5d5a52}
@keyframes spine-in{from{opacity:0;transform:translateY(24px)}}
@media (max-width:560px){.shelf-row{min-height:190px;padding:14px 10px 0}.spine{height:calc(var(--h) * .82)}}

/* 북엔드: 먹빛 돌 받침 */
.bookend{flex:0 0 18px;height:118px;margin:0 6px;border-radius:3px 3px 0 0;
 background:linear-gradient(90deg,#2a2622,#4a443c 40%,#23201c);box-shadow:inset 0 0 0 1px #ffffff10,2px 0 4px #0006}
.bookend:first-child{clip-path:polygon(0 18%,100% 0,100% 100%,0 100%)}
.bookend:last-child{clip-path:polygon(0 0,100% 18%,100% 100%,0 100%)}

/* ─────────────────────────────────────────────────────────
   19. 신분록 — 펼침 장부, 간직한 인물의 얼굴
   ───────────────────────────────────────────────────────── */
/* 접힌 장부 세 줄: 인장 · 제목 · 한 줄 설명 · 펼침 표시. 셋 모두 같은 종이 줄로. */
[data-view=identity] details:is(.identity-editor,.panel){margin:0 0 10px;padding:0;border:1px solid var(--line);border-radius:6px;
 background:var(--paper);color:var(--ink);overflow:hidden}
[data-view=identity] details:is(.identity-editor,.panel)>summary[data-seal]{list-style:none;display:grid;grid-template-columns:40px 1fr auto;
 grid-template-rows:auto auto;column-gap:16px;align-items:center;padding:16px 22px;margin:0;font:600 16px/1.4 var(--serif);cursor:pointer;
 transition:background .2s}
[data-view=identity] details>summary[data-seal]::-webkit-details-marker{display:none}
[data-view=identity] details>summary[data-seal]::before{content:attr(data-seal);grid-row:1/3;display:grid;place-items:center;width:38px;height:38px;
 font:600 19px/1 var(--serif);color:var(--seal-text);background:var(--red);border-radius:2px;transform:rotate(-3deg)}
[data-view=identity] details>summary[data-seal]::after{content:'펼치기 ＋';grid-column:3;grid-row:1/3;font:500 12px/1 var(--sans);color:var(--muted);letter-spacing:.04em}
[data-view=identity] details[open]>summary[data-seal]::after{content:'접기 －'}
[data-view=identity] details>summary[data-seal] small{grid-column:2;font:400 12px/1.5 var(--sans);color:var(--muted);margin-top:2px}
[data-view=identity] details>summary[data-seal]:hover{background:#29322c0a}
[data-view=identity] details[open]>summary[data-seal]{border-bottom:1px solid var(--line)}
[data-view=identity] details:is(.identity-editor,.panel)[open]>:not(summary){margin:20px 22px 22px}
[data-view=identity] .identity-editor[open]>.identity-layout{margin:20px 22px 22px}
/* 간직한 인물: 왼쪽에 작은 초상 */
.saved-card.has-face{display:grid;grid-template-columns:92px minmax(0,1fr);gap:16px;align-items:start;padding:16px}
.saved-face{width:92px;aspect-ratio:3/4;overflow:hidden;border-radius:3px;outline:1px solid var(--line);background:#e3dccb}
.saved-face svg{display:block;width:100%;height:100%;object-fit:cover}
.saved-body h3{margin-top:6px}
@media (max-width:560px){
 [data-view=identity] details:is(.identity-editor,.panel)>summary[data-seal]{grid-template-columns:34px 1fr;padding:14px 16px;column-gap:12px;font-size:15px}
 [data-view=identity] details>summary[data-seal]::before{width:32px;height:32px;font-size:16px}
 [data-view=identity] details>summary[data-seal]::after{display:none}
 [data-view=identity] details:is(.identity-editor,.panel)[open]>:not(summary){margin:16px}
}
/* 문파 — 주련은 동문 가까이, 첫 장면은 서신으로 */
.party-hall.has-couplet .hall-body{max-width:980px;margin-inline:auto}
.party-hall .party-member svg{height:auto;aspect-ratio:4/5}
.party-hall .party-member b{white-space:nowrap}
#party-display>.panel.story{position:relative;max-width:760px;margin:0 auto 28px;padding:30px clamp(20px,4vw,40px) 30px clamp(78px,9vw,96px);
 border:0;border-radius:2px;color:var(--ink);
 background:linear-gradient(90deg,#0000 calc(50% - .5px),#29322c14 50%,#0000 calc(50% + .5px)),linear-gradient(#f4eddf,#e8dec7);
 box-shadow:0 20px 44px #0007;transform:rotate(-.4deg)}
#party-display>.panel.story::before{content:'書信';position:absolute;left:clamp(22px,3vw,34px);top:30px;writing-mode:vertical-rl;text-orientation:upright;
 font:600 14px/1 var(--serif);letter-spacing:.1em;color:var(--seal-text);background:var(--red);padding:7px 5px;border-radius:1px}
#party-display>.panel.story h3{margin:0 0 10px;font:600 12px/1 var(--sans);letter-spacing:.24em;color:var(--red)}
#party-display>.panel.story p{margin:0;font:500 clamp(16px,1.7vw,19px)/2 var(--serif);color:#2c2418}
@media (max-width:640px){
 .party-hall .party-members:has(>.party-member:only-child) .party-member{width:min(66%,220px);max-width:none}
 #party-title{flex-wrap:wrap}
 #party-title>label{flex:1 1 100%}
 #party-title>button{flex:1 1 100%}
}

/* 결과를 펼치면 첫 화면의 안내 줄(단계·문구)은 걷는다 */
#life-experience:has(#life-result:not([hidden])) .welcome{display:none}
/* 장 번호: 제목 위 붉은 머리글로, 모든 폭에서 */
.chapter-mark{position:static!important;writing-mode:horizontal-tb!important;display:block;margin:0 0 8px;
 font:600 13px/1 var(--serif)!important;letter-spacing:.3em!important;opacity:.9!important}
/* 휴대폰 차례 손잡이: 지금 장 이름이 길어도 한 줄로 */
.rail-toggle{max-width:min(62vw,240px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* 사주 도표: 십성은 폭 전체로 두고 줄을 두 단으로 — 오른쪽 빈 칸이 생기지 않게 */
.reading-diagrams .role-figure{grid-column:1/-1}
@media (min-width:701px){
 .reading-diagrams .role-figure .bar-list{grid-template-columns:max-content minmax(36px,1fr) max-content max-content minmax(36px,1fr) max-content;column-gap:10px;row-gap:6px}
 .reading-diagrams .role-figure .bar-list .reading-bar{grid-column:span 3}
 .reading-diagrams .role-figure .bar-list .reading-bar:nth-child(odd){margin-right:24px}
}

/* ─────────────────────────────────────────────────────────
   20. 취향소 — 수묵 머리 그림, 선장본 표지
   ───────────────────────────────────────────────────────── */
[data-view=discover] .hero{background:linear-gradient(90deg,#1e2822 38%,#1a2320)}
[data-view=discover] .landscape{width:62%;background:none;-webkit-mask-image:linear-gradient(90deg,transparent,#000 22%);mask-image:linear-gradient(90deg,transparent,#000 22%)}
.ink-scape{position:absolute;inset:0;width:100%;height:100%;display:block}
[data-view=discover] .verse{z-index:1;letter-spacing:.5em;color:var(--em);opacity:.8;writing-mode:vertical-rl;text-orientation:upright}
[data-view=discover] .little-seal{z-index:1}
.taste-hint{margin:-8px 0 18px;font-size:13px;color:var(--shell-intro)}
.taste-hint::before{content:'緣';display:inline-grid;place-items:center;width:20px;height:20px;margin-right:8px;font:600 12px/1 var(--serif);
 color:var(--seal-text);background:var(--red);border-radius:2px;vertical-align:-4px}
/* 선장본(線裝本) 표지: 왼쪽을 실로 꿰맨 제본, 오른쪽 위에 세로 제첨(題簽) */
.book-top::before{content:none!important}
.book-top{background:
  linear-gradient(90deg,#0000 0 27px,#29322c22 27px 28px,#0000 28px),
  repeating-linear-gradient(0deg,#0000 0 3px,#ffffff08 3px 4px),
  var(--book-bg,var(--connection-bg))!important}
.book-top::after{content:'';position:absolute;left:0;top:0;bottom:0;width:27px;
 background:
  radial-gradient(circle at 14px 50%,#29322c 0 2.2px,#0000 2.6px) 0 0/27px 25% repeat-y,
  linear-gradient(90deg,#0000 13px,#f4ecdcaa 13px 15px,#0000 15px) 0 0/27px 100% no-repeat,
  linear-gradient(90deg,#29322c14,#0000);
 opacity:.9}
.book-symbol{opacity:.35!important;font-size:72px!important;letter-spacing:0!important}
.book-slip{position:absolute;right:54px;top:16px;bottom:16px;width:30px;display:flex;align-items:center;justify-content:flex-start;
 padding:10px 0;writing-mode:vertical-rl;text-orientation:upright;font:600 13px/1.1 var(--serif);letter-spacing:.08em;color:#2c2418;
 background:#f7f1e3;border:1px solid #29322c33;box-shadow:inset 0 0 0 3px #f7f1e3,inset 0 0 0 4px #974d3a55;overflow:hidden;z-index:1}
.book-format{z-index:2}
@media (max-width:520px){.book-slip{right:auto;left:36px;top:52px;bottom:12px;width:26px;font-size:12px}.book-symbol{display:none}}

/* 첫 화면: 머리띠 바로 아래에서 3D 산수가 시작해 화면 끝에서 끝난다 */
html[data-screen=reincarnation] main{padding-top:0}
.awaken{min-height:clamp(560px,calc(100svh - var(--head-h,64px)),1000px)}

/* ─────────────────────────────────────────────────────────
   21. 첫 화면 아래 — 명관에서 받는 것 네 가지, 견본 한 사람
   ───────────────────────────────────────────────────────── */
.welcome{max-width:1120px;margin:0 auto;padding:clamp(40px,7vw,80px) 0 clamp(40px,6vw,64px)!important;text-align:center}
.welcome-eyebrow{margin:0 0 22px;font:600 12px/1 var(--sans);letter-spacing:.3em;color:var(--em)}
.welcome-steps{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:clamp(10px,1.6vw,18px);text-align:left}
.welcome-steps article{position:relative;overflow:hidden;padding:26px 22px 24px;border:1px solid var(--panel-line);
 background:linear-gradient(#1f2924,#19211d);transition:transform .35s var(--awaken-ease),border-color .35s}
.welcome-steps article:hover{transform:translateY(-4px);border-color:#c5a77966}
.welcome-steps b{position:absolute;right:10px;top:-8px;font:600 88px/1 var(--serif);color:#ffffff0c;pointer-events:none}
.welcome-steps article::before{content:'';display:block;width:24px;height:2px;margin-bottom:18px;background:var(--red)}
.welcome-steps h3{margin:0 0 10px;font:600 22px/1.3 var(--serif);letter-spacing:.12em;color:var(--shell-text)}
.welcome-steps p{margin:0;font-size:13.5px;line-height:1.85;color:var(--shell-intro)}
.welcome-sample{display:inline-grid;grid-template-columns:auto 1fr auto;align-items:center;gap:16px;margin:clamp(26px,4vw,40px) auto 0;
 padding:14px 22px 14px 14px;text-align:left;color:var(--ink);background:linear-gradient(#f3ecdd,#e7dcc5);box-shadow:0 16px 36px #0008;
 transition:transform .3s var(--awaken-ease)}
.welcome-sample:hover{transform:translateY(-3px) rotate(-.3deg)}
.welcome-sample>span:nth-child(2){font:600 17px/1.4 var(--serif)}
.welcome-sample small{display:block;font:500 11px/1.4 var(--sans);letter-spacing:.14em;color:var(--red);margin-bottom:3px}
.welcome-sample__seal{writing-mode:vertical-rl;text-orientation:upright;font:600 13px/1 var(--serif);color:var(--seal-text);background:var(--red);padding:6px 5px}
.welcome-line{margin:clamp(34px,5vw,54px) 0 0!important;font:500 clamp(16px,1.8vw,19px)/2 var(--serif)!important;color:var(--welcome-p)}
.welcome i,.welcome>span{display:none}
#life-experience~.footnote{text-align:center}
@media (max-width:900px){.welcome-steps{grid-template-columns:1fr 1fr}}
@media (max-width:520px){
 .welcome{padding-inline:0!important}
 .welcome-steps{gap:8px}.welcome-steps article{padding:18px 14px 16px}
 .welcome-steps h3{font-size:18px}.welcome-steps p{font-size:12.5px}.welcome-steps b{font-size:64px}
 .welcome-sample{display:grid;width:100%}
}
/* iOS 사파리 날짜·시간 칸: 기본 모양·최소 폭 때문에 칸이 커지고 카드 밖으로 넘치던 것을 막는다 */
.birth-row{grid-template-columns:minmax(0,1.2fr) minmax(0,1fr)!important}
.birth-row>label{min-width:0}
.issue input[type=date],.issue input[type=time]{-webkit-appearance:none;appearance:none;display:block;box-sizing:border-box;
 min-width:0;max-width:100%;width:100%;height:48px;min-height:48px;line-height:22px;text-align:left}
.issue input::-webkit-date-and-time-value{text-align:left;margin:0;min-height:22px}
.issue input::-webkit-datetime-edit{padding:0}
.birth-row small{display:inline!important;margin:0 0 0 6px!important}
/* 결과 끝의 호패 틀: 좁은 화면에서 종이 폭을 넘지 않게(넘치면 옆 단추까지 종이 밖으로 밀린다) */
.keep-ending:has(.has-hopae-3d){grid-template-columns:minmax(260px,380px) minmax(0,1fr)}
@media (max-width:760px){
 .keep-ending:has(.has-hopae-3d){grid-template-columns:minmax(0,1fr)}
 .keep-ending:has(.has-hopae-3d) .token-peek{width:min(300px,100%)!important}
 .keep-ending>div{min-width:0}
}

/* 목패 검수 v3: 긴 몸체와 끈을 함께 담고, 이름을 충분한 크기로 보여 준다. */
.token-peek.has-hopae-3d,.identity-token.has-hopae-3d{aspect-ratio:3/5}
.identity-token.has-hopae-3d::after{bottom:-8px;translate:-50% 100%}

/* ─────────────────────────────────────────────────────────
   22. 입문첩 용어 — 한 장의 종이 위 사전. 분류마다 인장 머리, 항목은 선으로만 나눈다.
   ───────────────────────────────────────────────────────── */
#glossary-list{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));column-gap:clamp(24px,4vw,56px);gap:0 clamp(24px,4vw,56px);
 padding:clamp(18px,3vw,34px) clamp(18px,3.4vw,40px);background:linear-gradient(#f2ebdc,#e9dfc9);color:var(--ink);
 border:1px solid var(--line);border-radius:4px;box-shadow:0 18px 40px #0005}
#glossary-list>.empty{grid-column:1/-1}
.glossary-group{grid-column:1/-1;display:flex;align-items:center;gap:10px;margin:22px 0 4px;padding-bottom:10px;border-bottom:2px solid #29322c;
 font:600 15px/1 var(--serif);letter-spacing:.3em;color:var(--ink)}
.glossary-group:first-child{margin-top:0}
.glossary-group b{display:grid;place-items:center;width:26px;height:26px;font:600 14px/1 var(--serif);letter-spacing:0;color:var(--seal-text);background:var(--red);border-radius:2px}
#glossary-list .glossary-card{border:0;border-bottom:1px solid var(--line);border-radius:0;background:none;padding:16px 0 14px;box-shadow:none}
#glossary-list .glossary-card h3{margin:0 0 6px;font:600 19px/1.3 var(--serif)}
#glossary-list .glossary-card p{margin:0;font-size:13.5px;line-height:1.75}
#glossary-list .glossary-card blockquote{margin:8px 0 6px;padding:0 0 0 10px;background:none;border-left:2px solid #974d3a88;font-size:12.5px;line-height:1.7}
#glossary-list .glossary-card .text-button{font-size:12px;margin-right:10px}
@media (max-width:640px){
 #glossary-list{grid-template-columns:minmax(0,1fr);padding:16px}
 #glossary-list .glossary-card{padding:12px 0 10px}
 #glossary-list .glossary-card h3{font-size:17px}
 #glossary-list .glossary-card p{font-size:13px}
}
/* 밤 바탕 도구줄의 선택 칸: 사파리는 기본 흰 상자를 그려 밝은 글자가 사라진다. 모양을 직접 그린다. */
main .toolbar select{-webkit-appearance:none;appearance:none;padding-right:30px!important;
 background-image:linear-gradient(45deg,transparent 50%,currentColor 50%),linear-gradient(135deg,currentColor 50%,transparent 50%)!important;
 background-position:calc(100% - 16px) 52%,calc(100% - 11px) 52%!important;background-size:5px 5px,5px 5px!important;background-repeat:no-repeat!important}
main .toolbar select:not(.panel *){background-color:var(--input-bg)!important;color:var(--input-text)}
main .toolbar select option{color:#29322c;background:#f2ebdc}
/* 취향소 머리 그림: 화면 표식(趣向)과 겹치던 세로 글귀는 뺀다 */
[data-view=discover] .verse{display:none}
/* 제첨: 긴 제목은 두 줄로 세워도 비좁지 않게 폭을 글에 맞춘다 */
.book-slip{width:auto!important;min-width:30px;padding:10px 6px!important;column-gap:4px}
/* 설정실: 입력 판을 붙박아 두어, 오른쪽 목록이 길어져도 왼쪽이 비지 않게 */
@media (min-width:900px){#node-editor{position:sticky;top:18px}}
.chapter-mark{font-size:14px!important;letter-spacing:.24em!important}
.chapter-mark:not(:empty)::before{content:'第 '}
.chapter-mark:not(:empty)::after{content:' 章'}
@media (max-width:640px){
 /* 설정실: 이미 적은 설정(점검·목록)이 먼저, 새로 적는 판은 그 아래 */
 .world-layout{display:flex!important;flex-direction:column}
 .world-layout>#node-editor{order:2}
 /* 서가 기록 카드: 제목·상태·진도를 한 덩어리로 촘촘하게 */
 .shelf-item{padding:14px 16px!important}
 .shelf-item h3{font-size:18px;margin:4px 0}
 .shelf-item>.toolbar{margin:8px 0 0!important}
}

/* 입문첩 사전: 항목은 접었다 펴는 한 줄. 넓은 화면에서는 펼쳐 둔다. */
#glossary-list .glossary-card>summary{list-style:none;cursor:pointer;margin:0}
#glossary-list .glossary-card>summary::-webkit-details-marker{display:none}
#glossary-list .glossary-card[open]>summary{margin:0}
@media (max-width:640px){
 #glossary-list .glossary-card>summary{position:relative;padding-right:26px}
 #glossary-list .glossary-card>summary::after{content:'＋';position:absolute;right:0;top:2px;font-size:14px;color:var(--muted)}
 #glossary-list .glossary-card[open]>summary::after{content:'－'}
 #glossary-list .glossary-card p{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
 #glossary-list .glossary-card[open] p{display:block}
 .glossary-group{margin-top:18px}
}
/* iOS: 16px보다 작은 입력 칸을 누르면 사파리가 화면을 확대한다. 휴대폰의 모든 입력 칸을 16px로. */
@media (max-width:760px){
 input:not([type=checkbox]):not([type=radio]),select,textarea{font-size:16px!important}
}
/* 관주 말풍선과 안내 카드 사이: 여백 세 겹(38+80+40px)을 한 겹으로 */
#life-experience .welcome{padding-top:clamp(18px,2.6vw,30px)!important}
#life-experience .welcome .welcome-eyebrow{margin:0 0 18px!important}
/* 휴대폰 관주: 얼굴을 말풍선 옆에 작게 붙인다(위에 따로 떨어져 있으면 누가 말하는지 이어지지 않는다) */
@media (max-width:650px){
 .narrator{flex-direction:row!important;align-items:flex-start!important;gap:10px!important}
 .narrator .narrator-portrait{flex:0 0 60px!important;width:60px!important;height:72px!important}
 .narrator .narrator-text{font-size:14.5px}
}

/* 휴대폰 차례 손잡이: 평소엔 目 아이콘만. 장이 바뀔 때와 펼쳤을 때만 이름이 붙는다. */
.rail-toggle__name{display:inline-block;max-width:0;overflow:hidden;vertical-align:bottom;white-space:nowrap;opacity:0;
 transition:max-width .35s var(--awaken-ease),opacity .25s}
.rail-toggle.is-named .rail-toggle__name,.rail-toggle[aria-expanded=true] .rail-toggle__name{max-width:200px;opacity:1}
.rail-toggle{background:#1d2723!important;gap:0!important}
.rail-toggle.is-named,.rail-toggle[aria-expanded=true]{gap:7px!important}

/* ─────────────────────────────────────────────────────────
   23. 사주 원국 — 읽히는 원국: 다섯 점, 아이콘, 오행 모션, 십성 풀이, 읽는 순서, 합충 선
   ───────────────────────────────────────────────────────── */
.el-dots{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:6px;margin:6px 0 12px}
.el-dot{display:grid;justify-items:center;gap:2px;padding:7px 2px 6px;border-radius:6px;color:var(--c);
 background:color-mix(in srgb,var(--c) 12%,transparent);border:1px solid color-mix(in srgb,var(--c) 30%,transparent)}
.el-dot__icon{width:20px;height:20px}
.el-dot b{font:600 11px/1.2 var(--sans);color:var(--ink)}
.el-dot small{font-size:10.5px;color:var(--paper-label2)}
.el-dot.is-empty{background:transparent;border-style:dashed;color:#29322c55}
.el-dot.is-empty b{color:var(--paper-label2)}
.el-dot.is-top{box-shadow:0 0 0 2px color-mix(in srgb,var(--c) 55%,transparent)}
.pillar-stage{position:relative}
.pillar-plus .pillar-grid{position:relative;z-index:1;margin:26px 0 30px!important}
.pillar-plus .pillar{position:relative;overflow:visible}
.pillar-plus .pillar h3{display:flex;align-items:center;justify-content:center;gap:5px;margin-bottom:2px}
.pillar-role{margin:0 0 6px;font-size:10.5px;line-height:1.3;color:var(--paper-label2);text-align:center;word-break:keep-all}
.pillar-time{display:inline-flex;align-items:center;gap:2px;color:var(--gold)}
.pillar-time small{font-size:9.5px;color:var(--paper-label2)}
.time-icon{width:12px;height:12px}
.season-mark{position:absolute;right:4px;top:2px;font:600 30px/1 var(--serif);font-style:normal;color:#29322c12;pointer-events:none}
.pillar-plus .pillar-cell{position:relative;overflow:hidden;isolation:isolate;cursor:pointer}
.el-icon{position:absolute;left:4px;top:4px;width:14px;height:14px;color:var(--c);opacity:.75}
.god-chip{display:inline-block;margin-top:3px;padding:1px 6px 2px;border:1px solid color-mix(in srgb,var(--c) 45%,transparent);border-radius:10px;
 background:#fffc;font:600 11px/1.4 var(--sans);color:var(--ink);cursor:pointer}
.god-chip:hover,.god-chip[aria-expanded=true]{background:var(--c);color:#fff;border-color:var(--c)}
.god-self{display:block;font-size:11px;font-weight:700;color:var(--red);margin-top:2px}
.god-empty{display:block;min-height:18px}
.self-ribbon{position:absolute;left:50%;bottom:0;translate:-50% 0;font:700 9px/1 var(--sans);font-style:normal;letter-spacing:.06em;white-space:nowrap;
 color:#fff;background:var(--red);padding:3px 5px 2px;border-radius:3px 3px 0 0}
.pillar-plus .pillar-cell.is-self{box-shadow:inset 0 0 0 2px var(--red),0 0 18px color-mix(in srgb,var(--red) 35%,transparent);padding-bottom:18px}
.order-badge{position:absolute;right:3px;top:2px;font:700 13px/1 var(--serif);font-style:normal;color:var(--red);z-index:2}
.hidden-stems{display:flex;flex-wrap:wrap;justify-content:center;align-items:center;gap:3px}
.hidden-stems .inner-label{flex-basis:100%;text-align:center}
.hidden-stems .hid{display:inline-grid;place-items:center;width:20px;height:20px;border-radius:50%;font:600 12px/1 var(--serif);
 color:#fff;background:var(--c);box-shadow:0 1px 2px #0003}
.pillar-figure.is-in .hidden-stems .hid{animation:hid-rise .5s var(--awaken-ease) both;animation-delay:calc(1s + var(--i)*.09s)}
.pillar.is-poked .hidden-stems .hid{animation:hid-pop .55s var(--awaken-ease) both;animation-delay:calc(var(--i)*.07s)}
@keyframes hid-rise{from{opacity:0;transform:translateY(8px) scale(.6)}}
@keyframes hid-pop{40%{transform:translateY(-7px) scale(1.18)}}
.god-pop{position:absolute;z-index:5;padding:10px 12px 11px;border-radius:6px;background:#1d2723;color:var(--panel-text);
 box-shadow:0 12px 28px #0006;border:1px solid var(--panel-line);animation:pop-in .22s ease both}
.god-pop b{display:block;font:600 16px/1.3 var(--serif);color:var(--em)}
.god-pop small{display:block;font-size:11px;color:var(--panel-quiet);margin:2px 0 6px}
.god-pop p{margin:0;font-size:13px;line-height:1.7}
@keyframes pop-in{from{opacity:0;transform:translateY(-4px)}}
.pillar-guide{display:flex;flex-wrap:wrap;justify-content:center;gap:4px 12px;margin:0 0 4px;font-size:11px;color:var(--paper-label2)}
.pillar-ties{position:absolute;inset:0;width:100%;height:100%;overflow:visible;pointer-events:none;z-index:0}
.pillar-ties path{fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:1;stroke-dashoffset:1}
.pillar-ties .is-bond path{stroke:var(--gold)}
.pillar-ties .is-clash path{stroke:var(--red);filter:drop-shadow(0 0 3px #b8463f88)}
.pillar-ties text{font:600 10.5px var(--sans);text-anchor:middle;paint-order:stroke;stroke:#f1ebdd;stroke-width:4px;opacity:0}
.pillar-ties .is-bond text{fill:#8a6a30}.pillar-ties .is-clash text{fill:var(--red)}
.pillar-figure.is-in .pillar-ties path{animation:tie-draw 1s cubic-bezier(.6,0,.2,1) forwards;animation-delay:calc(1.3s + var(--k)*.2s)}
.pillar-figure.is-in .pillar-ties text{animation:tie-label .4s ease forwards;animation-delay:calc(1.9s + var(--k)*.2s)}

/* 오행별 모션: 원국이 나타날 때(기둥이 선 뒤) 한 번, 칸을 짚을 때마다 한 번 */
.pillar-plus .pillar-cell::after{content:'';position:absolute;inset:0;z-index:-1;pointer-events:none;opacity:0}
.pillar-figure.is-in .pillar-cell b,.pillar-cell.is-poked b{animation-duration:.9s;animation-fill-mode:both;animation-timing-function:var(--awaken-ease)}
.pillar-figure.is-in .pillar-cell::after,.pillar-cell.is-poked::after{animation-duration:1.1s;animation-fill-mode:both}
.pillar-figure.is-in .pillar:nth-child(1) .pillar-cell{--d:.7s}.pillar-figure.is-in .pillar:nth-child(2) .pillar-cell{--d:.82s}
.pillar-figure.is-in .pillar:nth-child(3) .pillar-cell{--d:.94s}.pillar-figure.is-in .pillar:nth-child(4) .pillar-cell{--d:1.06s}
.pillar-figure.is-in .pillar-cell b,.pillar-figure.is-in .pillar-cell::after{animation-delay:var(--d,.7s)}
.pillar-cell.is-poked b,.pillar-cell.is-poked::after{animation-delay:0s!important}
.pillar-cell[data-el=목]::after{background:linear-gradient(to top,color-mix(in srgb,var(--c) 45%,transparent),transparent 70%);transform-origin:50% 100%}
.pillar-figure.is-in .pillar-cell[data-el=목]::after,.pillar-cell.is-poked[data-el=목]::after{animation-name:el-grow}
.pillar-figure.is-in .pillar-cell[data-el=목] b,.pillar-cell.is-poked[data-el=목] b{animation-name:el-sway}
@keyframes el-grow{0%{opacity:.9;transform:scaleY(0)}55%{opacity:.8;transform:scaleY(1)}100%{opacity:0;transform:scaleY(1)}}
@keyframes el-sway{30%{rotate:-6deg}60%{rotate:4deg}}
.pillar-cell[data-el=화]::after{background:
 radial-gradient(circle at 30% 100%,var(--c) 0 2px,transparent 3px),radial-gradient(circle at 55% 100%,#e8a24a 0 2px,transparent 3px),
 radial-gradient(circle at 75% 100%,var(--c) 0 1.5px,transparent 2.5px)}
.pillar-figure.is-in .pillar-cell[data-el=화]::after,.pillar-cell.is-poked[data-el=화]::after{animation-name:el-ember}
.pillar-figure.is-in .pillar-cell[data-el=화] b,.pillar-cell.is-poked[data-el=화] b{animation-name:el-flicker}
@keyframes el-ember{0%{opacity:1;transform:translateY(0)}100%{opacity:0;transform:translateY(-70%)}}
@keyframes el-flicker{20%{text-shadow:0 0 10px #e8a24a;transform:scale(1.06)}45%{text-shadow:0 0 4px #e8a24a;transform:scale(.98)}70%{text-shadow:0 0 12px #e8a24a;transform:scale(1.04)}}
.pillar-cell[data-el=토]::after{background:radial-gradient(ellipse at 50% 88%,color-mix(in srgb,var(--c) 55%,transparent),transparent 55%)}
.pillar-figure.is-in .pillar-cell[data-el=토]::after,.pillar-cell.is-poked[data-el=토]::after{animation-name:el-dust}
.pillar-figure.is-in .pillar-cell[data-el=토] b,.pillar-cell.is-poked[data-el=토] b{animation-name:el-drop}
@keyframes el-drop{0%{transform:translateY(-12px)}55%{transform:translateY(2px)}75%{transform:translateY(-1px)}}
@keyframes el-dust{0%,40%{opacity:0;transform:scaleX(.3)}55%{opacity:.9}100%{opacity:0;transform:scaleX(1.4)}}
.pillar-cell[data-el=금]::after{background:linear-gradient(105deg,transparent 35%,#ffffffcc 50%,transparent 65%);transform:translateX(-100%)}
.pillar-figure.is-in .pillar-cell[data-el=금]::after,.pillar-cell.is-poked[data-el=금]::after{animation-name:el-sheen}
.pillar-figure.is-in .pillar-cell[data-el=금] b,.pillar-cell.is-poked[data-el=금] b{animation-name:el-ring}
@keyframes el-sheen{0%{opacity:1;transform:translateX(-100%)}100%{opacity:1;transform:translateX(100%)}}
@keyframes el-ring{50%{translate:1px 0}60%{translate:-1px 0}70%{translate:1px 0}80%{translate:0 0}}
.pillar-cell[data-el=수]::after{background:radial-gradient(circle,transparent 30%,color-mix(in srgb,var(--c) 55%,transparent) 36%,transparent 44%);transform:scale(.2)}
.pillar-figure.is-in .pillar-cell[data-el=수]::after,.pillar-cell.is-poked[data-el=수]::after{animation-name:el-ripple}
.pillar-figure.is-in .pillar-cell[data-el=수] b,.pillar-cell.is-poked[data-el=수] b{animation-name:el-bob}
@keyframes el-ripple{0%{opacity:1;transform:scale(.2)}100%{opacity:0;transform:scale(1.6)}}
@keyframes el-bob{40%{transform:translateY(3px)}70%{transform:translateY(-2px)}}
@media (max-width:420px){
 .el-dots{gap:4px}.el-dot b{font-size:10px}.el-dot small{font-size:9.5px}
 .pillar-role{font-size:9.5px}.el-icon{width:11px;height:11px;left:2px;top:2px}
 .god-chip{font-size:10px;padding:1px 4px}.hidden-stems .hid{width:17px;height:17px;font-size:10.5px}
 .order-badge{font-size:11px}.season-mark{font-size:22px}
}

@keyframes el-flash{0%{opacity:0}40%{opacity:1}100%{opacity:0}}

.pillar-plus .pillar h3>span:first-child{font:600 12px/1.3 var(--sans);color:var(--paper-label2)}
.pillar-plus .pillar-grid{margin:30px 0 44px!important}
.season-mark{top:auto;bottom:4px;right:5px}
@media (max-width:520px){.pillar-time small{display:none}.pillar-plus .pillar h3{gap:3px}}

/* ─────────────────────────────────────────────────────────
   24. 강호 기록 일곱 장 — 방문·족보·사문첩·비급 서문·객잔 풍문·강호 연표·서신
   ───────────────────────────────────────────────────────── */
/* 접힌 입구: 일곱 인장이 나란히. 누르면 펼쳐진다. */
.chronicle-pane>summary{display:flex;align-items:center;gap:16px;flex-wrap:wrap;list-style:none;cursor:pointer;padding:18px 20px!important;
 border:1px solid var(--line);border-radius:8px;background:linear-gradient(#f6f0e2,#ece2cd);transition:box-shadow .25s,transform .25s var(--awaken-ease)}
.chronicle-pane>summary::-webkit-details-marker{display:none}
.chronicle-pane>summary:hover{box-shadow:0 10px 24px #0002;transform:translateY(-2px)}
.chron-teaser{display:flex;gap:4px}
.chron-teaser i{display:grid;place-items:center;width:28px;height:28px;font:600 15px/1 var(--serif);font-style:normal;color:var(--seal-text);background:var(--red);
 border-radius:2px;box-shadow:inset 0 0 0 1.5px #ffffff30;transform:rotate(calc((var(--r,0)) * 1deg))}
.chron-teaser i:nth-child(odd){--r:-4}.chron-teaser i:nth-child(even){--r:3}
.chronicle-pane>summary:hover .chron-teaser i{animation:seal-hop .6s var(--awaken-ease) both}
.chron-teaser i:nth-child(2){animation-delay:.05s!important}.chron-teaser i:nth-child(3){animation-delay:.1s!important}.chron-teaser i:nth-child(4){animation-delay:.15s!important}
.chron-teaser i:nth-child(5){animation-delay:.2s!important}.chron-teaser i:nth-child(6){animation-delay:.25s!important}.chron-teaser i:nth-child(7){animation-delay:.3s!important}
@keyframes seal-hop{40%{transform:translateY(-6px) rotate(0)}}
.chron-summary{display:grid;gap:3px;min-width:0;flex:1}
.chron-summary b{font:600 18px/1.35 var(--serif);color:var(--ink)}
.chron-summary small{font-size:12.5px;color:var(--paper-label2);line-height:1.6}
.chronicle-pane[open]>summary{margin-bottom:22px}
.chronicle-pane[open] .chron-teaser i{background:#29322c}

.chronicle{display:grid;gap:clamp(20px,3vw,30px);color:var(--ink)}
.cr-title{text-align:center;padding:6px 0 4px}
.cr-kicker{margin:0;font:600 11px/1 var(--sans);letter-spacing:.3em;color:var(--red)}
.cr-title h2{margin:10px 0 12px;font:600 clamp(30px,5vw,42px)/1.15 var(--serif);letter-spacing:.06em}
.cr-title h2 small{display:block;font-size:.42em;letter-spacing:.2em;color:var(--paper-label2);margin-bottom:4px}
.cr-summary{max-width:34em;margin:0 auto;font:500 clamp(15px,1.6vw,17px)/1.9 var(--serif);color:#3b3a30}
.cr-summary span{display:block;font:600 11px/1 var(--sans);letter-spacing:.2em;color:var(--paper-label2);margin-bottom:6px}
.cr-toc{display:flex;flex-wrap:wrap;justify-content:center;gap:6px;margin-top:16px}
.cr-toc a{display:inline-flex;align-items:center;gap:5px;padding:4px 10px 4px 4px;border:1px solid var(--line);border-radius:14px;font-size:12px;color:var(--ink);background:#fff8}
.cr-toc a b{display:grid;place-items:center;width:20px;height:20px;font:600 11px/1 var(--serif);color:var(--seal-text);background:var(--red);border-radius:50%}
.cr-toc a:hover{border-color:var(--red)}

/* 문서 한 장 */
.cr-doc{position:relative;padding:clamp(18px,3vw,28px);border:1px solid #29322c1f;border-radius:4px;scroll-margin-top:80px;
 background:linear-gradient(#fbf7ee,#f1e9d6);box-shadow:0 14px 34px #29322c1f}
.cr-head{display:flex;align-items:center;gap:12px;margin-bottom:16px}
.cr-mark{display:grid;place-items:center;flex:0 0 40px;height:40px;font:600 22px/1 var(--serif);color:var(--seal-text);background:var(--red);border-radius:3px;transform:rotate(-3deg)}
.cr-head h3{margin:0;font:600 20px/1.2 var(--serif)}
.cr-head p{margin:3px 0 0;font-size:12px;color:var(--paper-label2)}
.cr-rare{margin-left:auto;display:grid;place-items:center;width:34px;height:34px;border:2px solid var(--red);border-radius:50%;font:600 16px/1 var(--serif);
 font-style:normal;color:var(--red);transform:rotate(12deg);opacity:.85}
.cr-prose{margin:0;font:400 15px/1.95 var(--serif);color:#2d2b24}
.cr-margin{margin:14px 0 0;padding:10px 12px;border-left:3px solid #974d3a88;background:#974d3a0d;font-size:13.5px;line-height:1.8}
.cr-margin span{display:block;font:600 11px/1 var(--sans);letter-spacing:.12em;color:var(--red);margin-bottom:5px}

/* 榜 방문 — 막대 사이로 풀리는 공고 */
.cr-bang{background:linear-gradient(#f3e8cc,#e6d6b0);border-color:#6d523233}
.cr-bang::before,.cr-bang::after{content:'';position:absolute;left:-6px;right:-6px;height:10px;border-radius:5px;background:linear-gradient(#8a6a40,#4a3320);box-shadow:0 2px 4px #0004}
.cr-bang::before{top:-5px}.cr-bang::after{bottom:-5px}
.cr-callout{margin:0;text-align:center;font:600 13px/1 var(--sans);letter-spacing:.5em;color:var(--red)}
.cr-poster-name{margin:8px 0 14px;text-align:center;font:700 clamp(30px,6vw,44px)/1.1 var(--serif);letter-spacing:.2em}
.cr-poster-name small{display:block;font-size:.4em;letter-spacing:.25em;color:#5d4a30;margin-bottom:4px}
.cr-sign{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px 22px;margin:0}
.cr-sign div{display:grid;grid-template-columns:3.2em 1fr;gap:8px;padding-bottom:6px;border-bottom:1px dashed #6d523255}
.cr-sign dt{font:600 12px/1.7 var(--sans);color:#6d5232}
.cr-sign dd{margin:0;font:500 14px/1.7 var(--serif)}
.cr-foot{margin:14px 0 0;text-align:center;font-size:12.5px;color:#5d4a30}
.cr-chase{position:relative;margin:14px 0 0;padding:10px 12px 10px 64px;background:#974d3a14;font-size:13.5px;line-height:1.7}
.cr-stamp{position:absolute;left:10px;top:50%;translate:0 -50%;display:grid;place-items:center;width:42px;height:42px;border:3px solid var(--red);
 font:700 22px/1 var(--serif);color:var(--red);transform:rotate(-12deg)}
.cr-doc.cr-bang{clip-path:inset(0 -10px 0 -10px)}
.cr-bang.is-in{animation:unroll 1s cubic-bezier(.5,0,.2,1) both}
.cr-bang.is-in .cr-sign div{animation:ink-in .5s ease both;animation-delay:calc(.6s + var(--i)*.06s)}
.cr-bang.is-in .cr-stamp{animation:stamp-thud .5s cubic-bezier(.3,1.6,.5,1) 1.3s both}
@keyframes unroll{from{clip-path:inset(0 -10px 100% -10px)}to{clip-path:inset(0 -10px 0 -10px)}}
@keyframes ink-in{from{opacity:0;filter:blur(3px)}}
@keyframes stamp-thud{from{opacity:0;transform:rotate(-12deg) scale(2.2)}to{opacity:1;transform:rotate(-12deg) scale(1)}}

/* 譜 족보 — 가지가 그어진다 */
.cr-tree{display:grid;justify-items:center;gap:22px;margin:4px 0 18px;position:relative}
.cr-node{position:relative;display:inline-grid;justify-items:center;padding:6px 12px;border:1px solid #29322c40;border-radius:3px;background:#fffb;font:600 14px/1.3 var(--serif);text-align:center}
.cr-node small{font:500 10.5px/1.2 var(--sans);color:var(--paper-label2)}
.cr-node.is-root{font-size:18px;padding:8px 18px;background:#29322c;color:#f3ecdd;border-color:#29322c}
.cr-node.is-you{border:2px solid var(--red);color:var(--red)}
.cr-node.is-kin{border-style:dashed}
.cr-node.is-fallen{color:#8a8578;background:#ece6d8}
.cr-node.is-fallen::after{content:'';position:absolute;left:6%;right:6%;top:50%;height:2px;background:var(--red);transform:scaleX(0);transform-origin:left}
.cr-branches,.cr-leaves{display:flex;flex-wrap:wrap;justify-content:center;gap:10px 14px;position:relative}
.cr-branches::before,.cr-leaves::before{content:'';position:absolute;left:50%;top:-22px;width:1.5px;height:22px;background:#29322c66;transform-origin:top;transform:scaleY(0)}
.cr-bo.is-in .cr-branches::before{animation:grow-y .4s ease .2s forwards}
.cr-bo.is-in .cr-leaves::before{animation:grow-y .4s ease .7s forwards}
.cr-bo.is-in .cr-branches .cr-node,.cr-bo.is-in .cr-leaves .cr-node{animation:ink-in .5s ease both}
.cr-bo.is-in .cr-branches .cr-node{animation-delay:calc(.5s + var(--i,0)*.12s)}
.cr-bo.is-in .cr-leaves .cr-node{animation-delay:1s}
.cr-bo.is-in .cr-node.is-fallen::after{animation:strike .5s ease 1.2s forwards}
@keyframes grow-y{to{transform:scaleY(1)}}
@keyframes strike{to{transform:scaleX(1)}}

/* 門 사문첩 — 옛 소속에서 지금 소속으로 */
.cr-lineage{margin:0 0 12px;font:500 15px/1.6 var(--serif)}
.cr-side{display:inline-block;margin-left:8px;padding:1px 8px;border-radius:10px;font:600 11px/1.6 var(--sans);color:#fff;background:#6b7d72;vertical-align:2px}
.cr-side[data-side=정파]{background:#3d6b86}.cr-side[data-side=사파]{background:#974d3a}.cr-side[data-side=마도],.cr-side[data-side=마교]{background:#5a2a3a}
.cr-path{display:grid;grid-template-columns:auto minmax(60px,1fr) auto;align-items:center;gap:8px;margin:0 0 14px}
.cr-path.is-single{grid-template-columns:auto}
.cr-org{padding:8px 14px;border:1px solid #29322c40;border-radius:3px;font:600 15px/1.2 var(--serif);background:#fffb}
.cr-org.is-prev{color:#8a8578;text-decoration:line-through;text-decoration-color:#974d3a99}
.cr-org.is-now{background:#29322c;color:#f3ecdd}
.cr-path svg{width:100%;height:22px;overflow:visible}
.cr-path path{fill:none;stroke:var(--red);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:1;stroke-dashoffset:1;vector-effect:non-scaling-stroke}
.cr-mun.is-in .cr-path path{animation:tie-draw .9s cubic-bezier(.6,0,.2,1) .3s forwards}
.cr-mun.is-in .cr-path path.cr-arrow{animation-delay:1.1s;animation-duration:.3s}
.cr-mun.is-in .cr-org.is-now{animation:seal-pop .5s var(--awaken-ease) 1.2s both}
@keyframes seal-pop{from{transform:scale(.8);opacity:.3}}
.cr-rule{margin:14px 0 0;padding:4px 0 4px 16px;border-left:3px solid var(--gold);font:500 16px/1.7 var(--serif)}
.cr-rule span{display:block;font:600 11px/1 var(--sans);letter-spacing:.14em;color:#8a6a30;margin-bottom:4px}
.cr-facts,.cr-chips,.cr-gifts{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:8px 16px;margin:14px 0 0}
.cr-facts div,.cr-chips div{padding:7px 10px;border-radius:3px;background:#29322c0a}
.cr-facts dt,.cr-chips dt,.cr-gifts dt{font:600 11px/1.4 var(--sans);color:var(--paper-label2)}
.cr-facts dd,.cr-chips dd,.cr-gifts dd{margin:2px 0 0;font:500 14px/1.5 var(--serif)}

/* 笈 비급 서문 — 표지 한 줄과 서문, 경지의 사다리, 자질의 먹점 */
.cr-book{display:grid;grid-template-columns:56px minmax(0,1fr);gap:18px}
.cr-book-title{margin:0;writing-mode:vertical-rl;text-orientation:upright;display:grid;place-items:center;padding:14px 0;
 font:600 20px/1 var(--serif);letter-spacing:.2em;color:#e8d9b4;background:linear-gradient(90deg,#2c241a,#4a3a26 50%,#2c241a);border-radius:2px 6px 6px 2px;
 box-shadow:inset 3px 0 0 #1a140d,0 6px 14px #0003;align-self:start;min-height:180px}
.cr-preface{text-indent:1em}
.cr-ladder{list-style:none;margin:16px 0 0;padding:0;display:grid;grid-template-columns:repeat(var(--n),minmax(0,1fr));gap:4px;align-items:end;height:84px}
.cr-ladder li{position:relative;height:calc(18% + var(--k) * 12%);border-radius:2px 2px 0 0;background:#29322c14;display:flex;align-items:flex-end;justify-content:center}
.cr-ladder li span{position:absolute;bottom:-18px;font:500 10.5px/1 var(--sans);color:var(--paper-label2);white-space:nowrap}
.cr-ladder li.is-past,.cr-ladder li.is-here{background:#29322c;transform-origin:bottom;transform:scaleY(0)}
.cr-ladder li.is-here{background:var(--red)}
.cr-ladder li.is-here span{color:var(--red);font-weight:700}
.cr-ladder{margin-bottom:22px}
.cr-geup.is-in .cr-ladder li.is-past,.cr-geup.is-in .cr-ladder li.is-here{animation:grow-y .45s cubic-bezier(.3,1.3,.5,1) forwards;animation-delay:calc(.4s + var(--k)*.12s)}
.cr-geup:not(.is-in) .cr-ladder li.is-past,.cr-geup:not(.is-in) .cr-ladder li.is-here{transform:scaleY(0)}
.cr-dots{display:inline-flex;gap:4px;vertical-align:middle;margin-right:8px}
.cr-dots i{width:10px;height:10px;border-radius:50%;border:1.5px solid #29322c55}
.cr-dots i.on{background:#29322c;border-color:#29322c;transform:scale(0)}
.cr-geup.is-in .cr-dots i.on{animation:dot-ink .35s cubic-bezier(.3,1.6,.5,1) forwards;animation-delay:calc(1.2s + var(--i)*.08s)}
@keyframes dot-ink{to{transform:scale(1)}}
.cr-gifts dd small{font:400 12px/1.4 var(--sans);color:var(--paper-label2)}

/* 聞 객잔 풍문 — 말풍선이 차례로, 귓속말은 뒤집어야 */
.cr-voices{list-style:none;margin:0;padding:0;display:grid;gap:12px}
.cr-voices li{display:grid;grid-template-columns:auto 1fr;gap:10px;align-items:start;max-width:92%}
.cr-voices li:nth-child(even){justify-self:end;grid-template-columns:1fr auto}
.cr-voices li:nth-child(even) .cr-who{order:2}
.cr-who{display:grid;place-items:center;min-width:46px;padding:4px 6px;border-radius:50%;aspect-ratio:1;font:600 11px/1.2 var(--sans);text-align:center;color:#f3ecdd;background:#4a3a26;word-break:keep-all}
.cr-voices p{position:relative;margin:0;padding:10px 14px;border-radius:14px;background:#fff;box-shadow:0 3px 10px #0001;font:500 14.5px/1.7 var(--serif)}
.cr-mun2.is-in .cr-voices li{animation:bubble .5s cubic-bezier(.3,1.5,.5,1) both;animation-delay:calc(.2s + var(--i)*.45s)}
@keyframes bubble{from{opacity:0;transform:translateY(10px) scale(.92)}}
.cr-whisper{display:grid;width:100%;margin:16px 0 0;padding:0;border:0;background:none;cursor:pointer;perspective:800px;text-align:left}
.cr-whisper>span{grid-area:1/1;padding:14px 16px;border-radius:6px;backface-visibility:hidden;transition:transform .6s var(--awaken-ease)}
.cr-whisper-front{background:#29322c;color:#e8d9b4;font:600 15px/1.5 var(--serif)}
.cr-whisper-front small{display:block;font:500 11px/1.4 var(--sans);color:#a8af9e;margin-top:2px}
.cr-whisper-back{background:#3a1f1a;color:#f3ecdd;font:500 15px/1.8 var(--serif);transform:rotateX(180deg)}
.cr-whisper[aria-expanded=true] .cr-whisper-front{transform:rotateX(-180deg)}
.cr-whisper[aria-expanded=true] .cr-whisper-back{transform:rotateX(0)}

/* 年 강호 연표 — 선이 내려오며 사건이 하나씩 */
.cr-line{list-style:none;margin:0;padding:0 0 0 22px;position:relative}
.cr-line::before{content:'';position:absolute;left:6px;top:6px;bottom:6px;width:2px;background:#29322c33}
.cr-line li{position:relative;padding:0 0 16px 14px;opacity:.12;transition:opacity .5s ease,transform .5s var(--awaken-ease);transform:translateX(-6px)}
.cr-line li.is-in{opacity:1;transform:none}
.cr-line li::before{content:'';position:absolute;left:-21px;top:6px;width:12px;height:12px;border-radius:50%;background:#f1e9d6;border:2px solid #29322c}
.cr-line time{display:block;font:600 12px/1.4 var(--sans);color:var(--red);letter-spacing:.04em}
.cr-line p{margin:2px 0 0;font:400 14.5px/1.75 var(--serif)}
.cr-line small{display:block;margin-top:4px;font:400 12.5px/1.6 var(--sans);color:var(--paper-label2)}
.cr-line li.is-gift::before{background:var(--gold);border-color:#8a6a30;box-shadow:0 0 0 4px #c5a77933}
.cr-line li.is-now::before{background:var(--red);border-color:var(--red)}
.cr-line li.is-now.is-in::before{animation:pulse 1.8s ease-out infinite}
.cr-line li.is-now time{font-size:13px}
@keyframes pulse{0%{box-shadow:0 0 0 0 #974d3a88}100%{box-shadow:0 0 0 12px #974d3a00}}
.cr-past{margin:14px 0 0;font-size:12.5px;color:var(--paper-label2);text-align:center}

/* 書 서신 — 편지가 부채꼴로, 봉인을 깨야 추신이 */
.cr-letters{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:16px;margin-top:12px}
.cr-letter{position:relative;padding:16px 16px 14px;background:repeating-linear-gradient(#fffdf6 0 27px,#29322c12 27px 28px);border:1px solid #29322c26;
 box-shadow:0 8px 18px #29322c1f;transform:rotate(calc((var(--i) - 1) * .8deg))}
.cr-letter header{display:flex;align-items:baseline;gap:8px;margin-bottom:8px;border-bottom:1px solid #29322c22;padding-bottom:6px}
.cr-letter header b{font:600 17px/1.3 var(--serif)}
.cr-letter header small{font-size:11px;color:var(--paper-label2)}
.cr-letter-body{margin:0;font:500 15px/1.85 var(--serif)}
.cr-letter-reply{margin:10px 0 0;font-size:12.5px;line-height:1.7;color:#4a4a40}
.cr-letter-reply span{display:block;font:600 10.5px/1 var(--sans);letter-spacing:.12em;color:var(--paper-label2);margin-bottom:3px}
.cr-seo.is-in .cr-letter{animation:letter-in .6s var(--awaken-ease) both;animation-delay:calc(.2s + var(--i)*.18s)}
@keyframes letter-in{from{opacity:0;transform:translateY(24px) rotate(calc((var(--i) - 1) * 4deg))}}
.cr-seal{display:flex;align-items:center;gap:10px;width:100%;margin:12px 0 0;padding:0;border:0;background:none;cursor:pointer;text-align:left;font:inherit;color:inherit}
.cr-seal-wax{flex:0 0 38px;height:38px;display:grid;place-items:center;border-radius:50%;background:radial-gradient(circle at 35% 30%,#c0584a,#7d2f25 70%);
 color:#f7e5d8;font:700 16px/1 var(--serif);box-shadow:0 2px 5px #0005,inset 0 0 0 3px #ffffff22;transition:transform .45s var(--awaken-ease),opacity .45s}
.cr-seal-text{font:500 13.5px/1.7 var(--serif);color:transparent;text-shadow:0 0 8px #29322c55;transition:color .5s,text-shadow .5s;user-select:none}
.cr-seal:not([aria-expanded=true]) .cr-seal-text::before{content:'봉한 추신 — 짚어서 열어 보시게. ';color:var(--paper-label2);text-shadow:none;font-size:12px}
.cr-seal[aria-expanded=true] .cr-seal-wax{transform:rotate(-40deg) scale(.7) translateX(-6px);opacity:.35}
.cr-seal[aria-expanded=true] .cr-seal-text{color:#3a1f1a;text-shadow:none;user-select:text}

.record-raw{margin-top:8px}
.record-raw>summary{font-size:13px;color:var(--paper-label2);padding:10px 0;cursor:pointer}
.record-raw>summary small{margin-left:6px}

@media (max-width:560px){
 .chronicle-pane>summary{padding:14px!important;gap:10px}
 .chron-teaser i{width:22px;height:22px;font-size:12px}
 .cr-sign{grid-template-columns:1fr}
 .cr-book{grid-template-columns:40px minmax(0,1fr);gap:12px}
 .cr-book-title{font-size:16px;min-height:140px}
 .cr-ladder{height:70px}.cr-ladder li span{font-size:9px}
 .cr-voices li{max-width:100%}
 .cr-path{grid-template-columns:1fr;justify-items:center}
 .cr-path svg{width:40px;height:40px;transform:rotate(90deg)}
}


/* 기록 차례: 사이드바 nav 규칙을 덮는다 */
nav.cr-toc{flex-direction:row;flex-wrap:wrap;gap:6px}
nav.cr-toc a{display:inline-flex;width:auto;padding:4px 11px 4px 4px;border-radius:14px;font-size:12px;white-space:nowrap}
nav.cr-toc a:hover{background:#fff}
/* 사문첩 화살: 선이 그어지고 끝에 화살촉 */
.cr-arrow{position:relative;height:2px;background:var(--red);transform-origin:left;transform:scaleX(0);margin:0 10px 0 4px}
.cr-arrow::after{content:'';position:absolute;right:-2px;top:50%;width:10px;height:10px;border-top:2px solid var(--red);border-right:2px solid var(--red);
 transform:translateY(-50%) rotate(45deg);opacity:0}
.cr-mun.is-in .cr-arrow{animation:grow-x .8s cubic-bezier(.6,0,.2,1) .3s forwards}
.cr-mun.is-in .cr-arrow::after{animation:tie-label .2s ease 1.05s forwards}
@keyframes grow-x{to{transform:scaleX(1)}}
@media (max-width:560px){.cr-arrow{width:2px;height:28px;margin:0;transform-origin:top;transform:scaleY(0)}
 .cr-arrow::after{right:auto;left:50%;top:auto;bottom:-2px;transform:translateX(-50%) rotate(135deg)}
 .cr-mun.is-in .cr-arrow{animation-name:grow-y}}


@media (max-width:560px){
 .cr-book{grid-template-columns:1fr}
 .cr-book-title{writing-mode:horizontal-tb;min-height:0;padding:8px 14px;font-size:16px;letter-spacing:.3em;border-radius:3px;justify-self:start}
}

@media (max-width:560px){.chron-summary{flex-basis:100%}.chron-summary b{font-size:17px}}

/* 휴대폰 결과 화면: 맨 끝에서 차례 단추가 바닥글을 가리지 않게 */
@media (max-width:1239px){html[data-screen=reincarnation] footer{padding-bottom:calc(72px + env(safe-area-inset-bottom,0px))}}

/* ─────────────────────────────────────────────────────────
   25. 강호에서 맡은 일 — 생업 한 폭.
   종이 결과지 사이에 먹 바탕 한 폭을 건다. 갈래 그림이 한 획씩 그려지고,
   직업 이름이 한 자씩 떠오른 뒤 「江湖」 낙관과 단서 쪽지가 차례로 놓인다.
   ───────────────────────────────────────────────────────── */
.life-work:empty{display:none}
.work-scene{position:relative;isolation:isolate;overflow:hidden;margin:clamp(22px,4vw,40px) 0;
 display:grid;grid-template-columns:minmax(0,1fr) clamp(150px,26vw,280px);grid-template-areas:"head art" "task art" "items items" "clue clue" "fit fit";
 column-gap:clamp(16px,4vw,48px);padding:clamp(24px,4.4vw,52px) clamp(20px,4.4vw,56px);border-radius:6px;
 background:radial-gradient(120% 90% at 82% 30%,#2a3a32 0%,var(--bg) 62%);color:var(--shell-text);
 box-shadow:0 22px 48px #0f16134d,inset 0 0 0 1px #d8c89a1f}
.work-scene::after{content:'';position:absolute;inset:0;z-index:-1;pointer-events:none;opacity:.5;
 background:radial-gradient(60% 50% at 80% 35%,#d8c89a14,transparent 70%);animation:ws-breathe 7s ease-in-out infinite}
.work-scene__mark{position:absolute;right:-.06em;bottom:-.22em;z-index:-1;font:700 clamp(220px,40vw,440px)/1 var(--serif);color:#e9dfc4;opacity:.05;pointer-events:none;user-select:none}
.work-scene__emblem{grid-area:art;align-self:center;margin:0;color:#efe5c8;filter:drop-shadow(0 0 18px #d8c89a2e);animation:ws-float 6s ease-in-out infinite}
.work-scene__emblem svg{display:block;width:100%;height:auto;overflow:visible}
.work-scene__emblem .brush-trace{stroke-dasharray:1;stroke-dashoffset:1} /* 붓 긋기(brush-draw.mjs)가 한 획씩 연다 */
.work-scene__wash{fill:#d8c89a;opacity:.07;filter:blur(6px);transform-origin:50% 52%}
.work-scene__head{grid-area:head;min-width:0}
.work-scene .eyebrow{margin:0 0 10px;font:600 11px/1 var(--sans);letter-spacing:.32em;color:var(--gold)}
.work-scene__name{margin:0;font:700 clamp(46px,8.4vw,96px)/1.05 var(--serif);letter-spacing:.04em;color:#f4ecd6;word-break:keep-all;overflow-wrap:anywhere}
.work-scene__name span{display:inline-block}
.work-scene__name .ws-word{white-space:nowrap}
.work-scene__group{display:flex;align-items:center;gap:12px;margin:14px 0 0;font:500 13px/1 var(--sans);letter-spacing:.16em;color:#cfc4a4}
.work-scene__seal{display:inline-grid;place-items:center;width:44px;height:44px;border:2px solid #c0553f;border-radius:4px;font:700 15px/1 var(--serif);
 letter-spacing:0;writing-mode:vertical-rl;color:#e8745b;background:#c0553f1a;transform:rotate(-8deg)}
.work-scene__task{grid-area:task;margin:clamp(16px,2.4vw,24px) 0 0;max-width:30em;font:500 clamp(17px,1.9vw,21px)/1.8 var(--serif);color:#efe7d2}
.work-scene__items{grid-area:items;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:clamp(10px,2vw,22px);margin:clamp(22px,3vw,34px) 0 0;padding-top:clamp(16px,2vw,22px);border-top:1px solid #d8c89a2e}
.work-scene__items div{min-width:0}
.work-scene__items dt{font:600 11px/1 var(--sans);letter-spacing:.2em;color:var(--gold);margin-bottom:8px}
.work-scene__items dd{margin:0;font:500 15px/1.6 var(--serif);color:#f1e9d4;word-break:keep-all}
.work-scene__clue{grid-area:clue;position:relative;display:flex;gap:14px;align-items:flex-start;margin:clamp(18px,2.6vw,28px) 0 0;padding:14px 16px;
 color:#2d2b24;background:linear-gradient(#f6eed9,#eadcb9);border-radius:3px;box-shadow:0 10px 24px #0006;transform:rotate(-.6deg)}
.work-scene__clue-seal{flex:0 0 34px;display:grid;place-items:center;height:34px;border-radius:50%;font:700 17px/1 var(--serif);color:#fff4e8;background:var(--red)}
.work-scene__clue small{display:block;font:600 11px/1 var(--sans);letter-spacing:.18em;color:var(--red);margin:2px 0 6px}
.work-scene__clue p{margin:0;font:500 16px/1.7 var(--serif)}
.work-scene__fit{grid-area:fit;margin:14px 0 0;font:500 12px/1.6 var(--sans);letter-spacing:.08em;color:#cfc4a4}
.work-scene__fit::before{content:'';display:inline-block;width:18px;height:1px;margin-right:8px;vertical-align:middle;background:var(--gold)}

/* 들어오는 차례 — 스크립트가 붙이는 .is-in 전에는 준비 자세로 둔다(스크립트가 없으면 그대로 다 보인다). */
.work-scene:not(.is-in) .work-scene__wash{opacity:0;transform:scale(.4)}
/* 이름·낙관·설명은 붓질이 다 끝난 뒤(.is-drawn)에 나온다 */
.work-scene:not(.is-drawn) .work-scene__name span,.work-scene:not(.is-drawn) .work-scene__items div,.work-scene:not(.is-drawn) .work-scene__task,.work-scene:not(.is-drawn) .work-scene__group>span,.work-scene:not(.is-drawn) .work-scene__fit{opacity:0}
.work-scene:not(.is-drawn) .work-scene__seal,.work-scene:not(.is-drawn) .work-scene__clue{opacity:0}
.work-scene.is-in .work-scene__wash{animation:ws-wash 2.2s var(--awaken-ease) both}
@keyframes ws-wash{from{opacity:0;transform:scale(.4)}to{opacity:.07;transform:none}}
.work-scene.is-drawn .work-scene__name span{animation:ws-rise .8s var(--awaken-ease) calc(.15s + var(--i,0) * .11s) both}
.work-scene.is-drawn .work-scene__group>span,.work-scene.is-drawn .work-scene__fit{animation:fade-in .6s .5s both}
.work-scene.is-in .work-scene__mark{animation:ws-mark 1.8s var(--awaken-ease) both}
.work-scene.is-drawn .work-scene__task{animation:reveal-up .7s .75s both}
.work-scene.is-drawn .work-scene__seal{animation:ws-stamp .5s cubic-bezier(.3,1.6,.5,1) 1.05s both}
.work-scene.is-drawn .work-scene__items div{animation:reveal-up .6s calc(1.1s + var(--i,0) * .14s) both}
.work-scene.is-drawn .work-scene__clue{animation:ws-unfold .8s var(--awaken-ease) 1.6s both}
@keyframes ws-draw{from{stroke-dashoffset:1}to{stroke-dashoffset:0}}
@keyframes ws-rise{from{opacity:0;transform:translateY(.35em);filter:blur(6px)}to{opacity:1;transform:none;filter:none}}
@keyframes ws-mark{from{opacity:0;transform:scale(1.18)}to{opacity:.05;transform:none}}
@keyframes ws-stamp{from{opacity:0;transform:rotate(-8deg) scale(2.2)}to{opacity:1;transform:rotate(-8deg) scale(1)}}
@keyframes ws-unfold{from{opacity:0;clip-path:inset(0 0 100% 0);transform:rotate(-.6deg) translateY(-8px)}to{opacity:1;clip-path:inset(0 0 0 0);transform:rotate(-.6deg)}}
@keyframes ws-float{0%,100%{transform:translateY(0)}50%{transform:translateY(-6px)}}
@keyframes ws-breathe{0%,100%{opacity:.35}50%{opacity:.7}}
@media(max-width:640px){
 .work-scene{grid-template-columns:minmax(0,1fr);grid-template-areas:"head" "task" "items" "clue" "fit";padding:24px 20px}
 .work-scene__emblem{position:absolute;top:22px;right:16px;width:76px}
 .work-scene__head{padding-right:84px}
 .work-scene__name{font-size:clamp(34px,10vw,52px);overflow-wrap:normal}
 .work-scene__items{grid-template-columns:1fr;gap:12px}
 .work-scene__items div{display:grid;grid-template-columns:6.5em 1fr;gap:10px;align-items:baseline}
 .work-scene__items dt{margin:0}
}



/* 26. 첫 화면의 직업 띠 — 121가지 강호의 삶이 두 줄로 흐른다. 가리키면 멈춘다. */
.welcome-jobs{margin:clamp(26px,4vw,40px) 0 0;overflow:hidden;
 mask-image:linear-gradient(90deg,transparent,#000 9%,#000 91%,transparent);-webkit-mask-image:linear-gradient(90deg,transparent,#000 9%,#000 91%,transparent)}
.welcome-jobs__head{margin:0 0 14px!important;font:500 14px/1.6 var(--serif)!important;color:var(--shell-text)}
.welcome-jobs__head b{font:600 28px/1 var(--serif);color:var(--gold);margin-right:4px;vertical-align:-3px}
.welcome-jobs__head span{display:inline-block;margin-left:10px;font:500 11px/1 var(--sans);letter-spacing:.14em;color:var(--shell-intro)}
.welcome-jobs__row{display:flex;padding:6px 0}
.welcome-jobs__track{display:flex;flex:0 0 auto;gap:10px;padding-right:10px;animation:jobs-flow 150s linear infinite}
.welcome-jobs__row.is-rev .welcome-jobs__track{animation-direction:reverse;animation-duration:130s}
.welcome-jobs:hover .welcome-jobs__track{animation-play-state:paused}
.welcome-jobs__track span{flex:0 0 auto;padding:7px 14px;border:1px solid var(--panel-line);border-radius:999px;font:500 14px/1 var(--serif);color:var(--shell-intro);white-space:nowrap}
.welcome-jobs__row:not(.is-rev) .welcome-jobs__track span{color:var(--shell-text);border-color:#c5a77940}
.welcome-jobs__track span.is-loved{border-color:#c0553f99;box-shadow:inset 0 0 0 1px #c0553f33}
.welcome-jobs__track span.is-loved::before{content:'';display:inline-block;width:5px;height:5px;margin:0 7px 2px 0;border-radius:50%;background:var(--red);vertical-align:middle}
@keyframes jobs-flow{from{transform:translateX(0)}to{transform:translateX(-50%)}}
@media (max-width:640px){.welcome-jobs__track span{font-size:13px;padding:6px 11px}.welcome-jobs__head span{display:block;margin:6px 0 0}}
