/* Haidhar & Syafini invitation. Ported from docs/superpowers/specs/prototype.
   For iOS 15 support, no container-query units or relational selectors: sizes derive from
   --appW/--appH (set by app.js, with CSS fallbacks on .app). */
/* Layout: one screen, one phone-width column. The envelope is the stage; it opens, then hands over a stack of three cards. */
:root{
  --ground:#ebeff4;
  --paper:#f8f5ef;
  --ink:#232b36;
  --ink-soft:#566173;
  --toile:#8fa2c0;
  --action:#4f6a8f;
  --action-ink:#fdfbf6;
  --line:#b9c4d4;
  --error:#9c3f3a;
  --shade:44,62,92;
  --serif:"Cormorant Garamond","Cormorant",Garamond,"Times New Roman",serif;
  --ease-out:cubic-bezier(.22,.9,.24,1);
  color-scheme:light;
}
*,*::before,*::after{box-sizing:border-box}
html,body{height:100%}
img{max-width:100%}
[hidden]{display:none!important}
body{
  margin:0;background:var(--ground);color:var(--ink);font-family:var(--serif);
  overflow:hidden;
  padding-top:env(safe-area-inset-top,0px);padding-bottom:env(safe-area-inset-bottom,0px);
  padding-left:max(16px,env(safe-area-inset-left,0px));
  padding-right:max(16px,env(safe-area-inset-right,0px));
  -webkit-tap-highlight-color:transparent;
}
button{font:inherit;color:inherit;background:none;border:0;padding:0;cursor:pointer}
:focus-visible{outline:2px solid var(--action);outline-offset:3px;border-radius:4px}

.app{
  --appW:min(calc(100vw - 2 * max(16px, env(safe-area-inset-left, 0px))), 440px);
  --appH:calc(100vh - env(safe-area-inset-top, 0px) - env(safe-area-inset-bottom, 0px));
  --deckH:calc(var(--appH) - 88px); /* view-cards padding 14+12, gap 10, nav 52 */
  --cardW:min(calc(var(--appW) * .96), calc(var(--deckH) * .705));
  --u:calc(var(--cardW) / 100);     /* one hundredth of the card width */
  position:relative;height:var(--appH);max-width:440px;margin:0 auto}
/* Hidden until the artwork has loaded; app.js reveals it. If app.js never runs, reveal after 5s anyway. */
.is-loading .view-envelope{opacity:0;animation:reveal 0s linear 5s forwards}
@keyframes reveal{to{opacity:1}}
.view{position:absolute;inset:0;transition:opacity .5s ease,transform .7s var(--ease-out)}
.instant,.instant *{transition:none!important;animation:none!important}

/* ───────── Envelope view ───────── */
.view-envelope{
  --W:min(var(--appW),400px,calc((var(--appH) - 208px)/1.045));
  display:flex;flex-direction:column;align-items:center;justify-content:center;
}
.app[data-stage="cards"] .view-envelope{opacity:0;transform:translateY(16%) scale(.92);pointer-events:none}
.col{display:flex;flex-direction:column;align-items:center;width:100%;
  transform:translateY(calc(88px - var(--W)*.1975));transition:transform 1.2s cubic-bezier(.45,0,.55,1) .5s}
.is-open .col{transform:none;transition:transform 1.3s var(--ease-out) .5s}

.scene{position:relative;width:var(--W);height:calc(var(--W)*1.045);flex:none}
.env{position:absolute;left:0;top:calc(var(--W)*.40);width:100%;height:calc(var(--W)*.639)}
.env::before{content:"";position:absolute;inset:8% 3% 0;border-radius:4px;box-shadow:0 calc(var(--W)*.05) calc(var(--W)*.09) calc(var(--W)*-.03) rgba(var(--shade),.38)}
.env img{max-width:none;display:block;user-select:none;-webkit-user-drag:none}

.base{position:absolute;left:-9.52%;top:calc(var(--W)*-.3906);width:119.22%;z-index:1;clip-path:inset(35.1% 0 0 0)}

.flap{position:absolute;left:0;top:0;width:100%;height:calc(var(--W)*.42);z-index:7;
  transform-origin:50% 0;transform:perspective(1100px) rotateX(0deg);transform-style:preserve-3d;
  transition:transform 1s cubic-bezier(.45,0,.55,1) .75s,z-index 0s linear 1.25s}
.is-open .flap{transform:perspective(1100px) rotateX(180deg);z-index:2;
  transition:transform 1.05s cubic-bezier(.45,0,.55,1) .2s,z-index 0s linear .725s}
.flap-front,.flap-back{position:absolute;inset:0;backface-visibility:hidden;-webkit-backface-visibility:hidden}
.flap-front{filter:drop-shadow(0 1px 2px rgba(var(--shade),.2))}
.flap-clip{position:absolute;inset:0;clip-path:polygon(0 0,100% 0,100% 9.05%,50% 96.9%,0 9.05%)}
.flap-clip img{position:absolute;left:-3.56%;top:calc(var(--W)*-.0374);width:107.12%}
/* hides the seal that is baked into the closed-envelope art, by sampling plain toile from higher up the flap */
.patch{position:absolute;width:calc(var(--W)*.25);height:calc(var(--W)*.25);left:calc(var(--W)*.362);top:calc(var(--W)*.246);border-radius:50%;
  background:url(img/closed.webp) calc(var(--W)*-.3976) calc(var(--W)*-.0634)/calc(var(--W)*1.0712) auto no-repeat;
  -webkit-mask-image:radial-gradient(closest-side,#000 76%,transparent 100%);mask-image:radial-gradient(closest-side,#000 76%,transparent 100%)}
.flap-back{overflow:hidden;transform:rotateX(180deg)}
.flap-back img{position:absolute;left:-9.52%;top:calc(var(--W)*.0294);width:119.22%}

.contents{position:absolute;inset:0;z-index:3;
  clip-path:polygon(-30% -300%,130% -300%,130% 0,100% 0,100% 99.4%,0 99.4%,0 0,-30% 0)}
.namecard{position:absolute;left:69.5%;top:calc(var(--W)*.10);width:56%;aspect-ratio:1691/2399;
  background:url(img/frame.webp) center/100% 100%;box-shadow:0 2px 8px rgba(var(--shade),.22);
  display:flex;flex-direction:column;align-items:center;padding-top:calc(var(--W)*.131);
  transform:translate(-50%,-50%) translate(calc(var(--W)*-.17),calc(var(--W)*.40)) rotate(0deg);
  transition:transform .85s cubic-bezier(.5,0,.6,1) .2s}
.namecard img{position:static;opacity:.9}
.is-open .namecard{transform:translate(-50%,-50%) rotate(4.6deg);transition:transform 1.1s var(--ease-out) .85s}
.photo{position:absolute;left:22.7%;top:calc(var(--W)*-.003);width:42%;filter:drop-shadow(0 2px 4px rgba(var(--shade),.28));
  transform:translate(-50%,-50%) translate(calc(var(--W)*.12),calc(var(--W)*.42)) rotate(0deg);
  transition:transform .85s cubic-bezier(.5,0,.6,1) .1s}
.is-open .photo{transform:translate(-50%,-50%) rotate(-5.8deg);transition:transform 1.1s var(--ease-out) 1.02s}
.flower{position:absolute;width:27%;transform-origin:50% 100%;
  transform:translate(-50%,-100%) rotate(var(--r)) translateY(calc(var(--W)*.45)) scale(.9);
  transition:transform .8s cubic-bezier(.5,0,.6,1)}
.f1{--r:-41deg;left:61%;top:calc(var(--W)*.49)}
.f2{--r:35deg;left:31%;top:calc(var(--W)*.50)}
.is-open .flower{transform:translate(-50%,-100%) rotate(var(--r)) translateY(0) scale(1);transition:transform 1.25s var(--ease-out) 1.2s}
.is-open .f2{transition-delay:1.32s}

.pocket{position:absolute;left:0;top:0;width:100%;z-index:4}
.ribbon{position:absolute;bottom:.5%;left:1%;width:15%;z-index:5;opacity:.85}
.ribbon.r2{left:auto;right:1%;transform:scaleX(-1)}
.closed-body{position:absolute;left:-3.56%;top:calc(var(--W)*-.0374);width:107.12%;z-index:6;
  clip-path:polygon(0 10.6%,3.32% 10.6%,50% 65%,96.68% 10.6%,100% 10.6%,100% 100%,0 100%);
  transition:opacity .3s ease 1.6s}
.closed-body img{width:100%}
.is-open .closed-body{opacity:0;transition:opacity .4s ease .2s}

.seal{position:absolute;left:48.7%;top:calc(var(--W)*.371);width:17.5%;aspect-ratio:1;z-index:8;transform:translate(-50%,-50%)}
.seal img{width:100%;filter:drop-shadow(0 2px 3px rgba(var(--shade),.3))}
.seal i{position:absolute;inset:4%;border-radius:50%;border:1px solid var(--toile);opacity:0;animation:ring 2.8s ease-out infinite}
.is-open .seal i,.is-closing .seal i{animation:none}
.is-opening .seal img{animation:lift 2.3s ease-in-out both}
.is-closing .seal img{animation:reseal 2.1s ease-in-out both}
@keyframes ring{0%{transform:scale(.95);opacity:.75}70%,100%{transform:scale(1.55);opacity:0}}
@keyframes reseal{0%{transform:scale(1)}30%,72%{transform:scale(1.15);filter:drop-shadow(0 9px 10px rgba(var(--shade),.28))}90%{transform:scale(.95)}100%{transform:scale(1)}}
@keyframes lift{0%{transform:scale(1)}7%{transform:scale(.92)}26%,70%{transform:scale(1.15);filter:drop-shadow(0 9px 10px rgba(var(--shade),.28))}100%{transform:scale(1)}}

.cover-text{position:absolute;inset:0;z-index:9;pointer-events:none;transition:opacity .5s ease 1.7s}
.cover-text p{position:absolute;left:0;right:0;top:calc(var(--W)*.091);transform:translateY(-50%);margin:0;text-align:center;
  font-size:calc(var(--W)*.041);line-height:1;letter-spacing:.015em;text-transform:uppercase;white-space:nowrap}
.cover-names img{position:absolute}
.cover-names img:nth-child(1){left:9.5%;top:calc(var(--W)*.158);width:37%}
.cover-names img:nth-child(2){left:48.9%;top:calc(var(--W)*.2);width:5.1%}
.cover-names img:nth-child(3){left:56.9%;top:calc(var(--W)*.183);width:32.1%}
.is-open .cover-text{opacity:0;transition:opacity .35s ease}
.open-btn{position:absolute;inset:-4%;z-index:10;border-radius:8px}
.is-open .open-btn{display:none}
.peek-btn{position:absolute;inset:-60% 0 0;z-index:10;display:none}
.is-open .peek-btn{display:block}

.below{position:relative;width:100%;height:176px;flex:none}
.hint{position:absolute;left:0;right:0;top:12px;min-height:44px;margin:0;padding:12px 0;text-align:center;font-style:italic;font-size:19px;color:var(--ink-soft);transition:opacity .5s ease 1.9s}
.is-open .hint{opacity:0;pointer-events:none;transition:opacity .3s ease}
.after{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:flex-start;padding-top:12px;gap:12px;
  opacity:0;transform:translateY(10px);pointer-events:none;transition:opacity .3s ease,transform .3s ease}
.is-open .after{opacity:1;transform:none;pointer-events:auto;transition:opacity .7s ease 2s,transform .9s var(--ease-out) 2s}

.count{width:min(calc(var(--W)*.84),320px);aspect-ratio:1283/419;max-width:100%;background:url(img/lace.webp) center/100% 100%;
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;padding-bottom:1%}
.count h2{margin:0;font-size:10.5px;font-weight:600;letter-spacing:.22em;text-transform:uppercase}
.count ol{list-style:none;margin:0;padding:0;display:flex;align-items:flex-start;gap:7px}
.count li{display:flex;flex-direction:column;align-items:center;min-width:34px}
.count b{font-size:27px;line-height:1;font-weight:600;font-variant-numeric:lining-nums tabular-nums}
.count small{font-size:8px;letter-spacing:.14em;text-transform:uppercase;margin-top:3px}
.count li.sep{min-width:0;font-size:22px;line-height:1.1;font-weight:600}

.cta,.nav-next{display:inline-flex;align-items:center;gap:8px;height:48px;padding:0 26px 2px;border-radius:999px;
  background:var(--action);color:var(--action-ink);font-size:20px;font-weight:600;letter-spacing:.02em;
  box-shadow:0 6px 16px -8px rgba(var(--shade),.6);transition:transform .15s ease,background .2s}
.cta:active,.nav-next:active{transform:scale(.97)}
.cta svg,.nav-next svg,.nav-back svg{width:16px;height:16px;flex:none}
.replay{position:absolute;top:10px;right:0;font-size:15px;font-style:italic;color:var(--ink-soft);padding:8px 4px;opacity:0;pointer-events:none;transition:opacity .5s ease}
.is-open .replay{opacity:1;pointer-events:auto;transition-delay:2.2s}

/* ───────── Card view ───────── */
.view-cards{display:flex;flex-direction:column;gap:10px;padding-block:14px 12px}
.app:not([data-stage="cards"]) .view-cards{pointer-events:none}
.app:not([data-stage="cards"]) .nav{opacity:0}
.deck{position:relative;flex:1;min-height:0;touch-action:pan-y}
.card{position:absolute;left:50%;top:50%;width:var(--cardW);aspect-ratio:1691/2399;
  background:var(--paper) url(img/frame.webp) center/100% 100%;border-radius:2px;
  box-shadow:0 14px 34px -16px rgba(var(--shade),.5),0 1px 3px rgba(var(--shade),.18);
  transition:transform .8s var(--ease-out),opacity 0s}
.card[data-pos="0"]{transform:translate(-50%,-50%);z-index:3}
.card[data-pos="1"]{transform:translate(-50%,-50%) translate(1.4%,.9%) rotate(2.2deg);z-index:2}
.card[data-pos="2"]{transform:translate(-50%,-50%) translate(-1.4%,1.5%) rotate(-2.6deg);z-index:1}
.card[data-pos="past"]{transform:translate(-50%,-50%) translateX(-135%) rotate(-11deg);opacity:0;z-index:4;pointer-events:none;
  transition:transform .8s var(--ease-out),opacity .3s ease .28s}
.app:not([data-stage="cards"]) .card{transform:translate(-50%,-50%) translateY(calc(var(--deckH) * 1.25)) rotate(4deg);opacity:0;
  transition:transform .55s ease-in,opacity 0s linear .55s}

.card-in{position:absolute;inset:20% 17.5% 11%;display:flex;flex-direction:column;align-items:center;justify-content:center;
  text-align:center;gap:calc(var(--u) * 4.4);font-size:calc(var(--u) * 4.6);line-height:1.25}
.card-in p{margin:0}
.card-in img{display:block;opacity:.9}
.caps{text-transform:uppercase;letter-spacing:.09em}
.light{font-weight:300}
.it{font-style:italic}
.parents{font-size:calc(var(--u) * 5.3);line-height:1.3}
.couple{display:flex;flex-direction:column;align-items:center;gap:calc(var(--u) * 0.6);width:100%}
.couple strong{font-size:calc(var(--u) * 5);font-weight:600;letter-spacing:.06em;text-transform:uppercase}
.couple span{display:flex;align-items:center;gap:calc(var(--u) * 2.5);width:100%;font-style:italic;font-size:calc(var(--u) * 4.3);white-space:nowrap}
.couple span::before,.couple span::after{content:"";flex:1;height:1px;background:var(--ink-soft);opacity:.5}

.when{font-size:calc(var(--u) * 5);font-weight:300;letter-spacing:.04em;line-height:1.4;white-space:nowrap}
.when sup{font-size:.55em;letter-spacing:0}
.maps{display:flex;flex-direction:column;align-items:center;gap:calc(var(--u) * 2.4);width:100%}
.maps p{font-style:italic;font-size:calc(var(--u) * 4.3);color:var(--ink-soft)}
.maps div{display:flex;justify-content:center;gap:calc(var(--u) * 2.6);width:100%}
.maps a{flex:1 1 auto;display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:44px;padding:0 10px 1px;border-radius:999px;
  border:1px solid var(--action);color:var(--action);background:#fdfcf9;text-decoration:none;font-weight:600;font-size:max(15px,calc(var(--u) * 4.5));white-space:nowrap}
.maps a:active{background:var(--action);color:var(--action-ink)}
.maps svg{width:15px;height:15px;flex:none}
.venue-intro{font-size:calc(var(--u) * 5)}
.venue{display:flex;flex-direction:column;align-items:center;gap:var(--u);width:100%}

.card-in.card-in--top{inset:15% 17.5% 11%}
form,.done{width:100%;display:flex;flex-direction:column;gap:calc(var(--u) * 3.1);text-align:left}
.field{display:flex;flex-direction:column;gap:calc(var(--u) * 1.6);border:0;margin:0;padding:0;min-width:0}
.field>label,.field>legend,.pax>span{font-size:max(11px,calc(var(--u) * 3.4));font-weight:600;letter-spacing:.07em;text-transform:uppercase;padding:0}
.field>legend{margin-bottom:calc(var(--u) * 1.6)}
input[type=text]{width:100%;height:44px;padding:0 12px 1px;border:1px solid var(--line);border-radius:6px;background:#fdfcf9;
  font:inherit;font-size:max(16px,calc(var(--u) * 4.8));color:var(--ink)}
input[type=text]:focus{outline:2px solid var(--action);outline-offset:1px;border-color:transparent}
.choice{display:flex;gap:calc(var(--u) * 2.6)}
.choice label{flex:1;position:relative}
.choice input{position:absolute;opacity:0;inset:0;width:100%;height:100%;margin:0;cursor:pointer}
.choice span{display:flex;align-items:center;justify-content:center;height:44px;padding-bottom:1px;border:1px solid var(--line);border-radius:6px;background:#fdfcf9;
  font-size:max(14px,calc(var(--u) * 3.9));font-weight:600;letter-spacing:.02em;text-transform:uppercase;white-space:nowrap;transition:background .2s,color .2s,border-color .2s}
.choice input:checked+span{background:var(--action);border-color:var(--action);color:var(--action-ink)}
.choice input:focus-visible+span{outline:2px solid var(--action);outline-offset:2px}
.pax.off{opacity:.4}
.pax{display:flex;align-items:center;justify-content:space-between;gap:8px}
.stepper{display:flex;align-items:center;gap:4px}
.stepper button{width:40px;height:40px;border-radius:50%;border:1px solid var(--line);background:#fdfcf9;font-size:22px;line-height:1;padding-bottom:3px}
.stepper button:disabled{opacity:.35;cursor:default}
.stepper output{min-width:30px;text-align:center;font-size:24px;font-weight:600;font-variant-numeric:lining-nums tabular-nums}
.submit{height:46px;border-radius:999px;background:var(--action);color:var(--action-ink);font-size:19px;font-weight:600;letter-spacing:.06em;padding-bottom:2px}
.submit:active{transform:scale(.98)}
.submit:disabled{opacity:.7;cursor:default}
.hp{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}
#err-send{text-align:center;margin-block:calc(var(--u) * -1.2)}
/* While the send error shows, the numbers follow it directly: drop the "hubungi" label to keep the form inside the frame. */
#err-send:not([hidden]) + .contact i{display:none}
.err{margin:0;font-size:max(13px,calc(var(--u) * 3.8));font-style:italic;color:var(--error)}
.contact{font-size:calc(var(--u) * 4.5);font-weight:300;line-height:1.3;text-align:center;text-transform:uppercase;letter-spacing:.09em}
.contact i{display:block;font-size:calc(var(--u) * 3.9);font-weight:400;text-transform:none;letter-spacing:.12em;margin-bottom:calc(var(--u) * 1.4)}
.contact span{font-variant-numeric:lining-nums;user-select:all}
.done{align-items:center;text-align:center;gap:calc(var(--u) * 3.4)}
.done img{width:27%;animation:stamp .6s var(--ease-out) both}
.done h3{margin:0;font-size:calc(var(--u) * 8);font-weight:400;font-style:italic;line-height:1.1;overflow-wrap:anywhere}
.done p{font-size:calc(var(--u) * 4.7)}
.done #rsvp-another{margin-top:calc(var(--u) * -3)}
.done button{font-style:italic;font-size:max(15px,calc(var(--u) * 4.3));color:var(--action);text-decoration:underline;text-underline-offset:3px;padding:8px}
@keyframes stamp{0%{transform:scale(1.7);opacity:0}60%{transform:scale(.94);opacity:1}100%{transform:scale(1)}}

.nav{flex:none;transition:opacity .4s ease;display:grid;grid-template-columns:1fr auto 1fr;align-items:center;height:52px}
.nav-back{justify-self:start;display:inline-flex;align-items:center;gap:6px;height:48px;padding:0 10px 2px 2px;font-size:18px;font-style:italic;color:var(--ink-soft)}
.nav-next{justify-self:end;height:46px;padding:0 20px 2px 22px;font-size:19px}
.dots{display:flex;gap:9px}
.dots i{width:7px;height:7px;border-radius:50%;background:var(--toile);opacity:.35;transition:opacity .3s,transform .3s}
.dots i.on{opacity:1;transform:scale(1.25);background:var(--action)}

/* 320px-wide phones (iPhone SE 1st gen): tighten the RSVP card so it stays inside the frame. */
@media (max-width:359px){
  .card-rsvp form{gap:calc(var(--u) * 2)}
  .card-rsvp .field{gap:var(--u)}
  .card-rsvp .field>legend{margin-bottom:var(--u)}
  .card-rsvp input[type=text],.card-rsvp .choice span,.card-rsvp .submit{height:42px}
  .card-rsvp .stepper button{width:38px;height:38px}
  .card-rsvp .contact{font-size:calc(var(--u) * 4);line-height:1.2}
  .card-rsvp .contact i{margin-bottom:0}
}
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{transition-duration:.01ms!important;transition-delay:0s!important;animation:none!important}
}
