/* arabic */
@font-face {
  font-family: 'Amiri';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/theme-assets/_fonts/amiri-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;
}
/* arabic */
@font-face {
  font-family: 'Amiri';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url(/theme-assets/_fonts/amiri-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: 'Cormorant Garamond';
  font-style: italic;
  font-weight: 500;
  font-display: swap;
  src: url(/theme-assets/_fonts/cormorant-garamond-500i-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: 'Cormorant Garamond';
  font-style: italic;
  font-weight: 500;
  font-display: swap;
  src: url(/theme-assets/_fonts/cormorant-garamond-500i-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;
}
/* latin-ext */
@font-face {
  font-family: 'Cormorant Garamond';
  font-style: italic;
  font-weight: 600;
  font-display: swap;
  src: url(/theme-assets/_fonts/cormorant-garamond-600i-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: 'Cormorant Garamond';
  font-style: italic;
  font-weight: 600;
  font-display: swap;
  src: url(/theme-assets/_fonts/cormorant-garamond-600i-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;
}
/* latin-ext */
@font-face {
  font-family: 'Cormorant Garamond';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url(/theme-assets/_fonts/cormorant-garamond-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: 'Cormorant Garamond';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url(/theme-assets/_fonts/cormorant-garamond-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;
}
/* latin-ext */
@font-face {
  font-family: 'Cormorant Garamond';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url(/theme-assets/_fonts/cormorant-garamond-600-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: 'Cormorant Garamond';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url(/theme-assets/_fonts/cormorant-garamond-600-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 "sidi-bou" — Porte de Sidi Bou, inspired by Sidi Bou Saïd: whitewashed walls, blue studded doors,
   zellige stars, bougainvillea. Text colours meet WCAG AA on the white surfaces. */

:root.sidi-bou {
  --bg: #F4F7FB; --bg-hi: #FFFFFF; --surface: #FFFFFF;
  --ink: #10284A; --muted: #4A5D78; --line: #C9D8EA; --hi: #FFFFFF;
  --accent: #1C5DA8; --link: #1C5DA8;
  --shadow: rgba(16, 40, 74, .12);
  --blue: #1C5DA8; --blue-deep: #0F3F7A; --blue-light: #DCE8F5; --pink: #B8336A; --leaf: #3E7A4F; --stone: #FBF8F1;
  --gold-1: var(--blue-deep); --gold-2: var(--blue); --gold-3: var(--blue-light); --gold-4: var(--line);
  --font-display-ar: "Amiri", serif;
  --font-display-lat: "Cormorant Garamond", Georgia, serif;
  --font-text-ar: "Amiri", "Tajawal", serif;
  --font-text-lat: "Cormorant Garamond", Georgia, serif;
  --font-ui: "Tajawal", system-ui, sans-serif;
}

/* SVG colour utilities of this theme (no inline styles: CSP). Not prefixed: shapes cloned by <use> only match unprefixed rules. */
.f-blue { fill: var(--blue); } .s-blue { stroke: var(--blue); }
.s-deep { stroke: var(--blue-deep); } .f-night { fill: #0B2546; }
.f-stone { fill: var(--stone); } .f-stud { fill: #0B1B33; }
.f-pink { fill: var(--pink); } .f-leaf { fill: var(--leaf); } .s-leaf { stroke: var(--leaf); }
.f-pink-deep { fill: #8F2455; } .f-pink-soft { fill: #D77AA2; } .f-leaf-soft { fill: #6E9B78; }
.s-wood { stroke: #5C6B52; } .f-vein { stroke: rgba(255, 255, 255, .45); }
.f-line { fill: var(--line); }

/* ---------- decor ---------- */
.sidi-bou .sprig { position: fixed; width: 96px; height: 72px; z-index: 0; pointer-events: none; opacity: .9; }
.sidi-bou .sprig--top { top: 0; inset-inline-end: 0; }
.sidi-bou .sprig--bottom { bottom: 0; inset-inline-start: 0; transform: rotate(180deg); }
[dir="rtl"].sidi-bou .sprig--top { transform: scaleX(-1); }
[dir="rtl"].sidi-bou .sprig--bottom { transform: rotate(180deg) scaleX(-1); }

/* ---------- blocks ---------- */
.sidi-bou .lang { border: 1px solid var(--blue); color: var(--blue-deep); background: var(--surface); }
.sidi-bou .bismillah { font-family: var(--font-text-ar); font-size: 22px; color: var(--blue-deep); direction: rtl; }
.sidi-bou .window { position: relative; width: min(100%, 340px); padding: 3px; background: var(--blue); border-radius: 50% 50% 10px 10px / 30% 30% 10px 10px; box-shadow: 0 18px 40px var(--shadow); }
.sidi-bou .window-in { position: relative; display: flex; flex-direction: column; align-items: center; gap: 4px; padding: 64px 22px 40px; background: var(--surface); border-radius: inherit; box-shadow: inset 0 0 0 7px var(--surface), inset 0 0 0 8.5px var(--blue-light); }
.sidi-bou .sprig--window { position: absolute; top: -22px; inset-inline-end: -4px; width: 80px; height: 60px; z-index: 2; opacity: 1; }
[dir="rtl"].sidi-bou .sprig--window { transform: scaleX(-1); }
.sidi-bou .window-star { width: 34px; height: 34px; fill: none; stroke: var(--blue); stroke-width: 1.4; margin-bottom: 8px; }
.sidi-bou .kicker { font-size: 13px; letter-spacing: .16em; text-transform: uppercase; color: var(--muted); }
.sidi-bou .name { font-size: clamp(42px, 13vw, 60px); line-height: 1.3; font-weight: 700; color: var(--blue-deep); }
:root.sidi-bou[lang="fr"] .name { font-weight: 600; line-height: 1.1; }
.sidi-bou .amp { font-family: var(--font-display-lat); font-size: 32px; line-height: 1; color: var(--pink); padding-block: 4px; }
[lang="ar"].sidi-bou .amp { font-family: var(--font-display-ar); }
.sidi-bou .tagline { font-size: 20px; color: var(--muted); }
:root.sidi-bou[lang="fr"] .tagline { font-style: italic; font-size: 22px; }
.sidi-bou .cta { font: 500 15px var(--font-ui); color: #FFFFFF; background: var(--blue); text-decoration: none; letter-spacing: .06em; padding: 12px 34px; border-radius: 999px; box-shadow: 0 8px 20px rgba(28,93,168,.28); }
.sidi-bou .cta:hover { background: var(--blue-deep); }
.sidi-bou .verse { text-align: center; display: flex; flex-direction: column; gap: 12px; padding-inline: 8px; }
.sidi-bou .verse-ar { font-family: var(--font-text-ar); font-size: 25px; line-height: 2; color: var(--blue-deep); direction: rtl; }
.sidi-bou .verse-tr { font-family: var(--font-text-lat); font-style: italic; font-size: 19px; color: var(--muted); line-height: 1.55; }
.sidi-bou .cite { font-size: 13px; letter-spacing: .1em; color: var(--blue); }
:root.sidi-bou[lang="fr"] .cite { text-transform: uppercase; }
.sidi-bou h2 { font-weight: 700; font-size: 30px; line-height: 1.3; color: var(--blue-deep); }
:root.sidi-bou[lang="fr"] h2 { font-weight: 600; font-size: 36px; }
.sidi-bou .day { font-family: var(--font-display-lat); font-size: 104px; line-height: .85; font-weight: 600; color: var(--blue); font-variant-numeric: lining-nums; }
.sidi-bou .dmeta { border-inline-start: 2px solid var(--blue); }
.sidi-bou .dmeta b { font: 700 20px var(--font-ui); color: var(--blue-deep); }
.sidi-bou .dmeta span { font-size: 15px; color: var(--muted); }
.sidi-bou .cell { border: 1.5px solid var(--blue); border-radius: 50% 50% 12px 12px / 26% 26% 12px 12px; background: var(--surface); box-shadow: 0 6px 16px var(--shadow); padding-top: 18px; }
.sidi-bou .cell b { font-family: var(--font-display-lat); font-weight: 600; font-size: 36px; color: var(--blue-deep); }
.sidi-bou .cell span { color: var(--muted); }
.sidi-bou .done { color: var(--blue-deep); font-family: var(--font-text-ar); }
.sidi-bou .ev { border-bottom: 1px dashed var(--line); }
.sidi-bou .ev:first-child { border-top: 1px dashed var(--line); }
.sidi-bou .ev.main { background: linear-gradient(90deg, transparent, var(--blue-light), transparent); }
.sidi-bou .ev.main h3 { color: var(--blue-deep); }
.sidi-bou .ev-d b { font: 600 36px var(--font-display-lat); color: var(--blue); font-variant-numeric: lining-nums; }
.sidi-bou .ev-d span { font-size: 13px; letter-spacing: .08em; text-transform: uppercase; color: var(--muted); }
.sidi-bou .maplink { text-decoration-color: var(--line); }
.sidi-bou .venue span { font-weight: 700; }
.sidi-bou .message .msg { font-family: var(--font-text-ar); color: var(--ink); }
:root.sidi-bou[lang="fr"] .message .msg { font-family: var(--font-text-lat); font-style: italic; font-size: 22px; }
.sidi-bou .dresscode { padding: 18px 20px; border-radius: 16px; background: var(--blue-light); }
.sidi-bou .dresscode b { font: 700 22px var(--font-ui); color: var(--blue-deep); }
.sidi-bou .close p { color: var(--muted); }
:root.sidi-bou[lang="fr"] .close p { font-style: italic; font-size: 22px; }
.sidi-bou .birdcage { width: 80px; height: 104px; }
.sidi-bou .sign { font-size: 34px; font-weight: 700; color: var(--blue-deep); }
:root.sidi-bou[lang="fr"] .sign { font-weight: 600; }
.sidi-bou .photo-frame { padding: 3px; background: var(--blue); border-radius: 50% 50% 12px 12px / 30% 30% 12px 12px; box-shadow: 0 18px 40px var(--shadow); }
.sidi-bou .photo img { border-radius: 50% 50% 10px 10px / 30% 30% 10px 10px; border: 6px solid var(--surface); }
.sidi-bou .transport-details { font-family: var(--font-text-ar); font-size: 20px; color: var(--muted); }
:root.sidi-bou[lang="fr"] .transport-details { font-family: var(--font-text-lat); font-style: italic; }

/* ---------- intro: the blue door ---------- */
.sidi-bou .gate { background: radial-gradient(ellipse at 50% 40%, #FFFFFF, var(--bg) 75%); }
.sidi-bou .gate-kicker { color: var(--muted); }
.sidi-bou .gate-names { color: var(--blue-deep); font-weight: 700; }
:root.sidi-bou[lang="fr"] .gate-names { font-weight: 600; }
.sidi-bou .gate-hint { color: var(--blue); }
.sidi-bou .door { width: 160px; height: 224px; border-radius: 80px 80px 4px 4px; filter: drop-shadow(0 14px 20px rgba(16,40,74,.25)); }
.sidi-bou .door svg { overflow: visible; }
.sidi-bou .leaf { transform-box: fill-box; }
.sidi-bou .leaf-l { transform-origin: 0% 50%; }
.sidi-bou .leaf-r { transform-origin: 100% 50%; }
.sidi-bou .gate.open .leaf { transform: scaleX(.06); }
.sidi-bou .gate.open { opacity: 0; }
.sidi-bou .gate.open .gate-in { opacity: 1; transform: none; }

@media (prefers-reduced-motion: no-preference) {
  .sidi-bou .leaf { transition: transform 1s cubic-bezier(.6,0,.3,1); }
  .sidi-bou .gate { transition: opacity .6s ease .9s; }
  .sidi-bou .door { animation: glow 3s ease-in-out infinite; }
  @keyframes glow { 50% { filter: drop-shadow(0 14px 26px rgba(28,93,168,.4)); } }
}

/* ---------- RSVP ---------- */
.sidi-bou .rsvp-form > fieldset { border-color: var(--blue); box-shadow: 0 10px 30px var(--shadow); }
.sidi-bou .choice-pill { border-color: var(--blue); }
.sidi-bou .choice-pill:has(input:checked) { background: var(--blue); border-color: var(--blue); color: #FFFFFF; }
.sidi-bou .rsvp-submit { background: var(--blue); color: #FFFFFF; }
.sidi-bou .guest-greeting { color: var(--blue-deep); font-style: italic; }

/* ---------- intro: opening video (theme.json "introVideo", played by invitation.js on the first tap) ---------- */
/* The picture shown is the FIRST FRAME of the video (the closed door, 720×1280): an invisible button sits on that door
   (x 20–698, y 503–1272 in the frame, i.e. centred 247 px below the middle) and the video starts on identical pixels.
   Without playback (not loaded, reduced motion, Save-Data...) the picture simply dissolves. */
.sidi-bou .gate:has(.env-video) { container-type: size; --s: max(100cqw / 720, 100cqh / 1280); --gate-ms: 700; background: var(--bg); }
.sidi-bou .gate:has(.env-video) .env { position: absolute; inset: 0; overflow: hidden; }
.sidi-bou .env-img, .sidi-bou .env-video { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.sidi-bou .env-video { opacity: 0; pointer-events: none; }
:root.sidi-bou.video-intro .gate.video-playing .env-video { opacity: 1; }
.sidi-bou .gate:has(.env-video) .gate-in { position: absolute; inset: 0; display: block; padding: 0; }
.sidi-bou .gate:has(.env-video) .door-hit {
  position: absolute; left: 50%; top: 50%; width: calc(var(--s) * 678); height: calc(var(--s) * 769);
  translate: -50% calc(var(--s) * 247 - 50%); border-radius: calc(var(--s) * 339) calc(var(--s) * 339) 0 0; cursor: pointer;
}
.sidi-bou .gate:has(.env-video) .gate-hint {
  position: absolute; inset-inline: 0; bottom: 5%; width: fit-content; margin-inline: auto; padding: 6px 18px; border-radius: 999px;
  background: rgba(255,255,255,.9); color: var(--blue); font: 600 14px var(--font-ui); letter-spacing: .08em;
}
.sidi-bou .gate:has(.env-video) .door-hit:focus-visible { outline: 3px solid var(--blue); outline-offset: 4px; }
/* No playback: the picture dissolves at the tap (the door's slower delay does not apply). */
.sidi-bou .gate:has(.env-video).open { transition: opacity .6s ease; }
/* Playback: the hint fades, the gate stays until the video ends, then dissolves over the invitation. */
:root.sidi-bou.video-intro .gate.open { opacity: 1; transition: opacity .45s ease; }
:root.sidi-bou.video-intro .gate.open .gate-in { opacity: 0; pointer-events: none; transition: opacity .25s ease; }
:root.sidi-bou.video-intro .gate.open.video-end { opacity: 0; }

/* Computers: the video plays in a centred portrait arch, as for the Palais theme, not full screen. */
@media (min-width: 600px) {
  .sidi-bou .gate:has(.env-video) {
    --ah: min(90vh, 860px); --aw: calc(var(--ah) * 9 / 16); /* the arch has the picture's own 9:16 ratio: nothing is cropped */
    --ax: calc((100% - var(--aw)) / 2); --ay: 44px; /* the stage's top, see below */
    --s: max(var(--aw) / 720, var(--ah) / 1280);
  }
  .sidi-bou .gate:has(.env-video) .env, .sidi-bou .gate:has(.env-video) .gate-in {
    position: absolute; inset: auto; left: var(--ax); top: var(--ay); width: var(--aw); height: var(--ah);
  }
  .sidi-bou .gate:has(.env-video) .env {
    border-radius: calc(var(--aw) / 2) calc(var(--aw) / 2) 18px 18px;
    box-shadow: 0 0 0 1.5px var(--blue-light), 0 0 0 7px #fff, 0 0 0 8px var(--line), 0 24px 50px var(--shadow);
  }
}

/* ---------- hero with the opening video: a photographic stage (the video's last frame) ---------- */
/* The video's last frame (img/video-end-5.webp) is the stage's picture, so the opening dissolves into the very same image; the names
   come in over it afterwards. Phones: full screen, like the video. Computers: the same arch as the video, at the same place. */
.sidi-bou .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(--blue-light); }
.sidi-bou .shot { position: absolute; inset: 0; background: center / cover no-repeat; }
:root.sidi-bou:is(.app-ready, :not(.js)) .shot { background-image: url("/theme-assets/sidi-bou/img/video-end-5.webp"); }
.sidi-bou .stage-veil { position: absolute; inset: 0; background: linear-gradient(180deg, rgba(255,255,255,.5), rgba(255,255,255,.3) 45%, rgba(255,255,255,0) 62%); }
.sidi-bou .stage-text { position: absolute; inset-inline: 0; top: 22%; z-index: 1; display: flex; flex-direction: column; align-items: center; gap: 4px; padding-inline: 20px; text-align: center; }
.sidi-bou .stage-text .kicker { color: var(--blue-deep); }
.sidi-bou .stage-text .bismillah { margin-bottom: 8px; }
:root.sidi-bou:has(.hero--photo) .topbar { position: absolute; top: 14px; inset-inline-end: 0; z-index: 3; }
@media (max-width: 599px) {
  :root.sidi-bou:has(.hero--photo) body { margin-top: 0; padding-top: 0; }
}
@media (min-width: 600px) {
  :root.sidi-bou:has(.env-video) { scrollbar-gutter: stable; }
  .sidi-bou .stage { width: calc(min(90vh, 860px) * 9 / 16); height: min(90vh, 860px); border-radius: calc(min(90vh, 860px) * 9 / 32) calc(min(90vh, 860px) * 9 / 32) 18px 18px;
    box-shadow: 0 0 0 1.5px var(--blue-light), 0 0 0 7px #fff, 0 0 0 8px var(--line), 0 24px 50px var(--shadow); }
  :root.sidi-bou:has(.hero--photo) .topbar { top: 8px; }
}
/* The names and the veil come in after the video (5.0 s + 0.2 s: the gate dissolves until then). */
@keyframes sb-text-in { 0% { opacity: 0; transform: translateY(14px); } 100% { opacity: 1; transform: none; } }
@keyframes sb-veil-in { from { opacity: 0; } to { opacity: 1; } }
:root.sidi-bou.video-intro .gate.open ~ .wrap .stage-text { animation: sb-text-in 1.4s ease-out 5.2s both; }
:root.sidi-bou.video-intro .gate.open ~ .wrap .stage-veil { animation: sb-veil-in 1.4s ease 5.2s both; }

/* Same as the shared photo hero: full width on iOS, no "rise" on the photo, centred arch on computers. */
.sidi-bou .reveal .hero--photo > .stage { animation: none; }
@media (min-width: 600px) { .sidi-bou .stage { margin-inline: 0; align-self: center; } }

