@font-face{font-family:Cormorant;src:url('assets/fonts/CormorantGaramond-Regular.woff') format('woff');font-style:normal;font-weight:400 600;font-display:swap}
@font-face{font-family:Cormorant;src:url('assets/fonts/CormorantGaramond-Italic.woff') format('woff');font-style:italic;font-weight:400;font-display:swap}
@font-face{font-family:Pinyon;src:url('assets/fonts/PinyonScript-Regular.woff2') format('woff2');font-weight:400;font-display:swap}
:root{--paper:#faf8f6;--ink:#642c3d;--soft:#986f78;--muted:#795762;--wine:#642a3c;--line:#c7aeb4;--serif:Cormorant,Georgia,serif;--script:Pinyon,'Brush Script MT',cursive;--sans:Arial,Helvetica,sans-serif;--ease:cubic-bezier(.2,.65,.24,1)}
*{box-sizing:border-box}html{scroll-behavior:smooth;scroll-padding-top:20px}body{margin:0;background:#e8e2e2;color:var(--ink);font-family:var(--serif);-webkit-font-smoothing:antialiased}h1,h2,h3,p,figure{margin:0}button,input,select{font:inherit}button,a,input,select,summary{-webkit-tap-highlight-color:transparent}a,button{touch-action:manipulation}a{color:inherit}button{color:inherit;cursor:pointer}button:disabled{cursor:default}button:focus-visible,a:focus-visible,input:focus-visible,select:focus-visible,summary:focus-visible{outline:2px solid currentColor;outline-offset:5px}img,svg{display:block}[hidden]{display:none!important}.svg-library{position:absolute;width:0;height:0;overflow:hidden}.invitation{max-width:760px;margin:auto;background:var(--paper);overflow:clip;isolation:isolate;box-shadow:0 0 70px #40142512}.section{position:relative;text-align:center;padding:95px 34px}.section>h2{font-size:clamp(42px,9vw,62px);font-weight:400;line-height:1.08;letter-spacing:-.045em;text-wrap:balance}.eyebrow{font-family:var(--sans);font-size:10px;letter-spacing:.2em;line-height:1.75;text-transform:uppercase;color:var(--muted)}.section>.eyebrow{margin-bottom:18px}.script{font-family:var(--script);font-weight:400;line-height:1.2}.body-copy{font-size:21px;line-height:1.55;color:var(--muted);max-width:430px;margin:24px auto 0;text-wrap:pretty}.micro-copy{font-family:var(--sans);font-size:10px;line-height:1.7;color:var(--muted);margin-top:17px}.ribbon-bow{width:145px;height:66px;color:var(--soft);margin:0 auto 25px;transform-origin:center 30%;animation:bow-breathe 7s ease-in-out infinite}.small-sprig{width:110px;height:50px;color:#b08c95;margin:32px auto 0}.text-link{display:inline-flex;align-items:center;justify-content:center;gap:18px;padding:15px 28px;margin:27px auto 0;min-height:48px;border:1px solid var(--line);border-radius:40px;background:transparent;text-decoration:none;font-family:var(--sans);font-size:10px;letter-spacing:.14em;text-transform:uppercase;transition:background .3s,color .3s}.text-link>svg{width:19px;height:19px;transition:transform .3s}.text-link:hover{background:#6b344309}.text-link:hover>svg{transform:translateX(4px)}
/* Keep the unopened invitation at the top, including touch and restored hash positions. */
html.opening-locked{overflow:hidden;overscroll-behavior:none;scroll-behavior:auto}
.opening-locked body{position:fixed;inset:0;overflow:hidden;overflow:clip;overscroll-behavior:none;touch-action:pinch-zoom}
.opening-locked .hero-paper:after{animation-play-state:paused}
.opening-unavailable .opening .veil-stage,.opening-unavailable .opening .cover-scroll{display:none}
html.opening-unavailable .opening .hero-inside>*{animation:none;opacity:1;visibility:visible}
/* Edge-anchored tulle foreshortens into its hems. The rigid cameo follows the north tip. */
.opening{--unfold-duration:5.6s;--unfold-delay:.2s;--seal-drop:60px;--north-end:-.42;--crest-travel:-510px;container-type:size;height:100svh;min-height:730px;max-height:1100px;position:relative;isolation:isolate;overflow:hidden;background:var(--paper)}.hero-paper{--lace-blend:clamp(90px,12svh,140px);position:absolute;inset:0;overflow:hidden;pointer-events:none;background:#f1eade url('assets/lace-stationery.webp?v=couture-6') center/100% 100% no-repeat;-webkit-mask-image:linear-gradient(to bottom,#000 calc(100% - var(--lace-blend)),transparent 100%);mask-image:linear-gradient(to bottom,#000 calc(100% - var(--lace-blend)),transparent 100%)}.hero-paper:after{content:"";position:absolute;inset:-18%;background:linear-gradient(112deg,transparent 20%,#fff9ec16 38%,#ffffff63 49%,transparent 69%);animation:linen-light 18s ease-in-out infinite;mix-blend-mode:soft-light}.hero-inside{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;flex-direction:column;text-align:center;padding:100px 65px 130px}.hero-blessing{font-size:18px;line-height:1.2;width:170px;color:var(--muted)}.couple{font-family:var(--script);font-size:clamp(55px,15vw,90px);font-weight:400;line-height:.9;width:100%;max-width:520px;margin:20px auto 16px;letter-spacing:-.02em}.couple>span{display:block}.couple>span:not(.ampersand){white-space:nowrap}.couple .ampersand{font-family:var(--serif);font-style:italic;font-size:26px;line-height:1.35;margin:4px 0 6px;color:#ae8a92}.hero-date{font-size:22px;font-variant-numeric:lining-nums;letter-spacing:.03em;color:#956978}.hero-palace{width:170px;height:90px;object-fit:contain;margin:14px auto 9px;mix-blend-mode:multiply;filter:contrast(1.3)}.hero-venue{font-size:23px;color:#8c5967;line-height:1.12}.hero-place{font-size:9px;letter-spacing:.18em;margin-top:8px;max-width:230px}.scroll-cue{display:flex;flex-direction:column;align-items:center;gap:12px;font-family:var(--sans);font-size:10px;letter-spacing:.03em;line-height:1.4;text-decoration:none;color:var(--muted);min-width:150px;min-height:44px}.hero-inside>.scroll-cue{margin:23px auto 0;white-space:nowrap}.scroll-line{display:block;position:relative;width:1px;height:20px;background:#9d758084;animation:scroll-cue 3s ease-in-out infinite}.scroll-line:after{content:"";position:absolute;bottom:0;left:-3px;width:6px;height:6px;border-right:1px solid #9d7580;border-bottom:1px solid #9d7580;transform:rotate(45deg)}.opening:not(.is-open) .hero-inside>*{opacity:0;visibility:hidden}/* All four carriers use the same viewport stage, including short phones. */
.veil-stage{position:absolute;inset:0 0 auto;height:min(100%,100svh);container-type:size;pointer-events:none;overflow:hidden;z-index:3;--north-depth:calc(50cqh - var(--seal-drop))}
.veil-fold{position:absolute;z-index:3;left:0;top:0;width:100cqw;height:50cqh;pointer-events:none;transform-origin:0 0}
.veil-cloth{position:absolute;inset:0;transform-origin:50% 0;will-change:transform}
.veil-cloth>img{position:absolute;left:-6%;top:-8.72%;width:112%;height:116.28%;object-fit:fill;pointer-events:none}
.veil-north{z-index:5;height:var(--north-depth)}
.veil-south{left:100%;top:100%;transform:rotate(180deg);--cloth-end:-.1}
.veil-east,.veil-west{width:70cqh;height:50cqw;--cloth-end:-.5}
.veil-east{left:100%;top:15%;transform:rotate(90deg)}
.veil-west{top:85%;transform:rotate(-90deg)}
.veil-east .veil-cloth>img,.veil-west .veil-cloth>img{left:-3%;width:106%;top:-18.73%;height:128.43%}
/* A little air in the lace: the fixed hems and rigid seal do not drift.
   The image flexes within its existing overscan; its parent owns the opening. */
.veil-cloth>img{
  --air-lean:.65deg;--air-tilt:.45deg;--air-depth:1.014;
  transform-origin:50% 7.5%;
  animation:lace-air 8.8s -1.8s ease-in-out infinite;
  will-change:transform;
}
.veil-north .veil-cloth>img{--air-lean:0deg;--air-tilt:.85deg;--air-depth:1;animation-duration:9.6s;animation-delay:-2.4s}
.veil-south .veil-cloth>img{animation-duration:10.8s;animation-delay:-6.1s}
.veil-east .veil-cloth>img,.veil-west .veil-cloth>img{--air-lean:1.1deg;--air-tilt:.25deg;--air-depth:1.018;transform-origin:50% 14.584%}
.veil-east .veil-cloth>img{animation-duration:8.6s;animation-delay:-4.3s}
.veil-west .veil-cloth>img{animation-duration:9.8s;animation-delay:-.7s}
.opening:is(.is-preparing,.is-open) .veil-cloth>img{animation-play-state:paused}
.opening.cloth-cleared .veil-cloth>img{animation:none;will-change:auto}
@keyframes lace-air{
  0%,100%{transform:skewX(calc(-1 * var(--air-lean))) skewY(calc(-1 * var(--air-tilt))) scale(1.004,1)}
  50%{transform:skewX(var(--air-lean)) skewY(var(--air-tilt)) scale(1.014,var(--air-depth))}
}
.seal-button{position:absolute;z-index:6;left:50%;top:calc(100% - 24px);transform:translateX(-50%);width:150px;padding:0;border:0;background:transparent;display:flex;flex-direction:column;align-items:center;gap:0;pointer-events:auto}.wax-seal{position:relative;display:block;width:112px;height:149px;border:0;background:none;transition:transform .35s ease}.crest-shell{display:block;width:100%;height:100%;object-fit:contain;pointer-events:none}.seal-monogram{position:absolute;inset:29% 27% 27%;font-family:var(--script);font-size:39px;line-height:1;color:#f8f3eb;text-shadow:0 .8px .65px #8d7d6dd9;white-space:nowrap;letter-spacing:-.035em;pointer-events:none}.seal-monogram>span{position:absolute;display:block}.monogram-bride{left:0;top:0}.monogram-groom{right:0;bottom:0}.seal-monogram>.monogram-and{left:43%;top:40%;font-family:var(--serif);font-size:15px;font-style:italic}.seal-guide{position:absolute;top:calc(100% + 24px);left:50%;transform:translateX(-50%);white-space:nowrap;display:flex;flex-direction:column;align-items:center;gap:7px;color:#745762;font-family:var(--sans);font-size:11px;letter-spacing:.06em}.seal-guide>svg{width:27px;height:34px;animation:tap-cue 3.2s ease-in-out infinite}.seal-button:active .wax-seal{transform:scale(.975)}.cover-scroll{position:absolute;left:50%;top:min(calc(100% - 100px),calc(100svh - 85px));transform:translateX(-50%);z-index:6;white-space:nowrap}.cover-scroll>span:first-child{padding:5px 10px;text-shadow:0 1px 5px var(--paper)}.is-open .seal-button{pointer-events:none}.is-open .cover-scroll{pointer-events:none;animation:cue-fade .5s both}.is-open .seal-guide{animation:cue-fade .25s both}.is-open .veil-cloth{animation:veil-gather var(--unfold-duration) var(--unfold-delay) linear both}
.is-open .veil-north .veil-cloth{--cloth-end:var(--north-end)}
.is-open .seal-button{animation:crest-lift var(--unfold-duration) var(--unfold-delay) linear both;will-change:transform}
.is-open .hero-inside>*{animation:hero-ink 1.9s 6.15s cubic-bezier(.33,0,.38,1) both}.is-open .hero-inside>.couple{animation-delay:6.25s}.is-open .hero-inside>.hero-date{animation-delay:6.4s}.is-open .hero-inside>.hero-palace{animation-delay:6.5s}.is-open .hero-inside>.hero-venue,.is-open .hero-inside>.hero-place{animation-delay:6.6s}.is-open .hero-inside>.scroll-cue{animation:hero-ink .65s 8.15s ease-in-out both}.opening.cloth-cleared .veil-stage,.opening.cloth-cleared .cover-scroll{visibility:hidden}.opening.cloth-cleared .veil-cloth,.opening.cloth-cleared .seal-button{animation:none;will-change:auto}.opening.skip-intro .hero-inside>*{animation:none;opacity:1;visibility:visible}
/* White invitation copy rests between the textile opening and the first silk panel. */
.couple>span.name-wrapped{white-space:normal;overflow-wrap:anywhere;text-wrap:balance;line-height:1.08}.opening.long-names .couple{margin-top:16px;margin-bottom:12px}.opening.long-names .couple .ampersand{line-height:1.1;margin:2px 0}.opening.long-names .hero-palace{height:72px;width:140px;margin-top:10px;margin-bottom:8px}.opening.long-names .hero-inside>.scroll-cue{margin-top:16px}
.family{padding-top:38px;padding-bottom:105px}.family .ribbon-bow{margin-bottom:24px}.family>.eyebrow{font-size:10px}.blessing{font-size:24px;font-style:italic;margin:30px auto 0;color:#926573}.family .body-copy{margin-top:15px}.family-names{display:flex;align-items:center;justify-content:center;gap:13px;margin:30px auto 0;max-width:360px;font-size:19px;line-height:1.3}.family-names>span:not(.script){flex:1}.family-names>.script{font-size:32px;color:#ac8590}
/* The paper continues into deep floral scallops: the colour boundary is hidden under opaque linen. */
.wine-panel{--lace-depth:clamp(107px,33.4vw,254px);--lace-overlap:calc(var(--lace-depth)*.12);color:#faf6f0;background:var(--paper);isolation:isolate}.wine-panel:before{content:"";position:absolute;inset:var(--lace-overlap) 0;z-index:-1;background-color:var(--wine);background-image:radial-gradient(ellipse at 12% 8%,#a45e7440,transparent 52%),linear-gradient(125deg,#481f3222,transparent 40%,#b5657914 65%,#3e19251c)}.wine-panel .body-copy,.wine-panel .eyebrow,.wine-panel .micro-copy{color:#ead8de}.lace-edge{position:absolute;left:-1px;right:-1px;height:var(--lace-depth);background:url('assets/lace-scallop.webp') center top/100% 100% no-repeat;mask-image:linear-gradient(transparent,#000 8%);pointer-events:none;z-index:2}.lace-top{top:0}.lace-bottom{bottom:0;transform:rotate(180deg)}.date-section{padding-top:155px;padding-bottom:160px}.date-section>h2{font-size:42px;letter-spacing:-.045em}.date-long{font-size:21px;color:#e4c7d1;margin-top:18px;letter-spacing:.03em}.countdown-keepsake{position:relative;max-width:440px;margin:28px -14px 0;padding:42px 16px 38px;color:#e7cdd4}.date-cartouche{position:absolute;inset:0;width:100%;height:100%;overflow:visible;pointer-events:none}.cartouche-outline path{stroke-dasharray:1;stroke-dashoffset:0}.js .cartouche-outline path{stroke-dashoffset:1}.has-entered .cartouche-outline path{animation:guest-ink 2.4s ease .15s both}.cartouche-tails{transform-origin:190px 20px;animation:ribbon-tail 8s ease-in-out infinite}.countdown{display:flex;align-items:center;justify-content:center;gap:15px;margin:0 auto;max-width:350px;color:#faf6f0;position:relative}.countdown>div{display:flex;flex-direction:column;align-items:center;gap:9px;min-width:53px}.countdown span{font-size:45px;line-height:1;font-variant-numeric:tabular-nums}.countdown small{font-family:var(--sans);font-size:9px;letter-spacing:.15em;text-transform:uppercase;color:#ead8de}.countdown i{font-size:21px;color:#d6b1bf;font-style:normal;margin-top:-17px}.countdown-note:empty{display:none}.countdown-note{font-style:italic;font-size:19px;margin-top:22px}.wine-panel .text-link{border-color:#d2aab785;color:#fff9f3}.wine-panel .text-link:hover{background:#fff9f316}.date-section .text-link{margin-top:25px}.wine-panel .micro-copy{font-size:10px;color:#d8b9c3}
/* A warm foil keepsake: only this small surface captures a scratching gesture. */
.date-scratch{position:relative;max-width:440px;margin:32px auto 0;border:1px solid #e4c9b06e;border-radius:22px;isolation:isolate;box-shadow:0 12px 30px #36132224;overflow:hidden}
.scratch-reveal{padding:24px 9px 22px;min-height:240px;background:radial-gradient(ellipse at 50% 45%,#ad687626,transparent 75%)}
.scratch-reveal .date-long{margin:0;font-size:clamp(22px,6.2vw,31px);line-height:1.25;padding-inline:8px;text-wrap:balance}
.scratch-reveal .countdown-keepsake{margin:18px auto 0;padding:40px 5px 35px;max-width:100%}
.scratch-reveal .countdown{gap:9px}
.scratch-reveal .countdown>div{min-width:49px}
.scratch-reveal .countdown span{font-size:clamp(34px,10vw,46px)}
.scratch-reveal .countdown small{font-size:8px}
.scratch-reveal .countdown-note{margin-top:6px;font-size:18px;line-height:1.3}
.scratch-reveal .cartouche-outline path{stroke-dashoffset:0;animation:none}
.scratch-coating{display:none;position:absolute;inset:0;width:100%;height:100%;z-index:2;touch-action:none;user-select:none;-webkit-user-select:none;cursor:crosshair;transition:opacity 1.05s cubic-bezier(.22,.61,.36,1);opacity:1}
.is-scratch-ready .scratch-coating{display:block}
.date-scratch.is-revealed .scratch-coating{opacity:0;pointer-events:none}
.scratch-actions{min-height:92px;margin:19px auto 0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1px}
.scratch-guide{display:flex;align-items:center;justify-content:center;gap:8px;color:#ead8de;font-family:var(--serif);font-size:19px;font-style:italic;line-height:1.3}
.scratch-guide svg{width:20px;height:28px;flex:none;opacity:.8}
.is-revealed+.scratch-actions .scratch-guide svg{display:none}
.scratch-alternative{border:0;background:none;color:#e2c3cc;font-family:var(--sans);font-size:10px;letter-spacing:.03em;min-height:44px;padding:10px 14px;text-decoration:underline;text-underline-offset:4px}
.scratch-status{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}
.date-section #save-date:disabled{opacity:.4;pointer-events:none}
.date-section .scratch-actions+#scratch-status+#save-date{margin-top:12px}
@container ivory-page (min-width:650px){.scratch-reveal{padding:30px 22px 26px}.scratch-reveal .countdown{gap:18px}.scratch-reveal .countdown>div{min-width:65px}.scratch-guide{font-size:21px}}
@container ivory-page (max-width:359px){.scratch-reveal{padding-inline:3px}.scratch-reveal .countdown{gap:6px}.scratch-reveal .countdown>div{min-width:46px}.scratch-guide{font-size:17px}}
@media print{.scratch-coating,.scratch-actions{display:none!important}}
/* A lace cameo holds the venue like a small engraved keepsake. */
.venue-section{padding-top:70px;padding-bottom:65px}.venue-name{font-size:49px;line-height:1.12;color:#7c4658;margin:27px auto 13px;max-width:100%;overflow-wrap:anywhere}.venue-name+.eyebrow{font-size:10px;margin:0}.venue-illustration{margin:30px -10px 20px;max-width:440px}.venue-cameo{position:relative;width:100%;aspect-ratio:2/3}.cameo-mat{width:100%;height:100%;object-fit:contain}.cameo-ink{position:absolute;left:20%;top:35%;width:60%;height:32%;display:flex;align-items:center;overflow:hidden;mix-blend-mode:multiply}.cameo-ink>img{width:100%;height:auto;filter:contrast(1.3);mask-image:radial-gradient(ellipse,#000 36%,#000c 64%,transparent 79%)}.cameo-dedication{position:absolute;top:24%;left:24%;width:52%;font-family:var(--script);font-size:26px;line-height:1.18;color:#895463}.cameo-date{position:absolute;top:69%;left:25%;width:50%;font-size:16px;letter-spacing:.04em;color:#795762}.cameo-date:after{content:"";display:block;width:30px;height:1px;background:#ba939d;margin:15px auto 0}.js .cameo-ink{opacity:0}.has-entered .cameo-ink{animation:palace-ink 2.3s .3s ease both}.venue-leaf{position:absolute;right:1%;bottom:9%;width:23%;height:31%;color:#916575;transform-origin:50% 90%}.venue-leaf .leaf-stem{stroke-dasharray:1;stroke-dashoffset:0}.js .venue-leaf .leaf-stem{stroke-dashoffset:1}.has-entered .venue-leaf .leaf-stem{animation:guest-ink 2.4s .7s ease both}.venue-leaf .leaf-tips{transform-origin:50px 140px;animation:leaf-stir 8.4s ease-in-out infinite}.venue-illustration figcaption{font-family:var(--sans);font-size:10px;line-height:1.6;color:var(--muted);margin:13px 0 0}.venue-section address{font-family:var(--sans);font-size:11px;line-height:1.8;font-style:normal;color:var(--muted);max-width:290px;margin:20px auto 0}.venue-section .body-copy{font-size:20px}
/* An open vertical schedule: all times and locations are visible at a glance. */
.celebrations{padding-top:195px;padding-bottom:50px}.pearl-garland{position:absolute;left:-3%;right:-3%;top:10px;aspect-ratio:1100/371;pointer-events:none;color:#bb96a0;transform-origin:50% 8%}.pearl-swag{width:100%;height:100%;object-fit:contain;transform-origin:50% 0}.js .pearl-swag{opacity:0;transform:translateY(-6px) rotate(-.6deg)}.has-entered .pearl-swag{animation:pearl-settle 3s cubic-bezier(.22,.61,.36,1) both}.pearl-pendant{position:absolute;top:45%;left:calc(50% - 4px);width:8px;height:12px;border-radius:50% 50% 45% 45%;background:radial-gradient(circle at 30% 26%,#fffefa,#e6d7bb 53%,#a88f70);box-shadow:0 1px 2px #63473922;transform-origin:50% -5px;animation:pendant-sway 7.3s ease-in-out infinite}.has-entered .pearl-pendant{animation-delay:1.5s}
.celebrations>.body-copy{font-size:19px;margin-top:19px}.event-list{position:relative;text-align:left;max-width:490px;margin:42px auto 0}.event-list:before{content:"";position:absolute;width:1px;left:98px;top:28px;bottom:40px;background:linear-gradient(#d7bac1,#a77b89 50%,#d7bac1);transform-origin:top;transform:scaleY(0)}.event-list.has-entered:before{animation:timeline-draw 2.2s cubic-bezier(.3,.15,.3,1) both}.event-list:not(.is-in-view):before,.page-hidden .event-list:before{animation-play-state:paused!important}.event{position:relative;padding:0 0 35px}.event:before{content:"";position:absolute;left:94px;top:28px;width:9px;height:9px;border:1px solid #9e7180;background:var(--paper);border-radius:50%;box-shadow:0 0 0 4px var(--paper);z-index:1}.event summary{list-style:none;cursor:pointer;display:grid;grid-template-columns:79px 1fr;column-gap:40px;min-height:180px;position:relative;padding:10px 0 0}.event summary::-webkit-details-marker{display:none}.event-when{text-align:center;display:flex;align-items:center;flex-direction:column;gap:4px}.event-date{font-family:var(--sans);font-size:10px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted)}.event-time{font-size:24px;color:#8a5366;line-height:1.05;white-space:nowrap;margin-top:3px}.event-icon{width:56px;height:65px;color:#b2909a;margin-top:13px}.event-name{font-size:27px;line-height:1.08;letter-spacing:-.025em;display:block}.event-venue{display:block;font-size:16px;line-height:1.3;font-style:italic;color:var(--muted);margin-top:9px}.event-description{display:block;font-size:17px;line-height:1.5;color:var(--muted);margin-top:11px}.event-more{display:flex;align-items:center;gap:7px;margin-top:15px;font-family:var(--sans);font-size:9px;letter-spacing:.04em;color:var(--muted)}.event-toggle{font-family:var(--serif);font-size:19px;line-height:1;transition:transform .3s}.event[open] .event-toggle{transform:rotate(45deg)}.event-details{padding:12px 0 0 119px;animation:detail-in .4s}.event-dress{font-size:16px;line-height:1.45;font-style:italic;color:var(--muted)}.event-maps{font-family:var(--sans);font-size:10px;line-height:1.5;display:inline-block;margin-top:12px;text-underline-offset:5px}
/* Guest notes are open blush stationery leaves, each with an original ink illustration. */
/* Four keepsake cards stay in a two-by-two grid, including on phones. */
.guest-folio.section{padding:70px 20px 75px;background:radial-gradient(ellipse at 50% 38%,#ede2cf55,transparent 68%),linear-gradient(var(--paper),#f7f2e9 48%,var(--paper))}
.guest-folio>.eyebrow{margin-inline:auto;font-size:9px}
.guest-intro{max-width:420px;margin:22px auto 0;color:var(--muted);font-size:1.25rem;font-style:italic;line-height:1.5;text-wrap:balance}
.folio-leaves{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px 12px;max-width:650px;margin:38px auto 0}
.folio-leaf{position:relative;isolation:isolate;display:flex;flex-direction:column;align-items:center;min-width:0;padding:20px 13px 25px;border:1px solid #c8b49699;border-radius:18px;background:linear-gradient(135deg,#fffdf8e8,#faf7eff2);box-shadow:0 7px 22px #684b3510,inset 0 0 0 4px #ffffff80;text-align:center}
.folio-leaf::before{content:"";position:absolute;inset:5px;border:1px solid #d6c6b647;border-radius:13px;pointer-events:none;z-index:-1}
.guest-art{position:relative;flex:none;display:grid;place-items:center;width:min(100%,180px);aspect-ratio:1;margin:0 auto 19px;border:1px solid #c3a87580;border-radius:50%;background:radial-gradient(circle,#eee4d45c 0%,#faf7ef 64%,#fdfbf6 66%);box-shadow:0 0 0 5px #fffdf5,0 0 0 6px #ceb8944d}
.guest-art::before{content:"";position:absolute;inset:8px;border:1px solid #cbb69b7a;border-radius:50%;pointer-events:none}
.guest-art::after{content:"";position:absolute;inset:-12px;border:1px dashed #cbb69b52;border-radius:50%;pointer-events:none}
.guest-art img{position:relative;width:92%;height:92%;object-fit:contain;filter:drop-shadow(0 4px 3px #604b2a18)}
.guest-palace img{width:86%;height:86%;mix-blend-mode:multiply}
.guest-hashtag-art>span{font-family:var(--serif);font-size:clamp(65px,18vw,104px);font-style:italic;line-height:1;color:#ad8955;text-shadow:1px 1px 0 #fff4d7,-1px -1px 0 #805e38,0 4px 6px #95714222;transform:translateY(-4%)}
.guest-hashtag-art>svg{position:absolute;bottom:12%;left:23%;width:54%;height:23%;color:#b49a6b}
.folio-copy{display:flex;flex:1;flex-direction:column;align-items:center;min-width:0;width:100%}
.folio-leaf h3{position:relative;font-size:clamp(1.5rem,5.9vw,1.875rem);font-weight:400;line-height:1.14;letter-spacing:-.025em;overflow-wrap:anywhere;text-wrap:balance}
.folio-leaf h3::after{content:"";display:block;width:34px;height:1px;margin:13px auto 0;background:linear-gradient(90deg,transparent,#b29464,transparent)}
.folio-leaf p{width:100%;font-size:1.125rem;font-style:italic;line-height:1.5;color:var(--muted);margin:15px auto 0;max-width:270px;overflow-wrap:anywhere;text-wrap:pretty}
.folio-leaf .guest-venue-location{font-style:normal;color:var(--ink);line-height:1.35}
.guest-venue-location>span{display:block}
.guest-venue-location>span+span{margin-top:5px;font-style:italic;color:var(--muted)}
.folio-leaf .guest-arrival-note{font-size:1.0625rem}
.folio-leaf .guest-hashtag{font-size:1.0625rem;font-style:normal;font-weight:500;color:var(--ink);line-height:1.5}
.guest-map-link{display:inline-flex;align-items:center;justify-content:center;gap:5px;min-height:44px;max-width:100%;margin:17px 0 0;padding:9px 0 5px;border-bottom:1px solid #bda17b7a;text-decoration:none;font-family:var(--sans);font-size:.5625rem;letter-spacing:.08em;line-height:1.6;text-transform:uppercase;color:#8b6e3f}
.guest-map-link>svg{width:14px;height:18px;flex:none}
.guest-map-link:hover{color:var(--wine);border-color:var(--wine)}
.js .guest-art{opacity:0;transform:translateY(8px)}
.has-entered .guest-art{animation:guest-art-settle 2s cubic-bezier(.22,.61,.36,1) both}
.guest-ink{stroke-dasharray:1;stroke-dashoffset:0}.js .guest-ink{stroke-dashoffset:1}.has-entered .guest-ink{animation:guest-ink 2s .25s ease both}
/* Two hinged oval leaves keep the couple's initials; the story remains visible. */
.story-section{padding-top:25px;padding-bottom:125px}.story-locket{position:relative;width:210px;height:195px;margin:0 auto 38px;perspective:650px;perspective-origin:100px 100px}.locket-back,.locket-face{width:110px;height:146px;border:1px solid #b98a90;border-radius:50%;background:linear-gradient(115deg,#f1ddd3,#fff6e9 42%,#dcbcaf 87%);box-shadow:inset 0 0 0 4px #f0d9cb,inset 0 0 0 5px #bc929066,1px 4px 8px #6b3d4224}.locket-back{position:absolute;top:30px;left:100px;display:grid;place-items:center}.locket-back:after,.locket-face:after{content:"";position:absolute;inset:12px;border:1px dotted #ae7f8670;border-radius:50%;pointer-events:none}.locket-back>svg,.locket-outside>svg{width:71px;height:65px;color:#a67a78;rotate:-22deg}.locket-front{position:absolute;left:100px;top:30px;width:110px;height:146px;transform-origin:0 50%;transform-style:preserve-3d;transform:rotateY(-145deg);z-index:2}.js .locket-front{transform:rotateY(0)}.locket-face{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;backface-visibility:hidden;-webkit-backface-visibility:hidden}.locket-inside{transform:rotateY(180deg);background:linear-gradient(85deg,#e8cbbd,#fff4e6 55%,#efd8ca)}.locket-initials{font-family:var(--serif);font-size:24px;font-style:italic;color:#8d5f66;text-shadow:0 1px #fff5eb;white-space:nowrap}.locket-inscription{font-family:var(--serif);font-size:13px;font-style:italic;color:#ae7e7b;margin-top:7px}.locket-hinge{position:absolute;left:96px;top:84px;width:8px;height:31px;border:1px solid #ba9190;background:linear-gradient(90deg,#d4aaa0,#fff1de,#bd9290);border-radius:3px;z-index:3}.locket-loop{position:absolute;top:8px;left:146px;width:17px;height:25px;border:2px solid #bd9390;border-radius:50%;box-shadow:inset 1px 1px #fff3df}.has-entered .locket-front{animation:locket-open 3.2s .25s cubic-bezier(.25,.1,.25,1) both}
.story-section>.eyebrow{font-size:9px}.story-ending{font-size:31px;color:#9b6a7a;max-width:350px;margin:27px auto 0}
/* A real response path when configured; transparent local preview in the demo. */
.rsvp-section{padding-top:165px;padding-bottom:170px}.reply-envelope{position:relative;width:127px;height:81px;margin:0 auto 22px;color:#e9cad1}.reply-envelope>svg{width:100%;height:100%}.reply-envelope>span{position:absolute;top:45px;left:0;width:100%;font-family:var(--script);font-size:21px;line-height:1;text-align:center;color:#f4dde0}.envelope-flap{stroke-dasharray:300;stroke-dashoffset:0}.js .envelope-flap{stroke-dashoffset:300}.has-entered .envelope-flap{animation:envelope-ink 2s .2s ease both}.rsvp-section>.body-copy{font-size:20px;color:#ead5dd}.rsvp-deadline{font-size:19px;font-style:italic;color:#e2c6d1;margin-top:21px}.rsvp-form{text-align:left;max-width:390px;margin:36px auto 0}.rsvp-form label{display:block;font-family:var(--sans);font-size:11px;letter-spacing:.025em;color:#f0dfe4;margin-bottom:10px}.rsvp-form input,.rsvp-form select{width:100%;border:1px solid #d0a9b66b;border-radius:0;background:#fff9fa08;color:#fff5f3;padding:14px 12px;margin-bottom:23px;font-family:var(--serif);font-size:20px;min-height:52px;outline-color:#fff!important}.rsvp-form input::placeholder{color:#caadb8;opacity:1}.rsvp-form select{padding-right:25px;color-scheme:dark}.rsvp-form select option{background:#642a3c;color:white}.rsvp-submit{display:flex;align-items:center;justify-content:center;gap:25px;width:100%;min-height:54px;padding:16px 20px;border:1px solid #e0c2cc;background:#f7eeef;color:#642a3c;font-family:var(--sans);font-size:11px;letter-spacing:.04em;transition:background .3s}.rsvp-submit>svg{width:22px;height:22px}.rsvp-submit:hover{background:white}.form-note{font-family:var(--sans);font-size:10px;line-height:1.75;color:#d7bbc5;margin:19px 0 0;text-align:center}.form-status{font-size:21px;line-height:1.45;color:#fff4ec;text-align:center;margin-top:22px}.form-status:empty{display:none}.closing{padding-top:80px;padding-bottom:40px}.closing-mark{position:relative;width:124px;height:100px;margin:0 auto 25px}.closing-mark>span{display:block;font-family:var(--script);font-size:39px;line-height:1.2;color:#ac7d87}.closing-mark>svg{width:108px;height:45px;color:#b48e94;position:absolute;bottom:0;left:8px}.closing>.script{font-size:30px;color:#a57787}.closing-names{font-family:var(--script);font-size:49px;line-height:1.1;margin-top:14px;overflow-wrap:anywhere}.closing-names>.script{font-family:var(--serif);font-size:27px;font-style:italic;margin:0 5px;color:#b38b98}.closing>.eyebrow{font-size:9px;letter-spacing:.14em;margin:19px 0 0}.footer-label{font-family:var(--sans);font-size:8px;letter-spacing:.25em;color:#b1939b;margin:65px 0 20px}.brand{display:inline-flex;flex-direction:column;align-items:center;gap:3px;text-decoration:none}.brand>span{font-size:25px;line-height:1;color:#8b6270;letter-spacing:-.025em}.brand>small{font-family:var(--sans);font-size:7px;letter-spacing:.17em;text-transform:uppercase;color:#b0909b}
/* Visibility observers pause decorative loops, including the one-shot opening. */
.js .reveal:not([data-scroll-text]):not([data-scroll-surface]){opacity:0;transform:translateY(10px);transition:opacity 1.5s cubic-bezier(.22,.61,.36,1) var(--reveal-delay,0ms),transform 1.5s cubic-bezier(.22,.61,.36,1) var(--reveal-delay,0ms)}.js .reveal.is-visible:not([data-scroll-text]):not([data-scroll-surface]){opacity:1;transform:translateY(0)}.scene:not(.in-view) *,.page-hidden *,.object-motion:not(.is-in-view) *{animation-play-state:paused!important}.opening:not(.in-view) .hero-paper:after,.page-hidden .hero-paper:after{animation-play-state:paused!important}
/* Enlarged reading text may wrap without crossing the event timeline. */
.section.scene :is(h2,h3,h4){overflow-wrap:anywhere}
.event-time{white-space:normal;width:max-content;max-width:calc(100% + 20px)}
@keyframes veil-gather{from{transform:scaleY(1)}to{transform:scaleY(var(--cloth-end))}}
@keyframes crest-lift{from{transform:translate(-50%,0)}to{transform:translate(-50%,var(--crest-travel))}}
@keyframes cue-fade{to{opacity:0}}@keyframes hero-ink{from{opacity:0;visibility:visible;translate:0 6px}to{opacity:1;visibility:visible;translate:0 0}}@keyframes cue-ink{from{opacity:0}to{opacity:1}}@keyframes bow-breathe{0%,100%{rotate:-.8deg;translate:0 0}50%{rotate:.8deg;translate:0 2px}}@keyframes tap-cue{0%,45%,100%{translate:0 0;opacity:.65}60%{translate:0 4px;opacity:1}75%{translate:0 0;opacity:.8}}@keyframes scroll-cue{0%,100%{translate:0 0;opacity:.45}50%,70%{translate:0 5px;opacity:1}}@keyframes detail-in{from{opacity:0;translate:0 -5px}to{opacity:1;translate:0 0}}@keyframes timeline-draw{from{transform:scaleY(0)}to{transform:scaleY(1)}}

@keyframes linen-light{0%,100%{transform:translateX(-9%) rotate(-2deg);opacity:.2}50%{transform:translateX(9%) rotate(2deg);opacity:.65}}
@keyframes guest-ink{to{stroke-dashoffset:0}}@keyframes envelope-ink{to{stroke-dashoffset:0}}
@keyframes palace-ink{0%{opacity:0;clip-path:inset(0 46% 0 46%)}45%{opacity:.65}100%{opacity:1;clip-path:inset(0)}}
@keyframes leaf-stir{0%,100%{rotate:-1.5deg}50%{rotate:1.5deg}}
@keyframes ribbon-tail{0%,100%{rotate:-1deg}50%{rotate:1deg}}
@keyframes pearl-settle{from{opacity:0;transform:translateY(-6px) rotate(-.6deg)}to{opacity:1;transform:translateY(0) rotate(0)}}
@keyframes pendant-sway{0%,100%{rotate:-4deg}50%{rotate:4deg}}
@keyframes guest-art-settle{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}
@keyframes locket-open{0%,8%{transform:rotateY(0)}100%{transform:rotateY(-145deg)}}
@media(min-width:650px){.section{padding-left:100px;padding-right:100px}.opening{min-height:980px;--seal-drop:68px}.hero-inside{padding-inline:115px;padding-top:130px;padding-bottom:150px}.hero-blessing{font-size:22px;width:190px}.couple{font-size:84px;margin-block:27px 25px}.couple .ampersand{font-size:32px}.hero-date{font-size:25px}.hero-palace{width:210px;height:118px}.hero-venue{font-size:27px}.hero-place{font-size:11px}.hero-inside>.scroll-cue{margin-top:27px}.wax-seal{width:126px;height:168px}.seal-monogram{font-size:44px}.date-section{padding-block:240px}.countdown-keepsake{margin-inline:auto}.celebrations{padding-top:280px}.venue-illustration{margin-inline:auto}.cameo-dedication{font-size:34px}.cameo-date{font-size:20px}.story-section{padding-bottom:170px}.date-section>h2{font-size:53px}.rsvp-section{padding-top:260px;padding-bottom:250px}.event-list{max-width:475px}.event-list:before{left:112px}.event:before{left:108px}.event summary{grid-template-columns:90px 1fr;column-gap:45px}.event-details{padding-left:135px}.event-time{font-size:27px}.event-name{font-size:31px}.event-description{font-size:19px}.event-venue{font-size:18px}.family-names{font-size:22px}}
@media(max-width:359px){.section{padding-left:27px;padding-right:27px}.opening{min-height:690px;--seal-drop:54px}.hero-inside{padding:95px 48px 115px}.hero-blessing{font-size:17px;width:145px}.couple{font-size:58px;margin:22px 0 16px}.couple .ampersand{font-size:23px}.hero-date{font-size:20px}.hero-palace{width:150px;height:82px;margin-top:12px;margin-bottom:9px}.hero-venue{font-size:20px}.hero-place{font-size:8px}.hero-inside>.scroll-cue{margin-top:20px;font-size:10px}.wax-seal{width:100px;height:133px}.seal-monogram{font-size:35px}.seal-guide{font-size:10px}.body-copy{font-size:20px}.family-names{font-size:17px;gap:10px}.date-section{padding-top:132px;padding-bottom:140px}.countdown-keepsake{margin-inline:-20px;padding-block:39px}.cameo-dedication{font-size:23px}.cameo-date{font-size:14px}.celebrations{padding-top:162px}.date-section>h2{font-size:35px}.countdown{gap:11px}.countdown>div{min-width:50px}.countdown span{font-size:39px}.venue-name{font-size:44px}.event-list:before{left:77px}.event:before{left:73px}.event summary{grid-template-columns:62px 1fr;column-gap:31px}.event-time{font-size:21px}.event-date{font-size:9px;letter-spacing:.03em}.event-icon{width:48px;height:57px}.event-name{font-size:25px}.event-description{font-size:16px}.event-venue{font-size:15px}.event-details{padding-left:93px}.rsvp-section{padding-top:145px;padding-bottom:145px}.closing-names{font-size:42px}.form-note{font-size:10px}}
@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,*::before,*::after{animation:none!important;transition:none!important;scroll-behavior:auto!important}.js .reveal{opacity:1;transform:none}.js .guest-ink,.js .leaf-stem,.js .cartouche-outline path,.js .envelope-flap{stroke-dashoffset:0}.js .guest-art,.js .pearl-swag{opacity:1;transform:none}.js .cameo-ink{opacity:1;clip-path:none}.js .locket-front{transform:rotateY(-145deg)}.opening.is-open .hero-inside>*{opacity:1;visibility:visible}.opening.is-open .veil-fold,.opening.is-open .seal-button,.opening.is-open .cover-scroll{visibility:hidden}.event-list:before{transform:scaleY(1)}}

@media(min-width:650px){.guest-folio.section{padding:90px 40px}.folio-leaves{gap:24px;margin-top:44px}.folio-leaf{padding:32px 25px 34px}.guest-art{margin-bottom:24px}.folio-leaf p{font-size:1.25rem}.folio-leaf .guest-arrival-note,.folio-leaf .guest-hashtag{font-size:1.125rem}.guest-map-link{font-size:.625rem;gap:8px}}
@media(max-width:359px){.guest-folio.section{padding-inline:15px}.folio-leaves{gap:14px 10px}.folio-leaf{padding:18px 11px 22px;border-radius:15px}.guest-art{margin-bottom:18px}.guest-art::after{inset:-9px}.folio-leaf h3{font-size:1.375rem}.folio-leaf p,.folio-leaf .guest-arrival-note{font-size:1.0625rem}.folio-leaf .guest-hashtag{font-size:.875rem}.guest-map-link{font-size:.5rem;letter-spacing:.04em;gap:3px}}

@media(prefers-reduced-motion:reduce){.veil-cloth>img{will-change:auto}}

@media print{.js .guest-art,.js .pearl-swag{opacity:1;transform:none;animation:none}}
