/* ============================================================
   Invity invitation themes + invite page components.
   Each theme sets CSS variables only; components consume them.
   ============================================================ */

/* Inline Lucide icons: sit level with surrounding text */
.icon { vertical-align: -3px; flex-shrink: 0; }

.invite {
  --inv-bg: #fffdf8;
  --inv-alt-bg: #f7f2e9;
  --inv-text: #3a3a3a;
  --inv-accent: #b02a37;
  --inv-gold: #c9a227;
  --inv-heading-font: 'Playfair Display', Georgia, serif;
  --inv-body-font: 'Manrope', 'Noto Sans Tamil', system-ui, sans-serif;
  background: var(--inv-bg);
  color: var(--inv-text);
  font-family: var(--inv-body-font);
  padding-bottom: 84px; /* room for the floating action bar */
}

/* ---------- Hero: the arch (doorway = welcome) ---------- */
.inv-hero { min-height: 88vh; display: flex; align-items: center; position: relative; }
.inv-hero::before { /* soft pattern watermark */
  content: ''; position: absolute; inset: 0; opacity: .5; pointer-events: none;
  background:
    radial-gradient(circle at 15% 25%, color-mix(in srgb, var(--inv-accent) 7%, transparent) 0 60px, transparent 61px),
    radial-gradient(circle at 85% 70%, color-mix(in srgb, var(--inv-gold) 9%, transparent) 0 80px, transparent 81px);
}
.inv-arch {
  position: relative; margin: 0 auto; max-width: 640px;
  padding: clamp(2.5rem, 7vw, 4.5rem) clamp(1.25rem, 5vw, 3rem);
  background: color-mix(in srgb, #ffffff 55%, var(--inv-bg));
  border: 1.5px solid color-mix(in srgb, var(--inv-gold) 55%, transparent);
  border-radius: 300px 300px 24px 24px;   /* the arch */
  box-shadow: 0 24px 60px -24px color-mix(in srgb, var(--inv-accent) 35%, transparent);
}
.inv-arch::before { /* inner gold line */
  content: ''; position: absolute; inset: 10px;
  border: 1px solid color-mix(in srgb, var(--inv-gold) 40%, transparent);
  border-radius: 290px 290px 18px 18px; pointer-events: none;
}
.inv-kicker {
  letter-spacing: .32em; text-transform: uppercase; font-size: .72rem;
  font-weight: 700; color: var(--inv-accent);
}
.inv-title {
  font-family: var(--inv-heading-font);
  font-size: clamp(2.4rem, 8vw, 4.2rem);
  line-height: 1.12; color: var(--inv-accent);
  animation: inv-rise .9s ease both .15s;
}
.inv-date { font-size: 1.02rem; letter-spacing: .14em; text-transform: uppercase; font-weight: 600; }
.inv-invite-line { font-family: var(--inv-heading-font); font-size: 1.28rem; font-style: italic; }
@keyframes inv-rise { from { opacity: 0; transform: translateY(14px); } to { opacity: 1; transform: none; } }

/* ---------- Ornament: gold rule with centre motif ---------- */
.inv-ornament {
  display: flex; align-items: center; gap: .8rem; justify-content: center;
  color: var(--inv-gold); font-size: 1.15rem; margin: 1.2rem auto;
}
.inv-ornament::before, .inv-ornament::after {
  content: ''; height: 1px; width: min(90px, 22vw);
  background: linear-gradient(90deg, transparent, var(--inv-gold));
}
.inv-ornament::after { background: linear-gradient(90deg, var(--inv-gold), transparent); }

/* ---------- Sections ---------- */
.inv-section { padding: 3.5rem 0; }
.inv-section > .container { max-width: 560px; }
.inv-alt { background: var(--inv-alt-bg); }
.inv-heading {
  font-family: var(--inv-heading-font); color: var(--inv-accent); font-size: 2rem;
}

/* ---------- Honorees ---------- */
.inv-honoree {
  background: #fff; border: 1px solid color-mix(in srgb, var(--inv-gold) 35%, transparent);
  border-radius: 140px 140px 16px 16px; padding: 1.4rem 2rem 1rem;
  box-shadow: 0 8px 22px rgba(0,0,0,.05);
}
.inv-honoree-name { font-family: var(--inv-heading-font); font-size: 1.5rem; }
.inv-honoree-role { color: var(--inv-gold); text-transform: capitalize; letter-spacing: .08em; font-weight: 700; }

/* ---------- Events: golden-thread timeline ---------- */
.inv-timeline { position: relative; text-align: left; }
.inv-timeline::before {
  content: ''; position: absolute; left: 17px; top: 8px; bottom: 8px; width: 2px;
  background: linear-gradient(var(--inv-gold), color-mix(in srgb, var(--inv-gold) 25%, transparent));
}
.inv-event {
  position: relative; padding: 1.1rem 1.3rem;
  background: #fff; border: 1px solid rgba(0,0,0,.05); border-radius: 14px;
  box-shadow: 0 4px 16px rgba(0,0,0,.05);
}
.inv-timeline .inv-event {
  margin: 0 0 1.1rem 48px;
  background: #fff; border: 1px solid rgba(0,0,0,.05); border-radius: 14px;
  box-shadow: 0 4px 16px rgba(0,0,0,.05);
}
.inv-timeline .inv-event::before {
  content: ''; position: absolute; left: -38px; top: 1.35rem;
  width: 14px; height: 14px; border-radius: 50%;
  background: var(--inv-gold); box-shadow: 0 0 0 4px color-mix(in srgb, var(--inv-gold) 25%, transparent);
}
.inv-event-name { font-family: var(--inv-heading-font); font-size: 1.3rem; color: var(--inv-accent); }
.inv-map-link {
  display: inline-block; margin-top: .35rem; padding: .25rem .9rem;
  border: 1px solid var(--inv-accent); border-radius: 50rem;
  color: var(--inv-accent); text-decoration: none; font-weight: 600; font-size: .82rem;
}
.inv-map-link:hover { background: var(--inv-accent); color: var(--inv-accent-fg, #fff); }

/* ---------- Content pack ---------- */
/* Both pills always sit on a pale gold-tinted background regardless of
   context - explicit dark text so they stay legible even inside hero
   sections that switch surrounding text to white for a dark banner. */
.inv-countdown {
  display: inline-block; padding: .3rem 1rem; border-radius: 50rem;
  background: color-mix(in srgb, var(--inv-gold) 22%, #fff); color: var(--inv-accent);
  font-weight: 700; font-size: .85rem; letter-spacing: .06em;
}
.inv-story { font-family: var(--inv-heading-font); font-size: 1.15rem; line-height: 1.8; }
.inv-dress {
  display: inline-block; padding: .1rem .6rem; border-radius: 50rem; margin-right: .2rem;
  background: color-mix(in srgb, var(--inv-gold) 20%, #fff); color: var(--inv-accent);
  font-weight: 700; font-size: .72rem; text-transform: uppercase; letter-spacing: .05em;
}
.inv-acc {
  background: #fff; border: 1px solid color-mix(in srgb, var(--inv-gold) 30%, transparent);
  border-radius: 12px; padding: .8rem 1rem; margin-bottom: .6rem;
}
.inv-acc summary { font-weight: 700; cursor: pointer; color: var(--inv-accent); }
.inv-acc summary::marker { color: var(--inv-gold); }

/* plain card variant (thank-you, reminder, playlist row, quiz card) */
.inv-card {
  background: #fff; border: 1px solid rgba(0,0,0,.05); border-radius: 14px;
  box-shadow: 0 4px 16px rgba(0,0,0,.05);
}

/* ---------- Gallery mosaic ---------- */
.inv-photo { border-radius: 14px; aspect-ratio: 1; object-fit: cover; width: 100%;
  box-shadow: 0 6px 18px rgba(0,0,0,.08); }

/* ---------- Blessings wall: guest-book note cards ---------- */
.inv-note {
  position: relative; background: #fff; text-align: left;
  border: 1px solid color-mix(in srgb, var(--inv-gold) 30%, transparent);
  border-radius: 14px; padding: 1.1rem 1.2rem 1rem 2.6rem;
  box-shadow: 0 5px 16px rgba(0,0,0,.05);
}
.inv-note::before {
  content: '\201C'; position: absolute; left: .8rem; top: .2rem;
  font-family: var(--inv-heading-font); font-size: 2.4rem; color: var(--inv-gold);
}
.inv-note-name { font-family: var(--inv-heading-font); color: var(--inv-accent); margin-top: .3rem; }

/* ---------- Buttons ---------- */
.inv-btn {
  background: var(--inv-accent); color: var(--inv-accent-fg, #fff); border: none; border-radius: 50rem;
  padding: .6rem 1.6rem; font-weight: 700;
}
/* darken (not brighten) on hover - brightening a pale accent toward white
   is what was washing out the button's text on lighter-accent themes */
.inv-btn:hover { filter: brightness(.92);
  box-shadow: 0 0 0 .25rem color-mix(in srgb, var(--inv-gold) 40%, transparent); }

/* ---------- Bless form emoji picker ---------- */
.inv-emoji-toggle {
  background: none; border: none; padding: 0; font-size: .82rem; font-weight: 600;
  color: var(--inv-accent); cursor: pointer;
}
.inv-emoji-picker { display: flex; flex-wrap: wrap; gap: .35rem; }
.inv-emoji-btn {
  font-size: 1.25rem; line-height: 1; background: #fff;
  border: 1px solid rgba(0,0,0,.08); border-radius: 10px; padding: .3rem .5rem; cursor: pointer;
}
.inv-emoji-btn:hover { background: color-mix(in srgb, var(--inv-gold) 18%, #fff); }

/* ---------- Floating action bar ---------- */
.inv-fab {
  position: fixed; left: 0; right: 0; bottom: 0; z-index: 40;
  display: flex; gap: .6rem; justify-content: center;
  padding: .7rem max(1rem, env(safe-area-inset-left)) calc(.7rem + env(safe-area-inset-bottom));
  background: color-mix(in srgb, #ffffff 88%, var(--inv-bg));
  box-shadow: 0 -6px 24px rgba(0,0,0,.10);
  backdrop-filter: blur(6px);
}
.inv-fab .inv-btn { flex: 1; max-width: 240px; text-align: center; text-decoration: none; }
.inv-fab .inv-btn.alt { background: #fff; color: var(--inv-accent);
  border: 1.5px solid var(--inv-accent); }

/* ---------- Bless bottom sheet ---------- */
.inv-sheet-backdrop {
  position: fixed; inset: 0; background: rgba(30,20,10,.45); z-index: 60;
  opacity: 0; pointer-events: none; transition: opacity .25s ease;
}
.inv-sheet {
  position: fixed; left: 0; right: 0; bottom: 0; z-index: 61;
  background: #fff; border-radius: 22px 22px 0 0; padding: 1.3rem 1.3rem 2rem;
  max-width: 560px; margin: 0 auto;
  transform: translateY(105%); transition: transform .3s ease;
  box-shadow: 0 -12px 40px rgba(0,0,0,.2); text-align: left;
}
.invite.sheet-open .inv-sheet { transform: none; }
.invite.sheet-open .inv-sheet-backdrop { opacity: 1; pointer-events: auto; }
.inv-sheet-handle { width: 44px; height: 4px; border-radius: 2px; background: #ddd; margin: 0 auto .9rem; }

/* ---------- Petal burst ---------- */
.inv-petal {
  position: fixed; top: -20px; z-index: 70; width: 12px; height: 12px;
  border-radius: 60% 0 60% 0; pointer-events: none;
  animation: inv-fall linear forwards;
}
@keyframes inv-fall {
  to { transform: translateY(110vh) rotate(540deg); opacity: .2; }
}

/* ============ Recipe: Royal Arch (default - ceremonial curves) ============
   Every card echoes the hero's arch-doorway shape. This is the calm,
   timeless baseline every other recipe deliberately breaks from. */
.inv-r-arch .inv-honoree, .inv-r-arch .inv-acc, .inv-r-arch .inv-card, .inv-r-arch .inv-note {
  border-radius: 120px 120px 18px 18px;
}
.inv-r-arch .inv-timeline .inv-event { border-radius: 60px 60px 14px 14px; }
.inv-r-arch .inv-footer { border-top: 1px solid color-mix(in srgb, var(--inv-gold) 30%, transparent); }

/* ============ Recipe: Garland Frame (ethnic - festoons & marigold) ============
   A beaded gold band crowns every section (mobile-visible base rule; the
   fixed side-rails below are a bonus flourish once there's room for them),
   double-bordered "festoon" cards, warm saffron alt-section wash. */
.inv-ghero { padding-bottom: 2.5rem; }
.inv-gband {
  height: clamp(140px, 26vw, 260px);
  background-size: cover; background-position: center;
  border-bottom: 4px solid var(--inv-gold);
}
.inv-gband-plain { background: linear-gradient(120deg, var(--inv-accent), color-mix(in srgb, var(--inv-accent) 55%, var(--inv-gold))); }
.inv-gpanel {
  max-width: 680px; margin: clamp(-60px, -8vw, -90px) auto 0;
  background: color-mix(in srgb, #fff 72%, var(--inv-bg));
  border: 1.5px solid color-mix(in srgb, var(--inv-gold) 60%, transparent);
  outline: 1px solid color-mix(in srgb, var(--inv-gold) 35%, transparent);
  outline-offset: 6px;
  border-radius: 16px; padding: clamp(1.8rem, 5vw, 3rem);
  box-shadow: 0 20px 50px -20px rgba(0,0,0,.25);
  position: relative;
}
.inv-r-garland .inv-section { position: relative; }
.inv-r-garland .inv-section::before {
  content: ''; position: absolute; top: 0; left: 0; right: 0; height: 5px;
  background: repeating-linear-gradient(90deg,
    var(--inv-gold) 0 8px, color-mix(in srgb, var(--inv-accent) 65%, var(--inv-gold)) 8px 16px);
  opacity: .65;
}
.inv-r-garland .inv-alt { background-color: color-mix(in srgb, var(--inv-gold) 14%, var(--inv-alt-bg)); }
.inv-r-garland .inv-honoree, .inv-r-garland .inv-acc, .inv-r-garland .inv-card, .inv-r-garland .inv-note, .inv-r-garland .inv-ecard {
  border-width: 2.5px; border-style: double; border-color: color-mix(in srgb, var(--inv-gold) 65%, transparent);
}
.inv-r-garland .inv-ornament { font-size: 1.4rem; }
.inv-r-garland .inv-photo { border-radius: 50%; border: 3px solid color-mix(in srgb, var(--inv-gold) 55%, transparent); box-shadow: none; }
.inv-r-garland .inv-footer {
  border-top: 5px solid transparent;
  border-image: repeating-linear-gradient(90deg, var(--inv-gold) 0 8px, transparent 8px 16px) 5;
}
@media (min-width: 992px) {
  .inv-r-garland::before, .inv-r-garland::after {
    content: ''; position: fixed; top: 0; bottom: 0; width: 18px; z-index: 5;
    background: linear-gradient(var(--inv-gold), color-mix(in srgb, var(--inv-gold) 40%, transparent), var(--inv-gold));
    opacity: .5;
  }
  .inv-r-garland::before { left: 0; }
  .inv-r-garland::after { right: 0; }
  .inv-r-garland .inv-section::before { opacity: .35; } /* soften once the side rails carry the motif */
}

/* ============ Recipe: Formal Booklet (divine - engraved stationery) ============
   Flat, squared, shadow-less, uppercase small-caps - a formal printed
   card feel throughout, no ornament, thin hairline rules instead. */
.inv-bhero { padding: clamp(2rem, 6vw, 4rem) 0 1rem; }
.inv-bpage {
  max-width: 640px; margin: 0 auto; background: #fff;
  border: 1px solid color-mix(in srgb, var(--inv-accent) 35%, transparent);
  outline: 1px solid color-mix(in srgb, var(--inv-accent) 20%, transparent);
  outline-offset: 5px;
  padding: clamp(2.2rem, 6vw, 3.6rem);
  box-shadow: 0 14px 40px -18px rgba(0,0,0,.18);
}
.inv-bmonogram {
  font-family: var(--inv-heading-font); font-size: 1.6rem; letter-spacing: .2em;
  color: var(--inv-gold);
}
.inv-brule { width: 120px; height: 1px; margin: 1rem auto; background: color-mix(in srgb, var(--inv-accent) 45%, transparent); }
.inv-btitle {
  font-family: var(--inv-heading-font); font-size: clamp(1.9rem, 6vw, 3rem);
  letter-spacing: .06em; color: var(--inv-accent);
}
.inv-bdate { font-size: .95rem; letter-spacing: .3em; text-transform: uppercase; }
.inv-r-booklet .inv-section { padding: 2.6rem 0; }
.inv-r-booklet .inv-alt { background-image: none; background: var(--inv-bg); }
.inv-r-booklet .inv-heading { font-size: 1.45rem; letter-spacing: .14em; text-transform: uppercase; }
.inv-r-booklet .inv-ornament { display: none; }
.inv-r-booklet .inv-heading + * { margin-top: 1rem; }
.inv-r-booklet .inv-card, .inv-r-booklet .inv-event, .inv-r-booklet .inv-note,
.inv-r-booklet .inv-ecard, .inv-r-booklet .inv-honoree, .inv-r-booklet .inv-acc {
  border-radius: 0; border: 1px solid color-mix(in srgb, var(--inv-accent) 22%, transparent); box-shadow: none;
}
.inv-r-booklet .inv-honoree-name, .inv-r-booklet .inv-note-name, .inv-r-booklet .inv-event-name { letter-spacing: .04em; }
.inv-r-booklet .inv-photo { border-radius: 0; box-shadow: none; border: 1px solid color-mix(in srgb, var(--inv-accent) 25%, transparent); }
.inv-r-booklet .inv-btn { border-radius: 2px; letter-spacing: .1em; text-transform: uppercase; font-size: .82rem; }
.inv-r-booklet .inv-footer { font-family: var(--inv-heading-font); letter-spacing: .08em; }
.inv-erule-sep { border-bottom: 1px solid color-mix(in srgb, var(--inv-accent) 25%, transparent); }
.inv-erule-meta { font-size: .95rem; line-height: 1.9; letter-spacing: .04em; }

/* ============ Recipe: Typographic Poster (modern - bold left-aligned type) ============
   Card chrome stripped away in favour of numbered, left-aligned rows;
   big confident type does the work instead of boxes and shadows. */
.inv-phero { min-height: 78vh; display: flex; align-items: center; }
.inv-pkicker { letter-spacing: .3em; text-transform: uppercase; font-size: .78rem; font-weight: 700; color: var(--inv-gold); }
.inv-ptitle {
  font-family: var(--inv-heading-font);
  font-size: clamp(3.2rem, 14vw, 8.5rem);
  line-height: .98; color: var(--inv-accent);
  white-space: pre-line; margin: 1rem 0 0;
}
.inv-pdate { font-size: 1.4rem; font-weight: 700; letter-spacing: .06em; }
.inv-pline { font-size: 1.05rem; opacity: .8; max-width: 420px; }
.inv-r-poster .inv-section { text-align: left; }
.inv-r-poster .inv-section .text-center { text-align: left !important; }
.inv-r-poster .inv-ornament { display: none; }
.inv-r-poster .inv-heading { font-size: clamp(1.8rem, 5vw, 2.6rem); }
.inv-r-poster .inv-heading::before {
  counter-increment: inv-sec;
  content: counter(inv-sec, decimal-leading-zero) " ";
  color: var(--inv-gold); font-size: .55em; vertical-align: super; letter-spacing: .1em;
}
.inv-r-poster { counter-reset: inv-sec; }
.inv-r-poster .row.justify-content-center { justify-content: flex-start !important; }
.inv-r-poster .inv-honoree, .inv-r-poster .inv-acc, .inv-r-poster .inv-card {
  background: none; border: none; box-shadow: none; border-radius: 0;
  border-bottom: 2px solid var(--inv-text); padding: 1rem 0; text-align: left;
}
.inv-r-poster .inv-note {
  border-radius: 0; border: none; border-left: 3px solid var(--inv-accent); box-shadow: none;
  padding: .2rem 0 .2rem 1.2rem; background: none;
}
.inv-r-poster .inv-photo { border-radius: 0; box-shadow: none; }
.inv-r-poster .inv-btn { border-radius: 2px; }
.inv-plist-row {
  display: grid; grid-template-columns: 96px 1fr; gap: 1rem;
  padding: 1.1rem 0; border-top: 2px solid var(--inv-text);
}
.inv-plist-row:last-child { border-bottom: 2px solid var(--inv-text); }
.inv-plist-when { display: flex; flex-direction: column; font-size: .95rem; }
.inv-ecard {
  background: #fff; border: 1px solid rgba(0,0,0,.06); border-radius: 14px;
  padding: 1.3rem; box-shadow: 0 5px 18px rgba(0,0,0,.06);
}
.inv-ecard-date { display: inline-flex; flex-direction: column; line-height: 1; }
.inv-ecard-day { font-family: var(--inv-heading-font); font-size: 2.4rem; color: var(--inv-accent); }
.inv-ecard-mon { letter-spacing: .18em; text-transform: uppercase; font-size: .72rem; font-weight: 700; color: var(--inv-gold); }

/* ============ Recipe: Editorial Full-Bleed (floral - magazine spread) ============
   Alternating left/right rhythm, italic serif, borderless pull-quote
   cards with a thin accent rule instead of boxes. */
.inv-fhero {
  min-height: 92vh; position: relative; display: flex; align-items: flex-end;
  background: linear-gradient(150deg, color-mix(in srgb, var(--inv-accent) 75%, #000), var(--inv-accent));
  background-size: cover; background-position: center;
}
.inv-fhero-veil {
  position: absolute; inset: 0;
  background: linear-gradient(180deg, transparent 30%, rgba(20,10,10,.62) 100%);
}
.inv-fhero-inner { position: relative; padding-bottom: clamp(2.5rem, 8vw, 5rem); color: #fff; }
.inv-fhero .inv-kicker { color: #ffe9c9; }
.inv-ftitle {
  font-family: var(--inv-heading-font); font-style: italic;
  font-size: clamp(2.6rem, 9vw, 5.4rem); line-height: 1.05; color: #fff;
  text-shadow: 0 2px 24px rgba(0,0,0,.35);
}
.inv-fdate { letter-spacing: .22em; text-transform: uppercase; font-size: .85rem; color: #ffe9c9; }
.inv-fhero .inv-invite-line { color: #f6ebe0; }
.inv-r-editorial .inv-section:nth-of-type(even) .container { text-align: left; }
.inv-r-editorial .inv-section:nth-of-type(odd) .container { text-align: right; }
.inv-r-editorial .inv-section .row { text-align: initial; }
.inv-r-editorial .inv-heading { font-style: italic; text-align: center; }
.inv-r-editorial .inv-ornament { text-align: center; }
.inv-r-editorial .inv-honoree, .inv-r-editorial .inv-acc, .inv-r-editorial .inv-card, .inv-r-editorial .inv-note {
  background: none; box-shadow: none; border-radius: 0;
  border: none; border-left: 3px solid var(--inv-accent); padding-left: 1.2rem; text-align: left;
}
.inv-r-editorial .inv-note::before { display: none; }
.inv-r-editorial .inv-timeline .inv-event {
  background: none; box-shadow: none; border-radius: 0;
  border: none; border-left: 3px solid var(--inv-accent); padding-left: .75rem; text-align: left;
}
.inv-r-editorial .inv-timeline::before { display: none; }
.inv-r-editorial .inv-photo { border-radius: 2px; }

/* ============ Recipe: Journey Line (nature - a dotted path underfoot) ============
   The page-wide dotted trail continues into gold-topped waypoint cards
   and circular, organic photo crops. */
.inv-jhero { padding-top: 2rem; }
.inv-jbadge {
  width: 64px; height: 64px; margin: 0 auto; border-radius: 50%;
  display: flex; align-items: center; justify-content: center; font-size: 1.6rem;
  background: var(--inv-accent); color: #fff; box-shadow: 0 8px 24px -8px var(--inv-accent);
}
.inv-jstart { font-size: 1.5rem; color: var(--inv-gold); animation: inv-bob 1.6s ease-in-out infinite; }
@keyframes inv-bob { 50% { transform: translateY(6px); } }
.inv-r-journey .inv-section { position: relative; }
.inv-r-journey .inv-section::before {
  content: ''; position: absolute; left: 50%; top: 0; bottom: 0; width: 0;
  border-left: 3px dotted color-mix(in srgb, var(--inv-gold) 55%, transparent);
  transform: translateX(-50%); z-index: 0;
}
.inv-r-journey .inv-section .container { position: relative; z-index: 1; }
.inv-r-journey .inv-honoree, .inv-r-journey .inv-acc, .inv-r-journey .inv-card, .inv-r-journey .inv-note {
  border-top: 4px solid var(--inv-gold); border-radius: 4px 4px 14px 14px;
}
.inv-r-journey .inv-timeline .inv-event { border-top: 4px solid var(--inv-gold); border-radius: 4px 4px 14px 14px; }
.inv-r-journey .inv-photo { border-radius: 50%; }
.inv-jpath { position: relative; }
.inv-jstop { display: flex; gap: 1rem; margin-bottom: 1.4rem; align-items: flex-start; }
.inv-jstop-right { flex-direction: row-reverse; text-align: right; }
.inv-jdot {
  flex: 0 0 44px; width: 44px; height: 44px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  background: var(--inv-gold); color: #fff; font-weight: 800; font-size: 1.1rem;
  box-shadow: 0 0 0 5px color-mix(in srgb, var(--inv-gold) 25%, transparent);
}
.inv-jcard {
  flex: 1; background: #fff; border-radius: 14px; padding: 1rem 1.2rem;
  border: 1px solid rgba(0,0,0,.05); box-shadow: 0 5px 16px rgba(0,0,0,.06);
}

/* ============ Recipe: Card Stack (festive - scattered polaroids & tape) ============
   Cards scatter into a loose, tactile stack - alternating tilt per
   section, a highlighter-style heading, washi-tape hero accents. */
.inv-shero { padding: 2.5rem 0 1rem; }
.inv-shero .container { position: relative; max-width: 640px; }
.inv-scard {
  background: #fff; border-radius: 18px; padding: clamp(1.8rem, 5vw, 3rem);
  box-shadow: 0 16px 40px -16px rgba(0,0,0,.25);
}
.inv-scard-back {
  position: absolute; inset: 12px -6px -12px 18px; z-index: 0; padding: 0;
  transform: rotate(2.5deg);
  background: color-mix(in srgb, var(--inv-gold) 30%, #fff);
}
.inv-scard-main { position: relative; z-index: 1; transform: rotate(-1.2deg); }
.inv-stape {
  position: absolute; top: -12px; left: 50%; transform: translateX(-50%) rotate(-3deg);
  width: 110px; height: 26px; background: color-mix(in srgb, var(--inv-gold) 45%, #fff);
  opacity: .85; border-radius: 2px;
}
.inv-r-stack .inv-card, .inv-r-stack .inv-note, .inv-r-stack .inv-ecard,
.inv-r-stack .inv-honoree, .inv-r-stack .inv-acc {
  border-radius: 16px;
}
.inv-r-stack .inv-section:nth-of-type(odd) .inv-ecard,
.inv-r-stack .inv-section:nth-of-type(odd) .inv-honoree { transform: rotate(-.8deg); }
.inv-r-stack .inv-section:nth-of-type(even) .inv-ecard,
.inv-r-stack .inv-section:nth-of-type(even) .inv-honoree { transform: rotate(.8deg); }
.inv-r-stack .inv-heading {
  display: inline-block; background: color-mix(in srgb, var(--inv-gold) 25%, #fff);
  padding: .1rem .8rem; border-radius: 4px; transform: rotate(-1deg);
}
.inv-r-stack .inv-ornament { transform: rotate(1deg); }
.inv-polaroid {
  display: inline-flex; flex-direction: column; gap: .35rem; padding: .6rem .6rem 1rem;
  background: #fff; box-shadow: 0 8px 22px rgba(0,0,0,.14);
  transform: rotate(var(--tilt, 0deg)); transition: transform .18s ease;
  text-decoration: none; color: var(--inv-text);
}
.inv-polaroid:hover { transform: rotate(0deg) scale(1.04); }
.inv-polaroid img { width: 150px; height: 150px; object-fit: cover; }

/* ============ Recipe: Split Panel (jewellery - framed, faceted, fixed rail) ============
   A jewel-tone banner up top on mobile; double-bordered "framed jewel"
   cards with corner brackets throughout; the fixed sidebar is a desktop bonus. */
.inv-sppanel {
  position: relative; min-height: 62vh; display: flex; align-items: center; justify-content: center;
  background: linear-gradient(160deg, color-mix(in srgb, var(--inv-accent) 80%, #000), var(--inv-accent));
  background-size: cover; background-position: center;
}
.inv-sppanel-veil { position: absolute; inset: 0; background: rgba(24,12,16,.45); }
.inv-sppanel-inner { position: relative; color: #fff; padding: 3rem 1.5rem; }
.inv-spmono {
  font-family: var(--inv-heading-font); font-size: 2.2rem; letter-spacing: .12em;
  color: var(--inv-gold);
}
.inv-sptitle { font-family: var(--inv-heading-font); font-size: clamp(2.2rem, 6vw, 3.4rem); color: #fff; }
.inv-sppanel .inv-kicker { color: #ffe9c9; }
.inv-sppanel .inv-invite-line, .inv-sppanel .inv-date { color: #f6ebe0; }
.inv-r-split .inv-alt { background-color: color-mix(in srgb, var(--inv-accent) 10%, var(--inv-alt-bg)); }
.inv-r-split .inv-honoree, .inv-r-split .inv-acc, .inv-r-split .inv-card, .inv-r-split .inv-note {
  border-radius: 4px; border: 2px solid color-mix(in srgb, var(--inv-gold) 55%, transparent);
  outline: 1px solid color-mix(in srgb, var(--inv-gold) 30%, transparent); outline-offset: 4px;
  position: relative;
}
.inv-r-split .inv-honoree::before, .inv-r-split .inv-honoree::after {
  content: ''; position: absolute; top: 6px; width: 14px; height: 14px;
  border-top: 2px solid var(--inv-gold);
}
.inv-r-split .inv-honoree::before { left: 6px; border-left: 2px solid var(--inv-gold); }
.inv-r-split .inv-honoree::after { right: 6px; border-right: 2px solid var(--inv-gold); }
.inv-r-split .inv-photo { border-radius: 6px; border: 2px solid color-mix(in srgb, var(--inv-gold) 55%, transparent); box-shadow: none; }
.inv-r-split .inv-heading { letter-spacing: .04em; }
@media (min-width: 1100px) {
  .inv-r-split .inv-sphero { position: fixed; top: 0; left: 0; bottom: 0; width: 42%; z-index: 10; }
  .inv-r-split .inv-sppanel { height: 100%; min-height: 100vh; }
  .inv-r-split .inv-section, .inv-r-split .inv-footer { margin-left: 42%; }
  .inv-r-split .inv-fab { left: 42%; }
}

/* ============ Recipe: Scroll Story (jewellery override - cinematic full-bleed) ============
   Every section fills the viewport; cards dissolve into borderless,
   full-bleed text blocks for an immersive, edge-to-edge feel. */
.inv-cshero { min-height: 96vh; display: flex; align-items: center; }
.inv-cs-line { letter-spacing: .34em; text-transform: uppercase; font-size: .75rem; font-weight: 700; color: var(--inv-gold); }
.inv-cs-title { font-size: clamp(2.6rem, 9vw, 5rem); }
.inv-r-scrollstory .inv-section { min-height: 82vh; display: flex; align-items: center; }
.inv-r-scrollstory .inv-section > .container { width: 100%; }
.inv-r-scrollstory .inv-section, .inv-r-scrollstory .inv-cshero { animation: inv-fadein 1s ease both; }
@keyframes inv-fadein { from { opacity: .25; transform: translateY(18px); } to { opacity: 1; transform: none; } }
.inv-r-scrollstory .inv-honoree, .inv-r-scrollstory .inv-acc, .inv-r-scrollstory .inv-card, .inv-r-scrollstory .inv-note {
  background: none; box-shadow: none; border: none; border-radius: 0;
}
.inv-r-scrollstory .inv-heading { font-size: clamp(2rem, 6vw, 3rem); }
.inv-r-scrollstory .inv-timeline .inv-event { background: none; box-shadow: none; border: none; padding: .6rem 1.3rem; }
.inv-r-scrollstory .inv-erule-sep { border-bottom: 1px solid color-mix(in srgb, var(--inv-accent) 20%, transparent); }
.inv-r-scrollstory .inv-erule-meta { font-size: 1rem; line-height: 1.9; }
.inv-r-scrollstory .inv-photo { border-radius: 0; box-shadow: none; aspect-ratio: 4 / 3; }

/* ============ Recipe: Bento Mosaic (playful app-tile grid) ============
   The hero's grid of tiles continues site-wide: bold rounded-square
   cards, a pill-badge heading, generous colourful shadow. */
.inv-bghero { padding: 1.5rem 0 .5rem; }
.inv-bento { display: grid; gap: .8rem; grid-template-columns: repeat(2, 1fr); }
.inv-btile { border-radius: 18px; padding: 1.4rem; background: #fff; box-shadow: 0 8px 24px rgba(0,0,0,.07); }
.inv-btile-name { grid-column: span 2; background: var(--inv-accent); color: #fff; }
.inv-btile-name .inv-kicker { color: #ffe9c9; }
.inv-btile-title { font-family: var(--inv-heading-font); font-size: clamp(1.7rem, 5vw, 2.6rem); color: #fff; }
.inv-btile-photo { background-size: cover; background-position: center; min-height: 140px; padding: 0; }
.inv-btile-date { text-align: center; }
.inv-btile-cta {
  display: flex; align-items: center; justify-content: center;
  background: var(--inv-gold); color: var(--inv-gold-fg, #fff); font-weight: 800; font-size: 1.15rem;
  text-decoration: none;
}
.inv-btile-cta:hover { filter: brightness(.94); }
.inv-r-bento .inv-heading {
  display: inline-block; padding: .2rem .9rem; border-radius: 50rem;
  background: color-mix(in srgb, var(--inv-gold) 20%, transparent);
}
.inv-r-bento .inv-honoree, .inv-r-bento .inv-acc, .inv-r-bento .inv-card, .inv-r-bento .inv-note {
  border-radius: 20px; border: none; box-shadow: 0 8px 20px rgba(0,0,0,.08);
}
.inv-r-bento .inv-ecard { border-radius: 20px; }
.inv-r-bento .inv-photo { border-radius: 20px; }
.inv-r-bento .inv-btn { border-radius: 14px; }
@media (min-width: 768px) { .inv-bento { grid-template-columns: repeat(4, 1fr); } }

/* ============ Recipe: Muhurtham Card (traditional printed invite, digitised) ============
   Turmeric/kumkum corner smears frame a formal card; the couple render as a
   plain text roster ("X and Y") instead of cards, matching a real invite. */
.inv-muhero { padding: 2.4rem 0 1.6rem; }
.inv-mucard {
  max-width: 440px; margin: 0 auto; position: relative;
  border: 1.5px solid color-mix(in srgb, var(--inv-gold) 55%, transparent);
  outline: 1px solid color-mix(in srgb, var(--inv-gold) 30%, transparent); outline-offset: 6px;
  padding: clamp(1.8rem, 6vw, 2.8rem) clamp(1.2rem, 5vw, 2rem);
  background: color-mix(in srgb, #fff 70%, var(--inv-bg));
}
.inv-mucorner {
  position: absolute; top: -8px; width: 46px; height: 38px; opacity: .8;
  border-radius: 55% 45% 60% 40%/50% 60% 40% 50%;
  background: radial-gradient(ellipse at 30% 30%, var(--inv-gold), transparent 72%);
}
.inv-mucorner-tl { left: -8px; }
.inv-mucorner-tr {
  right: -8px; transform: scaleX(-1);
  background: radial-gradient(ellipse at 30% 30%, var(--inv-accent), transparent 72%);
}
.inv-mubless { font-size: .78rem; letter-spacing: .04em; opacity: .8; margin-bottom: .6rem; }
.inv-mutitle { font-family: var(--inv-heading-font); font-size: clamp(1.7rem, 7vw, 2.5rem); color: var(--inv-accent); line-height: 1.25; }
.inv-muweds { display: block; font-size: .55em; font-style: italic; color: var(--inv-gold); margin: .2rem 0; }
.inv-mubox {
  display: inline-block; margin-top: 1.1rem; padding: .7rem 1.3rem;
  border: 1.5px solid var(--inv-gold); background: color-mix(in srgb, var(--inv-gold) 12%, transparent);
}
.inv-mulabel { font-size: .62rem; letter-spacing: .2em; text-transform: uppercase; font-weight: 700; color: var(--inv-accent); }
.inv-mudot { width: 10px; height: 10px; border-radius: 50%; background: var(--inv-accent); margin: 1.2rem auto 0; }
.inv-r-muhurtham .inv-roster { max-width: 340px; margin: 0 auto; }
.inv-r-muhurtham .inv-roster-name { font-family: var(--inv-heading-font); font-size: 1.3rem; color: var(--inv-accent); }
.inv-r-muhurtham .inv-roster-role { color: var(--inv-gold); letter-spacing: .12em; text-transform: uppercase; font-weight: 700; margin-bottom: .8rem; }
.inv-r-muhurtham .inv-roster-sep { font-family: var(--inv-heading-font); font-style: italic; color: var(--inv-gold); margin: .3rem 0; }
.inv-r-muhurtham .inv-card, .inv-r-muhurtham .inv-note, .inv-r-muhurtham .inv-acc {
  border: 1px solid color-mix(in srgb, var(--inv-gold) 45%, transparent); box-shadow: none; border-radius: 6px;
}
.inv-r-muhurtham .inv-photo { border-radius: 4px; border: 1px solid color-mix(in srgb, var(--inv-gold) 45%, transparent); box-shadow: none; }
.inv-r-muhurtham .inv-erule-sep { border-bottom-color: color-mix(in srgb, var(--inv-gold) 55%, transparent); }
.inv-r-muhurtham .inv-footer { font-family: var(--inv-heading-font); }

/* ============ Recipe: Kanjivaram Zari (silk sari border) ============
   A woven zari border runs along the top of every section; the couple
   render as two full-width silk strips instead of cards. */
.inv-kvwrap {
  width: 100%; padding: 0 10px;
  background: linear-gradient(90deg, var(--inv-accent) 0 5px, var(--inv-gold) 5px 8px,
    color-mix(in srgb, var(--inv-gold) 60%, var(--inv-accent)) 8px 16px, var(--inv-gold) 16px 19px,
    var(--inv-accent) 19px 22px, transparent 22px);
}
.inv-kvsilk { padding: 1.6rem .5rem; }
.inv-kickicker { letter-spacing: .28em; font-size: .58rem; font-weight: 700; text-transform: uppercase; color: var(--inv-gold); }
.inv-kvtitle { font-family: var(--inv-heading-font); font-size: clamp(1.7rem, 7vw, 2.6rem); color: var(--inv-accent); margin-top: .5rem; }
.inv-kvdate { font-size: .82rem; letter-spacing: .1em; text-transform: uppercase; font-weight: 600; margin-top: .5rem; }
.inv-r-kanjivaram .inv-section { position: relative; }
.inv-r-kanjivaram .inv-section::before {
  content: ''; position: absolute; top: 0; left: 10px; right: 10px; height: 4px;
  background: repeating-linear-gradient(90deg, var(--inv-gold) 0 10px, var(--inv-accent) 10px 14px);
  opacity: .6;
}
.inv-silkwrap { display: flex; flex-direction: column; gap: .8rem; max-width: 420px; margin: 0 auto; }
.inv-silkstrip {
  padding: 1rem 1.3rem; color: #fff; text-align: left; border-left: 6px solid var(--inv-gold);
  background: linear-gradient(120deg, var(--inv-accent), color-mix(in srgb, var(--inv-accent) 60%, #000));
}
.inv-silkstrip:nth-child(even) {
  background: linear-gradient(120deg, color-mix(in srgb, var(--inv-gold) 55%, var(--inv-accent)), var(--inv-accent));
}
.inv-silkstrip b { font-family: var(--inv-heading-font); font-size: 1.15rem; display: block; }
.inv-silkstrip span { color: color-mix(in srgb, #fff 80%, var(--inv-gold)); font-size: .62rem; letter-spacing: .14em; text-transform: uppercase; font-weight: 700; }
.inv-r-kanjivaram .inv-timeline .inv-event { border-left: 5px solid var(--inv-gold); border-radius: 0 12px 12px 0; }
.inv-r-kanjivaram .inv-card, .inv-r-kanjivaram .inv-note, .inv-r-kanjivaram .inv-acc {
  border: 1.5px solid color-mix(in srgb, var(--inv-gold) 55%, transparent);
}
.inv-r-kanjivaram .inv-photo { border: 4px double var(--inv-gold); border-radius: 2px; box-shadow: none; }
.inv-r-kanjivaram .inv-footer {
  border-top: 4px solid transparent;
  border-image: repeating-linear-gradient(90deg, var(--inv-gold) 0 10px, var(--inv-accent) 10px 14px) 4;
}

/* ============ Recipe: Kuthuvilakku (brass lamp glow) ============
   A CSS-built five-flame brass lamp opens the page; every card picks up
   a soft brass glow instead of a plain shadow. */
.inv-vlhero { padding: 2.2rem 0 1rem; }
.inv-vlflames { display: flex; justify-content: center; gap: 10px; height: 34px; align-items: flex-end; }
.inv-vlflame {
  width: 10px; height: 26px; border-radius: 50% 50% 50% 50%/64% 64% 36% 36%;
  background: radial-gradient(circle at 50% 74%, #fff3c4 18%, var(--inv-gold) 58%, var(--inv-accent));
  box-shadow: 0 0 12px 3px color-mix(in srgb, var(--inv-gold) 55%, transparent);
  animation: inv-vlflicker 2.2s ease-in-out infinite;
}
.inv-vlflame:nth-child(2n) { animation-delay: .4s; height: 22px; }
.inv-vlflame:nth-child(3) { height: 32px; }
@keyframes inv-vlflicker { 0%, 100% { transform: scaleY(1); } 50% { transform: scaleY(.88) translateY(1px); } }
.inv-vlplate {
  width: 90px; height: 14px; margin: -2px auto 0; border-radius: 0 0 44px 44px;
  background: linear-gradient(var(--inv-gold), color-mix(in srgb, var(--inv-gold) 45%, #000));
}
.inv-vlstem {
  width: 12px; height: 20px; margin: 0 auto;
  background: linear-gradient(90deg, color-mix(in srgb, var(--inv-gold) 45%, #000), var(--inv-gold), color-mix(in srgb, var(--inv-gold) 45%, #000));
}
.inv-vlstem-lo { height: 26px; }
.inv-vldisc {
  width: 34px; height: 8px; margin: 0 auto; border-radius: 50%;
  background: linear-gradient(var(--inv-gold), color-mix(in srgb, var(--inv-gold) 45%, #000));
}
.inv-vlbase {
  width: 64px; height: 14px; margin: 0 auto; clip-path: polygon(14% 0, 86% 0, 100% 100%, 0 100%);
  background: linear-gradient(var(--inv-gold), color-mix(in srgb, var(--inv-gold) 40%, #000));
}
.inv-r-vilakku .inv-honoree {
  border-radius: 50%; padding: 1.6rem 1rem;
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--inv-gold) 55%, transparent), 0 0 22px 4px color-mix(in srgb, var(--inv-gold) 30%, transparent);
}
.inv-r-vilakku .inv-card, .inv-r-vilakku .inv-note, .inv-r-vilakku .inv-acc {
  border: 1px solid color-mix(in srgb, var(--inv-gold) 40%, transparent);
  box-shadow: 0 0 16px 2px color-mix(in srgb, var(--inv-gold) 18%, transparent);
}
.inv-r-vilakku .inv-photo { box-shadow: 0 0 14px 2px color-mix(in srgb, var(--inv-gold) 25%, transparent); }
.inv-r-vilakku .inv-erule-sep { border-bottom-style: dotted; border-bottom-color: color-mix(in srgb, var(--inv-gold) 55%, transparent); }

/* ============ Recipe: Stained Glass Union (leaded jewel-tone window) ============
   A pointed lancet window of coloured panes holds the names; the couple
   sit in their own small lancet panels instead of plain cards. */
.inv-glhero { padding: 2rem 0 .6rem; }
.inv-gllancet {
  max-width: 260px; margin: 0 auto; clip-path: polygon(50% 0, 96% 18%, 96% 100%, 4% 100%, 4% 18%);
  background: #151020; padding: 4px;
}
.inv-glcells { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 3px; }
.inv-glcells > * { min-height: 34px; }
.inv-glc1 { background: color-mix(in srgb, var(--inv-accent) 80%, #4b1a86); }
.inv-glc2 { background: color-mix(in srgb, var(--inv-gold) 75%, #a4750a); }
.inv-glc3 { background: color-mix(in srgb, var(--inv-accent) 60%, #124a2b); }
.inv-glc4 { background: color-mix(in srgb, var(--inv-gold) 55%, var(--inv-accent)); }
.inv-glc5 { background: color-mix(in srgb, var(--inv-accent) 40%, #12308f); }
.inv-glname { grid-column: span 3; background: #201830; color: #fff; text-align: center; padding: .9rem .6rem; }
.inv-glname .inv-kicker { color: color-mix(in srgb, var(--inv-gold) 70%, #fff); }
.inv-glname .inv-title, .inv-glname .inv-date { color: #fff; }
.inv-r-glass .inv-lancet {
  background: #fff; clip-path: polygon(50% 0, 94% 16%, 94% 100%, 6% 100%, 6% 16%);
  padding: 1.6rem 1rem .9rem; border: 2px solid color-mix(in srgb, var(--inv-accent) 45%, transparent);
}
.inv-r-glass .inv-lancet-name { font-family: var(--inv-heading-font); font-size: 1.15rem; color: var(--inv-accent); }
.inv-r-glass .inv-lancet-role { color: var(--inv-gold); letter-spacing: .1em; text-transform: uppercase; font-weight: 700; }
.inv-r-glass .inv-timeline .inv-event { border-left: 5px solid var(--inv-gold); }
.inv-r-glass .inv-card, .inv-r-glass .inv-note, .inv-r-glass .inv-acc { border-left: 5px solid var(--inv-accent); border-radius: 4px; }
.inv-r-glass .inv-photo { border-radius: 2px; }
.inv-r-glass .inv-footer { border-top: 2px double color-mix(in srgb, var(--inv-gold) 50%, transparent); }

/* ============ Recipe: Holy Hymnal (church order-of-service booklet) ============
   Laid out like a wedding service programme: bride and groom in facing
   columns, and the events become a dotted-leader order of service. */
.inv-hytop { border-bottom: 3px double var(--inv-accent); padding: 1.6rem 1rem 1.1rem; }
.inv-hycross { font-size: 1.3rem; color: var(--inv-gold); letter-spacing: .4em; }
.inv-hyorder { font-size: .6rem; letter-spacing: .3em; text-transform: uppercase; font-weight: 700; color: var(--inv-accent); margin-top: .5rem; }
.inv-hytitle { font-family: var(--inv-heading-font); font-size: clamp(1.7rem, 7vw, 2.4rem); margin-top: .5rem; }
.inv-hydate { font-size: .68rem; letter-spacing: .2em; text-transform: uppercase; margin-top: .3rem; }
.inv-hyverse {
  font-family: var(--inv-heading-font); font-style: italic; font-size: .92rem; line-height: 1.7;
  color: var(--inv-accent); max-width: 280px; margin: 1rem auto 0;
}
.inv-hyverseref { display: block; font-size: .68rem; font-style: normal; letter-spacing: .1em; text-transform: uppercase; color: var(--inv-gold); margin-top: .3rem; }
.inv-facing { display: flex; align-items: flex-start; gap: 1rem; }
.inv-facing-col { flex: 1; }
.inv-facing-name { font-family: var(--inv-heading-font); font-size: 1.1rem; }
.inv-facing-role { letter-spacing: .12em; text-transform: uppercase; color: var(--inv-gold); font-weight: 700; }
.inv-facing-div { width: 1px; align-self: stretch; background: color-mix(in srgb, var(--inv-accent) 40%, transparent); }
.inv-leader { padding: .5rem 0; }
.inv-leader-row { display: flex; align-items: baseline; gap: .4rem; flex-wrap: wrap; }
.inv-leader-dots { flex: 1; min-width: 20px; border-bottom: 2px dotted color-mix(in srgb, var(--inv-accent) 45%, transparent); position: relative; top: -4px; }
.inv-leader-venue { opacity: .8; }
.inv-r-hymnal .inv-section { padding: 2.4rem 0; }
.inv-r-hymnal .inv-ornament { display: none; }
.inv-r-hymnal .inv-heading { font-size: 1.35rem; letter-spacing: .1em; text-transform: uppercase; }
.inv-r-hymnal .inv-card, .inv-r-hymnal .inv-note, .inv-r-hymnal .inv-acc {
  border-radius: 2px; border: 1px solid color-mix(in srgb, var(--inv-accent) 30%, transparent); box-shadow: none;
}
.inv-r-hymnal .inv-photo { border-radius: 2px; box-shadow: none; }
.inv-r-hymnal .inv-btn { border-radius: 2px; letter-spacing: .1em; text-transform: uppercase; font-size: .82rem; }
.inv-r-hymnal .inv-footer { font-family: var(--inv-heading-font); letter-spacing: .06em; }

/* ============ Recipe: Thaali Thread (one unbroken gold thread) ============
   A single gold thread runs the length of the page; every event dot along
   the default timeline becomes a small irregular knot tied onto it. */
.inv-thpend {
  width: 30px; height: 30px; margin: 1.6rem auto 0; position: relative;
  background: linear-gradient(140deg, var(--inv-gold), color-mix(in srgb, var(--inv-gold) 55%, #000));
  clip-path: polygon(50% 0, 100% 38%, 82% 100%, 18% 100%, 0 38%);
  box-shadow: 0 4px 10px rgba(0,0,0,.25);
}
.inv-thpend-tip {
  position: absolute; left: 50%; bottom: -14px; width: 3px; height: 16px; transform: translateX(-50%);
  background: linear-gradient(var(--inv-gold), transparent);
}
.inv-r-thaali .inv-section { position: relative; }
.inv-r-thaali .inv-section::before {
  content: ''; position: absolute; left: 50%; top: 0; bottom: 0; width: 2px;
  background: linear-gradient(var(--inv-gold), color-mix(in srgb, var(--inv-gold) 40%, transparent));
  transform: translateX(-50%); opacity: .55; z-index: 0;
}
.inv-r-thaali .inv-section > .container { position: relative; z-index: 1; }
.inv-r-thaali .inv-timeline .inv-event::before {
  border-radius: 40% 60% 60% 40%/50% 50% 50% 50%; width: 16px; height: 16px;
}
.inv-r-thaali .inv-honoree, .inv-r-thaali .inv-acc, .inv-r-thaali .inv-card, .inv-r-thaali .inv-note {
  border-top: 3px solid var(--inv-gold); border-radius: 6px 6px 14px 14px;
}
.inv-r-thaali .inv-photo { border-radius: 50%; }

/* ============ Recipe: Malligai Jasmine (jasmine strings both edges) ============
   Strings of jasmine buds run down the page on both sides at every width
   (not a desktop-only flourish); cards get a beaded jasmine top edge. */
.inv-mlveni {
  width: 200px; height: 200px; margin: 1.6rem auto .5rem; border-radius: 50%;
  border: 9px dotted #fff; box-shadow: 0 0 0 3px color-mix(in srgb, var(--inv-gold) 35%, transparent), 0 10px 30px -12px rgba(0,0,0,.3);
  display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 1rem;
  background: color-mix(in srgb, #fff 12%, var(--inv-bg));
}
.inv-r-malligai::before, .inv-r-malligai::after {
  content: ''; position: fixed; top: 0; bottom: 0; width: 10px; z-index: 5; pointer-events: none;
  background: radial-gradient(circle at 5px 7px, #fff 4px, transparent 4.6px);
  background-size: 10px 13px; opacity: .8;
}
.inv-r-malligai::before { left: 4px; }
.inv-r-malligai::after { right: 4px; }
.inv-r-malligai .inv-honoree, .inv-r-malligai .inv-acc, .inv-r-malligai .inv-card, .inv-r-malligai .inv-note {
  border-top: 8px solid transparent;
  border-image: radial-gradient(circle at 6px 4px, #fff 3.5px, transparent 4px) 8;
  border-image-width: 8px 0 0 0;
}
.inv-r-malligai .inv-photo { border-radius: 50%; }

/* ============ Recipe: Elai Sappadu (the banana-leaf feast) ============
   A green leaf wash and a central midrib line run through every section,
   echoing the leaf the whole page is styled after. */
.inv-elhero { padding: 2.6rem 0; background: radial-gradient(ellipse at 50% -10%, color-mix(in srgb, #2f8f3e 22%, transparent), transparent 60%); }
.inv-eltitle { text-shadow: 0 2px 10px rgba(0,0,0,.1); }
.inv-r-elai .inv-alt { background-color: color-mix(in srgb, #2f8f3e 12%, var(--inv-alt-bg)); }
.inv-r-elai .inv-section { position: relative; }
.inv-r-elai .inv-section::before {
  content: ''; position: absolute; left: 50%; top: 10%; bottom: 10%; width: 2px;
  background: color-mix(in srgb, #2f8f3e 45%, transparent); transform: translateX(-50%); opacity: .35; z-index: 0;
}
.inv-r-elai .inv-section > .container { position: relative; z-index: 1; }
.inv-r-elai .inv-honoree, .inv-r-elai .inv-acc, .inv-r-elai .inv-card, .inv-r-elai .inv-note {
  border-radius: 60% 8px 60% 8px/8px 60% 8px 60%;
  border-color: color-mix(in srgb, #2f8f3e 30%, transparent);
}
.inv-r-elai .inv-photo { border-radius: 50% 8px 50% 8px/8px 50% 8px 50%; }
.inv-r-elai .inv-timeline .inv-event { border-radius: 60% 8px 60% 8px/8px 60% 8px 60%; }

/* ============ Recipe: Minnu Kasavu (Kerala tradition - kasavu gold) ============
   A woven kasavu-gold rule frames every section like the border of the
   wedding saree; the hero carries a heart-shaped minnu pendant. */
.inv-mnheart { width: 46px; height: 40px; position: relative; margin: 1.8rem auto 0; filter: drop-shadow(0 4px 8px rgba(0,0,0,.2)); }
.inv-mnheart::before, .inv-mnheart::after {
  content: ''; position: absolute; top: 0; width: 24px; height: 36px; border-radius: 24px 24px 0 0;
  background: linear-gradient(140deg, var(--inv-gold), color-mix(in srgb, var(--inv-gold) 55%, #000));
}
.inv-mnheart::before { left: 0; transform: rotate(-45deg); transform-origin: 100% 100%; }
.inv-mnheart::after { right: 0; transform: rotate(45deg); transform-origin: 0 100%; }
.inv-r-minnu .inv-section { position: relative; }
.inv-r-minnu .inv-section::before {
  content: ''; position: absolute; top: 0; left: 0; right: 0; height: 4px;
  background: repeating-linear-gradient(90deg, var(--inv-gold) 0 20px, color-mix(in srgb, var(--inv-gold) 55%, transparent) 20px 26px);
  opacity: .7;
}
.inv-r-minnu .inv-honoree, .inv-r-minnu .inv-acc, .inv-r-minnu .inv-card, .inv-r-minnu .inv-note {
  border-bottom: 6px solid var(--inv-gold); border-radius: 4px;
}
.inv-r-minnu .inv-photo { border-bottom: 5px solid var(--inv-gold); border-radius: 2px; box-shadow: none; }

/* ============ Recipe: Jaimala Exchange (crossing garland arcs) ============
   Two dashed garland arcs cross behind the hero title; every card and
   event picks up an arch-topped echo of the exchanged garlands. */
.inv-jmarcs { position: relative; height: 90px; margin: 1.6rem auto -30px; max-width: 220px; }
.inv-jmarc {
  position: absolute; top: 0; width: 150px; height: 150px; border-radius: 50%;
  border: 7px dashed color-mix(in srgb, var(--inv-gold) 70%, transparent);
}
.inv-jmarc-l { left: -10px; border-color: color-mix(in srgb, var(--inv-accent) 60%, var(--inv-gold)); transform: rotate(30deg); }
.inv-jmarc-r { right: -10px; transform: rotate(-30deg); }
.inv-r-jaimala .inv-honoree, .inv-r-jaimala .inv-acc, .inv-r-jaimala .inv-card, .inv-r-jaimala .inv-note {
  border-radius: 60px 60px 12px 12px; border-top: 3px dashed color-mix(in srgb, var(--inv-gold) 65%, transparent);
}
.inv-r-jaimala .inv-timeline .inv-event { border-radius: 30px 30px 12px 12px; }
.inv-r-jaimala .inv-photo { border-radius: 50%; }

/* ============ Recipe: Manavarai Mandap (the wedding canopy) ============
   The hero is the canopy itself - draped valance, ringed pillars, banana
   leaves at the base; every section carries a mini scalloped valance. */
.inv-mdcanopy { position: relative; width: 100%; padding-top: 1.6rem; }
.inv-mdpillar {
  position: absolute; top: 26px; bottom: 0; width: 14px;
  background: repeating-linear-gradient(var(--inv-gold) 0 12px, color-mix(in srgb, var(--inv-gold) 45%, #000) 12px 16px);
  border-radius: 7px;
}
.inv-mdpillar-l { left: 6%; } .inv-mdpillar-r { right: 6%; }
.inv-mdleaf { position: absolute; bottom: -6px; width: 24px; height: 38px; background: #2e7d4f; border-radius: 0 100% 0 100%; opacity: .85; }
.inv-mdleaf-l { left: -7px; transform: rotate(-16deg); }
.inv-mdleaf-r { right: -7px; transform: rotate(16deg) scaleX(-1); }
.inv-mdvalance { height: 22px; background: var(--inv-accent); border-radius: 0 0 4px 4px; position: relative; }
.inv-mdvalance::after {
  content: ''; position: absolute; left: 0; right: 0; bottom: -8px; height: 8px;
  background: radial-gradient(circle at 8px 0, transparent 7px, var(--inv-gold) 7.5px 9px, transparent 9.5px);
  background-size: 16px 8px; background-repeat: repeat-x;
}
.inv-r-mandap .inv-section { position: relative; }
.inv-r-mandap .inv-section::before {
  content: ''; position: absolute; top: 0; left: 20%; right: 20%; height: 6px;
  background: radial-gradient(circle at 8px 0, transparent 6px, var(--inv-gold) 6.5px 8px, transparent 8.5px);
  background-size: 16px 6px; background-repeat: repeat-x; opacity: .6;
}
.inv-r-mandap .inv-honoree, .inv-r-mandap .inv-acc, .inv-r-mandap .inv-card, .inv-r-mandap .inv-note {
  border-top: 4px solid var(--inv-gold); border-radius: 4px 4px 16px 16px;
}
.inv-r-mandap .inv-timeline .inv-event { border-top: 4px solid var(--inv-gold); border-radius: 4px 4px 16px 16px; }
.inv-r-mandap .inv-photo { border-radius: 4px 4px 16px 16px; }

/* ============ Recipe: Getti Melam (nadaswaram and thavil drums) ============
   A CSS thavil drum and equaliser beat-bars open the page; every card
   picks up a small drum-beat accent instead of a plain edge. */
.inv-medrum {
  width: 108px; height: 64px; margin: 1.6rem auto 0; border-radius: 14px; position: relative; overflow: hidden;
  background: linear-gradient(var(--inv-gold), color-mix(in srgb, var(--inv-gold) 45%, #000));
  border: 3px solid color-mix(in srgb, var(--inv-gold) 70%, #000);
}
.inv-medrum::before, .inv-medrum::after {
  content: ''; position: absolute; inset: -8px;
  background: repeating-linear-gradient(58deg, transparent 0 10px, rgba(0,0,0,.35) 10px 12px);
}
.inv-medrum::after { background: repeating-linear-gradient(-58deg, transparent 0 10px, rgba(0,0,0,.35) 10px 12px); }
.inv-mebeat { display: flex; align-items: flex-end; justify-content: center; gap: 4px; height: 34px; margin: .7rem 0; }
.inv-mebeat span { width: 7px; border-radius: 3px 3px 0 0; background: linear-gradient(var(--inv-gold), color-mix(in srgb, var(--inv-gold) 40%, #000)); }
.inv-r-melam .inv-honoree, .inv-r-melam .inv-acc, .inv-r-melam .inv-card, .inv-r-melam .inv-note {
  border-left: 6px solid var(--inv-gold); border-radius: 4px;
}
.inv-r-melam .inv-timeline .inv-event { border-left: 6px solid var(--inv-gold); }
.inv-r-melam .inv-photo { border-radius: 10px; box-shadow: 0 0 0 3px color-mix(in srgb, var(--inv-gold) 35%, transparent); }

/* ============ Recipe: Saptapadi Steps (seven vows around the fire) ============
   A three-flame agni opens the page; the default timeline's dots become
   numbered stepping stones counting the seven vows. */
.inv-spagni { display: flex; justify-content: center; align-items: flex-end; gap: 6px; height: 60px; }
.inv-spflame {
  border-radius: 50% 50% 50% 50%/64% 64% 36% 36%;
  background: radial-gradient(circle at 50% 74%, #fff3c4 18%, var(--inv-gold) 58%, var(--inv-accent));
  box-shadow: 0 0 12px 3px color-mix(in srgb, var(--inv-gold) 45%, transparent);
}
.inv-spflame-1 { width: 12px; height: 34px; } .inv-spflame-2 { width: 16px; height: 50px; } .inv-spflame-3 { width: 12px; height: 40px; }
.inv-r-saptapadi .inv-timeline { counter-reset: inv-step; }
.inv-r-saptapadi .inv-timeline .inv-event::before {
  counter-increment: inv-step; content: counter(inv-step);
  width: 30px; height: 30px; border-radius: 50%; background: var(--inv-gold);
  color: #fff; font-weight: 800; font-size: .95rem; display: flex; align-items: center; justify-content: center;
  left: -42px; box-shadow: none;
}
.inv-r-saptapadi .inv-honoree, .inv-r-saptapadi .inv-acc, .inv-r-saptapadi .inv-card, .inv-r-saptapadi .inv-note {
  border-radius: 50% 50% 14px 14px/40% 40% 14px 14px; border-top: 3px solid var(--inv-gold);
}
.inv-r-saptapadi .inv-photo { border-radius: 50%; }

/* ============ Recipe: Haldi Utsav (turmeric joy) ============
   An organic turmeric-yellow blob holds the hero; cards scatter with a
   playful tilt and irregular, sunlit edges. */
.inv-hdblob {
  background: radial-gradient(circle at 32% 30%, color-mix(in srgb, var(--inv-gold) 70%, #ffd23f), var(--inv-gold) 65%, color-mix(in srgb, var(--inv-gold) 60%, #000));
  border-radius: 58% 42% 55% 45%/50% 62% 38% 50%;
  padding: clamp(1.8rem, 6vw, 2.6rem) clamp(1.2rem, 5vw, 2rem);
  max-width: 340px; margin: 1.2rem auto 0; transform: rotate(-1.5deg);
  box-shadow: 0 16px 34px -14px color-mix(in srgb, var(--inv-gold) 55%, transparent);
}
.inv-hdblob .inv-title, .inv-hdblob .inv-kicker, .inv-hdblob .inv-date { color: #4a3000; }
.inv-r-haldi .inv-honoree, .inv-r-haldi .inv-acc, .inv-r-haldi .inv-card, .inv-r-haldi .inv-note {
  border-radius: 55% 45% 60% 40%/45% 55% 45% 55%; border: 2px solid var(--inv-gold);
}
.inv-r-haldi .inv-section:nth-of-type(odd) .inv-honoree,
.inv-r-haldi .inv-section:nth-of-type(odd) .inv-ecard { transform: rotate(-1deg); }
.inv-r-haldi .inv-section:nth-of-type(even) .inv-honoree,
.inv-r-haldi .inv-section:nth-of-type(even) .inv-ecard { transform: rotate(1deg); }
.inv-r-haldi .inv-photo { border-radius: 55% 45% 50% 50%/50% 55% 45% 50%; border: 3px solid var(--inv-gold); }

/* ============ Recipe: Kalash Aashirwad (blessings open the page) ============
   A copper kalash - coconut, mango leaves and all - holds the couple's
   names; the recipe reorders sections so elders' blessings come first. */
.inv-klset { position: relative; max-width: 190px; margin: 1.8rem auto 0; }
.inv-klcoco { width: 40px; height: 36px; margin: 0 auto -6px; border-radius: 50% 50% 46% 54%; background: radial-gradient(circle at 35% 30%, #8a5a3a, #5e3a20); position: relative; z-index: 2; }
.inv-klleaves { display: flex; justify-content: center; gap: 2px; margin-bottom: -12px; }
.inv-klleaves span { width: 15px; height: 34px; background: #2e7d4f; border-radius: 0 100% 0 100%; }
.inv-klleaves span:nth-child(odd) { transform: rotate(-24deg); }
.inv-klleaves span:nth-child(even) { transform: rotate(24deg) scaleX(-1); }
.inv-klpot {
  background: radial-gradient(circle at 32% 26%, var(--inv-gold), var(--inv-accent) 70%, color-mix(in srgb, var(--inv-accent) 60%, #000));
  border-radius: 24% 24% 50% 50%/20% 20% 62% 62%; padding: 1.6rem 1rem 2rem; position: relative;
}
.inv-klpot::before { content: ''; position: absolute; left: 10%; right: 10%; top: -7px; height: 14px; border-radius: 50%; background: color-mix(in srgb, var(--inv-accent) 60%, #000); }
.inv-klpot .inv-title, .inv-klpot .inv-kicker, .inv-klpot .inv-date { color: #fff; }
.inv-klpot .inv-title { overflow-wrap: break-word; }
.inv-klpot .inv-title.inv-klname-long { font-size: 1.5rem; line-height: 1.2; }
.inv-r-kalash #wishes .inv-heading { font-size: clamp(1.8rem, 6vw, 2.4rem); }
.inv-r-kalash .inv-note {
  border: 1.5px solid color-mix(in srgb, var(--inv-gold) 45%, transparent); border-top: 4px solid var(--inv-gold); border-radius: 4px 4px 14px 14px;
}
.inv-r-kalash .inv-honoree, .inv-r-kalash .inv-acc, .inv-r-kalash .inv-card {
  border-top: 4px solid var(--inv-gold); border-radius: 4px 4px 14px 14px;
}
.inv-r-kalash .inv-photo { border-radius: 4px 4px 14px 14px; }

/* ============ Recipe: Kolam Dawn (Tamil dot-grid kolam) ============
   A fine rice-flour dot grid covers the whole page; cards become
   rotated diamonds echoing a kolam's geometric lines. */
.inv-komed {
  width: 220px; height: 220px; margin: 0 auto; border-radius: 50%; border: 2px dotted var(--inv-accent);
  display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 1rem; position: relative;
}
.inv-komed::before { content: ''; position: absolute; inset: 12px; border: 1.5px dotted color-mix(in srgb, var(--inv-accent) 55%, transparent); border-radius: 50%; }
.inv-kodots { color: var(--inv-accent); letter-spacing: .5em; font-size: .6rem; margin-top: .6rem; }
.invite.inv-r-kolam { background-image: radial-gradient(circle, color-mix(in srgb, var(--inv-accent) 18%, transparent) 1.4px, transparent 2px); background-size: 20px 20px; }
.inv-r-kolam .inv-honoree, .inv-r-kolam .inv-acc, .inv-r-kolam .inv-card, .inv-r-kolam .inv-note {
  border: 2px dotted var(--inv-accent); border-radius: 4px;
}
.inv-r-kolam .inv-photo { border-radius: 4px; transform: rotate(45deg) scale(.82); }
.inv-r-kolam .inv-timeline .inv-event::before { border-radius: 2px; transform: rotate(45deg); width: 11px; height: 11px; }

/* ============ Recipe: Toran Doorway (mango leaves and marigold) ============
   A leaf-and-marigold toran crowns the page; the couple's events sit on
   alternating leaf-shaped cards rather than plain rectangles. */
.inv-toleaves { height: 16px; background: conic-gradient(from 135deg at 50% 0, var(--inv-accent) 90deg, transparent 0); background-size: 20px 16px; background-repeat: repeat-x; }
.inv-tostrings { display: flex; justify-content: space-between; padding: 0 16px; margin-top: -2px; height: 52px; }
.inv-tostrings span { width: 6px; display: block; background: radial-gradient(circle at 3px 4.5px, var(--inv-gold) 2.6px, transparent 3.2px); background-size: 6px 9px; background-repeat: repeat-y; }
.inv-r-toran .inv-honoree, .inv-r-toran .inv-acc, .inv-r-toran .inv-card, .inv-r-toran .inv-note {
  background: color-mix(in srgb, var(--inv-accent) 6%, #fff); border: 1.5px solid color-mix(in srgb, var(--inv-accent) 30%, transparent);
}
.inv-r-toran .inv-ecard:nth-of-type(odd) { border-radius: 28px 4px 28px 4px; }
.inv-r-toran .inv-ecard:nth-of-type(even) { border-radius: 4px 28px 4px 28px; }
.inv-r-toran .inv-photo { border-radius: 50%; border: 3px solid var(--inv-gold); }

/* ============ Recipe: Peacock Court (teal, royal blue and gold) ============
   A feather fan crowns the oval hero; cards echo a feather's eye with a
   pair of gold-and-blue dots beside every heading. */
.inv-pcfan {
  width: 230px; height: 115px; margin: 1.6rem auto -28px; border-radius: 140px 140px 0 0; opacity: .9;
  background: repeating-conic-gradient(from -90deg at 50% 100%, var(--inv-accent) 0 9deg, var(--inv-gold) 9deg 11deg, color-mix(in srgb, var(--inv-accent) 60%, #1a3c8f) 11deg 20deg, var(--inv-gold) 20deg 22deg);
}
.inv-pcoval {
  width: 90%; max-width: 260px; margin: 0 auto; background: color-mix(in srgb, #fff 55%, var(--inv-bg));
  border-radius: 50%; padding: 2rem 1.2rem; border: 2px solid var(--inv-accent);
  box-shadow: 0 10px 26px -12px color-mix(in srgb, var(--inv-accent) 45%, transparent); position: relative;
}
.inv-r-peacock .inv-heading { display: flex; align-items: center; justify-content: center; gap: .6rem; }
.inv-r-peacock .inv-heading::before, .inv-r-peacock .inv-heading::after {
  content: ''; width: 13px; height: 13px; border-radius: 50%;
  background: radial-gradient(circle, var(--inv-accent) 3px, var(--inv-gold) 3px 5px, color-mix(in srgb, var(--inv-accent) 60%, #1a3c8f) 5px);
}
.inv-r-peacock .inv-honoree, .inv-r-peacock .inv-note { border-radius: 50%/58% 58% 42% 42%; border: 3px solid var(--inv-gold); }
.inv-r-peacock .inv-acc, .inv-r-peacock .inv-card { border-radius: 50rem; }
.inv-r-peacock .inv-photo { border-radius: 50%/58% 58% 42% 42%; border: 2px solid var(--inv-accent); }

/* ============ Recipe: Jharokha Palace (Rajasthani sandstone) ============
   An arched palace-window hero with a stone ledge; cards borrow the same
   ledged-arch shape instead of a plain rounded rectangle. */
.inv-jhwin {
  width: 92%; max-width: 260px; margin: 1.4rem auto 0; background: color-mix(in srgb, #fff 60%, var(--inv-bg));
  border: 3px solid var(--inv-accent); border-radius: 130px 130px 0 0; padding: 2.2rem 1rem 1.1rem; position: relative;
  box-shadow: 0 0 0 6px var(--inv-gold), 0 0 0 9px var(--inv-accent);
}
.inv-jhwin::after { content: ''; position: absolute; left: -15px; right: -15px; bottom: -13px; height: 13px; background: var(--inv-accent); border-radius: 3px; }
.inv-r-jharokha .inv-honoree, .inv-r-jharokha .inv-acc, .inv-r-jharokha .inv-card, .inv-r-jharokha .inv-note {
  border: 2px solid var(--inv-accent); border-radius: 56px 56px 0 0; box-shadow: 0 0 0 3px var(--inv-gold);
}
.inv-r-jharokha .inv-ecard { border: 2px solid var(--inv-accent); border-radius: 56px 56px 0 0; box-shadow: 0 0 0 3px var(--inv-gold); }
.inv-r-jharokha .inv-photo { border-radius: 38px 38px 0 0; border: 2px solid var(--inv-accent); }

/* ============ Recipe: Diya Nights (midnight blue and flame gold) ============
   A string of glowing diyas tops every screen width; every card and note
   picks up a warm flame-lit glow instead of a plain shadow. */
.inv-dystr { display: flex; justify-content: space-around; padding: .9rem 1rem 0; }
.inv-dystr span { width: 8px; height: 8px; border-radius: 50%; background: var(--inv-gold); box-shadow: 0 0 10px 3px color-mix(in srgb, var(--inv-gold) 60%, transparent); }
.inv-dyflame {
  width: 14px; height: 20px; margin: .8rem auto 0; border-radius: 50% 50% 50% 50%/62% 62% 38% 38%;
  background: radial-gradient(circle at 50% 70%, #fff6cf 25%, var(--inv-gold) 60%, var(--inv-accent));
  box-shadow: 0 0 18px 6px color-mix(in srgb, var(--inv-gold) 55%, transparent);
}
.inv-dybowl { width: 58px; height: 20px; margin: 2px auto 0; background: linear-gradient(var(--inv-accent), color-mix(in srgb, var(--inv-accent) 55%, #000)); border-radius: 0 0 30px 30px; }
.inv-r-diya .inv-honoree, .inv-r-diya .inv-acc, .inv-r-diya .inv-card, .inv-r-diya .inv-note {
  box-shadow: 0 0 0 2px color-mix(in srgb, var(--inv-gold) 35%, transparent), 0 0 22px 4px color-mix(in srgb, var(--inv-gold) 25%, transparent);
}
.inv-r-diya .inv-photo { border-radius: 14px; box-shadow: 0 0 16px 4px color-mix(in srgb, var(--inv-gold) 30%, transparent); }
.inv-r-diya .inv-btn { box-shadow: 0 0 18px 4px color-mix(in srgb, var(--inv-gold) 35%, transparent); }

/* ============ Recipe: Mehndi Night (henna green and bronze, dark) ============
   A dark evening canvas with an ornate oval vignette hero; every card
   picks up a dotted henna-vine border instead of a plain edge. */
.inv-mhvign {
  width: 235px; margin: 2rem auto 0; padding: 2.2rem 1.2rem; position: relative;
  border: 2px solid color-mix(in srgb, var(--inv-gold) 55%, transparent);
  border-radius: 50% 50% 50% 50%/40% 40% 60% 60%;
  box-shadow: 0 0 0 6px var(--inv-bg), 0 0 0 7px color-mix(in srgb, var(--inv-gold) 45%, transparent);
}
.inv-r-mehndi .inv-honoree, .inv-r-mehndi .inv-acc, .inv-r-mehndi .inv-card, .inv-r-mehndi .inv-note {
  border: 2px dotted color-mix(in srgb, var(--inv-gold) 60%, transparent); border-radius: 60px 16px 14px 14px;
}
.inv-r-mehndi .inv-photo { border-radius: 50%; border: 2px dotted var(--inv-gold); box-shadow: none; }
.inv-r-mehndi .inv-timeline .inv-event { border: 2px dotted color-mix(in srgb, var(--inv-gold) 55%, transparent); }

/* ============ Recipe: Bandhani Burst (tie-dye fuchsia and haldi yellow) ============
   A speckled tie-dye ring-burst hero; cards and the alt-section wash
   pick up the same dot-speckle pattern. */
.inv-bdburst {
  width: 225px; height: 225px; margin: 0 auto; border-radius: 50%; display: flex; align-items: center; justify-content: center;
  background: repeating-radial-gradient(circle, var(--inv-accent) 0 15px, color-mix(in srgb, var(--inv-accent) 70%, #fff) 15px 17px);
}
.inv-bdin {
  width: 150px; height: 150px; border-radius: 50%; background: #fff; color: var(--inv-accent);
  border: 3px dotted var(--inv-accent); display: flex; flex-direction: column; align-items: center; justify-content: center; padding: .6rem;
}
.inv-r-bandhani .inv-alt { background-image: radial-gradient(circle, color-mix(in srgb, var(--inv-accent) 22%, transparent) 1.6px, transparent 2.2px); background-size: 18px 18px; background-color: var(--inv-alt-bg); }
.inv-r-bandhani .inv-honoree, .inv-r-bandhani .inv-acc, .inv-r-bandhani .inv-card, .inv-r-bandhani .inv-note {
  border-radius: 50rem; border: 2.5px dotted color-mix(in srgb, var(--inv-accent) 65%, transparent);
}
.inv-r-bandhani .inv-photo { border-radius: 50%; }

/* ============ Recipe: Warli Song (tribal terracotta and white folk art) ============
   Hand-drawn dashed lines throughout, echoing Warli's dot-and-line
   figure work; a spiral-of-life hero opens the page. */
.inv-wrspiral {
  width: 200px; height: 200px; margin: 1.8rem auto 0; border-radius: 50%;
  border: 2px dashed color-mix(in srgb, var(--inv-text) 75%, transparent);
  display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 1rem; position: relative;
}
.inv-wrspiral::before { content: ''; position: absolute; inset: 15px; border: 1.5px dashed color-mix(in srgb, var(--inv-text) 40%, transparent); border-radius: 50%; }
.inv-r-warli .inv-honoree, .inv-r-warli .inv-acc, .inv-r-warli .inv-card, .inv-r-warli .inv-note {
  border: 2px dashed color-mix(in srgb, var(--inv-text) 55%, transparent); box-shadow: none; border-radius: 4px;
}
.inv-r-warli .inv-photo { border: 2px dashed color-mix(in srgb, var(--inv-text) 55%, transparent); border-radius: 4px; box-shadow: none; }
.inv-r-warli .inv-timeline::before { background: repeating-linear-gradient(var(--inv-text) 0 6px, transparent 6px 12px); }

/* ============ Recipe: Madhubani Border (Mithila folk colours) ============
   Every section lives inside a hand-drawn double-line frame with folk
   glyph corners and a cross-hatch rule - not just the hero. */
.inv-mbframe {
  border: 2px solid var(--inv-text); outline: 2px solid var(--inv-text); outline-offset: 4px;
  padding: 1.3rem .9rem; position: relative; margin: 0 .8rem;
}
.inv-mbframe::before { content: '\2766'; position: absolute; top: 2px; left: 8px; color: var(--inv-accent); font-size: 1rem; }
.inv-mbframe::after { content: '\2766'; position: absolute; bottom: 2px; right: 8px; color: var(--inv-gold); font-size: 1rem; }
.inv-mbhatch { height: 8px; width: 70%; margin: .6rem auto; opacity: .5; background: repeating-linear-gradient(90deg, var(--inv-text) 0 2px, transparent 2px 7px); }
.inv-r-madhubani .inv-section { padding: 2.2rem .3rem; }
.inv-r-madhubani .inv-honoree, .inv-r-madhubani .inv-acc, .inv-r-madhubani .inv-card, .inv-r-madhubani .inv-note {
  border: 2px solid var(--inv-text); border-radius: 0; box-shadow: none; position: relative;
}
.inv-r-madhubani .inv-photo { border: 4px solid var(--inv-accent); border-radius: 0; box-shadow: none; }
.inv-r-madhubani .inv-timeline .inv-event { border: 2px solid var(--inv-text); box-shadow: none; }

/* ============ Recipe: Mughal Jaali (ivory, emerald and gold lattice) ============
   An octagon-cut hero and octagon photo frames; a jaali cross-hatch
   wash covers alt sections like a lattice screen. */
.inv-jaoct {
  width: 212px; height: 212px; margin: 0 auto; padding: 1rem;
  clip-path: polygon(30% 0, 70% 0, 100% 30%, 100% 70%, 70% 100%, 30% 100%, 0 70%, 0 30%);
  background: var(--inv-accent); color: #fff; display: flex; flex-direction: column; align-items: center; justify-content: center;
}
.inv-jaoct .inv-kicker { color: color-mix(in srgb, var(--inv-gold) 70%, #fff); }
.inv-jaoct .inv-title, .inv-jaoct .inv-date { color: #fff; }
.inv-jaband {
  height: 16px; opacity: .75;
  background-image: repeating-linear-gradient(45deg, color-mix(in srgb, var(--inv-accent) 40%, transparent) 0 2px, transparent 2px 9px),
    repeating-linear-gradient(-45deg, color-mix(in srgb, var(--inv-accent) 40%, transparent) 0 2px, transparent 2px 9px);
}
.inv-r-jaali .inv-alt {
  background-image: repeating-linear-gradient(45deg, color-mix(in srgb, var(--inv-accent) 12%, transparent) 0 2px, transparent 2px 13px),
    repeating-linear-gradient(-45deg, color-mix(in srgb, var(--inv-accent) 12%, transparent) 0 2px, transparent 2px 13px);
  background-color: var(--inv-alt-bg);
}
.inv-r-jaali .inv-honoree, .inv-r-jaali .inv-note {
  clip-path: polygon(30% 0, 70% 0, 100% 30%, 100% 70%, 70% 100%, 30% 100%, 0 70%, 0 30%);
  border: 2px solid var(--inv-gold); border-radius: 0;
}
.inv-r-jaali .inv-acc, .inv-r-jaali .inv-card { border: 2px solid var(--inv-gold); border-radius: 6px; }
.inv-r-jaali .inv-photo { clip-path: polygon(30% 0, 70% 0, 100% 30%, 100% 70%, 70% 100%, 30% 100%, 0 70%, 0 30%); }

/* ============ Recipe: Athangudi Tiles (Chettinad teal, mustard and brick) ============
   The whole page reads as a floor of handmade tiles: a checkerboard
   wash on alt sections, thick-bordered "inlay tile" cards. */
.inv-atstar {
  padding: 1.8rem 1.2rem; border: 3px solid var(--inv-text); background: color-mix(in srgb, #fff 55%, var(--inv-bg));
  box-shadow: inset 0 0 0 6px color-mix(in srgb, var(--inv-gold) 45%, transparent);
}
.inv-r-athangudi .inv-alt { background-image: conic-gradient(color-mix(in srgb, var(--inv-accent) 10%, transparent) 90deg, transparent 0 180deg, color-mix(in srgb, var(--inv-accent) 10%, transparent) 0 270deg, transparent 0); background-size: 40px 40px; background-color: var(--inv-alt-bg); }
.inv-r-athangudi .inv-honoree, .inv-r-athangudi .inv-acc, .inv-r-athangudi .inv-card, .inv-r-athangudi .inv-note, .inv-r-athangudi .inv-ecard {
  border: 3px solid var(--inv-text); border-radius: 0; box-shadow: none;
}
.inv-r-athangudi .inv-photo { border: 3px solid var(--inv-gold); border-radius: 0; box-shadow: none; }

/* ============ Recipe: Phulkari Stitch (Punjabi pink, orange and thread gold) ============
   Braided-thread zigzag bands run between sections; cards sit inside
   dashed embroidery-hoop rings instead of plain boxes. */
.inv-phzz { height: 12px; background: repeating-linear-gradient(45deg, var(--inv-accent) 0 7px, var(--inv-gold) 7px 14px, color-mix(in srgb, var(--inv-gold) 60%, var(--inv-accent)) 14px 21px); }
.inv-phstitch { display: inline-block; border-bottom: 2px dashed var(--inv-accent); padding-bottom: .25rem; }
.inv-r-phulkari .inv-honoree, .inv-r-phulkari .inv-note {
  border: 5px solid color-mix(in srgb, var(--inv-gold) 65%, #8a5a1a); border-radius: 50%; position: relative;
}
.inv-r-phulkari .inv-honoree::before, .inv-r-phulkari .inv-note::before {
  content: ''; position: absolute; inset: 3px; border: 2px dashed var(--inv-accent); border-radius: 50%; pointer-events: none;
}
.inv-r-phulkari .inv-acc, .inv-r-phulkari .inv-card { border: 1.5px dashed var(--inv-accent); border-radius: 12px; }
.inv-r-phulkari .inv-timeline .inv-event::before { content: '\00D7'; background: none; color: var(--inv-accent); font-weight: 800; font-size: 1.2rem; box-shadow: none; display: flex; align-items: center; justify-content: center; }
.inv-r-phulkari .inv-photo { border-radius: 50%; border: 3px dashed var(--inv-accent); }

/* ============ Recipe: Tanjore Gold (crimson, gold leaf and gems) ============
   A gilded, gem-studded frame holds the hero; every card becomes an
   embossed gold plaque with notched ends. */
.inv-tjframe {
  padding: 9px; border-radius: 130px 130px 14px 14px; max-width: 300px; margin: 1.4rem auto 0;
  background: linear-gradient(140deg, var(--inv-gold), color-mix(in srgb, var(--inv-gold) 55%, #8a5a1a) 55%, var(--inv-gold));
  box-shadow: 0 12px 30px -12px rgba(0,0,0,.4);
}
.inv-tjin { background: var(--inv-accent); border-radius: 124px 124px 9px 9px; padding: 2.1rem 1rem 1.5rem; }
.inv-tjin .inv-kicker { color: color-mix(in srgb, var(--inv-gold) 75%, #fff); }
.inv-tjin .inv-title, .inv-tjin .inv-date { color: #fff; }
.inv-tjgems { display: flex; justify-content: center; gap: .5rem; margin: .7rem 0 .2rem; }
.inv-tjgems span { width: 8px; height: 8px; border-radius: 50%; }
.inv-tjg1 { background: #0e5b3f; box-shadow: 0 0 5px #0e5b3f; }
.inv-tjg2 { background: #c9273a; box-shadow: 0 0 5px #c9273a; }
.inv-tjg3 { background: #f2f2f2; box-shadow: 0 0 5px #fff; }
.inv-r-tanjore .inv-honoree, .inv-r-tanjore .inv-acc, .inv-r-tanjore .inv-card, .inv-r-tanjore .inv-note {
  clip-path: polygon(10px 0, calc(100% - 10px) 0, 100% 50%, calc(100% - 10px) 100%, 10px 100%, 0 50%);
  background: linear-gradient(180deg, var(--inv-gold), color-mix(in srgb, var(--inv-gold) 55%, #8a5a1a)); color: color-mix(in srgb, var(--inv-accent) 70%, #000);
}
.inv-r-tanjore .inv-honoree-name, .inv-r-tanjore .inv-note-name { color: color-mix(in srgb, var(--inv-accent) 70%, #000); }
.inv-r-tanjore .inv-photo { padding: 5px; background: linear-gradient(140deg, var(--inv-gold), color-mix(in srgb, var(--inv-gold) 55%, #8a5a1a)); border-radius: 0; box-shadow: none; }

/* ============ Recipe: Ikat Diamond (Pochampally indigo weave) ============
   A chevron weave covers the page; the hero, cards and photos are all
   rotated 45deg into diamonds with feathered dashed edges. */
.inv-ikdia {
  width: 180px; height: 180px; margin: 1.6rem auto 0; transform: rotate(45deg);
  border: 3px dashed color-mix(in srgb, var(--inv-gold) 80%, transparent);
  outline: 3px dashed color-mix(in srgb, var(--inv-gold) 35%, transparent); outline-offset: 8px;
  display: flex; align-items: center; justify-content: center;
}
.inv-ikin { transform: rotate(-45deg); text-align: center; width: 170px; }
.invite.inv-r-ikat {
  background-image: repeating-linear-gradient(45deg, color-mix(in srgb, var(--inv-gold) 8%, transparent) 0 6px, transparent 6px 14px),
    repeating-linear-gradient(-45deg, color-mix(in srgb, var(--inv-gold) 8%, transparent) 0 6px, transparent 6px 14px);
}
.inv-r-ikat .inv-honoree, .inv-r-ikat .inv-note { clip-path: polygon(50% 0, 100% 50%, 50% 100%, 0 50%); border-radius: 0; }
.inv-r-ikat .inv-acc, .inv-r-ikat .inv-card { border-radius: 4px; border: 2px dashed color-mix(in srgb, var(--inv-gold) 55%, transparent); }
.inv-r-ikat .inv-photo { clip-path: polygon(50% 0, 100% 50%, 50% 100%, 0 50%); }
.inv-r-ikat .inv-plist-row { border-top-style: dashed; }

/* ============ Recipe: Sangeet Raat (the music night) ============
   Equaliser bars open the page; the couple spin as vinyl records and
   events read like tracks on a setlist. */
.inv-sgeq { display: flex; align-items: flex-end; justify-content: center; gap: 4px; height: 34px; margin: 1.6rem 0 .8rem; }
.inv-sgeq span { width: 8px; border-radius: 3px 3px 0 0; background: linear-gradient(var(--inv-accent), var(--inv-gold)); }
.inv-r-sangeet .inv-honoree { border-radius: 50%; padding: 1.6rem 1rem; position: relative;
  background: repeating-radial-gradient(circle, #171026 0 5px, color-mix(in srgb, var(--inv-text) 15%, var(--inv-bg)) 5px 8px);
  color: #fff; box-shadow: 0 8px 22px rgba(0,0,0,.4);
}
.inv-r-sangeet .inv-honoree-name, .inv-r-sangeet .inv-honoree-role { color: #fff; }
.inv-r-sangeet .inv-acc, .inv-r-sangeet .inv-card, .inv-r-sangeet .inv-note { border-radius: 12px; border-left: 5px solid var(--inv-accent); }
.inv-r-sangeet .inv-timeline .inv-event { border-radius: 12px; border-left: 5px solid var(--inv-gold); }
.inv-r-sangeet .inv-photo { border-radius: 14px; box-shadow: 0 0 0 3px color-mix(in srgb, var(--inv-accent) 35%, transparent); }

/* ============ Recipe: Baraat Route (the procession) ============
   A brass-band ribbon frames the page top and bottom; the events
   variant becomes the journey zig-zag, read here as stops on the route. */
.inv-brband { height: 12px; background: repeating-linear-gradient(90deg, var(--inv-accent) 0 14px, var(--inv-gold) 14px 22px, color-mix(in srgb, var(--inv-accent) 60%, var(--inv-gold)) 22px 30px); }
.inv-r-baraat .inv-honoree, .inv-r-baraat .inv-acc, .inv-r-baraat .inv-card, .inv-r-baraat .inv-note {
  background: color-mix(in srgb, var(--inv-accent) 5%, #fff); border: 2px solid color-mix(in srgb, var(--inv-gold) 45%, transparent);
}
.inv-r-baraat .inv-photo { border-radius: 12px; border: 2px solid var(--inv-gold); }

/* ============ Recipe: Chooda Kalire (the bridal bangles) ============
   Golden kalire dangle from the top corners; events and cards become
   alternating red-and-ivory bangle pills. */
.inv-ckkal { position: absolute; top: 0; width: 60px; height: 74px; z-index: 2; }
.inv-ckkal-l { left: 14px; } .inv-ckkal-r { right: 14px; }
.inv-ckkal span {
  display: block; width: 0; height: 0; border-left: 8px solid transparent; border-right: 8px solid transparent;
  border-top: 20px solid var(--inv-gold); margin: 6px auto 0; filter: drop-shadow(0 2px 2px rgba(0,0,0,.2));
}
.inv-ckstack {
  width: 130px; height: 130px; margin: 2rem auto 0; border-radius: 50%;
  background: repeating-radial-gradient(circle, var(--inv-accent) 0 9px, var(--inv-bg) 9px 15px, var(--inv-accent) 15px 17px, var(--inv-bg) 17px 23px);
}
.inv-r-chooda .inv-honoree, .inv-r-chooda .inv-acc, .inv-r-chooda .inv-timeline .inv-event {
  border-radius: 50rem; border-bottom: 6px solid var(--inv-gold);
}
.inv-r-chooda .inv-card, .inv-r-chooda .inv-note { border-radius: 50rem; border: 2px solid color-mix(in srgb, var(--inv-gold) 50%, transparent); }
.inv-r-chooda .inv-photo { border-radius: 50%; border: 4px solid var(--inv-gold); }

/* ============ Recipe: Alpona Shonkho (Bengali shada-lal) ============
   Red laal-paar bands with a sindoor-red sun hero; shankha-bangle
   dividers and red-bottomed cards echo the saree border. */
.inv-appaar { height: 26px; background: var(--inv-accent); position: relative; }
.inv-appaar::after { content: ''; position: absolute; inset: 0; background: radial-gradient(circle at 13px 13px, transparent 7px, #fff 7.5px 9px, transparent 9.5px); background-size: 26px 26px; }
.inv-apsun {
  width: 205px; height: 205px; margin: 1.6rem auto 0; border-radius: 50%; background: var(--inv-accent); color: #fff;
  display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 1rem; position: relative;
  box-shadow: 0 0 0 8px var(--inv-bg), 0 0 0 10px var(--inv-accent);
}
.inv-apsun::before { content: ''; position: absolute; inset: 12px; border: 2px dashed rgba(255,255,255,.75); border-radius: 50%; }
.inv-apsun .inv-kicker { color: color-mix(in srgb, var(--inv-gold) 70%, #fff); }
/* .inv-title sets its own color: var(--inv-accent) in the base rule, which
   wins over .inv-apsun's inherited color:#fff (an element's own explicit
   color always beats an ancestor's) - so the name was rendering in the
   same accent colour as the circle behind it and disappearing entirely. */
.inv-apsun .inv-title { color: #fff; }
.inv-r-alpona .inv-honoree, .inv-r-alpona .inv-acc, .inv-r-alpona .inv-card, .inv-r-alpona .inv-note {
  border: 2px solid var(--inv-accent); border-radius: 4px; position: relative;
}
.inv-r-alpona .inv-honoree::after, .inv-r-alpona .inv-acc::after, .inv-r-alpona .inv-card::after, .inv-r-alpona .inv-note::after {
  content: ''; position: absolute; left: 0; right: 0; bottom: 0; height: 5px; background: var(--inv-accent);
}
.inv-r-alpona .inv-photo { border-radius: 50%; border: 3px dashed var(--inv-accent); padding: 3px; }

/* ============ Recipe: Doli Farewell (the bidaai, dusk colours) ============
   A dusk gradient washes over the page; the tasselled doli carries the
   names, and cards soften to a warm, gently curved farewell tone. */
.inv-dldoli { width: 190px; margin: 2.2rem auto 0; position: relative; }
/* .inv-dlcab's background is always a pale cream mix, unconditionally -
   but it doesn't set its own text colour, so .inv-date (which has no
   colour of its own either) falls through to whatever the surrounding
   dusk-toned theme sets for body text, often a light colour meant for
   THAT dark backdrop, not this pale card floating on top of it. */
.inv-dlcab { color: var(--inv-accent); }
.inv-dlroof { height: 46px; background: linear-gradient(var(--inv-accent), color-mix(in srgb, var(--inv-accent) 55%, #000)); border-radius: 50% 50% 0 0; border-bottom: 4px solid var(--inv-gold); }
.inv-dlcab { background: color-mix(in srgb, #fff 85%, var(--inv-bg)); padding: 1rem .8rem 1.1rem; border: 3px solid var(--inv-gold); border-top: none; }
.inv-dltassels { display: flex; justify-content: space-around; }
.inv-dltassels span { width: 0; height: 0; border-left: 6px solid transparent; border-right: 6px solid transparent; border-top: 14px solid var(--inv-gold); }
.invite.inv-r-doli { background-image: linear-gradient(180deg, color-mix(in srgb, var(--inv-accent) 10%, transparent), transparent 30%); }
.inv-r-doli .inv-honoree, .inv-r-doli .inv-acc, .inv-r-doli .inv-card, .inv-r-doli .inv-note {
  border-radius: 50% 50% 50% 6px; border-color: color-mix(in srgb, var(--inv-gold) 45%, transparent);
}
.inv-r-doli .inv-photo { border-radius: 50% 50% 50% 8px; }

/* ============ Recipe: Shehnai Serenade (North Indian melody) ============
   A golden shehnai plays at the top; a flowing wave line weaves between
   every section like its melody, and honorees sit in tilted note-heads. */
.inv-shhorn { width: 130px; height: 34px; margin: 1.6rem auto 0; position: relative; }
.inv-shpipe { position: absolute; left: 0; top: 12px; width: 96px; height: 10px; background: linear-gradient(var(--inv-gold), color-mix(in srgb, var(--inv-gold) 55%, #000)); clip-path: polygon(0 30%, 100% 0, 100% 100%, 0 70%); }
.inv-shbell { position: absolute; right: 4px; top: 0; width: 32px; height: 32px; border-radius: 50%; background: radial-gradient(circle at 35% 35%, var(--inv-gold), color-mix(in srgb, var(--inv-gold) 55%, #000)); }
.inv-shnotes { color: var(--inv-accent); font-size: .95rem; letter-spacing: .9rem; margin: .4rem 0 0 1rem; }
.inv-r-shehnai .inv-section { position: relative; }
.inv-r-shehnai .inv-section::before {
  content: ''; position: absolute; top: 0; left: 8%; right: 8%; height: 20px;
  border-top: 2px solid color-mix(in srgb, var(--inv-accent) 35%, transparent); border-radius: 50%; opacity: .5;
}
.inv-r-shehnai .inv-honoree, .inv-r-shehnai .inv-note { border-radius: 50%; transform: rotate(-4deg); border: 3px solid var(--inv-accent); }
.inv-r-shehnai .inv-acc, .inv-r-shehnai .inv-card { border-radius: 50rem; }
.inv-r-shehnai .inv-photo { border-radius: 50%; }

/* ============ Recipe: Kollywood Blockbuster (hand-painted cinema poster) ============
   A painted-poster gradient hero with drop-shadow type; every card gets
   a film-strip sprocket edge instead of a plain border. */
.invite.inv-r-kollywood { background: linear-gradient(180deg, color-mix(in srgb, var(--inv-gold) 25%, var(--inv-bg)) 0%, var(--inv-bg) 340px); }
.inv-kyhero { padding: 2rem 1rem; }
.inv-kypresents { font-size: .58rem; letter-spacing: .28em; text-transform: uppercase; font-weight: 800; color: color-mix(in srgb, var(--inv-gold) 70%, var(--inv-accent)); }
.inv-kytitle {
  font-family: var(--inv-heading-font); font-size: clamp(2rem, 9vw, 3.2rem); line-height: .98;
  color: var(--inv-accent); text-shadow: 3px 3px 0 color-mix(in srgb, var(--inv-gold) 55%, #000); transform: rotate(-1.5deg); margin: .6rem 0;
}
.inv-kytitle em { font-style: normal; color: var(--inv-gold); }
.inv-kytag { font-family: var(--inv-heading-font); font-style: italic; font-size: .95rem; }
.inv-kycredits { font-size: .58rem; letter-spacing: .06em; text-transform: uppercase; line-height: 1.9; opacity: .85; margin-top: .7rem; }
.inv-kycredits b { color: var(--inv-gold); }
.inv-r-kollywood .inv-honoree, .inv-r-kollywood .inv-acc, .inv-r-kollywood .inv-card, .inv-r-kollywood .inv-note {
  border: 2px solid var(--inv-gold); box-shadow: 3px 3px 0 color-mix(in srgb, var(--inv-accent) 40%, transparent);
}
.inv-r-kollywood .inv-photo { border: 3px solid var(--inv-gold); border-radius: 4px; box-shadow: 4px 4px 0 rgba(0,0,0,.2); transform: rotate(-1deg); }
.inv-r-kollywood .inv-plist-row { border-top-color: var(--inv-gold); border-top-width: 2px; }

/* ============ Recipe: Railway Junction (the great Indian train journey) ============
   A yellow-and-black station board opens the page; the events variant
   becomes a dashed rail line with platform-numbered stops. */
.inv-ryboard { background: #ffd500; border: 4px solid #111; padding: 1rem .8rem; margin: 1.6rem .4rem 0; color: #111; }
.inv-ryst { font-weight: 800; font-size: 1.2rem; letter-spacing: .02em; }
.inv-ryalt { font-size: .6rem; font-weight: 800; letter-spacing: .16em; margin-top: .3rem; }
.inv-rytkt {
  background: color-mix(in srgb, #fff 85%, var(--inv-bg)); border: 1.5px dashed color-mix(in srgb, var(--inv-text) 55%, transparent);
  margin: 1rem .4rem 0; padding: .9rem .8rem;
}
.inv-r-railway .inv-erule-sep { border-bottom-style: dashed; }
.inv-r-railway .inv-erule-meta::before { content: '\2192 '; color: var(--inv-gold); font-weight: 800; }
.inv-r-railway .inv-honoree, .inv-r-railway .inv-acc, .inv-r-railway .inv-card, .inv-r-railway .inv-note {
  border: 2px solid #111; border-radius: 6px; box-shadow: none;
}
.inv-r-railway .inv-photo { border: 2px solid #111; border-radius: 4px; }

/* ============ Recipe: Wedding Post (vintage Indian mail) ============
   An airmail stripe borders the page; the hero is a perforated postage
   stamp, and cards pick up the same dotted "perforation" edge. */
.inv-wpair { height: 16px; background: repeating-linear-gradient(135deg, var(--inv-accent) 0 14px, #fff 14px 28px, var(--inv-gold) 28px 42px, #fff 42px 56px); }
.inv-wpstamp {
  width: 150px; margin: 1.4rem auto 0; background: color-mix(in srgb, #fff 90%, var(--inv-bg)); padding: 8px;
  border: 6px dotted var(--inv-bg); outline: 1.5px solid color-mix(in srgb, var(--inv-text) 30%, transparent);
  box-shadow: 0 8px 20px rgba(0,0,0,.15); transform: rotate(-2deg);
}
.inv-wpval { display: flex; justify-content: space-between; font-size: .58rem; font-weight: 800; letter-spacing: .06em; color: var(--inv-accent); text-transform: uppercase; padding: 1.4rem .2rem .2rem; }
.inv-r-post .inv-honoree, .inv-r-post .inv-acc, .inv-r-post .inv-card, .inv-r-post .inv-note {
  border: 5px dotted var(--inv-bg); outline: 1px solid color-mix(in srgb, var(--inv-text) 25%, transparent); box-shadow: none;
}
.inv-r-post .inv-photo { border: 5px dotted var(--inv-bg); outline: 1px solid color-mix(in srgb, var(--inv-text) 25%, transparent); box-shadow: none; }

/* ============ Recipe: Horn OK Please (Indian truck art) ============
   Loud lorry-back art: nazar-warding eyes and layered painted borders
   frame the hero; cards become route-permit plates. */
.inv-tkpanel {
  border: 5px solid var(--inv-gold); outline: 4px solid color-mix(in srgb, var(--inv-accent) 60%, #17b26a); outline-offset: 5px;
  background: color-mix(in srgb, var(--inv-accent) 92%, #000); padding: 1.4rem .9rem 1.1rem; margin: 1.6rem .6rem 0; color: #fff;
}
.inv-tkeyes { display: flex; justify-content: center; gap: 1rem; margin-bottom: .5rem; }
.inv-tkeye { width: 40px; height: 20px; border-radius: 50%; background: #fff; border: 2.5px solid #111; position: relative; }
.inv-tkeye::before { content: ''; position: absolute; left: 50%; top: 50%; transform: translate(-50%,-50%); width: 11px; height: 11px; border-radius: 50%; background: #111; }
.inv-tktitle { font-family: var(--inv-heading-font); font-size: clamp(1.5rem, 7vw, 2.1rem); color: var(--inv-gold); text-shadow: 2px 2px 0 rgba(0,0,0,.35); }
.inv-tkdate { font-weight: 800; font-size: .62rem; letter-spacing: .1em; text-transform: uppercase; color: color-mix(in srgb, var(--inv-gold) 50%, #fff); margin-top: .3rem; }
.inv-tkhorn { background: var(--inv-gold); color: var(--inv-accent); font-weight: 800; letter-spacing: .12em; padding: .3rem; margin: .8rem -0.9rem -1.1rem; border-top: 3px solid var(--inv-accent); }
.inv-r-truck .inv-honoree, .inv-r-truck .inv-acc, .inv-r-truck .inv-card, .inv-r-truck .inv-note, .inv-r-truck .inv-ecard {
  border: 3px solid var(--inv-gold); border-radius: 12px;
}
.inv-r-truck .inv-photo { border: 3px solid var(--inv-gold); border-radius: 10px; }
.inv-r-truck .inv-btn { border-radius: 50rem; font-weight: 800; }

/* ============ Recipe: The Wedding Times (front-page news) ============
   A broadsheet masthead and headline open the page; every card and
   note gets a hairline newsprint rule instead of a rounded box. */
.inv-nwmast { border-bottom: 3px double var(--inv-text); padding: 1.4rem 0 .5rem; }
.inv-nwname { font-family: var(--inv-heading-font); font-size: 1.5rem; letter-spacing: .02em; }
.inv-nwline { display: flex; justify-content: space-between; font-size: .55rem; letter-spacing: .08em; text-transform: uppercase; border-top: 1px solid var(--inv-text); margin-top: .4rem; padding: .25rem 1rem 0; font-weight: 700; }
.inv-nwhead { font-family: var(--inv-heading-font); font-size: clamp(1.7rem, 8vw, 2.6rem); line-height: 1.05; margin: .8rem 0 .2rem; }
.inv-nwsub { font-family: var(--inv-heading-font); font-style: italic; font-size: .85rem; color: var(--inv-accent); }
.inv-r-newspaper .inv-heading { font-family: var(--inv-heading-font); border-bottom: 2px solid var(--inv-text); padding-bottom: .25rem; text-transform: uppercase; letter-spacing: .06em; font-size: 1.15rem; }
.inv-r-newspaper .inv-honoree, .inv-r-newspaper .inv-acc, .inv-r-newspaper .inv-card, .inv-r-newspaper .inv-note {
  border: 1px solid var(--inv-text); border-radius: 0; box-shadow: none; background: color-mix(in srgb, var(--inv-gold) 5%, var(--inv-bg));
}
.inv-r-newspaper .inv-photo { border: 1px solid var(--inv-text); border-radius: 0; box-shadow: none; filter: saturate(.75); }
.inv-r-newspaper .inv-erule-sep { border-bottom-style: dotted; }

/* ============ Recipe: Balloon Sky (rising balloons carry the age) ============
   A cluster of balloons opens the page, the middle one carrying the
   birthday number; every card gets a balloon-string tie at the top. */
.inv-blballoons { display: flex; justify-content: center; align-items: flex-end; gap: 16px; margin-top: 1.6rem; }
.inv-blb {
  width: 46px; height: 58px; border-radius: 50% 50% 50% 50%/58% 58% 42% 42%;
  position: relative; display: flex; align-items: center; justify-content: center;
  color: #fff; font-weight: 800; font-size: 1.15rem; background: var(--inv-accent);
}
.inv-blb::after { content: ''; position: absolute; left: 50%; bottom: -20px; width: 2px; height: 20px; background: rgba(0,0,0,.25); }
.inv-blb-2 { width: 58px; height: 72px; margin-bottom: 10px; background: var(--inv-gold); color: color-mix(in srgb, var(--inv-gold) 30%, #000); }
.inv-blb-3 { background: color-mix(in srgb, var(--inv-accent) 55%, var(--inv-gold)); }
.inv-blturns { font-weight: 700; margin-top: .3rem; }
.inv-blturns b { color: var(--inv-accent); font-size: 1.15em; }
.inv-r-balloon .inv-honoree, .inv-r-balloon .inv-acc, .inv-r-balloon .inv-card,
.inv-r-balloon .inv-note, .inv-r-balloon .inv-ecard {
  border-radius: 50% 50% 16px 16px/30% 30% 16px 16px; border-top: 3px solid var(--inv-gold); position: relative;
}
.inv-r-balloon .inv-section:nth-of-type(odd) .inv-ecard { transform: rotate(-1deg); }
.inv-r-balloon .inv-section:nth-of-type(even) .inv-ecard { transform: rotate(1deg); }
.inv-r-balloon .inv-photo { border-radius: 50%; }

/* ============ Recipe: Rocket Countdown (mission-control space theme) ============
   A CSS rocket opens a dark starfield page; the journey path's numbered
   stops read as mission stages counting down to launch. */
.inv-rkrocket { width: 60px; margin: 1.8rem auto 0; }
.inv-rknose { width: 0; height: 0; margin: 0 auto; border-left: 26px solid transparent; border-right: 26px solid transparent; border-bottom: 32px solid var(--inv-gold); }
.inv-rkbody { display: flex; align-items: center; justify-content: center; width: 52px; height: 60px; margin: -2px auto 0; background: var(--inv-gold); border-radius: 4px; position: relative; }
.inv-rkwin { width: 20px; height: 20px; border-radius: 50%; background: color-mix(in srgb, var(--inv-accent) 25%, #fff); border: 3px solid var(--inv-accent); }
.inv-rkfins { display: flex; justify-content: space-between; width: 76px; margin: -6px auto 0; }
.inv-rkfins i { display: block; width: 0; height: 0; border-top: 22px solid var(--inv-accent); }
.inv-rkfins i:first-child { border-right: 14px solid transparent; }
.inv-rkfins i:last-child { border-left: 14px solid transparent; }
.inv-rkflame {
  width: 16px; height: 26px; margin: -4px auto 0; border-radius: 0 0 50% 50%;
  background: radial-gradient(circle at 50% 20%, #fff3c4, var(--inv-gold) 55%, var(--inv-accent));
  box-shadow: 0 0 14px 4px color-mix(in srgb, var(--inv-gold) 55%, transparent);
}
.inv-rkage b { color: var(--inv-gold); }
.invite.inv-r-rocket {
  background-image: radial-gradient(circle, rgba(255,255,255,.55) 1px, transparent 1.4px),
    radial-gradient(circle, rgba(255,255,255,.35) 1px, transparent 1.4px);
  background-size: 60px 60px, 34px 34px; background-position: 0 0, 17px 12px;
}
.inv-r-rocket .inv-jdot { background: var(--inv-gold); }
.inv-r-rocket .inv-jcard { background: color-mix(in srgb, var(--inv-text) 8%, var(--inv-bg)); border-color: color-mix(in srgb, var(--inv-gold) 30%, transparent); }
.inv-r-rocket .inv-honoree, .inv-r-rocket .inv-acc, .inv-r-rocket .inv-card, .inv-r-rocket .inv-note {
  border: 1px solid color-mix(in srgb, var(--inv-gold) 35%, transparent); box-shadow: 0 0 16px 2px color-mix(in srgb, var(--inv-gold) 12%, transparent);
}
.inv-r-rocket .inv-photo { border-radius: 50%; box-shadow: 0 0 0 3px color-mix(in srgb, var(--inv-gold) 40%, transparent); }

/* ============ Recipe: Circus Big Top (striped tent and bunting) ============
   A striped canopy with a pennant flag opens the page; events read
   as ticket stubs with a notched dashed edge. */
.inv-cctent { max-width: 260px; margin: 1.6rem auto 0; position: relative; }
.inv-ccflag {
  width: 0; height: 0; margin: 0 auto -2px; border-left: 14px solid transparent; border-right: 14px solid transparent;
  border-bottom: 20px solid var(--inv-gold);
}
.inv-cctop {
  height: 46px; border-radius: 50% 50% 0 0 / 100% 100% 0 0;
  background: repeating-linear-gradient(90deg, var(--inv-accent) 0 18px, #fff 18px 36px);
  border-bottom: 4px solid var(--inv-gold);
}
.inv-ccbase { background: color-mix(in srgb, #fff 70%, var(--inv-bg)); padding: 1.4rem 1rem; border: 2px solid var(--inv-gold); border-top: none; }
.inv-ccshow { font-weight: 700; margin-top: .4rem; }
.inv-ccshow b { color: var(--inv-accent); }
.inv-r-circus .inv-ecard, .inv-r-circus .inv-honoree, .inv-r-circus .inv-acc, .inv-r-circus .inv-card, .inv-r-circus .inv-note {
  border: 2px dashed var(--inv-accent); border-radius: 4px; position: relative;
}
.inv-r-circus .inv-photo { border-radius: 50%; border: 4px solid var(--inv-gold); }
.inv-r-circus .inv-heading { display: inline-block; padding: 0 .6rem; }

/* ============ Recipe: Level Up (pixel-game invite) ============
   A blocky "LEVEL UNLOCKED" banner opens the page; every card takes
   a chunky pixel-stepped border instead of a rounded one. */
.inv-pxbanner {
  display: inline-block; background: var(--inv-accent); color: #fff; font-weight: 800;
  font-family: 'Courier New', monospace; letter-spacing: .08em; padding: .5rem 1.1rem;
  box-shadow: 4px 0 0 var(--inv-gold), -4px 0 0 var(--inv-gold), 0 4px 0 var(--inv-gold), 0 -4px 0 var(--inv-gold);
  margin: 1.8rem 4px 1rem;
}
.inv-pxunlocked { font-family: 'Courier New', monospace; font-weight: 800; letter-spacing: .1em; color: var(--inv-gold); }
.inv-pxstart {
  display: inline-block; font-family: 'Courier New', monospace; font-weight: 800; letter-spacing: .05em;
  color: var(--inv-accent); animation: inv-pxblink 1.1s steps(1) infinite;
}
@keyframes inv-pxblink { 50% { opacity: .25; } }
.inv-r-pixel .inv-honoree, .inv-r-pixel .inv-acc, .inv-r-pixel .inv-card, .inv-r-pixel .inv-note {
  border-radius: 0; border: 3px solid var(--inv-text);
  box-shadow: 3px 0 0 var(--inv-gold), -3px 0 0 var(--inv-gold), 0 3px 0 var(--inv-gold), 0 -3px 0 var(--inv-gold);
}
.inv-r-pixel .inv-photo { border-radius: 0; border: 3px solid var(--inv-text); box-shadow: none; image-rendering: pixelated; }
.inv-r-pixel .inv-heading { font-family: 'Courier New', monospace; letter-spacing: .06em; }
.inv-r-pixel .inv-btn { border-radius: 0; font-family: 'Courier New', monospace; }
.inv-r-pixel .inv-plist-row { border-top-style: dashed; }

/* ============ Recipe: Retro Rewind (vintage sunburst poster) ============
   A retro sunburst poster with an "EST. {year}" badge opens the page;
   the events variant is the thin rule-line minimalist list. */
.inv-rrposter { max-width: 320px; margin: 0 auto; padding: 2rem 1.2rem; position: relative; overflow: hidden; }
.inv-rrsun {
  position: absolute; top: -60px; left: 50%; width: 220px; height: 220px; transform: translateX(-50%);
  border-radius: 50%; z-index: -1;
  background: repeating-conic-gradient(color-mix(in srgb, var(--inv-gold) 55%, transparent) 0 10deg, transparent 10deg 20deg);
  opacity: .6;
}
.inv-rrbadge {
  display: inline-block; margin-top: .8rem; padding: .4rem 1rem; border: 2px solid var(--inv-accent);
  border-radius: 50rem; font-weight: 800; letter-spacing: .1em; font-size: .78rem; color: var(--inv-accent);
}
.inv-r-retro .inv-honoree, .inv-r-retro .inv-acc, .inv-r-retro .inv-card, .inv-r-retro .inv-note {
  border-radius: 2px; border: 2px solid var(--inv-accent); box-shadow: 4px 4px 0 color-mix(in srgb, var(--inv-gold) 60%, transparent);
}
.inv-r-retro .inv-photo { border-radius: 2px; border: 2px solid var(--inv-accent); box-shadow: 4px 4px 0 color-mix(in srgb, var(--inv-gold) 60%, transparent); filter: sepia(.2) saturate(1.1); }
.inv-r-retro .inv-erule-sep { border-bottom: 2px dashed color-mix(in srgb, var(--inv-accent) 45%, transparent); }

/* ============ Recipe: Dove & Water (baptism - descending dove, ripples) ============
   A dove settles over concentric water rings; cards take a soft
   wave-bottom edge instead of a plain straight one. */
.inv-dvripples { width: 200px; height: 200px; margin: 1.6rem auto 0; position: relative; display: flex; align-items: center; justify-content: center; }
.inv-dvring { position: absolute; border: 2px solid color-mix(in srgb, var(--inv-accent) 45%, transparent); border-radius: 50%; }
.inv-dvring-1 { width: 200px; height: 200px; }
.inv-dvring-2 { width: 138px; height: 138px; }
.inv-dvdove { font-size: 2.6rem; }
.inv-dvparents b { color: var(--inv-accent); }
.inv-r-dove .inv-alt { background-color: color-mix(in srgb, var(--inv-accent) 8%, var(--inv-alt-bg)); }
.inv-r-dove .inv-honoree, .inv-r-dove .inv-acc, .inv-r-dove .inv-card, .inv-r-dove .inv-note {
  border-radius: 14px 14px 40px 40px/14px 14px 20px 20px; border-color: color-mix(in srgb, var(--inv-accent) 35%, transparent);
}
.inv-r-dove .inv-photo { border-radius: 50%; }
.inv-r-dove .inv-erule-sep { border-bottom-color: color-mix(in srgb, var(--inv-accent) 35%, transparent); }

/* ============ Recipe: Little Lamb (pastel clouds, everything soft) ============
   Soft cloud puffs drift behind the hero; every card, photo and note
   rounds further than usual for a gentle, nursery-soft feel. */
.inv-lbclouds { position: relative; height: 54px; opacity: .8; }
.inv-lbclouds span { position: absolute; top: 10px; width: 46px; height: 26px; border-radius: 50%; background: color-mix(in srgb, #fff 75%, var(--inv-bg)); }
.inv-lbclouds span:nth-child(1) { left: 14%; }
.inv-lbclouds span:nth-child(2) { left: 44%; top: 0; width: 60px; height: 32px; }
.inv-lbclouds span:nth-child(3) { right: 14%; }
.inv-lbmedal {
  width: 84px; height: 84px; margin: .5rem auto 0; border-radius: 50%; background: color-mix(in srgb, #fff 60%, var(--inv-bg));
  border: 3px solid var(--inv-gold); display: flex; align-items: center; justify-content: center; font-size: 2.2rem;
}
.inv-lbparents b { color: var(--inv-accent); }
.inv-r-lamb .inv-honoree, .inv-r-lamb .inv-acc, .inv-r-lamb .inv-card, .inv-r-lamb .inv-note {
  border-radius: 26px; box-shadow: 0 6px 18px -6px color-mix(in srgb, var(--inv-accent) 25%, transparent);
}
.inv-r-lamb .inv-photo { border-radius: 26px; }
.inv-r-lamb .inv-btn { border-radius: 50rem; }

/* ============ Recipe: First Chalice (ivory, gold, wheat and grape) ============
   A CSS chalice and host sit inside a gold-bordered frame; every card
   picks up the same slim gold double rule. */
.inv-chframe { max-width: 280px; margin: 1.4rem auto 0; padding: 1.8rem 1rem 1.4rem; border: 2px solid var(--inv-gold); outline: 1px solid color-mix(in srgb, var(--inv-gold) 40%, transparent); outline-offset: 5px; position: relative; }
.inv-chcup { width: 34px; height: 46px; margin: 0 auto; position: relative; }
.inv-chcup::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 22px; border-radius: 0 0 50% 50%/0 0 70% 70%; background: var(--inv-gold); }
.inv-chcup::after { content: ''; position: absolute; top: 20px; left: 14px; width: 6px; height: 26px; background: var(--inv-gold); }
.inv-chhost { position: absolute; top: -16px; left: 50%; transform: translateX(-50%); width: 20px; height: 20px; border-radius: 50%; background: #fffdf4; border: 2px solid var(--inv-gold); }
.inv-chparents b { color: var(--inv-accent); }
.inv-r-chalice .inv-honoree, .inv-r-chalice .inv-acc, .inv-r-chalice .inv-card, .inv-r-chalice .inv-note {
  border: 1px solid var(--inv-gold); outline: 1px solid color-mix(in srgb, var(--inv-gold) 30%, transparent); outline-offset: 3px; box-shadow: none;
}
.inv-r-chalice .inv-photo { border: 1px solid var(--inv-gold); outline: 1px solid color-mix(in srgb, var(--inv-gold) 30%, transparent); outline-offset: 3px; box-shadow: none; }
.inv-r-chalice .inv-erule-sep { border-bottom-color: color-mix(in srgb, var(--inv-gold) 55%, transparent); }

/* ============ Recipe: Valaiyal Glass (rows of bangles) ============
   Coloured glass bangles ring the hero; cards, photos and events all
   pick up a thick bangle-ring border instead of a plain edge. */
.inv-vabangles { display: flex; justify-content: center; gap: 8px; margin-top: 1.7rem; }
.inv-vabangle { width: 42px; height: 42px; border-radius: 50%; border: 8px solid var(--inv-accent); }
.inv-vab-2 { border-color: var(--inv-gold); }
.inv-vab-3 { border-color: color-mix(in srgb, var(--inv-accent) 55%, #2e7d4f); }
.inv-vab-4 { border-color: var(--inv-gold); }
.inv-vafamily b { color: var(--inv-accent); }
.inv-r-valaiyal .inv-honoree, .inv-r-valaiyal .inv-acc, .inv-r-valaiyal .inv-card, .inv-r-valaiyal .inv-note {
  border-radius: 50%/60px; border: 5px solid color-mix(in srgb, var(--inv-gold) 65%, transparent);
}
.inv-r-valaiyal .inv-ecard { border-radius: 50rem; border: 5px solid color-mix(in srgb, var(--inv-accent) 55%, var(--inv-gold)); }
.inv-r-valaiyal .inv-photo { border-radius: 50%; border: 5px solid var(--inv-gold); }

/* ============ Recipe: Little Cradle (a hanging thottil) ============
   The hero swings from two ropes like a cradle; cards round off at
   the bottom the same way, echoing a gentle rocking cradle base. */
.inv-crropes { display: flex; justify-content: space-between; width: 150px; margin: 1.6rem auto 0; height: 34px; }
.inv-crropes span { width: 2px; background: color-mix(in srgb, var(--inv-text) 40%, transparent); }
.inv-crcradle {
  max-width: 230px; margin: 0 auto; padding: 1.3rem 1rem 1.7rem;
  border-radius: 0 0 60% 60%/0 0 45% 45%; background: color-mix(in srgb, #fff 60%, var(--inv-bg));
  border: 2px solid var(--inv-gold); border-top: none;
}
.inv-crfamily b { color: var(--inv-accent); }
.inv-r-cradle .inv-honoree, .inv-r-cradle .inv-acc, .inv-r-cradle .inv-card, .inv-r-cradle .inv-note {
  border-radius: 6px 6px 40px 40px/6px 6px 26px 26px; border-color: color-mix(in srgb, var(--inv-gold) 45%, transparent);
}
.inv-r-cradle .inv-photo { border-radius: 6px 6px 40px 40px/6px 6px 26px 26px; }

/* ============ Recipe: Paal Kaachal (the housewarming milk-boiling) ============
   A toran strip and a boiling milk pot with rising steam open the
   page; the events variant reads as a room-by-room walkthrough. */
.inv-pktoran { height: 16px; background: conic-gradient(from 135deg at 50% 0, var(--inv-accent) 90deg, transparent 0); background-size: 20px 16px; background-repeat: repeat-x; }
.inv-pkpot { width: 60px; height: 50px; margin: 1.8rem auto 0; position: relative; }
.inv-pkpot::before { content: ''; position: absolute; bottom: 0; left: 0; right: 0; height: 36px; border-radius: 0 0 30px 30px/0 0 40px 40px; background: var(--inv-gold); }
.inv-pkboil { position: absolute; top: -14px; left: 50%; width: 8px; height: 16px; transform: translateX(-50%);
  background: linear-gradient(color-mix(in srgb, #fff 80%, transparent), transparent); border-radius: 50%; opacity: .75;
  animation: inv-pksteam 2.2s ease-in-out infinite;
}
@keyframes inv-pksteam { 0%, 100% { transform: translateX(-50%) translateY(0); opacity: .75; } 50% { transform: translateX(-50%) translateY(-8px); opacity: .3; } }
.inv-pkaddr { font-size: .85rem; opacity: .8; margin-top: .3rem; }
.inv-r-paalkaachal .inv-honoree, .inv-r-paalkaachal .inv-acc, .inv-r-paalkaachal .inv-card, .inv-r-paalkaachal .inv-note {
  border-top: 4px solid var(--inv-gold); border-radius: 4px 4px 14px 14px;
}
.inv-r-paalkaachal .inv-plist-row { border-top-color: var(--inv-gold); }
.inv-r-paalkaachal .inv-photo { border-radius: 4px 4px 14px 14px; }

/* ============ Recipe: New Nest Keys (a fresh set of keys) ============
   A simple CSS house outline and a key open the page; every card
   picks up a thin gold roofline border echoing the house shape. */
.inv-nkhouse { width: 70px; margin: 1.8rem auto 0; }
.inv-nkroof { display: block; width: 0; height: 0; border-left: 35px solid transparent; border-right: 35px solid transparent; border-bottom: 30px solid var(--inv-accent); margin: 0 auto; }
.inv-nkbody { display: flex; align-items: flex-end; justify-content: center; width: 56px; height: 44px; margin: -2px auto 0; border: 3px solid var(--inv-accent); border-top: none; background: color-mix(in srgb, #fff 60%, var(--inv-bg)); }
.inv-nkdoor { width: 16px; height: 26px; background: var(--inv-gold); border-radius: 4px 4px 0 0; }
.inv-nkkey { font-size: 1.6rem; margin-top: .4rem; }
.inv-nkaddr { font-size: .85rem; opacity: .8; margin-top: .2rem; }
.inv-r-nestkeys .inv-honoree, .inv-r-nestkeys .inv-acc, .inv-r-nestkeys .inv-card, .inv-r-nestkeys .inv-note {
  border-top: 3px solid var(--inv-accent); border-radius: 4px;
}
.inv-r-nestkeys .inv-photo { border-radius: 4px; }

/* ============ Recipe: Shashti Mangalam (the 60th, re-wed like a wedding) ============
   A grand "60" sits inside a temple-arch medallion; cards take the
   same rounded-arch echo used across the ceremonial designs. */
.inv-shsarch {
  width: 140px; height: 140px; margin: 1.8rem auto 0; border-radius: 70px 70px 8px 8px;
  border: 3px solid var(--inv-gold); display: flex; align-items: center; justify-content: center;
  background: color-mix(in srgb, var(--inv-gold) 14%, var(--inv-bg));
}
.inv-shsnum { font-family: var(--inv-heading-font); font-size: 3.2rem; font-weight: 700; color: var(--inv-accent); }
.inv-shsline { font-family: var(--inv-heading-font); font-style: italic; font-size: .95rem; margin-top: .5rem; opacity: .85; }
.inv-r-shashti .inv-honoree, .inv-r-shashti .inv-acc, .inv-r-shashti .inv-card, .inv-r-shashti .inv-note {
  border-radius: 60px 60px 14px 14px; border: 2px solid color-mix(in srgb, var(--inv-gold) 55%, transparent);
}
.inv-r-shashti .inv-ecard { border-radius: 40px 40px 12px 12px; }
.inv-r-shashti .inv-photo { border-radius: 50%; border: 3px solid var(--inv-gold); }

/* ============ Recipe: Golden Number (a giant foil milestone numeral) ============
   The age itself becomes the hero, rendered as a huge foil-gradient
   numeral instead of a name - cards pick up a matching gold edge. */
.inv-gnnum {
  font-family: var(--inv-heading-font); font-size: clamp(5rem, 24vw, 9rem); line-height: .85; font-weight: 700;
  background: linear-gradient(140deg, var(--inv-gold), color-mix(in srgb, var(--inv-gold) 35%, #fff) 50%, var(--inv-gold));
  -webkit-background-clip: text; background-clip: text; color: transparent;
}
.inv-r-golden .inv-honoree, .inv-r-golden .inv-acc, .inv-r-golden .inv-card, .inv-r-golden .inv-note {
  border: 1.5px solid var(--inv-gold); border-radius: 8px; box-shadow: none;
}
.inv-r-golden .inv-photo { border: 1.5px solid var(--inv-gold); border-radius: 8px; box-shadow: none; }
.inv-r-golden .inv-heading { text-align: center; }

/* ============ Recipe: Ring & Rose (the proposal, engagement-specific) ============
   A single CSS solitaire ring opens the page; cards take a softer,
   rose-tinted wash suited to the earlier chapter of the story. */
.inv-rgring { width: 64px; height: 64px; margin: 1.8rem auto 0; border-radius: 50%; border: 8px solid var(--inv-gold); position: relative; }
.inv-rgstone { position: absolute; top: -13px; left: 50%; width: 16px; height: 16px; background: var(--inv-accent); transform: translateX(-50%) rotate(45deg); }
.inv-r-ringrose .inv-alt { background-color: color-mix(in srgb, var(--inv-accent) 8%, var(--inv-alt-bg)); }
.inv-r-ringrose .inv-honoree, .inv-r-ringrose .inv-acc, .inv-r-ringrose .inv-card, .inv-r-ringrose .inv-note {
  border-radius: 50rem 50rem 12px 12px; border-top: 3px solid var(--inv-gold);
}
.inv-r-ringrose .inv-photo { border-radius: 50%; }

/* ============ Recipe: Evergreen Vows (wedding anniversary) ============
   A laurel-ring medal holds the years count; cards pick up a soft
   leaf-corner shape echoing the wreath. */
.inv-evwreath {
  width: 128px; height: 128px; margin: 1.8rem auto 0; border-radius: 50%;
  border: 3px solid var(--inv-accent); outline: 3px solid var(--inv-gold); outline-offset: 4px;
  display: flex; align-items: center; justify-content: center;
  background: color-mix(in srgb, var(--inv-gold) 10%, var(--inv-bg));
}
.inv-evyears { font-family: var(--inv-heading-font); font-size: 2.6rem; font-weight: 700; color: var(--inv-accent); }
.inv-r-evergreen .inv-honoree, .inv-r-evergreen .inv-acc, .inv-r-evergreen .inv-card, .inv-r-evergreen .inv-note {
  border-radius: 4px 24px 4px 24px; border-left: 3px solid var(--inv-gold);
}
.inv-r-evergreen .inv-photo { border-radius: 4px 24px 4px 24px; }

/* ============ Recipe: New Chapter (retirement) ============
   A small open book opens the page; cards take a double gold top
   rule echoing a certificate of service. */
.inv-ncbook { width: 84px; height: 54px; margin: 1.8rem auto 0; display: flex; }
.inv-ncpage { flex: 1; background: color-mix(in srgb, #fff 70%, var(--inv-bg)); border: 2px solid var(--inv-accent); }
.inv-ncpage-1 { border-radius: 6px 0 0 30px; border-right: none; }
.inv-ncpage-2 { border-radius: 0 6px 30px 0; border-left: none; }
.inv-ncrole { font-style: italic; opacity: .85; font-size: .95rem; }
.inv-r-newchapter .inv-honoree, .inv-r-newchapter .inv-acc, .inv-r-newchapter .inv-card, .inv-r-newchapter .inv-note {
  border-top: 3px double var(--inv-gold); border-radius: 2px; box-shadow: none;
}
.inv-r-newchapter .inv-photo { border-radius: 2px; border: 1px solid var(--inv-accent); }

/* ============ Recipe: Little Steps (naming ceremony / thottil) ============
   A trail of tiny footprints opens the page; cards take a soft
   nursery-rounded shape. */
.inv-lstrail { display: flex; justify-content: center; align-items: flex-end; gap: 10px; margin: 1.8rem auto 0; height: 40px; }
.inv-lsfoot { width: 14px; height: 20px; border-radius: 50% 50% 50% 50%/60% 60% 40% 40%; background: var(--inv-gold); opacity: .85; }
.inv-lsfoot-1 { transform: translateY(6px) rotate(-8deg); }
.inv-lsfoot-2 { transform: translateY(-4px) rotate(6deg); }
.inv-lsfoot-3 { transform: translateY(6px) rotate(-6deg); }
.inv-lsfoot-4 { transform: translateY(-4px) rotate(8deg); }
.inv-lsfamily b { color: var(--inv-accent); }
.inv-r-footprints .inv-honoree, .inv-r-footprints .inv-acc, .inv-r-footprints .inv-card, .inv-r-footprints .inv-note {
  border-radius: 20px; border: 1.5px solid color-mix(in srgb, var(--inv-gold) 40%, transparent);
}
.inv-r-footprints .inv-photo { border-radius: 20px; }

/* ============ Recipe: Turmeric Bloom (Manjal Neerattu Vizha) ============
   A five-petal CSS flower blooms over the name; cards pick up a
   rounded floral-corner echo. */
.inv-mnbloom { position: relative; width: 100px; height: 100px; margin: 1.8rem auto 0; }
.inv-mnpetal { position: absolute; top: 0; left: 50%; width: 26px; height: 50px; margin-left: -13px; transform-origin: 50% 100%; background: var(--inv-gold); border-radius: 50%; opacity: .85; }
.inv-mnpetal-1 { transform: rotate(0deg); }
.inv-mnpetal-2 { transform: rotate(72deg); }
.inv-mnpetal-3 { transform: rotate(144deg); }
.inv-mnpetal-4 { transform: rotate(216deg); }
.inv-mnpetal-5 { transform: rotate(288deg); }
.inv-mncenter { position: absolute; top: 50%; left: 50%; width: 22px; height: 22px; margin: -11px 0 0 -11px; border-radius: 50%; background: var(--inv-accent); }
.inv-mnfamily b { color: var(--inv-accent); }
.inv-r-manjal .inv-honoree, .inv-r-manjal .inv-acc, .inv-r-manjal .inv-card, .inv-r-manjal .inv-note {
  border-radius: 30px 6px 30px 6px; border: 1.5px solid color-mix(in srgb, var(--inv-gold) 40%, transparent);
}
.inv-r-manjal .inv-photo { border-radius: 30px 6px 30px 6px; }

/* ---------- Reduced motion (consolidated) ---------- */
@media (prefers-reduced-motion: reduce) {
  .inv-jstart { animation: none; }
  .inv-r-scrollstory .inv-section, .inv-r-scrollstory .inv-cshero { animation: none; }
  .inv-vlflame { animation: none; }
  .inv-pxstart { animation: none; }
  .inv-pkboil { animation: none; }
}

/* ---------- Footer / preview bar ---------- */
.inv-footer { background: var(--inv-alt-bg); }
.inv-footer a { color: var(--inv-accent); }
.preview-bar { background: #2b2723; color: #fff; }
.preview-bar a { color: var(--inv-gold, #f0a92e); }

/* ============ Themes (bg / alt / text / accent / gold) ============ */
.theme-cathedral-white { --inv-bg:#fdfdfd; --inv-alt-bg:#f1f3f7; --inv-text:#2f3237; --inv-accent:#5f739c; --inv-gold:#b9a44c; }
.theme-tamil-classic   { --inv-bg:#fff8ec; --inv-alt-bg:#f9ecd2; --inv-text:#4a2c12; --inv-accent:#a4530a; --inv-gold:#c9931f; }
.theme-royal-maroon    { --inv-bg:#fff6f4; --inv-alt-bg:#f6e3e0; --inv-text:#3d2224; --inv-accent:#7b1e2b; --inv-gold:#c9a227; }
.theme-pastel-rose     { --inv-bg:#fff9fa; --inv-alt-bg:#fceef1; --inv-text:#4a3a3e; --inv-accent:#c96a86; --inv-gold:#d4b16a; }
.theme-marigold        { --inv-bg:#fffbf0; --inv-alt-bg:#fdf1d2; --inv-text:#4a3a12; --inv-accent:#c67c0e; --inv-gold:#e0a92c; }
.theme-confetti        { --inv-bg:#fdfdff; --inv-alt-bg:#eef4ff; --inv-text:#333;    --inv-accent:#5561d9; --inv-gold:#e8b23a; }
.theme-dove-sky        { --inv-bg:#fbfdff; --inv-alt-bg:#e9f2fa; --inv-text:#2f3a44; --inv-accent:#4b88b8; --inv-gold:#c8b273; }
.theme-kolam           { --inv-bg:#fffdf6; --inv-alt-bg:#f3efdd; --inv-text:#3c3a28; --inv-accent:#7c8a2e; --inv-gold:#c9a227; }
