/*=========================
   Table of Contents
=========================*/
/*
   32    bareBat — shared site components
   142   NAV
   236   SECTIONS
   359   HERO
   604   BUTTONS
   681   INFORMATION
   811   GALLERY
   844   MUSIC + AGENDA
   950   MOMENTS (Cerimônia/Festa — 2 cards, plain icon rows)
   1130  GIFTS
   1205  GIFT PIX MODAL
   1479  FORMS (shared)
   1562  DONATION
   1711  RSVP
   1750  MESSAGES
   1820  FOOTER
   1905  NAV — hamburger menu (medium screens and mobile)
   1964  MOBILE
*/

/* CSS Layers — explicit precedence order, independent of file load
   order. See docs/frontend/css.md. */
@layer core, workspace, site, editor;

@layer site {
  /*=========================
   bareBat — shared site components
=========================*/
  /* Scoped under .event-theme — colors from each theme's :root */
  html {
    scroll-behavior: smooth;
  }
  /* templates/sites/layouts/base.html doesn't load core/reset.css — zero
   out only what's needed here (the body's default margin left a strip of
   the html's background color showing around everything). */
  body {
    margin: 0;
  }
  .menu-logo {
    display: inline-flex;
  }
  .menu-logo img {
    width: 100px;
    height: auto;
  }
  /* `.icon` — used in ~15 public section templates (rsvp, donation,
   gallery, gifts, footer, etc.), but was only defined in
   core/components.css, which templates/sites/layouts/base.html does NOT
   load (only loads sites-base.css + theme). Result: every icon with this
   class fell back to Arial and showed the icon name as literal text on
   the real published site. Same definition as core/components.css. */
  .event-theme .icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
    font-family: "Material Symbols Rounded";
    font-size: 1.25rem;
    line-height: 1;
    font-variation-settings:
      "FILL" 0,
      "wght" 400,
      "GRAD" 0,
      "opsz" 24;
  }
  .event-theme {
    background: var(--color-bg);
    color: var(--color-text);
    font-family: var(
      --font-family,
      "Inter",
      system-ui,
      -apple-system,
      sans-serif
    );
    -webkit-font-smoothing: antialiased;
    line-height: 1.6;
    /* No `overflow-x: hidden` here — used to have it, but overflow-x !=
       visible forces overflow-y to `auto` (the usual gotcha, see
       docs/frontend/css.md), and that alone was enough to break the nav's
       `position: sticky` on the real published site — even with nothing
       actually scrolling inside the body, just having overflow != visible
       on any ancestor already confuses sticky in several browsers. A fix
       for this only existed inside the editor (`.event-theme` with
       overflow-x:visible in @layer editor), which never reached the real
       public site (editor.css doesn't load there). We haven't found any
       element that genuinely needs this horizontal clipping today — if a
       specific overflow leak shows up, the fix is to scope
       overflow-x:hidden to that local element, not here on the whole
       body. */
    /* Container query, not viewport (headings below scale with `cqw`
       instead of `vw`). `vw` is always relative to the whole window, so
       in the editor (where the canvas is narrower than the viewport
       because of the rail/panel) the text stayed at "full" size and
       wrapped with less room available. `cqw` resolves against the REAL
       width of the nearest container with container-type — works the
       same on the published site (canvas ≈ viewport) and adapts
       correctly inside the editor (narrower canvas). */
    container-type: inline-size;
    /* Derived from --color-hero-bg / --color-text / --color-primary —
       computed once here (no longer recalculated in JS or in the override
       template). Since these are custom properties, they inherit from the
       theme's :root by default; declaring them here overrides that
       whenever --color-hero-bg (etc.) changes through any path — palette,
       manual tweak, or the theme itself. */
    --nav-bg: color-mix(
      in srgb,
      var(--color-hero-bg, var(--color-bg)) 96%,
      transparent
    );
    --hero-count-bg: color-mix(
      in srgb,
      var(--color-hero-bg, var(--color-bg)) 85%,
      transparent
    );
    --color-text-secondary: color-mix(
      in srgb,
      var(--color-text) 65%,
      transparent
    );
    --color-border: color-mix(in srgb, var(--color-text) 15%, transparent);
    --color-bg-glow: color-mix(in srgb, var(--color-primary) 12%, transparent);
    --color-primary-tint: color-mix(
      in srgb,
      var(--color-primary) 12%,
      transparent
    );
  }
  .event-theme *,
  .event-theme *::before,
  .event-theme *::after {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
  }
  /*=========================
   NAV
=========================*/
  .event-theme nav {
    position: sticky;
    top: 0;
    width: 100%;
    min-height: var(--c-nav-h);
    padding: 12px max(24px, 5%);
    display: flex;
    align-items: center;
    /* `center` on purpose — nav-links + nav-actions stay centered as a
       single group in the bar, not pinned to either edge. */
    justify-content: center;
    /* `flex-wrap: wrap` + `align-content: center` — between ~960px and
       ~1020px `.nav-links` doesn't fit on one line and wraps internally
       (its own `flex-wrap`), but without this here the CTA (`.nav-actions`,
       a sibling item) had vertical `align-items: center` relative to the
       nav's WHOLE height — centered in the middle of the two link lines,
       floating disconnected instead of following the wrap. With `<nav>`
       itself also allowed to wrap, the CTA drops below the links block
       when it doesn't fit alongside it. */
    flex-wrap: wrap;
    align-content: center;
    row-gap: 8px;
    column-gap: 16px;
    background: var(--nav-bg);
    backdrop-filter: blur(16px);
    -webkit-backdrop-filter: blur(16px);
    border-bottom: 1px solid var(--color-border);
    z-index: 50;
  }
  .event-theme .nav-links {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    justify-content: center;
    row-gap: 8px;
    column-gap: 22px;
  }
  .event-theme .nav-links a {
    color: var(--color-text-secondary);
    text-decoration: none;
    font-size: calc(14px * var(--font-size-scale, 1));
    font-weight: 500;
    white-space: nowrap;
    transition: color 0.15s;
  }
  .event-theme .nav-links a:hover {
    color: var(--color-text);
  }
  /* Groups the CTA (RSVP) + hamburger button. Outside `.nav-links` on
   purpose: on mobile the CTA needs to stay visible at all times, even
   with the rest of the links hidden behind the hamburger — see
   `.nav-menu-toggle` / `.nav-links--open` in the MOBILE block. */
  .event-theme .nav-actions {
    display: flex;
    align-items: center;
    gap: 16px;
    flex-shrink: 0;
  }
  /* Only shows up on mobile (see MOBILE block) — no `!important` needed,
   the breakpoint rule (same selector, declared later) simply takes over
   normally. */
  .event-theme .nav-menu-toggle {
    display: none;
    align-items: center;
    justify-content: center;
    width: 40px;
    height: 40px;
    padding: 0;
    border: none;
    border-radius: 999px;
    background: transparent;
    color: var(--color-text);
    cursor: pointer;
    flex-shrink: 0;
  }
  .event-theme .nav-cta {
    padding: 12px 24px;
    border-radius: 999px;
    background: var(--color-button);
    color: var(--white) !important;
    font-weight: 700 !important;
    font-size: calc(14px * var(--font-size-scale, 1)) !important;
    letter-spacing: 0.02em;
    white-space: nowrap;
    flex-shrink: 0;
    /* Used to inherit from `.nav-links a` (text-decoration: none) — no
       longer a descendant of `.nav-links`, now lives in `.nav-actions`.
       Without this, it falls back to the browser's default underline
       for <a>. */
    text-decoration: none;
  }
  /*=========================
   SECTIONS
=========================*/
  .event-theme section {
    position: relative;
    padding: 120px max(5%, calc((100% - 1100px) / 2));
    border-top: 1px solid var(--color-border);
    scroll-margin-top: var(--c-nav-h);
    display: flex;
    flex-direction: column;
    justify-content: center;
    background: var(--color-bg);
  }
  /* odd sections (except hero) */
  .event-theme section:nth-of-type(odd):not(.hero) {
    background: var(--color-bg);
  }
  /* even sections: bg-secondary */
  .event-theme section:nth-of-type(even) {
    background: var(--color-bg-secondary);
  }
  .event-theme section.hero {
    padding: 0;
    border-top: none;
    min-height: calc(100vh - var(--c-nav-h));
    display: flex;
    flex-direction: row;
    align-items: center;
    position: relative;
    justify-content: flex-start;
    background: var(--color-hero-bg, var(--color-bg));
    /* No `overflow: hidden` here on purpose — `.hero-panel-image` already
       clips the photo itself (its own `overflow: hidden` below). Clipping
       here too used to also cut off `.hero-cal-menu` (Add to calendar
       dropdown) whenever it opened close to the hero's bottom edge, which
       is the normal case in full-bleed themes (Inverno, Jerusalém,
       Jardim) where the buttons sit right above the hero's bottom
       padding. */
  }
  .event-theme .section-label {
    display: block;
    font-size: calc(12px * var(--font-size-scale, 1));
    font-weight: 600;
    letter-spacing: 0.1em;
    text-transform: uppercase;
    color: var(--color-primary);
    margin-bottom: 20px;
  }
  /* Section titles always centered (label + h2 + intro text), in every
     theme — used to be a per-theme override (Jardim/Jerusalém/Inverno
     only); promoted here so Elegante/Bar Mitzvah/Bat Mitzvah match too.
     `section h2` never matches the hero (that's an `h1`), and the
     hero's own `.section-label` rule further down this file loads
     later, so it still wins there — this doesn't touch the hero. */
  .event-theme section .section-label,
  .event-theme section h2 {
    text-align: center;
  }
  .event-theme section h2 + p {
    text-align: center;
  }
  .event-theme .rsvp-note {
    justify-content: center;
    text-align: center;
  }
  .event-theme h1,
  .event-theme h2,
  .event-theme h3,
  .event-theme h4,
  .event-theme h5,
  .event-theme h6 {
    color: var(--color-title, var(--color-text));
  }
  .event-theme h1 {
    /* `--font-heading` — optional, falls back to `--font-family` if the
       theme doesn't set it. Only Jerusalem uses it today (serif headings,
       different from the body text); the other themes never set this
       variable, so they stay exactly as before. */
    font-family: var(
      --font-heading,
      var(--font-family, "Inter", system-ui, -apple-system, sans-serif)
    );
    /* `cqw` relative to `.hero-content` (52% of the hero, see
       container-type there) — not `vw`/viewport. 12.5cqw reproduces the
       same 4.5rem cap at the published site's "normal" size (hero-content
       ~576px on a typical desktop), but now genuinely tracks the real
       available width — including inside the editor, where the canvas is
       narrower. */
    font-size: var(--font-size-title, clamp(32px, 12.5cqw, 4.5rem));
    line-height: 1.05;
    letter-spacing: -1.5px;
    font-weight: 800;
    margin-bottom: 0;
  }
  .event-theme h1 .hero-highlight {
    color: var(--color-primary);
  }
  .event-theme h2 {
    font-family: var(
      --font-heading,
      var(--font-family, "Inter", system-ui, -apple-system, sans-serif)
    );
    /* `cqw` relative to `.event-theme` (see container-type there) — same
       logic as h1 above. */
    font-size: var(--font-size-section-title, clamp(26px, 3.4cqw, 44px));
    letter-spacing: -0.5px;
    font-weight: 700;
    margin-bottom: 16px;
  }
  .event-theme h3 {
    font-family: var(
      --font-heading,
      var(--font-family, "Inter", system-ui, -apple-system, sans-serif)
    );
    font-size: calc(17px * var(--font-size-scale, 1));
    font-weight: 700;
    margin-bottom: 4px;
  }
  .event-theme p {
    color: var(--color-text-secondary);
    line-height: 1.7;
    font-size: calc(16px * var(--font-size-scale, 1));
  }
  /*=========================
   HERO
=========================*/
  .event-theme .hero-bg {
    display: block;
    position: absolute;
    inset: 0;
    background: var(--color-hero-bg, var(--color-bg));
    z-index: 0;
  }
  .event-theme .hero-panel-image {
    position: absolute;
    inset: 0;
    z-index: 1;
    overflow: hidden;
  }
  .event-theme .hero-panel-image::before {
    content: "";
    position: absolute;
    inset: 0;
    z-index: 2;
    background: linear-gradient(
      90deg,
      var(--color-hero-bg, var(--color-bg)) 0%,
      var(--color-hero-bg, var(--color-bg)) 30%,
      color-mix(in srgb, var(--color-hero-bg, var(--color-bg)) 80%, transparent)
        50%,
      transparent 68%
    );
  }
  .event-theme .hero-panel-image img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    object-position: right center;
    display: block;
  }
  .event-theme .hero-panel-image img.hero-filter-sepia {
    filter: sepia(0.65);
  }
  .event-theme .hero-panel-image img.hero-filter-grayscale {
    filter: grayscale(1);
  }
  /* Editor-only: shown over the cover photo while a new upload or
     gallery pick is in flight (event.editor_mode), so the wait is
     visible on the actual image being replaced, not just in the
     sidebar panel. Blurring the photo itself (not just a flat scrim)
     means the spinner's exact position stops mattering — the whole
     visible image changes, so dead-center is fine even though the
     editor canvas has fixed UI in every actual corner (top toolbar,
     bottom save bar, bottom-right action buttons) that a corner
     anchor would collide with. */
  .event-theme .hero-image-loading {
    position: absolute;
    inset: 0;
    z-index: 2;
    background: rgb(0 0 0 / 0.25);
    backdrop-filter: blur(8px);
    -webkit-backdrop-filter: blur(8px);
  }
  .event-theme .hero-image-loading-spinner {
    position: absolute;
    top: 50%;
    left: 50%;
    width: 36px;
    height: 36px;
    border: 3px solid rgb(255 255 255 / 0.35);
    border-top-color: var(--white, #fff);
    border-radius: 50%;
    /* Own keyframes (not the shared btn-spin) because this element also
       needs a static translate(-50%,-50%) to stay centered — an
       animated `transform` replaces the static one instead of
       combining with it, so the centering has to be baked into every
       keyframe here, not left in a separate non-animated rule. */
    animation: hero-image-loading-spin 0.7s linear infinite;
  }
  .event-theme .hero-content {
    position: relative;
    z-index: 3;
    padding: 80px 60px 80px max(5%, calc((100% - 1100px) / 2));
    width: 52%;
    flex-shrink: 0;
    display: flex;
    flex-direction: column;
    /* Own container so the h1 can use `cqw` relative only to this column
       (52% of the hero), not to the whole `.event-theme` — see the
       comment on `.event-theme` above. */
    container-type: inline-size;
  }
  .event-theme .hero-content .section-label {
    margin-bottom: 16px;
  }
  .event-theme .hero-divider {
    display: flex;
    align-items: center;
    gap: 12px;
    width: 100%;
    margin-top: 24px;
  }
  .event-theme .hero-divider-line {
    flex: 1;
    height: 1px;
    background: var(--color-primary);
    opacity: 0.4;
  }
  .event-theme .hero-divider-icon {
    display: flex;
    color: var(--color-primary);
  }
  .event-theme .hero-subtitle {
    font-size: calc(18px * var(--font-size-scale, 1));
    color: var(--color-text-secondary);
    margin-top: 24px;
    line-height: 1.65;
    text-align: justify;
  }
  .event-theme .hero-bottom {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 28px;
    margin-top: 24px;
  }
  .event-theme .hero-countdown-wrap {
    display: flex;
    flex-direction: column;
  }
  .event-theme .hero-countdown-label {
    display: block;
    font-size: calc(13px * var(--font-size-scale, 1));
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--color-text-secondary);
    margin-bottom: 10px;
  }
  .event-theme .hero-countdown {
    display: flex;
    gap: 10px;
    flex-wrap: wrap;
  }
  .event-theme .hero-count-box {
    display: flex;
    flex-direction: column;
    align-items: center;
    min-width: 70px;
    padding: 12px 16px;
    background: var(--hero-count-bg);
    border: 1px solid var(--color-border);
    border-radius: 8px;
    backdrop-filter: blur(8px);
  }
  .event-theme .hero-count-val {
    font-family: var(
      --font-family,
      "Inter",
      system-ui,
      -apple-system,
      sans-serif
    );
    font-size: calc(32px * var(--font-size-scale, 1));
    font-weight: 700;
    letter-spacing: -1px;
    line-height: 1;
    color: var(--color-text);
  }
  .event-theme .hero-count-lbl {
    font-size: calc(10px * var(--font-size-scale, 1));
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--color-text-secondary);
    margin-top: 4px;
  }
  /* No `flex-wrap: wrap` on purpose — left unwrapped, this used to break
   the line as soon as the two buttons didn't fit with room to spare
   (starting at ~1600px viewport, much earlier than makes sense). The
   stacking breakpoint is now explicit, at 860px (see the media query
   below, replacing the old one that lived inside the general MOBILE
   block at 768px) — above that, both buttons always stay side by side.
   The negative `margin-right` "steals" part of `.hero-content`'s right
   padding just for this row, giving the two buttons extra room to fit
   without shrinking the text (which is what caused the text to overflow
   before this rule existed). */
  .event-theme .hero-actions {
    display: flex;
    gap: 12px;
    margin-right: -70px;
  }
  /* hero-actions' own breakpoint — only stacks from here down, not
   before (see the comment on the base rule above). */
  @media (max-width: 860px) {
    .event-theme .hero-actions {
      flex-direction: column;
      margin-right: 0;
    }
    .event-theme .hero-actions .btn-primary,
    .event-theme .hero-actions .btn-outline {
      width: 100%;
      justify-content: center;
    }
  }
  .event-theme .hero-cal-wrap {
    position: relative;
  }
  .event-theme .hero-cal-trigger {
    font-family: inherit;
  }
  .event-theme .hero-cal-chevron {
    font-size: 18px !important;
    transition: transform 0.2s;
  }
  .event-theme .hero-cal-chevron--open {
    transform: rotate(180deg);
  }
  .event-theme .hero-cal-menu {
    position: absolute;
    top: calc(100% + 8px);
    left: 0;
    min-width: 100%;
    background: var(--color-surface);
    border: 1px solid var(--color-border);
    border-radius: 10px;
    overflow: hidden;
    z-index: 100;
    box-shadow: 0 8px 24px rgb(0 0 0 / 0.12);
  }
  .event-theme .hero-cal-option {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 13px 18px;
    font-size: calc(14px * var(--font-size-scale, 1));
    font-weight: 500;
    color: var(--color-text);
    text-decoration: none;
    transition: background 0.12s;
  }
  .event-theme .hero-cal-option:hover {
    background: var(--color-bg-secondary);
  }
  .event-theme .hero-cal-option .material-symbols-rounded {
    font-size: 17px;
    color: var(--color-text-secondary);
  }
  /*=========================
   BUTTONS
=========================*/
  .event-theme .btn-primary {
    display: inline-flex;
    align-items: center;
    gap: 10px;
    padding: 16px 32px;
    border-radius: 10px;
    background: var(--color-button);
    color: var(--white);
    font-weight: 700;
    font-size: calc(15px * var(--font-size-scale, 1));
    line-height: 1;
    text-decoration: none;
    border: 2px solid var(--color-button);
    cursor: pointer;
    transition: opacity 0.15s;
    white-space: nowrap;
    width: fit-content;
  }
  .event-theme .btn-primary:hover {
    opacity: 0.82;
  }
  .event-theme .btn-outline {
    display: inline-flex;
    align-items: center;
    gap: 10px;
    padding: 16px 32px;
    border-radius: 10px;
    background: transparent;
    color: var(--color-text) !important;
    font-weight: 600;
    font-size: calc(15px * var(--font-size-scale, 1));
    line-height: 1;
    text-decoration: none;
    border: 1.5px solid var(--color-border) !important;
    cursor: pointer;
    transition:
      border-color 0.15s,
      background 0.15s;
    white-space: nowrap;
    width: fit-content;
  }
  .event-theme .btn-outline:hover {
    border-color: var(--color-text);
    background: var(--color-bg-secondary);
  }
  .event-theme .btn-primary .material-symbols-rounded,
  .event-theme .btn-outline .material-symbols-rounded {
    font-size: 20px;
  }
  .event-theme .btn-full {
    width: 100%;
    justify-content: center;
  }
  .event-theme .btn-primary:disabled,
  .event-theme .btn-outline:disabled {
    opacity: 0.6;
    cursor: not-allowed;
  }
  .event-theme .btn-spinner {
    display: inline-block;
    width: 16px;
    height: 16px;
    border: 2px solid rgba(255, 255, 255, .5);
    border-top-color: var(--white);
    border-radius: 50%;
    animation: btn-spin .6s linear infinite;
  }
  @keyframes btn-spin {
    to { transform: rotate(360deg); }
  }
  @keyframes hero-image-loading-spin {
    from { transform: translate(-50%, -50%) rotate(0deg); }
    to { transform: translate(-50%, -50%) rotate(360deg); }
  }
  /*=========================
   INFORMATION
=========================*/
  .event-theme .info-section {
    display: flex;
    flex-direction: column;
    gap: 40px;
  }
  .event-theme .celebrant-row {
    display: grid;
    grid-template-columns: minmax(280px, 1fr) 1.3fr;
    gap: 56px;
    align-items: stretch;
  }
  .event-theme .celebrant-photo {
    --celebrant-photo-radius: 32px;
    width: 100%;
    aspect-ratio: 4 / 5;
    max-height: 420px;
    border-radius: var(--celebrant-photo-radius);
    overflow: hidden;
    box-shadow: 0 12px 32px -12px rgb(0 0 0 / 0.35);
  }
  .event-theme .celebrant-photo img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
    border-radius: var(--celebrant-photo-radius);
  }
  .event-theme .celebrant-photo-placeholder {
    width: 100%;
    height: 100%;
    display: flex;
    align-items: center;
    justify-content: center;
    text-align: center;
    padding: 16px;
    background: #e0e0e0;
    color: #6b6b6b;
    font-size: calc(14px * var(--font-size-scale, 1));
    border-radius: var(--celebrant-photo-radius);
  }
  .event-theme .celebrant-bio {
    display: flex;
    flex-direction: column;
    justify-content: flex-end;
  }
  .event-theme .celebrant-header {
    margin-bottom: 24px;
  }
  .event-theme .celebrant-bio .section-label {
    margin-bottom: 16px;
    /* Overrides the general "section titles always centered" rule
       above — in the default side-by-side layout (photo | text column)
       this label sits right above the celebrant's name, so it needs to
       stay left-aligned with it, not centered on its own. Themes that
       stack + center the whole celebrant block (Jardim/Jerusalém/
       Inverno) re-assert center for this specific label in their own
       CSS. */
    text-align: left;
  }
  .event-theme .celebrant-name {
    font-size: calc(38px * var(--font-size-scale, 1));
    margin: 0;
  }
  .event-theme .celebrant-divider {
    margin-top: 16px;
    margin-bottom: 0;
  }
  .event-theme .celebrant-bio-text {
    font-size: calc(18px * var(--font-size-scale, 1));
    color: var(--color-text-secondary);
    line-height: 1.65;
    text-align: justify;
  }
  .event-theme .celebrant-bio-text--live {
    white-space: pre-line;
  }
  .event-theme .celebrant-bio-text p {
    margin: 0 0 14px 0;
  }
  .event-theme .celebrant-bio-text p:last-child {
    margin-bottom: 0;
  }
  .event-theme .detail-card {
    background: var(--color-surface);
    border: 1px solid var(--color-border);
    border-radius: var(--c-radius);
    padding: 20px 24px;
    display: flex;
    align-items: center;
    gap: 18px;
  }
  .event-theme .detail-icon {
    width: 52px;
    height: 52px;
    border-radius: 12px;
    background: var(--color-primary-tint);
    display: flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
  }
  .event-theme .detail-icon .material-symbols-rounded {
    font-size: 24px;
    color: var(--color-primary);
    line-height: 1;
  }
  .event-theme .detail-body {
    display: flex;
    flex-direction: column;
    gap: 3px;
  }
  .event-theme .detail-label {
    font-size: calc(12px * var(--font-size-scale, 1));
    font-weight: 500;
    color: var(--color-text-secondary);
    margin-bottom: 2px;
  }
  .event-theme .detail-value {
    font-size: calc(16px * var(--font-size-scale, 1));
    font-weight: 600;
    color: var(--color-text);
  }
  .event-theme .detail-value-sub {
    font-size: calc(14px * var(--font-size-scale, 1));
    font-weight: 400;
    color: var(--color-text-secondary);
  }
  /*=========================
   GALLERY
=========================*/
  /* Grid uniforme, 3 colunas — cada foto no mesmo tamanho (aspect-ratio
     fixo), em sequência, até 6. Antes era um "bento" com altura em px
     fixa (grid-template-rows) + várias regras :has()/:nth-child()
     condicionais reposicionando por quantidade de fotos — frágil, e
     causava caixas gigantes/sem crop quando o :has() de alguma
     combinação não pegava certo. aspect-ratio na própria célula
     elimina essa classe de bug: a caixa nunca depende de altura de
     linha calculada, só da proporção declarada. */
  /* `auto-fit` + a capped `minmax` (not `repeat(3, 1fr)`), same reasoning
     as `.gift-list` below — fewer photos than columns center as a group
     instead of hugging the left edge. */
  .event-theme .gallery-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(260px, 340px));
    justify-content: center;
    gap: 14px;
    margin-top: 40px;
  }
  .event-theme .gallery-item {
    aspect-ratio: 4 / 3;
    overflow: hidden;
    border-radius: 10px;
    background: var(--color-card);
  }
  .event-theme .gallery-item img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
  }
  /*=========================
   MUSIC + AGENDA
=========================*/
  .event-theme .music-agenda-grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 100px;
    align-items: start;
  }
  .event-theme .music-agenda-grid--no-music {
    grid-template-columns: 1fr;
  }
  .event-theme .music-youtube-embed {
    border-radius: var(--c-radius);
    overflow: hidden;
    aspect-ratio: 16 / 9;
    width: 100%;
    margin-top: 40px;
  }
  .event-theme .music-youtube-embed iframe {
    width: 100%;
    height: 100%;
    border: none;
    display: block;
  }
  .event-theme .music-spotify-embed {
    border-radius: var(--c-radius);
    overflow: hidden;
    width: 100%;
    height: 152px;
    margin-top: 40px;
  }
  .event-theme .music-spotify-embed iframe {
    width: 100%;
    height: 100%;
    border: none;
    display: block;
  }
  .event-theme .music-card {
    background: var(--color-surface);
    border: 1px solid var(--color-border);
    border-radius: var(--c-radius);
    padding: 22px 24px;
    margin-top: 40px;
    max-width: 420px;
  }
  .event-theme .music-player {
    display: flex;
    align-items: center;
    gap: 14px;
  }
  .event-theme .music-thumb {
    width: 56px;
    height: 56px;
    border-radius: 12px;
    background: var(--color-primary-tint);
    display: flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
  }
  .event-theme .music-thumb .material-symbols-rounded {
    font-size: 26px;
    color: var(--color-primary);
    line-height: 1;
  }
  .event-theme .music-info {
    flex: 1;
    min-width: 0;
  }
  .event-theme .music-info strong {
    display: block;
    font-size: calc(15px * var(--font-size-scale, 1));
    font-weight: 600;
    color: var(--color-text);
    margin-bottom: 3px;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  }
  .event-theme .music-info span {
    font-size: calc(13px * var(--font-size-scale, 1));
    color: var(--color-text-secondary);
  }
  .event-theme .music-play-btn {
    width: 42px;
    height: 42px;
    border-radius: 50%;
    background: var(--color-text);
    color: var(--color-bg);
    border: none;
    display: flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
    cursor: pointer;
    margin-left: auto;
    transition: opacity 0.15s;
  }
  .event-theme .music-play-btn:hover {
    opacity: 0.75;
  }
  .event-theme .music-play-btn .material-symbols-rounded {
    font-size: 20px;
    line-height: 1;
  }
  /*=========================
   MOMENTS (Cerimônia/Festa — 2 independent cards, plain icon rows for
   date + location — reuses `.detail-icon`/`.detail-body` from
   Informações, just without the boxed `.detail-card` wrapper)
=========================*/
  /* Ceremony and Party are 2 independent moments (can be different days,
     different cities) — each gets its own card, so either can render
     alone. Jardim/Jerusalém override `.moments-grid`/`.moment-card` with
     their own alternating zigzag layout (see those themes' CSS); this is
     the side-by-side fallback for the other 4 themes. */
  .event-theme .moments-grid {
    margin-top: 40px;
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: 20px;
    align-items: start;
  }
  .event-theme .moment-card:only-child {
    grid-column: 1 / -1;
    max-width: 480px;
    justify-self: center;
  }
  .event-theme .moment-card {
    background: var(--color-surface);
    border: 1px solid var(--color-border);
    border-radius: var(--c-radius);
    padding: 24px;
    display: grid;
    gap: 22px;
  }
  .event-theme .moment-label {
    font-size: calc(12px * var(--font-size-scale, 1));
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--color-primary);
  }
  .event-theme .moment-row {
    display: flex;
    align-items: center;
    gap: 14px;
  }
  .event-theme .moment-maps-btn {
    width: 100%;
    justify-content: center;
    font-size: calc(13px * var(--font-size-scale, 1));
    padding: 10px 16px;
  }
  /* Mapa/Endereço switch — plain radio + label, no JS: the 2 inputs sit
     as direct children of `.moment-map-tabs` (siblings of the panels
     below), so `:checked ~ .moment-tab-panel--x` can reach across to
     show the right one. Works identically in editor_mode and on the
     real public page — the tab mechanism itself never needs Alpine. */
  .event-theme .moment-tab-input {
    position: absolute;
    opacity: 0;
    pointer-events: none;
  }
  .event-theme .moment-tab-buttons {
    display: flex;
    gap: 8px;
  }
  .event-theme .moment-tab-btn {
    cursor: pointer;
    font-size: calc(13px * var(--font-size-scale, 1));
    font-weight: 600;
    padding: 6px 14px;
    border-radius: 999px;
    background: var(--color-bg);
    color: var(--color-text-secondary);
    border: 1px solid var(--color-border);
  }
  .event-theme .moment-map-tabs:has(#tab-map-ceremony:checked) label[for="tab-map-ceremony"],
  .event-theme .moment-map-tabs:has(#tab-address-ceremony:checked) label[for="tab-address-ceremony"],
  .event-theme .moment-map-tabs:has(#tab-map-party:checked) label[for="tab-map-party"],
  .event-theme .moment-map-tabs:has(#tab-address-party:checked) label[for="tab-address-party"] {
    background: var(--color-primary);
    color: var(--color-primary-contrast, #fff);
    border-color: var(--color-primary);
  }
  .event-theme .moment-tab-panel {
    display: none;
    margin-top: 14px;
  }
  .event-theme #tab-map-ceremony:checked ~ .moment-tab-panel--map,
  .event-theme #tab-map-party:checked ~ .moment-tab-panel--map,
  .event-theme #tab-address-ceremony:checked ~ .moment-tab-panel--address,
  .event-theme #tab-address-party:checked ~ .moment-tab-panel--address {
    display: block;
  }
  .event-theme .moment-address-card {
    background: var(--color-bg);
    border-radius: var(--c-radius);
    padding: 18px 20px;
    display: grid;
    gap: 14px;
  }
  .event-theme .moment-address-label {
    display: block;
    font-size: calc(11px * var(--font-size-scale, 1));
    font-weight: 700;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: var(--color-text-secondary);
    margin-bottom: 4px;
  }
  .event-theme .moment-address-text {
    font-size: calc(14px * var(--font-size-scale, 1));
    color: var(--color-text);
    line-height: 1.5;
  }
  .event-theme .map-embed {
    border-radius: var(--c-radius);
    overflow: hidden;
    border: 1px solid var(--color-border);
    height: 180px;
  }
  .event-theme .map-embed iframe {
    display: block;
    width: 100%;
    height: 100%;
  }
  @media (max-width: 768px) {
    .event-theme .moments-grid {
      grid-template-columns: 1fr;
    }
  }
  .event-theme .section-empty-state {
    margin-top: 32px;
    padding: 48px 24px;
    text-align: center;
    background: var(--color-surface);
    border: 1px dashed var(--color-border);
    border-radius: var(--c-radius);
  }
  .event-theme .section-empty-icon {
    /* `!important` on `display` dates back to when `.material-symbols-rounded`
       came from the Google Fonts CDN, unlayered, which always used to beat
       our layered `@layer site` rule regardless of specificity. Fonts are
       vendorized now (core/fonts.css, inside `@layer core`), and `@layer
       site` already wins over `@layer core` by declaration order — the
       `!important` is very likely dead weight at this point, kept as-is
       here since removing it needs a visual check we haven't done yet. */
    display: inline-flex !important;
    align-items: center;
    justify-content: center;
    width: 52px;
    height: 52px;
    border-radius: 12px;
    background: var(--color-primary-tint);
    color: var(--color-primary);
    font-size: 24px;
    /* Same story: core/fonts.css's `.material-symbols-rounded` already
       sets `line-height: 1` today, so this redeclaration is likely also
       vestigial from the pre-vendorization days — kept for the same
       reason as the `!important` above. */
    line-height: 1;
    margin-bottom: 16px;
  }
  .event-theme .section-empty-message {
    font-size: calc(15px * var(--font-size-scale, 1));
    color: var(--color-text-secondary);
  }
  /* RSVP and messages — the empty-state sits next to the form (2-column
   grid, `align-items: start`), so it needs to align with the top of the
   form. `.section-empty-state` alone has `margin-top: 32px` to separate
   it from a heading above it (used in music/agenda/gallery/location/
   gifts, where it's the column's only content) — doesn't make sense in
   this side-column context. */
  .event-theme .rsvp-confirmed-col > .section-empty-state,
  .event-theme .messages-list-col > .section-empty-state {
    margin-top: 0;
  }
  .event-theme .section-list-total {
    margin-top: 4px;
    font-size: calc(14px * var(--font-size-scale, 1));
    font-weight: 600;
    color: var(--color-text);
    text-align: center;
  }
  /*=========================
   GIFTS
=========================*/
  /* Grid uniforme de 3 colunas — cada presente é um card compacto
     (ícone, título, valor + botão), não mais uma linha horizontal
     ocupando a largura toda. Fazia mais sentido como linha quando
     tinha descrição pra preencher o espaço; sem ela, virava uma linha
     bem vazia. */
  /* `auto-fit` + a capped `minmax` (not `repeat(3, 1fr)`) so cards keep a
     natural width and the row centers as a group via `justify-content`
     when there are fewer gifts than columns — 1 or 2 gifts no longer
     hug the left edge with empty columns beside them. */
  .event-theme .gift-list {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(260px, 340px));
    justify-content: center;
    gap: 16px;
    margin-top: 40px;
  }
  .event-theme .gift-row {
    background: var(--color-surface);
    border: 1px solid var(--color-border);
    border-radius: var(--c-radius);
    padding: 20px;
    display: flex;
    flex-direction: column;
    align-items: center;
    text-align: center;
    gap: 14px;
  }
  .event-theme .gift-header {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 14px;
    width: 100%;
    min-width: 0;
  }
  .event-theme .gift-meta {
    display: flex;
    flex-direction: column;
    align-items: stretch;
    gap: 12px;
    width: 100%;
  }
  .event-theme .gift-amount {
    font-size: calc(24px * var(--font-size-scale, 1));
    font-weight: 800;
    color: var(--color-text);
    white-space: nowrap;
  }
  .event-theme .btn-gift {
    padding: 12px 22px;
    font-size: calc(14px * var(--font-size-scale, 1));
    white-space: nowrap;
  }
  /*=========================
   GIFT PIX MODAL
=========================*/
  /* Fixed color (doesn't use theme tokens) for the accent — same teal as
     the setup chip in workspace/editor, PIX's own brand identity instead
     of reusing the event theme's --color-primary. */
  .event-theme .pix-modal-overlay {
    position: fixed;
    inset: 0;
    z-index: 2000;
    display: flex;
    align-items: safe center;
    justify-content: center;
    padding: 20px;
    overflow-y: auto;
    background: rgb(0 0 0 / 0.6);
  }
  /* Horizontal card, like a transaction receipt — info+copy on the left
     (75%), QR on the right, separated by a border. */
  .event-theme .pix-modal {
    position: relative;
    width: 100%;
    max-width: 760px;
    background: var(--color-surface);
    border: 1px solid var(--color-border);
    border-radius: var(--c-radius);
    padding: 28px 44px 28px 28px;
  }
  .event-theme .pix-modal-close {
    position: absolute;
    top: 14px;
    right: 14px;
    width: 28px;
    height: 28px;
    display: flex;
    align-items: center;
    justify-content: center;
    border: none;
    border-radius: 50%;
    background: transparent;
    color: var(--color-text-secondary);
    cursor: pointer;
    z-index: 1;
  }
  .event-theme .pix-modal-close:hover {
    background: rgb(0 0 0 / 0.06);
  }
  .event-theme .pix-modal-loading,
  .event-theme .pix-modal-error {
    font-size: 14px;
    color: var(--color-text-secondary);
    padding: 24px 0;
    text-align: center;
  }
  .event-theme .pix-modal-loading {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 12px;
  }
  .event-theme .pix-modal-spinner {
    width: 28px;
    height: 28px;
    border: 3px solid var(--color-border);
    border-top-color: var(--color-primary);
    border-radius: 50%;
    animation: btn-spin 0.7s linear infinite;
  }
  .event-theme .pix-modal-error {
    color: var(--color-danger, #b91c1c);
  }
  .event-theme .pix-modal-content {
    display: flex;
    align-items: stretch;
    gap: 28px;
  }
  .event-theme .pix-modal-info {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
    text-align: left;
  }
  .event-theme .pix-modal-header {
    display: flex;
    align-items: center;
    gap: 14px;
    margin-bottom: 18px;
  }
  .event-theme .pix-modal-icon {
    width: 44px;
    height: 44px;
    flex-shrink: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 50%;
    background: var(--color-primary-tint);
  }
  .event-theme .pix-modal-icon .material-symbols-rounded {
    font-size: 22px;
    color: var(--color-primary);
  }
  .event-theme .pix-modal-header-text {
    min-width: 0;
  }
  .event-theme .pix-modal-gift-title {
    font-size: 20px;
    font-weight: 700;
    color: var(--color-text);
    margin: 0;
  }
  .event-theme .pix-modal-gift-subtitle {
    font-size: 13px;
    color: var(--color-text-secondary);
    margin: 2px 0 0;
  }
  /* Context cards (beneficiary / amount) — theme tint, not a fixed color,
     to match whichever theme the event is using. */
  .event-theme .pix-modal-card {
    display: flex;
    align-items: flex-start;
    gap: 10px;
    padding: 12px 14px;
    border-radius: 12px;
    background: var(--color-primary-tint);
    margin-bottom: 10px;
  }
  .event-theme .pix-modal-card-icon {
    font-size: 18px;
    color: var(--color-primary);
    margin-top: 1px;
  }
  .event-theme .pix-modal-card-body {
    display: flex;
    flex-direction: column;
    min-width: 0;
  }
  .event-theme .pix-modal-card-label {
    font-size: 11px;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.4px;
    color: var(--color-text-secondary);
  }
  .event-theme .pix-modal-card-value {
    font-size: 14px;
    font-weight: 600;
    color: var(--color-text);
    margin-top: 2px;
  }
  .event-theme .pix-modal-card-note {
    font-size: 12px;
    color: var(--color-text-secondary);
    margin: 4px 0 0;
  }
  .event-theme .pix-modal-thanks {
    font-size: 12px;
    font-style: italic;
    color: var(--color-text-secondary);
    margin: 8px 0 0;
  }
  .event-theme .pix-modal-qr-col {
    flex: 0 0 230px;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    text-align: center;
    padding-left: 28px;
    border-left: 1px solid var(--color-border);
  }
  .event-theme .pix-modal-qr-col h3 {
    font-size: 15px;
    font-weight: 600;
    color: var(--color-text);
    margin-bottom: 4px;
    white-space: nowrap;
  }
  .event-theme .pix-modal-qr-hint {
    font-size: 12px;
    color: var(--color-text-secondary);
    margin: 0 0 14px;
  }
  .event-theme .pix-modal-qr {
    width: 150px;
    height: 150px;
    border: 1px solid var(--color-border);
    border-radius: 12px;
    padding: 8px;
    background: var(--white);
  }
  /* Primary copy button — PIX's fixed accent (same teal as the chip in
     workspace/editor), not the theme color, to keep PIX's identity
     recognizable on any event. */
  .event-theme .btn-pix-copy {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 8px;
    width: 100%;
    margin-top: 16px;
    padding: 10px 16px;
    border: none;
    border-radius: var(--radius-full, 9999px);
    background: rgb(50 188 173);
    color: var(--white);
    font-size: 13px;
    font-weight: 600;
    cursor: pointer;
    transition: background-color 0.15s ease;
  }
  .event-theme .btn-pix-copy:hover {
    background: rgb(44 166 153);
  }
  .event-theme .btn-pix-copy .material-symbols-rounded {
    font-size: 16px;
  }
  .event-theme .pix-modal-alt-key {
    margin-top: 22px;
    padding-top: 20px;
    border-top: 1px solid var(--color-border);
  }
  .event-theme .pix-modal-alt-body {
    text-align: left;
  }
  .event-theme .pix-modal-alt-label {
    display: block;
    font-size: 13px;
    color: var(--color-text-secondary);
    margin-bottom: 8px;
  }
  .event-theme .pix-modal-copy {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 8px 8px 8px 14px;
    border-radius: var(--radius-full, 9999px);
    background: rgb(50 188 173 / 0.12);
    border: 1px solid rgb(50 188 173 / 0.35);
  }
  .event-theme .pix-modal-code {
    flex: 1;
    min-width: 0;
    font-size: 12px;
    color: var(--color-text-secondary);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    text-align: left;
  }
  .event-theme .pix-modal-copy .btn-outline {
    padding: 6px 14px;
    font-size: 12px;
    flex-shrink: 0;
  }
  .event-theme .pix-modal-footer {
    text-align: center;
    font-size: 11px;
    color: var(--color-text-secondary);
    margin: 16px 0 0;
  }
  @media (max-width: 640px) {
    .event-theme .pix-modal-content {
      flex-direction: column;
    }
    .event-theme .pix-modal-qr-col {
      flex-basis: auto;
      padding-left: 0;
      padding-top: 20px;
      border-left: none;
      border-top: 1px solid var(--color-border);
    }
  }
  /*=========================
   FORMS (shared)
=========================*/
  .event-theme .form-row {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 12px;
    min-width: 0;
  }
  .event-theme .form-field {
    display: grid;
    gap: 6px;
    min-width: 0;
  }
  .event-theme .form-label {
    font-size: calc(13px * var(--font-size-scale, 1));
    font-weight: 600;
    color: var(--color-text-secondary);
    letter-spacing: 0.03em;
  }
  .event-theme .form-input {
    width: 100%;
    padding: 15px 18px;
    background: var(--color-bg);
    border: 1px solid var(--color-border);
    border-radius: 8px;
    color: var(--color-text);
    font-size: calc(15px * var(--font-size-scale, 1));
    font-family: inherit;
    outline: none;
    transition: border-color 0.15s;
  }
  .event-theme .form-input:focus {
    border-color: var(--color-primary);
  }
  .event-theme .form-attending-group {
    display: flex;
    gap: 10px;
  }
  .event-theme .form-attending-opt {
    flex: 1;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 8px;
    padding: 11px 16px;
    border: 1px solid var(--color-border);
    border-radius: 8px;
    font-size: calc(13px * var(--font-size-scale, 1));
    font-weight: 500;
    cursor: pointer;
    color: var(--color-text-secondary);
    transition:
      border-color 0.15s,
      background 0.15s,
      color 0.15s;
  }
  .event-theme .form-attending-opt:has(input:checked) {
    border-color: var(--color-primary);
    background: var(--color-primary-tint);
    color: var(--color-text);
  }
  .event-theme .form-attending-opt input {
    display: none;
  }
  /* Shown instead of the real form/action button in the editor canvas,
     the theme-gallery preview and the owner's own ?preview=1 — same
     visual as .rsvp-note, but generic (not RSVP-specific), reused
     across RSVP/Presentes/Tsedaká/Mensagens. */
  .event-theme .section-preview-note {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 8px;
    margin-top: 12px;
    font-size: calc(14px * var(--font-size-scale, 1));
    color: var(--color-text-secondary);
  }
  .event-theme .section-preview-note-icon {
    font-size: 18px;
    flex-shrink: 0;
    line-height: 1.4;
    color: var(--color-primary);
  }
  /*=========================
   DONATION
=========================*/
  .event-theme .donation-layout {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 40px;
    align-items: start;
    margin-top: 40px;
  }
  .event-theme .donation-card {
    background: var(--color-surface);
    border: 1px solid var(--color-border);
    border-radius: var(--c-radius);
    padding: 36px 32px;
  }
  .event-theme .donation-form {
    display: grid;
    /* Explicit minmax(0, 1fr), not the implicit single "auto" column a
       bare `display: grid` would fall back to — "auto" sizes to
       max-content, ignoring the container's actual width, which let
       .form-row's own content push this wider than the card on narrow
       phones. minmax(0, ...) also drops the item's automatic min-width
       (content-based) floor so it can shrink freely. */
    grid-template-columns: minmax(0, 1fr);
    gap: 14px;
  }
  .event-theme .pix-key {
    display: flex;
    flex-direction: column;
    gap: 8px;
    margin-top: 20px;
    padding: 16px 20px;
    background: var(--color-surface);
    border: 1px solid var(--color-border);
    border-radius: var(--c-radius);
    font-size: calc(13px * var(--font-size-scale, 1));
    color: var(--color-text-secondary);
  }
  .event-theme .pix-key-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
  }
  .event-theme .pix-key strong {
    font-size: calc(15px * var(--font-size-scale, 1));
    font-weight: 600;
    color: var(--color-text);
    word-break: break-all;
  }
  .event-theme .pix-copy-btn {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    padding: 6px 12px;
    border: 1px solid var(--color-border);
    border-radius: 999px;
    background: transparent;
    color: var(--color-text-secondary);
    font-size: calc(12px * var(--font-size-scale, 1));
    font-weight: 500;
    font-family: inherit;
    cursor: pointer;
    transition:
      color 0.15s,
      border-color 0.15s,
      background 0.15s;
    white-space: nowrap;
  }
  .event-theme .pix-copy-btn .material-symbols-rounded {
    font-size: 14px;
    line-height: 1;
  }
  .event-theme .pix-copy-btn:hover,
  .event-theme .pix-copy-btn.pix-copied {
    color: var(--color-primary);
    border-color: var(--color-primary);
    background: var(--color-primary-tint);
  }
  .event-theme .donation-confirmation-card,
  .event-theme .form-confirmation-card {
    text-align: center;
  }
  .event-theme .donation-confirmation-icon,
  .event-theme .form-confirmation-icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 52px;
    height: 52px;
    border-radius: 50%;
    background: var(--color-primary-tint);
    color: var(--color-primary);
    font-size: 28px;
    margin-bottom: 12px;
  }
  .event-theme .form-confirmation-card h3 {
    font-size: calc(19px * var(--font-size-scale, 1));
    font-weight: 700;
    color: var(--color-text);
    margin-bottom: 6px;
  }
  .event-theme .form-confirmation-card > p {
    font-size: calc(14px * var(--font-size-scale, 1));
    color: var(--color-text-secondary);
    margin-bottom: 16px;
  }
  .event-theme .form-error {
    background: var(--color-danger-tint, #fee2e2);
    color: var(--color-danger, #b91c1c);
    border-radius: 8px;
    padding: 10px 14px;
    font-size: calc(14px * var(--font-size-scale, 1));
    margin-bottom: 8px;
  }
  .event-theme .donation-confirmation-card h3 {
    font-size: calc(19px * var(--font-size-scale, 1));
    font-weight: 700;
    color: var(--color-text);
    margin-bottom: 6px;
  }
  .event-theme .donation-confirmation-card > p {
    font-size: calc(14px * var(--font-size-scale, 1));
    color: var(--color-text-secondary);
  }
  .event-theme .donation-confirmation-card .pix-key {
    text-align: left;
  }
  .event-theme .donation-confirmation-warning {
    display: flex;
    align-items: flex-start;
    gap: 8px;
    margin-top: 20px;
    padding: 14px 16px;
    background: var(--color-primary-tint);
    border-radius: var(--c-radius);
    font-size: calc(13px * var(--font-size-scale, 1));
    color: var(--color-text);
    text-align: left;
  }
  .event-theme .donation-confirmation-warning .material-symbols-rounded {
    font-size: 18px;
    flex-shrink: 0;
    line-height: 1.4;
    color: var(--color-primary);
  }
  .event-theme .donation-confirmation-card .btn-outline {
    margin-top: 20px;
  }
  /*=========================
   RSVP
=========================*/
  .event-theme .rsvp-note {
    display: flex;
    align-items: flex-start;
    gap: 8px;
    margin-top: 12px;
    font-size: calc(14px * var(--font-size-scale, 1));
    color: var(--color-text-secondary);
  }
  .event-theme .rsvp-note-icon {
    font-size: 18px;
    flex-shrink: 0;
    line-height: 1.4;
    color: var(--color-primary);
  }
  /* Single centered card — no confirmed-guest list here anymore (moved
     private, workspace-only: the public site listed every attendee's
     name/companions to any visitor, not just the organizer). */
  .event-theme .rsvp-section {
    display: grid;
    justify-content: center;
    margin-top: 40px;
  }
  .event-theme .rsvp-card {
    width: 100%;
    max-width: 560px;
    background: var(--color-surface);
    border: 1px solid var(--color-border);
    border-radius: var(--c-radius);
    padding: 36px 32px;
  }
  .event-theme .rsvp-form {
    display: grid;
    /* See .donation-form's comment — same reasoning. */
    grid-template-columns: minmax(0, 1fr);
    gap: 16px;
  }
  /*=========================
   MESSAGES
=========================*/
  .event-theme .message-card {
    background: var(--color-surface);
    border: 1px solid var(--color-border);
    border-radius: var(--c-radius);
    padding: 28px;
  }
  .event-theme .message-header {
    display: flex;
    align-items: center;
    gap: 14px;
    margin-bottom: 16px;
  }
  .event-theme .message-avatar {
    width: 42px;
    height: 42px;
    border-radius: 50%;
    background: var(--color-card);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: calc(15px * var(--font-size-scale, 1));
    font-weight: 700;
    color: var(--color-primary);
    flex-shrink: 0;
  }
  .event-theme .message-author {
    font-size: calc(15px * var(--font-size-scale, 1));
    font-weight: 700;
    color: var(--color-text);
  }
  .event-theme .message-date {
    font-size: calc(13px * var(--font-size-scale, 1));
    color: var(--color-text-secondary);
    margin-top: 2px;
  }
  .event-theme .message-text {
    font-size: calc(15px * var(--font-size-scale, 1));
    line-height: 1.65;
    color: var(--color-text-secondary);
  }
  .event-theme .messages-layout {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 40px;
    align-items: start;
    margin-top: 40px;
  }
  .event-theme .messages-form-card {
    background: var(--color-surface);
    border: 1px solid var(--color-border);
    border-radius: var(--c-radius);
    padding: 36px 32px;
  }
  .event-theme .message-form {
    display: grid;
    /* See .donation-form's comment — same reasoning. */
    grid-template-columns: minmax(0, 1fr);
    gap: 14px;
  }
  .event-theme .messages-list-col {
    display: grid;
    gap: 16px;
  }
  .event-theme .messages-list {
    display: grid;
    gap: 10px;
  }
  /*=========================
   FOOTER
=========================*/
  .event-theme footer,
  .event-theme .site-footer {
    position: relative;
    padding: 60px max(5%, calc((100% - 1100px) / 2));
    text-align: center;
    border-top: 1px solid var(--color-border);
    background: var(--color-surface);
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 12px;
    min-height: auto;
    justify-content: center;
  }
  .event-theme .footer-mazel-tov {
    font-size: calc(20px * var(--font-size-scale, 1));
    font-weight: 700;
    color: var(--color-text);
  }
  .event-theme .footer-badge {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    font-size: calc(11px * var(--font-size-scale, 1));
    color: var(--color-text-secondary);
    letter-spacing: 0.04em;
    text-decoration: none;
  }
  .event-theme .footer-badge-heart {
    font-size: 13px;
    color: var(--color-primary);
    font-variation-settings:
      "FILL" 1,
      "wght" 400,
      "GRAD" 0,
      "opsz" 24;
  }
  .event-theme .footer-divider {
    width: 260px;
    border: none;
    border-top: 1px solid var(--color-border);
    margin: 0;
  }
  .event-theme .footer-contacts {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 6px;
  }
  .event-theme .footer-contacts-label {
    font-size: calc(11px * var(--font-size-scale, 1));
    font-weight: 700;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--color-text-secondary);
    margin: 0;
  }
  .event-theme .footer-contacts-list {
    display: flex;
    align-items: center;
    gap: 10px;
    flex-wrap: wrap;
    justify-content: center;
  }
  .event-theme .footer-contacts-pipe {
    color: var(--color-border);
    font-size: calc(14px * var(--font-size-scale, 1));
  }
  .event-theme .footer-contact-link {
    display: flex;
    align-items: center;
    gap: 6px;
    font-size: calc(13px * var(--font-size-scale, 1));
    color: var(--color-text-secondary);
    text-decoration: none;
    transition: color 0.15s;
  }
  .event-theme .footer-contact-link:hover {
    color: var(--color-primary);
  }
  .event-theme .footer-contact-link .material-symbols-rounded {
    font-size: 14px;
  }
  /*=========================
   NAV — hamburger menu (medium screens and mobile)
=========================*/
  /* Nav's OWN breakpoint, wider (960px) than the rest of mobile (768px,
   see the MOBILE block below). With 7-8 links + CTA, `.nav-links` wrapped
   ugly (text on one side, CTA floating loose on the other) in a wide band
   just for the nav, between ~770px and ~890px on the plain site — and
   even earlier inside the editor's canvas, which has less effective
   width than the viewport (rail + margins eat into it). 960px covers
   that band with margin, including inside the editor. Kept separate from
   the rest of mobile on purpose: we don't want to stack the hero/grids
   this early, just avoid the menu wrapping. */
  @media (max-width: 960px) {
    /* No `overflow-x: hidden` here — used to have it, but overflow-x !=
       visible forces overflow-y to `auto` (CSS spec rule: the two
       directions collapse together when one of them isn't "visible"),
       and that clipped the dropdown menu below (see `.nav-links`), which
       extends past the nav's height. Not needed anymore either way —
       .nav-links is hidden by default in this range now (display:none),
       so there's no more content wide enough to overflow the nav's width
       while closed. */
    .event-theme nav {
      padding: 0 5%;
    }
    /* Hamburger menu — the whole `.nav-links` (including the RSVP CTA,
       which now lives outside it, in `.nav-actions`) used to simply
       disappear on mobile, with no way to navigate between sections at
       all. Now it becomes a dropdown: closed by default, opens as a
       full-width list below the nav when the hamburger is clicked. */
    .event-theme .nav-links {
      display: none;
      position: absolute;
      top: 100%;
      left: 0;
      right: 0;
      flex-direction: column;
      /* `center`, not `stretch` — with `stretch` each link became a
           full-width box, and the text (left-aligned by default) stuck
           to the edge instead of centered, like the rest of the menu at
           any other resolution. */
      align-items: center;
      gap: 4px;
      padding: 16px 5% 20px;
      background: var(--nav-bg);
      backdrop-filter: blur(16px);
      -webkit-backdrop-filter: blur(16px);
      border-bottom: 1px solid var(--color-border);
      box-shadow: 0 12px 24px rgba(0, 0, 0, 0.08);
    }
    .event-theme .nav-links.nav-links--open {
      display: flex;
    }
    .event-theme .nav-links a {
      padding: 10px 4px;
    }
    .event-theme .nav-menu-toggle {
      display: flex;
    }
  }
  /*=========================
   MOBILE
=========================*/
  @media (max-width: 768px) {
    .event-theme section {
      padding: 80px 5%;
      min-height: auto;
    }
    .event-theme section.hero {
      min-height: auto;
      padding: 0;
    }
    /* cqw, not vw — same reason as desktop above. On mobile
       `.hero-content` becomes `width: 100%` (see below), so its
       container ends up being ~the whole width of `.event-theme`
       anyway. */
    .event-theme h1 {
      font-size: var(--font-size-title, clamp(30px, 8cqw, 48px));
      letter-spacing: -1px;
    }
    .event-theme h2 {
      font-size: var(--font-size-section-title, clamp(20px, 5.5cqw, 28px));
    }
    .event-theme section.hero,
    .event-theme .hero {
      flex-direction: column;
      align-items: stretch;
    }
    .event-theme .hero-panel-image {
      order: 1;
      position: relative;
      height: 260px;
      flex-shrink: 0;
    }
    .event-theme .hero-content {
      order: 2;
      padding: 40px 5% 60px;
      width: 100%;
    }
    .event-theme .hero-panel-image::before {
      background: linear-gradient(
        180deg,
        transparent 0%,
        color-mix(
            in srgb,
            var(--color-hero-bg, var(--color-bg)) 90%,
            transparent
          )
          70%,
        var(--color-hero-bg, var(--color-bg)) 100%
      );
    }
    .event-theme .hero-bg {
      display: none;
    }
    /* .hero-actions stacking moved to its own 860px media query (see
       right after the base rule) — this 768px breakpoint is already
       covered by it. */
    .event-theme .music-agenda-grid,
    .event-theme .rsvp-section,
    .event-theme .donation-layout,
    .event-theme .messages-layout,
    .event-theme .celebrant-row {
      grid-template-columns: 1fr;
      gap: 40px;
    }
    /* Same automatic-minimum-size issue as .rsvp-form/.message-form/
       .donation-form above, one level up: even collapsed to a single
       1fr column, these grid items don't shrink below their own
       content's min-content by default, which pushed the card past
       the section's actual width on narrow phones. */
    .event-theme .music-agenda-grid > *,
    .event-theme .rsvp-section > *,
    .event-theme .donation-layout > *,
    .event-theme .messages-layout > *,
    .event-theme .celebrant-row > * {
      min-width: 0;
    }
    .event-theme .celebrant-photo {
      max-width: 260px;
      margin: 0 auto;
    }
    .event-theme .gallery-grid {
      grid-template-columns: repeat(2, 1fr);
      gap: 8px;
    }
    .event-theme .gallery-item {
      border-radius: 8px;
    }
    .event-theme .btn-gift {
      width: 100%;
      justify-content: center;
    }
    .event-theme .form-row {
      grid-template-columns: 1fr;
    }
    .event-theme .map-embed {
      height: 220px;
    }
    .event-theme .music-card {
      max-width: 100%;
    }
    .event-theme footer,
    .event-theme .site-footer {
      padding: 48px 5%;
    }
  }
}
