/* 로고 = 브랜드 락업(연한 4-phase 타일 15px×2 + gap 2 → 32px 마크, 잉크 `kiyo` 워드마크 800/-.04em).
   정본은 `docs/conventions.md` 「Brand Assets」 · 값은 `components/web/Landing.tsx` 의
   `.kl-brand`/`.kl-logo-grid` 와 같다. 종전의 Arial `kiyo.` 글자 로고는 2026-09-12 사용자
   지정("로고 어디 갔어")으로 폐기. 워드마크가 옆에 있으므로 타일은 글자 없이 비운다. */
@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;500;600;700&family=Noto+Sans+KR:wght@400;450;500;550;600;650;700;750;800&display=swap');
:root{--ink:#233f35;--green:#244b40;--green-hover:#17372e;--muted:#66726a;--paper:#fbfcf9;--line:#dce3da;--soft:#edf2e8;--yellow:#dee89a;--radius:24px;font-family:'Noto Sans KR',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;color:var(--ink);background:var(--paper);font-synthesis:none}*{box-sizing:border-box}html{scroll-behavior:smooth;scroll-padding-top:100px}body{margin:0;line-height:1.7;word-break:keep-all}a{color:inherit;text-decoration:none}button{font:inherit}button,a{-webkit-tap-highlight-color:transparent}a,button,summary{touch-action:manipulation}a:focus-visible,button:focus-visible,summary:focus-visible,[tabindex]:focus-visible{outline:3px solid #8a632e;outline-offset:5px}p,h1,h2,h3{margin:0}img{display:block;max-width:100%;height:auto}.wrap{width:min(1200px,calc(100% - 96px));margin-inline:auto}.header{position:sticky;top:0;z-index:20;background:rgba(251,252,249,.96);border-bottom:1px solid var(--line)}.nav{height:90px;display:flex;align-items:center;justify-content:space-between;gap:32px}.logo{display:inline-flex;align-items:center;gap:11px;line-height:1}.logo-mark{display:grid;grid-template-columns:15px 15px;grid-template-rows:15px 15px;gap:2px}.logo-mark i{display:block;border-radius:4px}.logo-mark i:nth-child(1){background:#FBEAF0}.logo-mark i:nth-child(2){background:#E1F5EE}.logo-mark i:nth-child(3){background:#FAEEDA}.logo-mark i:nth-child(4){background:#EEEDFE}.logo-word{font-size:26px;font-weight:800;letter-spacing:-.04em;color:#25352F}.nav nav{display:flex;gap:32px;margin-left:auto;margin-right:26px;font-size:14px;font-weight:500}.nav nav a:hover,.footer a:hover{text-decoration:underline;text-underline-offset:5px}.button{min-height:58px;padding:15px 25px;display:inline-flex;justify-content:center;align-items:center;gap:18px;background:var(--green);color:#fff;border:1px solid var(--green);border-radius:9px;font-size:16px;font-weight:600;transition:background .2s,transform .2s;white-space:nowrap}.button:hover{background:var(--green-hover);transform:translateY(-2px)}.button.small{min-height:44px;font-size:14px;padding:10px 17px;border-radius:7px}.button.secondary{background:transparent;border-color:#becbbf;color:var(--ink)}.button.secondary:hover{background:#edf1e9}.button svg{width:20px;height:22px;fill:none;stroke:currentColor;stroke-width:1.6}.hero{display:grid;grid-template-columns:1.03fr 1fr;gap:50px;padding-block:64px 56px;align-items:center}.eyebrow{font-size:14px;font-weight:600;letter-spacing:.015em;display:flex;align-items:center;gap:10px;margin-bottom:26px}.eyebrow-line{width:24px;height:1px;background:currentColor}h1{font-size:clamp(42px,4.6vw,64px);font-weight:650;line-height:1.24;letter-spacing:-.065em}h1 em{font-style:normal}.hero-desc{font-size:17px;color:var(--muted);line-height:1.9;margin:27px 0 29px}.cta-group{display:flex;gap:11px;flex-wrap:wrap}.start-notes{display:flex;flex-direction:column;gap:3px;font-size:12px;color:var(--muted);margin-top:16px}.start-notes>span:first-child{font-size:13px;display:flex;align-items:center;gap:5px;color:#425b49}.start-notes svg{width:15px;height:15px;stroke:currentColor;fill:none;stroke-width:2}.quiet-link{display:inline-flex;gap:15px;font-size:14px;color:var(--muted);text-decoration:underline;text-underline-offset:5px}.hero .quiet-link{margin-top:35px}.hero-visual{min-width:0;height:617px;border-radius:140px 140px 26px 26px;background:#e9efdf;position:relative;overflow:hidden;padding:27px 25px 24px}.visual-top{display:flex;justify-content:space-between;font-size:10px;letter-spacing:.12em;color:#778469;margin:26px 13px 0}.phone-pair{position:absolute;inset:80px 0 96px}.phone{position:absolute;filter:drop-shadow(0 18px 15px #234b4020);width:45%;max-width:210px}.phone.monthly{top:20px;left:9%;transform:rotate(-9deg)}.phone.daily{top:0;right:8%;transform:rotate(8deg)}.visual-caption{position:absolute;bottom:27px;left:35px;right:35px;display:flex;align-items:center;gap:17px;border-top:1px solid #cdd7be;padding-top:19px;font-size:14px;line-height:1.6;color:#667558}.visual-caption strong{font-weight:550;color:#354930}.caption-mark{font-size:27px;font-weight:300}.intro-strip{display:flex;align-items:center;gap:40px;border-top:1px solid var(--line);border-bottom:1px solid var(--line);padding-block:24px;font-size:14px}.intro-strip>span+span:before{content:'/';padding-right:40px;color:#a4b29e}.intro-strip p{margin-left:auto;font-size:12px;color:var(--muted)}.section{padding-block:104px}.section-heading{display:flex;align-items:flex-end;justify-content:space-between;gap:30px;margin-bottom:43px}.section-heading .eyebrow{margin-bottom:17px}h2{font-size:clamp(30px,3.2vw,44px);font-weight:550;letter-spacing:-.055em;line-height:1.38}.section-heading>p{font-size:16px;color:var(--muted);line-height:1.9;margin-bottom:5px}.product-explorer{border-radius:var(--radius);overflow:hidden;display:grid;grid-template-columns:1fr 1fr;background:#f0f2ec;min-height:630px}.explorer-copy{padding:44px 50px 50px;display:flex;flex-direction:column;align-items:flex-start}.tabs{display:flex;border-bottom:1px solid #ccd5c7;gap:8px;width:100%;margin-bottom:55px}.tabs button{border:0;background:transparent;cursor:pointer;color:var(--muted);font-size:15px;padding:13px 17px;border-bottom:2px solid transparent;margin-bottom:-1px}.tabs button[aria-selected=true]{border-color:var(--green);color:var(--green);font-weight:700}.tabs button:hover{background:#e6ecdf}.panel-kicker{font-size:11px;letter-spacing:.14em;color:#7e8d74}h3{font-size:30px;line-height:1.5;font-weight:550;letter-spacing:-.04em}.explorer-copy h3{margin-top:14px}.explorer-copy #panel-description{font-size:16px;color:var(--muted);line-height:1.9;margin-top:19px;max-width:330px}.explorer-copy ul{list-style:none;padding:0;margin-top:25px;font-size:14px;color:#53664e}.explorer-copy li{position:relative;padding-left:21px;margin-block:8px}.explorer-copy li:before{content:'✓';position:absolute;left:0}.text-cta{margin-top:auto;padding-top:28px;font-size:15px;font-weight:600;display:flex;gap:22px;align-items:center}.text-cta:hover{text-decoration:underline;text-underline-offset:6px}.explorer-visual{background:#e4eada;position:relative;padding:58px 60px 0;display:flex;justify-content:center;align-items:flex-start;overflow:hidden;min-height:630px}.explorer-visual img{width:274px;filter:drop-shadow(0 12px 18px #2c493420);position:absolute;top:77px;transition:opacity .16s}.visual-label{position:absolute;top:27px;font-size:10px;color:#6c7a60;letter-spacing:.12em}.screen-note{position:absolute;bottom:18px;right:21px;font-size:11px;color:#69775d}.cycle-story{background:var(--green);color:#f3f7e9}.cycle-grid{display:grid;grid-template-columns:1fr 1fr;gap:100px}.cycle-story .eyebrow{color:#c8d5a6}.cycle-story h2{font-size:42px}.cycle-story-copy{padding-top:9px}.large-copy{font-size:24px;line-height:1.65;letter-spacing:-.025em}.cycle-story-copy>p+p{font-size:16px;color:#c8d5ca;line-height:1.9;margin-top:22px}.optional-note{border-top:1px solid #527064;padding-top:24px;margin-top:30px;display:flex;gap:15px;align-items:center}.optional-note svg{width:27px;height:27px;stroke:#dceaa7;stroke-width:1;fill:none;flex-shrink:0}.optional-note strong{display:block;font-size:15px;font-weight:500;color:#e7f0ce}.optional-note span{font-size:13px;display:block;color:#c6d2c8;margin-top:3px}.trust-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:42px}.trust-grid article{border-top:1px solid var(--line);padding-top:24px}.trust-number{font-family:Georgia,serif;font-size:18px;color:#7d8c71}.trust-grid h3{font-size:21px;margin-top:18px}.trust-grid p{font-size:15px;color:var(--muted);line-height:1.95;margin-top:13px}.closing{border-radius:var(--radius);background:#e8eecb;display:flex;align-items:center;justify-content:space-between;gap:40px;padding:57px 60px}.closing .eyebrow{margin-bottom:15px;font-size:13px}.closing h2{font-size:40px}.closing p:not(.eyebrow){color:#60714e;font-size:16px;margin-top:17px}.closing .closing-note{font-size:12px!important;text-align:center}.closing .secondary{border-color:#aabb8a}.faq{display:grid;grid-template-columns:1fr 1.5fr;gap:80px}.faq .eyebrow{margin-bottom:16px}.faq .quiet-link{margin-top:29px;font-size:13px}.faq-list{border-top:1px solid var(--line)}details{border-bottom:1px solid var(--line)}summary{list-style:none;display:flex;align-items:center;justify-content:space-between;gap:20px;cursor:pointer;padding:24px 0;font-size:16px;font-weight:500}summary::-webkit-details-marker{display:none}summary span{font-size:20px;color:#87947d;transition:transform .2s}details[open] summary span{transform:rotate(45deg)}details p{font-size:15px;color:var(--muted);padding:0 35px 24px 0;line-height:1.9}.footer{background:#eef1e8;border-top:1px solid var(--line);padding:46px 0 29px}.footer-top{display:flex;gap:55px;align-items:center;padding-bottom:36px}.footer-top p{font-size:15px;line-height:1.5;color:#64745b}.footer-links{display:flex;gap:24px;font-size:13px;margin-left:auto}.footer-bottom{border-top:1px solid #d7dfd0;padding-top:25px;display:flex;gap:20px;justify-content:space-between;font-size:12px;color:#677260}.footer-bottom>div{display:flex;gap:18px}.legal{font-size:11px;line-height:1.8;color:#7b8575;margin-top:20px;max-width:880px}.company{margin-top:9px}.mobile-cta{display:none}.skip{position:fixed;left:10px;top:-100px;padding:10px 20px;background:var(--green);color:white;z-index:99}.skip:focus{top:10px}
@media(min-width:1450px){.hero{padding-block:80px}.hero-visual{height:650px}.phone-pair{top:100px}}
@media(max-width:1100px){.wrap{width:calc(100% - 64px)}.nav nav{gap:22px;margin-right:0}.hero{gap:24px}h1{font-size:50px}.hero-visual{height:565px}.phone-pair{inset:115px 0 105px}.visual-top{font-size:9px;margin-inline:0}.cta-group{gap:8px}.button{padding-inline:18px;font-size:14px}.hero-desc{font-size:16px}.explorer-copy{padding-inline:35px}.cycle-grid{gap:60px}.closing{padding:45px}.closing h2{font-size:34px}.footer-links{gap:15px}}
@media(max-width:800px){.wrap{width:calc(100% - 40px)}.nav{height:72px}.nav nav{display:none}.logo-word{font-size:22px}.hero{grid-template-columns:1fr;gap:35px;padding-top:39px;padding-bottom:35px}.hero-copy{max-width:560px}.eyebrow{font-size:12px;margin-bottom:19px}h1{font-size:clamp(39px,7.5vw,57px);line-height:1.25}h1 br:first-of-type{display:none}.hero-desc{margin:22px 0;font-size:16px}.hero .quiet-link{display:none}.button{font-size:15px;min-height:54px}.start-notes{margin-top:14px}.hero-visual{height:530px;border-radius:90px 90px 22px 22px;max-width:530px;width:100%;margin:auto}.visual-top{margin-inline:21px;margin-top:15px;font-size:9px}.phone-pair{inset:76px 23px 70px}.phone{width:46%;max-width:222px}.phone.monthly{left:4%;top:26px}.phone.daily{right:4%}.visual-caption{bottom:18px;padding-top:13px;font-size:12px}.caption-mark{font-size:22px}.intro-strip{gap:16px;font-size:12px;justify-content:space-between;padding:19px 0}.intro-strip>span+span:before{display:none}.intro-strip p{display:none}.section{padding-block:67px}.section-heading{display:block;margin-bottom:29px}h2{font-size:33px}.section-heading>p{font-size:15px;margin-top:22px}.product-explorer{grid-template-columns:1fr;min-height:0}.explorer-copy{padding:23px 25px 33px}.tabs{margin-bottom:27px;gap:0}.tabs button{flex:1;padding-inline:8px}.explorer-copy h3{font-size:29px;line-height:1.45}.explorer-copy #panel-description{max-width:480px;font-size:15px;margin-top:13px}.explorer-copy ul{margin-top:18px}.text-cta{padding-top:15px}.explorer-visual{min-height:415px;padding:0}.explorer-visual img{width:240px;top:58px}.visual-label{top:20px}.cycle-grid{grid-template-columns:1fr;gap:30px}.cycle-story h2{font-size:34px}.cycle-story h2 br:last-child{display:none}.large-copy{font-size:21px}.cycle-story-copy>p+p{font-size:15px}.optional-note span{font-size:12px}.trust-grid{grid-template-columns:1fr;gap:24px}.trust-grid article{display:grid;grid-template-columns:35px 1fr;column-gap:12px;padding-top:20px}.trust-grid h3{margin-top:0;font-size:20px}.trust-grid p{grid-column:2;margin-top:8px;font-size:15px}.closing{padding:37px 26px;display:block}.closing h2{font-size:31px}.closing p:not(.eyebrow){font-size:15px}.closing>.cta-group{margin-top:22px}.closing>div+div{margin-top:25px}.closing .cta-group{flex-wrap:nowrap}.closing .button{font-size:14px;padding-inline:15px;gap:12px}.closing .closing-note{text-align:left}.faq{grid-template-columns:1fr;gap:30px}.faq h2 br{display:none}.faq .quiet-link{margin-top:18px}.faq summary{font-size:14px;padding-block:21px}.faq details p{font-size:14px}.footer{padding-bottom:105px}.footer-top{gap:25px;flex-wrap:wrap}.footer-top p{font-size:13px}.footer-links{margin-left:0;width:100%;flex-wrap:wrap;font-size:12px}.footer-bottom{flex-wrap:wrap;gap:14px}.footer-bottom>div{flex-wrap:wrap;gap:12px}.footer-bottom>span:last-child{width:100%}.legal{font-size:11px}.mobile-cta{display:flex;position:fixed;bottom:0;left:0;right:0;background:#fbfcf9f7;border-top:1px solid var(--line);padding:10px 20px calc(10px + env(safe-area-inset-bottom));z-index:30;gap:22px;align-items:center;transform:translateY(120%);transition:transform .25s}.mobile-cta.visible{transform:translateY(0)}.mobile-cta .button{flex:1;min-height:46px;font-size:14px}.mobile-cta>a:last-child{font-size:13px;white-space:nowrap}}
@media(max-width:380px){.wrap{width:calc(100% - 32px)}.hero h1{font-size:38px}.hero .cta-group{gap:7px}.hero .button{font-size:13px;padding-inline:14px;gap:8px}.hero-visual{height:465px}.phone-pair{inset:76px 9px 60px}.visual-top{font-size:8px;margin-inline:7px}.visual-caption{left:25px;right:25px}.intro-strip{font-size:11px;gap:6px}.closing .cta-group{flex-wrap:wrap}.closing .button{width:100%}}
@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,*:before,*:after{transition:none!important;animation:none!important}}
/* Revision: product use cases precede optional exploration and trust detail. */
figure{margin:0}[hidden]{display:none!important}.nav{height:80px}.hero{grid-template-columns:1fr 1.08fr;gap:35px;padding-block:45px 48px}h1{font-size:clamp(36px,3.8vw,51px);line-height:1.35;letter-spacing:-.06em}.hero-desc{font-size:18px;line-height:1.85;margin:25px 0 29px}.hero-visual{height:540px;border-radius:28px;padding:0}.visual-top{position:absolute;top:25px;left:27px;right:27px;margin:0;font-size:12px;letter-spacing:0}.visual-top span:last-child{font-size:11px;letter-spacing:.08em}.wide-hero{position:absolute;top:76px;left:25px;width:calc(100% - 60px);border-radius:11px;border:1px solid #d3deca;box-shadow:0 15px 26px #2b452b13}.hero-daily{position:absolute;top:155px;right:6px;width:175px;filter:drop-shadow(0 14px 14px #243f302b);transform:rotate(5deg)}.hero-monthly{display:none}.visual-caption{bottom:20px;left:27px;right:27px;justify-content:space-between;gap:8px;font-size:12px;border:0;padding:0}.visual-caption span{font-size:11px}.start-notes{font-size:12px}.start-notes>span:first-child{font-size:13px}.intro-strip{gap:25px;justify-content:space-between;padding:21px 0;font-size:14px}.intro-strip>a{flex:1}.intro-strip>a+a{padding-left:25px;border-left:1px solid var(--line)}.section{padding-block:80px}.monthly-feature{display:grid;grid-template-columns:.83fr 1.35fr;align-items:center;gap:38px;padding:40px;border-radius:24px;background:#edf2e6}.feature-label{font-size:13px;margin-bottom:17px}.feature-copy h3{font-size:31px}.feature-copy>p:not(.feature-label){font-size:16px;line-height:1.95;color:var(--muted);margin-top:21px}.feature-copy .choice-note{font-size:14px!important;color:#4f6545!important;margin-top:24px!important;padding-left:15px;border-left:2px solid #becda4}.wide-figure img{border:1px solid #d5dfd0;border-radius:12px;box-shadow:0 8px 20px #2c443010}.wide-figure figcaption{font-size:12px;text-align:center;margin-top:15px;color:#6c7c61}.feature-duo{display:grid;grid-template-columns:1fr 1fr;gap:24px;margin-top:24px}.feature-card{border-radius:24px;overflow:hidden}.today-card{background:#f2f0e9}.habits-card{background:#eef0f7}.feature-card .feature-copy{padding:36px 38px 0}.feature-card h3{font-size:30px}.feature-card .feature-copy>p:not(.feature-label){font-size:16px;margin-top:17px}.card-image{height:370px;overflow:hidden;display:flex;justify-content:center;margin-top:26px}.card-image img{width:260px;align-self:flex-start;filter:drop-shadow(0 12px 16px #243f3019)}.mid-cta{padding:32px 5px 0;display:flex;justify-content:space-between;align-items:center;gap:25px}.mid-cta strong{font-size:18px;font-weight:600}.mid-cta p{font-size:14px;color:var(--muted);margin-top:3px}.explore{background:var(--green);color:#f1f5e9}.explore-grid{display:grid;grid-template-columns:1fr 1fr;gap:80px;align-items:center}.explore .eyebrow{color:#cfdda9}.explore-copy>p:not(.eyebrow){font-size:16px;color:#c7d4c7;margin-top:20px}.screen-tabs{display:grid;grid-template-columns:1fr 1fr;gap:9px;margin-top:28px}.screen-tabs button{text-align:left;border:1px solid #577265;border-radius:9px;color:#e4ecd9;background:transparent;padding:13px 16px;cursor:pointer;font-size:16px;font-weight:500;transition:background .2s}.screen-tabs button span{display:block;font-size:12px;color:#bdcfbd;margin-top:3px;font-weight:400}.screen-tabs button[aria-selected=true]{background:#e7edc9;color:#284630;border-color:#e7edc9}.screen-tabs button[aria-selected=true] span{color:#61774e}.screen-tabs button:hover{border-color:#e7edc9}.explore-copy .explore-note{font-size:14px!important;line-height:1.9;margin-top:24px!important}.screen-stage{background:#3a5c4c;border-radius:160px 160px 25px 25px;display:flex;align-items:center;justify-content:center;padding:22px;min-height:557px}.screen-panel{width:250px;max-width:100%}.screen-panel img{filter:drop-shadow(0 12px 12px #10231e40)}.connection{display:grid;grid-template-columns:1fr 1fr;gap:80px;align-items:center}.connection .eyebrow{margin-bottom:17px}.connection>div>p:not(.eyebrow){font-size:16px;color:var(--muted);margin-top:23px;line-height:1.9}.trust-list>div{padding:22px 0;border-bottom:1px solid var(--line)}.trust-list>div:first-child{border-top:1px solid var(--line)}.trust-list strong{font-size:17px;font-weight:600}.trust-list p{font-size:14px;color:var(--muted);margin-top:6px;line-height:1.9}.faq{padding-bottom:75px}.faq h2{font-size:32px}.closing{display:block;text-align:center;padding:50px 25px;margin-bottom:70px}.closing h2{font-size:38px}.closing .eyebrow{justify-content:center}.closing .cta-group{justify-content:center;margin-top:25px}.closing .closing-note{text-align:center;font-size:13px!important}.footer-top{gap:30px}.footer-top p{font-size:13px}.footer-links{font-size:12px;gap:18px}.legal{font-size:12px;color:#6d7b64}.mobile-cta{visibility:hidden}.mobile-cta.visible{visibility:visible}
@media(max-width:1100px){.hero{gap:25px;grid-template-columns:1fr 1fr}h1{font-size:40px}.hero-desc{font-size:17px}.hero-visual{height:510px}.wide-hero{top:87px;left:17px;width:calc(100% - 38px)}.hero-daily{top:158px;right:1px;width:158px}.monthly-feature{gap:28px;padding:32px;grid-template-columns:1fr 1.2fr}.feature-copy h3{font-size:28px}.feature-card .feature-copy{padding-inline:29px}.explore-grid,.connection{gap:45px}.footer-top{flex-wrap:wrap}.footer-links{margin-left:0;width:100%}.footer-bottom{flex-wrap:wrap}}
@media(max-width:760px){.nav{height:68px}.hero{grid-template-columns:1fr;padding-top:32px;padding-bottom:29px;gap:30px}.hero .eyebrow{font-size:12px;margin-bottom:17px}h1{font-size:clamp(32px,7.4vw,49px);line-height:1.34;letter-spacing:-.055em}h1 br:first-of-type{display:initial}.hero-desc{font-size:16px;margin:20px 0 24px;line-height:1.8}.hero-desc br:last-child{display:none}.hero .cta-group{flex-wrap:nowrap}.hero .button{font-size:14px;padding-inline:17px}.hero-visual{height:425px;max-width:540px;width:100%;margin:auto;border-radius:22px}.wide-hero{display:none}.hero-monthly{display:block;position:absolute;top:63px;left:7%;width:46%;max-width:187px;transform:rotate(-6deg);filter:drop-shadow(0 10px 12px #24452d25)}.hero-daily{top:70px;right:8%;width:43%;max-width:175px;transform:rotate(6deg)}.visual-top{font-size:11px;top:20px;left:20px;right:20px;margin:0}.visual-caption{bottom:16px;background:#eaf0dff5;padding-top:9px;left:19px;right:19px;font-size:11px}.visual-caption span{font-size:10px}.intro-strip{gap:10px;padding:17px 0;font-size:12px}.intro-strip a{line-height:1.65}.intro-strip>a+a{padding-left:12px}.section{padding-block:58px}.section-heading{margin-bottom:26px}.monthly-feature{grid-template-columns:1fr;gap:24px;padding:28px 23px 23px;border-radius:19px}.feature-label{font-size:12px;margin-bottom:13px}.feature-copy h3{font-size:28px}.feature-copy>p:not(.feature-label){font-size:16px;line-height:1.85;margin-top:17px}.feature-copy .choice-note{margin-top:18px!important}.feature-duo{grid-template-columns:1fr;gap:18px;margin-top:18px}.feature-card{border-radius:19px}.feature-card .feature-copy{padding:28px 23px 0}.feature-card h3{font-size:28px}.feature-card .feature-copy>p:not(.feature-label){font-size:16px;line-height:1.85}.card-image{height:335px;margin-top:24px}.card-image img{width:245px}.mid-cta{display:block;text-align:center;padding-top:27px}.mid-cta strong{font-size:16px}.mid-cta .button{margin-top:18px;font-size:15px}.explore-grid{grid-template-columns:1fr;gap:30px}.explore-copy>p:not(.eyebrow){font-size:15px;margin-top:14px}.screen-tabs{margin-top:22px;gap:8px}.screen-tabs button{font-size:15px;padding:11px 14px}.screen-stage{min-height:0;padding:20px;border-radius:100px 100px 21px 21px}.screen-panel{width:230px}.connection{grid-template-columns:1fr;gap:25px}.connection>div>p:not(.eyebrow){font-size:16px;margin-top:18px}.trust-list>div{padding-block:19px}.trust-list strong{font-size:16px}.faq{padding-bottom:50px}.faq h2{font-size:29px}.closing{padding:38px 18px;margin-bottom:50px}.closing h2{font-size:29px}.closing .cta-group{flex-wrap:nowrap;gap:8px;margin-top:22px}.closing .button{padding-inline:13px;font-size:13px;gap:8px}.closing .closing-note{text-align:center}.footer-top p{font-size:12px}.legal{font-size:12px}}
@media(min-width:761px) and (max-width:800px){.hero{grid-template-columns:1fr 1fr}.hero h1{font-size:34px}.hero-visual{height:480px}.hero .cta-group{flex-direction:column;align-items:flex-start}.monthly-feature{grid-template-columns:1fr}.feature-duo{grid-template-columns:1fr}.explore-grid,.connection{grid-template-columns:1fr 1fr;gap:30px}}
@media(max-width:370px){h1{font-size:31px}.hero .button{font-size:13px;padding-inline:13px;gap:9px}.hero-visual{height:390px}.hero-monthly{top:61px;left:6%;width:47%}.hero-daily{top:68px;right:6%;width:44%}.closing .cta-group{flex-wrap:wrap}.closing .button{width:100%}.intro-strip{font-size:11px}}
/* Focused review: shorten repeated screenshots and clarify Android entry. */
/* Locale navigation and typography; shared layout, independently authored copy. */
.nav{gap:18px}.nav nav{margin-right:8px}.language-menu{position:relative;border:0;flex-shrink:0}.language-menu>summary{font-size:14px;font-weight:500;padding:10px 5px;gap:7px;white-space:nowrap}.language-menu>summary>span{font-size:14px;color:var(--muted)}.language-menu[open]>summary>span{transform:rotate(180deg)}.language-menu>div{position:absolute;right:0;top:100%;min-width:132px;padding:6px;background:var(--paper);border:1px solid var(--line);border-radius:10px;box-shadow:0 10px 24px #233f3518}.language-menu a{display:block;font-size:14px;padding:8px 12px;border-radius:5px}.language-menu a:hover,.language-menu a[aria-current=page]{background:var(--soft)}
html:lang(en){font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Arial,sans-serif}html:lang(ja){font-family:'Noto Sans JP',-apple-system,BlinkMacSystemFont,sans-serif}html:lang(en) body,html:lang(ja) body{word-break:normal}html:lang(en) h1{font-size:clamp(36px,3.8vw,49px);letter-spacing:-.045em;line-height:1.2}html:lang(en) h2{letter-spacing:-.035em}html:lang(en) h3{letter-spacing:-.025em}html:lang(en) .hero-desc{max-width:465px;font-size:18px;line-height:1.8}html:lang(en) .hero .button{padding-inline:18px;font-size:15px}html:lang(en) .trust-list strong{font-size:16px}html:lang(ja) h1{letter-spacing:-.045em;font-size:clamp(32px,3.3vw,43px);line-height:1.5}html:lang(ja) h2{letter-spacing:-.025em;font-size:36px}html:lang(ja) .feature-copy h3{font-size:29px;letter-spacing:-.02em}html:lang(ja) .hero-desc{font-size:17px}html:lang(ja) .hero-desc br:last-child{display:none}html:lang(ja) .review-intro h2{font-size:30px}html:lang(ja) .trust-list strong{font-size:16px}html:lang(ja) .button{font-size:14px;padding-inline:20px}.nav .button.small{font-size:13px;padding-inline:15px}
@media(max-width:1100px){.nav nav{gap:20px;font-size:13px}.nav{gap:14px}html:lang(en) .hero .button{font-size:14px;padding-inline:14px}html:lang(en) .hero .cta-group,html:lang(ja) .hero .cta-group{flex-wrap:wrap}html:lang(ja) .hero h1{font-size:34px}html:lang(ja) h2{font-size:32px}html:lang(ja) .feature-copy h3{font-size:27px}}
@media(max-width:800px){.language-menu{margin-left:auto}.nav{gap:12px}.nav .button.small{font-size:12px;padding-inline:12px}.language-menu>summary{font-size:12px;padding-inline:2px}.language-menu>div{right:0}html:lang(en) .hero h1{font-size:clamp(34px,6.8vw,49px)}html:lang(en) .hero h1 br{display:initial}html:lang(en) .hero-desc{font-size:16px}html:lang(en) .closing .cta-group,html:lang(ja) .closing .cta-group{flex-wrap:wrap}html:lang(en) .intro-strip{font-size:12px}html:lang(en) .intro-strip>a+a{padding-left:10px}html:lang(ja) .hero h1{font-size:clamp(29px,6.8vw,43px)}html:lang(ja) h2,html:lang(ja) .closing h2{font-size:28px}html:lang(ja) .review-intro h2{font-size:26px}html:lang(ja) .hero-desc{font-size:16px}html:lang(ja) .intro-strip{font-size:11px}html:lang(ja) .feature-copy h3{font-size:26px}html:lang(ja) .button{font-size:13px;padding-inline:16px}html:lang(en) .start-notes>span:first-child,html:lang(ja) .start-notes>span:first-child{font-size:12px}html:lang(en) .mobile-cta,html:lang(ja) .mobile-cta{gap:14px}}
@media(max-width:370px){.nav{gap:8px}.nav .logo-word{font-size:20px}.nav .button.small{font-size:11px;padding-inline:9px}html:lang(en) .hero h1{font-size:32px}html:lang(ja) .hero h1{font-size:28px}html:lang(en) .hero .button,html:lang(ja) .hero .button{font-size:13px;padding-inline:12px}html:lang(en) .intro-strip{font-size:11px}html:lang(en) .mobile-cta .button,html:lang(ja) .mobile-cta .button{padding-inline:12px;font-size:13px}}
.android-note{font-size:13px;color:var(--muted);line-height:1.8;margin-top:17px;max-width:440px}.android-note a{text-decoration:underline;text-underline-offset:3px;color:#46633e}.is-android .cta-group .app,.is-android .mobile-cta .app{display:none}.is-android .hero .cta-group .web{min-width:220px}.footer-android{display:inline-block;font-size:12px;margin-top:5px;color:#68755e}.review-intro h2{font-size:34px}.review-intro .eyebrow{margin-bottom:12px}.review-intro>div>p:last-child{font-size:16px;color:#ced9cb;line-height:1.85;margin-top:17px}.gallery-details{margin-top:24px;border-top:1px solid #527365;border-bottom:0}.gallery-details>summary{font-size:15px;color:#e2eccb;padding:20px 0 0}.gallery-details>summary>span{color:#dce8bc}.gallery-details[open]>.explore-grid{padding-top:35px}.gallery-details .explore-copy>p{padding:0}.gallery-details h3{font-size:28px;line-height:1.5}.gallery-details .screen-stage{margin:0}.gallery-details .screen-panel{max-width:100%}.explore:has(.gallery-details:not([open])){padding-block:48px}.gallery-details .explore-note{color:#c7d4c7}.is-android .mobile-cta{gap:0}
@media(max-width:760px){.android-note{font-size:12px;margin-top:15px}.review-intro h2{font-size:28px}.review-intro>div>p:last-child{font-size:15px}.review-intro>div>p:last-child br{display:none}.explore:has(.gallery-details:not([open])){padding-block:36px}.gallery-details{margin-top:20px}.gallery-details>summary{font-size:14px;padding-top:17px}.gallery-details[open]>.explore-grid{padding-top:25px}.gallery-details h3{font-size:23px}.closing .closing-note{font-size:12px!important}}

/* ── ✅ **en·ja 가짜 기기 프레임은 없앴다 (2026-09-12).** ─────────────────────────────
   2026-09-11 에는 en·ja 가 프레임 없는 저해상 원본(`/landing/{en,ja}/*.png`, 640×1385)을
   돌려 써서 CSS 로 모서리·테두리만 흉내 냈다. 지금은 **세 언어 모두** 파이프라인이 구운
   1470×3000 베젤 합성본(`/landing-a/<loc>/*.png`)이라 프레임이 이미지 안에 있다 —
   CSS 로 하나 더 얹으면 ko 에서 문제였던 **이중 프레임**이 en·ja 에서 재발한다.
   🚨 **프레임 없는 샷을 다시 들이지 말 것.** 되살릴 일이 생기면 CSS 가 아니라
      `python3 scripts/app-preview/make-phone-frames.py <loc>` 로 굽는다(치수 계약이 거기 있다). */


/* ══════════════════════════════════════════════════════════════════════════════
   히어로 — 넓은 화면 스크린샷이 주인공이다 (2026-09-12 2·3차, 사용자 요청)
   목업에서 이 이미지는 히어로 폭의 45%(1440 에서 545×409 CSS px)였고 라이브에서
   "너무 작다"는 지적을 받았다. 지금은 **818×614**(가로 1.50배 · 면적 2.25배).

   🚨 **`transform:scale` 로 키우지 말 것** — 래스터가 뭉개진다. 폭은 그리드에서 낸다.
   🚨 **왼쪽 여백은 건드리지 않는다.** 히어로만 오른쪽으로 흘린다
      (`padding-left:max(32px,(100% - 1200px)/2)`). 좌우를 같이 넓히면 히어로 글줄이
      아래 섹션보다 왼쪽에서 시작해 페이지의 왼쪽 선이 깨진다 — 1440 에서 히어로 본문과
      `.features` 눈썹이 **둘 다 x=120** 인지로 잰다.
   🚨 **액자는 잘리지 않는다.** 한때 오른쪽으로 56px 흘려 902px 까지 키웠더니 `오늘 일정`
      레일이 잘리고 폰이 남은 것을 덮어, 정작 가리키려던 것이 안 보였다. 오른쪽 끝에서
      40px 앞에서 끝낸다.
   ⚠️ 패널 높이를 `540px` 로 못 박은 것이 이미지를 가두던 진짜 원인이었다. 이미지를
      절대배치에서 **흐름 안으로** 되돌리고(`height:auto`) 캡션을 그 아래에 뒀다.
   ⚠️ **≤760px 모바일 조판은 손대지 않는다** — 아래 규칙은 전부 `min-width:761px` 안이다.
      바꿨는지는 **390px 전체 높이가 그대로인가**로 잰다(ko 5848 · en 6212 · ja 6135).
   ══════════════════════════════════════════════════════════════════════════════ */
@media(min-width:761px){
  .hero-visual{height:auto;min-height:0;padding:14px 15px 2px;overflow:hidden}
  .visual-top{position:static;margin:4px 6px 11px}
  .wide-hero{position:static;display:block;width:100%;height:auto;border-radius:13px}
  .visual-caption{position:static;margin:13px 6px 14px;border-top:1px solid #cdd7be;
    padding-top:13px;justify-content:space-between;gap:12px}
  /* 🚨 폰은 **이미지 상자(.wide-stage) 기준**이다 — 액자의 오른쪽 **아래 모서리**만 문다.
     레일의 일정 줄(이미지 세로 12~30%)을 덮으면 안 된다. ko 에서는 그 줄이 하이라이트의
     출처이고, en·ja 에서도 거기가 이 그림에서 제일 읽을 것이 많은 자리다.
     ⚠️ `rotate(5deg)` 때문에 바운딩 박스가 위아래로 ~17px 더 나간다 — `bottom:0` 으로 두면
        캡션 줄(`Web · iPhone`)을 덮는다. `bottom:2%` 가 "레일 아래, 액자 안"을 함께 만족한다.
     🚨 **크기는 폭이 아니라 액자 높이로 잰다**(`height:63%`). 📌 2026-09-12 부터 **세 언어가
        모두 4:3**(2752×2064)이라 지금은 px 로 고정해도 결과가 같다 — 그래도 높이 기준을
        유지한다. 종전엔 ko 4:3 · en·ja 16:10 이라 px 고정이면 같은 폰이 짧은 액자에서 73%,
        긴 액자에서 61% 를 차지해 **언어마다 다른 그림**이 됐다. 스크린샷을 다시 갈 때
        비율이 또 갈릴 수 있으므로 이 기준을 되돌리지 말 것. */
  .hero-monthly{display:none}
  .hero-daily{position:absolute;top:auto;bottom:2%;right:-1%;height:63%;width:auto;max-height:400px;
    transform:rotate(5deg);filter:drop-shadow(0 14px 14px #243f302b)}
}
@media(min-width:761px) and (max-width:1000px){
  /* 좁은 데스크톱·태블릿 — 글과 그림을 위아래로 쌓고 그림을 폭 전체로 (768 에서 700px) */
  .hero.wrap{grid-template-columns:1fr;gap:28px}
  .hero-visual{max-width:none;width:auto;margin:0;padding:14px 14px 2px}
  .hero-copy{max-width:620px}
}
@media(min-width:1001px) and (max-width:1100px){
  .hero.wrap{grid-template-columns:minmax(0,.8fr) minmax(0,1.2fr)}
}
@media(min-width:1101px){
  .hero.wrap{width:auto;max-width:none;margin-inline:0;overflow:hidden;
    padding-left:max(32px,calc((100% - 1200px) / 2));padding-right:40px;
    padding-block:30px 40px;
    grid-template-columns:minmax(0,400px) minmax(0,1fr);gap:30px}
  .hero-visual{max-width:1000px;margin-left:auto;padding:16px 16px 2px;border-radius:30px}
  .visual-caption{font-size:13px;margin-top:9px;padding-top:11px}
}

/* ══════════════════════════════════════════════════════════════════════════════
   히어로 하이라이트 — A안 V1 「떠오른 확대」 (2026-09-12 3차, 사용자 채택)
   `<body data-hero="v1">` 가 켠다. 다른 시안(지시선 콜아웃 · 링 스포트라이트)은
   검토에서 탈락해 지우고 V1 만 남겼다. 스위치는 그대로 둬 다음 시안을 붙일 수 있게 한다.

   🚨 **떠 있는 조각은 전부 진짜 DOM 이다.** 래스터를 잘라 키우지 않는다 — 그게 2차에서
      막 걷어낸 그 흐림이다. 2x 화면에서 벡터로 선명하게 서는 것이 이 방식의 전부다.
   🚨 **한 화면은 한 가지 문법만 가르친다.** 한때 범례는 고리로 멀리 보내고 일정 카드는
      출처 위에 얹었더니 둘이 서로 다른 규칙을 말했다. 지금은 **둘 다 "제 출처 옆(아래)에서
      커진다"** 하나다. 생리 잉크로 그린 고리는 이 종잇빛 바탕에서 **오류 표시**처럼 읽혀
      함께 버렸다.
   🚨 **Google 단서는 일정 카드에 붙는다 — 사이드바의 `Google로 로그인` 을 가리키지 않는다.**
      로그인과 구글 캘린더 연동은 **서로 다른 선택 동의**다(`docs/landing.md` · `docs/auth.md`).
      로그인 버튼을 가리키면 "로그인 = 구글 캘린더 연동"으로 읽혀 사실이 아닌 약속이 된다.
      문구도 같은 이유로 `Google 캘린더 일정` 이다 — `자동으로` 류는 쓰지 않는다.
   📌 **2026-09-12 부터 세 언어 전부에 걸린다.** 종전엔 ko 전용이었다 — en·ja 가 다른 비율
      (16:10)의 저해상 샷을 쓰고 있어 같은 좌표가 맞지 않았기 때문이다. 이제 셋 다
      **2752×2064 같은 한 장의 기하**이고(`docs/landing.md` 「en·ja 재촬영」) 액자도 세 판
      모두 818×614 로 똑같이 선다(실측).
   🚨 좌표는 **이미지 상자(.wide-stage) 기준 백분율**이다. 스크린샷을 갈아 끼우면 전부
      다시 재야 한다 — 재는 법은 `docs/landing.md` 의 그 절에 적어 뒀다(앱을 1376×1032 로
      띄워 DOM bbox 를 스테이지 백분율로 환산).
   🚨 **가리키는 자리(출처)는 언어마다 다르다 — 낱말 길이가 달라 범례가 좌우로 움직인다.**
      실측(앱 렌더 1376×1032 → 스테이지 %):
        범례 pills   ko x 55.6~72.4% · en x 47.9~72.4% · ja x 51.8~72.4%   y 21.5~24.8% (셋 다)
        17일 칸       세 언어 **동일** x 41.8~49.2% · y 57.0~70.5%
        레일 09:00 줄 세 언어 **동일** x 75.9~79.4% · y 10.3~12.0%
      → 그래서 **범례 카드만 `html:lang()` 으로 가른다.** 일정 카드는 칸이 세 언어 같으므로
        한 값을 공유한다(언어별로 갈라 두면 같은 값을 세 번 적게 된다).
   ⚠️ 달력 한가운데의 **내용**을 덮지 않는다. 17일 칸의 일정 목록이 곧 카드가 확대하는
      원본이라 그 목록 아래에서 시작한다.
   🚨 **떠 있는 카드가 제 출처를 덮으면 안 된다.** en 의 `Period/Follicular/Ovulation/Luteal`
      은 한 줄로 펴면 440px(스테이지의 54%)라, ko 와 같은 `left:11%` 에 두면 오른쪽 끝이
      실제 범례(47.9%) 위로 올라탄다 — 확대해 보여주려던 것을 가리는 셈이다. 글자를 줄여
      맞추는 안은 **10px 대까지 내려가** 이 페이지의 최소 글자보다 작아져 기각했다.
      📌 그래서 한때 en·ja 를 2×2 로 접었는데, **2026-09-12 사용자 지정으로 세 언어 전부
      한 줄**이다. en·ja 는 출처 줄 옆이 아니라 **바로 아래**에 서고 부리가 위를 본다
      (아래 `html:lang(en|ja) .hl-legend-float` 절). ko 는 종전대로 옆에 선다.
   ══════════════════════════════════════════════════════════════════════════════ */
:root{
  --ph-m-ink:#993556; --ph-m-tile:#FBEAF0;   /* 생리 */
  --ph-f-ink:#085041; --ph-f-tile:#E1F5EE;   /* 난포 */
  --ph-o-ink:#854F0B; --ph-o-tile:#FAEEDA;   /* 배란 */
  --ph-l-ink:#3C3489; --ph-l-tile:#EEEDFE;   /* 황체 */
  --hl-ink:#25352F;                          /* 브랜드 잉크 */
  --hl-lift:0 20px 40px rgba(28,52,42,.19), 0 3px 8px rgba(28,52,42,.10);
  --hl-hair:1px solid rgba(37,53,47,.11);
}
.wide-stage{position:relative;display:block;line-height:0}
/* 🚨 글꼴은 **물려받는다** — 여기서 `'Noto Sans KR'` 를 박으면 en·ja 오버레이만 한국어
   글꼴로 그려진다(`:root` 는 KR 이고 `html:lang(en)`/`html:lang(ja)` 가 그것을 덮는다.
   `.hl` 에 박아 두면 그 덮어쓰기를 지나쳐 버린다). */
.hl{position:absolute;z-index:3;line-height:1.5;word-break:keep-all;display:none;
  font-family:inherit}
body[data-hero="v1"] .hl-v1{display:block}
/* 한 번만 스며든다. 그 밖의 움직임은 없다. */
body[data-hero] .hl{opacity:0;animation:hlIn .5s ease .35s forwards}
@keyframes hlIn{to{opacity:1}}
@media(prefers-reduced-motion:reduce){
  body[data-hero] .hl{opacity:1;animation:none}
}

/* 범례 — 앱의 phase 토큰과 이모지 그대로 (`components/web/Landing.tsx` LOGO_INKS/LOGO_TILES) */
.ph-pills{display:flex;gap:5px}
.ph-pill{display:inline-flex;align-items:center;gap:6px;padding:5px 11px 6px;
  border-radius:999px;font-size:13px;font-weight:650;white-space:nowrap}
.ph-pill i{font-style:normal;font-size:12px;line-height:1}
.ph-m{background:var(--ph-m-tile);color:var(--ph-m-ink)}
.ph-f{background:var(--ph-f-tile);color:var(--ph-f-ink)}
.ph-o{background:var(--ph-o-tile);color:var(--ph-o-ink)}
.ph-l{background:var(--ph-l-tile);color:var(--ph-l-ink)}
/* 🚨 **두 카드는 한 식구다** — radius·padding·부리(nub)가 같아야 "같은 문법"으로 읽힌다.
   종전엔 범례 16px/11·13 · 일정 12px/10·12·11 로 미묘하게 달라 둘이 서로 다른 종류의
   요소처럼 보였다. 값은 `.hl-card` 한 줄이 지고, 아래 두 선택자는 위치만 말한다. */
.hl-legend-float,.ev-card{border-radius:14px;padding:11px 13px;
  background:#fff;box-shadow:var(--hl-lift);border:var(--hl-hair)}
/* ── 부리(nub) — "이건 저기서 온 것이다"를 말하는 유일한 장치 ──────────────────
   🚨 **가리키는 대상은 카드마다 다르다**: 범례는 **오른쪽 변**에서 제 출처 줄
      (스테이지 y 21.5~24.8%)을, 일정은 **위쪽 변**에서 17일 칸의 가로 한가운데(45.5%)를.
   ⚠️ 그림자를 물려받지 않는다(부모의 `box-shadow` 는 부모 상자에만 걸린다) — 그래서
      테두리 두 변만 그려 카드에서 자라난 것처럼 보이게 한다. 네 변을 다 그리면 카드에
      붙은 별개의 마름모가 된다.
   ⚠️ **`top`/`left` 는 카드 기준 px·%** 다. 카드가 px 크기라 스테이지가 줄어도 부리와
      카드의 관계는 그대로다. 스테이지 대비 위치만 조금 움직이고, 그 범위는 떠 있는 조각이
      보이는 1101~1440 뿐이다(아래 검사에서 두 끝을 다 잰다). */
.hl-legend-float::after,.ev-card::after{content:'';position:absolute;
  width:11px;height:11px;background:#fff;transform:rotate(45deg)}
/* 범례: **위쪽 변** — 세 언어 공통(2026-09-13 ko 도 합류). x 는 언어별(아래 위치 절). */
.hl-legend-float::after{top:-6px;
  border-top:var(--hl-hair);border-left:var(--hl-hair)}
/* 일정: 위쪽 변 · 카드 폭의 41.7% = 스테이지 45.5%(17일 칸 가운데) */
.ev-card{position:relative}
.ev-card::after{top:-6px;left:calc(41.7% - 5.5px);
  border-top:var(--hl-hair);border-left:var(--hl-hair)}
/* 🚨 **세 언어 모두 출처 줄 *바로 아래*에 선다** (en·ja 2026-09-12 · ko 2026-09-13 "나머지 언어도
   마찬가지로"). 종전 ko 는 범례 **옆**(11%/20.8%, 오른쪽 부리)이었다 — 한 줄 333px 가 출처 앞에
   들어갔기 때문인데, 세 판의 문법이 갈려 있었다. 지금은 top 27.5% 공통, left 만 언어별.
   ⚠️ ko 카드(311px·38%)는 en 보다 좁아 왼쪽을 20.5% 에 맞추면 부리가 첫 칩(`생리` 57.7%)에
      못 닿는다(카드 오른쪽 끝 58.5%). 그래서 ko 는 **오른쪽 끝을 en 과 같은 71.3% 에** 맞춘다
      (left 33.3%) — 세 판의 오른쪽 변이 같고 부리 x 는 카드 폭의 65.5%. */
.hl-legend-float{top:27.5%}
html:lang(ko) .hl-legend-float{left:33.3%}
html:lang(ko) .hl-legend-float::after{left:calc(65.5% - 5.5px)}
/* 🚨 **en·ja 는 한 줄 그대로 출처 줄 *바로 아래*에 선다** (2026-09-12 사용자 지정 — 2×2 폐기).
   한 줄 en 은 무대의 54% 라 옆(ko 방식)에 두면 제 출처(47.9%~)를 덮고, 글자를 줄이는 안은
   위에서 기각됐다. 그래서 출처 줄(y 21.5~24.8%) 밑 26.3% 에 두고 **부리를 위쪽 변으로**
   옮겨 출처의 첫 칩(en `Period` 가운데 50.5% · ja `生理` 가운데 54.5%)을 가리킨다 —
   일정 카드와 같은 문법이다. 덮는 것은 요일 머리와 첫 주 칸의 위쪽(2×2 가 덮던 자리와 같다).
   🚨 **달력 카드의 테두리와 겹치게 두지 말 것** (2026-09-12 사용자 지적). 18%/26.3% 에서는 카드의
   왼쪽·오른쪽 변이 달력 카드(19.5~72.5%)와 거의 일치해 **달력의 일부**로 읽혔다. 그래서 오른쪽
   ·아래로 옮겨(20%/27.5%) 왼쪽 변은 달력 안쪽으로 4px, 오른쪽 변은 달력 밖(en 73.5%)으로 나가게
   하려다, 오른쪽 끝이 레일 카드(73.7%)에 닿아 보였다. 그래서 pill 의 padding·gap 을 2px 씩 줄여
   카드를 416px(50.9%)로 만들고 20.5% 에 두면 **양쪽이 달력 안쪽으로 8~9px** 들어와 달력 위에
   떠 있는 별개의 카드로 읽힌다(달력 가운데 46% 에 거의 맞는다). 카드 padding 은 못 줄인다 —
   일정 카드와 같은 값이어야 한다(위 「두 카드는 한 식구」).
   부리 x 는 카드 폭 기준 % 라 언어마다 다르다(en 416px · ja ~354px 실측). */
html:lang(en) .hl-legend-float,html:lang(ja) .hl-legend-float{left:20.5%}
html:lang(en) .hl-legend-float::after{left:calc(59% - 5.5px)}
html:lang(ja) .hl-legend-float::after{left:calc(78.5% - 5.5px)}
/* 🚨 ja 만 굵기를 700 으로 못박는다. `:root` 에 `font-synthesis:none` 이 걸려 있고 Noto Sans JP
   는 **400/500/600/700 네 단계만** 불러온다 — 650 을 주면 합성이 막혀 600 으로 주저앉아
   같은 자리의 ko·en 보다 가늘게 보였다(ko 는 Noto Sans KR, en 은 시스템 글꼴이라 650 이 산다). */
html:lang(ja) .ph-pill,html:lang(ja) .ev-title{font-weight:700}

/* 일정 한 줄 + Google 단서 */
.ev-card{width:216px}
.ev-row{display:flex;gap:9px;align-items:flex-start}
/* 🚨 색 막대는 EVENT_COLORS 값이지 phase 잉크가 아니다 — 스크린샷에서 실측한 #973C69.
   phase 토큰(--ph-*)을 일정에 돌려 쓰면 "이 색 = 주기" 라는 약속이 깨진다. */
.ev-bar{width:3px;border-radius:2px;background:#973C69;align-self:stretch;min-height:28px;flex:none}
.ev-time{font-size:11.5px;font-weight:600;color:#66726a;flex:none;padding-top:1px}
.ev-title{display:block;font-size:12.5px;font-weight:650;color:#1b2b24;letter-spacing:0}
.ev-sub{display:block;font-size:11px;color:#5f6b62;margin-top:2px}
.g-chip{display:inline-flex;align-items:center;gap:6px;margin-top:9px;padding:5px 9px 5px 7px;
  background:#f4f7f2;border-radius:999px;font-size:11px;font-weight:600;color:#46554c}
.g-chip svg{flex:none}
/* 🚨 오늘(17일) 칸의 **아래 모서리에 걸쳐** 뜬다. 17일 칸의 일정 목록(세로 59.2~64.2%)은
   덮지 않는다 — 그 목록이 카드가 확대하는 원본이다.
   🚨 **왼쪽 끝은 22일의 일정 줄을 자르지 않아야 한다** (2026-09-12 마감 검수). 종전 `32.2%`
      는 22일 일정 줄(x 27.6~34.1%)을 16px 물었다 — en `Sarah's wedding` 이 잘려 보였다.
      `34.5%` 면 3px 앞에서 멈추고, 카드 오른쪽 끝(60.9%)도 27일 일정 줄(64.7%) 앞에서 끝난다.
      카드 가운데(47.7%)는 여전히 17일 칸(41.8~49.2%) 안이다. 세 언어가 같은 값이다 —
      22·27일 칸과 일정 줄의 좌표가 세 판 모두 같다(실측). */
.hl-event-float{left:34.5%;top:66.5%}

/* ── 접었을 때의 한 줄 ────────────────────────────────────────────────────────
   🚨 **1340 아래에서는 떠 있는 조각을 전부 접는다.** 조각은 **px 고정인데 무대는 유동**이다 —
      무대가 좁아질수록 카드가 차지하는 **비율**이 커져 결국 제 출처를 덮는다. 접는 경계는
      그래서 미감이 아니라 **산수**다: ko 범례 카드는 333px 이고 제 출처가 스테이지 55.6%
      에서 시작하므로 `11% + 333/W < 55.55%` → **W > 748px** 이어야 한다.
   ⚠️ **이 경계를 내리지 말 것 — 세 번 옮겼고 그때마다 실측이 이유였다.**
        760  → 768 에서 두 카드가 ~70px, 1024 에서 ~186px 겹쳤다(3차 사고).
        1100 → **여전히 제 출처를 덮고 있었다**(2026-09-12 마감 검수에서 재서 발견).
               실측 en 범례 오른쪽 끝: 1101 에서 57.9% · 1200 에서 51.4% · 1250 에서 48.8%
               (출처 47.9%) / 일정 카드 오른쪽 끝: 1101 에서 72.6%(27일 일정 64.7%).
        1320 → 산수상 첫 통과선이지만 **ko 의 여유가 5px 뿐**이다(오른쪽 끝 54.89% ·
               출처 55.55%). 문구가 한 자 길어지면 바로 닿는다.
        1340 → **채택.** 스테이지 768px 에서 여유 ko 1.23%(9px) · en 1.49% · ja 10.89%.
               1320~1339 의 20px 을 더 접는 대가로 경계에 숨 쉴 틈을 둔다.
   📌 그래서 1101~1339 도 **접힌 한 줄**로 간다. 카드를 무대에 맞춰 줄이는 안은 글자가
      10px 대로 내려가 기각했다(위 `.ph-pills` 분기와 같은 이유).
   ⚠️ 접힌 한 줄은 **액자의 일부**로 읽혀야 한다. 흰 바탕 위에 그냥 놓으면 캡션이 아니라
      본문으로 읽힌다 — 그래서 패널 아래에 색을 이어 붙이고 패널의 아래 모서리를 넘겨받는다. */
.hl-strip{display:none;margin:0;gap:9px 22px;flex-wrap:wrap;padding:0;
  font-size:12.5px;color:#5c6860;word-break:keep-all}
.hl-strip li{display:flex;align-items:center;gap:8px;list-style:none}
.hl-strip .dot{width:6px;height:6px;border-radius:999px;background:#8fa383;flex:none}
/* ── 출처 링 — 원본 범례 줄을 얇은 알약 테두리로 감싼다 (2026-09-13 사용자 결정, 3안) ──
   범례 카드의 부리가 "어디서 왔는지"를 말했다면, 이 링은 **무엇이 확대됐는지**를 말한다.
   시안 셋(부리만 · 밑줄 · 링) 중 링 — 밑줄은 앱 화면의 구분선처럼 읽혀 기각.
   🚨 좌표는 **이미지 상자 기준 %** 이고 **언어마다 다르다** — 범례 줄 x 가 낱말 길이를 따라
      움직인다(ko 55.6~72.4 · en 47.9~72.4 · ja 51.8~72.4, y 21.5~24.8 공통. 위 좌표 절).
      칩 바깥으로 x 0.7% · y 0.6% 여유. 색·굵기는 카드 헤어라인과 같은 잉크 계열.
   ⚠️ `.hl` 과 같은 조건으로만 보인다 — 등장 페이드 동일, 1340 미만에서는 함께 접힌다. */
.wide-stage::after{content:'';position:absolute;z-index:2;pointer-events:none;display:none;
  top:20.9%;height:4.9%;border:1.5px solid rgba(37,53,47,.38);border-radius:999px}
body[data-hero="v1"] .wide-stage::after{display:block;opacity:0;animation:hlIn .5s ease .35s forwards}
@media(prefers-reduced-motion:reduce){body[data-hero="v1"] .wide-stage::after{opacity:1;animation:none}}
html:lang(ko) .wide-stage::after{left:54.9%;width:17.8%}
html:lang(en) .wide-stage::after{left:47.1%;width:25.6%}
html:lang(ja) .wide-stage::after{left:51.1%;width:21.6%}
@media(max-width:1339px){
  body[data-hero] .hl{display:none}
  body[data-hero] .wide-stage::after{display:none}
  body[data-hero] .hero-visual{border-bottom-left-radius:0;border-bottom-right-radius:0}
  body[data-hero] .hl-strip{display:flex;padding:12px 20px 14px;
    background:#e9efdf;border-radius:0 0 22px 22px;font-size:12px;gap:7px 16px}
}
@media(max-width:760px){
  .wide-stage{display:contents}
  .hl-strip{max-width:540px;margin-inline:auto}
}

/* ══ QA 스윕 (2026-09-12 저녁 · 서브에이전트 실측, 근거는 docs/landing.md 「2026-09-12 저녁」) ══
   🚨 이 블록은 파일 **맨 끝**에 있어야 한다 — 위의 층층이 쌓인 미디어 블록을 캐스케이드 순서로
   이긴다. 규칙마다 실측 근거가 있으니 옮기거나 위 블록에 합치지 말 것. */
/* 워드마크가 언어마다 다른 글꼴(en 시스템·ko Noto KR·ja Noto JP, 폭 47.5/51.4/50.3)로 그려졌다 — 락업은 하나여야 한다 */
.logo-word{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Arial,sans-serif}
/* 로고 링크 높이 32px → 44px 탭 타겟(레이아웃 불변) */
.logo{padding-block:6px}
/* 한글 라벨엔 자간을 걸지 않는다(CLAUDE.md 「Korean Typography」) — 눈썹 6곳이 +.015em 이었다 */
html:lang(ko) .eyebrow{letter-spacing:0}
/* 좌측선 — mid-cta 가 페이지 선(120)에서 5px 벗어나 있었다 */
.mid-cta{padding-inline:0}
/* 카드 안쪽 선 — feature-card 158 vs monthly-feature 160 (2px). 40 으로 통일 */
@media(min-width:1101px){.feature-card .feature-copy{padding-inline:40px}}
/* 44px 탭 타겟 — 푸터 링크 20px, 안드로이드 한 줄 링크 17px, 모바일 고정바의 iPhone 링크 22px */
.footer-links a,.footer-bottom a{padding-block:12px;margin-block:-12px}
.android-note a{display:inline-block;padding-block:8px;margin-block:-8px}
/* 801~1100: nav 링크가 13px 인데 언어 메뉴만 14px 로 커져 있었다(1440 의 지적이 거꾸로 재발) */
@media(max-width:1100px){.language-menu>summary{font-size:13px}}
/* 761~800: en·ja h1 이 모바일용 clamp 에 잡혀 49/43px(ko 는 34) — ja 는 낱말 중간에서 꺾였다.
   같은 구간의 히어로 CTA 세로 쌓기(폭 불일치)도 뺀다 — 한 줄에 들어간다(~300 vs 620px). */
@media(min-width:761px) and (max-width:800px){html:lang(en) .hero h1,html:lang(ja) .hero h1{font-size:34px}.hero .cta-group{flex-direction:row;align-items:center}}
/* ≤800 intro 줄: en 12 · ko 14 · ja 11 로 갈렸다(뒤에 오는 무조건 14px 이 ≤800 12px 을 덮었다). 셋 다 12. */
@media(max-width:800px){.intro-strip,html:lang(en) .intro-strip,html:lang(ja) .intro-strip{font-size:12px}}
@media(max-width:370px){.intro-strip,html:lang(en) .intro-strip,html:lang(ja) .intro-strip{font-size:11px}}
/* ≤760: 같은 "웹에서 시작하기" 버튼이 한 페이지에 13/14/15px 세 크기 — 14 로 통일. intro 링크·iPhone 링크 탭 타겟 */
@media(max-width:760px){.mid-cta .button,.closing .button{font-size:14px}.intro-strip a{padding-block:4px}.mobile-cta>a:last-child{padding:11px 4px}}
/* 761~1100: 카드 안쪽 선이 feature-card 가 monthly-feature 보다 3px 안쪽(1024: 61 vs 64 · 768: 49 vs 52) */
@media(min-width:761px) and (max-width:1100px){.feature-card .feature-copy{padding-inline:32px}}
/* 761~800: mid-cta 버튼만 15px(다른 시작 버튼 14) */
@media(max-width:800px){.mid-cta .button{font-size:14px}}
/* 2026-09-14 en 홈 → /period-planner 문맥 링크(FEATURE 「Monthly calendar · Cycle tracking」 설명 뒤). ko·ja 는 아직 안 쓴다. */
.feature-copy .feature-link{font-size:14px!important;margin-top:16px!important}
.feature-link a{color:var(--green);text-decoration:underline;text-underline-offset:3px;padding-block:12px;margin-block:-12px}
.feature-link a:hover{color:var(--green-hover)}

/* ── 강조색 — 영어판 시범 (2026-09-14 사용자 선택, B안 「라임 마커」) ──────────────────
   히어로 h1 둘째 줄의 올리브 글자색(#6e8150, 종이 위 4.15:1)이 "칙칙하다"는 지적. 마무리 카드
   (`.closing` #e8eecb · `--yellow` #dee89a)의 라임 계열이 낫다고 골라, 같은 색상의 진한 잉크
   (`--accent-ink`)를 **글자색**으로 쓴다. 📌 처음엔 노랑 마커 띠(B안)였다가 2026-09-14 사용자 지시로
   글자색(A안)으로 되돌렸다 — 라임은 마무리 카드·선택된 화면 탭의 바탕이기도 하다. 절 눈썹·기능 라벨·FAQ 눈썹의 제각각 올리브(#6e8150·#718162·#788969)도
   같은 계열의 잉크 하나(--accent-ink, 종이 위 4.5:1)로 모은다.
   📌 2026-09-14 세 언어 전면 적용(사용자 승인). 위쪽 원 규칙(h1 em / .section-heading .eyebrow / .faq .eyebrow /
      .feature-label)에서 색은 지웠고 **여기 한 곳이 정본**이다. */
:root{--accent-ink:#6b7c24;--accent-tile:#e8eecb;--accent:#dee89a}
h1 em{color:var(--accent-ink)}
/* ja 히어로 h1 — 1101~1440 에서 글 열이 400px 인데 43px×10자(予定も、生理周期も。)가 410px 라 `も。` 만 둘째 줄로 떨어졌다
   (2026-09-14 사용자 지적, 라이브에서도 3줄). 39px 상한이면 372px 로 들어간다. 1100 이하는 기존 34px 규칙이 이긴다. */
html:lang(ja) h1{font-size:clamp(30px,2.75vw,39px)}
.section-heading .eyebrow,.faq .eyebrow,.feature-label{color:var(--accent-ink)}
/* ja 히어로 본문 — 종전 문안은 셋째 `<br>` 을 숨겨 두 줄로 흘렸는데, 2026-09-14 사용자 지정 문안은
   세 줄 조판(今日のToDoから… / 予定や日々の習慣を整えながら、 / 生理周期の流れも一緒に確認できます。)이다. */
html:lang(ja) .hero-desc br:last-child{display:initial}

/* ── 언어 안내 줄 (2026-09-18) — React 판 `.kl-lsug` 를 A안 토큰으로 옮긴 것 ─────────
   마크업은 `app.js` 가 만든다(세 HTML 에는 높이 0 짜리 `.lsug-anchor` 만 있다). 규칙 정본은
   `docs/deployment.md` 「언어 안내 줄」 · 근거 주석은 `components/web/Landing.tsx` 의 `.kl-lsug`.
   📌 자리 = **헤더 바로 아래, 오른쪽 끝**(구글 "Google.com offered in: …" 의 관례 자리).
   ⚠️ 흐름에 끼우지 않는다 — 앵커가 `height:0` 이라 이 줄이 떠도 랜딩은 1px 도 안 밀린다.
      흐름에 끼우면 그 밀림이 **브라우저 언어에 따라 어떤 방문자에게만** 일어난다(재현이
      어렵고 기존 조판 검증도 못 잡는다).
   ⚠️ `fixed` 가 아니라 `absolute` 다 — 헤더와 함께 스크롤돼 사라진다. 안내는 첫 화면에서
      보이면 충분하고, 그 뒤는 푸터 언어 줄이 맡는다.
   🚨 z-index 는 **10** 이다 — React 판(30)과 다른 이유는 A안 헤더가 `position:sticky;
      z-index:20` 이라서다. 20 을 넘기면 헤더의 언어 드롭다운이 이 줄 **밑으로** 펼쳐진다.
      아래쪽 `.mobile-cta`(30)와도 겹치지 않는다.
   🚨 **크기는 잰 값이다 — 히어로 padding 이 아니라 "헤더 밑선 ~ 히어로 첫 글자 윗선" 이 기준.**
      A안 히어로는 2열 그리드 + `align-items:center` 라 그 둘이 **다르다**(1280 에서 padding 은
      30 인데 실제 여유는 143 — 글 열이 가운데 정렬돼 내려온다). 실측 여유의 **최솟값**:
        ≥1101 = 95 (1101 에서. 폭이 넓어질수록 커진다)
        761~1100 = **45** (≤1000 에서 글 열이 더 커져 padding 45 가 곧 여유가 된다)
        ≤760 = **32**
      그래서 아래는 **모바일 우선**이다 — 기본이 가장 좁은 곳(밑선 28)이고 `min-width` 로 키운다.
      밑선은 28 / 36 / 50 이라 각각 4 · 9 · 45 를 남긴다. 값을 키우기 전에 반드시 다시 잴 것:
      `node scripts/web-static-locale-suggest-test.js` 의 [G] 가 네 폭에서 그것을 잰다. */
.lsug-anchor{position:relative;height:0}
.lsug{position:absolute;z-index:10;top:2px;right:0;width:max-content;max-width:100%;display:flex;align-items:center;gap:5px;padding:2px 2px 2px 9px;border-radius:999px;background:var(--green);color:var(--paper);font-size:11.5px;line-height:1.35;box-shadow:0 3px 12px #233f352e}
.lsug-t{opacity:.92}
.lsug-go{flex:none;padding:2px 7px;border-radius:999px;background:#fbfcf924;color:var(--paper);font-weight:600;white-space:nowrap}
.lsug-go:hover{background:#fbfcf93d}
/* 누르는 면을 글리프보다 크게 — 아이콘 단독 버튼의 규칙(CLAUDE.md 그 절). */
.lsug-x{flex:none;display:flex;align-items:center;justify-content:center;width:22px;height:22px;padding:0;border:0;border-radius:50%;background:transparent;color:var(--paper);opacity:.6;font-size:11px;line-height:1;cursor:pointer}
.lsug-x:hover{opacity:1;background:#fbfcf924}
@media(min-width:761px){.lsug{top:6px;font-size:12px;padding:3px 3px 3px 10px;gap:6px}.lsug-go{padding:2px 8px}.lsug-x{width:24px;height:24px;font-size:12px}}
/* 🚨 **≥1101 에서는 오른쪽이 아니라 왼쪽이다** (2026-09-18, 실측으로 뒤집었다).
   이 구간의 히어로는 2열이고 `.wrap` 도 아니다 — **폭 전체로 터져** 오른쪽 열의 비주얼 카드
   (`.hero-visual`, 연녹 라운드 상자)가 **y=111 에서 시작한다.** 헤더 밑선이 81 이니 오른쪽에
   남는 자리는 **30px 뿐**이고, 40px 짜리 알약을 오른쪽에 세우면 카드 윗변을 20px 덮는다
   (실제로 그랬다 — 1280 스크린샷에서 사용자가 잡았다. 왼쪽 열 h1 만 재던 [G] 는 못 잡았다).
   왼쪽 열은 반대로 **비어 있다**: 글 열이 세로 가운데 정렬이라 h1 윗선이 176(1101)~286(1920)
   이고, 헤더 밑선까지 95~205px 이 빈다. 그래서 `left:0;right:auto` 로 옮겼다.
   🚨 **왼쪽 선은 `.wrap` 이 아니라 히어로의 선이다.** 이 구간의 히어로는 `.wrap` 을 끄고
      `padding-left:max(32px,calc((100% - 1200px)/2))` 로 제 gutter 를 쓴다(위 84행 블록).
      앵커를 `.wrap` 인 채로 두면 배너가 **페이지 선(48)**, h1 은 **히어로 선(32~40)** 이라
      1101~1300 에서 8~16px 어긋난다(실측). 그래서 앵커도 폭 전체로 풀고 `left` 에 **똑같은
      식**을 준다 — 둘의 `100%` 가 다 뷰포트 폭이라 값이 정확히 같아진다(1101·1200=32 ·
      1280=40 · 1300=50 · 1440=120 · 1920=360). 히어로의 그 padding 을 고치면 여기도 함께.
   ⚠️ 1100 이하는 그대로 오른쪽이다 — 거기선 카드가 글 열 아래(1열)이거나 충분히 내려가 있다. */
@media(min-width:1101px){.lsug-anchor{width:auto;max-width:none;margin-inline:0}.lsug{top:10px;left:max(32px,calc((100% - 1200px) / 2));right:auto;font-size:13px;padding:6px 6px 6px 14px;gap:8px;box-shadow:0 6px 22px #233f3533}.lsug-go{padding:4px 11px}.lsug-x{width:28px;height:28px;font-size:13px}}
