/* arabic */
@font-face {
  font-family: 'Baloo Bhaijaan 2';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url(/theme-assets/_fonts/baloo-bhaijaan-2-500-arabic.woff2) format("woff2");
  unicode-range: U+0600-06FF, U+0750-077F, U+0870-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC7, U+10EC9-10EEE, U+10EF0-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1;
}
/* latin-ext */
@font-face {
  font-family: 'Baloo Bhaijaan 2';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url(/theme-assets/_fonts/baloo-bhaijaan-2-500-latin-ext.woff2) format("woff2");
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'Baloo Bhaijaan 2';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url(/theme-assets/_fonts/baloo-bhaijaan-2-500-latin.woff2) format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* arabic */
@font-face {
  font-family: 'Baloo Bhaijaan 2';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url(/theme-assets/_fonts/baloo-bhaijaan-2-700-arabic.woff2) format("woff2");
  unicode-range: U+0600-06FF, U+0750-077F, U+0870-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC7, U+10EC9-10EEE, U+10EF0-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1;
}
/* latin-ext */
@font-face {
  font-family: 'Baloo Bhaijaan 2';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url(/theme-assets/_fonts/baloo-bhaijaan-2-700-latin-ext.woff2) format("woff2");
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'Baloo Bhaijaan 2';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url(/theme-assets/_fonts/baloo-bhaijaan-2-700-latin.woff2) format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* arabic */
@font-face {
  font-family: 'Baloo Bhaijaan 2';
  font-style: normal;
  font-weight: 800;
  font-display: swap;
  src: url(/theme-assets/_fonts/baloo-bhaijaan-2-800-arabic.woff2) format("woff2");
  unicode-range: U+0600-06FF, U+0750-077F, U+0870-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC7, U+10EC9-10EEE, U+10EF0-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1;
}
/* latin-ext */
@font-face {
  font-family: 'Baloo Bhaijaan 2';
  font-style: normal;
  font-weight: 800;
  font-display: swap;
  src: url(/theme-assets/_fonts/baloo-bhaijaan-2-800-latin-ext.woff2) format("woff2");
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'Baloo Bhaijaan 2';
  font-style: normal;
  font-weight: 800;
  font-display: swap;
  src: url(/theme-assets/_fonts/baloo-bhaijaan-2-800-latin.woff2) format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

/* arabic */
@font-face {
  font-family: 'Tajawal';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/theme-assets/_fonts/tajawal-400-arabic.woff2) format("woff2");
  unicode-range: U+0600-06FF, U+0750-077F, U+0870-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC7, U+10EC9-10EEE, U+10EF0-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1;
}
/* latin */
@font-face {
  font-family: 'Tajawal';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/theme-assets/_fonts/tajawal-400-latin.woff2) format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* arabic */
@font-face {
  font-family: 'Tajawal';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url(/theme-assets/_fonts/tajawal-500-arabic.woff2) format("woff2");
  unicode-range: U+0600-06FF, U+0750-077F, U+0870-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC7, U+10EC9-10EEE, U+10EF0-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1;
}
/* latin */
@font-face {
  font-family: 'Tajawal';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url(/theme-assets/_fonts/tajawal-500-latin.woff2) format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* arabic */
@font-face {
  font-family: 'Tajawal';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url(/theme-assets/_fonts/tajawal-700-arabic.woff2) format("woff2");
  unicode-range: U+0600-06FF, U+0750-077F, U+0870-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC7, U+10EC9-10EEE, U+10EF0-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1;
}
/* latin */
@font-face {
  font-family: 'Tajawal';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url(/theme-assets/_fonts/tajawal-700-latin.woff2) format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* arabic */
@font-face {
  font-family: 'Tajawal';
  font-style: normal;
  font-weight: 800;
  font-display: swap;
  src: url(/theme-assets/_fonts/tajawal-800-arabic.woff2) format("woff2");
  unicode-range: U+0600-06FF, U+0750-077F, U+0870-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC7, U+10EC9-10EEE, U+10EF0-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1;
}
/* latin */
@font-face {
  font-family: 'Tajawal';
  font-style: normal;
  font-weight: 800;
  font-display: swap;
  src: url(/theme-assets/_fonts/tajawal-800-latin.woff2) format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

/*
 * Invitation engine: structure shared by every theme (from the reference prototype).
 * The <html> element carries the theme code as a class (e.g. "royal"); each theme's styles.css
 * sets the tokens below and skins the blocks under that class.
 */

:root {
  color-scheme: light;
  --bg: #F4F2EE; --bg-hi: #FFFFFF; --surface: #FFFFFF;
  --ink: #26241F; --muted: #625D53; --line: #DDD6C8; --hi: #FFFFFF;
  --accent: #6B5530; --link: #6B5530;
  --shadow: rgba(40, 30, 10, .12);
  --gold-1: var(--accent); --gold-2: var(--accent); --gold-3: var(--line); --gold-4: var(--line);
  --gold: var(--accent);
  --c1: #FF5A5F; --c2: #FFC531; --c3: #2EC4B6; --c4: #7B5CFA; --c5: #FF8FB1;
  --font-display-ar: serif;
  --font-display-lat: serif;
  --font-text-ar: serif;
  --font-text-lat: serif;
  --font-ui: system-ui, sans-serif;
}

* { box-sizing: border-box; }
[hidden] { display: none !important; }
/* Names can be long and sit in boxes sized by their content, where only "anywhere" lets them wrap. */
.name, .names, .gate-names, .nameplate { overflow-wrap: anywhere; max-inline-size: 100%; }
html { -webkit-text-size-adjust: 100%; }
body {
  margin: 8px;
  overflow-wrap: break-word; /* long names never leave their frame; "anywhere" would also let countdown cells shrink and cut their labels */
  hyphens: auto; /* follows the language of the html element */
  background-color: var(--bg);
  background-image: radial-gradient(ellipse at 50% 28%, var(--bg-hi), var(--bg) 72%);
  background-attachment: fixed;
  color: var(--ink); font-family: var(--font-ui); font-size: 16px; line-height: 1.7;
  padding-inline: 32px; padding-block: 36px 96px; overflow-x: clip;
}
body.has-bar { padding-block-end: 150px; }
body.locked { overflow: hidden; }
:focus-visible { outline: 2px solid var(--gold-2); outline-offset: 3px; }

.svg-defs { position: absolute; width: 0; height: 0; }
.wrap { max-width: 520px; margin-inline: auto; display: flex; flex-direction: column; gap: 56px; position: relative; }
section, header { position: relative; z-index: 1; }
h2 { margin: 0; text-wrap: balance; }
.lattice { position: fixed; inset: 0; width: 100%; height: 100%; pointer-events: none; z-index: 0; }
#sparkle { position: fixed; inset: 0; width: 100%; height: 100%; pointer-events: none; z-index: 2; }

/* SVG colour utilities (the CSP forbids inline style attributes) */
.f-c1 { fill: var(--c1); } .f-c2 { fill: var(--c2); } .f-c3 { fill: var(--c3); } .f-c4 { fill: var(--c4); } .f-c5 { fill: var(--c5); }
.f-ink { fill: var(--ink); }
.s-ink { stroke: var(--ink); } .s-c1 { stroke: var(--c1); } .s-c3 { stroke: var(--c3); } .s-c4 { stroke: var(--c4); }
.s-hi { stroke: var(--hi); } .s-line { stroke: var(--line); }

/* ---------- shared structure ---------- */
.topbar { display: flex; justify-content: flex-end; }
.lang { font: 500 14px var(--font-ui); border-radius: 999px; padding: 6px 16px; cursor: pointer; text-decoration: none; }
.hero { display: flex; flex-direction: column; align-items: center; gap: 24px; text-align: center; }
.hero > * { position: relative; z-index: 1; }
.name, h2, .sign, .day, .gate-names { font-family: var(--font-display-ar); }
:root[lang="fr"] .name, :root[lang="fr"] h2, :root[lang="fr"] .sign, :root[lang="fr"] .gate-names { font-family: var(--font-display-lat); }
.tagline, .close p, .msg { font-family: var(--font-text-ar); }
:root[lang="fr"] .tagline, :root[lang="fr"] .close p, :root[lang="fr"] .msg { font-family: var(--font-text-lat); }
.date { display: flex; flex-direction: column; align-items: center; gap: 28px; text-align: center; }
.datecard { display: flex; align-items: center; gap: 20px; direction: ltr; }
.dmeta { display: flex; flex-direction: column; gap: 2px; text-align: start; padding-inline-start: 18px; position: relative; }
.count { display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; width: 100%; direction: ltr; }
.cell { display: flex; flex-direction: column; align-items: center; min-width: 0; padding: 14px 4px 10px; }
.cell b { font-variant-numeric: tabular-nums; line-height: 1.1; }
.cell span { font-size: 13px; }
.done { grid-column: 1 / -1; text-align: center; font-size: 20px; }
.program { display: flex; flex-direction: column; gap: 22px; }
.program h2 { text-align: center; }
.events { display: flex; flex-direction: column; }
.ev { display: grid; grid-template-columns: 76px 1fr; gap: 18px; padding-block: 18px; align-items: center; position: relative; }
.ev-d { display: flex; flex-direction: column; align-items: center; line-height: 1.1; direction: ltr; }
.ev-b { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.ev-b h3 { margin: 0; font: 700 18px var(--font-ui); }
.where { color: var(--muted); font-size: 15px; }
.maps { display: flex; flex-wrap: wrap; gap: 4px 16px; margin-top: 6px; }
.maplink { align-self: flex-start; font-size: 14px; font-weight: 500; color: var(--link); text-decoration: underline; text-underline-offset: 4px; }
.venue { display: flex; flex-direction: column; align-items: center; gap: 0; }
.venue .maps { justify-content: center; margin-top: 0; }
.message { text-align: center; }
.message .msg { margin: 0; font-size: 20px; line-height: 1.6; white-space: pre-line; }
.dresscode { text-align: center; display: flex; flex-direction: column; gap: 4px; }
.dresscode small { font-size: 13px; letter-spacing: .08em; text-transform: uppercase; color: var(--muted); }
.photo { display: flex; justify-content: center; }
.photo-frame { width: min(100%, 360px); }
.photo img { display: block; width: 100%; height: auto; }
.transport { text-align: center; display: flex; flex-direction: column; align-items: center; gap: 16px; }
.transport-details { margin: 0; max-width: 34ch; white-space: pre-line; }
.close { text-align: center; display: flex; flex-direction: column; align-items: center; gap: 14px; }
.close p { margin: 0; max-width: 30ch; color: var(--muted); font-size: 21px; }
.divider { display: flex; justify-content: center; margin-block: -24px; position: relative; z-index: 1; }
.divider svg { width: min(280px, 80%); height: 28px; }

/* ---------- intro gate ---------- */
.gate { position: fixed; inset: 0; z-index: 20; display: none; place-items: center; overflow: hidden; background: radial-gradient(ellipse at 50% 40%, var(--bg-hi), var(--bg) 75%); }
.js .gate { display: grid; }
.js.gate-skip .gate { display: none; }
/* While the intro covers the screen, the invitation is laid out only after page load, so its fonts
   do not compete with the intro's first paint; they download while the guest looks at the intro. */
.js:not(.gate-skip):not(.app-ready) #app { display: none; }
.gate-in { position: relative; z-index: 1; display: flex; flex-direction: column; align-items: center; gap: 22px; text-align: center; padding: 16px; }
.gate-kicker { font-size: 13px; letter-spacing: .3em; text-transform: uppercase; color: var(--muted); }
.gate-names { font-weight: 600; font-size: 40px; line-height: 1.15; }
.gate-hint { font-size: 14px; letter-spacing: .12em; color: var(--gold-1); }
.gate-btn { border: 0; padding: 0; background: none; cursor: pointer; border-radius: 50%; }
.gate.open .gate-in { opacity: 0; transform: scale(.92); }

/* ---------- embedded demo (home page): no scrollbar, it scrolls by itself ---------- */
:root.embed, :root.still { scrollbar-width: none; }
:root.embed::-webkit-scrollbar, :root.embed body::-webkit-scrollbar, :root.still::-webkit-scrollbar { display: none; }

/* ---------- demo chrome ---------- */
.bar { position: fixed; z-index: 30; left: 50%; transform: translateX(-50%); bottom: calc(14px + env(safe-area-inset-bottom, 0px)); display: flex; align-items: center; gap: 6px; padding: 6px; border-radius: 999px; background: rgba(24, 20, 34, .9); backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px); box-shadow: 0 10px 30px rgba(0,0,0,.25); max-width: calc(100% - 24px); font-family: var(--font-ui); }
.bar span { font: 700 14px var(--font-ui); padding: 9px 14px; color: #E9E4F2; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.bar a { font: 700 14px var(--font-ui); border-radius: 999px; padding: 9px 16px; background: #F1DDA0; color: #2A2010; white-space: nowrap; text-decoration: none; }
.bar :focus-visible { outline: 2px solid #F1DDA0; outline-offset: 2px; }

@media (max-width: 380px) {
  body { padding-inline: 20px; }
}

@media (prefers-reduced-motion: no-preference) {
  .gate-in { transition: opacity .5s ease, transform .6s ease; }
  .reveal .hero > :not(.balloon) { animation: rise .9s cubic-bezier(.2,.7,.2,1) both; }
  .reveal .hero > *:nth-child(2) { animation-delay: .12s; }
  .reveal .hero > *:nth-child(3) { animation-delay: .24s; }
  .reveal .hero > *:nth-child(4) { animation-delay: .36s; }
  .reveal .hero > *:nth-child(5) { animation-delay: .48s; }
  @keyframes rise { from { opacity: .001; transform: translateY(18px); } }
}

/* ---------- published page ---------- */
.calendar-link { align-self: center; }
/* "Created with" signature (SIG-01): small, no background, frame or animation; a theme may tune --brand-sig-color and
   --brand-sig-font (contrast >= 4.5:1 on its background), never remove it. 44 px high touch target. */
.signature { position: relative; z-index: 1; display: flex; justify-content: center; padding-block: 8px; }
.brand-sig { margin: 0; text-align: center; }
.brand-sig__link { display: inline-flex; align-items: center; justify-content: center; gap: 6px; min-block-size: 44px; padding-inline: 10px;
  color: var(--brand-sig-color, var(--muted)); font: 500 12px/1.3 var(--brand-sig-font, var(--font-ui)); text-decoration: none; }
.brand-sig__link:hover span, .brand-sig__link:focus-visible span { text-decoration: underline; }
.brand-sig__mark { inline-size: 16px; block-size: 16px; flex: none; }
/* RSVP thank-you (SIG-04): a separate, quieter line under the confirmation. */
.brand-sig-cta { margin: 8px 0 0; padding-block-start: 12px; border-block-start: 1px solid var(--line); color: var(--brand-sig-color, var(--muted));
  font: 400 13px/1.5 var(--brand-sig-font, var(--font-ui)); text-align: center; }
.brand-sig-cta a { display: inline-block; min-block-size: 44px; line-height: 44px; color: inherit; font-weight: 600; text-decoration: underline; }

/* ---------- guests & RSVP (PRD F-05, F-06) ---------- */
.guest-greeting { margin: 0; text-align: center; font-family: var(--font-text-ar); font-size: 22px; color: var(--accent); }
:root[lang="fr"] .guest-greeting { font-family: var(--font-text-lat); }
.rsvp { display: flex; flex-direction: column; align-items: center; gap: 16px; text-align: center; }
.rsvp-note, .rsvp-saved { margin: 0; color: var(--muted); }
.rsvp-saved { color: var(--accent); font-weight: 700; }
.rsvp-errors { margin: 0; padding: 12px 16px; list-style: none; border-radius: 12px; background: #fdecec; color: #8a1c1c; text-align: start; }
.rsvp-form { width: 100%; min-inline-size: 0; }
.rsvp-form *, .rsvp-form *::before, .rsvp-form *::after { box-sizing: border-box; }
/* min-inline-size: a fieldset otherwise refuses to be narrower than its content, and pushes the form off the screen. */
.rsvp-form > fieldset { display: flex; flex-direction: column; gap: 14px; margin: 0; padding: 20px; min-inline-size: 0; border: 1px solid var(--line); border-radius: 16px; background: var(--surface); text-align: start; }
.rsvp-form > fieldset:disabled { opacity: .75; }
/* Side by side when they fit, one under the other otherwise. */
.rsvp-choice { display: flex; flex-wrap: wrap; gap: 10px; }
.choice-pill { flex: 1 1 7.5rem; min-inline-size: 0; position: relative; display: flex; align-items: center; justify-content: center; padding: 12px 8px; border: 1.5px solid var(--line); border-radius: 999px; font-weight: 700; text-align: center; cursor: pointer; }
.choice-pill input { position: absolute; opacity: 0; inset: 0; margin: 0; cursor: pointer; }
.choice-pill:has(input:checked) { background: var(--accent); border-color: var(--accent); color: var(--surface); }
.choice-pill:has(input:focus-visible) { outline: 2px solid var(--accent); outline-offset: 3px; }
.rsvp-field { min-inline-size: 0; display: flex; flex-direction: column; gap: 6px; font-weight: 600; font-size: 15px; }
.rsvp-field small { font-weight: 400; color: var(--muted); }
.rsvp-field input, .rsvp-field textarea { width: 100%; max-inline-size: 100%; min-inline-size: 0; padding: 10px 12px; border: 1px solid var(--line); border-radius: 10px; background: var(--hi); color: var(--ink); font: 400 16px var(--font-ui); }
.rsvp-steps { margin: 0; padding: 0; border: 0; display: flex; flex-direction: column; gap: 6px; }
.rsvp-steps legend { font-weight: 600; font-size: 15px; margin-bottom: 4px; }
.rsvp-check { display: flex; align-items: center; gap: 8px; }
.rsvp-check input { width: 18px; height: 18px; accent-color: var(--accent); }
/* Not coming: no party size nor steps to fill in. */
.rsvp-form:has(input[name="attending"][value="no"]:checked) :is(.rsvp-people, .rsvp-steps) { display: none; }
.rsvp-hp { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
.rsvp-submit { max-inline-size: 100%; white-space: normal; padding: 14px 20px; border: 0; border-radius: 999px; background: var(--accent); color: var(--surface); font: 700 16px var(--font-ui); cursor: pointer; }
.rsvp-submit:disabled { cursor: not-allowed; }

/* Guests' photo album (Blocks/Album.cshtml): same form look as the RSVP, a progress line while the photos are sent. */
.album { display: flex; flex-direction: column; align-items: center; gap: 16px; text-align: center; }
.album-form input[type="file"] { padding: 10px 0; font: 400 15px var(--font-ui); color: var(--ink); }
.album-progress { width: 100%; height: 8px; accent-color: var(--accent); }
.album-status:empty { display: none; }
.album-problem { color: #8a1c1c; }
.visually-hidden { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }

/* Sound button of the published invitation (background music, never autoplay). */
.sound { position: fixed; inset-block-end: 16px; inset-inline-end: 16px; z-index: 40; inline-size: 44px; block-size: 44px;
  display: grid; place-items: center; border-radius: 50%; border: 1px solid currentColor; background: rgb(0 0 0 / .45); color: #fff; cursor: pointer; }
.sound svg { inline-size: 22px; block-size: 22px; }
.sound[aria-pressed="false"]::after { content: ""; position: absolute; inline-size: 26px; block-size: 2px; background: currentColor; transform: rotate(-45deg); }
.sound:focus-visible { outline: 2px solid #fff; outline-offset: 2px; }
.sound[hidden] { display: none; }

/* Private preview: switch between the desktop page and the phone frame (pointless on a phone). */
.bar a.bar-view { background: transparent; color: #E9E4F2; box-shadow: inset 0 0 0 1px rgba(233, 228, 242, .35); }
.bar a.bar-view[aria-current="true"] { background: rgba(233, 228, 242, .22); color: #fff; }
@media (max-width: 599px) { .bar a.bar-view { display: none; } }
/* Showcase bar: the consent line stays whole (it names the people who agreed), on two lines if needed. */
.bar--showcase { border-radius: 22px; width: max-content; }
.bar--showcase span { white-space: normal; font-weight: 600; font-size: 13px; line-height: 1.35; padding-block: 6px; padding-inline: 12px 6px; }

/* Inside the phone frame of the private preview: scrolling works, but no desktop scrollbar on a phone screen. */
html.framed { scrollbar-width: none; }
html.framed::-webkit-scrollbar { display: none; }

/* Handwriting style of the names chosen in the editor (InvitationContent.NamesFont). Latin text only: Arabic names keep the theme's Arabic font. */
html.names-allura { --names-font: "Allura"; }
html.names-great-vibes { --names-font: "Great Vibes"; }
html.names-pinyon-script { --names-font: "Pinyon Script"; }
html.names-parisienne { --names-font: "Parisienne"; }
html.names-custom:lang(fr) :is(.name, .gate-names, .sign) {
  font-family: var(--names-font), "Cormorant Garamond", cursive !important;
  font-style: normal !important; font-weight: 400 !important; letter-spacing: normal !important; text-transform: none !important;
}

/* Calligraphy style of the Arabic names (InvitationContent.NamesFontAr). */
html.names-ar-scheherazade-new { --names-ar-font: "Scheherazade New"; --names-ar-weight: 700; }
html.names-ar-noto-nastaliq-urdu { --names-ar-font: "Noto Nastaliq Urdu"; --names-ar-weight: 600 }
html.names-ar-lemonada { --names-ar-font: "Lemonada"; --names-ar-weight: 600; }
html.names-ar-mirza { --names-ar-font: "Mirza"; --names-ar-weight: 700; }
html.names-ar-aref-ruqaa { --names-ar-font: "Aref Ruqaa"; --names-ar-weight: 700; }
html.names-ar-noto-nastaliq-urdu:lang(ar) :is(.name, .gate-names, .sign) { line-height: 2.1 !important; }
html.names-ar-custom:lang(ar) :is(.name, .gate-names, .sign) {
  font-family: var(--names-ar-font), "Amiri", serif !important;
  font-style: normal !important; font-weight: var(--names-ar-weight, 700) !important; letter-spacing: normal !important;
}

/* ---------- opening video, shared (_engine/IntroVideo.cshtml + _engine/PhotoHero.cshtml) ----------
   For a theme whose Intro and Hero blocks render these partials when theme.json has "introVideo". The theme only sets, on :root.{code}:
   --hit-w, --hit-h, --hit-y, --hit-r  the object to touch in the video's 720×1280 first frame (size, centre below the middle, radius)
   --shot                              url() of the video's last frame (img/video-end-*.webp): the picture behind the names
   --veil, --text-top                  what keeps the names readable over that picture, and where they sit
   --text-delay                        video seconds + 0.2 s: the names come in once the gate has dissolved
   --hint-bg, --hint-ink, --hint-ring  the "touch…" pill; --frame-1..3 the rings around the portrait arch on computers.
   Phones: full screen. Computers: a centred arch with the video's own 9:16 ratio, so nothing is cropped. The picture and the video
   are the same pixels at both ends, so the opening never jumps. Without playback (reduced motion, Save-Data, not loaded…) the
   picture simply dissolves. */
/* A theme that draws its intro on the gate itself (royal's and bordeaux's two panels) does not draw it over the video. */
:root .gate:has(.v-env)::before, :root .gate:has(.v-env)::after { display: none; }
.gate:has(.v-env) { container-type: size; --s: max(100cqw / 720, 100cqh / 1280); --gate-ms: 700; background: var(--bg); }
.v-env { position: absolute; inset: 0; overflow: hidden; }
.v-poster, .v-video { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.v-video { opacity: 0; pointer-events: none; }
:root.video-intro .gate.video-playing .v-video { opacity: 1; }
.gate:has(.v-env) .v-in { position: absolute; inset: 0; display: block; padding: 0; }
.gate .v-in .v-hit {
  position: absolute; left: 50%; top: 50%; width: calc(var(--s) * var(--hit-w, 400)); height: calc(var(--s) * var(--hit-h, 400));
  translate: -50% calc(var(--s) * var(--hit-y, 0) - 50%); border-radius: calc(var(--s) * var(--hit-r, 0)); cursor: pointer;
}
.gate .v-in .v-hit:focus-visible { outline: 3px solid var(--gold-3); outline-offset: 4px; }
.gate .v-in .v-hint {
  position: absolute; inset-inline: 0; bottom: 5%; width: fit-content; margin-inline: auto; padding: 6px 18px; border-radius: 999px;
  background: var(--hint-bg, rgba(255, 255, 255, .9)); color: var(--hint-ink, var(--accent)); font: 600 14px var(--font-ui); letter-spacing: .08em;
  box-shadow: 0 0 0 1px var(--hint-ring, transparent);
}
/* Scaled down inside a site page (phones of the home page, site.js sets --host-scale): the hint keeps 12.5 px on screen,
   on a light pill with dark ink (DES-13). */
:root.hosted .gate .gate-hint, :root.hosted .gate .v-in .v-hint {
  font-size: max(14px, calc(12.5px / var(--host-scale, 1))) !important; letter-spacing: .04em !important;
  padding: .3em 1em; border-radius: 999px; background: rgba(255, 253, 248, .94) !important; color: #3d2f12 !important;
  box-shadow: 0 1px 3px rgba(0, 0, 0, .18);
}
:root.hosted .gate .gate-hint { width: fit-content; margin-inline: auto; max-width: 92%; }
.gate:has(.v-env).open { opacity: 0; transition: opacity .6s ease; }
:root.video-intro .gate:has(.v-env).open { opacity: 1; transition: opacity .45s ease; }
:root.video-intro .gate:has(.v-env).open .v-in { opacity: 0; pointer-events: none; transition: opacity .25s ease; }
:root.video-intro .gate:has(.v-env).open.video-end { opacity: 0; }
/* Full screen width whatever the flex centering does (iOS Safari kept it to the column, leaving two bands): the negative margins reach the
   screen edges from the column, the body's 8 px margin + 32 px padding. */
.v-stage { position: relative; flex-shrink: 0; width: 100vw; margin-inline: calc(50% - 50vw); align-self: flex-start; height: 100svh; overflow: hidden; isolation: isolate; background: var(--bg-hi); }
.v-shot { position: absolute; inset: 0; background: center / cover no-repeat; }
:root:is(.app-ready, :not(.js)) .v-shot { background-image: var(--shot); }
.v-veil { position: absolute; inset: 0; background: var(--veil, none); }
.v-text { position: absolute; inset-inline: 0; top: var(--text-top, 12%); z-index: 1; display: flex; flex-direction: column; align-items: center; gap: 4px; padding-inline: 20px; text-align: center; }
.v-text .bismillah { margin-bottom: 8px; }
:root:has(.v-hero) .topbar { position: absolute; top: 14px; inset-inline-end: 0; z-index: 3; }
@media (max-width: 599px) {
  :root:has(.v-hero) body { margin-top: 0; padding-top: 0; }
  /* The body clips what overflows sideways; some iOS versions clip at its padding, cutting the full-width photo into a band on
     each side. With a photo hero the body has no side margin nor padding: the column carries them, the clip falls on the screen edges. */
  :root:has(.hero--photo) body { margin-inline: 0; padding-inline: 0; }
  :root:has(.hero--photo) .wrap { padding-inline: 40px; }
}
@media (min-width: 600px) {
  :root:has(.v-env) { scrollbar-gutter: stable; }
  .gate:has(.v-env) {
    --ah: min(90vh, 860px); --aw: calc(var(--ah) * 9 / 16);
    --ax: calc((100% - var(--aw)) / 2); --ay: 44px; /* the stage's top, below */
    --s: max(var(--aw) / 720, var(--ah) / 1280);
  }
  .v-env, .gate:has(.v-env) .v-in { position: absolute; inset: auto; left: var(--ax); top: var(--ay); width: var(--aw); height: var(--ah); }
  .v-env, .v-stage {
    border-radius: calc(var(--aw, calc(min(90vh, 860px) * 9 / 16)) / 2) calc(var(--aw, calc(min(90vh, 860px) * 9 / 16)) / 2) 18px 18px;
    box-shadow: 0 0 0 1.5px var(--frame-1, var(--gold-4)), 0 0 0 7px var(--frame-2, var(--surface)), 0 0 0 8px var(--frame-3, var(--gold-1)), 0 24px 50px var(--shadow);
  }
  .v-stage { width: calc(min(90vh, 860px) * 9 / 16); height: min(90vh, 860px); }
  :root:has(.v-hero) .topbar { top: 8px; }
}
@keyframes v-text-in { 0% { opacity: 0; transform: translateY(14px); } 100% { opacity: 1; transform: none; } }
@keyframes v-veil-in { from { opacity: 0; } to { opacity: 1; } }
:root.video-intro .gate.open ~ .wrap .v-text { animation: v-text-in 1.4s ease-out var(--text-delay, 5s) both; }
:root.video-intro .gate.open ~ .wrap .v-veil { animation: v-veil-in 1.4s ease var(--text-delay, 5s) both; }
/* The photo hero does not take part in the hero's "rise" reveal: a moving full-width layer is drawn cut to the column on iOS. */
.reveal .v-hero > .v-stage { animation: none; }
@media (min-width: 600px) {
  .v-stage { margin-inline: 0; align-self: center; }
}

/* Computer / phone switch of published invitations and showcases: wide screens with a mouse only. */
.view-switch { display: none; }
@media (min-width: 900px) and (hover: hover) {
  .view-switch { position: fixed; z-index: 30; inset-block-start: 14px; inset-inline-end: 14px; display: flex; gap: 2px; padding: 3px; border-radius: 999px;
    background: rgba(24, 20, 34, .82); backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px); box-shadow: 0 6px 18px rgba(0,0,0,.18); font-family: var(--font-ui); }
  .view-switch a { padding: 6px 12px; border-radius: 999px; color: #E9E4F2; font: 600 12.5px var(--font-ui); text-decoration: none; }
  .view-switch a[aria-current="true"] { background: #F1DDA0; color: #2A2010; }
  .view-switch :focus-visible { outline: 2px solid #F1DDA0; outline-offset: 2px; }
}

/* Theme "fiesta" — sticker-style birthday party: balloons, confetti, gift box. Ported from the reference prototype.
   --c4 is slightly darker than the prototype (#7B5CFA) so white text on it meets WCAG AA. */

:root.fiesta {
  --bg: #FFEFF3; --bg-hi: #FFF9FB; --surface: #FFFFFF;
  --ink: #2D1B4E; --muted: #5E4D7A; --line: #F5C9D5; --hi: #FFFFFF;
  --accent: #2D1B4E; --link: #5B3FD6;
  --shadow: rgba(45, 27, 78, .12);
  --c1: #FF5A5F; --c2: #FFC531; --c3: #2EC4B6; --c4: #6F4FF0; --c5: #FF8FB1;
  --font-display-ar: "Baloo Bhaijaan 2", "Tajawal", system-ui, sans-serif;
  --font-display-lat: "Baloo Bhaijaan 2", "Tajawal", system-ui, sans-serif;
  --font-text-ar: "Tajawal", system-ui, sans-serif;
  --font-text-lat: "Tajawal", system-ui, sans-serif;
  --font-ui: "Tajawal", system-ui, sans-serif;
}

.fiesta :focus-visible { outline-color: var(--c4); }
.fiesta .lang { border: 2px solid var(--ink); color: var(--ink); background: var(--surface); font-weight: 700; box-shadow: 2px 2px 0 var(--ink); }
.fiesta .hero { padding-top: 8px; }
.fiesta .pill { background: var(--c2); color: var(--ink); border: 2.5px solid var(--ink); border-radius: 999px; padding: 4px 18px; font: 800 16px var(--font-ui); transform: rotate(-3deg); box-shadow: 3px 3px 0 var(--ink); }
.fiesta .badge { width: 156px; height: 156px; display: grid; place-items: center; }
.fiesta .badge svg { position: absolute; inset: 0; width: 100%; height: 100%; }
.fiesta .badge-in { position: relative; display: flex; flex-direction: column; align-items: center; line-height: 1; color: #fff; }
.fiesta .badge-in b { font: 800 70px/0.9 var(--font-display-lat); text-shadow: 3px 3px 0 var(--ink); }
.fiesta .badge-in span { font: 800 19px var(--font-display-ar); margin-top: 4px; text-shadow: 2px 2px 0 var(--ink); }
.fiesta .name { font-weight: 800; font-size: clamp(60px, 18vw, 92px); line-height: 1; color: var(--ink); text-shadow: 5px 5px 0 var(--c2); }
.fiesta .tagline { font-size: 20px; font-weight: 700; color: var(--muted); max-width: 22ch; line-height: 1.5; }
.fiesta .cta { font: 800 16px var(--font-ui); color: var(--ink); background: var(--c1); text-decoration: none; padding: 12px 30px; border: 2.5px solid var(--ink); border-radius: 999px; box-shadow: 4px 4px 0 var(--ink); }
.fiesta .cta:active { transform: translate(2px, 2px); box-shadow: 2px 2px 0 var(--ink); }
.fiesta .balloon { position: absolute; z-index: 0; width: 54px; height: 108px; }
.fiesta .balloon.b1 { inset-inline-start: -14px; top: 30px; color: var(--c1); }
.fiesta .balloon.b2 { inset-inline-end: -10px; top: -14px; color: var(--c3); }
.fiesta .balloon.b3 { inset-inline-end: 30px; top: 70px; width: 38px; height: 76px; color: var(--c4); }
.fiesta .bubble { position: relative; background: var(--surface); border: 2.5px solid var(--ink); border-radius: 26px; box-shadow: 5px 5px 0 var(--ink); padding: 22px 24px; text-align: center; }
.fiesta .bubble::after { content: ""; position: absolute; bottom: -14px; inset-inline-start: 46px; width: 24px; height: 24px; background: var(--surface); border-right: 2.5px solid var(--ink); border-bottom: 2.5px solid var(--ink); transform: rotate(45deg); }
.fiesta .msg { margin: 0; font-size: 20px; font-weight: 500; line-height: 1.6; }
.fiesta h2 { font-weight: 800; font-size: 36px; line-height: 1.2; color: var(--ink); text-shadow: 3px 3px 0 var(--c5); }
.fiesta .day { font-family: var(--font-display-lat); font-weight: 800; font-size: 108px; line-height: .85; color: var(--c1); text-shadow: 4px 4px 0 var(--ink); }
.fiesta .dmeta { border-inline-start: 3px dashed var(--c3); }
.fiesta .dmeta b { font: 800 22px var(--font-ui); }
.fiesta .dmeta span { font-size: 15px; color: var(--muted); font-weight: 500; }
.fiesta .venue { font-weight: 700; }
.fiesta .cell { border: 2.5px solid var(--ink); border-radius: 18px; box-shadow: 3px 3px 0 var(--ink); color: var(--ink); }
.fiesta .cell:nth-child(1) { background: var(--c1); }
.fiesta .cell:nth-child(2) { background: var(--c2); }
.fiesta .cell:nth-child(3) { background: var(--c3); }
.fiesta .cell:nth-child(4) { background: var(--c4); color: #fff; }
.fiesta .cell b { font: 800 34px var(--font-display-lat); }
.fiesta .cell span { font-weight: 700; }
.fiesta .done { font-weight: 800; color: var(--c4); }
.fiesta .events { gap: 14px; }
.fiesta .ev { background: var(--surface); border: 2.5px solid var(--ink); border-radius: 20px; box-shadow: 3px 3px 0 var(--ink); padding: 14px 16px; grid-template-columns: auto 1fr; }
.fiesta .ev.main { background: color-mix(in srgb, var(--c2) 30%, var(--surface)); }
.fiesta .ev-d b { font: 800 20px var(--font-display-lat); background: var(--c3); border: 2px solid var(--ink); border-radius: 12px; padding: 6px 10px 4px; }
.fiesta .ev:nth-child(2) .ev-d b { background: var(--c5); }
.fiesta .ev:nth-child(3) .ev-d b { background: var(--c2); }
.fiesta .themecard { display: flex; gap: 16px; align-items: center; background: var(--c4); color: #fff; border: 2.5px solid var(--ink); border-radius: 24px; box-shadow: 5px 5px 0 var(--ink); padding: 18px 20px; }
.fiesta .themecard svg { flex: none; width: 64px; height: 64px; }
.fiesta .themecard div { display: flex; flex-direction: column; min-width: 0; line-height: 1.4; }
.fiesta .themecard small { font-size: 13px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; opacity: .9; }
.fiesta .themecard b { font: 800 26px var(--font-display-ar); }
.fiesta .themecard span { font-size: 16px; }
.fiesta .close p { font-size: 18px; font-weight: 500; }
.fiesta .photo-frame { background: var(--surface); border: 2.5px solid var(--ink); border-radius: 24px; box-shadow: 5px 5px 0 var(--ink); padding: 8px; transform: rotate(-2deg); }
.fiesta .photo img { border-radius: 16px; }
.fiesta .transport-details { font-size: 18px; font-weight: 500; }
.fiesta .sign { font-weight: 800; font-size: 46px; line-height: 1.1; color: var(--c4); text-shadow: 3px 3px 0 var(--c2); }

/* ---------- intro: gift box whose lid flies off ---------- */
.fiesta .gate { background: radial-gradient(circle at 50% 45%, var(--bg-hi), var(--bg) 70%); }
.fiesta .gate.open { opacity: 0; }
.fiesta .gate.open .gate-in { opacity: 1; transform: none; }
.fiesta .gate-kicker { letter-spacing: 0; text-transform: none; }
.fiesta .gate-names { font-weight: 800; font-size: 54px; color: var(--ink); text-shadow: 4px 4px 0 var(--c2); }
.fiesta .gate-hint { color: var(--ink); font-weight: 700; letter-spacing: 0; font-size: 16px; }
.fiesta .gift { width: 170px; height: 170px; border-radius: 24px; }
.fiesta .gift svg { overflow: visible; }
.fiesta .gift .lid { transform-box: fill-box; transform-origin: 50% 100%; }
.fiesta .gate.open .gift .lid { transform: translate(-30px, -120px) rotate(-28deg); }

@media (prefers-reduced-motion: no-preference) {
  .fiesta .gate { transition: opacity .6s ease .55s; }
  .fiesta .gift .lid { transition: transform .7s cubic-bezier(.3,1.4,.5,1); }
  .fiesta .gift { animation: wiggle 2.2s ease-in-out infinite; }
  @keyframes wiggle { 0%, 70%, 100% { transform: rotate(0); } 76% { transform: rotate(-6deg); } 82% { transform: rotate(5deg); } 88% { transform: rotate(-3deg); } 94% { transform: rotate(2deg); } }
  .fiesta .balloon { animation: float 5s ease-in-out infinite; }
  .fiesta .balloon.b2 { animation-duration: 6s; animation-delay: -2s; }
  .fiesta .balloon.b3 { animation-duration: 4.4s; animation-delay: -1s; }
  @keyframes float { 50% { transform: translateY(-12px) rotate(3deg); } }
}

/* ---------- RSVP ---------- */
.fiesta .rsvp-form > fieldset { border: 2.5px solid var(--ink); border-radius: 24px; box-shadow: 5px 5px 0 var(--ink); }
.fiesta .choice-pill { border: 2.5px solid var(--ink); }
.fiesta .choice-pill:has(input:checked) { background: var(--c2); border-color: var(--ink); color: var(--ink); }
.fiesta .rsvp-field input, .fiesta .rsvp-field textarea { border: 2px solid var(--ink); }
.fiesta .rsvp-submit { background: var(--c1); color: var(--ink); border: 2.5px solid var(--ink); box-shadow: 4px 4px 0 var(--ink); }
.fiesta .guest-greeting { color: var(--ink); font-weight: 800; }

