/* Gyeol black-lacquer theme (handoff 03_현재프로젝트/DESIGN.md). 자개 is never repainted in CSS: the seams show
   gyeol-nacre-seam-v1, an uncoloured crop from inside a stroke of the original 결 자개 mark, plus the mark itself. */
:root{color-scheme:dark;--lacquer:#060708;--raised:#0C0E0F;--active:#121516;--text:#F2F0EC;--sub:rgba(242,240,236,.58);--line:rgba(242,240,236,.16);--nacre:url(/assets/brand/gyeol-nacre-seam-v1.webp);--serif:"Noto Serif KR","AppleMyungjo",serif;--sans:"Pretendard",-apple-system,BlinkMacSystemFont,"Apple SD Gothic Neo",sans-serif;--mono:"IBM Plex Mono",ui-monospace,SFMono-Regular,Menlo,monospace;--warn:#f0b3a3;--hot:#ff2e63;--hot2:#ff6a3d;--gilt:#ffc94d;--warn-bg:rgba(196,100,76,.14)}
*{box-sizing:border-box}
body{margin:0;background:var(--lacquer);color:var(--text);font-family:var(--sans);line-height:1.75;word-break:keep-all}
header{max-width:1040px;margin:auto;padding:20px 32px;display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--line);background:var(--lacquer)}
.brand{display:inline-flex;align-items:center;gap:6px;color:var(--text);text-decoration:none;font-family:var(--serif);font-weight:700}
.brand img{width:40px;height:40px;display:block}.brand span{font-size:18px;letter-spacing:-.5px}
.edition{font-size:12px;color:var(--sub);font-family:var(--mono)}
main{width:min(100% - 40px,720px);margin:auto}
.eyebrow{color:var(--sub);font-size:12px;letter-spacing:1px;font-weight:600;font-family:var(--mono)}
h1,h2,h3{font-family:var(--serif);font-weight:700;color:var(--text)}
h1{font-size:40px;line-height:1.45;letter-spacing:-1px;margin:14px 0}h2{font-size:22px;letter-spacing:-.5px;margin:0 0 12px}h3{font-size:18px;margin:0 0 7px}
.steps{list-style:none;display:flex;justify-content:space-between;padding:0;margin:10px 0 16px;font-size:13px}.steps li{flex:1}
.steps .step{width:100%;min-height:44px;background:transparent;color:var(--sub);border:0;border-bottom:1px solid var(--line);border-radius:0;padding:8px 0;font-size:13px;font-weight:500;font-family:var(--mono);cursor:pointer}
.steps .step:disabled{cursor:default;opacity:.45}.steps .step.active{color:var(--text)}.steps .step.current{border-bottom:2px solid var(--text);font-weight:700}
.guide{display:flex;gap:12px;align-items:flex-start;margin:12px 0 8px}.guide-face{flex:0 0 52px;width:52px;height:52px;border-radius:50%;border:1px solid var(--line);object-fit:cover}
.bubble{position:relative;background:var(--raised);border:1px solid var(--line);border-radius:14px;padding:10px 14px;font-size:14px;line-height:1.6}
.bubble strong{font-size:12px;color:var(--sub)}.bubble p{margin:2px 0 0}
.summary-bar{display:flex;justify-content:space-between;align-items:center;gap:10px;background:var(--raised);border:1px solid var(--line);border-radius:10px;padding:8px 12px;margin-bottom:16px;font-size:13px}
.link-button{width:auto;min-height:40px;padding:6px 12px;background:transparent;color:var(--text);border:1px solid var(--line);border-radius:8px;font-size:13px;font-weight:600;text-decoration:none;white-space:nowrap;display:inline-flex;align-items:center}
.advanced{border-top:0;padding:4px 0}.advanced summary{font-size:13px;color:var(--sub)}
.badge{display:inline-block;font-size:11px;line-height:1.5;color:var(--sub);background:var(--active);border:1px solid var(--line);border-radius:6px;padding:3px 8px;margin:0 0 8px}
.badge.mock{color:var(--warn);background:var(--warn-bg);border-color:rgba(240,179,163,.25)}
/* A 자개 seam: opaque lacquer face, the original nacre image only in the 3px edge. */
.card,details.chapter[open],.consult-fab{border:3px solid transparent;background:linear-gradient(var(--raised),var(--raised)) padding-box,var(--nacre) center/cover border-box}
.card{border-radius:18px;padding:30px;margin-bottom:28px}
.daymaster{position:relative;background:var(--active);border-radius:10px;padding:16px 18px 16px 21px;margin:6px 0 16px}
.daymaster::before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;border-radius:3px 0 0 3px;background:var(--nacre) center/cover}
.daymaster h3{font-weight:500;font-size:19px}.daymaster p:last-child{font-size:14px;margin:6px 0 0}
.daymaster-figure{margin:0 0 12px;display:flex;gap:12px;align-items:center}.daymaster-figure img{width:96px;height:96px;flex:0 0 96px;border-radius:12px;border:1px solid var(--line);object-fit:cover;background:var(--lacquer)}.daymaster-figure figcaption{font-size:11px;line-height:1.5}
.section-head{display:flex;justify-content:space-between;align-items:baseline;gap:10px}
.section-head>span,.small,small,.input-note,.optional{font-size:12px;color:var(--sub)}
.grid{display:grid;grid-template-columns:1fr 1fr;gap:18px}
label{display:block;font-size:14px;font-weight:550;margin:14px 0}
input,select,textarea{display:block;font:inherit;font-weight:400;background:var(--lacquer);border:1px solid var(--line);border-radius:8px;padding:12px;width:100%;min-height:52px;color:var(--text);margin-top:7px;min-width:0}
input::placeholder,textarea::placeholder{color:rgba(242,240,236,.38)}
input:focus,select:focus,textarea:focus{border-color:rgba(242,240,236,.5);outline:none}
textarea{resize:vertical;line-height:1.6}
.check{display:flex;align-items:center;gap:9px;font-weight:400}.check input{width:18px;height:18px;min-height:0;margin:0;accent-color:var(--text)}
.input-note{margin:20px 0}
button{width:100%;border:1px solid var(--text);border-radius:10px;background:var(--text);color:var(--lacquer);cursor:pointer;font:inherit;font-weight:650;padding:14px 18px;min-height:52px}
button span{float:right}
button.secondary{background:transparent;color:var(--text);margin-top:10px;border-color:var(--line);font-size:14px}
button:disabled{opacity:.5;cursor:wait}button:hover{filter:brightness(.92)}
:focus-visible{outline:2px solid var(--text);outline-offset:3px}
.error{color:var(--warn);background:var(--warn-bg);border:1px solid rgba(240,179,163,.25);padding:12px;border-radius:8px;font-size:14px}
.pillars{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin:25px 0}
.pillar{background:var(--active);border:1px solid var(--line);border-radius:12px;text-align:center;padding:14px 4px}
.pillar span{display:block;font-size:12px;color:var(--sub);font-family:var(--mono)}
.pillar strong{display:block;font-family:var(--serif);font-size:33px;letter-spacing:2px;font-weight:500;margin:9px 0}
.pillar em{font-size:15px;font-style:normal}
.pillar.day{border-color:var(--hot);box-shadow:0 0 18px rgba(255,46,99,.25)}
.pillar .tile{border-radius:10px;padding:8px 2px;margin-top:6px;border:1.5px solid var(--line);background:var(--lacquer)}
.pillar .tile strong{font-size:30px;margin:2px 0}.pillar .tile em{display:block;font-size:13px}.pillar .tile small{display:block;font-size:11px}
/* Traditional element colours are data marks, not 자개; kept to the tile edge and its label. */
.tile.el-wood{border-color:#6f9a66}.tile.el-wood small{color:#9cc392}.tile.el-fire{border-color:#c4644c}.tile.el-fire small{color:#eaa08c}
.tile.el-earth{border-color:#b08a56}.tile.el-earth small{color:#d8b783}.tile.el-metal{border-color:#a3a8ad}.tile.el-metal small{color:#cfd3d6}
.tile.el-water{border-color:#6d8aa3}.tile.el-water small{color:#a7c0d4}
.elements-chart{margin:0 0 16px;padding:14px 16px;border:1px solid var(--line);border-radius:12px;display:grid;gap:9px}
.elements-chart .bar{display:grid;grid-template-columns:64px 1fr 22px;align-items:center;gap:10px;font-size:14px}.elements-chart .bar em{font-style:normal;text-align:right;font-variant-numeric:tabular-nums}
.elements-chart .track{height:10px;border-radius:5px;background:rgba(242,240,236,.08);overflow:hidden}.elements-chart .track i{display:block;height:100%;border-radius:5px;min-width:2px}
.elements-chart .el-wood i{background:#6f9a66}.elements-chart .el-fire i{background:#c4644c}.elements-chart .el-earth i{background:#b08a56}.elements-chart .el-metal i{background:#a3a8ad}.elements-chart .el-water i{background:#6d8aa3}
.elements-chart figcaption{font-size:11px;color:var(--sub);margin-top:2px}
details{border-top:1px solid var(--line);padding:14px 0;font-size:13px}summary{cursor:pointer;color:var(--sub)}
pre{font-size:11px;font-family:var(--mono);background:var(--lacquer);color:var(--sub);border:1px solid var(--line);padding:14px;border-radius:8px;max-height:350px;overflow:auto;white-space:pre-wrap;word-break:break-all}
.dev pre{max-height:260px}
.next{border-top:1px solid var(--line);padding-top:20px;margin-top:10px}.next p{font-size:14px;color:var(--sub)}
.request-parts{display:grid;gap:10px;margin:18px 0}.request-part{background:var(--active);border:1px solid var(--line);border-radius:10px;padding:14px 16px;font-size:13px}
.request-part strong{display:block;font-size:14px}.request-part span{display:block;margin:4px 0}
.reading-heading{padding:16px 0}.reading-heading>p{font-size:14px}.reading-heading .small{font-size:12px}
#toc{display:grid;grid-template-columns:1fr 1fr;gap:7px;margin-bottom:22px}
#toc a{text-decoration:none;color:var(--text);font-size:13px;padding:10px 12px;border:1px solid var(--line);border-radius:8px;background:var(--raised)}
article,details.chapter{scroll-margin-top:60px}
details.chapter{padding:0;overflow:hidden;border-radius:18px;border:1px solid var(--line);background:var(--raised);margin-bottom:14px}
details.chapter>summary{list-style:none;display:flex;align-items:baseline;gap:10px;padding:20px 24px;cursor:pointer;color:var(--text)}
details.chapter>summary::-webkit-details-marker{display:none}
details.chapter>summary::after{content:"펼치기";margin-left:auto;font-size:12px;color:var(--sub);font-family:var(--mono)}
details.chapter[open]>summary::after{content:"접기"}
details.chapter>summary h2{margin:0;font-size:20px}
details.chapter>:not(summary){margin-left:24px;margin-right:24px}
.chapter p{font-size:16px;line-height:1.95;margin:0 0 1.1em}
.chapter p.lead{font-family:var(--serif);font-weight:600;font-size:18px;line-height:1.85}
.chapter p.evidence{font-size:12px;line-height:1.7;color:var(--sub);border-top:1px dashed var(--line);padding-top:10px;margin-top:18px}
.chapter .chapter-number{font-size:12px;color:var(--sub);letter-spacing:1px;font-family:var(--mono)}
.chapter .back{display:inline-block;font-size:12px;color:var(--sub)}
.status{display:inline-block;font-size:11px;color:var(--sub);margin-bottom:10px}.status.warn{color:var(--warn)}
.chapter-nav{display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:20px}.chapter-nav .back{margin:0}
.next-chapter{width:auto;min-height:44px;padding:8px 14px;font-size:14px;background:transparent;color:var(--text);border:1px solid var(--line);border-radius:10px;text-decoration:none;display:inline-flex;align-items:center;font-weight:600}
.scene{margin:0 0 14px}.scene img{display:block;width:100%;height:auto;border-radius:12px;border:1px solid var(--line)}.scene figcaption{font-size:11px;color:var(--sub);line-height:1.5;margin-top:6px}
.consult{scroll-margin-top:60px}.consult h3{font-size:15px;margin:20px 0 6px}.consult ul{margin:0;padding-left:20px;font-size:15px}.consult li{margin:6px 0}.consult li .small{font-size:12px}.consult li a.small{color:var(--text);font-weight:600}
.consult-link{display:inline-block;margin:0 0 12px;font-size:14px;font-weight:600;color:var(--text);text-decoration:underline;text-decoration-color:var(--line);text-underline-offset:4px}
.threads{display:grid;gap:22px}.thread{display:grid;gap:8px;scroll-margin-top:60px}
.thread p{margin:0;font-size:15px;line-height:1.75;padding:10px 14px;border-radius:14px;max-width:88%}
.thread .ask{justify-self:end;background:var(--text);color:var(--lacquer)}
.thread .reply{background:var(--active);border:1px solid var(--line)}
.thread .small{padding:0 4px;max-width:none}.thread .small.warn{color:var(--warn)}
#consult-form{margin-top:12px}#consult-form label{margin-top:0}#consult-live .thread{margin-top:10px}
.consult-speaker{display:flex;gap:10px;align-items:center;margin:14px 0 0}.consult-speaker img{border-radius:50%;flex:0 0 56px}.consult-speaker figcaption{font-size:11px;color:var(--sub);line-height:1.5}
.story-bar{position:sticky;top:0;z-index:5;display:flex;align-items:center;gap:6px;background:var(--raised);color:var(--text);border:1px solid var(--line);border-top:0;border-radius:0 0 12px 12px;padding:6px 8px;margin:0 0 6px}
.story-bar .bar-title{flex:1;min-width:0;font-size:14px;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-family:var(--serif)}
.bar-btn{width:auto;min-height:40px;min-width:44px;padding:6px 10px;background:transparent;border:1px solid var(--line);border-radius:8px;color:var(--text);font-size:13px;font-weight:600;text-decoration:none;display:inline-flex;align-items:center;justify-content:center}
.bar-btn:disabled{opacity:.4;cursor:not-allowed}
#reading{padding-bottom:24px}main:has(#reading:not([hidden])) footer{padding-bottom:84px}
.consult-fab{position:fixed;right:16px;bottom:18px;z-index:6;display:flex;align-items:center;gap:8px;color:var(--text);border-width:2px;border-radius:999px;padding:4px 14px 4px 4px;box-shadow:0 6px 18px rgba(0,0,0,.5);text-decoration:none;font-size:13px;font-weight:650}
.consult-fab img{border-radius:50%}
/* Lesson 11 webtoon: one scroll-locked page. Scenes stack in a strip that slides one viewport per scene;
   bubbles are the generated transparent balloon images (public/assets/PROVENANCE.md) with live text on top. */
body.in-story{overflow:hidden;overscroll-behavior:none}
body.in-story main>:not(#story){display:none!important}body.in-story footer,body.in-story>header{display:none}
.story{position:fixed;inset:0;z-index:20;background:var(--lacquer);color:var(--text)}
.story-view{position:relative;height:100%;width:min(100%,calc(100svh * 2 / 3));margin:auto;overflow:hidden;cursor:pointer}
.story-strip{display:flex;flex-direction:column;height:100%;transition:transform .8s cubic-bezier(.65,0,.35,1)}
.story .scene{position:relative;flex:0 0 100%;overflow:hidden}
.story .scene{margin:0}.story .scene>img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;border:0;border-radius:0}
.scene-pose{opacity:0}.scene-pose.shown{opacity:1}
/* Black gradients where two scenes meet, so a change of light reads as one strip. */
.story .scene::before,.story .scene::after{content:"";position:absolute;left:0;right:0;height:20%;z-index:1;pointer-events:none}
.story .scene::before{top:0;background:linear-gradient(to bottom,var(--lacquer),transparent)}
.story .scene::after{bottom:0;background:linear-gradient(to top,var(--lacquer),transparent)}
.beat{position:absolute;z-index:2;margin:0;opacity:0;transform:translateY(8px);transition:opacity .45s ease,transform .5s cubic-bezier(.25,.1,.25,1);pointer-events:none}
.beat.shown{opacity:1;transform:none;pointer-events:auto}div.beat{inset:0;pointer-events:none}div.beat.shown>*{pointer-events:auto}
.balloon{position:absolute;margin:0;isolation:isolate;max-width:min(80%,340px);color:var(--lacquer);font-size:17px;font-weight:650;line-height:1.55;text-align:center;word-break:keep-all;text-wrap:balance}
.balloon::before{content:"";position:absolute;inset:0;z-index:-1;background:var(--art) center/100% 100% no-repeat;transform:scale(var(--sx,1),var(--sy,1))}
.at-top{top:9%}.at-mid{top:36%}.at-low{bottom:11%}.balloon{left:6%}.balloon.right{left:auto;right:6%}
/* Tails point at the speaker. The art's own tail: speech and thought down-left, soft down-right; mirror to turn it. */
.speech.tail-r,.thought.tail-r,.soft.tail-l{--sx:-1}.tail-up{--sy:-1}
.speech{--art:url(/assets/webtoon/bubble-speech.webp);padding:20px 28px 34px}
.soft{--art:url(/assets/webtoon/bubble-soft.webp);padding:20px 28px 34px;font-weight:500}
.speech.tail-up,.soft.tail-up{padding:34px 28px 20px}
.thought{--art:url(/assets/webtoon/bubble-thought.webp);padding:24px 32px 44px;font-weight:500}
.shout{--art:url(/assets/webtoon/bubble-shout.webp);left:0!important;right:0;margin-inline:auto;width:fit-content;padding:46px 50px;font-size:21px;font-weight:800}
.narration{--art:url(/assets/webtoon/bubble-narration.webp);color:var(--text);font-family:var(--serif);font-size:19px;font-weight:500;padding:16px 24px}
.story .shake>img{animation:shake .7s cubic-bezier(.36,.07,.19,.97)}
/* Webtoon direction (2026-10-29, WEBTOON-PLAN.md): a beat can push the camera in on the same picture (data-zoom,
   data-at), a black caption band carries the reader's inner voice, and an sfx beat lands the one hit. */
.story .scene>img{transform-origin:var(--at,50% 40%);transition:transform 1.8s cubic-bezier(.25,.1,.25,1),opacity .5s ease}
.caption{left:0;right:0;padding:16px 22px;background:rgba(6,7,8,.9);color:var(--text);font-family:var(--serif);font-size:17px;line-height:1.75;text-align:center;word-break:keep-all;text-wrap:balance}
.caption.at-top{top:7%}.caption.at-mid{top:44%}.caption.at-low{top:auto;bottom:7%}
.sfx{left:0;right:0;top:30%;text-align:center;font-family:var(--serif);font-size:56px;font-weight:900;letter-spacing:4px;color:#fff;text-shadow:0 0 28px var(--hot),0 3px 0 rgba(0,0,0,.6)}
.sfx.shown{animation:sfx .5s cubic-bezier(.2,.9,.3,1.4)}
@keyframes sfx{from{transform:scale(1.3);opacity:0}}
@media(prefers-reduced-motion:reduce){.story .scene>img{transition:opacity .3s}.sfx.shown{animation:none}}
@keyframes shake{10%,90%{translate:-1px 0}20%,80%{translate:3px 0}30%,50%,70%{translate:-7px 0}40%,60%{translate:7px 0}}
.story-form,.reveal-card{position:absolute;z-index:3;left:12px;right:12px;bottom:12px;overflow:auto;overscroll-behavior:contain;border:3px solid transparent;border-radius:16px;background:linear-gradient(rgba(12,14,15,.94),rgba(12,14,15,.94)) padding-box,var(--nacre) center/cover border-box;cursor:auto}
.story-form{max-height:64%;padding:10px 16px 12px;opacity:0;transform:translateY(18px);transition:opacity .4s ease,transform .4s ease;pointer-events:none}
.story-form.shown{opacity:1;transform:none;pointer-events:auto}
.story-form legend{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)}
.story-form label{margin:8px 0}.story-form .input-note{margin:10px 0 4px;font-size:11px}.story-form .link-button{min-height:36px;font-size:12px;color:var(--sub)}
.reveal-card{max-height:72%;padding:10px 14px 14px}
.reveal-card .pillars{margin:4px 0 8px;gap:6px}.reveal-card .pillar{padding:8px 2px;clip-path:inset(0 0 100% 0)}
.reveal-card .pillar .tile strong{font-size:24px}.reveal-card .pillar .tile{padding:5px 2px;margin-top:4px}
.reveal-card.unfold .pillar{animation:unfold .7s cubic-bezier(.2,.8,.2,1) forwards}
.reveal-card.unfold .pillar:nth-child(2){animation-delay:.15s}.reveal-card.unfold .pillar:nth-child(3){animation-delay:.3s}.reveal-card.unfold .pillar:nth-child(4){animation-delay:.45s}
@keyframes unfold{to{clip-path:inset(0 0 0 0)}}
/* Free preview under the pillars (calculated lines, no AI). */
.preview{margin:4px 0 8px;padding:10px 12px;border-radius:12px;background:var(--active);border:1px solid var(--line);text-align:left}
.preview-picture{margin:0 0 4px;font-family:var(--serif);font-size:16px;font-weight:700;line-height:1.5;color:var(--gilt)}
.preview-temper{margin:0 0 6px;font-size:14px;line-height:1.6}
.preview-years{margin:0;padding:0;list-style:none;display:grid;gap:4px;font-size:13.5px;line-height:1.55}.preview-years li::before{content:"· ";color:var(--hot);font-weight:800}
.preview-more{margin:6px 0 0;font-size:12.5px;color:var(--sub)}
/* 결제 전 미리 보기 (2026-10-30, owner: "우리는 시각효과에 힘을 주자"): the chapters drawn down a gold thread, then
   this year's card turns over to its real verdict while the next two shimmer under the 결 seal. */
.offer{margin:6px 0 8px;padding:12px 12px 14px;border-radius:12px;background:radial-gradient(120% 80% at 50% 0%,rgba(255,201,77,.08),transparent 60%),var(--active);border:1px solid var(--line);text-align:left}
.offer-head{margin:0 0 10px;font-family:var(--serif);font-size:16px;line-height:1.5}.offer-guide,.offer-head b{color:var(--gilt);font-weight:700}
.offer-toc{position:relative;margin:0;padding:0 0 0 32px;list-style:none;display:grid;gap:8px}
.offer-toc::before{content:"";position:absolute;left:11px;top:6px;bottom:6px;width:2px;border-radius:2px;background:linear-gradient(var(--gilt),rgba(255,201,77,.2));transform:scaleY(0);transform-origin:top;transition:transform calc(.35s + var(--n,8)*.09s) cubic-bezier(.3,.7,.2,1)}
.offer.in .offer-toc::before{transform:scaleY(1)}
.offer-toc li{position:relative;font-family:var(--serif);font-size:14.5px;line-height:1.5;opacity:0;transform:translateX(-6px);transition:opacity .5s ease,transform .5s ease;transition-delay:calc(.15s + var(--i)*.09s)}
.offer.in .offer-toc li{opacity:1;transform:none}
.offer-num{position:absolute;left:-32px;top:-1px;width:24px;height:24px;display:grid;place-items:center;border-radius:50%;font-size:12px;font-weight:700;color:#1a1306;background:radial-gradient(circle at 35% 30%,#fff3c4,var(--gilt) 55%,#b8862b);box-shadow:0 0 0 2px var(--active),0 0 10px rgba(255,201,77,.35)}
.offer-num.two{font-size:9.5px;letter-spacing:-.04em}
.offer-sub{margin:16px 0 8px;font-size:12.5px;color:var(--sub);letter-spacing:.02em}
.year-deck{display:grid;grid-template-columns:1fr 1fr;gap:8px}
.year-card{all:unset;box-sizing:border-box;position:relative;display:block;min-height:88px;perspective:900px;cursor:pointer;-webkit-tap-highlight-color:transparent}
.year-card.open{grid-column:1/-1;min-height:100px;cursor:default}.year-card:focus-visible{outline:2px solid var(--gilt);outline-offset:2px;border-radius:12px}
.yc-inner{position:absolute;inset:0;transform-style:preserve-3d;transition:transform 1s cubic-bezier(.3,.7,.2,1)}
.offer.turned .year-card.open .yc-inner{transform:rotateY(180deg)}
.yc-face{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;padding:10px;border-radius:12px;backface-visibility:hidden;-webkit-backface-visibility:hidden;text-align:center;overflow:hidden}
.yc-seal{background:linear-gradient(rgba(6,7,8,.5),rgba(6,7,8,.7)),var(--nacre) center/cover;border:1px solid rgba(255,255,255,.18)}
.yc-seal img{width:34px;height:34px;filter:drop-shadow(0 2px 6px rgba(0,0,0,.6))}.yc-seal small{position:relative;font-size:11.5px;line-height:1.4;color:rgba(242,240,236,.85)}.yc-seal em{position:relative;font-style:normal;font-size:11px;font-weight:700;color:var(--gilt)}
.yc-seal::after{content:"";position:absolute;inset:-40% -60%;background:linear-gradient(105deg,transparent 42%,rgba(255,255,255,.2) 50%,transparent 58%);transform:translateX(-60%);animation:glint 3.6s ease-in-out infinite;pointer-events:none}
.year-card:nth-child(3) .yc-seal::after{animation-delay:1.2s}
.yc-verdict{transform:rotateY(180deg);background:radial-gradient(140% 120% at 50% 0%,rgba(255,201,77,.22),transparent 60%),#15110a;border:1px solid rgba(255,201,77,.55);box-shadow:inset 0 0 24px rgba(255,201,77,.12)}
.yc-verdict small{font-size:12px;color:var(--sub)}.yc-verdict strong{font-family:var(--serif);font-size:17px;line-height:1.45;color:var(--gilt)}
.offer.turned .yc-verdict strong{animation:inked .9s .55s both}
.year-card.nudge .yc-inner{animation:nudge .45s ease}button.beckon{animation:beckon 1.1s ease}
@keyframes glint{0%,55%{transform:translateX(-60%)}85%,100%{transform:translateX(60%)}}
@keyframes inked{from{opacity:0;letter-spacing:.14em;filter:blur(3px)}to{opacity:1;letter-spacing:0;filter:none}}
@keyframes nudge{20%{transform:rotate(-2deg)}40%{transform:rotate(2deg)}60%{transform:rotate(-1deg)}80%{transform:rotate(1deg)}}
@keyframes beckon{0%,100%{box-shadow:0 8px 24px rgba(255,46,99,.3)}35%{box-shadow:0 0 0 6px rgba(255,201,77,.45),0 8px 30px rgba(255,46,99,.55)}}
@media(prefers-reduced-motion:reduce){.offer-toc::before,.offer-toc li,.yc-inner{transition:none}.yc-seal::after,.offer.turned .yc-verdict strong,.year-card.nudge .yc-inner,button.beckon{animation:none}}
.reveal-note{font-family:var(--serif);font-size:16px;line-height:1.6;text-align:center;margin:2px 0}.reveal-card .small{text-align:center;margin:4px 0 0}
.reveal-actions{display:grid;grid-template-columns:1fr 1.4fr;gap:8px;margin-top:10px}.reveal-actions button{margin:0}
/* The preview made the card longer: its two buttons stay pinned to the card bottom while the lines scroll. */
.reveal-card{max-height:80%}.reveal-card .reveal-actions{position:sticky;bottom:-14px;margin:10px -14px -14px;padding:10px 14px 14px;background:rgba(12,14,15,.97);border-top:1px solid var(--line)}
.story-hint{position:absolute;z-index:4;left:0;right:0;bottom:17%;display:grid;justify-items:center;gap:2px;opacity:0;pointer-events:none;font-size:13px;font-weight:650;text-shadow:0 1px 6px rgba(0,0,0,.85)}
.story-hint img{width:auto;height:84px}.story-hint.on{animation:hint 1.4s ease forwards}.story-hint.on img{animation:swipe 1.4s ease}
@keyframes hint{0%{opacity:0}15%,70%{opacity:1}100%{opacity:0}}@keyframes swipe{0%{transform:translateY(18px)}65%,100%{transform:translateY(-16px)}}
.story-brand{position:absolute;z-index:4;top:12px;left:12px;margin:0}.story-brand img{width:40px;height:40px;display:block}
.story-dots{position:absolute;z-index:4;right:8px;top:50%;translate:0 -50%;display:grid;gap:7px}.story-dots i{width:5px;height:5px;border-radius:50%;background:rgba(242,240,236,.25)}.story-dots i.on{background:var(--text)}
.story-skip{position:absolute;z-index:4;top:12px;right:12px;width:auto;min-height:40px;padding:6px 12px;font-size:13px;background:rgba(6,7,8,.6);color:var(--text);border-color:var(--line)}
.story-credit{position:absolute;z-index:2;left:16px;right:16px;bottom:10px;margin:0;font-size:10px;line-height:1.5;color:var(--sub);text-align:center}
.sr-only{position:absolute!important;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
#story-next:focus-visible{z-index:5;clip:auto;width:auto;height:auto;margin:0;padding:8px 14px;left:50%;bottom:16px;translate:-50% 0;white-space:normal}
.summary-actions{display:inline-flex;gap:6px}
/* Customer view by default; ?review adds what only the people checking the service need. */
body:not(.review) .review-only{display:none!important}
/* Paid service: consent, waiting card, re-open link, business footer. */
.time-pick{grid-template-columns:1.5fr 1fr}
.pay-consent{align-items:flex-start;font-size:13px;line-height:1.6;margin:4px 0 12px}.pay-consent input{margin-top:3px;flex:0 0 18px}.pay-consent a{color:var(--text)}
.reading-wait{text-align:center}.reading-wait .spinner{width:28px;height:28px;margin:6px auto 10px;display:block}
.saved-link h3{margin:0 0 4px}.saved-row{display:flex;gap:8px}.saved-row input{margin:0;min-height:44px;font-size:13px}.saved-row button{width:auto;margin:0;min-height:44px}
body.paid-view .steps,body.paid-view #story-back,body.paid-view #edit-input-bottom{display:none}
.policy{padding:28px 0 48px}.policy h1{font-size:30px;margin:0 0 4px}.policy h2{font-size:18px;margin:26px 0 8px}.policy p,.policy li{font-size:15px;line-height:1.85}.policy a{color:var(--text)}
.policy-table{width:100%;border-collapse:collapse;font-size:13px;line-height:1.6}.policy-table th,.policy-table td{border:1px solid var(--line);padding:8px;text-align:left;vertical-align:top}
footer.biz{margin:28px 0 40px;font-size:11px;line-height:1.7;color:var(--sub)}footer.biz p{margin:0 0 4px}footer.biz a{color:var(--sub)}
.review-panel{margin:4px 0 14px;padding:10px 14px;border:1px dashed var(--line);border-radius:10px}.review-panel>summary{font-size:13px;color:var(--sub);cursor:pointer}.review-panel>summary small{margin-left:6px}
/* Lesson 12 loading spinner inside the busy button. */
.spinner{display:inline-block;width:1em;height:1em;margin-right:8px;vertical-align:-.15em;border:2px solid currentColor;border-right-color:transparent;border-radius:50%;animation:spin .8s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}
/* Lesson 11's gold-metal 바로 보기 button, in 결's material: the ivory face inside an original 자개 seam. */
/* B안 (2026-10-29): the one action on each screen glows hot; 자개 stays on the card seams and the mark. */
button.nacre{border:0;background:linear-gradient(135deg,var(--hot),var(--hot2));color:#fff;box-shadow:0 8px 24px rgba(255,46,99,.3)}
/* Lesson 11 sheets (virtual payment, back confirm): a lacquer panel rising over the dimmed story. */
.sheet{position:absolute;z-index:6;inset:0;display:flex;align-items:flex-end;background:rgba(6,7,8,.72)}
.sheet[hidden]{display:none}
.sheet-panel{width:100%;margin:12px;padding:18px 16px 16px;border:3px solid transparent;border-radius:16px;background:linear-gradient(var(--raised),var(--raised)) padding-box,var(--nacre) center/cover border-box;animation:rise .22s cubic-bezier(.23,1,.32,1)}
.sheet h2{font-size:20px;margin:0 0 10px}
.pay-lines{margin:0 0 10px;font-size:14px}.pay-lines div{display:flex;justify-content:space-between;gap:12px;padding:8px 0;border-bottom:1px solid var(--line)}
.pay-lines dt{color:var(--sub)}.pay-lines dd{margin:0;text-align:right;font-weight:650}
.pay-note{font-size:13px;color:var(--sub);margin:8px 0 12px}
.sheet-actions{display:grid;grid-template-columns:1fr 1.4fr;gap:8px}.sheet-actions button{margin:0}
@keyframes rise{from{opacity:0;transform:translateY(10px)}}
@media(prefers-reduced-motion:reduce){.story-strip,.beat,.story-form{transition:none}.reveal-card .pillar{clip-path:none;animation:none}.story .shake>img,.story-hint.on img,.sheet-panel{animation:none}.spinner{animation-duration:2.4s}}
.form-steps{list-style:none;display:flex;gap:6px;padding:0;margin:4px 0 6px;font-size:12px;color:var(--sub);font-family:var(--mono)}
.form-steps li{flex:1;text-align:center;border-bottom:1px solid var(--line);padding:4px 0}
.form-steps li.done{color:var(--text)}.form-steps li.current{color:var(--text);font-weight:700;border-bottom:2px solid var(--text)}
.form-step{border:0;margin:0;padding:0;min-width:0}.form-step legend{font-family:var(--serif);font-size:20px;font-weight:600;padding:0;margin:12px 0 2px}
.form-step-nav{display:flex;gap:10px;margin-top:10px}.form-step-nav button{margin:0}.form-step-nav #step-prev{width:auto;flex:0 0 auto}
footer{padding:10px 0 35px;text-align:center;color:var(--sub);font-size:11px}footer p{margin:3px}
input:disabled{background:var(--active);color:var(--sub)}
[hidden]{display:none!important}
@media(max-width:480px){details.chapter>summary{padding:16px 18px}details.chapter>:not(summary){margin-left:18px;margin-right:18px}details.chapter>summary h2{font-size:19px}header{padding:14px 18px}.edition{font-size:10px}main{width:calc(100% - 28px)}h1{font-size:33px}.card{padding:22px 18px;border-radius:14px}.grid{gap:12px}h2{font-size:21px}.pillar strong{font-size:27px}.pillars{gap:7px}#toc a{font-size:12px;padding:8px}.steps,.steps .step{font-size:12px}.guide-face{flex-basis:44px;width:44px;height:44px}.bubble{font-size:13px}.summary-bar{font-size:12px}.daymaster{padding:14px 14px 14px 17px}}
/* Lesson 16: My Page (re-view, small logout at the bottom) and the Kakao login button. */
.my-link{font-size:13px;color:var(--text);text-decoration:none;border:1px solid var(--line);border-radius:999px;padding:6px 12px}
body.my-view main>:not(#mypage):not(footer){display:none!important}
.mypage{margin-top:24px}.mypage h2{margin-top:0}
button.kakao-login{background:#FEE500;border:3px solid #FEE500;color:rgba(0,0,0,.85);margin:0}
.kakao-login{display:flex;align-items:center;justify-content:center;min-height:48px;border-radius:12px;background:#FEE500;color:rgba(0,0,0,.85);font-weight:700;text-decoration:none;margin:12px 0}
.my-orders{list-style:none;padding:0;margin:12px 0;display:grid;gap:8px}
.my-orders a{display:flex;justify-content:space-between;gap:12px;padding:14px 16px;border:1px solid var(--line);border-radius:12px;color:var(--text);text-decoration:none}
.my-orders small{color:var(--sub)}
.logout{display:block;width:auto;margin:28px auto 0;background:none;border:0;color:var(--sub);font-size:12px;text-decoration:underline;min-height:0;padding:4px}
.pay-login{font-size:14px;line-height:1.6;color:var(--sub)}
.admin h1{font-size:26px}.admin-grid{display:grid;gap:16px}.admin-chapter{margin:0 0 12px}.admin-chapter button{width:auto}
@media(min-width:860px){.admin-grid{grid-template-columns:260px 1fr;align-items:start}}
/* Lesson 18 admin: left menu, body on the right; coins for the daily revenue, a funnel for the payment conversion. */
.admin-page{--coin:#D9B45A;--coin-rim:#8E6B22}
.admin-page main.admin{width:min(100% - 32px,1040px)}
.admin-login{max-width:420px;margin:40px auto}
.admin-page header .logout{margin:0}
.admin-shell{display:grid;gap:20px;margin:24px 0 48px}
.admin-menu{display:flex;gap:6px;overflow-x:auto}
.admin-menu button{width:auto;min-height:44px;padding:8px 14px;background:transparent;color:var(--sub);border:1px solid var(--line);border-radius:10px;font-size:14px;white-space:nowrap}
.admin-menu button[aria-current]{color:var(--lacquer);background:var(--text);border-color:var(--text)}
@media(min-width:860px){.admin-shell{grid-template-columns:180px 1fr;align-items:start}.admin-menu{flex-direction:column;position:sticky;top:20px}.admin-menu button{text-align:left}}
.admin-body{min-width:0}
.admin-title{display:flex;justify-content:space-between;align-items:baseline;gap:12px;flex-wrap:wrap}.admin-title h1{margin:0 0 12px}
.admin-panel{padding:22px}
.stat-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:12px;margin:0 0 20px}
.stat{background:var(--raised);border:1px solid var(--line);border-radius:14px;padding:14px 16px;display:grid;gap:2px}
.stat strong{font-size:24px;font-family:var(--serif);letter-spacing:-.5px}.stat small{color:var(--sub)}
.coin-chart{display:grid;grid-template-columns:repeat(14,minmax(0,1fr));gap:2px;align-items:end;height:240px;padding-top:8px;border-bottom:1px solid var(--line)}
.coin-col{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:flex-end;height:100%;outline:none;border-radius:8px}
.coin-col:hover,.coin-col:focus-visible{background:rgba(242,240,236,.05)}
.coin-col:focus-visible{box-shadow:0 0 0 2px var(--text)}
.coin-col::after{content:attr(data-tip);position:absolute;bottom:calc(100% - 4px);left:50%;transform:translateX(-50%);white-space:nowrap;background:var(--active);border:1px solid var(--line);border-radius:8px;padding:4px 8px;font-size:12px;color:var(--text);opacity:0;pointer-events:none;transition:opacity .15s;z-index:2}
.coin-col:hover::after,.coin-col:focus-visible::after{opacity:1}
.coin-value{font-size:11px;font-weight:600;color:var(--text);min-height:16px;margin-bottom:2px}
.coin-stack{display:flex;flex-direction:column-reverse;align-items:center;width:100%}
.coin-date{font-size:11px;color:var(--sub);padding:6px 0 4px;font-family:var(--mono);display:flex;flex-direction:column;align-items:center;line-height:1.3;min-height:32px}.coin-date small{font-family:var(--sans,inherit);font-size:9px;color:var(--sub);white-space:nowrap}
.coin-chart{position:relative}.coin-chart.empty::before{content:attr(data-empty);position:absolute;inset:0 0 40px;display:grid;place-items:center;color:var(--sub);font-size:13px;text-align:center;pointer-events:none}
/* A coin seen from the side: a gold face with a darker rim, stacked with a little overlap. */
.coin{display:block;width:min(30px,80%);height:10px;margin-top:-2px;border-radius:50%;background:radial-gradient(ellipse at 50% 35%,#F6DE97 0,var(--coin) 55%,var(--coin-rim) 100%);box-shadow:0 2px 0 var(--coin-rim),inset 0 -1px 0 rgba(0,0,0,.25);animation:coin-drop .55s cubic-bezier(.3,1.4,.5,1) both}
@keyframes coin-drop{from{transform:translateY(-220px);opacity:0}60%{opacity:1}to{transform:none;opacity:1}}
@media(prefers-reduced-motion:reduce){.coin{animation:none}}
.admin-table{margin-top:12px}.admin-table table,.admin-list{width:100%;border-collapse:collapse;font-size:13px}
.admin-table th,.admin-table td,.admin-list th,.admin-list td{text-align:left;padding:8px 6px;border-bottom:1px solid var(--line)}
.admin-table th,.admin-list th{color:var(--sub);font-weight:500}
.admin-list{display:block;overflow-x:auto}
.funnel{list-style:none;padding:0;margin:8px 0 12px;display:grid;gap:6px}
.funnel li{display:grid;grid-template-columns:96px 1fr 104px;align-items:center;gap:10px;font-size:13px}
.funnel li small{color:var(--sub);text-align:right}
.funnel-lane{display:flex;justify-content:center}
.funnel-band{width:var(--w);min-width:44px;height:38px;display:flex;align-items:center;justify-content:center;background:var(--coin);color:#1a1406;font-weight:700;clip-path:polygon(0 0,100% 0,calc(100% - 10px) 100%,10px 100%);transition:width .6s ease}
@media(max-width:560px){.funnel li{grid-template-columns:72px 1fr 78px;font-size:12px}.coin-value{font-size:9px}.coin-date{font-size:9px}}
.switch{display:flex;gap:12px;align-items:flex-start;font-weight:400;cursor:pointer}
.switch input{appearance:none;flex:0 0 44px;width:44px;height:26px;min-height:0;margin:2px 0 0;padding:0;border-radius:13px;background:var(--active);border:1px solid var(--line);position:relative;cursor:pointer;transition:background .2s}
.switch input::after{content:"";position:absolute;top:3px;left:3px;width:18px;height:18px;border-radius:50%;background:var(--sub);transition:transform .2s,background .2s}
.switch input:checked{background:var(--coin)}.switch input:checked::after{transform:translateX(18px);background:var(--lacquer)}
.switch span{display:grid;gap:2px}.switch small{color:var(--sub);font-size:12px;line-height:1.6}
/* Lesson 5: the payment notice, an iPhone-style banner at the top centre from 바로 보기 until payment. */
.notice{position:fixed;top:12px;left:50%;z-index:60;width:min(360px,calc(100% - 32px));display:flex;gap:10px;align-items:center;padding:10px 14px 10px 10px;border-radius:18px;background:rgba(28,30,32,.86);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);border:1px solid var(--line);box-shadow:0 10px 30px rgba(0,0,0,.45);transform:translate(-50%,-140%);transition:transform .45s cubic-bezier(.2,1.2,.4,1)}
.notice.show{transform:translate(-50%,0)}
.notice img{width:40px;height:40px;flex:0 0 40px;border-radius:10px;object-fit:cover;background:var(--lacquer)}
.notice p{margin:0;font-size:13px;line-height:1.45}.notice .notice-head{display:flex;justify-content:space-between;gap:8px;font-size:11px;color:var(--sub)}
@media(prefers-reduced-motion:reduce){.notice{transition:none}}
/* Lesson 14 · 연애·궁합 form: four big status cards, one tap moves on. */
.relation-pick{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin:6px 0 4px}
.relation{position:relative;display:grid;gap:2px;margin:0;padding:16px 14px;border:1px solid var(--line);border-radius:14px;background:var(--lacquer);cursor:pointer;transition:border-color .2s,background .2s,transform .15s}
.relation input{position:absolute;opacity:0;width:1px;height:1px;min-height:0;margin:0}
.relation b{font-family:var(--serif);font-size:18px}.relation small{font-size:12px;color:var(--sub);font-weight:400}
.relation:hover{border-color:rgba(242,240,236,.4)}.relation:active{transform:scale(.98)}
.relation:has(input:checked){border:3px solid transparent;padding:14px 12px;background:linear-gradient(var(--active),var(--active)) padding-box,var(--nacre) center/cover border-box}
.relation:has(input:focus-visible){outline:2px solid var(--text);outline-offset:2px}
/* Gender for the 대운 direction (2026-10-29), two quiet choices under the birth date. */
.gender-pick{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin:12px 0 4px}
.gender-label{grid-column:1/-1;margin:0;font-size:14px;font-weight:550}.gender-label small{margin-left:4px}
.gender{position:relative;margin:0;padding:12px;text-align:center;border:1px solid var(--line);border-radius:12px;background:var(--lacquer);cursor:pointer;font-weight:400}
.gender input{position:absolute;opacity:0;width:1px;height:1px;min-height:0;margin:0}
.gender b{font-size:15px}
.gender:has(input:checked){border-color:var(--hot);background:var(--active);box-shadow:0 0 0 1px var(--hot) inset}
.gender:has(input:focus-visible){outline:2px solid var(--text);outline-offset:2px}
.partner-none{font-family:var(--serif);font-size:16px;line-height:1.7;text-align:center;margin:18px 0}
/* Reading: the wait, a thin progress line, read marks, minutes per chapter, chapters that open gently. */
.wait-line{min-height:1.6em;font-family:var(--serif);font-size:15px;margin:10px 0 0;animation:wait-line 6.5s ease-in-out infinite}
@keyframes wait-line{0%,100%{opacity:0}12%,85%{opacity:1}}
.wait-titles{list-style:none;padding:0;margin:16px 0;display:grid;gap:6px;counter-reset:wait}
.wait-titles li{counter-increment:wait;font-size:14px;padding:8px 12px;border-radius:8px;background:linear-gradient(100deg,transparent 30%,rgba(242,240,236,.08) 50%,transparent 70%) var(--lacquer);background-size:300% 100%;color:var(--sub);opacity:0;animation:wait-in .6s ease forwards,shimmer 3.2s linear infinite;animation-delay:calc(var(--i) * 140ms),calc(var(--i) * 220ms)}
.wait-titles li::before{content:counter(wait,decimal-leading-zero) "  ";font-family:var(--mono);font-size:11px}
@keyframes wait-in{to{opacity:1}}@keyframes shimmer{from{background-position:100% 0}to{background-position:-200% 0}}
.read-progress{position:fixed;top:0;left:0;right:0;height:3px;z-index:30;pointer-events:none}
.read-progress i{display:block;height:100%;transform-origin:0 50%;transform:scaleX(0);background:linear-gradient(90deg,var(--hot),var(--gilt));transition:transform .15s linear}
#toc a.read{color:var(--sub)}#toc a.read::after{content:" ✓";color:var(--text)}
details.chapter>summary .read-time{margin-left:auto;font-size:11px;color:var(--sub);font-family:var(--mono);white-space:nowrap}
details.chapter>summary:has(.read-time)::after{margin-left:0}
details.chapter[open]>:not(summary){animation:chapter-in .5s ease both}
@keyframes chapter-in{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
/* The farewell: 결선생 sees the reader off; the other story waits below. */
.farewell{margin:36px 0 12px;display:grid;gap:18px}
.farewell-art{margin:0;border-radius:18px;overflow:hidden;aspect-ratio:4/5;width:min(100%,420px);justify-self:center;border:3px solid transparent;background:var(--nacre) center/cover;box-shadow:0 0 50px rgba(255,46,99,.18)}
.farewell-art img{width:100%;height:100%;object-fit:cover;object-position:50% 30%;display:block;border-radius:15px}
.farewell-body h2{font-size:26px;line-height:1.45;margin:6px 0 12px}
.farewell-text{font-family:var(--serif);font-size:17px;line-height:1.85;margin:0 0 16px}
.farewell-stone{display:flex;gap:12px;align-items:center;margin:0 0 14px;padding:10px 12px;border-radius:12px;background:var(--active)}
.farewell-stone img{width:56px;height:56px;border-radius:10px;object-fit:cover}.farewell-stone p{margin:0;font-size:14px}
.farewell-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center}
.farewell-actions button{width:auto;min-height:48px}
.feedback{margin:22px 0 6px;padding:16px 18px;border:1px solid var(--line);border-radius:14px;background:var(--raised);display:grid;gap:8px}
.feedback p{margin:0}.feedback-head{font-family:var(--serif);font-size:17px;font-weight:700}
.feedback-stars{display:flex;gap:4px}.feedback-stars button{width:44px;min-height:44px;padding:0;font-size:26px;line-height:1;background:none;border:0;color:var(--gilt);cursor:pointer}
.feedback textarea{width:100%;font-size:16px}.feedback button[type=submit]{width:auto;justify-self:start;min-height:44px}
.feedback-done{font-size:15px;line-height:1.7}.feedback-again{width:auto;min-height:32px;padding:2px 10px;font-size:13px;background:none;border:1px solid var(--line);color:var(--sub);border-radius:8px;cursor:pointer}
.nacre-link{display:inline-flex;align-items:center;min-height:48px;padding:10px 18px;border-radius:10px;border:0;background:linear-gradient(135deg,var(--hot),var(--hot2));color:#fff;box-shadow:0 8px 24px rgba(255,46,99,.3);font-weight:700;text-decoration:none}
.gallery-cards{display:grid;gap:12px}
.gallery-card{display:grid;grid-template-columns:42% 1fr;border-radius:16px;overflow:hidden;border:1px solid var(--line);background:var(--raised);color:var(--text);text-decoration:none;transition:transform .25s ease,border-color .25s}
.gallery-card:hover,.gallery-card:focus-visible{transform:translateY(-3px);border-color:rgba(242,240,236,.45)}
.gallery-card img{width:100%;height:100%;min-height:150px;object-fit:cover;display:block}
.gallery-card div{display:grid;gap:4px;align-content:center;padding:16px 18px}
.gallery-card strong{font-family:var(--serif);font-size:18px}.gallery-card span{font-size:14px;line-height:1.6}.gallery-card small{color:var(--sub)}.gallery-card em{font-style:normal;font-weight:650;font-size:14px;margin-top:4px}
@media(max-width:520px){.gallery-card{grid-template-columns:1fr}.gallery-card img{aspect-ratio:16/9;min-height:0}.farewell-body h2{font-size:22px}.relation b{font-size:16px}}
.farewell-close{text-align:center;font-family:var(--serif);color:var(--sub);margin:22px 0 8px;display:flex;flex-direction:column;align-items:center;gap:10px}
.lantern{width:14px;height:14px;border-radius:50%;background:radial-gradient(circle,#F6DE97 0,rgba(217,180,90,.6) 40%,transparent 72%);box-shadow:0 0 18px 6px rgba(217,180,90,.25);animation:lantern 3.6s ease-in-out infinite}
@keyframes lantern{0%,100%{opacity:.55;transform:scale(.9)}50%{opacity:1;transform:scale(1.08)}}
@media(prefers-reduced-motion:reduce){.wait-titles li,.wait-line,.lantern,details.chapter[open]>:not(summary){animation:none;opacity:1}.gallery-card{transition:none}}
/* The making-of credit (lecture, image model) is for reviewers; a customer meets the story without it. */
body:not(.review) .story-credit{display:none}
/* Arrival: the first scene comes up out of the dark, the 결 mark glows in after it. */
.story .scene[data-scene="0"] .scene-art{animation:arrive 2.6s cubic-bezier(.2,.7,.2,1) both}
.story .story-brand{animation:mark-in 1.6s ease 1.2s both}
@keyframes arrive{from{opacity:0;transform:scale(1.07)}to{opacity:1;transform:none}}
@keyframes mark-in{from{opacity:0;filter:blur(4px)}to{opacity:1;filter:none}}
.form-steps li{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.form-steps:has(li:nth-child(5)){font-size:11px;gap:4px}
/* B안: the moment the guide reads heaven's secret — the close-up pushes in out of the dark. */
.story .scene.heaven.now .scene-art{animation:heaven 2.4s cubic-bezier(.2,.7,.2,1) both}
@keyframes heaven{from{transform:scale(1.06);filter:brightness(.25) saturate(.6)}55%{filter:brightness(1.15) saturate(1.2)}to{transform:none;filter:none}}
@media(prefers-reduced-motion:reduce){.story .scene[data-scene="0"] .scene-art,.story .story-brand,.story .scene.heaven.now .scene-art{animation:none}}
.head-links{display:flex;gap:6px;align-items:center}
/* The result as a document (lessons 14–15): one page, a contents block, chapters top to bottom; nothing between
   the reader and the text. */
body.doc .guide,body.doc .steps,body.doc #summary-bar,body.doc .reading-heading .eyebrow,body.doc .reading-actions{display:none}
body.doc .story-bar{background:rgba(12,14,15,.92);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px)}
body.doc .reading-heading{padding:24px 0 4px}
body.doc .reading-heading h2{font-size:30px;line-height:1.35;margin:0;letter-spacing:-.6px}
.reading-sub{margin:8px 0 0;font-size:13px;color:var(--sub)}
#toc:has(.doc-toc){display:block}
.doc-toc{margin:18px 0 8px;padding:14px 16px 10px;border-radius:12px;background:var(--raised);border:1px solid var(--line)}
.doc-toc-label{margin:0 0 6px;font-size:12px;color:var(--sub);font-family:var(--mono);letter-spacing:1px}
.doc-toc ol{margin:0;padding:0 0 0 1.6em;font-size:15px;line-height:1.5}
.doc-toc li{padding:5px 0}.doc-toc li::marker{color:var(--sub);font-family:var(--mono);font-size:12px}
.doc-toc a{color:var(--text);text-decoration:none;border-bottom:1px solid rgba(242,240,236,.18)}
.doc-toc a.read{color:var(--sub)}.doc-toc a.read::after{content:"  ✓";color:var(--text)}
.doc-chapter{scroll-margin-top:72px;padding:34px 0 8px;border-top:1px solid var(--line);margin-top:30px}
.doc-chapter:first-child{border-top:0;margin-top:8px;padding-top:18px}
.doc-art{margin:0 0 20px}.doc-art img{display:block;width:100%;height:auto;aspect-ratio:3/2;object-fit:cover;border-radius:14px}
.doc-head{display:grid;gap:4px;margin:0 0 16px}
.doc-no{font-family:var(--mono);font-size:12px;font-weight:700;color:var(--hot);letter-spacing:.5px}
.doc-head h2{font-size:26px;line-height:1.4;margin:0;letter-spacing:-.5px}
.doc-chapter .core{position:relative;font-family:var(--serif);font-size:19.5px;line-height:1.7;font-weight:500;margin:0 0 24px;padding:2px 0 2px 18px}
.doc-chapter .core::before{content:"";position:absolute;left:0;top:4px;bottom:4px;width:3px;border-radius:3px;background:var(--hot)}
.doc-body{max-width:34em}
.doc-body p{font-size:17px;line-height:1.95;letter-spacing:-.2px;color:rgba(242,240,236,.88);margin:0 0 1.25em}
.doc-chapter .evidence{font-size:13px;line-height:1.75;color:var(--sub);background:var(--raised);border:1px solid var(--line);border-radius:12px;padding:12px 14px;margin:6px 0 0;border-top:1px solid var(--line)}
.doc-chapter .evidence::before{content:"명식 근거";font-size:11px;font-weight:700;color:var(--text);margin-right:8px}
/* 소장본 장 끝 두 줄 (2026-10-30) */
.doc-keep{margin:22px 0 0;padding:16px 18px;border:1px solid rgba(201,166,92,.45);border-radius:14px;background:linear-gradient(180deg,rgba(201,166,92,.08),rgba(201,166,92,.02))}
.doc-keep-label{margin:0;font-size:11px;letter-spacing:.12em;color:#c9a65c}
.doc-keep-label+p{margin:4px 0 12px}
.doc-keep p:last-child{margin-bottom:0}
.doc-keep-line{font-family:var(--serif);font-size:17px;line-height:1.6;font-weight:600;color:var(--text)}
.doc-keep-step{font-size:14px;line-height:1.7;color:var(--text)}
.doc-end{height:1px}
@media(max-width:480px){.doc-head h2{font-size:23px}.doc-chapter .core{font-size:18.5px}.doc-body p{font-size:16.5px}body.doc .reading-heading h2{font-size:26px}}
#toc .doc-toc a{display:inline;padding:0;border:0;border-radius:0;background:none;font-size:15px;border-bottom:1px solid rgba(242,240,236,.18)}
/* The home, B안 since 2026-10-29 (사장님: "B안 전환 먼저"): a poster wall like the 타이트 mood — glowing titles over
   the guides' posters, chips that follow the section on screen, the guides still to come, and one hot invitation. */
body.home-view main>:not(#home):not(footer){display:none!important}
body.home-view main{width:min(100% - 36px,560px)}
.home{padding:0 0 24px}
.b-chips{position:sticky;top:0;z-index:19;display:flex;gap:8px;overflow-x:auto;scrollbar-width:none;margin:0 -18px;padding:10px 18px 12px;background:rgba(6,7,8,.86);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px)}
.b-chips::-webkit-scrollbar{display:none}
.b-chips a{flex:0 0 auto;text-decoration:none;font-size:14px;font-weight:600;padding:8px 14px;border-radius:999px;color:var(--sub);background:var(--active)}
.b-chips a[aria-current]{color:var(--lacquer);background:var(--text)}
.b-hero{position:relative;padding:4px 0 0}
.b-hero-track{display:grid;grid-auto-flow:column;grid-auto-columns:88%;gap:12px;overflow-x:auto;scroll-snap-type:x mandatory;scrollbar-width:none;margin:0 -18px;padding:0 18px}
.b-hero-track::-webkit-scrollbar{display:none}
.b-count{position:absolute;top:16px;right:12px;margin:0;font-size:12px;font-weight:700;line-height:1;background:rgba(0,0,0,.55);padding:6px 10px;border-radius:999px}
.b-poster{position:relative;display:block;overflow:hidden;border-radius:18px;text-decoration:none;color:var(--text);scroll-snap-align:center;background:#000;animation:rise .8s ease both}
.b-poster img{display:block;width:100%;height:100%;object-fit:cover;object-position:50% 20%;transition:transform 1s ease}
.b-poster:hover img{transform:scale(1.04)}
.b-poster::after{content:"";position:absolute;inset:0;background:linear-gradient(transparent 45%,rgba(6,7,8,.6) 65%,rgba(6,7,8,.97))}
.b-poster.big{aspect-ratio:2/3}
.b-poster.wide{aspect-ratio:4/5;margin:14px 0 0}
.b-poster span{position:absolute;z-index:1;left:0;right:0;bottom:0;padding:22px 20px 20px;display:grid;gap:6px;text-align:center}
.b-poster em{font-style:normal;font-size:12px;font-weight:700;letter-spacing:.5px;color:var(--gilt)}
.b-poster strong{font-family:var(--serif);font-weight:900;font-size:38px;line-height:1.15;letter-spacing:-1.5px;color:#fff;text-shadow:0 0 22px rgba(255,46,99,.75),0 2px 0 rgba(0,0,0,.6)}
.b-poster.wide strong{font-size:32px}
.b-poster small{font-size:14px;color:rgba(250,250,250,.85)}
.b-row{padding:40px 0 0;scroll-margin-top:56px}
.b-kicker{margin:0 0 6px;font-size:12px;font-weight:700;letter-spacing:.5px;color:var(--hot)}
.b-row h2{margin:0;font-size:26px;line-height:1.35;letter-spacing:-.8px}
.b-soon{display:grid;grid-auto-flow:column;grid-auto-columns:42%;gap:10px;overflow-x:auto;scrollbar-width:none;margin:14px -18px 0;padding:0 18px}
.b-soon::-webkit-scrollbar{display:none}
.b-soon figure{position:relative;margin:0;border-radius:14px;overflow:hidden;aspect-ratio:2/3;background:#000}
.b-soon img{width:100%;height:100%;object-fit:cover;object-position:50% 15%;display:block;filter:saturate(.85) brightness(.8)}
.b-soon figure::after{content:"곧 열려요";position:absolute;top:10px;left:10px;font-size:11px;font-weight:700;padding:3px 8px;border-radius:999px;background:rgba(6,7,8,.7);color:var(--gilt)}
.b-soon figcaption{position:absolute;left:0;right:0;bottom:0;padding:26px 12px 12px;display:grid;gap:2px;background:linear-gradient(transparent,rgba(6,7,8,.92))}
.b-soon b{font-family:var(--serif);font-size:20px}.b-soon span{font-size:12px;color:var(--sub)}
.b-note{font-size:12px;color:var(--sub);margin:10px 0 0}
.home-steps{margin:44px 0 0}.home-steps h2,.b-reviews h2{font-size:22px;margin:0 0 14px}
.home-steps ol{list-style:none;margin:0;padding:0;display:grid;gap:10px}
.home-steps li{display:flex;gap:14px;align-items:flex-start;padding:14px 16px;border-radius:14px;background:var(--raised);border:1px solid var(--line)}
.home-steps b{flex:0 0 28px;height:28px;border-radius:50%;display:grid;place-items:center;font-size:13px;color:#fff;background:var(--hot)}
.home-steps span{display:grid;gap:2px;font-size:14px;color:var(--sub);line-height:1.6}.home-steps strong{color:var(--text);font-size:15px}
.b-reviews{margin:44px 0 0}
.b-reviews h2 span{font-size:11px;font-weight:600;font-family:var(--sans);color:var(--sub);border:1px solid var(--line);border-radius:999px;padding:2px 8px;vertical-align:middle}
.b-reviews article{background:var(--raised);border-radius:14px;padding:14px 16px;margin:0 0 10px}
.b-reviews b{font-size:13px;color:var(--gilt)}.b-reviews p{margin:6px 0 0;font-size:14px;line-height:1.7}
.b-cta{display:block;margin:30px 0 0;padding:18px;border-radius:16px;text-align:center;text-decoration:none;font-weight:800;font-size:17px;color:#fff;background:linear-gradient(135deg,var(--hot),var(--hot2));box-shadow:0 10px 30px rgba(255,46,99,.35)}
@media(min-width:760px){.b-hero-track{grid-auto-columns:calc(50% - 6px);margin:0;padding:0}.b-soon{grid-auto-columns:calc(25% - 8px);margin:14px 0 0;padding:0}.b-chips{margin:0}}
/* Bottom bar (course site: 홈 · 만세력 · 연예인 사주 · 마이페이지; here the two stories and My Page). */
.tabbar{position:fixed;left:50%;bottom:max(10px,env(safe-area-inset-bottom));transform:translateX(-50%);z-index:40;width:min(440px,calc(100% - 24px));display:grid;grid-template-columns:repeat(4,1fr);padding:6px;border-radius:20px;background:rgba(18,21,22,.88);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);border:1px solid var(--line);box-shadow:0 10px 30px rgba(0,0,0,.45)}
.tabbar a{display:grid;justify-items:center;gap:3px;padding:7px 0 5px;border-radius:14px;color:var(--sub);text-decoration:none;font-size:11px}
.tabbar svg{width:22px;height:22px;fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round}
.tabbar a[aria-current]{color:#fff;background:var(--hot)}
body.with-tabbar{padding-bottom:96px}
@media(prefers-reduced-motion:reduce){.b-poster{animation:none}.b-poster img{transition:none}}
/* Payment method picked in our own sheet, so a quick-pay opens straight away on phones. */
.pay-methods{border:0;margin:4px 0 10px;padding:0}.pay-methods legend{font-size:13px;color:var(--sub);margin-bottom:8px;padding:0}
.pay-method-row{display:grid;grid-template-columns:1fr 1fr;gap:8px}
.pay-method-row label{position:relative;display:block;padding:12px 8px;text-align:center;border:1px solid var(--line);border-radius:12px;background:var(--lacquer);cursor:pointer;font-size:15px;font-weight:550}
.pay-method-row input{position:absolute;opacity:0;width:1px;height:1px;min-height:0;margin:0}
.pay-method-row label:has(input:checked){border-color:var(--hot);background:var(--active);box-shadow:0 0 0 1px var(--hot) inset}
.pay-method-row label:has(input:focus-visible){outline:2px solid var(--gilt);outline-offset:2px}
.sources-title{font-size:15px;margin:14px 0 6px}.sources-title small{color:var(--sub);font-weight:400}.sources{list-style:none;padding:0;margin:0 0 12px;display:flex;flex-wrap:wrap;gap:6px}.sources li{border:1px solid var(--line);border-radius:999px;padding:4px 10px;font-size:13px}
/* 10강: six review cards with the 띠 pictures, boxed and still, a little colour so they read on black; marked 가상. */
.b-reviews-note{font-size:12px;color:var(--sub);margin:-6px 0 12px}
.b-review-grid{display:grid;gap:10px}
@media (min-width:720px){.b-review-grid{grid-template-columns:1fr 1fr}}
.b-reviews article{display:flex;gap:12px;align-items:flex-start;background:linear-gradient(160deg,rgba(255,46,99,.10),rgba(255,201,77,.05)) ,var(--raised);border:1px solid rgba(255,201,77,.18);margin:0}
.b-reviews article img{flex:0 0 56px;width:56px;height:56px;border-radius:50%;background:var(--active);border:1px solid rgba(255,201,77,.35);object-fit:cover}
.b-reviews article b{display:block;color:var(--gilt)}
.b-reviews .stars{display:block;font-size:12px;letter-spacing:1px;color:var(--gilt);margin-top:2px}
.b-reviews article p{color:var(--text)}
@media (prefers-reduced-motion:no-preference){.b-reviews article img{animation:zodiac-bob 3.2s ease-in-out infinite}.b-reviews article:nth-child(2n) img{animation-name:zodiac-tilt;animation-duration:3.8s}.b-reviews article:nth-child(3n) img{animation-name:zodiac-breathe;animation-duration:4.4s}}
@keyframes zodiac-bob{0%,100%{transform:translateY(0)}50%{transform:translateY(-3px)}}
@keyframes zodiac-tilt{0%,100%{transform:rotate(0)}50%{transform:rotate(-5deg)}}
@keyframes zodiac-breathe{0%,100%{transform:scale(1)}50%{transform:scale(1.05)}}
.security-log{list-style:none;padding:0;margin:0 0 14px;display:grid;gap:4px;font-size:13px}.security-log li{border-left:3px solid var(--line);padding:4px 8px;background:var(--raised);border-radius:6px}.security-log li.attack{border-left-color:var(--hot)}.security-log li.suspicious{border-left-color:var(--gilt)}
/* Home (2026-10-30, owner: "메인페이지에서 각 서비스별 구분이 애매해서 헷갈려. 위와 아래의 구분"): one order for the six
   products everywhere — posters, the pick list, the detail rows — each part with its own heading. */
.b-head{font-size:18px;margin:18px 0 10px;letter-spacing:-.4px}.b-head small{font-size:12px;font-weight:500;color:var(--sub);margin-left:6px}
.b-pick{margin:28px 0 0;scroll-margin-top:56px}
.b-pick ol{list-style:none;margin:0;padding:0;display:grid;gap:8px}
.b-pick a{display:flex;align-items:center;gap:12px;padding:12px 14px;border-radius:14px;background:var(--raised);border:1px solid var(--line);text-decoration:none;color:var(--text)}
.b-pick img{flex:0 0 48px;width:48px;height:48px;border-radius:50%;object-fit:cover;border:1px solid rgba(255,201,77,.35)}
.b-pick span{flex:1;display:grid;gap:1px;min-width:0}.b-pick b{font-size:16px}.b-pick small{font-size:12px;color:var(--gilt)}.b-pick i{font-style:normal;font-size:12px;color:var(--sub);line-height:1.5}
.b-pick em{flex:0 0 auto;font-style:normal;font-weight:800;font-size:15px;color:var(--text)}
.b-detail-head{margin-top:44px;padding-top:18px;border-top:1px solid var(--line)}
.b-go{display:block;margin:10px 0 0;padding:13px;border-radius:12px;text-align:center;text-decoration:none;font-weight:700;color:#fff;background:linear-gradient(90deg,var(--hot),var(--hot2))}
/* Paid consult as a conversation (2026-10-30). */
@media (prefers-reduced-motion:no-preference){html{scroll-behavior:smooth}}
body:not(.review) .consult-speaker{display:none}
#consult-credits{display:inline-block;margin:6px 0 4px;padding:4px 12px;border-radius:999px;font-size:13px;font-weight:700;color:var(--lacquer);background:var(--gilt)}
#consult-credits.empty{background:var(--active);color:var(--sub)}
#consult-credits.bump{animation:credit-bump .6s ease}
@keyframes credit-bump{0%{transform:scale(1)}40%{transform:scale(1.15)}100%{transform:scale(1)}}
.thread .say{display:flex;gap:10px;align-items:flex-start;max-width:94%}
.thread .say>img{flex:0 0 36px;width:36px;height:36px;border-radius:50%;object-fit:cover;border:1px solid rgba(255,201,77,.35)}
.thread .say>div{display:grid;gap:6px;min-width:0}.thread .say b{font-size:12px;color:var(--gilt)}
.thread .say p{max-width:none}
.thread .ask.failed{opacity:.55}
.thread .ask{animation:say-in .35s ease both}
.thread .say .reply{animation:say-in .45s ease both}
@keyframes say-in{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
.thread .dots{display:flex;align-items:center;gap:4px;color:var(--sub);font-size:13px}
.thread .dots span{margin-right:4px}
.thread .dots i{width:6px;height:6px;border-radius:50%;background:var(--sub);animation:dot 1.2s infinite ease-in-out}
.thread .dots i:nth-of-type(2){animation-delay:.15s}.thread .dots i:nth-of-type(3){animation-delay:.3s}
@keyframes dot{0%,80%,100%{opacity:.25;transform:translateY(0)}40%{opacity:1;transform:translateY(-3px)}}
.ask-chips{display:flex;flex-wrap:wrap;gap:6px;margin-top:2px}
.ask-chip{min-height:0;padding:8px 12px;border-radius:999px;font-size:13px;font-weight:600;background:transparent;color:var(--text);border:1px solid rgba(255,201,77,.45);width:auto}
.ask-chip:active{background:var(--active)}
#consult-question:disabled{opacity:.6}
body.consult-in-view .consult-fab{opacity:0;pointer-events:none;transform:translateY(12px)}
.consult-fab{transition:opacity .25s ease,transform .25s ease}
@media (prefers-reduced-motion:reduce){.thread .ask,.thread .say .reply,#consult-credits.bump{animation:none}.thread .dots i{animation:none;opacity:.6}}
/* Until app.mjs knows which screen opens (home, story, reading), the main area stays blank instead of flashing the default chat. */
body.booting main>*{visibility:hidden}
/* 2026-10-30 (owner: "기존에 자개스타일로 만들면서 말풍선도 자개테두리가 있었는데 새로 추가한건 강의대로 해서 전체적 일관성이
   깨졌어"): the caption band wears the same nacre frame as the narration box. The frame is drawn as a border image so a
   wide caption keeps an even edge instead of a stretched one. */
.caption{left:5%;right:5%;margin-inline:auto;width:fit-content;max-width:90%;padding:12px 22px;background:none;
  border:9px solid transparent;border-image:url(/assets/webtoon/bubble-narration.webp) 22 fill / 9px round;font-size:17px}
.caption.at-top{top:8%}.caption.at-low{bottom:8%}
/* A quiet sound (2026-10-30, owner: the glasses coming off with a shake and a loud sound felt out of place): small,
   soft and slow, while the camera eases in on the eyes; the shake stays for the blunt line that follows. */
.sfx.hush{top:24%;font-size:34px;font-weight:600;letter-spacing:6px;color:rgba(255,255,255,.88);text-shadow:0 0 18px rgba(255,201,77,.55),0 2px 0 rgba(0,0,0,.5)}
.sfx.hush.shown{animation:hush 1.1s ease both}
@keyframes hush{from{opacity:0;transform:translateY(6px);filter:blur(3px)}to{opacity:1;transform:none;filter:none}}
@media(prefers-reduced-motion:reduce){.sfx.hush.shown{animation:none}}
.date-solar{margin:6px 0 0;font-size:13px;color:var(--gilt)}.date-solar.warn{color:var(--warn)}
.meta-state{font-size:13px;margin:10px 0;padding:8px 12px;border-radius:10px;background:var(--raised)}.meta-state.ok{border-left:3px solid #5ccf8a}.meta-state.warn{border-left:3px solid var(--gilt)}
/* Admin: the free test link (2026-10-30). */
.test-pass{margin-top:14px;padding-top:12px;border-top:1px solid var(--line);display:grid;gap:6px}.test-pass small{color:var(--sub);font-size:12.5px;line-height:1.6}
.test-pass-link{margin:2px 0;font-family:var(--mono);font-size:12.5px;word-break:break-all}.test-pass-link.on{color:var(--gilt)}.test-pass-link.off{color:var(--sub);text-decoration:line-through}
.test-pass-actions{display:flex;flex-wrap:wrap;gap:8px}.test-pass-actions button{margin:0;min-height:40px;padding:8px 14px}
