@font-face{font-family:'Marcellus';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/marcellus-400.woff2?v=82423fc716fb) format('woff2')}@font-face{font-family:'Nunito Sans';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/nunito-400.woff2?v=82423fc716fb) format('woff2')}@font-face{font-family:'Nunito Sans';font-style:normal;font-weight:700;font-display:swap;src:url(/fonts/nunito-700.woff2?v=82423fc716fb) format('woff2')}:root{--bg:#fff7d6;--surface:#fffcef;--text:#0d0b05;--muted:#625e4e;--primary:#2b2410;--on-primary:#ffffff;--accent:#d1a10f;--line:#ddd5b6;--radius:12px;--font-heading:'Marcellus', Georgia, serif;--font-body:'Nunito Sans', system-ui, sans-serif;--cover-bg:#fff7d6;--cover-text:#0d0b05;--cover-btn:#2b2410;--cover-on-btn:#ffffff;--cover-line:#ddd5b6;--ok:#1a7f37;--err:#b42318;--orn-corner:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20120%20120%22%20fill%3D%22none%22%20stroke%3D%22%23d1a10f%22%20stroke-width%3D%221.4%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M10%20110c0-50%2020-80%2060-90%22%2F%3E%3Cpath%20d%3D%22M24%2090c10-4%2014-14%2010-22M40%2064c10-2%2016-10%2014-20M60%2042c8%200%2014-8%2014-16%22%2F%3E%3Ccircle%20cx%3D%2270%22%20cy%3D%2220%22%20r%3D%225%22%2F%3E%3C%2Fsvg%3E");--orn-divider:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20240%2024%22%20fill%3D%22none%22%20stroke%3D%22%23d1a10f%22%20stroke-width%3D%221.4%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M10%2012h80M150%2012h80%22%2F%3E%3Cpath%20d%3D%22M100%2012c6-10%2014-10%2020%200%206%2010%2014%2010%2020%200%22%2F%3E%3C%2Fsvg%3E");--orn-tile:none;--cover-orn:#d1a10f;--cover-orn-corner:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20120%20120%22%20fill%3D%22none%22%20stroke%3D%22%23d1a10f%22%20stroke-width%3D%221.4%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M10%20110c0-50%2020-80%2060-90%22%2F%3E%3Cpath%20d%3D%22M24%2090c10-4%2014-14%2010-22M40%2064c10-2%2016-10%2014-20M60%2042c8%200%2014-8%2014-16%22%2F%3E%3Ccircle%20cx%3D%2270%22%20cy%3D%2220%22%20r%3D%225%22%2F%3E%3C%2Fsvg%3E");--cover-orn-divider:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20240%2024%22%20fill%3D%22none%22%20stroke%3D%22%23d1a10f%22%20stroke-width%3D%221.4%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M10%2012h80M150%2012h80%22%2F%3E%3Cpath%20d%3D%22M100%2012c6-10%2014-10%2020%200%206%2010%2014%2010%2020%200%22%2F%3E%3C%2Fsvg%3E");--cover-orn-tile:none;--cover-frame:none;--sc-bg:url("/_inv/scene/lamin-kenyah-bg.webp?v=82423fc716fb");--sc-fg:url("/_inv/scene/lamin-kenyah-fg.webp?v=82423fc716fb");--sc-orn:url("/_inv/scene/aso-orn.webp?v=82423fc716fb");--sc-couple:url("/_inv/scene/lamin-kenyah-couple.webp?v=82423fc716fb");color-scheme:light}/* Shared invitation structure. Themes only set variables (palette, fonts, ornaments) and may add
   rules scoped to `.t-<slug>`. Mobile first; base size 16px; touch targets ≥ 44px. */
*,*::before,*::after{box-sizing:border-box}
html{font-size:100%;-webkit-text-size-adjust:100%;scroll-behavior:smooth}
html.big{font-size:125%}
body{margin:0;background:var(--bg);color:var(--text);font-family:var(--font-body);line-height:1.65;font-size:1rem;-webkit-font-smoothing:antialiased;overflow-x:hidden}
body.locked{overflow:hidden;height:100vh}
img,video,iframe{max-width:100%;display:block}
a{color:var(--primary)}
button,input,select,textarea{font:inherit;color:inherit}
:focus-visible{outline:3px solid var(--primary);outline-offset:2px}
.sr{position:absolute!important;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
h1,h2,h3{font-family:var(--font-heading);font-weight:var(--heading-weight,500);line-height:1.2;margin:0}
.script{font-family:var(--font-script,var(--font-heading));font-weight:400}

/* layout: single column, desktop shows a fixed cover panel on the left */
.shell{min-height:100vh}
.main>div:empty{display:none}
.aside{display:none}
.main{max-width:560px;margin:0 auto;background:var(--bg);position:relative;background-image:var(--orn-tile);}
@media (min-width:960px){
  .shell{display:grid;grid-template-columns:1fr 520px}
  .aside{display:flex;position:sticky;top:0;height:100vh;align-items:flex-end;padding:56px;color:var(--cover-text);background:var(--cover-bg) center/cover no-repeat;overflow:hidden}
  .aside::before{content:"";position:absolute;inset:24px;border:1px solid var(--cover-line);border-radius:var(--radius);background:var(--cover-orn-corner) no-repeat 12px 12px/150px,var(--cover-orn-corner) no-repeat right 12px bottom 12px/150px;opacity:.9}
  .aside.has-photo{color:#fff}
  .aside.has-photo::before{inset:0;border:0;border-radius:0;background:linear-gradient(180deg,transparent 40%,rgba(0,0,0,.55));opacity:1}
  .aside>*{position:relative}
  .aside h2{font-size:3rem}
  .main{max-width:none;margin:0;box-shadow:-8px 0 30px rgba(0,0,0,.08)}
}

/* cover (shown until "Buka Undangan" is tapped) */
.cover{position:fixed;inset:0;z-index:50;display:flex;flex-direction:column;align-items:center;justify-content:center;justify-content:safe center;text-align:center;padding:32px 24px calc(32px + env(safe-area-inset-bottom));background:var(--cover-bg);color:var(--cover-text);transition:transform .9s cubic-bezier(.7,0,.2,1),opacity .6s;overflow-x:hidden;overflow-y:auto}
.cover.has-photo{color:#fff;background:#222 center/cover no-repeat}
.cover.has-photo::before{content:"";position:absolute;inset:0;background:linear-gradient(180deg,rgba(0,0,0,.25),rgba(0,0,0,.6))}
.cover>*{position:relative;z-index:1}
.cover::after{content:"";position:absolute;inset:12px;border:1px solid var(--cover-line);border-radius:var(--radius);pointer-events:none;z-index:1}
.cover.has-photo::after{border-color:rgba(255,255,255,.35)}
.opened .cover{transform:translateY(-100%);opacity:0;pointer-events:none}
.cover .eyebrow{letter-spacing:.25em;text-transform:uppercase;font-size:.75rem;opacity:.85}
.cover .names{font-size:clamp(2.4rem,11vw,3.6rem);margin:.5rem 0}
.cover .date{letter-spacing:.15em;font-size:.9rem}
.cover .to{margin-top:2rem;font-size:.9rem;opacity:.9}
.cover .guest{font-family:var(--font-heading);font-size:clamp(1.2rem,5.6vw,1.6rem);margin:.25rem 0 .25rem;overflow-wrap:break-word}
.cover .note{font-size:.72rem;opacity:.75;max-width:280px;margin:0 auto}
.cover .corner{position:absolute;width:110px;height:110px;background:var(--orn-corner) no-repeat;background-size:contain;opacity:.9}
.cover .c1{top:14px;left:14px}.cover .c2{top:14px;right:14px;transform:scaleX(-1)}.cover .c3{bottom:14px;left:14px;transform:scaleY(-1)}.cover .c4{bottom:14px;right:14px;transform:scale(-1)}
.cover .frame{position:relative;width:100%;max-width:360px}
.cover :focus-visible{outline-color:var(--cover-text)}
.cover .mono{display:flex;align-items:center;justify-content:center;gap:.12em;width:92px;height:92px;margin:0 auto 18px;border:1px solid currentColor;border-radius:50%;font-family:var(--font-heading);font-size:1.8rem;line-height:1;letter-spacing:.02em}
.cover .mono i{font-style:normal;font-size:.55em;opacity:.75}
.cover.style-arch .frame{border:1px solid currentColor;border-radius:999px 999px 16px 16px;padding:56px 28px 36px;max-width:340px}
.cover.style-frame .frame{border:1px solid currentColor;padding:40px 24px;outline:1px solid currentColor;outline-offset:6px;max-width:340px}
/* SVG-outlined covers (gate, roof, crown, moon gate, …): shape from --cover-frame, see frames.ts */
.cover.shape .frame{max-width:340px;padding:120px 30px 44px}
.cover.shape .frame::before{content:"";position:absolute;inset:0;z-index:-1;background:var(--cover-frame) center/100% 100% no-repeat;pointer-events:none}
.cover.style-gunungan .frame{padding-top:118px}
.cover.style-kubah .frame{padding-top:124px}
.cover.style-gonjong .frame{padding:150px 30px 44px}
.cover.style-perahu .frame{padding:150px 34px 44px}
.cover.style-siger .frame{padding-top:110px}
.cover.style-oval .frame{padding:72px 38px;min-height:470px;display:flex;flex-direction:column;align-items:center;justify-content:center}
.cover.style-ticket .frame,.cover.style-deco .frame{padding:52px 30px 44px}
.cover.style-scallop .frame{padding:84px 30px 56px}
/* editorial: text pinned left, eyebrow on top, names huge */
.cover.style-split{align-items:stretch;text-align:left}
.cover.style-split .frame{flex:1;max-width:520px;display:flex;flex-direction:column;align-items:flex-start;justify-content:flex-end;padding:8px 10px 12px}
.cover.style-split .eyebrow{margin:0 0 auto;padding-top:12px}
.cover.style-split .names{font-size:clamp(3rem,15vw,5.2rem);line-height:.98;margin:.75rem 0 1rem}
.cover.style-split .note{margin:0;max-width:300px}
/* full-bleed colour block */
.cover.style-full::after{display:none}
.cover.style-full .frame{flex:1;max-width:520px;display:flex;flex-direction:column;justify-content:center}
.cover.style-full .names{font-size:clamp(3.2rem,16vw,5.4rem);line-height:1}
@media (max-height:660px){.cover .to{margin-top:1rem}.cover .btn{margin-top:1rem}.cover.shape .frame{padding-top:72px;padding-bottom:28px}.cover.style-oval .frame{min-height:0}.cover .mono{width:72px;height:72px;font-size:1.4rem;margin-bottom:10px}}

.btn{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;min-height:48px;padding:.75rem 1.5rem;border-radius:999px;border:0;background:var(--primary);color:var(--on-primary);font-weight:600;cursor:pointer;text-decoration:none;font-size:1rem}
.btn.ghost{background:transparent;color:inherit;border:1px solid currentColor}
.btn.sm{min-height:44px;padding:.5rem 1rem;font-size:.9rem}
.btn[disabled]{opacity:.6;cursor:wait}
.cover .btn{margin-top:1.75rem;background:var(--cover-btn);color:var(--cover-on-btn)}
/* cover layers: drifting pattern, soft glow, ambient particles, swaying corners, staged entrance */
.cover .cv-tile,.cover .cv-glow,.cover .fx{position:absolute;z-index:0;pointer-events:none}
.cover .cv-tile{inset:-96px 0 0 -96px;background:var(--cover-orn-tile) 0 0/96px 96px;opacity:.55;animation:cv-drift 48s linear infinite}
.cover .cv-glow{left:50%;top:45%;width:130vmin;height:130vmin;translate:-50% -50%;background:radial-gradient(closest-side,color-mix(in srgb,var(--cover-orn) 26%,transparent),transparent);animation:cv-glow 7s ease-in-out infinite alternate}
.cover.has-photo .cv-glow{opacity:.5}
.cover .corner{width:clamp(120px,34vw,176px);height:clamp(120px,34vw,176px);background-image:var(--cover-orn-corner);opacity:1;animation:orn-sway 9s ease-in-out infinite alternate}
.cover .c2,.cover .c3{animation-delay:-4.5s}
.cover .frame{animation:cv-frame 1.3s cubic-bezier(.2,.7,.2,1) both}
.cover .frame>*{animation:cv-in .9s cubic-bezier(.2,.7,.2,1) both}
.cover .frame>:nth-child(1){animation-delay:.25s}.cover .frame>:nth-child(2){animation-delay:.4s}.cover .frame>:nth-child(3){animation-delay:.55s}.cover .frame>:nth-child(4){animation-delay:.7s}.cover .frame>:nth-child(5){animation-delay:.85s}.cover .frame>:nth-child(6){animation-delay:1s}.cover .frame>:nth-child(7){animation-delay:1.1s}.cover .frame>:nth-child(8){animation-delay:1.2s}
.cover .frame>.btn{animation:cv-in .9s cubic-bezier(.2,.7,.2,1) 1.25s both,float 3s ease-in-out 2.2s infinite}
.cover .names{background:linear-gradient(100deg,currentColor 40%,color-mix(in srgb,var(--cover-orn) 70%,#fff) 50%,currentColor 60%) 0 0/250% 100%;-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;animation:cv-in .9s cubic-bezier(.2,.7,.2,1) .55s both,cv-shine 6s ease-in-out 2.5s infinite}
.fx{inset:0;overflow:hidden}
.fx i{position:absolute;top:-6%;left:var(--x);width:var(--s);height:var(--s);opacity:0;will-change:transform,opacity;animation:fx-fall var(--d) linear var(--dl) infinite}
.fx i:nth-child(1){--x:6%;--s:12px;--d:13s;--dl:-2s;--dx:40px}
.fx i:nth-child(2){--x:18%;--s:9px;--d:16s;--dl:-9s;--dx:-30px}
.fx i:nth-child(3){--x:29%;--s:14px;--d:12s;--dl:-5s;--dx:55px}
.fx i:nth-child(4){--x:41%;--s:8px;--d:17s;--dl:-12s;--dx:-45px}
.fx i:nth-child(5){--x:52%;--s:11px;--d:14s;--dl:-1s;--dx:30px}
.fx i:nth-child(6){--x:63%;--s:13px;--d:15s;--dl:-7s;--dx:-60px}
.fx i:nth-child(7){--x:74%;--s:9px;--d:12.5s;--dl:-10s;--dx:45px}
.fx i:nth-child(8){--x:85%;--s:12px;--d:16.5s;--dl:-4s;--dx:-35px}
.fx i:nth-child(9){--x:94%;--s:10px;--d:13.5s;--dl:-11s;--dx:-50px}
.fx i:nth-child(10){--x:12%;--s:7px;--d:18s;--dl:-14s;--dx:25px}
.fx i:nth-child(11){--x:47%;--s:10px;--d:19s;--dl:-16s;--dx:-25px}
.fx i:nth-child(12){--x:80%;--s:8px;--d:17.5s;--dl:-6s;--dx:35px}
.fx-petals i{border-radius:85% 0 85% 0;background:linear-gradient(135deg,var(--cover-orn),color-mix(in srgb,var(--cover-orn) 55%,#fff));--o:.75}
.fx-confetti i{width:calc(var(--s)*.55);border-radius:2px;background:var(--cover-orn);--o:.85}
.fx-confetti i:nth-child(3n){background:var(--cover-btn)}.fx-confetti i:nth-child(3n+1){background:var(--cover-text)}
.fx-dust i{top:auto;bottom:-4%;width:calc(var(--s)*.45);height:calc(var(--s)*.45);border-radius:50%;background:var(--cover-orn);box-shadow:0 0 10px 2px color-mix(in srgb,var(--cover-orn) 60%,transparent);--o:.7;animation-name:fx-rise}
.fx-bubbles i{top:auto;bottom:-6%;border-radius:50%;border:1.5px solid var(--cover-orn);background:color-mix(in srgb,var(--cover-orn) 12%,transparent);--o:.6;animation-name:fx-rise}
.fx-stars i{top:var(--y,30%);background:radial-gradient(circle,var(--cover-orn) 0 18%,transparent 20%),conic-gradient(from 45deg,transparent 0 10%,var(--cover-orn) 12.5%,transparent 15% 35%,var(--cover-orn) 37.5%,transparent 40% 60%,var(--cover-orn) 62.5%,transparent 65% 85%,var(--cover-orn) 87.5%,transparent 90%);-webkit-mask:radial-gradient(circle,#000 0 48%,transparent 50%);mask:radial-gradient(circle,#000 0 48%,transparent 50%);--o:.9;animation:fx-twinkle calc(var(--d)/3.5) ease-in-out var(--dl) infinite}
.fx-stars i:nth-child(odd){--y:12%}.fx-stars i:nth-child(3n){--y:78%}.fx-stars i:nth-child(4n){--y:55%}.fx-stars i:nth-child(5n){--y:30%}.fx-stars i:nth-child(7n){--y:90%}
@keyframes fx-fall{0%{opacity:0;transform:translate3d(0,0,0) rotate(0)}10%,85%{opacity:var(--o,.8)}100%{opacity:0;transform:translate3d(var(--dx),112vh,0) rotate(600deg)}}
@keyframes fx-rise{0%{opacity:0;transform:translate3d(0,0,0)}15%,80%{opacity:var(--o,.7)}100%{opacity:0;transform:translate3d(var(--dx),-108vh,0)}}
@keyframes fx-twinkle{0%,100%{opacity:0;transform:scale(.3) rotate(0)}50%{opacity:var(--o,.9);transform:scale(1) rotate(45deg)}}
@keyframes orn-sway{from{rotate:-2.5deg}to{rotate:2.5deg}}
@keyframes cv-drift{to{transform:translate3d(96px,96px,0)}}
@keyframes cv-glow{from{opacity:.55;scale:.94}to{opacity:1;scale:1.06}}
@keyframes cv-frame{from{opacity:0;transform:scale(.94)}}
@keyframes cv-in{from{opacity:0;transform:translateY(16px);filter:blur(6px)}}
@keyframes cv-shine{0%,70%{background-position:100% 0}100%{background-position:-50% 0}}
/* opening: the cover lifts like a curtain, then the invitation rises in */
.opened .main{animation:main-in 1s cubic-bezier(.2,.7,.2,1) .15s both}
@keyframes main-in{from{opacity:0;transform:translateY(40px)}}

/* sections */
.b{position:relative;padding:72px 24px;text-align:center}
/* each block sits in its own wrapper div, so siblings are matched on the wrapper */
.main>div+div>.b{border-top:var(--section-border,0)}
.sec-divided{--section-border:1px solid var(--line)}
.sec-card .b{margin:16px;background:var(--surface);border-radius:var(--radius);padding:56px 20px}
.sec-band .main>div:nth-child(even)>.b{background:var(--surface)}
.sec-framed .b::before{content:"";position:absolute;inset:14px;border:1px solid var(--line);border-radius:var(--radius);pointer-events:none}
.b .corner{position:absolute;width:84px;height:84px;background:var(--orn-corner) no-repeat;background-size:contain;opacity:.55;pointer-events:none}
.b .corner.tl{top:8px;left:8px}.b .corner.br{bottom:8px;right:8px;transform:scale(-1)}
.b-h{font-size:clamp(1.8rem,7vw,2.4rem);color:var(--primary)}
.divider{height:24px;margin:14px auto 22px;max-width:220px;background:var(--orn-divider) center/contain no-repeat}
.muted{color:var(--muted)}
.lead{font-size:1.05rem}
.small{font-size:.875rem}
.stack>*+*{margin-top:1rem}

/* couple */
.person{margin:28px auto}
.person .photo{width:180px;height:220px;object-fit:cover;margin:0 auto 18px;border-radius:999px 999px var(--radius) var(--radius);border:4px solid var(--surface);box-shadow:0 8px 24px rgba(0,0,0,.12)}
.person .nick{font-size:2.6rem;color:var(--primary)}
.person .full{font-weight:600;margin:.25rem 0}
.person .parents{font-size:.92rem;color:var(--muted)}
.amp{font-size:3rem;color:var(--accent);margin:8px 0}

/* countdown */
.cd{display:flex;gap:8px;justify-content:center;margin-top:20px}
.cd div{flex:1 1 0;min-width:0;max-width:84px;padding:12px 6px;border-radius:var(--radius);background:var(--surface);border:1px solid var(--line)}
.cd b{display:block;font-size:1.6rem;font-family:var(--font-heading);color:var(--primary)}
.cd span{font-size:.72rem;text-transform:uppercase;letter-spacing:.08em}

/* events */
.ev{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:28px 20px;margin:18px 0}
.ev h3{font-size:1.7rem;color:var(--primary)}
.ev .when{font-weight:600;margin-top:10px}
.ev .where{margin-top:10px}
.ev .actions{display:flex;flex-wrap:wrap;gap:10px;justify-content:center;margin-top:18px}
/* agenda layout (formal themes override `events` with blocks/agenda.tsx) */
.agenda{list-style:none;margin:20px 0 0;padding:0;text-align:left;display:grid;gap:14px}
.ag{display:grid;grid-template-columns:76px 1fr;gap:16px;align-items:start;background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:18px 16px}
.ag-date{text-align:center;border-right:1px solid var(--line);padding-right:12px;line-height:1.15}
.ag-date b{display:block;font-family:var(--font-heading);font-size:2.2rem;color:var(--primary)}
.ag-date span{display:block;font-size:.78rem;text-transform:uppercase;letter-spacing:.08em;color:var(--muted)}
.ag h3{font-size:1.3rem;color:var(--primary)}
.ag p{margin:.35rem 0 0}
.ag .actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px}
@media (max-width:359px){.ag{grid-template-columns:1fr}.ag-date{border-right:0;border-bottom:1px solid var(--line);padding:0 0 8px;text-align:left}}

/* story */
.story{text-align:left;border-left:2px solid var(--line);margin:24px 0 0 8px;padding-left:22px}
.story li{list-style:none;position:relative;margin-bottom:26px}
.story li::before{content:"";position:absolute;left:-30px;top:6px;width:14px;height:14px;border-radius:50%;background:var(--accent)}
.story .yr{font-size:.8rem;letter-spacing:.12em;color:var(--muted)}
.story img{border-radius:var(--radius);margin-top:10px}

/* gallery */
.gal{display:grid;grid-template-columns:repeat(2,1fr);gap:8px;margin-top:20px}
.gal a{display:block;aspect-ratio:1;overflow:hidden;border-radius:calc(var(--radius) / 2);background:var(--surface)}
.gal a:nth-child(5n+1){grid-column:span 2;aspect-ratio:16/10}
.gal img{width:100%;height:100%;object-fit:cover}
.lb{position:fixed;inset:0;background:rgba(0,0,0,.92);z-index:80;display:flex;align-items:center;justify-content:center}
.lb img{max-height:90vh;max-width:96vw;object-fit:contain}
.lb button{position:absolute;top:12px;right:12px;width:48px;height:48px;border-radius:50%;border:0;background:rgba(255,255,255,.15);color:#fff;font-size:1.5rem}

.video{aspect-ratio:16/9;width:100%;border:0;border-radius:var(--radius);margin-top:18px}

/* forms */
.form{text-align:left;margin-top:22px;background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:22px 18px}
.form label{display:block;font-weight:600;font-size:.92rem;margin:14px 0 6px}
.form input,.form select,.form textarea{width:100%;min-height:48px;padding:12px 14px;border:1px solid var(--line);border-radius:12px;background:var(--bg);font-size:1rem}
.form textarea{min-height:96px;resize:vertical}
.chips{display:flex;flex-wrap:wrap;gap:8px}
.chips label{margin:0;font-weight:500}
.chips input{position:absolute;opacity:0;width:1px;height:1px}
.chips span{display:inline-flex;align-items:center;min-height:44px;padding:8px 16px;border-radius:999px;border:1px solid var(--line);background:var(--bg);cursor:pointer}
.chips input:checked+span{background:var(--primary);color:var(--on-primary);border-color:var(--primary)}
.chips input:focus-visible+span{outline:3px solid var(--primary);outline-offset:2px}
.form .btn{width:100%;margin-top:18px}
.msg{margin-top:12px;font-size:.92rem;min-height:1.2em}
.msg.ok{color:var(--ok)}.msg.err{color:var(--err)}

/* wishes */
.wishes{margin-top:22px;text-align:left;max-height:460px;overflow:auto;display:flex;flex-direction:column;gap:12px}
.wish{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:14px 16px}
.wish b{display:block}
.wish time{font-size:.75rem;color:var(--muted)}

/* gift */
.acct{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:20px;margin:14px 0}
.acct .lbl{font-weight:700;letter-spacing:.06em;text-transform:uppercase;font-size:.85rem}
.acct .num{font-family:ui-monospace,Menlo,monospace;font-size:1.25rem;letter-spacing:.06em;margin:6px 0;word-break:break-all}
.acct img{max-width:240px;margin:10px auto;border-radius:12px}

/* wishlist */
.wl{display:grid;gap:12px;margin-top:20px;text-align:left}
.wl .it{display:flex;gap:12px;align-items:center;background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:12px}
.wl img{width:64px;height:64px;object-fit:cover;border-radius:10px}
.wl .it>div{flex:1;min-width:0}

/* guest QR (named links, Hari-H plan) */
.qr{background:#fff;color:#111;border-radius:var(--radius);padding:18px;display:inline-block;margin-top:16px}
.qr svg{width:200px;height:200px}

/* floating controls */
.fab{position:fixed;right:12px;bottom:calc(12px + env(safe-area-inset-bottom));z-index:40;display:flex;flex-direction:column;gap:8px;opacity:0;transition:opacity .4s}
.opened .fab{opacity:1}
.fab button{width:48px;height:48px;border-radius:50%;border:1px solid var(--line);background:var(--surface);color:var(--primary);box-shadow:0 4px 14px rgba(0,0,0,.15);cursor:pointer;font-weight:700;display:flex;align-items:center;justify-content:center}
.fab button[aria-pressed=true]{background:var(--primary);color:var(--on-primary)}
.fab svg{width:22px;height:22px}

.foot{padding:40px 24px 96px;text-align:center;font-size:.85rem;color:var(--muted)}
.foot a{color:inherit}
.wm{position:fixed;left:0;right:0;bottom:0;z-index:30;text-align:center;font-size:.8rem;padding:8px 64px calc(8px + env(safe-area-inset-bottom)) 12px;background:rgba(0,0,0,.78);color:#fff}
.wm a{color:#fff;font-weight:700}
.preview-bar{position:sticky;top:0;z-index:60;background:#111;color:#fff;text-align:center;font-size:.8rem;padding:6px}

/* thank-you mode */
.thanks-banner{background:var(--primary);color:var(--on-primary);padding:22px;text-align:center}

/* reveal animation (disabled in Lite mode and for prefers-reduced-motion) */
.rv{opacity:0;transform:translateY(28px);transition:opacity .9s ease,transform .9s cubic-bezier(.2,.7,.2,1)}
.rv.in{opacity:1;transform:none}
/* vary the entrance per section: rise, zoom, from left, from right */
.main>div:nth-child(4n+2) .rv{transform:scale(.92)}
.main>div:nth-child(4n+3) .rv{transform:translateX(-36px)}
.main>div:nth-child(4n) .rv{transform:translateX(36px)}
.main>div .rv.in{transform:none}
.main{overflow-x:clip}
.rv.in>*{animation:rv-child .8s cubic-bezier(.2,.7,.2,1) both}
.rv.in>:nth-child(2){animation-delay:.08s}.rv.in>:nth-child(3){animation-delay:.16s}.rv.in>:nth-child(4){animation-delay:.24s}.rv.in>:nth-child(5){animation-delay:.32s}.rv.in>:nth-child(n+6){animation-delay:.4s}
@keyframes rv-child{from{opacity:0;transform:translateY(14px)}}
.rv .divider{clip-path:inset(0 50%);transition:clip-path 1.2s cubic-bezier(.2,.7,.2,1) .3s}
.rv.in .divider{clip-path:inset(0)}
.b .corner{animation:orn-sway 11s ease-in-out infinite alternate}
.b .corner.br{animation-delay:-5.5s}
html.lite .rv{opacity:1;transform:none;transition:none}
html.lite *{animation:none!important;transition:none!important}
html.lite .heavy{display:none!important}
html.lite .main{background-image:none}
html.lite .cover .corner,html.lite .b .corner{display:none}
html.lite .fx,html.lite .cv-tile,html.lite .cv-glow{display:none}
html.lite .cover .names{-webkit-text-fill-color:currentColor;background:none}
html.lite .rv .divider{clip-path:none}
@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}.rv{opacity:1;transform:none;transition:none}.cover{transition:none}*{animation:none!important}}
@media (prefers-reduced-motion:reduce){.main>div .rv{transform:none}.rv .divider{clip-path:none}.fx{display:none}}
@keyframes float{0%,100%{transform:translateY(0)}50%{transform:translateY(-6px)}}
.cover .btn{animation:float 3s ease-in-out infinite}

/* design-mode decorations */
.deco-layer{position:absolute;inset:0;pointer-events:none;overflow:hidden}
.deco-layer img{position:absolute;max-width:none}
[data-editor] .b{outline:1px dashed transparent;cursor:pointer}
[data-editor] .b:hover{outline-color:var(--accent)}
@media print{.fab,.wm,.cover{display:none!important}.rv{opacity:1;transform:none}}

/* Windowed cover photo (manifest `photo`): the photo sits in a shape on the theme's own cover. */
.cv-photo{position:relative;z-index:1;margin:14px auto 18px;width:min(58vw,236px);aspect-ratio:3/4;overflow:hidden;box-shadow:0 18px 42px rgba(0,0,0,.2);animation:cv-in .9s .25s cubic-bezier(.2,.7,.2,1) both}
.cv-photo img{display:block;width:100%;height:100%;object-fit:cover;object-position:50% 30%;animation:cv-zoom 16s ease-in-out infinite alternate}
@keyframes cv-zoom{from{transform:scale(1)}to{transform:scale(1.09)}}
.shape.has-window .cv-photo{width:min(44vw,180px)}
.cover.shape.has-window .frame{padding-top:clamp(64px,11vh,104px)!important}
.has-window .names{margin-top:.2rem}
.pl-arch .cv-photo{border-radius:999px 999px 18px 18px;outline:1px solid var(--cover-orn);outline-offset:7px}
.pl-circle .cv-photo{width:min(52vw,210px);aspect-ratio:1;border-radius:50%;outline:1px solid var(--cover-orn);outline-offset:9px;box-shadow:0 0 0 18px color-mix(in srgb,var(--cover-orn) 12%,transparent),0 18px 42px rgba(0,0,0,.2)}
.pl-oval .cv-photo{width:min(50vw,200px);aspect-ratio:3/4.3;border-radius:50%;outline:2px solid var(--cover-orn);outline-offset:6px}
.pl-polaroid .cv-photo{width:min(54vw,214px);margin-top:24px;padding:10px 10px 40px;background:#fffdf8;border-radius:3px;transform:rotate(-3deg);overflow:visible;animation:cv-pola 1s .25s cubic-bezier(.2,.7,.2,1) both}
.pl-polaroid .cv-photo img{height:auto;aspect-ratio:4/4.6}
.pl-polaroid .cv-photo::after{content:"";position:absolute;top:-10px;left:50%;width:74px;height:22px;margin-left:-37px;background:color-mix(in srgb,var(--cover-orn) 45%,#fff);opacity:.85;transform:rotate(2deg)}
@keyframes cv-pola{from{opacity:0;transform:rotate(-12deg) translateY(30px) scale(.9)}to{opacity:1;transform:rotate(-3deg)}}
.pl-frame .cv-photo{border:6px solid var(--cover-bg);outline:1px solid var(--cover-orn);outline-offset:4px;box-shadow:0 0 0 1px var(--cover-orn),0 18px 42px rgba(0,0,0,.2)}
.pl-film .cv-photo{width:min(76vw,300px);aspect-ratio:4/3.4;border-radius:4px;border-block:16px solid #141414;box-shadow:0 18px 42px rgba(0,0,0,.28)}
.pl-film .cv-photo::before,.pl-film .cv-photo::after{content:"";position:absolute;left:0;right:0;height:6px;z-index:2;background:repeating-linear-gradient(90deg,#e9e4da 0 8px,transparent 8px 18px)}
.pl-film .cv-photo::before{top:-11px}
.pl-film .cv-photo::after{bottom:-11px}
.pl-blob .cv-photo{width:min(58vw,232px);aspect-ratio:1/1.08;border-radius:58% 42% 46% 54%/50% 45% 55% 50%;animation:cv-in .9s .25s both,cv-blob 12s ease-in-out infinite alternate}
@keyframes cv-blob{to{border-radius:44% 56% 58% 42%/56% 50% 50% 44%}}
.pl-stamp .cv-photo{border-radius:0;padding:11px;background:radial-gradient(circle,var(--cover-bg) 0 3.6px,#fffdf8 4.2px) -6px -6px/12px 12px;box-shadow:0 0 0 1px color-mix(in srgb,var(--cover-orn) 40%,transparent),0 18px 42px rgba(0,0,0,.2)}
.pl-diamond .cv-photo{width:min(54vw,214px);aspect-ratio:1;clip-path:polygon(50% 0,100% 50%,50% 100%,0 50%);box-shadow:none;margin:6px auto 10px}
.pl-split{justify-content:flex-end;padding-top:0}
.pl-split .cv-photo{position:absolute;inset:0 0 auto;width:100%;height:56%;margin:0;aspect-ratio:auto;box-shadow:none;z-index:0;animation:none;-webkit-mask:linear-gradient(#000 62%,#0000);mask:linear-gradient(#000 62%,#0000)}
.pl-split .frame{padding-top:0;margin-top:44vh}
.cover.shape.pl-split .frame{padding-top:28px}
html.lite .cv-photo,html.lite .cv-photo img{animation:none!important;transform:none}
@media (max-height:700px){.cv-photo{width:min(44vw,180px)}.pl-film .cv-photo{width:min(64vw,250px)}.pl-split .frame{margin-top:38vh}}

/* More particle moods (manifest `motion`). */
.fx-hearts i{width:var(--s);height:var(--s);background:var(--cover-orn);-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 21s-8-5.3-8-11a4.5 4.5 0 0 1 8-2.8A4.5 4.5 0 0 1 20 10c0 5.7-8 11-8 11z'/%3E%3C/svg%3E") center/contain no-repeat;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 21s-8-5.3-8-11a4.5 4.5 0 0 1 8-2.8A4.5 4.5 0 0 1 20 10c0 5.7-8 11-8 11z'/%3E%3C/svg%3E") center/contain no-repeat;top:auto;bottom:-6%;--o:.7;animation-name:fx-rise}
.fx-sparkle i{top:var(--y,40%);width:calc(var(--s)*.9);height:calc(var(--s)*.9);background:var(--cover-orn);clip-path:polygon(50% 0,61% 39%,100% 50%,61% 61%,50% 100%,39% 61%,0 50%,39% 39%);--o:1;animation:fx-twinkle calc(var(--d)/4) ease-in-out var(--dl) infinite}
.fx-sparkle i:nth-child(odd){--y:18%}
.fx-sparkle i:nth-child(3n){--y:72%}
.fx-sparkle i:nth-child(4n){--y:50%}
.fx-sparkle i:nth-child(5n){--y:88%}
.fx-leaves i{width:calc(var(--s)*1.3);border-radius:0 100% 0 100%;background:linear-gradient(160deg,var(--cover-orn),color-mix(in srgb,var(--cover-orn) 50%,#2f5d3a));--o:.7}
.fx-lanterns i{top:auto;bottom:-8%;width:calc(var(--s)*1.1);height:calc(var(--s)*1.5);border-radius:40% 40% 30% 30%;background:radial-gradient(circle at 50% 60%,#fff6d8,var(--cover-orn) 70%);box-shadow:0 0 14px 3px color-mix(in srgb,var(--cover-orn) 55%,transparent);--o:.8;animation-name:fx-rise}
.fx-snow i{width:calc(var(--s)*.5);height:calc(var(--s)*.5);border-radius:50%;background:color-mix(in srgb,var(--cover-orn) 40%,#fff);--o:.85}

.cover.style-joglo .frame{padding-top:112px}
.cover.style-mihrab .frame{padding-top:104px}
.cover.style-tumpal .frame{padding:64px 30px 60px}
.cover.style-awan .frame{padding-top:96px}
.cover.style-hexa .frame{padding:92px 40px 92px}
.cover.style-jendela .frame{padding-top:88px}
.cover.style-kembar .frame{padding-top:86px}
.cover.has-window.pl-split .cv-photo{width:100%;margin:0}
.cover.shape.has-window.pl-film .cv-photo{width:min(62vw,250px)}

/* Layered illustrated scene (manifest `scene`): painted backdrop, foreground frame, ornament, couple. */
.cover.scene{background:var(--cover-bg);transition:opacity 1s .55s,visibility 0s 1.6s}
.cover.scene::before{content:"";position:absolute;inset:0;z-index:-1;background:radial-gradient(ellipse 82% 58% at 50% 52%,color-mix(in srgb,var(--cover-bg) 84%,transparent),color-mix(in srgb,var(--cover-bg) 40%,transparent) 64%,transparent 86%)}
.cover.scene::after{inset:14px;border-color:color-mix(in srgb,var(--cover-orn) 55%,transparent)}
.cover.scene .corner,.cover.scene .frame::before{display:none}
.cover.scene.style-frame .frame,.cover.scene.style-arch .frame{border-color:color-mix(in srgb,var(--cover-orn) 60%,transparent);outline-color:color-mix(in srgb,var(--cover-orn) 35%,transparent)}
.sc-bg,.sc-fg{position:absolute!important;inset:0;pointer-events:none}
.sc-bg{z-index:-2!important;background:var(--sc-bg) 50% 40%/cover no-repeat;animation:sc-drift 26s ease-in-out infinite alternate}
.sc-fg{z-index:0!important;background:var(--sc-fg) 50% 100%/cover no-repeat;animation:sc-in 1.6s cubic-bezier(.2,.7,.2,1) both;transition:transform 1.4s cubic-bezier(.6,0,.2,1),opacity 1.2s}
.cover.scene .frame{max-width:340px;padding:22px 20px 18px;animation:cv-in 1s .5s both}
.sc-orn{display:block;width:clamp(78px,24vw,112px);aspect-ratio:1;margin:0 auto 6px;background:var(--sc-orn) center/contain no-repeat;filter:drop-shadow(0 6px 10px rgba(0,0,0,.18));animation:sc-float 6s ease-in-out infinite alternate}
.sc-couple{display:block;width:min(64vw,250px);height:clamp(150px,28vh,250px);margin:4px auto 6px;background:var(--sc-couple) 50% 100%/contain no-repeat;filter:drop-shadow(0 12px 16px rgba(0,0,0,.22));animation:sc-rise 1.3s .7s cubic-bezier(.2,.7,.2,1) both}
.cover.scene .names{margin:.25rem 0 .1rem}
.cover.scene .to{margin-top:.9rem}
.cover.scene .btn{margin-top:.9rem;box-shadow:0 10px 24px rgba(0,0,0,.18)}
.opened .cover.scene{transform:none;opacity:0;visibility:hidden}
.opened .cover.scene .sc-fg{transform:scale(1.45);opacity:0}
.opened .cover.scene .frame{opacity:0;transform:translateY(-24px);transition:opacity .6s,transform .8s}
@keyframes sc-drift{from{transform:scale(1.04) translateY(0)}to{transform:scale(1.14) translateY(-2%)}}
@keyframes sc-in{from{transform:scale(1.18);opacity:0}}
@keyframes sc-float{from{transform:translateY(0) rotate(-1.5deg)}to{transform:translateY(-6px) rotate(1.5deg)}}
@keyframes sc-rise{from{opacity:0;transform:translateY(26px)}}
/* page: the painting stays behind translucent sections; ornament heads each section */
body.scene .shell::before{content:"";position:fixed;inset:0;z-index:-1;background:linear-gradient(color-mix(in srgb,var(--bg) 46%,transparent),color-mix(in srgb,var(--bg) 70%,transparent)),var(--sc-bg) 50% 40%/cover no-repeat}
body.scene{background:var(--bg)}
body.scene .shell{position:relative;isolation:isolate}
body.scene .main{background:transparent;background-image:none;box-shadow:none}
body.scene .b{margin:18px 14px;padding:58px 20px 50px;background:color-mix(in srgb,var(--surface) 90%,transparent);border-radius:var(--radius);box-shadow:0 14px 36px rgba(0,0,0,.1);-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px)}
body.scene .b::before{content:"";position:absolute;inset:8px;border:1px solid color-mix(in srgb,var(--accent) 40%,transparent);border-radius:calc(var(--radius) - 4px);pointer-events:none}
body.scene .divider{height:58px;max-width:none;margin:6px auto 18px;background:var(--sc-orn) center/contain no-repeat}
body.scene .b-closing::after{content:"";display:block;height:min(62vw,280px);margin:18px auto -50px;background:var(--sc-couple) 50% 100%/contain no-repeat}
body.scene .foot{padding-bottom:calc(150px + env(safe-area-inset-bottom));background:var(--sc-fg) 50% 100%/100% auto no-repeat}
@media (min-width:960px){body.scene .main{background:color-mix(in srgb,var(--bg) 35%,transparent)}body.scene .aside{background-image:var(--sc-bg)}}
html.lite body.scene .shell::before{background:var(--bg)}
html.lite body.scene .b{-webkit-backdrop-filter:none;backdrop-filter:none;background:var(--surface)}
html.lite .sc-fg{transform:none;opacity:1}
.t-lamin-kenyah .cover:not(.has-photo){background:linear-gradient(180deg,color-mix(in srgb,var(--accent) 30%,var(--cover-bg)) 0%,var(--cover-bg) 46%,color-mix(in srgb,var(--primary) 10%,var(--cover-bg)) 100%)}
.t-lamin-kenyah .cover .names{font-size:clamp(1.9rem,9vw,2.7rem);letter-spacing:.12em;text-transform:uppercase;color:var(--cover-btn)}
.t-lamin-kenyah .cover .eyebrow{letter-spacing:.32em;font-size:.72rem}
.t-lamin-kenyah .cover.has-photo .names{color:#fff}
.t-lamin-kenyah .b-h{text-transform:uppercase;letter-spacing:.18em;font-size:clamp(1.15rem,5vw,1.5rem)}
.t-lamin-kenyah .b-opening .b-h{text-transform:none;letter-spacing:.04em;font-size:clamp(1.7rem,7vw,2.2rem)}
.t-lamin-kenyah .person .photo{width:190px;height:190px;border-radius:50%;border:0;box-shadow:0 0 0 6px var(--surface),0 0 0 7px var(--accent),0 16px 34px rgba(0,0,0,.14)}
.t-lamin-kenyah .ev{border:0;box-shadow:0 14px 36px color-mix(in srgb,var(--primary) 14%,transparent)}
.t-lamin-kenyah .btn{border-radius:999px}
.t-lamin-kenyah .amp{color:var(--accent)}
html.lite .t-lamin-kenyah .cover{background:var(--cover-bg)}
