/**
 * Rosies reusable site-wide components.
 */

/* --------------------------------------------------------------------------
 * Donate artwork link
 *
 * WordPress menus: add `rtk-menu-donate` to the menu item's CSS Classes field.
 * Other content: add `rtk-menu-donate` directly to an anchor element.
 * Keep the link text as "Donate" so it remains available to screen readers.
 * -------------------------------------------------------------------------- */

.rtk-menu-donate > a,
a.rtk-menu-donate {
  display: inline-block !important;
  width: 105px;
  min-width: 105px;
  height: 32px;
  padding: 0 !important;
  overflow: hidden;
  vertical-align: middle;
  color: transparent !important;
  font-size: 0 !important;
  line-height: 0 !important;
  background-color: transparent !important;
  background-image: url('../decorators/donate.svg') !important;
  background-repeat: no-repeat !important;
  background-position: center !important;
  background-size: contain !important;
  border: 0 !important;
  box-shadow: none !important;
  transition:
    opacity 0.2s ease,
    transform 0.2s ease;
}

.rtk-menu-donate > a > span,
a.rtk-menu-donate > span {
  color: transparent !important;
  font-size: 0 !important;
  line-height: 0 !important;
}

.rtk-menu-donate > a:hover,
a.rtk-menu-donate:hover {
  opacity: 0.75;
  transform: translateY(-1px);
}

.rtk-menu-donate > a:focus-visible,
a.rtk-menu-donate:focus-visible {
  outline: 2px solid #f58221;
  outline-offset: 4px;
}

@media (prefers-reduced-motion: reduce) {
  .rtk-menu-donate > a,
  a.rtk-menu-donate {
    transition: none;
  }
}


/* ==========================================================================
 * 20-anniversary primitives (added by 20-anniversary-patch-01)
 *
 * Six site-wide primitives introduced by /20th-anniversary/. All reusable
 * on any page that opts in via el_class (on the row/column) or class on
 * the element itself.
 * ========================================================================== */


/* --------------------------------------------------------------------------
 * Section header — cyan Rift Soft
 *
 * Reusable centered section H2 in cyan (design system primary heading color).
 *
 * Usage:
 *   [vc_column_text]<h2 class="rtk-section-header-cyan">RTKids in Action</h2>[/vc_column_text]
 * -------------------------------------------------------------------------- */

.rtk-section-header-cyan {
  font-family: var(--rosies-font-display, 'Rift Soft'), 'Impact', sans-serif;
  font-weight: 500;
  font-size: clamp(28px, 3.5vw, 42px);
  line-height: 1.1;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  /* NO hardcoded color — manage via inline style on the child <span> in Bakery.
   * Pattern: <h2 class="rtk-section-header-cyan"><span style="color:#059dd9;">Learning for Life</span></h2>
   * (The "cyan" in the class name reflects the DEFAULT usage; actual color is per-instance.) */
  /* NO hardcoded text-align — inherit from parent column's desktop/tablet/phone_text_alignment.
   * Set desktop_text_alignment="left" or "center" on the [vc_column] in Bakery. */
  margin: 0 0 48px;
}




/* --------------------------------------------------------------------------
 * Page hero H1 — cyan Rift Soft
 *
 * Used for large page-title H1s like "20TH ANNIVERSARY".
 *
 * Usage:
 *   <h1 class="rtk-page-hero-h1"> … </h1>
 * -------------------------------------------------------------------------- */

.rtk-page-hero-h1 {
  font-family: var(--rosies-font-display, 'Rift Soft'), 'Impact', sans-serif;
  font-weight: 500;
  font-size: 60px;                     /* Match Salient dynamic "body h1" base rule (homepage H1) at desktop */
  line-height: 1;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  /* NO hardcoded color — manage via inline color on the <span class="rtk-hero-title-text"> in Bakery */
  text-align: left;
  margin: 0;
  display: inline-flex;
  align-items: center;                 /* Center H1 text vertically against decorator so no dead space below title */
  gap: 20px;
}


/* --------------------------------------------------------------------------
 * Hero with corner decorator + title (full-viewport-width photo)
 *
 * Layout model:
 *
 *   [ title strip — padding above decorator + decorator + H1 inline ]
 *   [ full-viewport-width photo ]
 *
 * The title strip is a normal-flow block. It has a NEGATIVE MARGIN-BOTTOM
 * on itself — this pulls the following sibling (the photo) upward, so the
 * decorator (which extends to the strip's bottom) drapes onto the photo's
 * top edge. Overlap distance is controlled by the strip's negative margin.
 *
 * Verified against production /20th-anniversary/ screenshot (Aug 2026):
 *   - Photo top edge is ~110px below the page top
 *   - Decorator is ~94px tall
 *   - Decorator sits ~62% in the white strip, ~38% (~36px) overlapping photo
 *
 * Row shortcode requirements:
 *   [vc_row type="full_width_content" content_placement="stretch"
 *           el_class="rtk-hero-with-corner-decorator"
 *           top_padding="0" bottom_padding="0"]
 *     [vc_column column_padding_position="none" width="1/1"]
 *       [vc_column_text el_class="rtk-hero-title-overlay"]
 *         <h1 class="rtk-page-hero-h1">
 *           <img class="rtk-hero-decorator-inline"
 *                src="/wp-content/uploads/…/decorator.svg" alt="" aria-hidden="true" />
 *           <span class="rtk-hero-title-text">Page Title</span>
 *         </h1>
 *       [/vc_column_text]
 *       [image_with_animation image_url="XXX" el_class="rtk-hero-photo-fullbleed"]
 *     [/vc_column]
 *   [/vc_row]
 * -------------------------------------------------------------------------- */

.rtk-hero-with-corner-decorator {
  position: relative;
  overflow: visible !important;
  padding: 0 !important;
}


/* --- Title strip (white band above the photo) ---------------------------
 * Normal-flow block. Padding-top defines white space above decorator;
 * negative margin-bottom pulls the photo below up so decorator drapes.
 *
 * Numbers below produce: ~28px of white above decorator, ~58px of white
 * around decorator's upper portion, ~36px of decorator hanging over photo.
 * ------------------------------------------------------------------------- */

.rtk-hero-with-corner-decorator .rtk-hero-title-overlay {
  position: relative;
  z-index: 2;
  padding: 0 0 0 0;                  /* no top padding — pulls row up as tight to header as possible */
  padding-left: max(40px, 3vw);
  margin: 0 0 -158px 0;              /* NEGATIVE = photo rises 158px; ~ 50% of 317px decorator */
  background: transparent;
}

.rtk-hero-with-corner-decorator .rtk-hero-title-overlay .wpb_wrapper,
.rtk-hero-with-corner-decorator .rtk-hero-title-overlay p {
  margin: 0;
  padding: 0;
}


/* --- Inline decorator SVG next to the H1 title -------------------------- */

.rtk-hero-decorator-inline {
  /* Sized to match production visual scale at 1440 viewport.
   * Parent <h1> is display:inline-flex, which without flex:0 0 auto would stretch it.
   * Width tuned so the green circle matches production's green circle at ~127px. */
  display: block;
  flex: 0 0 auto;
  width: 340px !important;
  height: 317px !important;
  position: relative;
  top: 80px;                           /* Nudge decorator down 80px vs H1 baseline */
  z-index: 3;
}


.rtk-hero-title-text {
  display: inline-block;
  position: relative;
  top: -40px;                          /* Nudge H1 text up 40px vs vertical center of decorator */
}


/* Desktop-only: tighten the header → photo gap by 60px. Three coordinated
 * moves so title + decorator + photo all shift up together:
 *   - .rtk-hero-title-overlay margin-bottom: -158 → -218  (photo up 60)
 *   - .rtk-hero-decorator-inline top: 80 → 20             (decorator up 60)
 *   - .rtk-hero-title-text top: -40 → -100                (H1 text up 60)
 *
 * Placed AFTER the base rules for these three selectors so cascade
 * source-order lets the media-query values win at equal specificity.
 * Tablet/mobile unchanged. */
@media (min-width: 1000px) {
  .rtk-hero-with-corner-decorator .rtk-hero-title-overlay {
    margin-bottom: -218px;
  }
  .rtk-hero-decorator-inline {
    top: 20px;
  }
  .rtk-hero-title-text {
    top: -100px;
  }
}


/* --- Full-viewport-width photo -------------------------------------------
 * Salient's image_with_animation wraps the <img> in .img-with-aniamtion-wrap
 * (yes, that's a Salient typo in the class name — must be matched exactly)
 * (block, width:auto by default). We force the outer wrap + the <img> to
 * 100vw and left-shift so it starts at the viewport left edge, regardless
 * of any residual container padding.
 * ------------------------------------------------------------------------- */

.rtk-hero-with-corner-decorator .rtk-hero-photo-fullbleed,
.rtk-hero-with-corner-decorator .img-with-aniamtion-wrap:has(> .inner > .hover-wrap > .hover-wrap-inner > .rtk-hero-photo-fullbleed) {
  display: block;
  width: 100vw;
  max-width: 100vw;
  margin-left: calc(50% - 50vw);
  margin-right: calc(50% - 50vw);
  position: relative;
  z-index: 1;
}

.rtk-hero-with-corner-decorator .rtk-hero-photo-fullbleed img,
.rtk-hero-with-corner-decorator img.rtk-hero-photo-fullbleed {
  display: block;
  width: 100%;
  height: 425px;                 /* Match production hero height at 1440 */
  object-fit: cover;             /* Crop, don't distort — preserves source aspect */
  object-position: center center;/* Trim equally from top and bottom (default) */
  margin: 0;
}


/* --------------------------------------------------------------------------
 * Hero crop-anchor modifiers (site-wide)
 *
 * Add ONE of the following classes to the header [vc_row] alongside
 * .rtk-hero-with-corner-decorator to steer which vertical slice of the
 * hero photo is preserved when the 425px box cover-crops it. All three are
 * horizontally centered — only the vertical anchor changes.
 *
 *   .rtk-hero-crop-top       Keep the TOP of the photo, trim the bottom.
 *   .rtk-hero-crop-center    Keep the MIDDLE (same as the default).
 *   .rtk-hero-crop-bottom    Keep the BOTTOM of the photo, trim the top.
 *
 * Usage in Bakery Row Settings > Extra Class Name:
 *   rtk-hero-with-corner-decorator rtk-hero-crop-top
 * -------------------------------------------------------------------------- */
.rtk-hero-crop-top .rtk-hero-photo-fullbleed img,
.rtk-hero-crop-top img.rtk-hero-photo-fullbleed {
  object-position: center top;
}

.rtk-hero-crop-center .rtk-hero-photo-fullbleed img,
.rtk-hero-crop-center img.rtk-hero-photo-fullbleed {
  object-position: center center;
}

.rtk-hero-crop-bottom .rtk-hero-photo-fullbleed img,
.rtk-hero-crop-bottom img.rtk-hero-photo-fullbleed {
  object-position: center bottom;
}


/* --- Responsive ---------------------------------------------------------- */

@media (max-width: 999px) {
  .rtk-hero-with-corner-decorator .rtk-hero-photo-fullbleed img,
  .rtk-hero-with-corner-decorator img.rtk-hero-photo-fullbleed {
    height: 340px;                     /* Proportional to 425 at desktop */
  }
  .rtk-hero-decorator-inline {
    width: 220px !important;
    height: 205px !important;
    top: 52px;                         /* 80 × (220/340) proportional shift */
  }
  .rtk-hero-with-corner-decorator .rtk-hero-title-overlay {
    padding-top: 0;
    margin-bottom: -102px;               /* ~50% of 205px */
  }
  .rtk-page-hero-h1 {
    font-size: 42px;                   /* Match Salient dynamic H1 at 691–999px */
    gap: 14px;
  }
  .rtk-hero-title-text {
    top: -28px;                        /* -40 × (42/60) proportional shift */
  }
}

@media (max-width: 600px) {
  .rtk-hero-with-corner-decorator .rtk-hero-photo-fullbleed img,
  .rtk-hero-with-corner-decorator img.rtk-hero-photo-fullbleed {
    height: 260px;                     /* Proportional to 425 at desktop */
  }
  .rtk-hero-with-corner-decorator .rtk-hero-title-overlay {
    padding-top: 0;
    padding-left: 16px;
    margin-bottom: -70px;                /* ~50% of 140px */
  }
  .rtk-hero-decorator-inline {
    width: 150px !important;
    height: 140px !important;
    top: 35px;                         /* 80 × (150/340) proportional shift */
  }
  .rtk-page-hero-h1 {
    font-size: 39px;                   /* Match Salient dynamic H1 at ≤690px */
    gap: 10px;
  }
  .rtk-hero-title-text {
    top: -26px;                        /* -40 × (39/60) proportional shift */
  }
}


/* --------------------------------------------------------------------------
 * Portrait — dark blue frame decorator
 *
 * Wraps an [image_with_animation] portrait with a square dashed dark-blue
 * SVG frame (DarkBlueFrame.svg, attachment ID 278) painted BEHIND the
 * portrait via ::before. Portrait itself is rendered circular by
 * border_radius="500px" on image_with_animation.
 *
 * Frame source SVG is 206x206, stroke #005E8E. We paint via CSS
 * background-image so the frame scales cleanly with the portrait wrapper.
 *
 * Usage: el_class="rtk-portrait-frame-darkblue" on the column that
 * contains the portrait image_with_animation.
 * -------------------------------------------------------------------------- */

.rtk-portrait-frame-darkblue {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
}

.rtk-portrait-frame-darkblue::before {
  content: '';
  position: absolute;
  top: 50%;
  left: 50%;
  width: 340px;
  height: 340px;
  transform: translate(-50%, -50%) rotate(-8deg);
  background-image: url("/wp-content/uploads/2026/08/DarkBlueFrame.svg");
  background-repeat: no-repeat;
  background-position: center;
  background-size: contain;
  z-index: 0;
  pointer-events: none;
}

.rtk-portrait-frame-darkblue .wpb_wrapper,
.rtk-portrait-frame-darkblue .img-with-aniamtion-wrap,
.rtk-portrait-frame-darkblue .img-with-animation {
  position: relative;
  z-index: 1;
}

@media (max-width: 999px) {
  .rtk-portrait-frame-darkblue::before {
    /* Frame must be BIGGER than the 300px photo cap on tablet so it
     * remains visible around the portrait. Was 280 (smaller than the
     * photo) which fully covered the frame with the photo. */
    width: 360px;
    height: 360px;
  }
}

@media (max-width: 600px) {
  .rtk-portrait-frame-darkblue::before {
    /* Frame must be BIGGER than the 240px photo cap so it's visible
     * around/behind the portrait. Was 240 (same as photo) which made
     * the frame invisible — fully covered by the photo. */
    width: 290px;
    height: 290px;
  }
}


/* --------------------------------------------------------------------------
 * Portrait — blue radiating sunburst frame decorator
 *
 * Wraps an [image_with_animation] portrait with a hand-drawn radiating
 * sunburst of short blue lines (BlueFrame_SharingMentor.svg, attachment
 * ID 528) painted BEHIND the portrait via ::before. Portrait itself is
 * rendered circular by border_radius="500px" on image_with_animation.
 *
 * Frame source SVG is 190x190 (perfect square, 1:1), fill #009CD8. We
 * paint via CSS background-image so it scales cleanly with the portrait
 * wrapper. NO rotation — the burst artwork is symmetric and reads best
 * upright; the asymmetric spacing of the paths themselves provides the
 * hand-drawn feel.
 *
 * Sizing matches .rtk-portrait-frame-darkblue (340 desktop / 360 tablet /
 * 290 mobile) — the frame must be BIGGER than the portrait's photo cap
 * at every breakpoint so the radiating lines are visible around/behind
 * the portrait, not fully covered by it.
 *
 * Usage: class="rtk-portrait-frame-blueframe" on the column that
 * contains the portrait image_with_animation.
 * -------------------------------------------------------------------------- */

.rtk-portrait-frame-blueframe {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
}

.rtk-portrait-frame-blueframe::before {
  content: '';
  position: absolute;
  top: 50%;
  left: 50%;
  width: 340px;
  height: 340px;
  transform: translate(-50%, -50%);
  background-image: url("/wp-content/uploads/2026/08/BlueFrame_SharingMentor.svg");
  background-repeat: no-repeat;
  background-position: center;
  background-size: contain;
  z-index: 0;
  pointer-events: none;
}

.rtk-portrait-frame-blueframe .wpb_wrapper,
.rtk-portrait-frame-blueframe .img-with-aniamtion-wrap,
.rtk-portrait-frame-blueframe .img-with-animation {
  position: relative;
  z-index: 1;
}

@media (max-width: 999px) {
  .rtk-portrait-frame-blueframe::before {
    /* Frame must be BIGGER than the 300px photo cap on tablet so the
     * radiating lines remain visible around the portrait. */
    width: 360px;
    height: 360px;
  }
}

@media (max-width: 600px) {
  .rtk-portrait-frame-blueframe::before {
    /* Frame must be BIGGER than the 240px photo cap so it's visible
     * around/behind the portrait. */
    width: 290px;
    height: 290px;
  }
}

/* Grow In on scroll — the sunburst starts hidden at 0.8× scale and
 * expands to 1.0× scale + full opacity as the row enters the viewport.
 * The .rtk-bounce-play class is added by the shared IntersectionObserver
 * in custom.js when the column scrolls into view. Fires ONCE per page
 * load. Uses the same JS observer as .rtk-portrait-frame-darkblue and
 * .rtk-testimonial-with-orange-arrow — no new observer needed. */
@keyframes rtk-frame-grow {
  0% {
    transform: translate(-50%, -50%) scale(0.6);
    opacity: 0;
  }
  100% {
    transform: translate(-50%, -50%) scale(1);
    opacity: 1;
  }
}

.rtk-portrait-frame-blueframe::before {
  /* Start hidden — the ::before is added at page load, but we don't
   * want the sunburst to flash on first paint before the observer
   * runs. Set opacity: 0 as the base state; the grow-in animation
   * fills it in when .rtk-bounce-play is added. */
  opacity: 0;
}

.rtk-portrait-frame-blueframe.rtk-bounce-play::before {
  animation: rtk-frame-grow 0.9s ease-out 1 forwards;
}

@media (prefers-reduced-motion: reduce) {
  /* Respect user's OS-level motion preferences — no scale-in, just show
   * the sunburst immediately at full size / full opacity. */
  .rtk-portrait-frame-blueframe::before {
    opacity: 1;
  }
  .rtk-portrait-frame-blueframe.rtk-bounce-play::before {
    animation: none;
  }
}


/* --------------------------------------------------------------------------
 * Testimonial quote block
 *
 * Large serif italic quote + attribution below. Reusable inside any
 * two/three-column testimonial layout.
 *
 * Usage on a [vc_column_text] block containing:
 *   <p class="rtk-testimonial-quote-text">"..."</p>
 *   <p class="rtk-testimonial-quote-attribution">— Name, Role</p>
 *
 * (The wrapping [vc_column_text] gets no special class; the two <p>s do.)
 * -------------------------------------------------------------------------- */

.rtk-testimonial-quote-text {
  font-family: 'Roboto', -apple-system, BlinkMacSystemFont, sans-serif;
  font-style: italic;
  font-weight: 400;
  font-size: clamp(18px, 1.6vw, 22px);
  line-height: 1.5;
  /* NO hardcoded color — manage via inline style on the child <span> in Bakery.
   * Pattern: <p class="rtk-testimonial-quote-text"><span style="color:#1F1F1F;">"quote"</span></p> */
  margin: 0 0 8px;
  /* Salient's .wpb_text_column p { padding-bottom: 1.5em } would otherwise
     add ~33px of phantom gap between the quote and the attribution. Kill it. */
  padding-bottom: 0 !important;
}

.rtk-testimonial-quote-attribution {
  font-family: 'Roboto', -apple-system, BlinkMacSystemFont, sans-serif;
  font-style: normal;
  font-weight: 700;
  font-size: clamp(14px, 1.2vw, 16px);
  line-height: 1.4;
  /* NO hardcoded color — manage via inline style on the child <span> in Bakery.
   * Pattern: <p class="rtk-testimonial-quote-attribution"><span style="color:#059dd9;">— Name, Role</span></p> */
  margin: 0;
  text-transform: none;
  letter-spacing: 0.01em;
  padding-bottom: 0 !important;
}


/* --------------------------------------------------------------------------
 * Orange curly-arrow accent (photo → quote pointer)
 *
 * Absolute-positioned orange curly arrow (Quote_ArrowOrange.svg, ID 277)
 * that sits in the gutter between a portrait column (left) and a quote
 * column (right), pointing from portrait → quote. Painted as a CSS
 * background so no image_with_animation markup is needed inside the row.
 *
 * Usage on the ROW that contains the portrait+quote columns:
 *   el_class="rtk-testimonial-with-orange-arrow"
 *
 * The arrow is anchored to the RIGHT column's left edge (i.e. the gutter),
 * NOT to the row's center. This means the arrow travels with the columns
 * when the row has asymmetric horizontal padding (e.g. right_padding_desktop
 * to push content leftward). Vertically centered on the right column.
 * -------------------------------------------------------------------------- */

.rtk-testimonial-with-orange-arrow {
  position: relative;
  overflow: visible !important;
}

/* Anchor the arrow to the right (quote) column's own box.
 *
 * NB: Salient nests both columns inside an intermediate `.row_col_wrap_12`
 * wrapper, so `.rtk-...-arrow > .wpb_column` matches NOTHING. Using the
 * adjacent-sibling combinator (.wpb_column + .wpb_column) reliably picks
 * the SECOND column without caring about the wrapper depth. */
.rtk-testimonial-with-orange-arrow .wpb_column + .wpb_column {
  position: relative;
}

/* Orange arrow position: base is top:50% / left:-60px on the second column.
 * On /who-we-are/ (rtk-work-of-heart-row), we nudge it UP 140px and RIGHT 50px
 * from the shared base. We keep the shared rule shared and scope the offset
 * to the who-we-are row so other pages using the primitive are unaffected. */
.rtk-testimonial-with-orange-arrow .wpb_column + .wpb_column::before {
  content: '';
  position: absolute;
  top: 50%;
  left: -60px;
  width: 90px;
  height: 150px;
  transform: translateY(-50%) rotate(15deg);
  transform-origin: 50% 50%;
  background-image: url("/wp-content/uploads/2026/08/Quote_ArrowOrange.svg");
  background-repeat: no-repeat;
  background-position: center;
  background-size: contain;
  z-index: 3;
  pointer-events: none;
}

/* Who-we-are page nudge: up 140px, right 50px vs the shared base. */
.rtk-work-of-heart-row.rtk-testimonial-with-orange-arrow .wpb_column + .wpb_column::before {
  left: -10px;                                   /* -60 + 50 = -10 */
  transform: translateY(calc(-50% - 140px)) rotate(15deg);
}

/* --- Bounce animation --------------------------------------------------- */
/* The row gets `.rtk-bounce-play` added by JS (see theme's rtk-bounce.js /
 * bounce IntersectionObserver in functions.php) when it first scrolls into
 * view. The pseudo-element then runs a vertical bob 3 times and stops.
 *
 * IMPORTANT: the animation's transform MUST preserve the base transform
 * (translateY(-50%) rotate(15deg)) or the arrow will jump to the top-left
 * of the column when the animation kicks off. That's what the keyframes
 * below do — each frame is the base transform PLUS a small extra Y delta. */
@keyframes rtk-arrow-bob {
  0%   { transform: translateY(-50%)              rotate(15deg); }
  25%  { transform: translateY(calc(-50% - 12px)) rotate(15deg); }
  50%  { transform: translateY(-50%)              rotate(15deg); }
  75%  { transform: translateY(calc(-50% - 6px))  rotate(15deg); }
  100% { transform: translateY(-50%)              rotate(15deg); }
}

/* Who-we-are page has base transform of translateY(calc(-50% - 140px)),
 * so its bounce keyframes must preserve that offset or the arrow will
 * jump back down when the animation kicks off. */
@keyframes rtk-arrow-bob-whoweare {
  0%   { transform: translateY(calc(-50% - 140px))         rotate(15deg); }
  25%  { transform: translateY(calc(-50% - 152px))         rotate(15deg); }
  50%  { transform: translateY(calc(-50% - 140px))         rotate(15deg); }
  75%  { transform: translateY(calc(-50% - 146px))         rotate(15deg); }
  100% { transform: translateY(calc(-50% - 140px))         rotate(15deg); }
}

.rtk-work-of-heart-row.rtk-testimonial-with-orange-arrow.rtk-bounce-play .wpb_column + .wpb_column::before {
  animation: rtk-arrow-bob-whoweare 0.9s ease-in-out 3;
}

.rtk-testimonial-with-orange-arrow.rtk-bounce-play .wpb_column + .wpb_column::before {
  animation: rtk-arrow-bob 0.9s ease-in-out 3;
}

/* Respect reduced-motion preferences */
@media (prefers-reduced-motion: reduce) {
  .rtk-testimonial-with-orange-arrow.rtk-bounce-play .wpb_column + .wpb_column::before,
  .rtk-testimonial-with-orange-arrow-left.rtk-bounce-play .wpb_column:first-of-type::before,
  .rtk-testimonial-with-orange-arrow-right.rtk-bounce-play .wpb_column + .wpb_column::before {
    animation: none;
  }
}

/* --- .rtk-testimonial-with-orange-arrow-left ---------------------------
 * Mirror of the original, but the arrow lives on the FIRST column
 * (photo/left) pointing INWARD toward the quote on the right.
 * Uses arroworange-left.svg (points down-and-right).
 *
 * Same 90x150 size, same 15deg rotation, same bounce behavior.
 * Anchored at the RIGHT edge of the first column (right: -60px)
 * so it sits in the gutter between the two columns.
 * -------------------------------------------------------------------- */

.rtk-testimonial-with-orange-arrow-left {
  position: relative;
  overflow: visible !important;
}

.rtk-testimonial-with-orange-arrow-left .wpb_column:first-of-type {
  position: relative;
}

.rtk-testimonial-with-orange-arrow-left .wpb_column:first-of-type::before {
  content: '';
  position: absolute;
  top: 50%;
  right: -60px;
  width: 90px;
  height: 150px;
  transform: translateY(-50%) rotate(15deg);
  transform-origin: 50% 50%;
  background-image: url("../decorators/arroworange-left.svg");
  background-repeat: no-repeat;
  background-position: center;
  background-size: contain;
  z-index: 3;
  pointer-events: none;
}

.rtk-testimonial-with-orange-arrow-left.rtk-bounce-play .wpb_column:first-of-type::before {
  animation: rtk-arrow-bob 0.9s ease-in-out 3;
}

/* --- .rtk-testimonial-with-orange-arrow-right --------------------------
 * Same anchor as the original (second column, left edge) but uses
 * arroworange-right.svg (points down-and-left).
 *
 * Same 90x150 size, same 15deg rotation, same bounce behavior.
 * -------------------------------------------------------------------- */

.rtk-testimonial-with-orange-arrow-right {
  position: relative;
  overflow: visible !important;
}

.rtk-testimonial-with-orange-arrow-right .wpb_column + .wpb_column {
  position: relative;
}

.rtk-testimonial-with-orange-arrow-right .wpb_column + .wpb_column::before {
  content: '';
  position: absolute;
  top: 50%;
  left: -60px;
  width: 90px;
  height: 150px;
  transform: translateY(-50%) rotate(15deg);
  transform-origin: 50% 50%;
  background-image: url("../decorators/arroworange-right.svg");
  background-repeat: no-repeat;
  background-position: center;
  background-size: contain;
  z-index: 3;
  pointer-events: none;
}

.rtk-testimonial-with-orange-arrow-right.rtk-bounce-play .wpb_column + .wpb_column::before {
  animation: rtk-arrow-bob 0.9s ease-in-out 3;
}

/* --- rtk-photo-circle: cap portraits on Chesney + Lauren rows -----------
 *
 * The image_with_animation shortcode has max_width="300px" — that value
 * applies at desktop, but on smaller viewports Salient's responsive
 * defaults can let the wrapper drift, so the portrait looks oversized
 * relative to its column. Pin the wrapper explicitly:
 *   ≤999px (tablet): still 300px — tablet columns are wide enough
 *   ≤600px (mobile): 240px — matches the site-wide .rtk-photo-circle
 *                     primitive default (in decorators.css) so mobile
 *                     reads consistently with the alumni-row circles.
 *
 * Scoped to the two testimonial rows so we don't upsize the alumni-row
 * circles on desktop.
 * -------------------------------------------------------------------- */
.rtk-testimonial-with-orange-arrow .rtk-photo-circle,
.rtk-testimonial-with-orange-arrow .img-with-aniamtion-wrap,
.rtk-portrait-frame-darkblue .rtk-photo-circle,
.rtk-portrait-frame-darkblue .img-with-aniamtion-wrap {
  max-width: 300px !important;
  margin-left: auto;
  margin-right: auto;
}

@media (max-width: 600px) {
  .rtk-testimonial-with-orange-arrow .rtk-photo-circle,
  .rtk-testimonial-with-orange-arrow .img-with-aniamtion-wrap,
  .rtk-portrait-frame-darkblue .rtk-photo-circle,
  .rtk-portrait-frame-darkblue .img-with-aniamtion-wrap {
    max-width: 240px !important;
  }
}

/* --- DarkBlue frame bounce ---------------------------------------------- */
/* The Lauren column (.rtk-portrait-frame-darkblue) gets `.rtk-bounce-play`
 * added by the same JS observer when it first scrolls into view. The frame
 * (::before pseudo) then runs a softer, slower vertical bob 2 times and
 * rests. The frame is bigger than the arrow so a subtler motion feels less
 * busy while still catching the eye.
 *
 * IMPORTANT: the frame's base transform is `translate(-50%,-50%) rotate(-8deg)`,
 * so every keyframe must preserve those axes and only add a small extra Y
 * delta — otherwise the frame will jump to the top-left of the column when
 * the animation kicks off. */
@keyframes rtk-frame-bob {
  0%   { transform: translate(-50%, -50%)                       rotate(-8deg); }
  25%  { transform: translate(-50%, calc(-50% - 8px))           rotate(-8deg); }
  50%  { transform: translate(-50%, -50%)                       rotate(-8deg); }
  75%  { transform: translate(-50%, calc(-50% - 4px))           rotate(-8deg); }
  100% { transform: translate(-50%, -50%)                       rotate(-8deg); }
}

.rtk-portrait-frame-darkblue.rtk-bounce-play::before {
  animation: rtk-frame-bob 1.4s ease-in-out 2;
}

@media (prefers-reduced-motion: reduce) {
  .rtk-portrait-frame-darkblue.rtk-bounce-play::before {
    animation: none;
  }
}

@media (max-width: 999px) {
  .rtk-testimonial-with-orange-arrow .wpb_column + .wpb_column::before {
    width: 60px;
    height: 100px;
    left: -40px;
  }
}

/* Mobile arrow + Hawaii quote padding moved to bottom of file (patch-17) to
 * clear later `!important` base rules that were zeroing out the padding.
 * See "Cascade source order" section at file end. */



/* ==========================================================================
 * Flickity carousel — hand-drawn PNG arrows
 *
 * Uses the theme's blue PNG arrows sitting at:
 *   wp-content/themes/rosies/assets/decorators/arrow-blue-left.png
 *   wp-content/themes/rosies/assets/decorators/arrow-blue-right.png
 *
 * Same visual family as the home testimonial carousel's purple arrows;
 * different color asset per section (purple on home, blue here).
 *
 * Two positioning variants — pick ONE per carousel:
 *
 *   .rtk-carousel-arrows-navy-midslide
 *     Arrows vertically centered on the slides. Use when there is NO
 *     header above the carousel.
 *
 *   .rtk-carousel-arrows-navy-flanking
 *     Arrows lifted up to flank the section H2 above the carousel
 *     (e.g. RTKIDS IN ACTION on /20th-anniversary/).
 *
 * Class goes on the ROW (or any ancestor) that contains a Flickity carousel.
 * To use a different color arrow: add another PNG pair to the decorators
 * folder and add a new selector overriding `background-image`.
 * ========================================================================== */


/* --- Shared: PNG arrow paint + button chrome reset ----------------------- */

.rtk-carousel-arrows-navy-midslide .nectar-flickity .flickity-prev-next-button,
:is(.rtk-carousel-arrows-navy-flanking, .rtk-gallery-row) .nectar-flickity .flickity-prev-next-button {
  width: 100px !important;
  height: 40px !important;
  background-color: transparent !important;
  background-repeat: no-repeat;
  background-position: center;
  background-size: contain;
  border: 0 !important;
  border-radius: 0 !important;
  box-shadow: none !important;
  opacity: 1 !important;
}

.rtk-carousel-arrows-navy-midslide .nectar-flickity .flickity-prev-next-button.previous,
:is(.rtk-carousel-arrows-navy-flanking, .rtk-gallery-row) .nectar-flickity .flickity-prev-next-button.previous {
  background-image: url("../decorators/arrow-blue-left.png") !important;
}

.rtk-carousel-arrows-navy-midslide .nectar-flickity .flickity-prev-next-button.next,
:is(.rtk-carousel-arrows-navy-flanking, .rtk-gallery-row) .nectar-flickity .flickity-prev-next-button.next {
  background-image: url("../decorators/arrow-blue-right.png") !important;
}

/* Hide Flickity's default inline SVG chevron */
.rtk-carousel-arrows-navy-midslide .nectar-flickity .flickity-prev-next-button .flickity-button-icon,
:is(.rtk-carousel-arrows-navy-flanking, .rtk-gallery-row) .nectar-flickity .flickity-prev-next-button .flickity-button-icon,
.rtk-carousel-arrows-navy-midslide .nectar-flickity .flickity-prev-next-button svg,
:is(.rtk-carousel-arrows-navy-flanking, .rtk-gallery-row) .nectar-flickity .flickity-prev-next-button svg {
  display: none !important;
}

.rtk-carousel-arrows-navy-midslide .nectar-flickity .flickity-prev-next-button::before,
.rtk-carousel-arrows-navy-midslide .nectar-flickity .flickity-prev-next-button::after,
:is(.rtk-carousel-arrows-navy-flanking, .rtk-gallery-row) .nectar-flickity .flickity-prev-next-button::before,
:is(.rtk-carousel-arrows-navy-flanking, .rtk-gallery-row) .nectar-flickity .flickity-prev-next-button::after {
  content: none !important;
  display: none !important;
}

.rtk-carousel-arrows-navy-midslide .nectar-flickity .flickity-prev-next-button:hover,
:is(.rtk-carousel-arrows-navy-flanking, .rtk-gallery-row) .nectar-flickity .flickity-prev-next-button:hover {
  opacity: 0.65 !important;
}

.rtk-carousel-arrows-navy-midslide .nectar-flickity,
:is(.rtk-carousel-arrows-navy-flanking, .rtk-gallery-row) .nectar-flickity {
  padding-top: 0;
  padding-bottom: 0;
}


/* --- VARIANT A: midslide (arrows centered on slides) --------------------- */

.rtk-carousel-arrows-navy-midslide .nectar-flickity .flickity-prev-next-button {
  top: 50% !important;
  transform: translateY(-50%);
}

.rtk-carousel-arrows-navy-midslide .nectar-flickity .flickity-prev-next-button.previous {
  left: -20px !important;
}
.rtk-carousel-arrows-navy-midslide .nectar-flickity .flickity-prev-next-button.next {
  right: -20px !important;
}


/* --- VARIANT B: flanking (arrows lifted to section heading line) --------- */
/* Anchored to top of the .nectar-flickity container. To align vertically
   with the H1 above, offset must equal:
     (gap between H1 bottom and flickity top) + (H1 height / 2) + (arrow height / 2)
   Measured post-tightening: gap ~90px, H1 62px, arrow 40px
     => 90 + 31 - 20 = 101px above flickity top */
:is(.rtk-carousel-arrows-navy-flanking, .rtk-gallery-row) .nectar-flickity .flickity-prev-next-button {
  top: auto !important;
  bottom: calc(100% + 101px);
  transform: none;
}

:is(.rtk-carousel-arrows-navy-flanking, .rtk-gallery-row) .nectar-flickity .flickity-prev-next-button.previous {
  left: 15% !important;
}
:is(.rtk-carousel-arrows-navy-flanking, .rtk-gallery-row) .nectar-flickity .flickity-prev-next-button.next {
  right: 15% !important;
}


/* --- Mobile responsive (both variants) ----------------------------------- */

@media (max-width: 999px) {
  :is(.rtk-carousel-arrows-navy-flanking, .rtk-gallery-row) .nectar-flickity .flickity-prev-next-button.previous {
    left: 5% !important;
  }
  :is(.rtk-carousel-arrows-navy-flanking, .rtk-gallery-row) .nectar-flickity .flickity-prev-next-button.next {
    right: 5% !important;
  }
}

@media (max-width: 600px) {
  .rtk-carousel-arrows-navy-midslide .nectar-flickity .flickity-prev-next-button,
  :is(.rtk-carousel-arrows-navy-flanking, .rtk-gallery-row) .nectar-flickity .flickity-prev-next-button {
    width: 40px !important;
    height: 24px !important;
  }
  .rtk-carousel-arrows-navy-midslide .nectar-flickity .flickity-prev-next-button::before,
  :is(.rtk-carousel-arrows-navy-flanking, .rtk-gallery-row) .nectar-flickity .flickity-prev-next-button::before {
    width: 40px;
    height: 16px;
  }
  .rtk-carousel-arrows-navy-midslide .nectar-flickity .flickity-prev-next-button.previous {
    left: -5px !important;
  }
  .rtk-carousel-arrows-navy-midslide .nectar-flickity .flickity-prev-next-button.next {
    right: -5px !important;
  }
  :is(.rtk-carousel-arrows-navy-flanking, .rtk-gallery-row) .nectar-flickity .flickity-prev-next-button {
    bottom: calc(100% + 36px);
  }
  :is(.rtk-carousel-arrows-navy-flanking, .rtk-gallery-row) .nectar-flickity .flickity-prev-next-button.previous {
    left: 3% !important;
  }
  :is(.rtk-carousel-arrows-navy-flanking, .rtk-gallery-row) .nectar-flickity .flickity-prev-next-button.next {
    right: 3% !important;
  }
}
/* ==========================================================================
 * WHO WE ARE — patch-01 additions to components.css
 *
 * Site-wide primitives introduced by /who-we-are/. All classes are prefixed
 * `rtk-` and follow existing naming conventions. Nothing here overrides an
 * existing rule; append as-is to the end of components.css.
 * ========================================================================== */


/* --------------------------------------------------------------------------
 * rtk-verveine-quote / rtk-verveine-attribution
 *
 * Pull-quote typography matching production (Elementor build measured via
 * getComputedStyle on 2026-08-28):
 *   - Quote body:   Verveine 46px / weight 400 / color #059dd9 / line-height 46px
 *   - Attribution:  Verveine 30px / weight 400 / color #333333
 *
 * Usage inside a [vc_column_text] block:
 *   <p class="rtk-verveine-quote">"It's like living in Hawaii..."</p>
 *   <p class="rtk-verveine-attribution">- Rosie O'Donnell</p>
 *
 * Verveine is already registered via --rosies-font-script.
 * -------------------------------------------------------------------------- */

.rtk-verveine-quote {
  font-family: var(--rosies-font-script) !important;
  font-size: 46px !important;
  font-weight: 400 !important;
  color: #059dd9 !important;
  line-height: 46px !important;
  margin: 0 0 18px 0 !important;
}

.rtk-verveine-attribution {
  font-family: var(--rosies-font-script) !important;
  font-size: 30px !important;
  font-weight: 400 !important;
  color: #333333 !important;
  line-height: 32px !important;
  margin: 0 !important;
}

/* Defensive: WordPress wpautop / Bakery visual editor can inject a stray <br>
 * or empty <p></p> between the quote and the attribution when the two <p>
 * tags are separated by a newline in the shortcode source. Neutralize both. */
.rtk-verveine-quote + br,
.rtk-verveine-quote + p:empty {
  display: none !important;
}

/* THE REAL FIX (patch-10):
 * Salient's core stylesheet applies `padding-bottom: 1.5em` to every <p>
 * inside `.wpb_text_column` (Bakery's default text-column wrapper).
 * At the quote's 46px font-size, that's 46 × 1.5 = 69px of INTERNAL padding
 * baked into the quote's own box — not a margin, not another element, not
 * wpautop. The text sits ~69px above the paragraph's bottom edge, and the
 * attribution starts right after (only 4px of collapsed margin gap between
 * the two boxes). Visually that reads as a huge gap.
 *
 * Fix: zero out padding AND margin on both paragraphs, then reintroduce a
 * small deliberate gap via the quote's margin-bottom. */
.rtk-verveine-quote {
  margin: 0 0 8px 0 !important;
  padding: 0 !important;
}
.rtk-verveine-attribution {
  margin: 0 !important;
  padding: 0 !important;
}

/* Responsive scaling: tablet/mobile shrink so quote fits narrower columns. */
@media (max-width: 999px) {
  .rtk-verveine-quote      { font-size: 38px !important; line-height: 40px !important; }
  .rtk-verveine-attribution{ font-size: 26px !important; line-height: 28px !important; }
}
@media (max-width: 600px) {
  .rtk-verveine-quote      { font-size: 32px !important; line-height: 34px !important; }
  .rtk-verveine-attribution{ font-size: 22px !important; line-height: 24px !important; }
}


/* --------------------------------------------------------------------------
 * rtk-timeline-carousel — WHO WE ARE timeline (3-slide Flickity carousel)
 *
 * Replicates production's Slider Revolution timeline (3 slides, background
 * silhouette shared across slides, milestone entries in a stagger layout).
 * Production's mechanism is per-layer absolute x/y coordinates; we mirror
 * those coordinates 1:1 inside each slide container.
 *
 * Container shape (all coordinates match production data-xy exactly):
 *   Slide viewport: 1180px wide × 555px tall (matches production canvas
 *   at desktop, minus flanking arrow space)
 *
 *   Row 1: 3 items at (x:90, x:550, x:950), (y:140 label / y:170 body)
 *   Row 2 (slides 1-2): 2 items offset at (x:300, x:767), (y:334 label / y:364 body)
 *   Row 2 (slide 3):    3 items at (x:241, x:597, x:934), (y:365 body)
 *
 *   Each milestone is 209px wide. Date = Rift Soft Demi 30px #f58221.
 *   Body = Roboto 20px #333333, line-height 26px.
 *
 * Usage on the row:
 *   el_class="rtk-timeline-row"
 * Usage on the Salient carousel wrapping the 3 slides:
 *   el_class="rtk-timeline-carousel"
 * Each slide is a [vc_column_text] with raw HTML per the shortcode.
 * -------------------------------------------------------------------------- */

.rtk-timeline-row {
  position: relative;
}

/* The Flickity carousel wrapper — no viewport padding, cell = full width. */
.rtk-timeline-carousel .nectar-flickity {
  overflow: visible;
}

.rtk-timeline-carousel .nectar-flickity .cell {
  width: 100%;
  padding: 0;
}

/* Slide canvas — fixed height matches production coordinate system. */
.rtk-timeline-slide {
  position: relative;
  width: 100%;
  max-width: 1180px;
  margin: 0 auto;
  height: 555px;
}

/* Individual milestone card (absolute-positioned inside slide canvas). */
.rtk-milestone {
  position: absolute;
  width: 209px;
}

.rtk-milestone-date {
  font-family: var(--rosies-font-display) !important;
  font-weight: 500 !important;
  font-size: 30px !important;
  color: #f58221 !important;
  line-height: 26px !important;
  margin: 0 0 8px 0 !important;
  text-transform: none !important;
}

.rtk-milestone-body {
  font-family: var(--rosies-font-body) !important;
  font-weight: 400 !important;
  font-size: 20px !important;
  color: #333333 !important;
  line-height: 26px !important;
  margin: 0 !important;
}

/* Position each milestone by matching data-xy from production RevSlider.
 * On slides 1 and 2: 3-over-2 stagger. On slide 3: 3-over-3 full grid.
 * Positions are set inline in the shortcode via style="left:X;top:Y" so
 * each slide can override with its own coordinate set. */

/* Tablet: collapse to a 2-column grid, drop absolute positioning. */
@media (max-width: 999px) {
  .rtk-timeline-slide {
    height: auto;
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: 40px 30px;
    padding: 20px 40px;
  }
  .rtk-milestone {
    position: static;
    width: auto;
    left: auto !important;
    top: auto !important;
  }
}

/* Mobile: single column stack. Padding moved to bottom-of-file overrides
 * (patch-17) to beat later `!important` base rules; keep only the
 * grid/typography here. */
@media (max-width: 600px) {
  .rtk-timeline-slide {
    grid-template-columns: 1fr;
    gap: 32px;
  }
  .rtk-milestone-date { font-size: 26px !important; }
  .rtk-milestone-body { font-size: 18px !important; line-height: 24px !important; }
}


/* --------------------------------------------------------------------------
 * rtk-community-circle — WHO WE ARE Our Community section (Staff / Board /
 * Donors & Partners circles).
 *
 * Each circle is a link containing an SVG (image_with_animation with
 * link_url set). The SVGs already contain the color fill and label text —
 * this primitive just handles sizing, hover, and centering.
 *
 * Usage: apply el_class="rtk-community-circle" to the image_with_animation
 * shortcode (or wrap in a linked column with this class).
 * -------------------------------------------------------------------------- */

.rtk-community-circle {
  display: block;
  max-width: 260px;
  margin: 0 auto;
  transition: transform 0.25s ease-out;
}

.rtk-community-circle:hover,
.rtk-community-circle:focus-visible {
  transform: scale(1.04);
}

.rtk-community-circle img {
  display: block;
  width: 100%;
  height: auto;
}

/* Mobile + tablet cap: hold the circles to a comfortable size on narrow
 * viewports (the 1/3 column would otherwise let them scale up unnecessarily).
 * Applies whether the class lands on the img itself (via el_class) or on
 * the Salient .img-with-aniamtion-wrap parent. */
@media (max-width: 999px) {
  .rtk-community-row .rtk-community-circle,
  .rtk-community-row img.rtk-community-circle,
  .rtk-community-row .img-with-aniamtion-wrap:has(.rtk-community-circle) {
    max-width: 242px !important;
    margin: 0 auto !important;
  }
}


/* --------------------------------------------------------------------------
 * rtk-hero-title — H1 overlaid on the /who-we-are/ composite hero image
 *
 * Production spec (measured via getComputedStyle on 2026-08-28):
 *   Font: Rift Soft Medium 56px / 700 / #ffffff / line-height 56px
 *   Position: 40px right and 100px down from the image's top-left corner
 *   Image renders at 1300px wide × ~440px tall at desktop.
 *
 * Approach: make the column (which centers the hero image) also center a
 * relative-positioned wrapper matching the image's box. The H1 is absolutely
 * positioned inside that wrapper at percentage offsets so it scales
 * proportionally with the image on smaller viewports.
 *
 * Offsets as % of the image box (1300×440):
 *   left: 40/1300  = 3.08%
 *   top:  100/440  = 22.73%
 * -------------------------------------------------------------------------- */

.rtk-hero-composite .wpb_wrapper {
  position: relative;
  max-width: 1300px;
  margin-left: auto;
  margin-right: auto;
}

.rtk-hero-composite .rtk-hero-title-overlay {
  position: absolute !important;
  top: 22.73%;                                   /* 100px / 440px */
  left: 6.15%;                                   /* 80px / 1300px — was 3.08% (40px); shifted +40px right per user */
  margin: 0 !important;
  padding: 0 !important;
  z-index: 3;
  pointer-events: none;
}

.rtk-hero-composite .rtk-hero-title {
  font-family: 'Rift Soft', sans-serif !important;
  /* Fluid scaling: font-size tracks viewport width so the H1 stays
   * proportional to the hero image at every breakpoint (no stepped jumps).
   *
   * Target ratios (measured against the composite hero image):
   *   1440px viewport → image ~1200px wide → H1 56px  (~4.7% of viewport)
   *    375px viewport → image  ~330px wide → H1 18px  (~4.8% of viewport)
   *
   * clamp(min, 3.9vw, max):
   *   - At 1440vw: 3.9vw = 56.16px → caps at max 56px
   *   - At 1000vw: 3.9vw = 39px
   *   - At  768vw: 3.9vw = 30px
   *   - At  480vw: 3.9vw = 18.72px
   *   - At  375vw: 3.9vw = 14.6px → floors at min 18px */
  font-size: clamp(18px, 3.9vw, 56px) !important;
  font-weight: 700 !important;
  line-height: 1 !important;
  color: #ffffff !important;
  margin: 0 !important;
  padding: 0 !important;
  text-align: left !important;
}


/* --------------------------------------------------------------------------
 * rtk-signature-inline — Rosie's signature image at the end of the letter
 *
 * Sized modestly (~120px wide) and left-aligned so it reads as part of
 * the letter's closing rather than a decorative asset.
 * -------------------------------------------------------------------------- */

/* Left-align by defeating Salient's centered wrapper.
 *
 * Salient's [image_with_animation] renders this DOM (verified via live inspect):
 *   .img-with-aniamtion-wrap.left              ← Level 4, 300px wide, symmetric 198px LR margin (centers itself)
 *     .inner                                   ← Level 3
 *       .hover-wrap                            ← Level 2
 *         .hover-wrap-inner                    ← Level 1
 *           <img.img-with-animation.rtk-signature-inline ...>   ← Level 0, 210px, margin-right: 90px (Salient's centering math)
 *
 * Two things centering the signature:
 *   1) The wrapper has symmetric margin-left/right: 198px (auto-centering).
 *   2) The IMG has a 90px right margin from Salient's own math.
 * Both must be neutralized. Deep :has() walks through Salient's exact nesting. */

.img-with-aniamtion-wrap:has(.rtk-signature-inline) {
  text-align: left !important;
  margin-left: 0 !important;
  margin-right: auto !important;
  max-width: 210px !important;
  width: 210px !important;
}

.img-with-aniamtion-wrap:has(.rtk-signature-inline) .inner,
.img-with-aniamtion-wrap:has(.rtk-signature-inline) .hover-wrap,
.img-with-aniamtion-wrap:has(.rtk-signature-inline) .hover-wrap-inner {
  margin-left: 0 !important;
  margin-right: 0 !important;
  width: 210px !important;
  max-width: 210px !important;
}

.rtk-signature-inline {
  display: block;
  max-width: 210px !important;
  width: 210px !important;
  height: auto !important;
  margin: 12px 0 0 0 !important;
}


/* --------------------------------------------------------------------------
 * rtk-row-1200 — widen a Salient in-container row's content area to 1200px
 *
 * Salient's default .container caps content at ~1180px. When a page needs
 * an exact 1200px content area (Our Mission, A Work of Heart on /who-we-are/),
 * add class="... rtk-row-1200" to the [vc_row]. Salient DOM inside a
 * [vc_row type="in_container"]:
 *
 *   .container                     ← THIS is what we widen (parent, via :has)
 *   └ .wpb_row.rtk-row-1200        ← the row (our class lives here)
 *     └ .row_col_wrap_12           ← intermediate wrapper (also widened)
 *       └ .wpb_column ...
 *
 * We widen both the grandparent .container (via :has()) and the inner
 * .row_col_wrap_12 to 1200px. Below 1200px viewport, everything reverts
 * to 100% width so the responsive cascade behaves normally.
 * -------------------------------------------------------------------------- */

.container:has(> .rtk-row-1200) {
  max-width: 1200px !important;
  width: 100%;
}

.rtk-row-1200 .row_col_wrap_12 {
  max-width: 1200px !important;
}

@media (max-width: 1200px) {
  .container:has(> .rtk-row-1200),
  .rtk-row-1200 .row_col_wrap_12 {
    max-width: 100% !important;
  }
}


/* --------------------------------------------------------------------------
 * /who-we-are/ timeline carousel — Flickity-based replacement for the
 * failed [nectar_slider location="none"]. Recreates production's RevSlider
 * layout (which pixel-positions 5–6 milestone text layers on top of a
 * shared crowd-silhouette background image) in a native Salient/Bakery
 * [carousel script="flickity"] with 3 [item] slides.
 *
 * Structure:
 *   .rtk-timeline-row (background image #338, WhoWeAre_Timeline)
 *     └ [carousel].rtk-timeline-carousel.rtk-carousel-arrows-navy-flanking
 *         └ [item].rtk-timeline-slide × 3
 *             └ .rtk-timeline-canvas   (position: relative, fixed height)
 *                 └ .rtk-milestone[×5-6] (position: absolute at production x/y)
 *                     ├ .rtk-milestone-date  (Rift Soft Demi 30px orange)
 *                     └ .rtk-milestone-body  (Roboto 20px #333 lh 26px)
 *
 * Production coordinates are used verbatim — the canvas is 1240px wide
 * (matches production's slide-local layout width, x-coords 90..1042).
 * -------------------------------------------------------------------------- */

.rtk-timeline-row {
  /* overflow visible so Flickity arrows can extend past the row edges
     without being clipped (midslide variant sits at left/right -20px). */
  overflow: visible;
}

.rtk-timeline-carousel .flickity-viewport {
  overflow: visible !important;
}

.rtk-timeline-slide {
  padding: 0 !important;
}

.rtk-timeline-canvas {
  position: relative;
  width: 100%;
  max-width: 1240px;
  height: 500px;
  margin: 0 auto;
}

.rtk-milestone {
  position: absolute;
  width: 209px;
}

.rtk-milestone-date {
  font-family: 'Rift Soft', sans-serif !important;
  font-weight: 600 !important;
  font-size: 30px !important;
  line-height: 26px !important;
  color: #f58221 !important;
  margin: 0 0 8px 0 !important;
  padding: 0 !important;
  text-transform: uppercase;
  letter-spacing: 0.02em;
}

.rtk-milestone-body {
  font-family: 'Roboto', sans-serif !important;
  font-weight: 400 !important;
  font-size: 20px !important;
  line-height: 26px !important;
  color: #333333 !important;
  margin: 0 !important;
  padding: 0 !important;
}

/* Responsive: at tablet + below, the pixel-absolute stagger doesn't fit.
 * Fall back to a stacked column of milestones per slide. Canvas becomes
 * auto-height; each .rtk-milestone becomes a static block. */
@media (max-width: 999px) {
  .rtk-timeline-canvas {
    height: auto;
    padding: 20px 20px 40px 20px;
  }
  .rtk-milestone {
    position: static !important;
    width: 100%;
    max-width: 480px;
    margin: 0 auto 24px auto;
    text-align: left;
  }
  .rtk-milestone-date {
    font-size: 26px !important;
  }
  .rtk-milestone-body {
    font-size: 18px !important;
    line-height: 24px !important;
  }
}

@media (max-width: 600px) {
  .rtk-milestone-date {
    font-size: 22px !important;
    line-height: 22px !important;
  }
  .rtk-milestone-body {
    font-size: 16px !important;
    line-height: 22px !important;
  }
}


/* ==========================================================================
 * PATCH-17 — Cascade source-order overrides
 *
 * The following rules MUST sit at the bottom of this file. They override
 * earlier `!important` base rules that would otherwise zero out our
 * mobile-only offsets. Specifically:
 *
 *  - `.rtk-timeline-slide { padding: 0 !important; }` (base rule near end
 *     of file) was killing our mobile 20px 20px 20px 90px padding.
 *  - `.rtk-verveine-quote { padding: 0 !important; }` (patch-10 fix, also
 *     later in the file) was killing our mobile padding-left: 70px.
 *
 * Skill rule: any @media block that overrides an equal-specificity base
 * rule must be placed AFTER that base rule in the same file. We restate
 * the mobile-only offsets here, at the very bottom, with `!important`.
 * ========================================================================== */

/* Milestones — left-arrow clearance across the entire stacked range.
 * Salient collapses the 2-column tablet grid to a single column somewhere
 * between ~950 and 600px (parent column width, not viewport width, drives
 * the effective columns), so the left arrow overlaps milestone text at any
 * width ≤999px, not just ≤600px. Apply the 38px left offset uniformly. */
@media (max-width: 999px) {
  .rtk-timeline-slide {
    padding: 20px 20px 20px 38px !important;
  }
}

/* --------------------------------------------------------------------------
 * Hawaii pull-quote — orange companion arrow on tablet + mobile
 *
 * Salient's default column grid stacks the row's two columns as soon as the
 * viewport drops below ~1000px. Once stacked, the desktop pseudo (which
 * lives on the 2nd/photo column via `.wpb_column + .wpb_column::before`)
 * ends up clipped at the far left of the now-full-width column and reads
 * as visual noise. So across the entire stacked range (≤999px):
 *   1) hide the desktop column-2 pseudo
 *   2) paint a smaller companion arrow as ::before on the quote paragraph
 *      itself, with 70px of padding-left on the quote to give the arrow room.
 * -------------------------------------------------------------------------- */
@media (max-width: 999px) {
  /* Kill the desktop column-2 pseudo — it's mis-anchored once columns stack. */
  .rtk-work-of-heart-row.rtk-testimonial-with-orange-arrow .wpb_column + .wpb_column::before {
    display: none !important;
  }

  .rtk-work-of-heart-row .rtk-verveine-quote,
  .rtk-work-of-heart-row .rtk-verveine-attribution {
    padding-left: 70px !important;
  }

  .rtk-work-of-heart-row .rtk-verveine-quote {
    position: relative;
  }

  .rtk-work-of-heart-row .rtk-verveine-quote::before {
    content: '';
    position: absolute;
    top: 50%;
    left: -10px;
    width: 55px;
    height: 90px;
    transform: translateY(-50%) rotate(15deg);
    transform-origin: 50% 50%;
    background-image: url("/wp-content/uploads/2026/08/Quote_ArrowOrange.svg");
    background-repeat: no-repeat;
    background-position: center;
    background-size: contain;
    z-index: 3;
    pointer-events: none;
  }

  .rtk-work-of-heart-row.rtk-bounce-play .rtk-verveine-quote::before {
    animation: rtk-arrow-bob 0.9s ease-in-out 3;
  }
}


/* ==========================================================================
 * /our-founder/ page — patch-03
 * ==========================================================================
 *
 * Two page-scoped classes. Both use net-new class names (grep-confirmed
 * they don't appear anywhere else in components.css), so no risk of leaking
 * to /who-we-are/, /20th-anniversary/, /musical-documentary/, or homepage.
 *
 * 1. .rtk-ourfounder-decorator — page-scoped variant of two-circles corner
 *    decorator, uses two-circles_founder.svg instead of the shared
 *    core-programs_two-circles.svg. Painted as ::before on the image wrapper.
 *
 * 2. .rtk-ourfounder-about-photo — forces the About-row photo (image 381)
 *    to a landscape 400×280 aspect via aspect-ratio + object-fit: cover.
 *    Design calls for a landscape rectangle regardless of source aspect.
 * ========================================================================== */

/* Scope: WPBakery renders the column as
 *   .rtk-ourfounder-decorator > .vc_column-inner > .wpb_wrapper > [children]
 * The [image_with_animation] wrappers are direct children of .wpb_wrapper,
 * interleaved with any inner rows (.wpb_row). `:first-of-type` on the img
 * wrapper matches ONLY the first .img-with-aniamtion-wrap sibling under
 * .wpb_wrapper (image 615 / actii-upper-school-insert.jpg). Additional
 * images later in the same column (like actii-study-group-insert.jpg
 * = image 626) get NO decorator, because they are not the first-of-type.
 *
 * IMPORTANT: `:first-of-type` matches by TAG NAME (`div`) among the
 * wrapper's children. Both img-wrappers AND inner rows are <div>. The
 * FIRST <div> child of .wpb_wrapper here is the image wrapper (verified
 * live: index 0 = img-with-aniamtion-wrap, index 1 = .wpb_row, index 2
 * = second img-with-aniamtion-wrap). This is why the selector works. */
.rtk-ourfounder-decorator > .vc_column-inner > .wpb_wrapper > [class*="img-with-"][class*="tion-wrap"]:first-of-type {
  position: relative !important;
  overflow: visible !important;
}

/* Anchor + geometry match the homepage Acte II card treatment
 * (see decorators.css .rtk-decorator-acteii-corner). z-index: 0 lets the
 * decorator drape ON TOP of the photo where it overlaps and outside the
 * photo where it extends past the edges — same layering as Acte II. */
.rtk-ourfounder-decorator > .vc_column-inner > .wpb_wrapper > [class*="img-with-"][class*="tion-wrap"]:first-of-type::before {
  content: "";
  position: absolute;
  bottom: -115px;                    /* patch-05: -55 -60 = down 60px from patch-04 */
  right: -65px;                      /* drape right of image right edge */
  width: 240px;                      /* patch-04: +40px vs patch-03 */
  height: 252px;                     /* maintain 200:210 aspect */
  background: url("/wp-content/themes/rosies/assets/decorators/two-circles_founder.svg") no-repeat right bottom / contain;
  z-index: 0;
  pointer-events: none;
}

@media (max-width: 999px) {
  .rtk-ourfounder-decorator > .vc_column-inner > .wpb_wrapper > [class*="img-with-"][class*="tion-wrap"]:first-of-type::before {
    width: 180px;
    height: 189px;
    bottom: -85px;                   /* patch-05: -40 -45 = down 45px (scaled from 60) */
    right: -45px;
  }
}

@media (max-width: 600px) {
  .rtk-ourfounder-decorator > .vc_column-inner > .wpb_wrapper > [class*="img-with-"][class*="tion-wrap"]:first-of-type::before {
    width: 130px;
    height: 137px;
    bottom: -55px;                   /* patch-05: -25 -30 = down 30px (scaled from 60) */
    right: -30px;
  }
}

/* Force landscape aspect on the About-row photo.
 * Class is on the [vc_column]; scope reaches the Salient img wrapper's inner <img>. */
.rtk-ourfounder-about-photo [class*="img-with-"][class*="tion-wrap"] img {
  aspect-ratio: 400 / 280 !important;
  width: 100% !important;
  height: auto !important;
  object-fit: cover !important;
  object-position: center !important;
  border-radius: 20px !important;
}


/* ==========================================================================
 * /staff/ page — patch-01
 * ==========================================================================
 *
 * Adds one small header primitive and one staff-card primitive. All class
 * names verified unique to this page (grep-confirmed zero pre-existing
 * hits in components.css and decorators.css).
 *
 * PRIMITIVES:
 *
 * 1. .rtk-page-header-no-photo — variant of .rtk-hero-with-corner-decorator
 *    for pages that have a decorator + H1 header but NO photo below. Uses
 *    the same .rtk-page-hero-h1 + .rtk-hero-decorator-inline + .rtk-hero-title-text
 *    inner classes so typography matches other subpages. Normal-flow row
 *    (no negative margin) so it doesn't affect the following row.
 *
 * 2. .rtk-staff-card — photo circle + name + title stack for one staff
 *    grid cell. Photos are already circular (540×540 with transparent
 *    corners rounded to circle by CSS); primitive handles hover, name
 *    and title styling. Wrapped in <a> for the profile-page link.
 *
 * 3. .rtk-staff-additional-list — text-only staff sections below the grid
 *    (Teaching Artists / Organizational Support / Guest Artists). Simple
 *    typography, no cards.
 * ========================================================================== */

/* --- Header (decorator + H1, no photo) ----------------------------------
 * Variant of .rtk-hero-with-corner-decorator for pages with NO photo below
 * the hero row (e.g. /board/). The base H1/decorator geometry is designed
 * to sit above a photo that pulls up into the decorator's lower half via
 * a -218px negative margin — without that photo, the decorator's naturally
 * tall canvas + Bakery's default text-column padding create ~300px of dead
 * space between the hero title and the next row.
 *
 * TIGHTENING RULES (added board-patch-03, ~300px reclaimed vs original):
 *   1. Kill the decorator's ~317px stretched height. The SVG's natural
 *      viewBox is 262×131 (2:1 aspect); forcing height=317 stretches it
 *      to near-square and pads the bottom half with empty transparent
 *      canvas. Setting height:auto with width:340 gives the SVG its
 *      natural 340×170 aspect — reclaims ~147px.
 *   2. Zero the .wpb_text_column padding on the title-overlay wrapper
 *      (was 40 top / 40 bottom = 80px reclaimed).
 *   3. Cancel the base rule's @media (min-width:1000px) top:20px nudge
 *      on the decorator — that nudge only exists to align vs a photo
 *      below. Need !important because the base rule lives inside a
 *      media query at equal specificity.
 * ------------------------------------------------------------------------- */

.rtk-page-header-no-photo {
  padding: 0 !important;
  overflow: visible !important;
}

.rtk-page-header-no-photo .rtk-hero-title-overlay {
  padding-left: max(40px, 3vw);
  padding-top: 0;
  padding-bottom: 0;
  margin: 0;
}

.rtk-page-header-no-photo .rtk-hero-title-overlay .wpb_wrapper,
.rtk-page-header-no-photo .rtk-hero-title-overlay p {
  margin: 0;
  padding: 0;
}

/* Header-no-photo variants of the H1/decorator geometry — no negative
 * margin, decorator sits BESIDE the H1 in its natural aspect ratio,
 * not stretched to force alignment with a photo below. */
.rtk-page-header-no-photo .rtk-hero-decorator-inline {
  top: 0 !important;                 /* beat @media(min-width:1000px) top:20px base rule */
  height: auto !important;           /* let SVG use its natural 2:1 aspect (340 × ~170) */
}

.rtk-page-header-no-photo .rtk-hero-title-text {
  top: 0 !important;                 /* beat @media(min-width:1000px) top:-100px base rule */
}


/* --- Staff card ---------------------------------------------------------- */

.rtk-staff-card {
  display: block;
  max-width: 240px;
  margin: 0 auto 40px auto;
  text-align: center;
  text-decoration: none;
  color: inherit;
  transition: transform 0.25s ease-out;
}

.rtk-staff-card:hover,
.rtk-staff-card:focus-visible {
  transform: scale(1.04);
  text-decoration: none;
  color: inherit;
}

.rtk-staff-name {
  display: block;
  font-family: var(--rosies-font-display, 'Rift soft demi'), 'Impact', sans-serif;
  font-weight: 600;
  font-size: 30px;
  line-height: 1.15;
  letter-spacing: 0.02em;
  text-transform: uppercase;
  color: #7a54a3;
  margin: 0 0 6px 0;
}

.rtk-staff-title {
  display: block;
  font-family: inherit;
  font-weight: 400;
  font-size: 16px;
  line-height: 1.3;
  color: #333;
  margin: 0;
}

/* Suppress the line-height gap from an explicit <br> after .rtk-staff-name.
 * The name span is already display:block, so it forces its own line break.
 * The <br> is kept in the source (WPBakery Classic Mode / rich text editor)
 * for authoring readability but should not add an extra blank line at render.
 * Adjacent-sibling combinator scopes this ONLY to <br> immediately after the
 * name — <br> inside .rtk-staff-title (role/descriptor split) is unaffected.
 */
.rtk-staff-name + br {
  display: none;
}

@media (max-width: 999px) {
  .rtk-staff-card {
    max-width: 220px;
  }
  .rtk-staff-name {
    font-size: 26px;
  }
  .rtk-staff-title {
    font-size: 16px;
  }
}

@media (max-width: 600px) {
  .rtk-staff-card {
    max-width: 200px;
    margin-bottom: 32px;
  }
}


/* --- Text-only additional-staff sections -------------------------------- */

.rtk-staff-additional-list p {
  margin: 0 0 8px 0;
  font-size: 16px;
  line-height: 1.55;
}

.rtk-staff-additional-list p:last-child {
  margin-bottom: 0;
}

/* --------------------------------------------------------------------------
 * rtk-staff-photo — /staff/ page photo cap for tablet + mobile
 *
 * Each staff photo (and the row-1 decorator image) is an
 * [image_with_animation] tagged with el_class="rtk-staff-photo".
 * Salient renders the shortcode as:
 *   .img-with-aniamtion-wrap.rtk-staff-photo  →  .inner  →  .hover-wrap  →  <img>
 * (yes, "aniamtion" is Salient's real class-name typo).
 *
 * Desktop: use the column's native width (no cap).
 * Tablet (≤999px):  cap 300px
 * Mobile  (≤600px): cap 242px
 * Matches the .rtk-community-circle / .rtk-photo-circle precedent.
 * -------------------------------------------------------------------------- */

@media (max-width: 999px) {
  .rtk-staff-photo,
  .img-with-aniamtion-wrap.rtk-staff-photo {
    max-width: 300px !important;
    margin-left: auto !important;
    margin-right: auto !important;
  }
}

@media (max-width: 600px) {
  .rtk-staff-photo,
  .img-with-aniamtion-wrap.rtk-staff-photo {
    max-width: 242px !important;
  }
}

/* --------------------------------------------------------------------------
 * rtk-student-journey-row — site-wide primitive
 *
 * Recreates production's Slider Revolution "Student Journey" using native
 * Bakery + one SVG + CSS + the shared IntersectionObserver in custom.js.
 *
 * Author-friendly structure (each milestone is its own text block):
 *
 *   [vc_row class="rtk-student-journey-row"]
 *     [vc_column ...]
 *       [vc_column_text]<span class="rtk-sj-label rtk-sj-1 rtk-sj-below">…</span>[/vc_column_text]
 *       [vc_column_text]<span class="rtk-sj-label rtk-sj-2 rtk-sj-above">…</span>[/vc_column_text]
 *       …8 total…
 *     [/vc_column]
 *   [/vc_row]
 *
 * WHY the SVG paints on `.vc_column-inner` (not on the row):
 * Bakery/Salient wraps every column in `.vc_column-inner` and sets it
 * to `position: relative`. Because it's the FIRST positioned ancestor
 * above each label span, an absolutely-positioned `.rtk-sj-label`
 * resolves its `top`/`bottom` against `.vc_column-inner` — NOT against
 * the row (`.wpb_row.rtk-student-journey-row`), even if the row is
 * also `position: relative`. Whichever positioned ancestor is CLOSEST
 * to the absolute element wins.
 *
 * So the SVG background lives on `.rtk-student-journey-row
 * .vc_column-inner`, which is the same element the labels resolve
 * against — canvas and reference frame stay aligned.
 *
 * Desktop (>999px): SVG path is a full-width column background; 8
 *   labels position absolutely against .vc_column-inner at fixed
 *   x% along the path, alternating above/below. Each label fades in
 *   on scroll-in with a 700ms stagger (label 1 first, label 8 last).
 *
 * Tablet + mobile (≤999px): column collapses to a vertical stack;
 *   each label prefixed with a green dot; short vertical purple line
 *   connects them. No wavy SVG.
 *
 * Trigger:
 *   The row opts into the shared observer in custom.js by matching
 *   `.rtk-student-journey-row`. On scroll-into-view the observer adds
 *   `.rtk-bounce-play` to the row, which triggers the label stagger.
 *
 * -------------------------------------------------------------------------- */

/* The canvas: paint the SVG on .vc_column-inner because that IS the
 * positioning ancestor that labels resolve against. */
.rtk-student-journey-row .vc_column-inner {
  position: relative;                       /* Salient default, made explicit */
  min-height: 360px;                        /* room for labels above + path + labels below */
  padding: 0 !important;                    /* remove Salient's default column padding so SVG stretches edge-to-edge */
  background-image: url("../decorators/Journey_withdots.svg");
  background-repeat: no-repeat;
  background-position: center center;
  background-size: 100% auto;               /* stretch SVG viewport-wide (row is full_width_content) */
}

/* Row itself: just make sure it doesn't clip label overflow */
.wpb_row.rtk-student-journey-row {
  overflow: visible;
}

/* Neutralize the 8 text blocks: they need to occupy zero layout space
 * on desktop so the column's min-height + SVG position stay predictable.
 * Labels inside them absolutely position themselves. */
.rtk-student-journey-row .wpb_text_column,
.rtk-student-journey-row .wpb_text_column > .wpb_wrapper,
.rtk-student-journey-row .wpb_text_column > .wpb_wrapper > p {
  margin: 0 !important;
  padding: 0 !important;
  line-height: 0;                           /* collapse any wpautop <p> gap */
}

/* Individual label */
.rtk-student-journey-row .rtk-sj-label {
  position: absolute;
  transform: translateX(-50%);              /* labels center horizontally on their x% */
  font-family: var(--rosies-font-script, 'Verveine'), cursive, sans-serif;
  font-weight: 400;
  font-size: 20px;
  line-height: 1.15;                        /* re-establish line-height on the label itself */
  color: #000000;
  text-align: center;
  max-width: 170px;
  opacity: 0;                               /* start hidden — observer triggers fade */
  transition: opacity 500ms ease-out;
  white-space: normal;                      /* long labels wrap */
}

/* labels ABOVE the path — anchor their BOTTOM above the path midline.
 * The extra 7pp over 50% is the breathing gap between the label's inside
 * edge and the wavy line. Bump these two values in lockstep to change
 * how far the labels sit from the path. */
.rtk-student-journey-row .rtk-sj-above { bottom: 62%; }

/* labels BELOW the path — anchor their TOP below the path midline. */
.rtk-student-journey-row .rtk-sj-below { top: 62%; }

/* Horizontal positions along the path.
 *
 * The SVG has 8 dots at viewBox x-positions approximately
 * 14.6, 24.1, 32.6, 41.1, 48.4, 57.5, 65.1, 84.2%.
 *
 * Per prod: dot #1 is a NAKED anchor (no label). Label #1 sits at dot
 * #2, label #2 at dot #3, and so on. Label #8 sits past dot #8 near
 * the arrowhead. This mirrors the BlueHost/Slider Revolution layout. */
.rtk-student-journey-row .rtk-sj-1 { left: calc(24% - 40px); }  /* PS Broadway    → dot #2, nudged 40px left (patch-12) */
.rtk-student-journey-row .rtk-sj-2 { left: calc(32% - 30px); }  /* ACTE II Summer → dot #3, nudged 30px left (patch-12) */
.rtk-student-journey-row .rtk-sj-3 { left: 41%; }    /* ACTE II Year-Round Lower → dot #4 */
.rtk-student-journey-row .rtk-sj-4 { left: 48%; }    /* RISE                   → dot #5 */
.rtk-student-journey-row .rtk-sj-5 { left: 57%; }    /* ACTE II Year-Round Upper → dot #6 */
.rtk-student-journey-row .rtk-sj-6 { left: 65%; }    /* College Guidance       → dot #7 */
.rtk-student-journey-row .rtk-sj-7 { left: 74%; }    /* RTKids Graduation      → between #7 and #8 */
.rtk-student-journey-row .rtk-sj-8 { left: 85%; }    /* Continued investment   → at dot #8 */

/* Per-label vertical nudges (desktop only). These override the shared
 * .rtk-sj-above/below baselines for specific labels. They live inside
 * the desktop cascade above the ≤999px stacked layout, so they don't
 * affect mobile/tablet.
 *
 * Note on direction:
 *  - above-labels use `bottom: 62%` — subtract px to move DOWN
 *  - below-labels use `top: 62%` — subtract px to move UP */
.rtk-student-journey-row .rtk-sj-1 { top:    calc(62% - 50px); } /* PS Broadway raised 50px (patch-12) */
.rtk-student-journey-row .rtk-sj-4 { bottom: calc(62% - 30px); } /* RISE lowered 30px (patch-10) */
.rtk-student-journey-row .rtk-sj-8 { bottom: calc(62% - 50px); } /* Continued investment lowered 50px (patch-10) */

/* wider labels get more room */
.rtk-student-journey-row .rtk-sj-2,
.rtk-student-journey-row .rtk-sj-5,
.rtk-student-journey-row .rtk-sj-6,
.rtk-student-journey-row .rtk-sj-8 { max-width: 190px; }

/* Scroll-into-view stagger — each label fades in 700ms after the previous */
.rtk-student-journey-row.rtk-bounce-play .rtk-sj-1 { opacity: 1; transition-delay: 0ms;    }
.rtk-student-journey-row.rtk-bounce-play .rtk-sj-2 { opacity: 1; transition-delay: 700ms;  }
.rtk-student-journey-row.rtk-bounce-play .rtk-sj-3 { opacity: 1; transition-delay: 1400ms; }
.rtk-student-journey-row.rtk-bounce-play .rtk-sj-4 { opacity: 1; transition-delay: 2100ms; }
.rtk-student-journey-row.rtk-bounce-play .rtk-sj-5 { opacity: 1; transition-delay: 2800ms; }
.rtk-student-journey-row.rtk-bounce-play .rtk-sj-6 { opacity: 1; transition-delay: 3500ms; }
.rtk-student-journey-row.rtk-bounce-play .rtk-sj-7 { opacity: 1; transition-delay: 4200ms; }
.rtk-student-journey-row.rtk-bounce-play .rtk-sj-8 { opacity: 1; transition-delay: 4900ms; }

/* Reduced motion — show everything immediately */
@media (prefers-reduced-motion: reduce) {
  .rtk-student-journey-row .rtk-sj-label {
    opacity: 1 !important;
    transition: none !important;
  }
}

/* -----------------------------------------------------------------
 * Tablet + mobile: collapse to a vertical stacked list.
 * Restore normal document flow inside text blocks, hide the wavy SVG,
 * and render each label as a stacked item with a green dot and a
 * short purple connector.
 * ----------------------------------------------------------------- */
@media (max-width: 999px) {
  .rtk-student-journey-row .vc_column-inner {
    min-height: 0;
    background-image: none;
    padding: 20px 20px 30px !important;
  }

  /* Restore text-block flow so each label stacks under the previous */
  .rtk-student-journey-row .wpb_text_column,
  .rtk-student-journey-row .wpb_text_column > .wpb_wrapper,
  .rtk-student-journey-row .wpb_text_column > .wpb_wrapper > p {
    line-height: normal;
    padding: 0 !important;
    margin: 0 !important;
  }

  .rtk-student-journey-row .rtk-sj-label {
    position: relative;
    display: block;
    left: 0 !important;
    top: auto !important;
    bottom: auto !important;
    transform: none;
    text-align: left;
    padding: 0 0 22px 26px;
    margin: 0 auto;
    max-width: 480px;                                /* readable line-length cap */
    /* Vertical connector line runs down the left edge */
    border-left: 2px solid #7A55A3;
    opacity: 0;
    transition: opacity 500ms ease-out;
  }

  /* Green dot marker for each item */
  .rtk-student-journey-row .rtk-sj-label::before {
    content: "";
    position: absolute;
    left: -8px;
    top: 2px;
    width: 14px;
    height: 14px;
    border-radius: 50%;
    background: #91CA66;
    box-shadow: 0 0 0 2px #ffffff;                   /* white halo so dot sits above the line */
  }

  /* Last item: kill the connector line below it (no more items) */
  .rtk-student-journey-row .rtk-sj-8 {
    border-left-color: transparent;
  }
  .rtk-student-journey-row .rtk-sj-8::after {
    /* short stub so the last dot doesn't feel disconnected */
    content: "";
    position: absolute;
    left: -1px;
    top: 2px;
    bottom: calc(100% - 12px);
    border-left: 2px solid #7A55A3;
  }
}

@media (max-width: 600px) {
  .rtk-student-journey-row .rtk-sj-label {
    font-size: 22px;                                 /* Verveine script — nudge up on mobile */
  }
}

/* =========================================================================
   .rtk-hero-bubble-alum  (site-wide, hero-only decoration)

   Baked composite: purple line-art speech bubble + alum photo (500×500
   pre-masked circle scaled to 200×200 inside the ellipse). Native asset
   is 550×278 RGBA PNG. Sits inline-right of a hero H1.

   Apply as el_class on an [image_with_animation] tag. The image_url
   should point to the composite PNG (or leave as-is — CSS sets the
   background too, so this primitive works with any [image_with_animation]
   dummy image; but shipping the real PNG lets Salient's lazy-load and
   entrance animation carry it. Recommended: [image_with_animation
   image_url="ID_OF_HERO_BUBBLE_PNG" el_class="rtk-hero-bubble-alum"]).

   Placement: hero row's right column. Desktop only — hidden ≤999px
   because on tablet/mobile the hero collapses to single-column and the
   composite would either dwarf the H1 or crowd it.

   Sizing: composite native is 550×278. On desktop we render at ~65%
   (~360×182) so it sits comfortably next to a 60px H1 line.
   ========================================================================= */

/* Salient puts el_class directly on the <img>, and wraps it in
   .img-with-aniamtion-wrap (typo intentional). We want the composite
   to float as a decoration in the hero column's right side, spanning
   vertically into the whitespace next to the intro paragraph below.

   Position: absolute, anchored to the hero row (rtk-page-header-no-photo).
   Size: 520px wide (~95% of native 550px so it stays crisp).
   Right edge: 40px inside the viewport edge (hero is full_width_content).
   Top: 30px below hero row top.

   The hero row uses type="full_width_content" + overflow="visible", so
   the bubble's 260px height extending past the row bottom into the intro
   row's whitespace is expected and fine. */
.rtk-page-header-no-photo {
  position: relative;                                 /* anchor for absolute bubble */
}

.rtk-page-header-no-photo [class*="img-with-"][class*="tion-wrap"]:has(img.rtk-hero-bubble-alum) {
  position: absolute !important;
  top: 30px;
  right: 40px;
  width: 520px !important;
  max-width: 520px !important;
  z-index: 2;                                         /* above H1 background nothing, below nav */
  pointer-events: none;                               /* pure decoration */
  margin: 0 !important;
}

.rtk-page-header-no-photo img.rtk-hero-bubble-alum {
  width: 100% !important;
  height: auto !important;
  max-width: 100% !important;
  display: block;
}

/* Below full-desktop: hide the decoration entirely to avoid colliding
   with the H1 and intro paragraph. Threshold set to 1250px — above 1250
   the hero has enough horizontal room to absorb the bubble at 520px
   without visible overlap. Below 1250 the H1 pushes right into the
   bubble's left edge (observed collision at ~1245px). */
@media (max-width: 1250px) {
  .rtk-page-header-no-photo [class*="img-with-"][class*="tion-wrap"]:has(img.rtk-hero-bubble-alum),
  .rtk-page-header-no-photo img.rtk-hero-bubble-alum {
    display: none !important;
  }
}


/* ============================================================
 * NECTAR SPECIAL FRAME PRIMITIVE (.nectar-special-frame) — SITE-WIDE
 * ============================================================
 * A user-driven, two-slot portrait: pick any FRAME image and any
 * PHOTO image from the Media Library, drop both into a Bakery
 * column, and they compose into a circular photo inside a
 * decorative frame — no CSS-per-person, no PNG-per-person.
 *
 * WHY: replaces the "one primitive class + one baked-in PNG per
 * subject" pattern (e.g. .rtk-video-thumb-lauren-cutout,
 * .rtk-gala-photo-wrap) with a native Bakery composition the
 * team can build without a developer.
 *
 * USAGE (paste into WPBakery Classic Mode):
 *
 *   [vc_column el_class="nectar-special-frame"]
 *     [image_with_animation image_url="12345"
 *        el_class="nectar-special-frame__frame"]
 *     [image_with_animation image_url="67890"
 *        el_class="nectar-special-frame__photo"]
 *   [/vc_column]
 *
 * The FRAME goes first (renders behind); the PHOTO goes second
 * (renders on top, circle-clipped). Both are picked via the
 * standard Bakery Media Library — admins can upload new frame
 * SVGs (wp-general.php enables that). Photos should be roughly
 * square source (any WordPress-scaled thumbnail will do).
 *
 * OPT-IN BOUNCE: add the modifier class
 * `nectar-special-frame--bounce` to the column and the
 * shared IntersectionObserver in custom.js will fire the
 * bounce animation the first time the portrait scrolls in.
 *
 * PER-INSTANCE FINE-TUNE:
 *   The photo default is 80% of the column width, centered.
 *   If a specific frame's inner "hole" is bigger or smaller,
 *   override at the column via Bakery Design Options -> CSS Box:
 *     style="--nectar-special-frame-photo-scale: 0.85"
 *     style="--nectar-special-frame-photo-y: -3%"
 * ============================================================ */
.nectar-special-frame,
.wpb_column.nectar-special-frame,
.vc_column_container.nectar-special-frame {
  --nectar-special-frame-photo-scale: 0.80;
  --nectar-special-frame-photo-x: 0%;
  --nectar-special-frame-photo-y: 0%;
  --nectar-special-frame-frame-scale: 1.00;
  --nectar-special-frame-max: 460px;
  position: relative;
}

/* The inner Bakery wrapper is the actual sizing/positioning
 * context so we don't fight Salient's column padding. */
.nectar-special-frame > .vc_column-inner,
.nectar-special-frame .vc_column-inner {
  position: relative;
  width: 100%;
  /* Frame scale multiplies the max-width of the sizing box. Because
   * frame and photo both live inside this box (position:absolute),
   * scaling the box scales the entire portrait together — Option A:
   * photo tracks frame. Using max-width (not transform:scale) keeps
   * animation transforms free to work on the same element. */
  max-width: calc(var(--nectar-special-frame-max) * var(--nectar-special-frame-frame-scale));
  margin-left: auto;
  margin-right: auto;
  aspect-ratio: 1 / 1;
}

/* FRAME slot — absolute, fills the square, sits behind photo.
 * Salient wraps [image_with_animation] output in a wrapper with
 * the misspelled class .img-with-aniamtion-wrap; we scope both
 * spellings + our modifier for safety. */
.nectar-special-frame [class*="img-with-"][class*="tion-wrap"]:has(img.nectar-special-frame__frame),
.nectar-special-frame .nectar-special-frame__frame,
.nectar-special-frame img.nectar-special-frame__frame {
  position: absolute !important;
  inset: 0 !important;
  width: 100% !important;
  height: 100% !important;
  z-index: 1;
  margin: 0 !important;
}
.nectar-special-frame img.nectar-special-frame__frame {
  object-fit: contain;
  object-position: center;
}

/* PHOTO slot — absolute, centered, circle-clipped, scaled to
 * ~80% of the square by default. Bakery's parent wrapper is
 * also promoted to the same positioning box. */
.nectar-special-frame [class*="img-with-"][class*="tion-wrap"]:has(img.nectar-special-frame__photo),
.nectar-special-frame .nectar-special-frame__photo {
  position: absolute !important;
  top: calc(50% + var(--nectar-special-frame-photo-y)) !important;
  left: calc(50% + var(--nectar-special-frame-photo-x)) !important;
  transform: translate(-50%, -50%);
  width: calc(var(--nectar-special-frame-photo-scale) * 100%) !important;
  aspect-ratio: 1 / 1;
  z-index: 2;
  margin: 0 !important;
}
/* When the photo IS the positioned element (bare <img> case, e.g.
 * Bakery-element-emitted markup), keep it circle-clipped. Do NOT set
 * width/height here — those come from the positioning rule above
 * (width: calc(scale * 100%) and aspect-ratio: 1/1 give a square). */
.nectar-special-frame img.nectar-special-frame__photo {
  display: block !important;
  border-radius: 50% !important;
  object-fit: cover !important;
  object-position: center !important;
  margin: 0 !important;
}
/* When the photo is WRAPPED by Salient's animation wrapper (shortcode
 * case with [image_with_animation]), the wrapper is the positioned
 * scale-box and the inner <img> should fill it. */
.nectar-special-frame [class*="img-with-"][class*="tion-wrap"] img.nectar-special-frame__photo {
  width: 100% !important;
  height: 100% !important;
}

/* BOUNCE OPT-IN — reuses the shared IntersectionObserver in
 * custom.js. Adding .nectar-special-frame--bounce to the
 * column enrolls it; observer stamps .rtk-bounce-play the
 * first time it scrolls into view. Same animation timing as
 * .rtk-portrait-frame-darkblue for visual consistency. */
.nectar-special-frame--bounce {
  /* placeholder: presence of the class is the observer hook */
}
.nectar-special-frame--bounce.rtk-bounce-play > .vc_column-inner,
.nectar-special-frame--bounce.rtk-bounce-play .vc_column-inner {
  animation: nectar-special-frame-bob 0.9s ease-in-out 3;
}
@keyframes nectar-special-frame-bob {
  0%, 100% { transform: translateY(0); }
  50%      { transform: translateY(-14px); }
}
/* ------------------------------------------------------------------
 * ANIMATION PRESETS (Bakery element "Animation" dropdown)
 *
 * All on-scroll variants share the same enrollment mechanism as
 * bounce above: the shared IntersectionObserver in custom.js stamps
 * .rtk-bounce-play on the element the first time it scrolls into
 * view. Each preset paints its own keyframes onto the primitive's
 * inner sizing box (.vc_column-inner) so the entrance affects the
 * whole framed portrait, not just the photo or the frame.
 *
 * Pulse-on-hover is pure CSS — no observer needed.
 *
 * Editors pick one; PHP guarantees only one modifier class lands
 * on the element, so there is no need to fight preset stacking. */

/* FADE IN ON SCROLL */
.nectar-special-frame--fade > .vc_column-inner,
.nectar-special-frame--fade .vc_column-inner {
  opacity: 0;
}
.nectar-special-frame--fade.rtk-bounce-play > .vc_column-inner,
.nectar-special-frame--fade.rtk-bounce-play .vc_column-inner {
  animation: nectar-special-frame-fade 0.6s ease-out forwards;
}
@keyframes nectar-special-frame-fade {
  from { opacity: 0; }
  to   { opacity: 1; }
}

/* GROW IN ON SCROLL — scale 60% → 100% with a gentle fade. Matches the
 * legacy .rtk-portrait-frame-blueframe grow-in on /core-programs/ (Viola
 * Varner row): the framed portrait emerges from a smaller starting size
 * over a longer, calmer curve, so the entrance reads as a real reveal
 * rather than a subtle settle. */
.nectar-special-frame--grow > .vc_column-inner,
.nectar-special-frame--grow .vc_column-inner {
  opacity: 0;
  transform: scale(0.6);
  transform-origin: center;
}
.nectar-special-frame--grow.rtk-bounce-play > .vc_column-inner,
.nectar-special-frame--grow.rtk-bounce-play .vc_column-inner {
  animation: nectar-special-frame-grow 0.9s ease-out forwards;
}
@keyframes nectar-special-frame-grow {
  from { opacity: 0; transform: scale(0.6); }
  to   { opacity: 1; transform: scale(1);   }
}

/* FRAME SPIN ON SCROLL — the frame's rays spin 360° once while
 * fading in; the photo stays perfectly still. Plays into the
 * rotational geometry of the sunburst / curly-heart frames.
 * Rotation is applied to the frame <img> only (z-index: 1),
 * not the parent — the photo (z-index: 2) is untouched. */
.nectar-special-frame--frame-spin .nectar-special-frame__frame {
  opacity: 0;
  transform: rotate(0deg);
  transform-origin: center;
}
.nectar-special-frame--frame-spin.rtk-bounce-play .nectar-special-frame__frame {
  animation: nectar-special-frame-frame-spin 1.2s linear forwards;
}
@keyframes nectar-special-frame-frame-spin {
  from { opacity: 0; transform: rotate(0deg);   }
  to   { opacity: 1; transform: rotate(360deg); }
}

/* GROW AND SPIN ON SCROLL — combines the Grow (photo scale 0.6→1.0
 * with fade) and Frame Spin (frame rotates 0→360°) animations so both
 * fire simultaneously and finish together. Grow is stretched from 0.9s
 * to 1.2s to match the spin duration — both land at exactly 1.2s for
 * one unified reveal. Photo and frame are on separate transform stacks
 * (photo on .vc_column-inner, frame on .nectar-special-frame__frame)
 * so they don't fight each other. */
.nectar-special-frame--grow-and-spin > .vc_column-inner,
.nectar-special-frame--grow-and-spin .vc_column-inner {
  opacity: 0;
  transform: scale(0.6);
  transform-origin: center;
}
.nectar-special-frame--grow-and-spin .nectar-special-frame__frame {
  opacity: 0;
  transform: rotate(0deg);
  transform-origin: center;
}
.nectar-special-frame--grow-and-spin.rtk-bounce-play > .vc_column-inner,
.nectar-special-frame--grow-and-spin.rtk-bounce-play .vc_column-inner {
  animation: nectar-special-frame-grow 1.2s ease-out forwards;
}
.nectar-special-frame--grow-and-spin.rtk-bounce-play .nectar-special-frame__frame {
  animation: nectar-special-frame-frame-spin 1.2s linear forwards;
}

/* PULSE ON HOVER — no observer needed; pure hover interaction.
 * Scales the whole portrait ~5%, snaps back on hover-out. */
.nectar-special-frame--pulse-hover > .vc_column-inner,
.nectar-special-frame--pulse-hover .vc_column-inner {
  transition: transform 0.25s ease-out;
  transform-origin: center;
  will-change: transform;
}
.nectar-special-frame--pulse-hover:hover > .vc_column-inner,
.nectar-special-frame--pulse-hover:hover .vc_column-inner {
  transform: scale(1.05);
}

/* REDUCED MOTION — honor prefers-reduced-motion for ALL variants.
 * Users get the final visual state without motion. */
@media (prefers-reduced-motion: reduce) {
  .nectar-special-frame--bounce.rtk-bounce-play > .vc_column-inner,
  .nectar-special-frame--bounce.rtk-bounce-play .vc_column-inner,
  .nectar-special-frame--fade.rtk-bounce-play > .vc_column-inner,
  .nectar-special-frame--fade.rtk-bounce-play .vc_column-inner,
  .nectar-special-frame--grow.rtk-bounce-play > .vc_column-inner,
  .nectar-special-frame--grow.rtk-bounce-play .vc_column-inner,
  .nectar-special-frame--frame-spin.rtk-bounce-play .nectar-special-frame__frame,
  .nectar-special-frame--grow-and-spin.rtk-bounce-play > .vc_column-inner,
  .nectar-special-frame--grow-and-spin.rtk-bounce-play .vc_column-inner,
  .nectar-special-frame--grow-and-spin.rtk-bounce-play .nectar-special-frame__frame {
    animation: none !important;
  }
  /* Fade/grow/frame-spin: snap to final visible state so users still see the portrait. */
  .nectar-special-frame--fade > .vc_column-inner,
  .nectar-special-frame--fade .vc_column-inner,
  .nectar-special-frame--grow > .vc_column-inner,
  .nectar-special-frame--grow .vc_column-inner,
  .nectar-special-frame--frame-spin .nectar-special-frame__frame,
  .nectar-special-frame--grow-and-spin > .vc_column-inner,
  .nectar-special-frame--grow-and-spin .vc_column-inner,
  .nectar-special-frame--grow-and-spin .nectar-special-frame__frame {
    opacity: 1 !important;
    transform: none !important;
  }
  /* Pulse: kill the hover transform. */
  .nectar-special-frame--pulse-hover:hover > .vc_column-inner,
  .nectar-special-frame--pulse-hover:hover .vc_column-inner {
    transform: none !important;
  }
}

/* Responsive scaling — sensible caps matching the existing
 * frame-primitive family. Column shrinks with the layout. */
@media (max-width: 999px) {
  .nectar-special-frame,
  .wpb_column.nectar-special-frame,
  .vc_column_container.nectar-special-frame {
    --nectar-special-frame-max: 360px;
  }
}
@media (max-width: 600px) {
  .nectar-special-frame,
  .wpb_column.nectar-special-frame,
  .vc_column_container.nectar-special-frame {
    --nectar-special-frame-max: 280px;
  }
}

/* ============================================================
 * NECTAR ARROW DECORATOR — foundation primitive (Phase 1)
 *
 * A reusable, hand-drawn orange arrow / loop decorator that can be
 * attached to any content block. Consumed by future Bakery elements
 * (Nectar Callout, Nectar Testimonial) AND usable standalone via
 * `el_class` on any Bakery block right now.
 *
 * TWO USAGE PATHS:
 *
 * (A) As a WRAPPER modifier (like the legacy .rtk-callout-with-*):
 *     Put .nectar-arrow-decorator--wrapper + style/position modifiers on a
 *     [vc_column_text] or column, and the decorator paints as a
 *     ::before pseudo. Wrapper reserves padding for the arrow.
 *
 * (B) As a FREESTANDING span emitted by nectar_render_arrow_decorator()
 *     (PHP helper). Used inside future Nectar Callout / Testimonial
 *     Bakery elements. Sits as an inline-block span with the arrow
 *     as background-image.
 *
 * STYLE MODIFIERS (which SVG). All 4 up/down variants ship pre-oriented,
 * no CSS rotation applied:
 *   .nectar-arrow-decorator--arrow-up-left      → arroworange-upleft.svg
 *   .nectar-arrow-decorator--arrow-up-right     → arroworange-upright.svg
 *   .nectar-arrow-decorator--arrow-down-left    → arroworange-downleft.svg
 *   .nectar-arrow-decorator--arrow-down-right   → arroworange-downright.svg
 *   .nectar-arrow-decorator--arrow-horizontal   → OrangeArrow_Horizontal.svg
 *   .nectar-arrow-decorator--arrow-sketch-left  → arrow-sketch-left.svg
 *   .nectar-arrow-decorator--arrow-sketch-right → arrow-sketch-right.svg
 *   .nectar-arrow-decorator--loop               → OrangeArrowLoop.svg (portrait aspect)
 *
 * POSITION MODIFIERS (wrapper mode only):
 *   .nectar-arrow-decorator--inline-left  (default — arrow to the left of content)
 *   .nectar-arrow-decorator--inline-right (arrow to the right of content)
 *   .nectar-arrow-decorator--top-left, --top-right, --bottom-left, --bottom-right
 *
 * SIZE MODIFIERS (freestanding mode; wrapper mode uses fixed dimensions):
 *   .nectar-arrow-decorator--size-sm  (65×28 horizontal / 70×84 loop)
 *   .nectar-arrow-decorator--size-md  (default — 105×45 horizontal / 90×108 loop)
 *   .nectar-arrow-decorator--size-lg  (140×60 horizontal / 115×138 loop)
 *
 * ANIMATION:
 * Opts into the shared .rtk-bounce-play IntersectionObserver via custom.js.
 * Rotated (--arrow-down-*) variants have their own keyframes that preserve
 * the 180deg rotation across the bounce.
 *
 * REDUCED MOTION:
 * `@media (prefers-reduced-motion: reduce)` disables the bounce.
 * ============================================================ */

/* ---------- (B) Freestanding span: an inline-block arrow ---------- */

/* Freestanding rules: only apply when --wrapper is ABSENT. Wrapper mode
 * carries the base class too (for JS observer matching) but must not
 * inherit the freestanding inline-block/width/height sizing — those
 * would break the outer container's block layout. */
.nectar-arrow-decorator:not(.nectar-arrow-decorator--wrapper) {
  display: inline-block;
  background-repeat: no-repeat;
  background-position: center;
  background-size: contain;
  pointer-events: none;
  vertical-align: middle;
  transform-origin: 50% 50%;
}

/* Base sizes (md default) — freestanding only.
 * up-* / down-* arrows are portrait 90×150 to match production sizing on
 * /who-we-are/ etc. horizontal and sketch stay landscape. */
.nectar-arrow-decorator--arrow-up-left:not(.nectar-arrow-decorator--wrapper),
.nectar-arrow-decorator--arrow-up-right:not(.nectar-arrow-decorator--wrapper),
.nectar-arrow-decorator--arrow-down-left:not(.nectar-arrow-decorator--wrapper),
.nectar-arrow-decorator--arrow-down-right:not(.nectar-arrow-decorator--wrapper) {
  width: 90px; height: 150px;
}
.nectar-arrow-decorator--arrow-horizontal:not(.nectar-arrow-decorator--wrapper),
.nectar-arrow-decorator--arrow-sketch-left:not(.nectar-arrow-decorator--wrapper),
.nectar-arrow-decorator--arrow-sketch-right:not(.nectar-arrow-decorator--wrapper) {
  width: 105px; height: 45px;
}
.nectar-arrow-decorator--loop:not(.nectar-arrow-decorator--wrapper) {
  width: 90px; height: 108px;
}

/* Style: which SVG to paint. Each up/down direction has its own hand-drawn
 * SVG, so no CSS rotation is applied — the artwork ships pre-oriented.
 * All :not(--wrapper) — wrapper mode paints on ::before via wrapper block below. */
.nectar-arrow-decorator--arrow-up-left:not(.nectar-arrow-decorator--wrapper) {
  background-image: url("/wp-content/themes/rosies/assets/decorators/arroworange-upleft.svg");
}
.nectar-arrow-decorator--arrow-up-right:not(.nectar-arrow-decorator--wrapper) {
  background-image: url("/wp-content/themes/rosies/assets/decorators/arroworange-upright.svg");
}
.nectar-arrow-decorator--arrow-down-left:not(.nectar-arrow-decorator--wrapper) {
  background-image: url("/wp-content/themes/rosies/assets/decorators/arroworange-downleft.svg");
}
.nectar-arrow-decorator--arrow-down-right:not(.nectar-arrow-decorator--wrapper) {
  background-image: url("/wp-content/themes/rosies/assets/decorators/arroworange-downright.svg");
}
.nectar-arrow-decorator--arrow-horizontal:not(.nectar-arrow-decorator--wrapper) {
  background-image: url("/wp-content/themes/rosies/assets/decorators/OrangeArrow_Horizontal.svg");
}
.nectar-arrow-decorator--arrow-sketch-left:not(.nectar-arrow-decorator--wrapper) {
  background-image: url("/wp-content/themes/rosies/assets/decorators/arrow-sketch-left.svg");
}
.nectar-arrow-decorator--arrow-sketch-right:not(.nectar-arrow-decorator--wrapper) {
  background-image: url("/wp-content/themes/rosies/assets/decorators/arrow-sketch-right.svg");
}
.nectar-arrow-decorator--loop:not(.nectar-arrow-decorator--wrapper) {
  background-image: url("/wp-content/themes/rosies/assets/decorators/OrangeArrowLoop.svg");
}

/* Size overrides — freestanding only.
 * Portrait (up/down) and landscape (horizontal/sketch) scale independently. */
.nectar-arrow-decorator--size-sm.nectar-arrow-decorator--arrow-up-left:not(.nectar-arrow-decorator--wrapper),
.nectar-arrow-decorator--size-sm.nectar-arrow-decorator--arrow-up-right:not(.nectar-arrow-decorator--wrapper),
.nectar-arrow-decorator--size-sm.nectar-arrow-decorator--arrow-down-left:not(.nectar-arrow-decorator--wrapper),
.nectar-arrow-decorator--size-sm.nectar-arrow-decorator--arrow-down-right:not(.nectar-arrow-decorator--wrapper) {
  width: 60px; height: 100px;
}
.nectar-arrow-decorator--size-sm.nectar-arrow-decorator--arrow-horizontal:not(.nectar-arrow-decorator--wrapper),
.nectar-arrow-decorator--size-sm.nectar-arrow-decorator--arrow-sketch-left:not(.nectar-arrow-decorator--wrapper),
.nectar-arrow-decorator--size-sm.nectar-arrow-decorator--arrow-sketch-right:not(.nectar-arrow-decorator--wrapper) {
  width: 65px; height: 28px;
}
.nectar-arrow-decorator--size-lg.nectar-arrow-decorator--arrow-up-left:not(.nectar-arrow-decorator--wrapper),
.nectar-arrow-decorator--size-lg.nectar-arrow-decorator--arrow-up-right:not(.nectar-arrow-decorator--wrapper),
.nectar-arrow-decorator--size-lg.nectar-arrow-decorator--arrow-down-left:not(.nectar-arrow-decorator--wrapper),
.nectar-arrow-decorator--size-lg.nectar-arrow-decorator--arrow-down-right:not(.nectar-arrow-decorator--wrapper) {
  width: 120px; height: 200px;
}
.nectar-arrow-decorator--size-lg.nectar-arrow-decorator--arrow-horizontal:not(.nectar-arrow-decorator--wrapper),
.nectar-arrow-decorator--size-lg.nectar-arrow-decorator--arrow-sketch-left:not(.nectar-arrow-decorator--wrapper),
.nectar-arrow-decorator--size-lg.nectar-arrow-decorator--arrow-sketch-right:not(.nectar-arrow-decorator--wrapper) {
  width: 140px; height: 60px;
}
/* Loop sizes — freestanding only (matches production .rtk-callout-with-orange-loop
 * usage on /acte-ii/: loop reads ~90×108 alongside a 30px callout heading) */
.nectar-arrow-decorator--size-sm.nectar-arrow-decorator--loop:not(.nectar-arrow-decorator--wrapper) {
  width: 70px; height: 84px;
}
.nectar-arrow-decorator--size-lg.nectar-arrow-decorator--loop:not(.nectar-arrow-decorator--wrapper) {
  width: 115px; height: 138px;
}

/* ---------- Freestanding bounce keyframes ---------- */
/* Every direction ships pre-oriented in its own SVG, so bounce is a simple
 * vertical bob with no rotation composition to preserve. Two keyframes:
 *   -bob          landscape (horizontal + sketch), 10/5 amplitude
 *   -bob-portrait portrait (up/down arrows + loop), 8/4 amplitude */
@keyframes nectar-arrow-decorator-bob {
  0%   { transform: translateY(0);    }
  25%  { transform: translateY(-10px); }
  50%  { transform: translateY(0);    }
  75%  { transform: translateY(-5px);  }
  100% { transform: translateY(0);    }
}
@keyframes nectar-arrow-decorator-bob-portrait {
  0%   { transform: translateY(0);   }
  25%  { transform: translateY(-8px); }
  50%  { transform: translateY(0);   }
  75%  { transform: translateY(-4px); }
  100% { transform: translateY(0);   }
}

/* Freestanding bounce: animates the element itself. --wrapper excluded
 * because wrapper mode animates the ::before pseudo instead (see wrapper
 * section below). Landscape variants (horizontal + sketch) use -bob;
 * portrait variants (up/down + loop) use -bob-portrait. */
.nectar-arrow-decorator.rtk-bounce-play:not(.nectar-arrow-decorator--wrapper) {
  animation: nectar-arrow-decorator-bob 0.9s ease-in-out 3;
}
.nectar-arrow-decorator--arrow-up-left.rtk-bounce-play:not(.nectar-arrow-decorator--wrapper),
.nectar-arrow-decorator--arrow-up-right.rtk-bounce-play:not(.nectar-arrow-decorator--wrapper),
.nectar-arrow-decorator--arrow-down-left.rtk-bounce-play:not(.nectar-arrow-decorator--wrapper),
.nectar-arrow-decorator--arrow-down-right.rtk-bounce-play:not(.nectar-arrow-decorator--wrapper),
.nectar-arrow-decorator--loop.rtk-bounce-play:not(.nectar-arrow-decorator--wrapper) {
  animation: nectar-arrow-decorator-bob-portrait 0.9s ease-in-out 3;
}

@media (prefers-reduced-motion: reduce) {
  .nectar-arrow-decorator.rtk-bounce-play:not(.nectar-arrow-decorator--wrapper) {
    animation: none;
  }
}

/* ---------- (A) Wrapper mode: paint decorator as ::before ---------- */
/* Toggle wrapper mode by adding .nectar-arrow-decorator--wrapper alongside
 * a style modifier + position modifier. The wrapper reserves padding so
 * text doesn't collide with the arrow. Default position = inline-left. */

.nectar-arrow-decorator--wrapper {
  position: relative;
  overflow: visible !important;
}

.nectar-arrow-decorator--wrapper::before {
  content: "";
  position: absolute;
  background-repeat: no-repeat;
  background-position: center;
  background-size: contain;
  pointer-events: none;
  z-index: 3;
  transform-origin: 50% 50%;
  width: 105px; height: 45px; /* default landscape footprint (horizontal + sketch) */
}

/* Portrait footprint for up/down orange arrows — matches production 90×150. */
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--arrow-up-left::before,
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--arrow-up-right::before,
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--arrow-down-left::before,
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--arrow-down-right::before {
  width: 90px; height: 150px;
}

/* Wrapper + style: which SVG the ::before shows. Each direction has its
 * own hand-drawn SVG (pre-oriented), so no rotation is applied. */
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--arrow-up-left::before {
  background-image: url("/wp-content/themes/rosies/assets/decorators/arroworange-upleft.svg");
}
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--arrow-up-right::before {
  background-image: url("/wp-content/themes/rosies/assets/decorators/arroworange-upright.svg");
}
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--arrow-down-left::before {
  background-image: url("/wp-content/themes/rosies/assets/decorators/arroworange-downleft.svg");
}
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--arrow-down-right::before {
  background-image: url("/wp-content/themes/rosies/assets/decorators/arroworange-downright.svg");
}
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--arrow-horizontal::before {
  background-image: url("/wp-content/themes/rosies/assets/decorators/OrangeArrow_Horizontal.svg");
}
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--arrow-sketch-left::before {
  background-image: url("/wp-content/themes/rosies/assets/decorators/arrow-sketch-left.svg");
}
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--arrow-sketch-right::before {
  background-image: url("/wp-content/themes/rosies/assets/decorators/arrow-sketch-right.svg");
}
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--loop::before {
  background-image: url("/wp-content/themes/rosies/assets/decorators/OrangeArrowLoop.svg");
  width: 90px; height: 108px;
}

/* Wrapper + position: sets top/right/bottom/left + a base transform.
 * Per-style rules below OVERRIDE the transform to layer in rotation. */
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--inline-left {
  padding-left: 110px;
}
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--inline-left::before {
  top: 50%; left: 0;
  transform: translateY(-50%);
}
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--inline-right {
  padding-right: 110px;
}
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--inline-right::before {
  top: 50%; right: 0;
  transform: translateY(-50%);
}
/* Corner positions: arrow overhangs OUTWARD from the corner. Only the
 * arrow's tail-end (or arrowhead-end for bottom positions) touches the
 * callout, the body sits outside. Wrapper reserves 80px horizontal padding
 * on the arrow's side so the heading/body text is pushed clear of the arrow
 * (same value all breakpoints). */
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--top-left,
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--bottom-left {
  padding-left: 80px;
}
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--top-right,
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--bottom-right {
  padding-right: 80px;
}
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--top-left::before {
  top: -20px; left: -10px;
}
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--top-right::before {
  top: -20px; right: -10px;
}
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--bottom-left::before {
  bottom: -20px; left: -10px;
}
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--bottom-right::before {
  bottom: -20px; right: -10px;
}

/* Up/down variants (90x150): push most of the arrow off the corner so its
 * tail-tip just kisses the callout edge. -130 top/bottom leaves 20px of the
 * 150px body poking into the corner; -20 left/right hangs 20px past the side.
 * 80px horizontal wrapper padding (inherited from the baseline corner rules
 * above) keeps text clear of the arrow at all breakpoints. */
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--arrow-up-left.nectar-arrow-decorator--top-left::before,
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--arrow-up-right.nectar-arrow-decorator--top-left::before,
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--arrow-down-left.nectar-arrow-decorator--top-left::before,
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--arrow-down-right.nectar-arrow-decorator--top-left::before {
  top: -130px; left: -20px;
}
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--arrow-up-left.nectar-arrow-decorator--top-right::before,
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--arrow-up-right.nectar-arrow-decorator--top-right::before,
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--arrow-down-left.nectar-arrow-decorator--top-right::before,
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--arrow-down-right.nectar-arrow-decorator--top-right::before {
  top: -130px; right: -20px;
}
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--arrow-up-left.nectar-arrow-decorator--bottom-left::before,
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--arrow-up-right.nectar-arrow-decorator--bottom-left::before,
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--arrow-down-left.nectar-arrow-decorator--bottom-left::before,
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--arrow-down-right.nectar-arrow-decorator--bottom-left::before {
  bottom: -130px; left: -20px;
}
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--arrow-up-left.nectar-arrow-decorator--bottom-right::before,
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--arrow-up-right.nectar-arrow-decorator--bottom-right::before,
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--arrow-down-left.nectar-arrow-decorator--bottom-right::before,
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--arrow-down-right.nectar-arrow-decorator--bottom-right::before {
  bottom: -130px; right: -20px;
}

/* All 4 up/down SVGs are pre-oriented — no rotation composition needed.
 * inline-* positions inherit translateY(-50%) from the position rule above;
 * corner positions inherit identity transform. */

/* Loop variant reserves 110px for its 90px portrait footprint + 20px buffer */
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--loop.nectar-arrow-decorator--inline-left {
  padding-left: 110px;
}
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--loop.nectar-arrow-decorator--inline-right {
  padding-right: 110px;
}

/* ---------- Wrapper bounce keyframes ---------- */
/* Every direction ships pre-oriented in its own SVG, so bounce is a simple
 * vertical bob. Two keyframes:
 *   -bob-inline: for inline-left/right (preserves translateY(-50%) center)
 *   -bob-corner: for top/bottom corners (identity base)
 */
@keyframes nectar-arrow-decorator-wrapper-bob-inline {
  0%   { transform: translateY(-50%); }
  25%  { transform: translateY(calc(-50% - 10px)); }
  50%  { transform: translateY(-50%); }
  75%  { transform: translateY(calc(-50% - 5px));  }
  100% { transform: translateY(-50%); }
}
@keyframes nectar-arrow-decorator-wrapper-bob-corner {
  0%   { transform: translateY(0);    }
  25%  { transform: translateY(-10px); }
  50%  { transform: translateY(0);    }
  75%  { transform: translateY(-5px);  }
  100% { transform: translateY(0);    }
}

/* Bounce selectors — one rule per position class, no style-specific rules. */
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--inline-left.rtk-bounce-play::before,
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--inline-right.rtk-bounce-play::before {
  animation: nectar-arrow-decorator-wrapper-bob-inline 0.9s ease-in-out 3;
}
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--top-left.rtk-bounce-play::before,
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--top-right.rtk-bounce-play::before,
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--bottom-left.rtk-bounce-play::before,
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--bottom-right.rtk-bounce-play::before {
  animation: nectar-arrow-decorator-wrapper-bob-corner 0.9s ease-in-out 3;
}

@media (prefers-reduced-motion: reduce) {
  .nectar-arrow-decorator--wrapper.rtk-bounce-play::before {
    animation: none;
  }
}

/* Tablet: shrink wrapper footprint (matches legacy .rtk-callout-* sizing) */
@media (max-width: 1024px) {
  .nectar-arrow-decorator--wrapper.nectar-arrow-decorator--inline-left {
    padding-left: 95px;
  }
  .nectar-arrow-decorator--wrapper.nectar-arrow-decorator--inline-right {
    padding-right: 95px;
  }
  .nectar-arrow-decorator--wrapper::before {
    width: 82px; height: 35px;
  }
  .nectar-arrow-decorator--wrapper.nectar-arrow-decorator--loop.nectar-arrow-decorator--inline-left {
    padding-left: 90px;
  }
  .nectar-arrow-decorator--wrapper.nectar-arrow-decorator--loop.nectar-arrow-decorator--inline-right {
    padding-right: 90px;
  }
  .nectar-arrow-decorator--wrapper.nectar-arrow-decorator--loop::before {
    width: 70px; height: 84px;
  }
}

/* Mobile: even smaller, keep arrow inline (no stacking-above; matches legacy .rtk-callout-*) */
@media (max-width: 600px) {
  .nectar-arrow-decorator--wrapper.nectar-arrow-decorator--inline-left {
    padding-left: 105px;
  }
  .nectar-arrow-decorator--wrapper.nectar-arrow-decorator--inline-right {
    padding-right: 105px;
  }
  .nectar-arrow-decorator--wrapper::before {
    width: 65px; height: 28px;
  }
  .nectar-arrow-decorator--wrapper.nectar-arrow-decorator--loop.nectar-arrow-decorator--inline-left {
    padding-left: 105px;
  }
  .nectar-arrow-decorator--wrapper.nectar-arrow-decorator--loop.nectar-arrow-decorator--inline-right {
    padding-right: 105px;
  }
  .nectar-arrow-decorator--wrapper.nectar-arrow-decorator--loop::before {
    width: 55px; height: 66px;
  }
}
/* ============================================================
 * END nectar-arrow-decorator
 * ============================================================ */

/* ============================================================
 * NECTAR CALLOUT — Bakery element inner elements
 *
 * The outer div gets .nectar-callout + wrapper/style/position
 * classes from the shared .nectar-arrow-decorator primitive.
 * This block styles the inner __heading / __body / __cta.
 *
 * Kept intentionally minimal — inherits site typography.
 * ============================================================ */

.nectar-callout {
  /* No positioning/padding here — those come from the wrapper primitive. */
}

.nectar-callout__heading {
  /* Color set inline from Bakery colorpicker; other props inherit
   * from theme H2–H6 rules so the callout's heading looks native. */
  margin: 0 0 12px 0;
}

.nectar-callout__body {
  /* Kill Salient's wpb_text_column p padding-bottom that adds a phantom
   * 1.5em gap after paragraphs — matches the fix from who-we-are-patch-10. */
  margin: 0 0 12px 0;
}
.nectar-callout__body p {
  padding-bottom: 0;
  margin-bottom: 0.5em;
}
.nectar-callout__body p:last-child {
  margin-bottom: 0;
}

.nectar-callout__cta {
  display: inline-block;
  margin-top: 8px;
  /* Inherits color/typography from theme link styles. Editors can override
   * via Extra Class Name if a specific button treatment is needed. */
}

/* Opt-out of bounce animation when the element's animation param = "none".
 * The outer div carries data-nectar-anim="none"; suppress the ::before
 * animation locally without touching the shared bounce trigger. */
.nectar-callout[data-nectar-anim="none"].nectar-arrow-decorator--wrapper.rtk-bounce-play::before,
.nectar-callout[data-nectar-anim="none"].nectar-arrow-decorator--wrapper::before {
  animation: none !important;
}
/* ============================================================
 * END nectar-callout
 * ============================================================ */

/* ============================================================
 * NECTAR CALLOUT — Heading font variants (patch-04)
 *
 * Editors pick a font from the "Heading font" dropdown; PHP writes
 * one of these modifier classes on the outer wrapper:
 *   .nectar-callout--font-inherit  → no override (default)
 *   .nectar-callout--font-display  → Rift Soft display font
 *   .nectar-callout--font-script   → Verveine script font
 *   .nectar-callout--font-body     → Roboto body font
 * ============================================================ */
.nectar-callout--font-display .nectar-callout__heading,
.nectar-callout--font-display .nectar-callout__heading span {
  font-family: var(--rosies-font-display), 'Rift Soft', 'Impact', 'Arial Narrow', sans-serif;
}
.nectar-callout--font-script .nectar-callout__heading,
.nectar-callout--font-script .nectar-callout__heading span {
  font-family: var(--rosies-font-script), 'Verveine', 'Brush Script MT', cursive;
}
.nectar-callout--font-body .nectar-callout__heading,
.nectar-callout--font-body .nectar-callout__heading span {
  font-family: var(--rosies-font-body), 'Roboto', -apple-system, sans-serif;
}

/* ============================================================
 * NECTAR CALLOUT — Alternate animations (patch-04)
 *
 * The custom.js observer reads data-nectar-anim on the wrapper and
 * adds one of these play classes when the element scrolls into view:
 *   .nectar-anim-pivot-play  → ±10° rock around center, one-shot
 *   .nectar-anim-swing-play  → ±15° pendulum from arrow tip, one-shot
 *   .nectar-anim-pop-play    → 1×→1.15×→1× scale pulse, one-shot
 *
 * These co-exist with .rtk-bounce-play (bounce) because the observer
 * only adds ONE play class per element, so selectors never conflict.
 *
 * Each animation preserves the per-variant base rotation via a
 * --nectar-rotate custom property emitted per arrow style below.
 * Two keyframe families per animation: one for inline positions
 * (base transform: translateY(-50%)) and one for corner positions
 * (base transform: identity).
 * ============================================================ */

/* Per-style rotation offsets, read by the animation keyframes below.
 * Matches the existing rotation composition table exactly. */
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--arrow-up-left    { --nectar-rotate:  15deg; }
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--arrow-up-right   { --nectar-rotate: -15deg; }
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--arrow-down-left  { --nectar-rotate: 195deg; }
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--arrow-down-right { --nectar-rotate: 165deg; }
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--arrow-horizontal { --nectar-rotate: 0deg; }
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--arrow-sketch-left  { --nectar-rotate: 0deg; }
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--arrow-sketch-right { --nectar-rotate: 0deg; }
.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--loop { --nectar-rotate: 0deg; }

/* ---------- Pivot (±10° around center, one-shot 0.9s) ---------- */
@keyframes nectar-pivot-inline {
  0%   { transform: translateY(-50%) rotate(calc(var(--nectar-rotate, 0deg) + 0deg)); }
  25%  { transform: translateY(-50%) rotate(calc(var(--nectar-rotate, 0deg) + 10deg)); }
  50%  { transform: translateY(-50%) rotate(calc(var(--nectar-rotate, 0deg) + 0deg)); }
  75%  { transform: translateY(-50%) rotate(calc(var(--nectar-rotate, 0deg) - 10deg)); }
  100% { transform: translateY(-50%) rotate(calc(var(--nectar-rotate, 0deg) + 0deg)); }
}
@keyframes nectar-pivot-corner {
  0%   { transform: rotate(calc(var(--nectar-rotate, 0deg) + 0deg)); }
  25%  { transform: rotate(calc(var(--nectar-rotate, 0deg) + 10deg)); }
  50%  { transform: rotate(calc(var(--nectar-rotate, 0deg) + 0deg)); }
  75%  { transform: rotate(calc(var(--nectar-rotate, 0deg) - 10deg)); }
  100% { transform: rotate(calc(var(--nectar-rotate, 0deg) + 0deg)); }
}

.nectar-anim-pivot-play.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--inline-left::before,
.nectar-anim-pivot-play.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--inline-right::before {
  animation: nectar-pivot-inline 0.9s ease-in-out 1 both;
  transform-origin: 50% 50%;
}
.nectar-anim-pivot-play.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--top-left::before,
.nectar-anim-pivot-play.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--top-right::before,
.nectar-anim-pivot-play.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--bottom-left::before,
.nectar-anim-pivot-play.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--bottom-right::before {
  animation: nectar-pivot-corner 0.9s ease-in-out 1 both;
  transform-origin: 50% 50%;
}

/* ---------- Swing from tip (±15° pendulum, one-shot 1.0s) ----------
 * transform-origin per variant places the pivot at the arrow's pointy end:
 *   up-left      tip is top-right  →  100% 0%
 *   up-right     tip is top-left   →    0% 0%
 *   down-left    tip is bottom-left → 0% 100%
 *   down-right   tip is bottom-right → 100% 100%
 *   horizontal   tip is right       → 100% 50%
 *   sketch-left  tip is left        →   0% 50%
 *   sketch-right tip is right       → 100% 50%
 *   loop         tip is bottom-right → 100% 100% */
@keyframes nectar-swing-inline {
  0%   { transform: translateY(-50%) rotate(calc(var(--nectar-rotate, 0deg) + 0deg)); }
  25%  { transform: translateY(-50%) rotate(calc(var(--nectar-rotate, 0deg) + 15deg)); }
  50%  { transform: translateY(-50%) rotate(calc(var(--nectar-rotate, 0deg) + 0deg)); }
  75%  { transform: translateY(-50%) rotate(calc(var(--nectar-rotate, 0deg) - 15deg)); }
  100% { transform: translateY(-50%) rotate(calc(var(--nectar-rotate, 0deg) + 0deg)); }
}
@keyframes nectar-swing-corner {
  0%   { transform: rotate(calc(var(--nectar-rotate, 0deg) + 0deg)); }
  25%  { transform: rotate(calc(var(--nectar-rotate, 0deg) + 15deg)); }
  50%  { transform: rotate(calc(var(--nectar-rotate, 0deg) + 0deg)); }
  75%  { transform: rotate(calc(var(--nectar-rotate, 0deg) - 15deg)); }
  100% { transform: rotate(calc(var(--nectar-rotate, 0deg) + 0deg)); }
}

.nectar-anim-swing-play.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--inline-left::before,
.nectar-anim-swing-play.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--inline-right::before {
  animation: nectar-swing-inline 1.0s ease-in-out 1 both;
}
.nectar-anim-swing-play.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--top-left::before,
.nectar-anim-swing-play.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--top-right::before,
.nectar-anim-swing-play.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--bottom-left::before,
.nectar-anim-swing-play.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--bottom-right::before {
  animation: nectar-swing-corner 1.0s ease-in-out 1 both;
}

/* Swing rotates around the arrow's CENTER (default transform-origin: 50% 50%).
 *
 * Earlier drafts of this element per-style transform-origins to make the arrow
 * pivot from its literal tip, but because .nectar-anim-swing-play stays on the
 * wrapper after the animation ends (animation-fill-mode: both), those origin
 * overrides persisted at rest and — combined with each variant's static
 * --nectar-rotate base tilt — visually translated the arrow off its resting
 * position. At ±15° over ~90×150px, center-pivot reads as a swing just fine
 * and avoids the origin-persistence bug.
 */

/* ---------- Scale pop (1× → 1.15× → 1×, one-shot 0.6s) ----------
 * Combines the base transform (rotate for corner, translateY+rotate for inline)
 * with a scale multiplier. */
@keyframes nectar-pop-inline {
  0%   { transform: translateY(-50%) rotate(var(--nectar-rotate, 0deg)) scale(1); }
  50%  { transform: translateY(-50%) rotate(var(--nectar-rotate, 0deg)) scale(1.15); }
  100% { transform: translateY(-50%) rotate(var(--nectar-rotate, 0deg)) scale(1); }
}
@keyframes nectar-pop-corner {
  0%   { transform: rotate(var(--nectar-rotate, 0deg)) scale(1); }
  50%  { transform: rotate(var(--nectar-rotate, 0deg)) scale(1.15); }
  100% { transform: rotate(var(--nectar-rotate, 0deg)) scale(1); }
}

.nectar-anim-pop-play.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--inline-left::before,
.nectar-anim-pop-play.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--inline-right::before {
  animation: nectar-pop-inline 0.6s ease-out 1 both;
  transform-origin: 50% 50%;
}
.nectar-anim-pop-play.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--top-left::before,
.nectar-anim-pop-play.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--top-right::before,
.nectar-anim-pop-play.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--bottom-left::before,
.nectar-anim-pop-play.nectar-arrow-decorator--wrapper.nectar-arrow-decorator--bottom-right::before {
  animation: nectar-pop-corner 0.6s ease-out 1 both;
  transform-origin: 50% 50%;
}

/* Honor prefers-reduced-motion for all new animations. */
@media (prefers-reduced-motion: reduce) {
  .nectar-anim-pivot-play.nectar-arrow-decorator--wrapper::before,
  .nectar-anim-swing-play.nectar-arrow-decorator--wrapper::before,
  .nectar-anim-pop-play.nectar-arrow-decorator--wrapper::before {
    animation: none !important;
  }
}
/* ============================================================
 * END nectar-callout animations
 * ============================================================ */


/* ============================================================
 * RTKids /donate — Gravity Forms v1 (Orbital theme override)
 * ------------------------------------------------------------
 * Gravity Forms 2.9+ renders every form with its own theme
 * framework — the wrapper carries `gform-theme--orbital` and
 * every choice label is `.gform-field-label--type-inline` with
 * higher specificity than any single-class selector.
 *
 * This block is the ONLY CSS the /donate form needs. It
 * replaces the earlier `.rtk-donation-form` block (which was
 * written for the classic Foundation renderer and never took).
 *
 * Scope: `.gform-theme--orbital .rtk-donation-form_wrapper`
 * (that IS the wrapper class Gravity generates from our
 * form-level cssClass "rtk-donation-form" — it appends `_wrapper`.)
 * ============================================================ */

.gform-theme--orbital.rtk-donation-form_wrapper {
  --rtk-donate-navy: #0e2c4b;
  --rtk-donate-blue: #059dd9;
  --rtk-donate-purple: #7a54a3;
  --rtk-donate-orange: #ff8a3d;
  --rtk-donate-border: #e5e7eb;
  --rtk-donate-radius: 10px;
  font-family: var(--rosies-font-body, "Roboto", system-ui, sans-serif);
  color: var(--rtk-donate-navy);
  max-width: 780px;
}

/* --- Section headers --------------------------------------- */
.gform-theme--orbital.rtk-donation-form_wrapper .rtk-donate-section .gsection_title {
  font-family: var(--rosies-font-display, "Rift Soft", Impact, sans-serif) !important;
  font-size: 28px !important;
  font-weight: 700 !important;
  color: var(--rtk-donate-blue) !important;
  text-transform: uppercase !important;
  letter-spacing: 0.03em !important;
  margin: 0 0 8px !important;
  padding: 0 !important;
}
.gform-theme--orbital.rtk-donation-form_wrapper .rtk-donate-section {
  border-bottom: 2px solid var(--rtk-donate-blue) !important;
  padding-bottom: 6px !important;
  margin: 28px 0 20px !important;
}

/* --- Field label (top-level, e.g. "Donation Amount") ------- */
.gform-theme--orbital.rtk-donation-form_wrapper .gfield > .gfield_label {
  font-family: var(--rosies-font-body, "Roboto", sans-serif) !important;
  font-size: 13px !important;
  font-weight: 700 !important;
  text-transform: uppercase !important;
  letter-spacing: 0.06em !important;
  color: var(--rtk-donate-navy) !important;
  margin-bottom: 10px !important;
}
.gform-theme--orbital.rtk-donation-form_wrapper .gfield_required {
  color: var(--rtk-donate-orange) !important;
}

/* ============================================================
 * AMOUNT PICKER — chip pills
 * ============================================================
 * Orbital DOM (per choice):
 *   .gchoice > input[type=radio] + label.gform-field-label--type-inline
 * We paint the label as the pill, hide the radio, and make each
 * .gchoice a full grid cell.
 * ============================================================ */

.gform-theme--orbital.rtk-donation-form_wrapper .rtk-amount-picker .gfield_radio {
  display: grid !important;
  grid-template-columns: repeat(4, 1fr) !important;
  gap: 10px !important;
  padding: 0 !important;
}

/* Each choice becomes a full-cell button target */
.gform-theme--orbital.rtk-donation-form_wrapper .rtk-amount-picker .gchoice {
  display: block !important;
  position: relative !important;
  width: auto !important;
  margin: 0 !important;
  padding: 0 !important;
}

/* Hide the native radio input — the label IS the button */
.gform-theme--orbital.rtk-donation-form_wrapper .rtk-amount-picker .gchoice input[type="radio"] {
  position: absolute !important;
  opacity: 0 !important;
  pointer-events: none !important;
  width: 1px !important;
  height: 1px !important;
  margin: 0 !important;
}

/* The chip pill (the label) */
.gform-theme--orbital.rtk-donation-form_wrapper .rtk-amount-picker .gchoice > label.gform-field-label--type-inline {
  display: flex !important;
  align-items: center !important;
  justify-content: center !important;
  width: 100% !important;
  min-height: 56px !important;
  padding: 14px 12px !important;
  border: 2px solid var(--rtk-donate-border) !important;
  border-radius: var(--rtk-donate-radius) !important;
  background: #ffffff !important;
  color: var(--rtk-donate-navy) !important;
  font-family: var(--rosies-font-display, "Rift Soft", Impact, sans-serif) !important;
  font-size: 22px !important;
  font-weight: 700 !important;
  letter-spacing: 0.02em !important;
  text-align: center !important;
  cursor: pointer !important;
  transition: border-color .15s ease, background .15s ease, color .15s ease, transform .15s ease !important;
  margin: 0 !important;
  box-sizing: border-box !important;
}

.gform-theme--orbital.rtk-donation-form_wrapper .rtk-amount-picker .gchoice:hover > label.gform-field-label--type-inline {
  border-color: var(--rtk-donate-blue) !important;
  color: var(--rtk-donate-blue) !important;
}

/* CHECKED state — the CRITICAL fix for $100-invisible bug.
 * Sibling selector: input:checked + label */
.gform-theme--orbital.rtk-donation-form_wrapper .rtk-amount-picker .gchoice input[type="radio"]:checked + label.gform-field-label--type-inline {
  border-color: var(--rtk-donate-blue) !important;
  background: var(--rtk-donate-blue) !important;
  color: #ffffff !important;
  box-shadow: 0 2px 8px rgba(5, 157, 217, 0.25) !important;
}

/* Keyboard focus */
.gform-theme--orbital.rtk-donation-form_wrapper .rtk-amount-picker .gchoice input[type="radio"]:focus-visible + label.gform-field-label--type-inline {
  outline: 3px solid var(--rtk-donate-orange) !important;
  outline-offset: 2px !important;
}

/* ============================================================
 * CUSTOM AMOUNT — User Defined Price field (Path B)
 * ------------------------------------------------------------
 * When user picks "Other" pill, Gravity's native conditional
 * logic shows Field 25 (Custom Amount / User Defined Price).
 * That field renders as a plain text input inside
 * `.ginput_container_price`. Style it to visually match the pills.
 *
 * DOM (Orbital theme):
 *   .gfield--type-product.rtk-custom-amount
 *     .ginput_container.ginput_container_price
 *       .ginput_amount (span with currency prefix)
 *       input[type="text"]
 * ============================================================ */

.gform-theme--orbital.rtk-donation-form_wrapper .rtk-custom-amount {
  margin-top: 10px !important;
}

.gform-theme--orbital.rtk-donation-form_wrapper .rtk-custom-amount .ginput_container_price {
  display: block !important;
  width: 100% !important;
}

.gform-theme--orbital.rtk-donation-form_wrapper .rtk-custom-amount .ginput_amount {
  display: flex !important;
  align-items: center !important;
  position: relative !important;
}

/* Currency-symbol prefix span (Gravity renders "$" as .ginput_currency_prefix) */
.gform-theme--orbital.rtk-donation-form_wrapper .rtk-custom-amount .ginput_currency_prefix,
.gform-theme--orbital.rtk-donation-form_wrapper .rtk-custom-amount .ginput_amount::before {
  color: var(--rtk-donate-navy) !important;
  font-family: var(--rosies-font-display, "Rift Soft", Impact, sans-serif) !important;
  font-size: 20px !important;
  font-weight: 700 !important;
}

/* The price input itself: style to match a pill */
.gform-theme--orbital.rtk-donation-form_wrapper .rtk-custom-amount input[type="text"] {
  width: 100% !important;
  min-height: 56px !important;
  padding: 14px 12px !important;
  border: 2px solid var(--rtk-donate-border) !important;
  border-radius: var(--rtk-donate-radius) !important;
  background: #ffffff !important;
  color: var(--rtk-donate-navy) !important;
  font-family: var(--rosies-font-display, "Rift Soft", Impact, sans-serif) !important;
  font-size: 20px !important;
  font-weight: 700 !important;
  text-align: center !important;
  box-sizing: border-box !important;
  margin: 0 !important;
}

.gform-theme--orbital.rtk-donation-form_wrapper .rtk-custom-amount input[type="text"]::placeholder {
  color: var(--rtk-donate-navy) !important;
  opacity: 0.55 !important;
  font-weight: 700 !important;
}

.gform-theme--orbital.rtk-donation-form_wrapper .rtk-custom-amount input[type="text"]:hover {
  border-color: var(--rtk-donate-blue) !important;
}

.gform-theme--orbital.rtk-donation-form_wrapper .rtk-custom-amount input[type="text"]:focus {
  border-color: var(--rtk-donate-blue) !important;
  outline: none !important;
  box-shadow: 0 0 0 3px rgba(5, 157, 217, 0.15) !important;
}

/* Description text under the input ("Minimum $5.") */
.gform-theme--orbital.rtk-donation-form_wrapper .rtk-custom-amount .gfield_description {
  color: var(--rtk-donate-navy) !important;
  opacity: 0.7 !important;
  font-size: 14px !important;
  margin-top: 6px !important;
  display: block !important;
}

/* Hide the "Choose an amount or enter your own" helper text
 * on the pill row (was line 3219 in v1) */
.gform-theme--orbital.rtk-donation-form_wrapper .rtk-amount-picker > .gfield_description {
  display: none !important;
}


/* ============================================================
 * FREQUENCY PICKER — pill row
 * ============================================================ */

.gform-theme--orbital.rtk-donation-form_wrapper .rtk-frequency-picker .gfield_radio {
  display: grid !important;
  grid-template-columns: repeat(4, 1fr) !important;
  gap: 10px !important;
  padding: 0 !important;
}

.gform-theme--orbital.rtk-donation-form_wrapper .rtk-frequency-picker .gchoice {
  display: block !important;
  position: relative !important;
  margin: 0 !important;
  padding: 0 !important;
}

.gform-theme--orbital.rtk-donation-form_wrapper .rtk-frequency-picker .gchoice input[type="radio"] {
  position: absolute !important;
  opacity: 0 !important;
  pointer-events: none !important;
  width: 1px !important;
  height: 1px !important;
}

.gform-theme--orbital.rtk-donation-form_wrapper .rtk-frequency-picker .gchoice > label.gform-field-label--type-inline {
  display: flex !important;
  align-items: center !important;
  justify-content: center !important;
  width: 100% !important;
  min-height: 48px !important;
  padding: 12px 16px !important;
  border: 2px solid var(--rtk-donate-border) !important;
  border-radius: var(--rtk-donate-radius) !important;
  background: #ffffff !important;
  color: var(--rtk-donate-navy) !important;
  font-family: var(--rosies-font-body, "Roboto", sans-serif) !important;
  font-size: 16px !important;
  font-weight: 600 !important;
  text-align: center !important;
  cursor: pointer !important;
  transition: border-color .15s ease, background .15s ease, color .15s ease !important;
  margin: 0 !important;
  box-sizing: border-box !important;
}

.gform-theme--orbital.rtk-donation-form_wrapper .rtk-frequency-picker .gchoice:hover > label.gform-field-label--type-inline {
  border-color: var(--rtk-donate-purple) !important;
  color: var(--rtk-donate-purple) !important;
}

.gform-theme--orbital.rtk-donation-form_wrapper .rtk-frequency-picker .gchoice input[type="radio"]:checked + label.gform-field-label--type-inline {
  border-color: var(--rtk-donate-purple) !important;
  background: var(--rtk-donate-purple) !important;
  color: #ffffff !important;
  box-shadow: 0 2px 8px rgba(122, 84, 163, 0.25) !important;
}

/* ============================================================
 * COVER-FEE CHECKBOX + DEDICATION TOGGLE
 * ============================================================ */

.gform-theme--orbital.rtk-donation-form_wrapper .rtk-dedication-toggle > .gfield_label {
  display: none !important;   /* the checkbox label carries the copy */
}

.gform-theme--orbital.rtk-donation-form_wrapper .rtk-cover-fee > .gfield_label {
  display: block !important;
  font-family: var(--rosies-font-body, "Roboto", sans-serif) !important;
  font-size: 15px !important;
  font-weight: 600 !important;
  line-height: 1.4 !important;
  color: var(--rtk-donate-navy) !important;
  margin: 0 0 8px 0 !important;
  padding: 0 !important;
}
.gform-theme--orbital.rtk-donation-form_wrapper .rtk-cover-fee > .gfield_label .gform-field-label__text {
  font-weight: inherit !important;
}

.gform-theme--orbital.rtk-donation-form_wrapper .rtk-cover-fee .gchoice,
.gform-theme--orbital.rtk-donation-form_wrapper .rtk-dedication-toggle .gchoice {
  display: flex !important;
  align-items: flex-start !important;
  gap: 10px !important;
  padding: 12px 14px !important;
  background: #f6fbfd !important;
  border: 1px solid var(--rtk-donate-border) !important;
  border-radius: var(--rtk-donate-radius) !important;
}

.gform-theme--orbital.rtk-donation-form_wrapper .rtk-cover-fee .gchoice input[type="checkbox"],
.gform-theme--orbital.rtk-donation-form_wrapper .rtk-dedication-toggle .gchoice input[type="checkbox"] {
  width: 20px !important;
  height: 20px !important;
  margin-top: 2px !important;
  accent-color: var(--rtk-donate-blue) !important;
  flex: 0 0 auto !important;
}

.gform-theme--orbital.rtk-donation-form_wrapper .rtk-cover-fee .gchoice > label,
.gform-theme--orbital.rtk-donation-form_wrapper .rtk-dedication-toggle .gchoice > label {
  font-family: var(--rosies-font-body, "Roboto", sans-serif) !important;
  font-size: 15px !important;
  line-height: 1.5 !important;
  color: var(--rtk-donate-navy) !important;
  cursor: pointer !important;
  margin: 0 !important;
}

/* Hide the processing-fee product line — it's a math field, not UI */
.gform-theme--orbital.rtk-donation-form_wrapper .rtk-fee-line {
  position: absolute !important;
  left: -9999px !important;
  height: 0 !important;
  overflow: hidden !important;
}

/* ============================================================
 * DEDICATION TYPE + HONOREE (revealed by conditional logic)
 * ============================================================ */

.gform-theme--orbital.rtk-donation-form_wrapper .rtk-dedication-type .gfield_radio {
  display: flex !important;
  flex-wrap: wrap !important;
  gap: 20px !important;
  padding: 4px 0 !important;
}
.gform-theme--orbital.rtk-donation-form_wrapper .rtk-dedication-type .gchoice {
  display: flex !important;
  align-items: center !important;
  gap: 8px !important;
}
.gform-theme--orbital.rtk-donation-form_wrapper .rtk-dedication-type .gchoice > label {
  font-size: 15px !important;
  font-weight: 500 !important;
  color: var(--rtk-donate-navy) !important;
  cursor: pointer !important;
}

/* ============================================================
 * TEXT / EMAIL / PHONE / ADDRESS
 * ============================================================ */

.gform-theme--orbital.rtk-donation-form_wrapper input[type="text"],
.gform-theme--orbital.rtk-donation-form_wrapper input[type="email"],
.gform-theme--orbital.rtk-donation-form_wrapper input[type="tel"],
.gform-theme--orbital.rtk-donation-form_wrapper input[type="number"],
.gform-theme--orbital.rtk-donation-form_wrapper select,
.gform-theme--orbital.rtk-donation-form_wrapper textarea {
  padding: 12px 14px !important;
  border: 1px solid var(--rtk-donate-border) !important;
  border-radius: 8px !important;
  font-size: 16px !important;
  font-family: inherit !important;
  color: var(--rtk-donate-navy) !important;
  background: #ffffff !important;
  width: 100% !important;
  box-sizing: border-box !important;
}
.gform-theme--orbital.rtk-donation-form_wrapper input:focus,
.gform-theme--orbital.rtk-donation-form_wrapper select:focus,
.gform-theme--orbital.rtk-donation-form_wrapper textarea:focus {
  outline: none !important;
  border-color: var(--rtk-donate-blue) !important;
  box-shadow: 0 0 0 3px rgba(5, 157, 217, 0.15) !important;
}

/* Restore the address subfields' labels (they were normalized off by
 * .gfield > .gfield_label rule above) — but keep them small */
.gform-theme--orbital.rtk-donation-form_wrapper .ginput_complex label,
.gform-theme--orbital.rtk-donation-form_wrapper .name_first label,
.gform-theme--orbital.rtk-donation-form_wrapper .name_last label {
  font-size: 12px !important;
  font-weight: 500 !important;
  text-transform: none !important;
  letter-spacing: 0 !important;
  color: #6b7280 !important;
  margin-top: 4px !important;
}

/* ============================================================
 * STRIPE PAYMENT ELEMENT
 * ============================================================ */

.gform-theme--orbital.rtk-donation-form_wrapper .rtk-stripe-payment .ginput_container {
  padding: 16px !important;
  border: 1px solid var(--rtk-donate-border) !important;
  border-radius: var(--rtk-donate-radius) !important;
  background: #fafbfc !important;
}

/* ============================================================
 * TOTAL — big blue-highlighted line
 * ============================================================ */

.gform-theme--orbital.rtk-donation-form_wrapper .rtk-total {
  padding: 18px 22px !important;
  background: #f6fbfd !important;
  border-left: 4px solid var(--rtk-donate-blue) !important;
  border-radius: 6px !important;
  margin: 20px 0 !important;
}
.gform-theme--orbital.rtk-donation-form_wrapper .rtk-total > .gfield_label {
  font-size: 14px !important;
  color: var(--rtk-donate-navy) !important;
}
.gform-theme--orbital.rtk-donation-form_wrapper .rtk-total .ginput_total,
.gform-theme--orbital.rtk-donation-form_wrapper .rtk-total .ginput_container_total {
  font-family: var(--rosies-font-display, "Rift Soft", Impact, sans-serif) !important;
  font-size: 34px !important;
  font-weight: 700 !important;
  color: var(--rtk-donate-blue) !important;
}

/* ============================================================
 * SUBMIT BUTTON
 * ============================================================ */

.gform-theme--orbital.rtk-donation-form_wrapper .gform_footer input[type="submit"],
.gform-theme--orbital.rtk-donation-form_wrapper .gform_footer button[type="submit"] {
  background: var(--rtk-donate-navy) !important;
  color: #ffffff !important;
  border: none !important;
  border-radius: 999px !important;
  padding: 18px 40px !important;
  font-family: var(--rosies-font-display, "Rift Soft", Impact, sans-serif) !important;
  font-size: 22px !important;
  font-weight: 700 !important;
  text-transform: uppercase !important;
  letter-spacing: 0.06em !important;
  cursor: pointer !important;
  transition: background .15s ease, transform .15s ease !important;
}
.gform-theme--orbital.rtk-donation-form_wrapper .gform_footer input[type="submit"]:hover,
.gform-theme--orbital.rtk-donation-form_wrapper .gform_footer button[type="submit"]:hover {
  background: var(--rtk-donate-blue) !important;
  transform: translateY(-1px) !important;
}

/* ============================================================
 * VALIDATION
 * ============================================================ */

.gform-theme--orbital.rtk-donation-form_wrapper .gfield_error input,
.gform-theme--orbital.rtk-donation-form_wrapper .gfield_error select,
.gform-theme--orbital.rtk-donation-form_wrapper .gfield_error textarea {
  border-color: #d64545 !important;
  background: #fef6f6 !important;
}
.gform-theme--orbital.rtk-donation-form_wrapper .validation_message {
  color: #d64545 !important;
  font-size: 13px !important;
  margin-top: 4px !important;
}

/* ============================================================
 * RESPONSIVE
 * ============================================================ */

@media (max-width: 767px) {
  .gform-theme--orbital.rtk-donation-form_wrapper .rtk-amount-picker .gfield_radio {
    grid-template-columns: repeat(2, 1fr) !important;
  }
  .gform-theme--orbital.rtk-donation-form_wrapper .rtk-frequency-picker .gfield_radio {
    grid-template-columns: repeat(2, 1fr) !important;
  }
  .gform-theme--orbital.rtk-donation-form_wrapper .rtk-amount-picker .gchoice > label.gform-field-label--type-inline {
    font-size: 20px !important;
    padding: 12px 8px !important;
  }
  .gform-theme--orbital.rtk-donation-form_wrapper .gform_footer input[type="submit"],
  .gform-theme--orbital.rtk-donation-form_wrapper .gform_footer button[type="submit"] {
    width: 100% !important;
    padding: 18px 24px !important;
    font-size: 20px !important;
  }
}


/* ============================================================
 * RTKids /donate — Total inner-box tightening (patch-02)
 * ------------------------------------------------------------
 * Orbital wraps the Total value in its own .ginput_container_total
 * div with heavy default padding that reads as an oversized empty
 * white box. Collapse it so the value sits flush inside the
 * blue-highlighted rail.
 * ============================================================ */
.gform-theme--orbital.rtk-donation-form_wrapper .rtk-total {
  padding: 20px 24px !important;
}
.gform-theme--orbital.rtk-donation-form_wrapper .rtk-total .ginput_container,
.gform-theme--orbital.rtk-donation-form_wrapper .rtk-total .ginput_container_total {
  padding: 0 !important;
  border: none !important;
  background: transparent !important;
  min-height: 0 !important;
  margin-top: 4px !important;
}
.gform-theme--orbital.rtk-donation-form_wrapper .rtk-total .ginput_total {
  padding: 0 !important;
  border: none !important;
  background: transparent !important;
  font-family: var(--rosies-font-display, "Rift Soft", Impact, sans-serif) !important;
  font-size: 40px !important;
  font-weight: 700 !important;
  color: var(--rtk-donate-blue) !important;
  line-height: 1.1 !important;
  height: auto !important;
  width: auto !important;
}

/* ============================================================
 * fu16 — Fix State dropdown visual clip on donate form
 * ------------------------------------------------------------
 * Problem: native <select> inherited/computed line-height was
 * pushing the selected option text up so the descenders (and
 * on some browsers the middle of the glyph) sit above the
 * padding box and read as clipped. The shared input rule above
 * (line 3472) sets padding/font-size but no line-height, so
 * whatever the browser or Orbital defaults compute wins.
 *
 * Fix: give select its own line-height (relative, so it scales
 * with font-size) and align items with the flexy-ish default.
 * `min-height` guarantees a stable box regardless of the row
 * height Orbital computes.
 * ============================================================ */
.gform-theme--orbital.rtk-donation-form_wrapper select {
  line-height: 1.4 !important;
  min-height: 44px !important;
  padding-top: 10px !important;
  padding-bottom: 10px !important;
}

/* ACTE-II cosmetic patch 05: Gala-style total and navy submit pill.
 * Existing form/field markers only. No calculation or submission changes.
 */
.rtk-acteii-form_wrapper .rtk-acteii-total {
  background: #f5fbfd !important;
  border: 0 !important;
  border-left: 6px solid #059dd9 !important;
  border-radius: 10px !important;
  padding: 28px !important;
  box-sizing: border-box;
}
.rtk-acteii-form_wrapper .rtk-acteii-total > .gfield_label {
  font-family: var(--rosies-font-body, "Roboto", sans-serif) !important;
  color: #0e2c4b !important;
  font-size: 18px !important;
  font-weight: 700 !important;
  line-height: 1.4 !important;
  letter-spacing: .04em !important;
  text-transform: uppercase !important;
  min-height: 0;
  margin-bottom: 18px !important;
}
.gform-theme--framework.rtk-acteii-form_wrapper .gfield.rtk-acteii-total input.ginput_total {
  display: block !important;
  font-family: var(--rosies-font-display, "Rift Soft", Impact, sans-serif) !important;
  color: #059dd9 !important;
  font-size: clamp(32px, 4.5vw, 64px) !important;
  line-height: 1.15 !important;
  font-weight: 700 !important;
  background: transparent !important;
  border: 0 !important;
  padding: 0 !important;
  box-shadow: none !important;
  height: auto !important;
  width: 100% !important;
  max-width: 100%;
  box-sizing: border-box;
  overflow-wrap: anywhere;
}
.rtk-acteii-form_wrapper .gform_footer :is(input[type="submit"],button[type="submit"]) {
  background: #0e2c4b !important;
  color: #fff !important;
  border: 0 !important;
  border-radius: 999px !important;
  padding: 18px 40px !important;
  font-family: var(--rosies-font-display, "Rift Soft", Impact, sans-serif) !important;
  font-size: 22px !important;
  font-weight: 700 !important;
  text-transform: uppercase !important;
  letter-spacing: .06em !important;
  cursor: pointer;
}
.rtk-acteii-form_wrapper .gform_footer :is(input[type="submit"],button[type="submit"]):hover {
  background: #059dd9 !important;
}
@media (max-width: 600px) {
  .rtk-acteii-form_wrapper .rtk-acteii-total { padding: 22px !important; }
  .rtk-acteii-form_wrapper .gform_footer :is(input[type="submit"],button[type="submit"]) {
    width: 100% !important;
    padding: 18px 24px !important;
    font-size: 20px !important;
  }
}

/* Who We Are patch 21: Nectar Callout owns the mobile quote arrow.
 * Retain legacy decorations for quotes that have not moved into a Callout.
 */
@media (max-width: 999px) {
  .rtk-work-of-heart-row .nectar-callout .rtk-verveine-quote::before {
    content: none !important;
    display: none !important;
  }
  .rtk-work-of-heart-row .nectar-callout .rtk-verveine-quote,
  .rtk-work-of-heart-row .nectar-callout .rtk-verveine-attribution {
    padding-left: 0 !important;
  }
}

.rtk-faq-toggles .toggles .toggle > .toggle-title,
.rtk-faq-toggles .toggles .toggle > .toggle-title a {
  font-size: 24px;
  line-height: 1.3;
}

/* FAQ patch 01: center Default-style icons within each clickable title.
 * Relative positioning preserves existing text, padding, and row geometry.
 * Percentage centering also covers wrapped titles at narrower widths.
 */
.rtk-faq-toggles .toggles[data-style="default"] .toggle > .toggle-title a {
  position: relative;
}
.rtk-faq-toggles .toggles[data-style="default"] .toggle > .toggle-title a > i {
  top: 50%;
  transform: translateY(-50%);
}

/* Form heading patch 02: reusable cyan title with current Salient H1 sizing.
 * Add rtk-form-title-h1 to a Section field's Custom CSS Class, or to
 * Form Settings > CSS Class Name to size the native displayed form title.
 * Use the site cyan; preserve native markup, weight, tracking and spacing.
 * Sizes mirror current Salient Typography settings; no form IDs required.
 */
.gform_wrapper .gsection.rtk-form-title-h1 .gsection_title,
.gform_wrapper.rtk-form-title-h1_wrapper .gform_title {
  color: #059dd9 !important;
  font-size: 60px !important;
  line-height: 62px !important;
}
@media only screen and (max-width: 1300px) and (min-width: 1000px) {
  .gform_wrapper .gsection.rtk-form-title-h1 .gsection_title,
  .gform_wrapper.rtk-form-title-h1_wrapper .gform_title {
    font-size: 45px !important;
    line-height: 47px !important;
  }
}
@media only screen and (max-width: 999px) and (min-width: 691px) {
  .gform_wrapper .gsection.rtk-form-title-h1 .gsection_title,
  .gform_wrapper.rtk-form-title-h1_wrapper .gform_title {
    font-size: 42px !important;
    line-height: 44px !important;
  }
}
@media only screen and (max-width: 690px) {
  .gform_wrapper .gsection.rtk-form-title-h1 .gsection_title,
  .gform_wrapper.rtk-form-title-h1_wrapper .gform_title {
    font-size: 39px !important;
    line-height: 41px !important;
  }
}
