:root{
  --ground:#FAF5F7;
  --paper:#FFFFFF;
  --sky-top:#E7EBF4;
  --sky-bottom:#FCF8F0;
  --main:#87A0BD;
  --main-soft:#CED9E8;
  --ink:#323F4F;
  --ink-soft:#627080;
  --accent:#E4B39E;
  --leaf:#8DB487;
  --leaf-dark:#5F8A5B;
  --gold:#D9B46A;
  --line:rgba(135,160,189,.28);
  --font-script:"Great Vibes",cursive;
  --font-display:"Cormorant Garamond",Georgia,serif;
  --font-body:"Jost",system-ui,sans-serif;
  --ease:cubic-bezier(.22,.8,.24,1);
}
*{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth}
body{background:linear-gradient(180deg,var(--sky-top),var(--sky-bottom));background-attachment:fixed;color:var(--ink);font-family:var(--font-body);font-weight:300;line-height:1.7;overflow-x:hidden}
body.is-locked{overflow:hidden;height:100vh}
svg{display:block}
.sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}

/* ===== Shared art ===== */
.cluster{position:absolute;bottom:-6px;width:min(62%,300px);pointer-events:none}
.cluster-left{left:-8%}
.cluster-right{right:-8%;transform:scaleX(-1)}
.sway{transform-origin:50% 100%;animation:sway 6s ease-in-out infinite alternate}
.sway.slow{animation-duration:8s}
.sway.late{animation-delay:-3s}
@keyframes sway{from{transform:rotate(-2.5deg)}to{transform:rotate(2.5deg)}}
.butterfly{position:absolute;width:34px;color:var(--accent);pointer-events:none;animation:flutterPath 14s ease-in-out infinite}
.butterfly .wing{transform-origin:50% 50%;animation:flap .32s ease-in-out infinite alternate}
@keyframes flap{to{transform:scaleX(.35)}}
@keyframes flutterPath{0%{transform:translate(0,0)}25%{transform:translate(60px,-40px)}50%{transform:translate(20px,-90px)}75%{transform:translate(-40px,-50px)}100%{transform:translate(0,0)}}

/* ===== Cover ===== */
.cover{position:fixed;inset:0;z-index:50;overflow:hidden;background:linear-gradient(180deg,var(--sky-top),var(--sky-bottom));display:grid;place-items:center;transition:opacity 1.2s var(--ease) .9s,visibility 0s linear 2.1s}
.cover-stage{position:relative;width:100%;max-width:480px;height:100%;margin:0 auto}
.cover .hill{position:absolute;left:-10%;width:120%;bottom:0;transform:translateY(100%);animation:hillIn 1.6s var(--ease) forwards}
.cover .hill-back{animation-delay:.1s;bottom:18%}
.cover .hill-mid{animation-delay:.3s;bottom:8%}
.cover .hill-front{animation-delay:.5s}
@keyframes hillIn{to{transform:none}}
.cover .sun{position:absolute;top:9%;left:50%;width:180px;height:180px;margin-left:-90px;border-radius:50%;background:radial-gradient(circle,#FFF6E4 0,#FAE8E4 55%,transparent 72%);opacity:0;animation:fadeIn 2s ease .2s forwards}
.cover .arch{position:absolute;left:50%;top:12%;width:min(78%,340px);overflow:visible;transform:translate(-50%,-140%);animation:archDrop 1.5s var(--ease) .7s forwards}

.garland .g-pop{transform-box:fill-box;transform-origin:50% 50%;animation:gPop .7s cubic-bezier(.34,1.56,.64,1) both;animation-delay:calc(1.5s + var(--k,0)*.035s)}
@keyframes gPop{from{opacity:0;scale:0}to{opacity:1;scale:1}}
.garland .wisteria{transform-origin:50% 0;animation:gPop .7s ease both,wisteriaSway 3.6s ease-in-out infinite alternate;animation-delay:calc(1.5s + var(--k,0)*.035s),calc(var(--k,0)*-.4s)}
@keyframes wisteriaSway{from{rotate:-5deg}to{rotate:5deg}}
@keyframes archDrop{to{transform:translate(-50%,0)}}
.cover .cluster{transform:translateY(110%);animation:clusterRise 1.4s var(--ease) forwards}
.cover .cluster-left{animation-delay:1s}
.cover .cluster-right{animation-delay:1.15s;--flip:-1}
@keyframes clusterRise{to{transform:translateY(0) scaleX(var(--flip,1))}}
.cover-text{position:absolute;left:0;right:0;top:27%;text-align:center;display:grid;gap:6px;justify-items:center;padding:0 40px;z-index:3}
.kicker{font-size:11px;letter-spacing:.42em;text-transform:uppercase;color:var(--ink-soft)}
.cover-text .kicker{opacity:0;animation:rise 1s var(--ease) 1.7s forwards}
.script-names{font-family:var(--font-script);font-weight:400;font-size:clamp(54px,15vw,74px);line-height:1;color:var(--ink)}
.script-names .amp{display:block;font-size:.55em;color:var(--accent);margin:2px 0}
.cover-text .script-names>span{display:block;opacity:0;transform:scale(.85);filter:blur(8px);animation:inkIn 1.3s var(--ease) forwards}
.cover-text .script-names>span:nth-child(1){animation-delay:2s}
.cover-text .script-names>span:nth-child(2){animation-delay:2.35s}
.cover-text .script-names>span:nth-child(3){animation-delay:2.7s}
@keyframes inkIn{to{opacity:1;transform:none;filter:none}}
.guest{margin-top:14px;padding:8px 16px;border-radius:16px;background:rgba(255,255,255,.82);box-shadow:0 6px 18px -12px rgba(50,63,79,.5);font-size:13px;color:var(--ink-soft);opacity:0;animation:rise 1s var(--ease) 3.1s forwards}
.guest strong{display:block;font-family:var(--font-display);font-weight:600;font-size:21px;line-height:1.3;color:var(--ink);margin-top:4px}
.btn{display:inline-flex;align-items:center;gap:8px;font-family:var(--font-body);font-size:12px;font-weight:400;letter-spacing:.2em;text-transform:uppercase;text-decoration:none;color:var(--paper);background:var(--main);border:0;border-radius:999px;padding:13px 26px;cursor:pointer;box-shadow:0 8px 20px -10px rgba(50,63,79,.55);transition:transform .3s var(--ease),background .3s}
.btn:hover{background:var(--accent);transform:translateY(-2px)}
.btn:focus-visible{outline:2px solid var(--ink);outline-offset:3px}
.btn-ghost{background:transparent;color:var(--main);border:1px solid var(--main);box-shadow:none}
.btn-ghost:hover{background:var(--main);color:var(--paper)}
.cover .btn{margin-top:16px;opacity:0;animation:rise 1s var(--ease) 3.4s forwards,pulse 2.4s ease-in-out 4.6s infinite}
@keyframes pulse{50%{box-shadow:0 0 0 10px rgba(135,160,189,.15),0 8px 20px -10px rgba(50,63,79,.55)}}
@keyframes rise{from{opacity:0;transform:translateY(18px)}to{opacity:1;transform:none}}
@keyframes fadeIn{to{opacity:1}}
.petals{position:absolute;inset:0;width:100%;height:100%;pointer-events:none;z-index:4}

/* Opening transition: flowers part, gate zooms through */
.cover.is-open{opacity:0;visibility:hidden;pointer-events:none}
.cover.is-open .cluster-left{animation:none;transform:translate(-120%,10%);transition:transform 1.3s var(--ease)}
.cover.is-open .cluster-right{animation:none;transform:translate(120%,10%) scaleX(-1);transition:transform 1.3s var(--ease)}
.cover.is-open .arch{animation:none;transform:translate(-50%,0) scale(3.2);opacity:0;transition:transform 1.6s var(--ease) .2s,opacity 1.2s ease .5s}
.cover.is-open .cover-text{opacity:0;transform:translateY(-30px);transition:opacity .6s ease,transform .8s var(--ease)}
.cover.is-open .hill{animation:none;transform:translateY(40%);transition:transform 1.4s var(--ease)}


/* ===== Grand scene after opening ===== */
.scene{position:relative;height:100vh;min-height:640px;max-height:980px;overflow:hidden;padding:0;background:#E5EAF4}
.scene-art{position:absolute;inset:0;width:100%;height:100%}
.scene .layer{transform-box:fill-box;transform-origin:50% 100%}
.scene.is-playing .scene-art{animation:kenBurns 14s ease-out both}
@keyframes kenBurns{from{transform:scale(1.18) translateY(3%)}to{transform:none}}
.scene.is-playing .s-sun{animation:sunRise 2.4s var(--ease) both}
@keyframes sunRise{from{transform:translateY(120px);opacity:0}to{transform:none;opacity:1}}
.s-rays{transform-box:fill-box;transform-origin:50% 50%;animation:spin 50s linear infinite}
.cloud{animation:drift 26s linear infinite}
.cloud.c2{animation-duration:34s;animation-delay:-12s}
.cloud.c3{animation-duration:40s;animation-delay:-25s}
@keyframes drift{from{transform:translateX(-160px)}to{transform:translateX(560px)}}
.scene.is-playing .s-hills{animation:hillIn 1.6s var(--ease) .2s both}
.scene.is-playing .s-house{animation:houseRise 2.2s var(--ease) .5s both}
@keyframes houseRise{from{transform:translateY(90px) scale(.86);opacity:0}60%{opacity:1}to{transform:none;opacity:1}}
.win{fill:#E7ECF3}
.scene.is-playing .win{animation:lightUp 1s ease both;animation-delay:calc(2.2s + var(--w,0)*.12s)}
@keyframes lightUp{to{fill:#FCE3A8}}
.s-flag{transform-box:fill-box;transform-origin:0 50%;animation:flagWave 1.6s ease-in-out infinite alternate}
@keyframes flagWave{from{transform:skewY(-6deg) scaleX(.92)}to{transform:skewY(6deg)}}
.scene.is-playing .s-cypress{animation:grow 1.4s var(--ease) both;animation-delay:var(--g,1.2s)}
@keyframes grow{from{transform:scaleY(0)}to{transform:none}}
.scene.is-playing .s-lawn{animation:fadeIn 1.2s ease .9s both}
.s-path{transform-box:fill-box;transform-origin:50% 0}
.scene.is-playing .s-path{animation:pathIn 1.6s var(--ease) 1.3s both}
@keyframes pathIn{from{transform:scaleY(0)}to{transform:none}}
.scene.is-playing .s-hedge-l{animation:hedgeL 1.5s var(--ease) 1.5s both}
.scene.is-playing .s-hedge-r>g{animation:hedgeL 1.5s var(--ease) 1.5s both}
@keyframes hedgeL{from{transform:translateX(-180px);opacity:0}to{transform:none;opacity:1}}
.scene.is-playing .s-fountain{animation:houseRise 1.8s var(--ease) 1.9s both}
.jet{fill:none;stroke:#C9E7F6;stroke-linecap:round;stroke-dasharray:14 10;opacity:0}
.scene.is-playing .jet{animation:fadeIn .8s ease 3s forwards,flow .9s linear infinite}
@keyframes flow{to{stroke-dashoffset:-24}}
.drop{fill:#DDF1FB;opacity:0}
.scene.is-playing .drop{animation:dropFall 1.4s ease-in infinite;animation-delay:calc(3s + var(--k,0)*.23s)}
@keyframes dropFall{0%{opacity:0;transform:translateY(0)}15%{opacity:1}100%{opacity:0;transform:translateY(46px)}}
.ripple{fill:none;stroke:#FFFFFF;stroke-width:1.2;opacity:0;transform-box:fill-box;transform-origin:50% 50%}
.scene.is-playing .ripple{animation:ripple 2.4s ease-out infinite;animation-delay:calc(3s + var(--k,0)*.8s)}
@keyframes ripple{from{transform:scale(.2);opacity:.9}to{transform:scale(1.2);opacity:0}}
.scene.is-playing .s-front-l{animation:hedgeL 1.6s var(--ease) 2.3s both}
.scene.is-playing .s-front-r>g{animation:hedgeL 1.6s var(--ease) 2.3s both}
.bird{fill:none;stroke:#627080;stroke-width:1.6;stroke-linecap:round;opacity:0}
.scene.is-playing .bird{animation:birdFly 16s linear infinite;animation-delay:calc(2.5s + var(--k,0)*1.1s)}
@keyframes birdFly{0%{opacity:0;transform:translate(-60px,0)}8%{opacity:1}50%{transform:translate(260px,-40px)}92%{opacity:1}100%{opacity:0;transform:translate(560px,-10px)}}
.bird path{animation:birdFlap .5s ease-in-out infinite alternate;transform-box:fill-box;transform-origin:50% 100%}
@keyframes birdFlap{to{transform:scaleY(.3)}}
.sparkle{fill:#FFFFFF;opacity:0;transform-box:fill-box;transform-origin:50% 50%}
.scene.is-playing .sparkle{animation:twinkle 2.6s ease-in-out infinite;animation-delay:calc(2.8s + var(--k,0)*.37s)}
@keyframes twinkle{0%,100%{opacity:0;transform:scale(.3) rotate(0)}50%{opacity:1;transform:scale(1) rotate(45deg)}}

.scene-fly{position:absolute;width:30px;opacity:0;pointer-events:none;z-index:3}
.scene.is-playing .scene-fly{animation:flyA 18s ease-in-out infinite;animation-delay:var(--fd,3s)}
.scene.is-playing .scene-fly.f2{animation-name:flyB;animation-duration:22s}
.scene.is-playing .scene-fly.f3{animation-name:flyC;animation-duration:20s}
@keyframes flyA{0%{opacity:0;transform:translate(-40px,0) rotate(10deg)}6%{opacity:1}25%{transform:translate(120px,-80px) rotate(-8deg)}50%{transform:translate(220px,30px) rotate(12deg)}75%{transform:translate(320px,-60px) rotate(-6deg)}94%{opacity:1}100%{opacity:0;transform:translate(460px,-20px) rotate(8deg)}}
@keyframes flyB{0%{opacity:0;transform:translate(40px,0) rotate(-10deg)}6%{opacity:1}30%{transform:translate(-110px,-60px) rotate(8deg)}55%{transform:translate(-220px,40px) rotate(-12deg)}80%{transform:translate(-300px,-50px) rotate(6deg)}94%{opacity:1}100%{opacity:0;transform:translate(-420px,0) rotate(-8deg)}}
@keyframes flyC{0%{opacity:0;transform:translate(0,40px)}8%{opacity:1}30%{transform:translate(70px,-90px)}55%{transform:translate(-50px,-170px)}80%{transform:translate(40px,-260px)}94%{opacity:1}100%{opacity:0;transform:translate(-20px,-340px)}}

.scene-text{position:absolute;left:0;right:0;top:7%;z-index:4;text-align:center;display:grid;justify-items:center;gap:4px;padding:0 24px}
.scene-text>*{opacity:0}
.scene.is-playing .scene-text .kicker{animation:rise 1.2s var(--ease) 3.2s both}
.scene.is-playing .scene-text .script-names{animation:inkIn 1.6s var(--ease) 3.5s both}
.scene.is-playing .scene-text .scene-date{animation:rise 1.2s var(--ease) 4.1s both}
.scene-text .script-names{font-size:clamp(50px,14vw,68px);text-shadow:0 2px 18px rgba(255,255,255,.9)}
.scene-text .script-names .amp{display:inline;margin:0 6px}
.scene-date{display:flex;align-items:center;gap:12px;font-size:13px;letter-spacing:.3em;color:var(--ink)}
.scene-date::before,.scene-date::after{content:"";width:36px;height:1px;background:var(--ink-soft)}
.scroll-cue{position:absolute;left:50%;bottom:22px;z-index:4;width:26px;height:42px;margin-left:-13px;border:1.5px solid var(--paper);border-radius:14px;opacity:0}
.scroll-cue::after{content:"";position:absolute;left:50%;top:8px;width:4px;height:8px;margin-left:-2px;border-radius:2px;background:var(--paper);animation:cue 1.6s ease-in-out infinite}
.scene.is-playing .scroll-cue{animation:fadeIn 1s ease 5s both}
@keyframes cue{50%{transform:translateY(12px);opacity:.3}}

/* ===== Page ===== */
.page{max-width:480px;margin:0 auto;background:var(--ground);position:relative;box-shadow:0 0 60px -20px rgba(50,63,79,.25);overflow:hidden}
section{position:relative;padding:96px 30px;text-align:center;overflow:hidden}
h2{font-family:var(--font-display);font-weight:400;font-size:38px;line-height:1.15;margin:8px 0 18px}
h2 em{font-family:var(--font-script);font-style:normal;font-size:1.3em;color:var(--main)}
p{color:var(--ink-soft);font-size:15px}
.divider{width:120px;margin:14px auto;color:var(--main)}

[data-anim]{opacity:0;transition:opacity 1.1s var(--ease),transform 1.1s var(--ease),filter 1.1s var(--ease);transition-delay:var(--d,0s)}
[data-anim="up"]{transform:translateY(40px)}
[data-anim="left"]{transform:translateX(-50px)}
[data-anim="right"]{transform:translateX(50px)}
[data-anim="zoom"]{transform:scale(.82)}
[data-anim="blur"]{filter:blur(10px);transform:translateY(12px)}
[data-anim].is-visible{opacity:1;transform:none;filter:none}

.corner{position:absolute;width:130px;color:var(--accent);pointer-events:none}
.corner-tl{top:-10px;left:-14px}
.corner-tr{top:-10px;right:-14px;transform:scaleX(-1)}
.corner-bl{bottom:-10px;left:-14px;transform:scaleY(-1)}
.corner-br{bottom:-10px;right:-14px;transform:scale(-1,-1)}
.parallax{will-change:transform}

/* Verse */
.verse-frame{position:relative;padding:70px 26px 54px;border:1px solid var(--line);border-radius:200px 200px 24px 24px;background:var(--paper)}
.verse-frame p.quote{font-family:var(--font-display);font-style:italic;font-size:19px;line-height:1.55;color:var(--ink)}
.verse-frame .source{margin-top:16px;font-size:13px;letter-spacing:.12em;color:var(--main)}

/* Couple */
.person{display:grid;justify-items:center;gap:4px}
.ring{position:relative;width:200px;height:200px;margin-bottom:12px}
.ring svg{position:absolute;inset:0;width:100%;height:100%}
.ring .wreath{animation:spin 60s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}
.ring .portrait{position:absolute;inset:30px;border-radius:50%;display:grid;place-items:center;background:linear-gradient(160deg,var(--main-soft),#F6E4DE);font-family:var(--font-script);font-size:64px;color:var(--paper)}
.person h3{font-family:var(--font-display);font-weight:600;font-size:27px;line-height:1.2}
.person small{color:var(--ink-soft);font-size:13px}
.person a{margin-top:6px;font-size:13px;color:var(--main);text-decoration:none}
.person a:hover{text-decoration:underline}
.amp-big{font-family:var(--font-script);font-size:64px;color:var(--accent);margin:26px 0}

/* Save the date */
.countdown{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin:26px 0}
.countdown div{background:var(--paper);border:1px solid var(--line);border-radius:999px 999px 16px 16px;padding:18px 4px 12px}
.countdown b{display:block;font-family:var(--font-display);font-weight:600;font-size:30px;line-height:1.1}
.countdown span{font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--main)}
.rumi{font-family:var(--font-display);font-style:italic;font-size:19px;color:var(--ink);margin-top:6px}

/* Events */
.tabs{display:inline-flex;gap:6px;padding:5px;margin:22px 0 4px;border-radius:999px;background:var(--paper);border:1px solid var(--line)}
.tab{font:inherit;font-size:12px;letter-spacing:.1em;text-transform:uppercase;white-space:nowrap;border:0;border-radius:999px;padding:9px 14px;background:transparent;color:var(--ink-soft);cursor:pointer;transition:background .3s,color .3s}
.tab[aria-selected="true"]{background:var(--main);color:var(--paper)}
.tab:focus-visible{outline:2px solid var(--main);outline-offset:2px}
.event-card{margin-top:18px;background:var(--paper);border:1px solid var(--line);border-radius:160px 160px 22px 22px;padding:56px 22px 30px;animation:cardIn .7s var(--ease)}
@keyframes cardIn{from{opacity:0;transform:translateY(18px) scale(.97)}to{opacity:1;transform:none}}
.event-card h3{font-family:var(--font-script);font-weight:400;font-size:46px;line-height:1;color:var(--main)}
.event-date{display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:14px;margin:20px 0}
.event-date span{font-size:13px;letter-spacing:.2em;text-transform:uppercase;color:var(--ink-soft)}
.event-date span:first-child{text-align:right;border-bottom:1px solid var(--line);padding-bottom:4px}
.event-date span:last-child{text-align:left;border-bottom:1px solid var(--line);padding-bottom:4px}
.event-date b{font-family:var(--font-display);font-weight:600;font-size:52px;line-height:1;color:var(--ink)}
.event-card .time{font-size:15px;color:var(--ink)}
.event-card .place{margin-top:12px}
.event-card .place strong{display:block;font-weight:500;color:var(--ink)}
.event-card .btn{margin-top:18px}

/* Story */
.story{position:relative;display:grid;gap:30px;margin-top:30px;text-align:left}
.story::before{content:"";position:absolute;left:11px;top:6px;bottom:6px;width:1px;background:var(--line)}
.chapter{position:relative;padding-left:40px}
.chapter::before{content:"";position:absolute;left:4px;top:8px;width:15px;height:15px;border-radius:50%;background:var(--paper);border:2px solid var(--accent)}
.chapter h3{font-family:var(--font-display);font-style:italic;font-weight:500;font-size:23px;color:var(--ink)}
.chapter small{display:block;font-size:11px;letter-spacing:.2em;text-transform:uppercase;color:var(--main)}

/* Video */
.video{position:relative;aspect-ratio:9/12;margin-top:26px;border-radius:180px 180px 22px 22px;overflow:hidden;border:6px solid var(--paper);box-shadow:0 18px 40px -24px rgba(50,63,79,.6);background:var(--main-soft)}
.video img,.video iframe{position:absolute;inset:0;width:100%;height:100%;border:0;object-fit:cover}
.video-play{position:absolute;inset:0;width:100%;border:0;background:rgba(50,63,79,.25);cursor:pointer;display:grid;place-items:center;transition:background .3s}
.video-play:hover{background:rgba(50,63,79,.1)}
.video-play:focus-visible{outline:2px solid var(--paper);outline-offset:-8px}
.video-play span{width:70px;height:70px;border-radius:50%;background:var(--paper);color:var(--main);font-size:24px;display:grid;place-items:center;padding-left:4px;animation:pulse 2.4s ease-in-out infinite}

/* Gift */
.gift{margin-top:22px;background:var(--paper);border:1px solid var(--line);border-radius:22px;padding:26px 22px;position:relative;overflow:hidden}
.gift::after{content:"";position:absolute;right:-30px;top:-30px;width:110px;height:110px;border-radius:50%;background:var(--main-soft);opacity:.5}
.gift h3{font-family:var(--font-display);font-weight:600;font-size:22px;position:relative}
.gift .number{font-size:22px;letter-spacing:.14em;color:var(--ink);margin:6px 0 2px;position:relative}
.gift .btn{margin-top:14px;position:relative}

/* Wishes */
.rsvp{display:grid;gap:14px;margin-top:22px;text-align:left;background:var(--paper);border:1px solid var(--line);border-radius:22px;padding:24px 20px}
.rsvp label{display:grid;gap:4px;font-size:13px;color:var(--ink-soft)}
.rsvp input,.rsvp select,.rsvp textarea{width:100%;font:inherit;font-size:15px;color:var(--ink);background:var(--ground);border:1px solid var(--line);border-radius:12px;padding:11px 14px}
.rsvp input:focus-visible,.rsvp select:focus-visible,.rsvp textarea:focus-visible{outline:2px solid var(--main);outline-offset:1px}
.rsvp .error{font-size:12px;color:#B06F4D;min-height:1em}
.rsvp .btn{justify-self:center}
.wish-list{display:grid;gap:12px;margin-top:22px;text-align:left}
.wish{display:grid;grid-template-columns:40px 1fr;gap:12px;background:var(--paper);border:1px solid var(--line);border-radius:16px;padding:14px;animation:cardIn .5s var(--ease)}
.wish .initials{width:40px;height:40px;border-radius:50%;display:grid;place-items:center;background:var(--main-soft);color:var(--ink);font-size:13px;font-weight:500}
.wish b{font-weight:500;color:var(--ink);font-size:14px}
.wish time{display:block;font-size:11px;color:var(--main)}
.wish p{font-size:14px;margin-top:4px;overflow-wrap:anywhere}
.pager{display:flex;justify-content:center;gap:6px;margin-top:16px}
.pager button{font:inherit;font-size:13px;min-width:36px;height:36px;border-radius:50%;border:1px solid var(--line);background:var(--paper);color:var(--ink-soft);cursor:pointer}
.pager button[aria-current="true"]{background:var(--main);color:var(--paper);border-color:var(--main)}
.pager button:focus-visible{outline:2px solid var(--main);outline-offset:2px}

/* Closing */
.closing{padding-bottom:220px}
.closing .script-names{font-size:56px;margin-top:10px}
.closing .cluster{bottom:-6px}
.credit{font-size:11px;letter-spacing:.2em;text-transform:uppercase;color:var(--ink-soft);padding:18px;text-align:center;background:var(--paper)}

/* ===== Extra motion per section ===== */
.deco-swag{position:absolute;top:-4px;left:50%;width:300px;margin-left:-150px;pointer-events:none;transform-origin:50% 0;animation:swagSway 5s ease-in-out infinite alternate}
@keyframes swagSway{from{rotate:-1.6deg}to{rotate:1.6deg}}
.deco-swag .g-pop{transform-box:fill-box;transform-origin:50% 50%;scale:0;transition:scale .6s cubic-bezier(.34,1.56,.64,1);transition-delay:calc(var(--k,0)*.05s)}
section.is-live .deco-swag .g-pop{scale:1}
.deco-fly{position:absolute;width:24px;pointer-events:none;opacity:.85;animation:flutterPath 13s ease-in-out infinite}
.deco-petal{position:absolute;top:-20px;width:10px;height:7px;border-radius:60% 0 60% 0;pointer-events:none;opacity:0;animation:petalFall linear infinite}
section.is-live .deco-petal{opacity:.8}
@keyframes petalFall{from{transform:translate(0,0) rotate(0)}to{transform:translate(var(--dx,40px),calc(100% + 900px)) rotate(540deg)}}
.deco-sparkle{position:absolute;width:12px;height:12px;pointer-events:none;background:var(--gold);clip-path:polygon(50% 0,62% 38%,100% 50%,62% 62%,50% 100%,38% 62%,0 50%,38% 38%);animation:twinkle 3s ease-in-out infinite}

.kicker[data-anim]{letter-spacing:.1em}
.kicker[data-anim].is-visible{letter-spacing:.42em;transition:opacity 1.1s var(--ease),letter-spacing 1.6s var(--ease),filter 1.1s var(--ease),transform 1.1s var(--ease)}
h2 em{background:linear-gradient(100deg,var(--main) 20%,var(--accent) 40%,#FEF3F0 50%,var(--accent) 60%,var(--main) 80%);background-size:250% 100%;-webkit-background-clip:text;background-clip:text;color:transparent;animation:shimmer 5s linear infinite}
@keyframes shimmer{from{background-position:120% 0}to{background-position:-120% 0}}
.divider{transform:scaleX(0);transition:transform 1.2s var(--ease) .3s}
.is-visible .divider,.divider.is-visible{transform:none}

.word{display:inline-block;opacity:0;transform:translateY(14px);filter:blur(4px);transition:opacity .6s ease,transform .6s var(--ease),filter .6s ease;transition-delay:calc(.4s + var(--i)*.06s)}
.is-visible .word{opacity:1;transform:none;filter:none}

.ring .portrait{overflow:hidden}
.ring .portrait::after{content:"";position:absolute;inset:0;background:linear-gradient(120deg,transparent 35%,rgba(255,255,255,.55) 50%,transparent 65%);transform:translateX(-120%);animation:shine 4.5s ease-in-out infinite}
.person.is-visible .ring{animation:ringPop 1.2s cubic-bezier(.34,1.56,.64,1) both}
@keyframes ringPop{from{scale:.6;rotate:-20deg}to{scale:1;rotate:0deg}}
.amp-big{position:relative;display:inline-block}
.heart{position:absolute;left:50%;bottom:30%;font-size:14px;color:var(--accent);opacity:0;pointer-events:none;animation:heartRise 3.6s ease-out infinite;animation-delay:calc(var(--i)*.7s)}
@keyframes heartRise{0%{opacity:0;transform:translate(-50%,0) scale(.5)}20%{opacity:1}100%{opacity:0;transform:translate(calc(-50% + var(--dx,0px)),-90px) scale(1.2)}}

.countdown div{transition:transform .3s var(--ease)}
.countdown b.tick{animation:tick .5s var(--ease)}
@keyframes tick{0%{transform:translateY(-40%) rotateX(80deg);opacity:0}100%{transform:none;opacity:1}}
.countdown.is-visible div{animation:floaty 4s ease-in-out infinite;animation-delay:calc(var(--i,0)*-.8s)}
@keyframes floaty{50%{transform:translateY(-6px)}}

.btn{position:relative;overflow:hidden}
.btn::after{content:"";position:absolute;inset:0;background:linear-gradient(110deg,transparent 30%,rgba(255,255,255,.5) 50%,transparent 70%);transform:translateX(-130%);animation:shine 4s ease-in-out infinite;pointer-events:none}
@keyframes shine{0%,60%{transform:translateX(-130%)}100%{transform:translateX(130%)}}

.event-card{position:relative;overflow:hidden}
.event-card::before{content:"";position:absolute;inset:-40%;background:conic-gradient(from 0deg,transparent 0 70%,rgba(228,179,158,.25) 80%,transparent 90%);animation:spin 8s linear infinite;pointer-events:none}
.event-card>*{position:relative}
.event-card h3{animation:inkIn 1.2s var(--ease) both}
.event-date span{animation:rise .8s var(--ease) .3s both}

.story::before{transform-origin:50% 0;transform:scaleY(var(--progress,0));transition:transform .2s linear;background:linear-gradient(var(--accent),var(--main))}
.chapter.is-visible::before{animation:dotPulse 2.4s ease-in-out infinite}
@keyframes dotPulse{0%,100%{box-shadow:0 0 0 0 rgba(228,179,158,.5)}50%{box-shadow:0 0 0 8px rgba(228,179,158,0)}}

.video.is-visible{animation:floaty 5s ease-in-out infinite}
.gift.is-visible{animation:floaty 5s ease-in-out infinite}
.gift:nth-of-type(odd).is-visible{animation-delay:-2.5s}
.gift::before{content:"";position:absolute;inset:0;background:linear-gradient(115deg,transparent 35%,rgba(255,255,255,.7) 50%,transparent 65%);transform:translateX(-120%);animation:shine 5s ease-in-out infinite;pointer-events:none;z-index:1}

.wish:nth-child(2){animation-delay:.08s}
.wish:nth-child(3){animation-delay:.16s}
.wish:nth-child(4){animation-delay:.24s}
.wish{animation-fill-mode:both}

.closing .script-names[data-anim]{opacity:1;transform:none}
.closing .reveal-ink{display:inline-block;clip-path:inset(0 100% 0 0);transition:clip-path 2.4s var(--ease) .3s}
.closing .script-names.is-visible .reveal-ink{clip-path:inset(0 0 0 0)}
.closing .cluster-left .sway,.closing .cluster-right .sway{animation-duration:4s}

/* ===== Variasi animasi ===== */
@property --gap{syntax:"<percentage>";inherits:false;initial-value:0%}
.cover{--gap:0%;-webkit-mask-image:linear-gradient(90deg,#000 calc(50% - var(--gap)),transparent calc(50% - var(--gap)),transparent calc(50% + var(--gap)),#000 calc(50% + var(--gap)));mask-image:linear-gradient(90deg,#000 calc(50% - var(--gap)),transparent calc(50% - var(--gap)),transparent calc(50% + var(--gap)),#000 calc(50% + var(--gap)));transition:--gap 1.6s cubic-bezier(.7,0,.2,1) .5s,visibility 0s linear 2.2s}
.cover.is-open{opacity:1;--gap:51%}
@keyframes houseRise{from{transform:translateY(30px);opacity:0;filter:blur(6px)}to{transform:none;opacity:1;filter:none}}
/* ===== Motion destinasi ===== */
.palm{transform-box:fill-box;transform-origin:50% 100%;animation:sway 5s ease-in-out infinite alternate}
.palm.late{animation-delay:-2.5s}
.wave{fill:none;stroke:#fff;stroke-linecap:round;stroke-opacity:.6;animation:waveMove 4s ease-in-out infinite alternate}
.wave.w2{animation-duration:5.5s;animation-delay:-2s}
@keyframes waveMove{from{transform:translateX(-18px)}to{transform:translateX(18px)}}
.glint{fill:#fff;animation:glint 2.6s ease-in-out infinite;animation-delay:calc(var(--k,0)*.4s)}
@keyframes glint{0%,100%{opacity:.1}50%{opacity:.9}}
.boat{animation:sail 34s linear infinite}
.boat.rev{animation-name:sailBack;animation-duration:40s}
.boat>g{transform-box:fill-box;transform-origin:50% 100%;animation:bob 2.6s ease-in-out infinite alternate}
@keyframes sail{from{transform:translateX(-120px)}to{transform:translateX(600px)}}
@keyframes sailBack{from{transform:translateX(600px)}to{transform:translateX(-160px)}}
@keyframes bob{from{transform:rotate(-3deg) translateY(0)}to{transform:rotate(3deg) translateY(-3px)}}
.blades{transform-box:fill-box;transform-origin:50% 50%;animation:spin 7s linear infinite}
.dolphin{transform-box:fill-box;transform-origin:50% 50%;opacity:0;animation:dolphin 7s ease-in-out infinite;animation-delay:calc(3s + var(--k,0)*3.5s)}
@keyframes dolphin{0%{opacity:0;transform:translate(0,30px) rotate(-40deg)}8%{opacity:1}25%{transform:translate(60px,-50px) rotate(0)}42%{transform:translate(120px,30px) rotate(45deg);opacity:1}48%,100%{opacity:0;transform:translate(130px,40px) rotate(50deg)}}
.hab{animation:balloonDrift var(--dur,18s) ease-in-out infinite alternate;animation-delay:var(--dl,0s)}
@keyframes balloonDrift{from{transform:translate(0,40px)}to{transform:translate(var(--dx,-30px),-70px)}}
.scene.is-playing .hab-in{animation:habIn 3s var(--ease) both;animation-delay:calc(.6s + var(--k,0)*.25s)}
@keyframes habIn{from{transform:translateY(260px);opacity:0}to{transform:none;opacity:1}}
.smoke{transform-box:fill-box;transform-origin:50% 50%;fill:#fff;opacity:0;animation:smoke 4.5s ease-out infinite;animation-delay:calc(var(--k,0)*1.5s)}
@keyframes smoke{0%{opacity:0;transform:translate(0,0) scale(.4)}20%{opacity:.8}100%{opacity:0;transform:translate(24px,-70px) scale(1.8)}}
.cablecar{animation:cable 22s linear infinite}
.cablecar>g{transform-box:fill-box;transform-origin:50% 0;animation:bob 2s ease-in-out infinite alternate}
@keyframes cable{from{transform:translate(0,0)}to{transform:translate(-560px,93px)}}
.swing{transform-box:view-box;animation:swing 3.4s ease-in-out infinite alternate}
@keyframes swing{from{rotate:-14deg}to{rotate:14deg}}
.shimmer{animation:glint 4s ease-in-out infinite;animation-delay:calc(var(--k,0)*.6s)}
.tower-light{fill:#FFF3C4;animation:glint 1.8s ease-in-out infinite;animation-delay:calc(var(--k,0)*.17s)}
.lamp{fill:#FFE7A3;animation:glint 3s ease-in-out infinite}
.heart-balloon{animation:heartUp var(--dur,14s) linear infinite;animation-delay:var(--dl,0s);opacity:0}
@keyframes heartUp{0%{opacity:0;transform:translate(0,0)}10%{opacity:1}90%{opacity:1}100%{opacity:0;transform:translate(var(--dx,20px),-520px)}}
.mist{fill:#fff;animation:drift 40s linear infinite}

/* ===== Karakter animasi ===== */
.eye{transform-box:fill-box;transform-origin:50% 50%;animation:blink 4.6s infinite}
@keyframes blink{0%,93%,100%{transform:scaleY(1)}95%{transform:scaleY(.1)}}
.char-bob{animation:charBob 2.6s ease-in-out infinite}
.char-bob.late{animation-delay:-1.3s}
@keyframes charBob{50%{transform:translateY(-3px)}}
.arm-wave{transform-box:fill-box;transform-origin:50% 6%;animation:wave 1.2s ease-in-out infinite alternate}
@keyframes wave{from{transform:rotate(-140deg)}to{transform:rotate(-165deg)}}
.veil{transform-box:fill-box;transform-origin:50% 0;animation:veilSway 3.4s ease-in-out infinite alternate}
@keyframes veilSway{from{transform:skewX(-3deg)}to{transform:skewX(3deg)}}
.bouquet{transform-box:fill-box;transform-origin:50% 100%;animation:sway 3s ease-in-out infinite alternate}
.heart-pop{transform-box:fill-box;transform-origin:50% 50%;opacity:0;animation:heartPop 3.2s ease-out infinite;animation-delay:calc(var(--k,0)*.8s)}
@keyframes heartPop{0%{opacity:0;transform:translateY(10px) scale(.4)}25%{opacity:1;transform:translateY(0) scale(1)}100%{opacity:0;transform:translateY(-26px) scale(1.15)}}
.scene.is-playing .walk-left{animation:walkLeft 2.8s cubic-bezier(.3,.7,.3,1) 1.4s both}
.scene.is-playing .walk-right{animation:walkRight 2.8s cubic-bezier(.3,.7,.3,1) 1.4s both}
@keyframes walkLeft{from{transform:translateX(-260px)}to{transform:none}}
@keyframes walkRight{from{transform:translateX(260px)}to{transform:none}}
.scene .couple-hearts{opacity:0}
.scene.is-playing .couple-hearts{animation:fadeIn .6s ease 4.1s forwards}
.cover-couple{display:block;width:min(64vw,240px);margin:0 auto 4px;opacity:0;transform-origin:50% 100%;animation:couplePop 1.2s cubic-bezier(.34,1.56,.64,1) .8s forwards}
@keyframes couplePop{from{opacity:0;transform:scale(.3) translateY(40px)}to{opacity:1;transform:none}}
.portrait.portrait-char{font-size:0;display:block;padding:0}
.portrait-char svg{display:block;width:100%;height:100%}

/* ===== Cover animasi ===== */
.cover .arch{display:none}
.cover-text{top:6%}
.cover-text .script-names{font-size:clamp(44px,12.5vw,60px)}
.cover-text .script-names>span{animation-delay:1.6s}
.cover-text .script-names>span:nth-child(2){animation-delay:1.9s}
.cover-text .script-names>span:nth-child(3){animation-delay:2.2s}
.corner-flora{position:absolute;width:min(48vw,230px);overflow:visible;pointer-events:none;z-index:2;animation:floraIn 1.6s var(--ease) both,floraSway 6s ease-in-out 1.6s infinite alternate}
.corner-flora.tl{top:-10px;left:-14px}
.corner-flora.tr{top:-10px;right:-14px;scale:-1 1}
.corner-flora.bl{bottom:-10px;left:-14px;scale:1 -1}
.corner-flora.br{bottom:-10px;right:-14px;scale:-1 -1}
@keyframes floraIn{from{opacity:0;rotate:-12deg}to{opacity:1;rotate:0deg}}
@keyframes floraSway{from{rotate:-2deg}to{rotate:2deg}}
.watercolor span{position:absolute;border-radius:50%;filter:blur(30px);opacity:.55;animation:blobDrift 14s ease-in-out infinite alternate}
@keyframes blobDrift{to{transform:translate(30px,-24px) scale(1.15)}}
.closing-couple{display:block;width:min(70vw,260px);margin:18px auto 0}
.scene-couple{filter:drop-shadow(0 8px 10px rgba(0,0,0,.12))}
.scene-text{top:4%}
.cover{background:linear-gradient(180deg,#FBEFE6,#F9F3EE 55%,#FDF9F5)}

/* ===== Palet tema ===== */
:root{--paper:#FFFFFF;--ground:#F8F6F3;--main:#4F6D8F;--main-soft:#D7E1EC;--ink:#1F2D3D;--ink-soft:#5E6B7A;--accent:#E8A98C;--gold:#D9B46A;--leaf:#7E9A9A;--line:rgba(79,109,143,.22);--sky-top:#FBEFE6;--sky-bottom:#FDF9F5}
body{background:linear-gradient(180deg,#FBEFE6,#FDF9F5)}
.ring .portrait{background:linear-gradient(160deg,var(--main-soft),var(--main))}
.wish .initials{background:var(--main-soft);color:var(--ink)}
.page section{isolation:isolate}
.lamp{fill:#FFE7A3;animation:lampGlow 3s ease-in-out infinite}
@keyframes lampGlow{50%{opacity:.55}}
.section-wash{position:absolute;inset:0;z-index:-1;pointer-events:none;opacity:.5;background:radial-gradient(120% 60% at 50% 0,var(--main-soft),transparent 70%)}

@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.01ms!important;animation-delay:0s!important;animation-iteration-count:1!important;transition-duration:.01ms!important;transition-delay:0s!important}
  html{scroll-behavior:auto}
}
