/* ============================================================
   Ayesha Siddiqua & Sajjad Ali · Muslim Wedding / Nikah Invitation
   Pure HTML5 + CSS3 + Vanilla JS. No frameworks.
   ============================================================ */

/* ---------- 1 · TOKENS ---------- */
:root {
  --ivory: #FBF7EF;
  --ivory-2: #F6EFE2;
  --beige: #EFE3CF;
  --beige-2: #E6D7BD;
  --gold: #C1962F;
  --gold-lt: #E7C97A;
  --gold-dk: #8E6C1E;
  --brass: #9C7C38;
  --leaf: #3D6B3C;
  --leaf-dk: #2A4E2B;
  --maroon: #6B1F2A;
  --maroon-dk: #4A131C;
  --brown: #7A5C43;
  --ink: #3A2A20;
  --ink-soft: #6A574A;
  --night: #140E08;
  --night-2: #241811;

  --shadow-s: 0 2px 10px rgba(58, 42, 32, .07);
  --shadow-m: 0 12px 34px -14px rgba(58, 42, 32, .28);
  --shadow-l: 0 30px 70px -30px rgba(58, 42, 32, .42);

  --f-display: "Cormorant Garamond", Georgia, "Times New Roman", serif;
  --f-title: "Marcellus", Georgia, serif;
  --f-body: "Jost", "Segoe UI", system-ui, -apple-system, sans-serif;
  --f-ml: "Noto Sans Malayalam", "Nirmala UI", system-ui, sans-serif;

  --wrap: 1120px;
  --pad: clamp(20px, 5vw, 44px);
  --sec-y: clamp(72px, 12vw, 132px);

  --ease: cubic-bezier(.22, .61, .36, 1);
  --ease-soft: cubic-bezier(.4, 0, .2, 1);

  --motif: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='72' height='22' viewBox='0 0 72 22'%3E%3Cg fill='none' stroke='%23C1962F' stroke-width='1' stroke-linecap='round' opacity='.6'%3E%3Cpath d='M0 11h14M58 11h14'/%3E%3Cpath d='M22 11c0-3.6 2.6-6.4 5.6-6.4S33.2 7.4 33.2 11s-2.6 6.4-5.6 6.4S22 14.6 22 11z'/%3E%3Cpath d='M38.8 11c0-3.6 2.6-6.4 5.6-6.4S50 7.4 50 11s-2.6 6.4-5.6 6.4S38.8 14.6 38.8 11z'/%3E%3C/g%3E%3Ccircle cx='36' cy='11' r='1.7' fill='%23C1962F' opacity='.75'/%3E%3C/svg%3E");
}

/* ---------- 2 · RESET ---------- */
*,
*::before,
*::after {
  box-sizing: border-box
}

html {
  -webkit-text-size-adjust: 100%;
  scroll-behavior: smooth
}

body {
  margin: 0;
  background: var(--night);
  color: var(--ink);
  font-family: var(--f-body);
  font-weight: 300;
  font-size: clamp(15px, 1.05vw + 12px, 17px);
  line-height: 1.75;
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
  overflow-x: hidden;
}

body.is-locked {
  overflow: hidden;
  height: 100%;
  position: fixed;
  inset: 0;
  width: 100%
}

img,
video,
canvas,
svg {
  display: block;
  max-width: 100%
}

h1,
h2,
h3,
p,
dl,
dd,
ul,
ol,
figure {
  margin: 0
}

ul,
ol {
  list-style: none;
  padding: 0
}

a {
  color: inherit;
  text-decoration: none
}

button {
  font: inherit;
  color: inherit;
  border: 0;
  background: none;
  cursor: pointer
}

::selection {
  background: var(--gold);
  color: #fff
}

.sprite {
  position: absolute;
  width: 0;
  height: 0;
  overflow: hidden
}

/* every symbol uses a 64-unit viewBox, so stroke widths are in those
   units — roughly 3.8 reads as a 1.4px hairline at typical icon sizes */
.ico {
  width: 1em;
  height: 1em;
  flex: none;
  fill: none;
  stroke: currentColor;
  stroke-width: 3.8;
  stroke-linecap: round;
  stroke-linejoin: round;
  overflow: visible;
}

/* ---------- 3 · SHARED BITS ---------- */
.wrap {
  width: 100%;
  max-width: var(--wrap);
  margin-inline: auto;
  padding-inline: var(--pad);
  position: relative;
  z-index: 2
}

.wrap--center {
  text-align: center
}

.divider {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 14px;
  margin: 18px auto 0;
  max-width: 280px;
  color: var(--gold)
}

.divider .ico {
  width: 24px;
  height: 24px;
  stroke-width: 3.6;
  opacity: .95
}

.divider-line {
  height: 1px;
  flex: 1;
  background: linear-gradient(90deg, transparent, rgba(193, 150, 47, .75))
}

.divider-line:last-child {
  background: linear-gradient(270deg, transparent, rgba(193, 150, 47, .75))
}

.divider--sm {
  max-width: 200px
}

.divider--light {
  color: var(--gold-lt)
}

.divider--light .divider-line {
  background: linear-gradient(90deg, transparent, rgba(231, 201, 122, .65))
}

.divider--light .divider-line:last-child {
  background: linear-gradient(270deg, transparent, rgba(231, 201, 122, .65))
}

.mural-border {
  position: absolute;
  left: 0;
  right: 0;
  height: 22px;
  background-image: var(--motif);
  background-repeat: repeat-x;
  background-position: center;
  opacity: .5;
  pointer-events: none
}

.mural-border--top {
  top: 22px
}

.sample {
  display: inline-block;
  vertical-align: middle;
  font-family: var(--f-body);
  font-size: 9px;
  font-weight: 500;
  letter-spacing: .16em;
  text-transform: uppercase;
  padding: 2px 7px;
  margin: 0 4px;
  border-radius: 999px;
  color: #8a2036;
  background: rgba(160, 40, 60, .09);
  border: 1px dashed rgba(160, 40, 60, .5);
  line-height: 1.5;
  white-space: nowrap;
}

.scene--dark .sample,
.scene--finale .sample {
  color: #F2B7C0;
  background: rgba(255, 140, 160, .1);
  border-color: rgba(255, 150, 170, .45)
}

code {
  font-family: ui-monospace, "Cascadia Code", Consolas, monospace;
  font-size: .85em;
  background: rgba(120, 90, 40, .1);
  padding: 2px 6px;
  border-radius: 4px
}

.muted {
  color: var(--ink-soft)
}

/* ---------- 4 · PARTICLE CANVAS ---------- */
#particles {
  position: fixed;
  inset: 0;
  width: 100%;
  height: 100%;
  z-index: 80;
  pointer-events: none;
  opacity: 0;
  transition: opacity 1.4s var(--ease);
  will-change: opacity;
}

#particles.on {
  opacity: 1
}

/* ============================================================
   5 · LANDING COVER  ·  image fills the screen; content fits it
   ============================================================ */
#landing {
  position: fixed;
  inset: 0;
  z-index: 70;
  /* reuse .scene--screen grid from scenes.css when both classes apply;
     also declare here so landing works even if load order shifts */
  width: 100%;
  height: 100svh;
  height: 100vh;
  min-height: 100svh;
  min-height: 100vh;
  display: grid;
  grid-template-columns: var(--hero-safe-side, 11%) minmax(0, 1fr) var(--hero-safe-side, 11%);
  grid-template-rows: var(--hero-safe-top, 22%) minmax(0, 1fr) var(--hero-safe-bottom, 16%);
  overflow: hidden;
  background: #0B0703;
  transition: opacity .42s var(--ease);
  will-change: opacity;
}

#landing.is-opening .btn-open {
  pointer-events: none;
  opacity: .72
}

#landing.is-out {
  opacity: 0;
  pointer-events: none
}

#landing.is-gone {
  display: none
}

.landing-media,
#landing>.rays,
#landing>.vignette,
#landing>.temple-glow,
#landing>.landing-overlay {
  grid-column: 1 / -1;
  grid-row: 1 / -1;
  width: 100%;
  height: 100%;
  pointer-events: none;
}

.landing-media {
  position: relative;
  z-index: 0;
  overflow: hidden
}

.cover-img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center center;
  animation: kenburns 26s var(--ease-soft) infinite alternate;
  will-change: transform;
}

.cover-img.failed {
  display: none
}

.cover-fallback {
  position: absolute;
  inset: 0;
  opacity: 0;
  background:
    radial-gradient(120% 70% at 50% 12%, rgba(255, 226, 164, .36), transparent 62%),
    radial-gradient(80% 55% at 20% 90%, rgba(193, 150, 47, .28), transparent 70%),
    radial-gradient(80% 55% at 82% 84%, rgba(107, 31, 42, .34), transparent 70%),
    linear-gradient(180deg, #2A1B0E 0%, #160E07 55%, #0B0703 100%);
}

.landing-media.fallback-on .cover-fallback {
  opacity: 1
}

@keyframes kenburns {
  from {
    transform: scale(1.04) translate3d(0, 0, 0)
  }

  to {
    transform: scale(1.12) translate3d(0, -1.2%, 0)
  }
}

.vignette {
  position: relative;
  z-index: 2;
  background:
    radial-gradient(115% 78% at 50% 34%, transparent 34%, rgba(11, 7, 3, .35) 82%, rgba(11, 7, 3, .62) 100%),
    linear-gradient(180deg, rgba(10, 6, 3, .35) 0%, transparent 26%, transparent 48%, rgba(10, 6, 3, .55) 100%);
}

.landing-overlay {
  position: relative;
  z-index: 2;
  background: radial-gradient(70% 50% at 50% 45%, transparent 30%, rgba(11, 7, 3, .2) 100%);
}

.temple-glow {
  position: relative;
  z-index: 2;
  pointer-events: none;
  background: radial-gradient(ellipse 55% 40% at 50% 18%, rgba(255, 214, 140, .28), transparent 70%);
  animation: breathe 7.5s var(--ease-soft) infinite;
}

@keyframes breathe {

  0%,
  100% {
    opacity: .55
  }

  50% {
    opacity: 1
  }
}

/* light rays — fill the landing/hero cell */
.rays {
  position: relative;
  z-index: 2;
  pointer-events: none;
  opacity: .28;
  mix-blend-mode: screen;
  overflow: hidden;
}

.rays::before,
.rays::after {
  content: "";
  position: absolute;
  inset: -20%;
  background: repeating-conic-gradient(from 0deg at 50% 8%,
      rgba(255, 226, 168, .20) 0deg 2.2deg,
      transparent 2.2deg 10deg);
  -webkit-mask-image: radial-gradient(65% 78% at 50% 6%, #000, transparent 72%);
  mask-image: radial-gradient(65% 78% at 50% 6%, #000, transparent 72%);
  animation: sweep 46s linear infinite;
  will-change: transform;
}

.rays::after {
  animation-duration: 74s;
  animation-direction: reverse;
  opacity: .6
}

@keyframes sweep {
  to {
    transform: rotate(360deg)
  }
}

.rays--hero {
  opacity: .3
}

.landing-inner {
  color: var(--ivory);
  z-index: 5;
}

.landing-eyebrow {
  display: flex;
  flex-direction: column;
  gap: 6px;
  animation: riseIn 1.5s .35s var(--ease) both
}

.landing-eyebrow .ml {
  font-family: var(--f-ml);
  font-size: clamp(14px, 3.6vw, 18px);
  color: var(--gold-lt);
  letter-spacing: .02em
}

.landing-eyebrow .en {
  font-size: clamp(9.5px, 2.4vw, 11.5px);
  letter-spacing: .32em;
  text-transform: uppercase;
  color: rgba(251, 247, 239, .62)
}

.landing-inner .divider {
  animation: riseIn 1.5s .6s var(--ease) both
}

.landing-names {
  margin-top: 16px;
  font-family: var(--f-display);
  font-weight: 300;
  font-size: clamp(38px, 11.5vw, 86px);
  line-height: 1.05;
  letter-spacing: .01em;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 2px;
  color: #FFF6E3;
  text-shadow: 0 2px 30px rgba(255, 196, 110, .32), 0 1px 3px rgba(0, 0, 0, .4);
}

.landing-names .n {
  animation: riseIn 1.6s .8s var(--ease) both
}

.landing-names .n:last-child {
  animation-delay: 1.05s
}

.landing-names .amp {
  font-family: var(--f-display);
  font-style: italic;
  font-size: .44em;
  color: var(--gold-lt);
  opacity: .9;
  margin: 2px 0;
  animation: riseIn 1.6s .95s var(--ease) both;
}

.landing-date {
  margin-top: 14px;
  font-size: clamp(11px, 3vw, 13px);
  letter-spacing: .44em;
  text-indent: .44em;
  color: rgba(255, 246, 227, .78);
  animation: riseIn 1.6s 1.25s var(--ease) both;
}

@keyframes riseIn {
  from {
    opacity: 0;
    transform: translate3d(0, 22px, 0)
  }

  to {
    opacity: 1;
    transform: none
  }
}

/* ---------- Open Invitation button ---------- */
.btn-open {
  position: relative;
  margin-top: clamp(34px, 7vw, 52px);
  padding: 0;
  border-radius: 999px;
  isolation: isolate;
  -webkit-tap-highlight-color: transparent;
  animation: riseIn 1.6s 1.5s var(--ease) both;
  transition: transform .4s var(--ease);
}

.btn-open__inner {
  position: relative;
  z-index: 3;
  display: flex;
  align-items: center;
  gap: 14px;
  padding: 16px clamp(26px, 6vw, 38px);
  border-radius: 999px;
  background: linear-gradient(145deg, rgba(28, 18, 9, .72), rgba(12, 8, 4, .62));
  border: 1px solid rgba(231, 201, 122, .55);
  backdrop-filter: blur(9px);
  -webkit-backdrop-filter: blur(9px);
  box-shadow: inset 0 1px 0 rgba(255, 232, 180, .24), 0 14px 40px -18px rgba(0, 0, 0, .9);
  transition: border-color .4s var(--ease), box-shadow .4s var(--ease);
}

.btn-open__lamp {
  width: 26px;
  height: 26px;
  color: var(--gold-lt);
  stroke-width: 3.6;
  animation: flicker 3.4s ease-in-out infinite
}

@keyframes flicker {

  0%,
  100% {
    opacity: .85;
    filter: drop-shadow(0 0 4px rgba(255, 196, 110, .5))
  }

  45% {
    opacity: 1;
    filter: drop-shadow(0 0 12px rgba(255, 206, 130, .95))
  }

  70% {
    opacity: .9
  }
}

.btn-open__label {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  line-height: 1.3
}

.btn-open__en {
  font-size: clamp(13px, 3.3vw, 15px);
  letter-spacing: .24em;
  text-transform: uppercase;
  color: #FFF3DC
}

.btn-open__ml {
  font-family: var(--f-ml);
  font-size: clamp(10px, 2.6vw, 11.5px);
  color: rgba(231, 201, 122, .82);
  letter-spacing: .01em
}

.btn-open__glow {
  position: absolute;
  inset: -26px;
  z-index: 1;
  border-radius: 999px;
  background: radial-gradient(closest-side, rgba(255, 200, 110, .42), transparent 74%);
  animation: pulseGlow 3.6s var(--ease-soft) infinite;
}

@keyframes pulseGlow {

  0%,
  100% {
    opacity: .45;
    transform: scale(.94)
  }

  50% {
    opacity: 1;
    transform: scale(1.06)
  }
}

.btn-open__ring {
  position: absolute;
  inset: -7px;
  z-index: 2;
  border-radius: 999px;
  border: 1px solid rgba(231, 201, 122, .42);
  animation: ringOut 3.6s var(--ease-soft) infinite;
}

@keyframes ringOut {
  0% {
    opacity: .75;
    transform: scale(.96)
  }

  70% {
    opacity: 0;
    transform: scale(1.16)
  }

  100% {
    opacity: 0
  }
}

.btn-open__shimmer {
  position: absolute;
  inset: 0;
  z-index: 4;
  border-radius: 999px;
  overflow: hidden;
  pointer-events: none;
  -webkit-mask-image: linear-gradient(#000, #000);
}

.btn-open__shimmer::before {
  content: "";
  position: absolute;
  top: -60%;
  bottom: -60%;
  width: 34%;
  left: -45%;
  background: linear-gradient(100deg, transparent, rgba(255, 240, 205, .5), transparent);
  transform: skewX(-18deg);
  animation: shimmer 4.6s 2.4s var(--ease-soft) infinite;
}

@keyframes shimmer {
  0% {
    left: -45%
  }

  55%,
  100% {
    left: 125%
  }
}

.btn-open:hover {
  transform: translateY(-2px)
}

.btn-open:hover .btn-open__inner {
  border-color: rgba(231, 201, 122, .95);
  box-shadow: inset 0 1px 0 rgba(255, 232, 180, .34), 0 18px 46px -16px rgba(255, 180, 90, .42)
}

.btn-open:active {
  transform: translateY(0) scale(.985)
}

.btn-open:focus-visible {
  outline: 2px solid var(--gold-lt);
  outline-offset: 8px
}

.landing-hint {
  margin-top: 18px;
  font-size: 10px;
  letter-spacing: .34em;
  text-transform: uppercase;
  color: rgba(251, 247, 239, .42);
  animation: riseIn 1.6s 1.9s var(--ease) both, hintFade 3.4s 3s ease-in-out infinite;
}

@keyframes hintFade {

  0%,
  100% {
    opacity: .35
  }

  50% {
    opacity: .85
  }
}

/* ============================================================
   6 · REVEAL VIDEO
   ============================================================ */
#reveal {
  position: fixed;
  inset: 0;
  z-index: 60;
  background: #0B0703;
  opacity: 0;
  visibility: hidden;
  /* Armed under the cover: fully painted but invisible until the cover lifts.
     is-on keeps it under the fading cover; is-live promotes it after the fade. */
  transition: opacity .42s var(--ease), visibility 0s linear .42s;
  will-change: opacity;
}

#reveal.is-armed,
#reveal.is-on {
  opacity: 1;
  visibility: visible;
  transition: opacity .42s var(--ease), visibility 0s;
}

#reveal.is-live {
  z-index: 95
}

#reveal.is-out {
  opacity: 0;
  visibility: hidden;
  transition: opacity .85s var(--ease), visibility 0s linear .85s;
  z-index: 95
}

#reveal.is-gone {
  display: none
}

#revealVideo {
  position: absolute;
  inset: 0;
  z-index: 1;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center center;
  background: #0B0703;
}

.reveal-fade {
  position: absolute;
  inset: 0;
  z-index: 2;
  pointer-events: none;
  opacity: 0;
  background: radial-gradient(120% 80% at 50% 55%, rgba(255, 226, 170, .22), transparent 60%), #0B0703;
  transition: opacity 1.1s var(--ease);
}

#reveal.is-out .reveal-fade {
  opacity: 1
}

.btn-skip {
  position: absolute;
  z-index: 3;
  right: max(16px, env(safe-area-inset-right));
  bottom: max(18px, env(safe-area-inset-bottom));
  padding: 8px 18px;
  border-radius: 999px;
  font-size: 10px;
  letter-spacing: .26em;
  text-transform: uppercase;
  color: rgba(255, 246, 227, .8);
  border: 1px solid rgba(231, 201, 122, .32);
  background: rgba(0, 0, 0, .3);
  backdrop-filter: blur(6px);
  opacity: 0;
  animation: fadeIn .8s var(--ease) forwards;
}

@keyframes fadeIn {
  to {
    opacity: .6
  }
}

.btn-skip:hover {
  opacity: 1
}

/* ============================================================
   7 · SITE SHELL
   ============================================================ */
#site {
  position: relative;
  z-index: 1;
  opacity: 0;
  visibility: hidden;
  transition: opacity .85s var(--ease);
  background: var(--ivory);
}

body.is-revealed #site {
  opacity: 1;
  visibility: visible
}

/* hold every in-page animation until the curtain lifts */
body:not(.is-revealed) #site * {
  animation-play-state: paused !important
}

/* Below-the-fold scenes skip layout/paint until near the viewport */
#story,
#timeline,
#couple,
#family,
#ceremony,
#reception,
#venue,
#gallery,
#pending,
#thankyou,
#footer {
  content-visibility: auto;
  contain-intrinsic-size: auto 720px;
}

/* ============================================================
   9 · FLOW SECTION INTERNALS
   (outer shell = scenes.css · .scene / .section-content)
   ============================================================ */
.section-content--center {
  text-align: center;
  justify-content: center;
  align-items: center;
  min-height: min(100svh, 40rem);
}

.scene--dark .sec-title,
.scene--finale .sec-title {
  color: #FBF3E2
}

.scene--dark .kicker,
.scene--finale .kicker {
  color: var(--gold-lt);
  opacity: .9
}

.scene--dark .sec-note,
.scene--finale .sec-note {
  color: rgba(243, 233, 214, .7)
}

.sec-head {
  text-align: center;
  margin-bottom: clamp(2rem, 5vw, 4rem)
}

.kicker {
  font-family: var(--f-ml);
  font-size: clamp(11px, 2.9vw, 13px);
  letter-spacing: .2em;
  color: var(--brass);
  margin-bottom: 10px;
}

.sec-title {
  font-family: var(--f-display);
  font-weight: 300;
  font-size: clamp(28px, 6.5vw, 52px);
  line-height: 1.12;
  letter-spacing: .005em;
  color: var(--ink);
}

.sec-note {
  max-width: 640px;
  margin: 16px auto 0;
  font-size: clamp(12px, 2.8vw, 13.5px);
  line-height: 1.7;
  color: var(--ink-soft);
}

/* ============================================================
   8 · HERO TYPOGRAPHY  (layout lives in scenes.css)
   ============================================================ */
.hero-bless {
  display: flex;
  flex-direction: column;
  gap: clamp(4px, 1.2%, 8px);
  margin-bottom: clamp(8px, 3%, 16px)
}

.hero-bless__ml {
  font-family: var(--f-ml);
  font-size: clamp(11px, 3vw, 15px);
  color: #8E6C1E;
  letter-spacing: .02em;
}

.hero-bless__en {
  font-size: clamp(8px, 2.2vw, 10px);
  letter-spacing: .28em;
  text-transform: uppercase;
  color: rgba(74, 52, 32, .62);
}

.hero-names {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0;
  font-family: var(--f-display);
  font-weight: 300;
  font-size: clamp(32px, 9vw, 58px);
  line-height: .98;
  letter-spacing: .01em;
  color: #3A2414;
  text-shadow: 0 1px 0 rgba(255, 246, 220, .55);
}

.hero-names__n {
  display: block
}

.hero-names__amp {
  font-family: var(--f-display);
  font-style: italic;
  font-weight: 300;
  font-size: .42em;
  line-height: 1;
  margin: clamp(2px, 1%, 6px) 0;
  color: #9C7C38;
}

.hero-date {
  margin-top: clamp(10px, 3.5%, 20px);
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: clamp(3px, 1%, 6px);
}

.hero-date__en {
  font-family: var(--f-title);
  font-size: clamp(11px, 3.2vw, 15px);
  letter-spacing: .14em;
  text-transform: uppercase;
  color: #5A3C1E;
}

.hero-date__ml {
  font-family: var(--f-ml);
  font-size: clamp(10px, 2.8vw, 13px);
  color: #8E6C1E;
}

.scroll-indicator {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 10px;
  color: var(--brown);
}

.scroll-indicator__word {
  font-size: 9.5px;
  letter-spacing: .36em;
  text-transform: uppercase;
  opacity: .72
}

.scroll-indicator__rail {
  position: relative;
  width: 1px;
  height: 52px;
  background: linear-gradient(180deg, rgba(122, 92, 67, .5), transparent);
  overflow: visible;
}

.scroll-indicator__dot {
  position: absolute;
  left: 50%;
  top: 0;
  width: 5px;
  height: 5px;
  margin-left: -2.5px;
  border-radius: 50%;
  background: var(--gold);
  box-shadow: 0 0 10px rgba(193, 150, 47, .9);
  animation: scrollDot 2.4s var(--ease-soft) infinite;
}

@keyframes scrollDot {
  0% {
    transform: translateY(0);
    opacity: 0
  }

  18% {
    opacity: 1
  }

  80% {
    opacity: 1
  }

  100% {
    transform: translateY(46px);
    opacity: 0
  }
}

/* ============================================================
   9 · FLOW SECTION INTERNALS
   ============================================================ */
/* (outer shell lives in scenes.css — keep only component styles here) */

.lede {
  max-width: 720px;
  margin: 0 auto clamp(40px, 7vw, 62px);
  text-align: center;
  font-family: var(--f-display);
  font-size: clamp(17px, 4.3vw, 22px);
  line-height: 1.85;
  color: var(--ink-soft);
  font-weight: 300;
}

.lede em {
  font-style: italic;
  color: var(--maroon);
  font-weight: 400
}

/* ---------- reveal on scroll ---------- */
.reveal {
  opacity: 0;
  transform: translate3d(0, 26px, 0);
  transition: opacity .95s var(--ease), transform .95s var(--ease);
  will-change: opacity, transform
}

.reveal.in {
  opacity: 1;
  transform: none
}

.reveal[data-delay="1"] {
  transition-delay: .09s
}

.reveal[data-delay="2"] {
  transition-delay: .18s
}

.reveal[data-delay="3"] {
  transition-delay: .27s
}

.reveal[data-delay="4"] {
  transition-delay: .36s
}

/* ---------- facts ---------- */
.facts {
  display: grid;
  gap: 14px;
  grid-template-columns: repeat(auto-fit, minmax(215px, 1fr))
}

.fact {
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  gap: 4px;
  padding: 30px 20px 26px;
  border-radius: 3px;
  background: rgba(255, 255, 255, .55);
  border: 1px solid rgba(193, 150, 47, .24);
  box-shadow: var(--shadow-s);
  transition: transform .5s var(--ease), box-shadow .5s var(--ease), border-color .5s var(--ease);
}

.fact::before {
  content: "";
  position: absolute;
  inset: 5px;
  border: 1px solid rgba(193, 150, 47, .16);
  border-radius: 2px;
  pointer-events: none;
}

.fact:hover {
  transform: translateY(-4px);
  box-shadow: var(--shadow-m);
  border-color: rgba(193, 150, 47, .5)
}

.fact .ico {
  width: 30px;
  height: 30px;
  color: var(--gold);
  stroke-width: 3.4;
  margin-bottom: 8px
}

.fact-k {
  font-size: 9.5px;
  letter-spacing: .28em;
  text-transform: uppercase;
  color: var(--brass)
}

.fact-v {
  font-family: var(--f-title);
  font-size: clamp(15px, 3.9vw, 17.5px);
  color: var(--ink);
  line-height: 1.4
}

.fact-s {
  font-size: 12px;
  color: var(--ink-soft)
}

/* ---------- countdown ---------- */
.countdown {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: clamp(8px, 3vw, 22px);
  margin-top: clamp(42px, 7vw, 60px);
  flex-wrap: wrap;
}

.cd-unit {
  display: flex;
  flex-direction: column;
  align-items: center;
  min-width: 64px
}

.cd-n {
  font-family: var(--f-display);
  font-weight: 400;
  font-size: clamp(30px, 8vw, 48px);
  line-height: 1;
  color: var(--maroon);
  font-variant-numeric: tabular-nums;
}

.cd-l {
  margin-top: 6px;
  font-size: 9px;
  letter-spacing: .26em;
  text-transform: uppercase;
  color: var(--brass)
}

.cd-sep {
  width: 1px;
  height: 34px;
  background: linear-gradient(180deg, transparent, rgba(193, 150, 47, .6), transparent)
}

/* ---------- cards ---------- */
.card {
  position: relative;
  padding: clamp(26px, 5vw, 36px);
  border-radius: 3px;
  background: rgba(255, 255, 255, .62);
  border: 1px solid rgba(193, 150, 47, .26);
  box-shadow: var(--shadow-s);
  transition: transform .55s var(--ease), box-shadow .55s var(--ease);
}

.card::after {
  content: "";
  position: absolute;
  inset: 6px;
  border: 1px solid rgba(193, 150, 47, .14);
  pointer-events: none
}

.card:hover {
  transform: translateY(-5px);
  box-shadow: var(--shadow-m)
}

.card-ico {
  width: 34px;
  height: 34px;
  color: var(--leaf);
  stroke-width: 3.2;
  margin-bottom: 16px;
  opacity: .85
}

.card-title {
  font-family: var(--f-title);
  font-size: clamp(17px, 4.2vw, 20px);
  color: var(--ink);
  margin-bottom: 10px;
  font-weight: 400
}

.card p {
  font-size: 14.5px;
  line-height: 1.85;
  color: var(--ink-soft)
}

.story-grid {
  display: grid;
  gap: 18px;
  grid-template-columns: repeat(auto-fit, minmax(250px, 1fr))
}

/* ---------- timeline ---------- */
.tl {
  position: relative;
  max-width: 760px;
  margin-inline: auto;
  padding-left: 8px
}

.tl::before {
  content: "";
  position: absolute;
  left: 23px;
  top: 12px;
  bottom: 12px;
  width: 1px;
  background: linear-gradient(180deg, transparent, rgba(193, 150, 47, .55) 8%, rgba(193, 150, 47, .55) 92%, transparent);
}

.tl-item {
  position: relative;
  padding: 0 0 clamp(34px, 6vw, 50px) 66px
}

.tl-item:last-child {
  padding-bottom: 0
}

.tl-node {
  position: absolute;
  left: 0;
  top: 0;
  width: 47px;
  height: 47px;
  border-radius: 50%;
  display: grid;
  place-items: center;
  background: var(--ivory);
  border: 1px solid rgba(193, 150, 47, .55);
  color: var(--gold);
  box-shadow: 0 0 0 6px var(--ivory), 0 6px 18px -8px rgba(58, 42, 32, .4);
}

.tl-node .ico {
  width: 22px;
  height: 22px;
  stroke-width: 3.6
}

.tl-node--hi {
  background: linear-gradient(145deg, var(--gold-lt), var(--gold));
  color: #3A2A20;
  border-color: transparent
}

.tl-node--hi::after {
  content: "";
  position: absolute;
  inset: -6px;
  border-radius: 50%;
  border: 1px solid rgba(193, 150, 47, .55);
  animation: ringOut 3.4s var(--ease-soft) infinite;
}

.tl-date {
  font-size: 10.5px;
  letter-spacing: .24em;
  text-transform: uppercase;
  color: var(--brass)
}

.tl-title {
  font-family: var(--f-display);
  font-weight: 400;
  font-size: clamp(22px, 5.6vw, 30px);
  color: var(--ink);
  margin: 6px 0 8px;
  line-height: 1.2
}

.tl-meta {
  font-size: 13.5px;
  color: var(--maroon);
  margin-bottom: 8px
}

.tl-text {
  font-size: 14.5px;
  color: var(--ink-soft);
  line-height: 1.8
}

/* ---------- couple ---------- */
.couple-grid {
  display: grid;
  gap: clamp(28px, 6vw, 44px);
  align-items: start;
  grid-template-columns: 1fr;
  justify-items: center;
}

.person {
  text-align: center;
  max-width: 400px
}

.portrait {
  position: relative;
  width: clamp(180px, 54vw, 238px);
  aspect-ratio: 3/4;
  margin: 0 auto 26px;
  border-radius: 999px 999px 6px 6px;
  overflow: hidden;
  background:
    repeating-linear-gradient(135deg, rgba(193, 150, 47, .08) 0 10px, transparent 10px 20px),
    linear-gradient(160deg, #3A2A1A, #20150D);
  border: 1px solid rgba(231, 201, 122, .32);
}

.portrait-img {
  width: 100%;
  height: 100%;
  object-fit: cover
}

.portrait-img.failed {
  display: none
}

.portrait.is-empty::after {
  content: attr(data-label);
  position: absolute;
  inset: 0;
  display: grid;
  place-items: center;
  font-size: 10px;
  letter-spacing: .26em;
  text-transform: uppercase;
  color: rgba(231, 201, 122, .62);
  text-align: center;
  padding: 20px;
}

.portrait.is-empty::before {
  content: "";
  position: absolute;
  left: 50%;
  top: 38%;
  width: 54px;
  height: 54px;
  margin-left: -27px;
  border: 1px solid rgba(231, 201, 122, .35);
  border-radius: 50%;
}

.portrait-ring {
  position: absolute;
  inset: 7px;
  border-radius: 999px 999px 4px 4px;
  border: 1px solid rgba(231, 201, 122, .35);
  pointer-events: none;
}

.person-role {
  font-size: 9.5px;
  letter-spacing: .32em;
  text-transform: uppercase;
  color: var(--gold-lt);
  opacity: .85
}

.person-name {
  font-family: var(--f-display);
  font-weight: 300;
  font-size: clamp(28px, 7.4vw, 42px);
  color: #FBF3E2;
  margin: 8px 0 4px;
  line-height: 1.15
}

.person-ml {
  font-family: var(--f-ml);
  font-size: 14px;
  color: rgba(231, 201, 122, .85);
  margin-bottom: 14px
}

.person-line {
  font-size: 14px;
  color: rgba(243, 233, 214, .82);
  line-height: 1.8
}

.person-place {
  font-size: 13px;
  color: rgba(243, 233, 214, .55);
  margin-top: 6px
}

.couple-knot {
  display: flex;
  align-items: center;
  gap: 14px;
  color: var(--gold-lt);
  opacity: .7
}

.couple-knot .ico {
  width: 34px;
  height: 34px;
  stroke-width: 3
}

.couple-knot .ico:last-of-type {
  transform: scaleX(-1)
}

.couple-amp {
  font-family: var(--f-display);
  font-style: italic;
  font-size: 30px
}

/* ---------- family ---------- */
.family-grid {
  display: grid;
  gap: 18px;
  grid-template-columns: repeat(auto-fit, minmax(280px, 1fr))
}

.card--family {
  text-align: center;
  padding-block: clamp(32px, 6vw, 44px)
}

.card--family .card-ico {
  margin-inline: auto;
  color: var(--brass)
}

.family-tag {
  font-size: 9.5px;
  letter-spacing: .3em;
  text-transform: uppercase;
  color: var(--brass);
  margin-bottom: 18px
}

.family-name {
  font-family: var(--f-display);
  font-weight: 400;
  font-size: clamp(20px, 5vw, 26px);
  color: var(--ink);
  line-height: 1.3
}

.family-amp {
  font-family: var(--f-display);
  font-style: italic;
  font-size: 20px;
  color: var(--gold);
  margin: 4px 0
}

.family-home {
  margin-top: 16px;
  font-size: 14px;
  color: var(--ink-soft);
  line-height: 1.7
}

.family-ml {
  font-family: var(--f-ml);
  font-size: 13px;
  color: var(--brass);
  margin-top: 6px
}

.family-foot {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 12px;
  flex-wrap: wrap;
  margin-top: clamp(30px, 5vw, 44px);
  font-family: var(--f-display);
  font-style: italic;
  font-size: clamp(16px, 4vw, 19px);
  color: var(--brown);
  text-align: center;
}

.family-foot .ico {
  width: 28px;
  height: 28px;
  color: var(--gold);
  stroke-width: 3.4
}

/* ---------- temple card (ceremony) ---------- */
.temple-card {
  position: relative;
  max-width: 560px;
  margin-inline: auto
}

.temple-card__roof {
  display: block;
  height: 26px;
  background: linear-gradient(180deg, var(--maroon), var(--maroon-dk));
  clip-path: polygon(0 100%, 50% 0, 100% 100%);
}

.temple-card__roof::after {
  content: ""
}

.temple-card__body {
  position: relative;
  text-align: center;
  padding: clamp(34px, 6vw, 52px) clamp(24px, 5vw, 44px);
  background: linear-gradient(180deg, #fff 0%, var(--ivory) 100%);
  border: 1px solid rgba(193, 150, 47, .35);
  box-shadow: var(--shadow-l);
}

.temple-card__body::before {
  content: "";
  position: absolute;
  inset: 8px;
  border: 1px solid rgba(193, 150, 47, .2);
  pointer-events: none
}

.temple-card__base {
  display: block;
  height: 14px;
  background: linear-gradient(180deg, var(--brass), var(--gold-dk));
  clip-path: polygon(3% 0, 97% 0, 100% 100%, 0 100%);
}

.temple-card__crest {
  width: 44px;
  height: 44px;
  color: var(--gold);
  stroke-width: 2.9;
  margin: 0 auto 18px
}

.tc-eyebrow {
  font-size: 9.5px;
  letter-spacing: .34em;
  text-transform: uppercase;
  color: var(--brass)
}

.tc-day {
  font-family: var(--f-display);
  font-weight: 300;
  font-size: clamp(36px, 9vw, 58px);
  color: var(--maroon);
  line-height: 1.05;
  margin-top: 6px
}

.tc-date {
  font-family: var(--f-title);
  font-size: clamp(17px, 4.4vw, 21px);
  color: var(--ink);
  margin-top: 4px
}

.tc-ml {
  font-family: var(--f-ml);
  font-size: 13.5px;
  color: var(--brass);
  margin-top: 6px
}

.tc-rule {
  height: 1px;
  margin: 26px auto;
  max-width: 220px;
  background: linear-gradient(90deg, transparent, rgba(193, 150, 47, .65), transparent)
}

.tc-list {
  display: grid;
  gap: 16px;
  text-align: left;
  max-width: 400px;
  margin-inline: auto
}

.tc-row {
  display: grid;
  grid-template-columns: 118px 1fr;
  gap: 12px;
  align-items: start
}

.tc-row dt {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 9.5px;
  letter-spacing: .2em;
  text-transform: uppercase;
  color: var(--brass);
  padding-top: 4px
}

.tc-row dt .ico {
  width: 16px;
  height: 16px;
  color: var(--gold);
  stroke-width: 4.4
}

.tc-row dd {
  font-size: 14.5px;
  color: var(--ink);
  line-height: 1.65
}

.tc-list+.btn {
  margin-top: 30px
}

/* ---------- buttons ---------- */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 9px;
  padding: 13px 26px;
  border-radius: 999px;
  font-size: 11px;
  letter-spacing: .2em;
  text-transform: uppercase;
  transition: transform .35s var(--ease), box-shadow .35s var(--ease), background .35s var(--ease), color .35s var(--ease), border-color .35s var(--ease);
  -webkit-tap-highlight-color: transparent;
}

.btn .ico {
  width: 15px;
  height: 15px;
  stroke-width: 4.4
}

.btn--gold {
  background: linear-gradient(145deg, var(--gold-lt), var(--gold));
  color: #3A2A20;
  box-shadow: 0 10px 26px -12px rgba(193, 150, 47, .85)
}

.btn--gold:hover {
  transform: translateY(-2px);
  box-shadow: 0 16px 34px -12px rgba(193, 150, 47, .95)
}

.btn--ghost {
  border: 1px solid rgba(193, 150, 47, .55);
  color: var(--brass)
}

.btn--ghost:hover {
  background: rgba(193, 150, 47, .1);
  transform: translateY(-2px)
}

.btn--outline-gold {
  border: 1px solid rgba(231, 201, 122, .55);
  color: var(--gold-lt);
  margin-top: 22px
}

.btn--outline-gold:hover {
  background: rgba(231, 201, 122, .12);
  transform: translateY(-2px)
}

.btn:active {
  transform: translateY(0) scale(.98)
}

/* ---------- reception ---------- */
.lux-card {
  position: relative;
  display: grid;
  gap: clamp(24px, 5vw, 40px);
  grid-template-columns: 1fr;
  align-items: center;
  max-width: 920px;
  margin-inline: auto;
  padding: clamp(32px, 6vw, 56px);
  background: linear-gradient(150deg, rgba(255, 246, 225, .09), rgba(255, 246, 225, .03));
  border: 1px solid rgba(231, 201, 122, .3);
  backdrop-filter: blur(4px);
  -webkit-backdrop-filter: blur(4px);
}

.lux-card::before,
.lux-card::after {
  content: "";
  position: absolute;
  width: 44px;
  height: 44px;
  border: 1px solid rgba(231, 201, 122, .7);
  pointer-events: none;
}

.lux-card::before {
  top: -1px;
  left: -1px;
  border-right: 0;
  border-bottom: 0
}

.lux-card::after {
  bottom: -1px;
  right: -1px;
  border-left: 0;
  border-top: 0
}

.lux-card__rule {
  height: 1px;
  background: linear-gradient(90deg, transparent, rgba(231, 201, 122, .5), transparent)
}

.lux-eyebrow {
  font-size: 9.5px;
  letter-spacing: .3em;
  text-transform: uppercase;
  color: var(--gold-lt);
  opacity: .85
}

.lux-day {
  font-family: var(--f-display);
  font-weight: 300;
  font-size: clamp(38px, 10vw, 64px);
  line-height: 1.02;
  color: #FBF3E2;
  margin-top: 8px
}

.lux-date {
  font-family: var(--f-title);
  font-size: clamp(17px, 4.4vw, 21px);
  color: rgba(243, 233, 214, .9);
  margin-top: 4px
}

.lux-time {
  margin-top: 14px;
  font-size: 12px;
  letter-spacing: .24em;
  color: var(--gold-lt)
}

.lux-k {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 9.5px;
  letter-spacing: .26em;
  text-transform: uppercase;
  color: var(--brass)
}

.lux-k .ico {
  width: 15px;
  height: 15px;
  color: var(--gold-lt);
  stroke-width: 4.4
}

.lux-v {
  font-family: var(--f-display);
  font-weight: 400;
  font-size: clamp(22px, 5.6vw, 30px);
  color: #FBF3E2;
  margin-top: 10px;
  line-height: 1.25
}

.lux-sub {
  font-size: 13.5px;
  color: rgba(243, 233, 214, .62);
  margin-top: 6px
}

.lux-note {
  font-size: 14px;
  color: rgba(243, 233, 214, .78);
  margin-top: 16px;
  line-height: 1.8
}

/* ---------- venue ---------- */
.venue-grid {
  display: grid;
  gap: 20px;
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr))
}

.venue-card {
  overflow: hidden;
  border-radius: 4px;
  background: #fff;
  border: 1px solid rgba(193, 150, 47, .24);
  box-shadow: var(--shadow-s);
  transition: transform .55s var(--ease), box-shadow .55s var(--ease);
}

.venue-card:hover {
  transform: translateY(-5px);
  box-shadow: var(--shadow-m)
}

.venue-map {
  position: relative;
  height: 150px;
  overflow: hidden;
  background: linear-gradient(160deg, #EDE3CE, #DFD0B2);
}

.venue-map__grid {
  position: absolute;
  inset: 0;
  background-image:
    linear-gradient(rgba(122, 92, 67, .13) 1px, transparent 1px),
    linear-gradient(90deg, rgba(122, 92, 67, .13) 1px, transparent 1px);
  background-size: 26px 26px;
}

.venue-map__road {
  position: absolute;
  background: rgba(255, 255, 255, .75);
  box-shadow: 0 0 0 1px rgba(122, 92, 67, .12)
}

.venue-map__road--a {
  left: -10%;
  right: -10%;
  top: 58%;
  height: 11px;
  transform: rotate(-7deg)
}

.venue-map__road--b {
  top: -10%;
  bottom: -10%;
  left: 32%;
  width: 9px;
  transform: rotate(5deg)
}

.venue-map__road--c {
  left: -10%;
  right: -10%;
  top: 42%;
  height: 11px;
  transform: rotate(6deg)
}

.venue-map__road--d {
  top: -10%;
  bottom: -10%;
  left: 64%;
  width: 9px;
  transform: rotate(-4deg)
}

.venue-map__pin {
  position: absolute;
  left: 50%;
  top: 44%;
  z-index: 2;
  transform: translate(-50%, -50%);
  color: var(--maroon);
  filter: drop-shadow(0 6px 8px rgba(58, 42, 32, .35));
  animation: pinBob 3s var(--ease-soft) infinite;
}

.venue-map__pin .ico {
  width: 34px;
  height: 34px;
  stroke-width: 3.2;
  fill: rgba(255, 255, 255, .5)
}

@keyframes pinBob {

  0%,
  100% {
    transform: translate(-50%, -50%)
  }

  50% {
    transform: translate(-50%, -62%)
  }
}

.venue-map::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  background: linear-gradient(180deg, transparent 58%, rgba(255, 255, 255, .9) 100%);
}

.venue-body {
  padding: clamp(22px, 4.5vw, 30px)
}

.venue-tag {
  font-size: 9.5px;
  letter-spacing: .3em;
  text-transform: uppercase;
  color: var(--brass)
}

.venue-name {
  font-family: var(--f-display);
  font-weight: 400;
  font-size: clamp(21px, 5.2vw, 27px);
  color: var(--ink);
  margin: 8px 0 12px;
  line-height: 1.25
}

.venue-addr {
  font-size: 14px;
  color: var(--ink-soft);
  line-height: 1.75
}

.venue-when {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-top: 14px;
  font-size: 13px;
  color: var(--maroon)
}

.venue-when .ico {
  width: 15px;
  height: 15px;
  color: var(--gold);
  stroke-width: 4.4
}

.venue-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin-top: 22px
}

.contact {
  margin-top: clamp(40px, 6vw, 58px);
  text-align: center;
  padding: clamp(28px, 5vw, 40px) var(--pad);
  border: 1px solid rgba(193, 150, 47, .26);
  background: rgba(255, 255, 255, .5);
}

.contact-title {
  font-size: 9.5px;
  letter-spacing: .3em;
  text-transform: uppercase;
  color: var(--brass)
}

.contact-row {
  display: flex;
  flex-wrap: wrap;
  gap: 12px;
  justify-content: center;
  margin-top: 18px
}

.chip {
  display: inline-flex;
  align-items: center;
  gap: 9px;
  padding: 11px 20px;
  border-radius: 999px;
  border: 1px solid rgba(193, 150, 47, .4);
  color: var(--ink);
  font-size: 14px;
  transition: background .35s var(--ease), transform .35s var(--ease);
}

.chip .ico {
  width: 15px;
  height: 15px;
  color: var(--gold);
  stroke-width: 4.4
}

.chip:hover {
  background: rgba(193, 150, 47, .12);
  transform: translateY(-2px)
}

.contact-sub {
  margin-top: 18px;
  font-family: var(--f-display);
  font-style: italic;
  font-size: 16px;
  color: var(--brown)
}

/* ---------- gallery · cinematic photo wall ---------- */
#gallery {
  overflow: hidden
}

.gallery-lede {
  max-width: 36em;
  margin-inline: auto;
  color: var(--ink-soft);
  font-family: var(--f-display);
  font-style: italic;
  font-size: clamp(15px, 2.4vw, 18px);
  letter-spacing: .01em;
  border: 0;
  background: none;
  padding: 0;
}

.gallery-lede .sample {
  display: none
}

.gallery-rays {
  position: absolute;
  inset: 0;
  pointer-events: none;
  z-index: 1;
  opacity: .55;
  background:
    radial-gradient(42% 28% at 18% 22%, rgba(231, 201, 122, .22), transparent 70%),
    radial-gradient(36% 24% at 82% 38%, rgba(193, 150, 47, .14), transparent 72%),
    radial-gradient(50% 30% at 50% 88%, rgba(255, 248, 230, .35), transparent 70%);
}

.photo-wall-stage {
  position: relative;
  width: 100%;
  max-width: min(1180px, 100%);
  margin-inline: auto;
}

.photo-wall__fx {
  position: absolute;
  inset: 0;
  pointer-events: none;
  z-index: 1;
  overflow: hidden;
}

.photo-wall {
  position: relative;
  columns: 3;
  column-gap: clamp(18px, 2.8vw, 34px);
  padding: clamp(8px, 2vw, 20px) 0 clamp(20px, 4vw, 48px);
  z-index: 2;
}

.photo-card {
  --rot: 0deg;
  --nudge-x: 0px;
  --nudge-y: 0px;
  --scale: 1;
  --parallax-y: 0px;
  --enter-x: 0px;
  --enter-y: 28px;
  --enter-s: .96;
  --drift-delay: 0s;
  position: relative;
  display: inline-block;
  width: 100%;
  margin: 0 0 clamp(22px, 3.2vw, 42px);
  break-inside: avoid;
  page-break-inside: avoid;
  vertical-align: top;
  opacity: 0;
  transform: translate3d(0, var(--parallax-y), 0);
  will-change: transform, opacity;
  z-index: 2;
}

.photo-card--sm {
  width: 86%;
  margin-inline: auto
}

.photo-card--md {
  width: 96%;
  margin-inline: auto
}

.photo-card--lg {
  width: 100%
}

.photo-card[data-enter="left"] {
  --enter-x: -56px;
  --enter-y: 18px;
  --enter-s: 1
}

.photo-card[data-enter="right"] {
  --enter-x: 56px;
  --enter-y: 18px;
  --enter-s: 1
}

.photo-card[data-enter="up"] {
  --enter-x: 0px;
  --enter-y: 40px;
  --enter-s: .93
}

.photo-card__inner {
  transform:
    translate3d(var(--enter-x), var(--enter-y), 0) scale(var(--enter-s));
  transition: transform 1.15s var(--ease), opacity 1.15s var(--ease);
  transform-origin: center center;
}

.photo-card.is-in {
  opacity: 1
}

.photo-card.is-in .photo-card__inner {
  transform:
    translate3d(var(--nudge-x), var(--nudge-y), 0) rotate(var(--rot)) scale(var(--scale));
  animation: photoDrift 8.5s ease-in-out infinite alternate;
  animation-delay: calc(1.2s + var(--drift-delay));
}

.photo-card__paper {
  position: relative;
  padding: clamp(8px, 1.2vw, 12px);
  border-radius: 10px;
  background:
    linear-gradient(165deg, rgba(255, 252, 245, .98), rgba(246, 239, 226, .96) 55%, rgba(238, 226, 204, .94));
  border: 1px solid rgba(231, 201, 122, .55);
  box-shadow:
    0 1px 0 rgba(255, 255, 255, .7) inset,
    0 10px 28px -16px rgba(58, 42, 32, .28),
    0 2px 8px rgba(58, 42, 32, .06);
  transition:
    transform .55s var(--ease),
    box-shadow .55s var(--ease),
    filter .55s var(--ease);
  transform: translateZ(0);
  cursor: default;
}

.photo-card__paper::before {
  content: "";
  position: absolute;
  inset: 5px;
  border-radius: 7px;
  border: 1px solid rgba(193, 150, 47, .28);
  pointer-events: none;
  z-index: 2;
}

.photo-card__paper::after {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: inherit;
  pointer-events: none;
  z-index: 3;
  background: linear-gradient(135deg, rgba(255, 255, 255, .28), transparent 42%, rgba(193, 150, 47, .06));
  mix-blend-mode: soft-light;
}

.photo-card__paper img {
  position: relative;
  z-index: 1;
  width: 100%;
  height: auto;
  max-width: 100%;
  display: block;
  object-fit: contain;
  object-position: center;
  border-radius: 4px;
  background: rgba(230, 215, 190, .35);
  /* never crop — preserve full photograph & natural aspect ratio */
}

.photo-card__paper img.failed {
  display: none
}

.photo-card.is-empty .photo-card__paper {
  min-height: 180px;
}

.photo-card.is-empty .photo-card__paper::before {
  content: attr(data-label);
  inset: 12px;
  display: grid;
  place-items: center;
  text-align: center;
  padding: 16px;
  font-size: 10px;
  letter-spacing: .22em;
  text-transform: uppercase;
  color: rgba(122, 92, 67, .72);
  border: 1px dashed rgba(193, 150, 47, .55);
  border-radius: 6px;
  background: transparent;
}

/* hover / focus — desktop lift */
@media (hover:hover) and (pointer:fine) {
  .photo-card:hover {
    z-index: 5
  }

  .photo-card.is-in:hover .photo-card__paper {
    transform: translateY(-10px) scale(1.025) rotate(.6deg);
    box-shadow:
      0 1px 0 rgba(255, 255, 255, .75) inset,
      0 28px 54px -22px rgba(58, 42, 32, .42),
      0 10px 22px rgba(193, 150, 47, .12);
    filter: saturate(1.04);
  }

  .photo-card.is-in:focus-within .photo-card__paper {
    outline: 2px solid rgba(193, 150, 47, .55);
    outline-offset: 4px;
  }
}

/* mobile / touch bounce + soft glow */
.photo-card.is-touched .photo-card__paper {
  animation: photoTouch .55s var(--ease);
  box-shadow:
    0 1px 0 rgba(255, 255, 255, .75) inset,
    0 18px 40px -18px rgba(58, 42, 32, .36),
    0 0 0 1px rgba(231, 201, 122, .45),
    0 0 28px rgba(231, 201, 122, .28);
}

@keyframes photoDrift {
  0% {
    transform:
      translate3d(var(--nudge-x), var(--nudge-y), 0) rotate(var(--rot)) scale(var(--scale));
  }

  50% {
    transform:
      translate3d(calc(var(--nudge-x) + 2px), calc(var(--nudge-y) - 5px), 0) rotate(calc(var(--rot) + .35deg)) scale(calc(var(--scale) * 1.008));
  }

  100% {
    transform:
      translate3d(calc(var(--nudge-x) - 1px), calc(var(--nudge-y) + 3px), 0) rotate(calc(var(--rot) - .25deg)) scale(var(--scale));
  }
}

@keyframes photoTouch {
  0% {
    transform: translateY(0) scale(1)
  }

  40% {
    transform: translateY(-6px) scale(1.03)
  }

  100% {
    transform: translateY(0) scale(1)
  }
}

/* decorative sparkles / petals / dots */
.photo-decor {
  position: absolute;
  pointer-events: none;
  z-index: 1;
  opacity: .55;
}

.photo-decor--spark {
  width: 7px;
  height: 7px;
  background: radial-gradient(circle, rgba(231, 201, 122, .95) 0%, rgba(193, 150, 47, .2) 55%, transparent 70%);
  border-radius: 50%;
  animation: photoSpark 4.8s ease-in-out infinite;
}

.photo-decor--spark::before,
.photo-decor--spark::after {
  content: "";
  position: absolute;
  left: 50%;
  top: 50%;
  width: 1px;
  height: 12px;
  background: linear-gradient(180deg, transparent, rgba(231, 201, 122, .75), transparent);
  transform: translate(-50%, -50%);
}

.photo-decor--spark::after {
  transform: translate(-50%, -50%) rotate(90deg)
}

.photo-decor--petal {
  width: 14px;
  height: 10px;
  border-radius: 60% 40% 60% 40%;
  background: linear-gradient(135deg, rgba(231, 201, 122, .55), rgba(193, 150, 47, .15));
  transform: rotate(25deg);
  animation: photoPetal 11s ease-in-out infinite alternate;
}

.photo-decor--dot {
  width: 3px;
  height: 3px;
  border-radius: 50%;
  background: rgba(193, 150, 47, .55);
  box-shadow: 0 0 8px rgba(231, 201, 122, .45);
  animation: photoSpark 6s ease-in-out infinite;
}

.photo-decor--ray {
  width: 120px;
  height: 120px;
  border-radius: 50%;
  background: radial-gradient(circle, rgba(255, 248, 230, .45), transparent 68%);
  filter: blur(2px);
  animation: photoSpark 9s ease-in-out infinite;
}

.photo-decor.a {
  top: 8%;
  left: 6%;
  animation-delay: 0s
}

.photo-decor.b {
  top: 42%;
  right: 4%;
  animation-delay: 1.2s
}

.photo-decor.c {
  bottom: 18%;
  left: 48%;
  animation-delay: 2.4s
}

.photo-decor.d {
  top: 28%;
  left: 38%;
  opacity: .35
}

.photo-decor.e {
  bottom: 32%;
  right: 18%;
  opacity: .3;
  transform: rotate(-18deg) scale(.85)
}

.photo-decor.f {
  top: 16%;
  right: 28%
}

.photo-decor.g {
  bottom: 12%;
  left: 12%
}

.photo-decor.h {
  top: 55%;
  left: 8%;
  opacity: .4
}

@keyframes photoSpark {

  0%,
  100% {
    opacity: .25;
    transform: scale(.85)
  }

  50% {
    opacity: .7;
    transform: scale(1.15)
  }
}

@keyframes photoPetal {
  0% {
    transform: translateY(0) rotate(18deg)
  }

  100% {
    transform: translateY(10px) rotate(42deg)
  }
}

/* ---------- pending note ---------- */
.note-box {
  max-width: 760px;
  margin-inline: auto;
  padding: clamp(22px, 4.5vw, 32px);
  border: 1px dashed rgba(160, 40, 60, .45);
  border-radius: 6px;
  background: rgba(160, 40, 60, .04);
}

.note-head {
  font-size: 13.5px;
  color: #8a2036;
  font-weight: 400;
  letter-spacing: .02em
}

.note-del {
  color: var(--ink-soft);
  font-size: 12px
}

.note-list {
  margin-top: 14px;
  display: grid;
  gap: 8px
}

.note-list li {
  position: relative;
  padding-left: 18px;
  font-size: 14px;
  color: var(--ink-soft);
  line-height: 1.7
}

.note-list li::before {
  content: "";
  position: absolute;
  left: 2px;
  top: .7em;
  width: 5px;
  height: 5px;
  border-radius: 50%;
  background: rgba(160, 40, 60, .6)
}

.note-ok {
  margin-top: 16px;
  font-size: 13.5px;
  color: var(--leaf-dk);
  line-height: 1.7
}

/* ============================================================
   10 · THANK YOU FINALE
   ============================================================ */
.finale-glow {
  position: absolute;
  left: 50%;
  top: 46%;
  width: min(96%, 860px);
  aspect-ratio: 2/1;
  transform: translate(-50%, -50%);
  pointer-events: none;
  opacity: 0;
  background: radial-gradient(closest-side, rgba(255, 206, 130, .34), transparent 72%);
  transition: opacity 1.8s var(--ease);
}

body.finale-glow-on .finale-glow {
  opacity: 1
}

.finale-stage {
  position: relative;
  width: 100%;
  height: clamp(150px, 30vh, 250px);
  display: grid;
  place-items: center;
}

.finale-fallback {
  font-family: var(--f-display);
  font-weight: 300;
  font-size: clamp(34px, 11vw, 84px);
  letter-spacing: .16em;
  color: rgba(255, 232, 180, .92);
  text-shadow: 0 0 40px rgba(255, 196, 110, .4);
  transition: opacity 1.2s var(--ease);
}

body.finale-particles .finale-fallback {
  opacity: 0
}

.finale-sub {
  margin-top: 8px;
  font-family: var(--f-display);
  font-style: italic;
  font-size: clamp(17px, 4.4vw, 24px);
  color: rgba(243, 233, 214, .72);
}

.finale-ml {
  margin-top: 10px;
  font-family: var(--f-ml);
  font-size: clamp(13px, 3.4vw, 15px);
  color: rgba(231, 201, 122, .72);
  letter-spacing: .04em
}

/* ============================================================
   10b · AUDIO DISC CONTROL
   ============================================================ */
.audio-disc {
  position: fixed;
  z-index: 110;
  left: max(16px, env(safe-area-inset-left));
  bottom: max(18px, env(safe-area-inset-bottom));
  width: 64px;
  height: 64px;
  padding: 0;
  border-radius: 50%;
  isolation: isolate;
  -webkit-tap-highlight-color: transparent;
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  transform: translate3d(0, 12px, 0) scale(.88);
  transition: opacity .55s var(--ease), visibility 0s linear .55s, transform .55s var(--ease);
}

.audio-disc.is-visible {
  opacity: 1;
  visibility: visible;
  pointer-events: auto;
  transform: none;
  transition: opacity .55s var(--ease), visibility 0s, transform .55s var(--ease);
}

.audio-disc__glow {
  position: absolute;
  inset: -14px;
  z-index: 0;
  border-radius: 50%;
  background: radial-gradient(closest-side, rgba(255, 196, 110, .38), transparent 72%);
  opacity: .55;
  pointer-events: none;
  transition: opacity .4s var(--ease);
}

.audio-disc.is-playing .audio-disc__glow {
  opacity: 1;
  animation: pulseGlow 3.2s var(--ease-soft) infinite;
}

.audio-disc__ring {
  position: absolute;
  inset: -5px;
  z-index: 1;
  border-radius: 50%;
  border: 1px solid rgba(231, 201, 122, .45);
  pointer-events: none;
}

.audio-disc.is-playing .audio-disc__ring {
  animation: ringOut 3.2s var(--ease-soft) infinite;
}

.audio-disc__platter {
  position: absolute;
  inset: 0;
  z-index: 2;
  border-radius: 50%;
  background:
    radial-gradient(circle at 50% 50%, #2a1c10 0 18%, transparent 18.5%),
    repeating-radial-gradient(circle at 50% 50%,
      #1a120c 0 1.5px,
      #24180f 1.5px 3px);
  border: 2px solid rgba(231, 201, 122, .72);
  box-shadow:
    inset 0 0 0 1px rgba(255, 232, 180, .18),
    0 10px 28px -10px rgba(0, 0, 0, .75),
    0 0 0 1px rgba(193, 150, 47, .2);
  overflow: hidden;
}

.audio-disc__grooves {
  position: absolute;
  inset: 8%;
  border-radius: 50%;
  background:
    repeating-radial-gradient(circle at 50% 50%,
      transparent 0 2px,
      rgba(255, 220, 150, .06) 2px 3px);
  -webkit-mask-image: radial-gradient(circle, transparent 28%, #000 30%, #000 92%, transparent 94%);
  mask-image: radial-gradient(circle, transparent 28%, #000 30%, #000 92%, transparent 94%);
  pointer-events: none;
}

.audio-disc__hub {
  position: absolute;
  inset: 28%;
  z-index: 2;
  border-radius: 50%;
  display: grid;
  place-items: center;
  background:
    radial-gradient(circle at 35% 30%, rgba(255, 236, 190, .35), transparent 55%),
    linear-gradient(145deg, #C1962F, #8E6C1E 55%, #6B5316);
  border: 1px solid rgba(255, 232, 180, .45);
  box-shadow: inset 0 1px 0 rgba(255, 240, 205, .35), 0 2px 8px rgba(0, 0, 0, .35);
}

.audio-disc__mono {
  font-family: var(--f-display);
  font-weight: 500;
  font-style: italic;
  font-size: 11px;
  letter-spacing: .04em;
  line-height: 1;
  color: #FFF6E3;
  text-shadow: 0 1px 2px rgba(0, 0, 0, .35);
  opacity: .92;
}

.audio-disc.is-playing .audio-disc__platter {
  animation: discSpin 4.8s linear infinite;
}

@keyframes discSpin {
  to {
    transform: rotate(360deg)
  }
}

.audio-disc__icon {
  position: absolute;
  inset: 0;
  z-index: 4;
  display: grid;
  place-items: center;
  border-radius: 50%;
  background: radial-gradient(circle, rgba(11, 7, 3, .18) 0%, rgba(11, 7, 3, .42) 70%, rgba(11, 7, 3, .55) 100%);
  color: #FFF3DC;
  transition: background .35s var(--ease), opacity .35s var(--ease);
}

.audio-disc.is-playing .audio-disc__icon {
  background: radial-gradient(circle, rgba(11, 7, 3, .08) 0%, rgba(11, 7, 3, .28) 100%);
  opacity: .88;
}

.audio-disc__icon svg {
  width: 18px;
  height: 18px;
  filter: drop-shadow(0 1px 2px rgba(0, 0, 0, .4))
}

.audio-disc__pause {
  display: none
}

.audio-disc.is-playing .audio-disc__play {
  display: none
}

.audio-disc.is-playing .audio-disc__pause {
  display: block
}

.audio-disc:hover {
  transform: translateY(-2px)
}

.audio-disc:hover .audio-disc__platter {
  border-color: rgba(231, 201, 122, .95);
  box-shadow:
    inset 0 0 0 1px rgba(255, 232, 180, .28),
    0 14px 34px -12px rgba(255, 180, 90, .35),
    0 0 0 1px rgba(193, 150, 47, .35);
}

.audio-disc:active {
  transform: scale(.96)
}

.audio-disc:focus-visible {
  outline: 2px solid var(--gold-lt);
  outline-offset: 6px
}

/* ============================================================
   11 · FOOTER
   ============================================================ */
.footer {
  color: rgba(243, 233, 214, .8)
}

.footer-crest {
  width: 42px;
  height: 42px;
  color: var(--gold-lt);
  stroke-width: 2.9;
  margin: 0 auto 20px;
  opacity: .9;
  animation: flicker 4.2s ease-in-out infinite
}

.footer-blessing {
  font-family: var(--f-ml);
  font-size: clamp(16px, 4.2vw, 21px);
  color: var(--gold-lt)
}

.footer-bless-en {
  max-width: 520px;
  margin: 14px auto 0;
  font-family: var(--f-display);
  font-style: italic;
  font-size: clamp(15px, 3.8vw, 18px);
  color: rgba(243, 233, 214, .65);
  line-height: 1.8
}

.footer-names {
  margin-top: 28px;
  font-family: var(--f-display);
  font-weight: 300;
  font-size: clamp(26px, 7vw, 42px);
  color: #FBF3E2
}

.footer-names span {
  font-style: italic;
  color: var(--gold-lt);
  font-size: .6em;
  margin: 0 6px
}

.footer-date {
  margin-top: 8px;
  font-size: 10.5px;
  letter-spacing: .28em;
  text-transform: uppercase;
  color: rgba(243, 233, 214, .45)
}

.footer-fine {
  margin-top: 30px;
  font-family: var(--f-ml);
  font-size: 15px;
  color: var(--gold);
  opacity: .75
}

/* ============================================================
   12 · RESPONSIVE
   ============================================================ */

@media (max-width:900px) {
  .photo-wall {
    columns: 2;
    column-gap: clamp(14px, 3vw, 22px)
  }

  .photo-card--sm {
    width: 90%
  }

  .photo-card--md {
    width: 98%
  }
}

@media (max-width:720px) {
  .tl {
    padding-left: 0
  }

  .tl::before {
    left: 19px
  }

  .tl-item {
    padding-left: 56px
  }

  .tl-node {
    width: 39px;
    height: 39px;
    box-shadow: 0 0 0 5px var(--ivory)
  }

  .tl-node .ico {
    width: 19px;
    height: 19px
  }

  .tc-row {
    grid-template-columns: 1fr;
    gap: 2px
  }

  .tc-row dd {
    padding-left: 24px
  }

  .audio-disc {
    width: 58px;
    height: 58px
  }

  .audio-disc__mono {
    font-size: 10px
  }

  .audio-disc__icon svg {
    width: 16px;
    height: 16px
  }

  .photo-card {
    margin-bottom: clamp(18px, 4vw, 28px)
  }

  .photo-card[data-enter="left"],
  .photo-card[data-enter="right"] {
    --enter-x: 0px;
    --enter-y: 32px;
    --enter-s: .96
  }
}

@media (max-width:520px) {
  .photo-wall {
    columns: 1
  }

  .photo-wall-stage {
    max-width: 420px
  }

  .photo-card--sm,
  .photo-card--md,
  .photo-card--lg {
    width: 100%
  }

  .photo-card {
    --nudge-y: 0px;
    --scale: 1
  }

  .photo-decor {
    opacity: .35
  }
}

@media (max-width:420px) {
  .countdown {
    gap: 6px
  }

  .cd-unit {
    min-width: 56px
  }
}

@media (min-width:900px) {
  .couple-grid {
    grid-template-columns: 1fr auto 1fr;
    align-items: center
  }

  .lux-card {
    grid-template-columns: 1fr auto 1fr
  }

  .lux-card__rule {
    width: 1px;
    height: auto;
    align-self: stretch;
    background: linear-gradient(180deg, transparent, rgba(231, 201, 122, .5), transparent)
  }

  .photo-wall {
    columns: 3
  }
}

@media (min-width:1200px) {
  .photo-wall {
    column-gap: 38px
  }
}

/* ---------- 13 · MOTION / A11Y ---------- */
@media (prefers-reduced-motion:reduce) {
  html {
    scroll-behavior: auto
  }

  *,
  *::before,
  *::after {
    animation-duration: .001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .001ms !important;
  }

  .reveal {
    opacity: 1;
    transform: none
  }

  .photo-card,
  .photo-card.is-in {
    opacity: 1;
    transform: none
  }

  .photo-card__inner,
  .photo-card.is-in .photo-card__inner {
    transform: translate3d(var(--nudge-x, 0), var(--nudge-y, 0), 0) rotate(var(--rot, 0deg)) scale(var(--scale, 1));
    animation: none !important;
  }

  .photo-card.is-touched .photo-card__paper,
  .photo-decor {
    animation: none !important
  }

  #particles {
    display: none
  }

  .cover-img {
    animation: none;
    transform: none
  }

  .audio-disc.is-playing .audio-disc__platter {
    animation: none
  }

  .audio-disc.is-playing .audio-disc__glow,
  .audio-disc.is-playing .audio-disc__ring {
    animation: none
  }

  .scene--hero,
  .scene--hero.loaded {
    opacity: 1;
    visibility: visible
  }

  .scene--hero>.section-bg,
  .scene--hero>picture.section-bg,
  .scene--hero>picture.section-bg>img {
    opacity: 1
  }

  .scene--hero>.section-content,
  .scene--hero.loaded.text-ready>.section-content,
  .scene--hero>.scroll-indicator,
  .scene--hero.loaded.text-ready>.scroll-indicator {
    opacity: 1;
    transform: none;
  }
}

@media (prefers-contrast:more) {

  .sec-note,
  .fact-s,
  .tl-text,
  .card p {
    color: #4A362A
  }
}