:root{--paper:#f0eee5;--navy:#38455d;--coral:#cb5148;--gold:#d3ad35;--ink:#293447;--teal:#b0ccca}*{box-sizing:border-box}html{scroll-behavior:smooth;scroll-padding-top:30px}body{margin:0;background:var(--paper);color:var(--ink);font:17px/1.75 'Avenir Next',Avenir,'Segoe UI',sans-serif}body.locked{overflow:hidden}button,input,textarea{font:inherit}a{color:inherit;text-underline-offset:5px}button,a,input,textarea{touch-action:manipulation}button{cursor:pointer}button:disabled{cursor:wait;opacity:.6}button:focus-visible,a:focus-visible,input:focus-visible,textarea:focus-visible,.photo-stage:focus-visible{outline:3px solid var(--coral);outline-offset:5px}button{border:0;background:var(--navy);color:white;padding:14px 23px;border-radius:4px}button:hover{background:#26344b}h1,h2,p{margin-top:0}h1,h2{font-family:Georgia,'Times New Roman',serif;font-weight:400;line-height:1.15}h1{font-size:clamp(2.4rem,5vw,4rem);margin-bottom:24px}h1 span{display:block;font-size:.55em;margin-top:12px;font-style:italic}h2{font-size:clamp(2rem,4vw,3rem);margin-bottom:28px}.eyebrow{font-size:.75rem;letter-spacing:.17em;text-transform:uppercase;font-weight:600}.small{font-size:.85rem;font-weight:400}.status{font-size:.9rem;min-height:1.7em;margin:12px 0 0}.status.error{color:#a52d25}#confetti{position:fixed;inset:0;width:100%;height:100%;pointer-events:none;z-index:0}#gate{position:fixed;inset:0;display:grid;place-items:center;z-index:4;padding:24px;transition:opacity .5s,transform .6s}#gate.opening{opacity:0;transform:scale(.96);pointer-events:none}.gate-card{width:min(660px,100%);padding:clamp(28px,5vw,56px);background:rgba(248,246,237,.97);border:1px solid #fff8;box-shadow:0 22px 90px #38455d25;text-align:center;border-radius:6px}.gate-card label{text-align:left}.password-row{display:flex;gap:10px}.password-row input{min-width:0;flex:1}.password-row button{white-space:nowrap}label,legend{display:block;font-size:.9rem;font-weight:600;margin-bottom:8px}input:not([type=radio],[type=hidden]),textarea{width:100%;padding:13px;background:#fffaf3;border:1px solid #38455d4d;border-radius:4px;color:var(--ink)}main{position:relative;z-index:1}.topbar{max-width:1120px;margin:auto;padding:24px 32px;display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid #38455d22}.topbar a{text-decoration:none}.wordmark{font-family:Georgia,serif;font-size:1.35rem}.wordmark em{color:var(--coral)}.invitation-hero{display:flex;align-items:center;flex-direction:column;padding:44px 24px 38px;gap:20px}.invitation-hero .eyebrow{text-align:center;margin:0}.invite-card{width:min(468px,90vw);height:auto;box-shadow:none;transform:none}.scroll-link{font-size:.9rem;text-decoration:none;display:flex;gap:22px;align-items:center;margin-top:16px}.content{max-width:1000px;margin:0 auto;padding:0 32px;background:var(--paper)}.section{padding:64px 0;border-top:1px solid #38455d30}.host{display:grid;grid-template-columns:1fr 2fr;padding:40px 0}.host h2{font-size:1.7rem}.host-name{font-size:1.35rem;margin:0}.host .small{margin:10px 0 0}.date-strip{display:flex;gap:25px;align-items:center;padding:24px 0;border-block:1px solid #38455d25;margin-bottom:32px}.date-strip span{font-size:.85rem}.date-strip strong{display:block;font-size:1.4rem;font-weight:500}.date-strip p{margin:0 0 0 auto;font-size:.85rem}.prose{max-width:780px}.prose p{margin-bottom:24px}.bring{background:#dce5dc;border-left:3px solid var(--gold);padding:26px 30px;margin:32px 0}.bring p{margin:0}.section-heading{display:flex;align-items:end;justify-content:space-between;gap:20px;margin-bottom:24px}.section-heading h2{margin:0}.section-heading .eyebrow{margin-bottom:12px}#photo-count{white-space:nowrap;font-size:.85rem}.photo-stage{position:relative;background:#273244;aspect-ratio:1.65;overflow:hidden;border-radius:5px}.photo-stage img{display:block;width:100%;height:100%;object-fit:contain}.photo-stage button{position:absolute;top:50%;transform:translateY(-50%);border:1px solid #fff8;background:#f0eee5ef;color:var(--ink);width:46px;height:46px;padding:0;font-size:1.3rem;border-radius:50%}.previous{left:16px}.next{right:16px}#photo-caption{font-size:.9rem;margin:16px 0 8px}.photo-dots{display:flex;gap:0;flex-wrap:wrap;justify-content:center}.photo-dots button{background:transparent;padding:12px 8px}.photo-dots button:after{content:'';display:block;width:7px;height:7px;background:#38455d40;border-radius:50%}.photo-dots button[aria-current=true]:after{background:var(--coral)}.rsvp{display:grid;grid-template-columns:1fr 1.35fr;gap:50px}.rsvp h2{max-width:230px}.rsvp form>input,.rsvp textarea{margin-bottom:22px}fieldset{border:0;padding:0;margin:0 0 24px}legend{padding:0}.choices{display:flex;gap:10px}.choices label{flex:1;position:relative;margin:0;cursor:pointer}.choices input{position:absolute;opacity:0}.choices span{display:block;padding:10px;text-align:center;border:1px solid #38455d50;border-radius:4px}.choices input:checked+span{background:var(--navy);color:white;border-color:var(--navy)}.choices input:focus-visible+span{outline:3px solid var(--coral);outline-offset:3px}#rsvp-submit{width:100%;display:flex;justify-content:space-between}footer{border-top:1px solid #38455d30;padding:40px 0 70px;text-align:center;font-family:Georgia,serif;font-size:1.3rem}footer span{display:block;font-family:'Avenir Next',sans-serif;font-size:.75rem;margin-top:14px}#motion-toggle{position:fixed;bottom:12px;right:12px;z-index:5;font-size:.75rem;padding:8px 12px;border:1px solid #38455d40;background:var(--paper);color:var(--ink)}[hidden]{display:none!important}@media(max-width:640px){body{font-size:16px}.password-row{flex-direction:column}.gate-card{padding:30px 24px}.gate-card .eyebrow{font-size:.7rem}.content{padding:0 24px}.topbar{padding:20px 24px}.invitation-hero{padding-top:28px}.invitation-hero .eyebrow{max-width:260px}.section{padding:40px 0}.host{grid-template-columns:1fr;gap:0}.host h2{margin-bottom:15px}.date-strip{flex-wrap:wrap;gap:16px}.date-strip p{width:100%;margin:0}.rsvp{grid-template-columns:1fr;gap:12px}.rsvp h2{max-width:none}.photo-stage{aspect-ratio:1.35}.photo-stage button{width:40px;height:40px}.previous{left:8px}.next{right:8px}.bring{padding:22px}.section-heading h2{font-size:2rem}}@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}#gate{transition:none}.invite-card{transform:none}}

.table-scroll{overflow-x:auto}table{width:100%;border-collapse:collapse;font-size:.9rem;text-align:left}th{font-size:.8rem;color:var(--navy);white-space:nowrap}th,td{padding:16px 12px;border-bottom:1px solid #38455d25;vertical-align:top}td{min-width:90px;max-width:260px;overflow-wrap:anywhere;white-space:pre-wrap}td:first-child{min-width:150px}td:nth-child(4),td:nth-child(5){min-width:180px}.guest-name{background:none;color:var(--coral);padding:0;text-align:left;text-decoration:underline;text-underline-offset:4px;white-space:normal}.guest-name:hover{background:none;color:var(--navy)}#cancel-edit{margin-top:12px;background:transparent;color:var(--navy);border:1px solid var(--navy);width:100%}#editing-status{padding:12px;background:#dce5dc}#refresh-guests{padding:8px 16px;font-size:.85rem}

.animated-invite{display:block;overflow:visible;background:transparent;box-shadow:none;transform:none}
.balloon{animation:balloon-sway 7s ease-in-out infinite;transform-origin:50% 55%}
.balloon-red{animation-duration:8.5s;animation-delay:-1s;transform-origin:85% 26%}
.balloon-years{animation-duration:9s;animation-delay:-5s;transform-origin:80% 52%}
.balloon-fifty{animation-duration:8s;animation-delay:-3s;transform-origin:50% 53%}
.flowing-banner{transform-origin:234px 105px;animation:banner-flow 6s ease-in-out infinite}
@keyframes balloon-sway{0%,100%{transform:translate(-3px,1px) rotate(-1deg)}50%{transform:translate(3px,-3px) rotate(1deg)}}
@keyframes banner-flow{0%,100%{transform:translateY(2px) rotate(-1deg) skewY(-.7deg)}50%{transform:translateY(-4px) rotate(1deg) skewY(.9deg)}}
.motion-paused .balloon,.motion-paused .flowing-banner{animation-play-state:paused}
.location-details{display:flex;align-items:center;justify-content:space-between;gap:24px;flex-wrap:wrap}
.location address{font-style:normal}.map-link{display:inline-flex;gap:22px;align-items:center;padding:12px 20px;border:1px solid #38455d55;border-radius:4px;text-decoration:none}.map-link:hover{background:#dce5dc}
.gallery{border-top:0;padding-top:0}.gallery-count{text-align:right;margin-bottom:12px}
@media(prefers-reduced-motion:reduce){.balloon,.flowing-banner{animation:none}.flowing-banner>g{filter:none}}

.balloon-extra-top{animation-duration:7.2s;animation-delay:-3.5s;transform-origin:14% 24%}
.balloon-extra-left{animation-duration:9.4s;animation-delay:-6s;transform-origin:12% 61%}
.balloon-extra-right{animation-duration:8.1s;animation-delay:-2s;transform-origin:88% 58%}

/* Motion is calculated together in app.js, so pause freezes all elements. */
.animated-invite .balloon{animation:none;transform-origin:0 0}

.invitation-animation{position:relative;width:min(560px,100%);padding-top:66px}
.invite-ribbon{position:absolute;top:0;left:0;width:100%;height:auto;z-index:2;pointer-events:none}
#birthday-video{display:block;width:100%;height:auto;aspect-ratio:10/9;mix-blend-mode:multiply}
.invitation-wording{text-align:center;margin-top:-4px;font-family:Georgia,serif;font-size:clamp(20px,4vw,28px);line-height:1.45}
.invitation-wording p{margin:0 0 12px}
.invitation-wording .celebrate{font-family:'Avenir Next',sans-serif;font-size:clamp(23px,4.4vw,34px);color:var(--coral);letter-spacing:2px;margin-bottom:24px}

html{scroll-padding-top:calc(var(--nav-height,100px) + 20px)}
.topbar{position:sticky;top:0;z-index:3;max-width:none;width:100%;gap:20px;background:rgba(240,238,229,.97);backdrop-filter:blur(12px);box-shadow:0 3px 16px #38455d0d;padding:18px max(24px,calc((100% - 1120px)/2))}
.topbar .wordmark{flex-shrink:0}.topbar nav{display:flex;gap:22px;flex-wrap:wrap;justify-content:flex-end;font-size:.9rem;line-height:1.5}.topbar nav a{padding:7px 0}.topbar nav a:hover{text-decoration:underline;color:var(--coral)}
.host{display:block}.host h2,.host p{display:inline;font:inherit;margin:0}.host h2{font-weight:700}
.photo-stage{aspect-ratio:1.9;background:transparent}
.photo-stage img{position:absolute;top:0;width:76%;height:100%;border-radius:5px;object-fit:contain;background:#273244}
.photo-stage #gallery-photo{left:12%}
.photo-stage .peek-previous{left:calc(-64% - 12px)}
.photo-stage .peek-next{left:calc(88% + 12px)}
.photo-stage .peek-image{opacity:.65}
.photo-stage button{z-index:1;box-shadow:0 2px 12px #0002}
@media(max-width:760px){.topbar{flex-direction:column;align-items:flex-start;gap:6px;padding:10px 20px}.topbar .wordmark{font-size:1.1rem}.topbar nav{justify-content:flex-start;gap:4px 17px;font-size:.875rem}.topbar nav a{padding:4px 0}.photo-stage{aspect-ratio:1.45}.photo-stage img{width:80%}.photo-stage #gallery-photo{left:10%}.photo-stage .peek-previous{left:calc(-70% - 8px)}.photo-stage .peek-next{left:calc(90% + 8px)}}

/* The opening invitation is white edge to edge; confetti appears below it. */
.topbar{background:#fff;backdrop-filter:none}
.invitation-hero{width:100%;background:#fff;isolation:isolate;padding-top:44px;padding-bottom:48px}
.invitation-animation{background:#fff}
#birthday-video{mix-blend-mode:normal;background:#fff}
.content{background:transparent}

/* Edge-to-edge fireworks, with the banner kept centered over the display. */
.invitation-hero{padding-left:0;padding-right:0;padding-top:0}
.invitation-animation{width:100%;max-width:none;padding-top:0}
.invite-ribbon{width:min(560px,88%);left:50%;transform:translateX(-50%);top:12px}
#birthday-video{width:100%;height:clamp(500px,82svh,950px);aspect-ratio:auto;object-fit:contain;object-position:center}
.invitation-wording{padding:26px 20px 0}
@media(max-width:600px){#birthday-video{height:76svh;min-height:500px}.invite-ribbon{top:14px}}

/* The banner is static; the white opening ends before the celebration wording. */
.invitation-hero{padding-bottom:0;gap:0}
.celebration-details{background:transparent;padding:26px 20px 48px;text-align:center}
.celebration-details .invitation-wording{padding:0;margin:0}
.celebration-details .scroll-link{width:max-content;margin:26px auto 0}

.invite-ribbon{filter:drop-shadow(0 3px 2px rgba(92,63,12,.14))}

.invitation-animation>.scroll-link{position:absolute;bottom:18px;left:50%;transform:translateX(-50%);z-index:2;margin:0;padding:8px 16px;background:rgba(255,255,255,.9);border-radius:4px;white-space:nowrap}
.invitation-wording .invitation-connector{font-size:.7em;margin:10px 0 4px}

#confetti{opacity:.65}
.content{padding-bottom:48px}

/* Keep the reading area clear from Event Information through the RSVP list. */
.content{background:var(--paper)}

.topbar .wordmark{flex-shrink:1}
@media(min-width:761px) and (max-width:1100px){.topbar{flex-wrap:wrap;gap:8px}.topbar nav{justify-content:flex-start}}

.celebration-details{background:var(--paper)}

/* Match the rendered video and its surrounding surfaces to the page palette. */
.topbar,.invitation-hero,.invitation-animation,#birthday-video{background:var(--paper)}
.invitation-animation>.scroll-link{background:rgba(240,238,229,.9)}

.celebration-details{max-width:1000px;width:100%;margin:0 auto;background:var(--paper)}

.date-strip>div>span,.date-strip>div>strong{font-size:1.4rem}
