/* ═══════════════════════════════════════════════════════════════════════════
   BISHOP SYSTEMS SEASON KIT
   One stylesheet, one script, the whole year. Pairs with season.js.

   season.js stamps `data-season="<name>"` and `data-season-q="q1".."q4"` on
   <html> from the VISITOR'S clock. Every rule below hangs off those, so a site
   installed once dresses and undresses itself through all four quarters with
   no redeploy and nothing for anyone to remember to switch off.

   INSTALL (once per site, then never again)
     1. In <head>, BEFORE the site's own stylesheets:
            <script src="/season.js?v=1"></script>
        Blocking, not deferred — a deferred script runs after first paint and
        every load flashes the base palette before flipping. External, not
        inline — a site sending `script-src 'self'` with no nonce drops an
        inline script SILENTLY, which works locally and dies in production.
     2. Link this stylesheet LAST, after the site's own CSS.
     3. Optional ornaments, inside the hero:
            <section class="hero season-stage">
              ...
              <div class="season-drift" aria-hidden="true"></div>
              <div class="season-mark" aria-hidden="true"></div>
            </section>
        Add `season-drift--night` on a DARK hero. Add `season-mark--right` to
        move the figure to the other corner. Both are `display: none` outside
        a season, so the markup is inert and costs one unmatched selector.
     4. Optional: `class="season-glow"` on ONE element, usually the primary
        CTA, for a warm seasonal rim.

   WHAT IT DOES NOT DO, ON PURPOSE
     It never repaints the client's brand. Buttons, links, accent and text
     colour stay theirs. A customer who learned that green means "book now" in
     September must not have to relearn it in October, and a body shop is not
     improved by its logo turning purple. This is an atmosphere layer over the
     site plus two opt-in ornaments, not a reskin of it.

   WHY THE ORNAMENTS ARE REAL ELEMENTS AND NOT `::before`/`::after`
     Because a hero that already uses its own pseudo-elements for a scrim, a
     grain overlay or a diagonal stripe is the norm, not the exception, and
     silently losing to one is a bad failure mode to debug at 11pm.

   WHY THE ATMOSPHERE LAYER IS NOT ENOUGH ON ITS OWN
     The fog is a `body::before` at z-index 0. That reads on a site whose
     sections are transparent over the body, and is INVISIBLE on the more
     common case — opaque cards on an opaque page — where it paints and is
     immediately covered. Raising it above the content was tried on
     prscares.com and rejected: a full-viewport scrim dims the nav and the
     pricing cards. Hence the scoped ornaments, placed in the one surface
     people actually look at.
   ═══════════════════════════════════════════════════════════════════════════ */

/* Defaults. Each season overrides --sn-a and --sn-b below; a client whose
   brand fights one of them can override either on their own :root without
   forking this file. --sn-intensity scales the whole atmosphere: drop it to
   0.5 on a very light site if the fog reads as a smudge rather than as light. */
[data-season] {
  --sn-a: #8B5CF6;
  --sn-b: #F59E0B;
  --sn-intensity: 1;
}

/* ── The atmosphere ────────────────────────────────────────────────────────
   One fixed layer painted behind everything: the season's colour blooming
   from the bottom corners, its warm accent from above, like light from just
   out of frame.

   `position: fixed` + `pointer-events: none` are what make this safe to drop
   onto a site nobody has read. It cannot shift a single element's layout,
   cannot trap a click, and cannot break a sticky header. One composited
   layer; it costs nothing to scroll. */
:root[data-season] body::before {
  content: "";
  position: fixed;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  background:
    radial-gradient(120% 70% at 6% 106%,
      color-mix(in oklch, var(--sn-a) calc(15% * var(--sn-intensity)), transparent),
      transparent 62%),
    radial-gradient(112% 62% at 97% 102%,
      color-mix(in oklch, var(--sn-a) calc(11% * var(--sn-intensity)), transparent),
      transparent 58%),
    radial-gradient(92% 44% at 50% -10%,
      color-mix(in oklch, var(--sn-b) calc(9% * var(--sn-intensity)), transparent),
      transparent 60%);
}

/* ── Ornament scaffolding ──────────────────────────────────────────────────
   `season-stage` gives the hero a positioning context and clips the ornaments
   to it. Only applied in season, so it cannot change layout the rest of the
   year — which matters, because `overflow: hidden` on a hero that relies on
   something overflowing would be a real regression in March. */
[data-season] .season-stage {
  position: relative;
  overflow: hidden;
}

.season-drift,
.season-mark {
  display: none;
}

[data-season] .season-drift {
  display: block;
  position: absolute;
  inset: 0;
  z-index: 1;
  pointer-events: none;
  opacity: .62;
  background-repeat: no-repeat;

  /* SIZING is fluid, not fixed px. At a fixed 84px the lead figure was a third
     the width of a 360px phone and a speck on a 2560px monitor. The clamps hold
     it between "still legible" and "still decoration" at both ends. Three sizes
     rather than three copies of one, because the size difference is what reads
     as distance instead of as a row of stickers. */
  background-size:
    clamp(44px, 5.2vw, 96px) auto,
    clamp(28px, 3.2vw, 58px) auto,
    clamp(18px, 2.1vw, 38px) auto;

  /* PLACEMENT is the whole top-right band, and nothing else.

     Two rules, both learned by shipping the wrong thing first:

     Vertically, everything stays above ~17%. A figure at 24-34% flies straight
     through hero headings and form labels — seen on Carvvy, El Paso Roofing and
     NuGen, where the old third position at 31% crossed the headline.

     Horizontally, nothing left of ~58%. Effectively every hero in the book puts
     its headline, its lede and its CTA in the left column, so the left half is
     never free. The right half is sky, photograph or empty — which is where
     things that fly belong anyway. */
  background-position: 61% 7%, 80% 15%, 93% 5%;
}

/* For a hero whose form, card or art sits on the RIGHT, mirror the band to the
   left. Same vertical constraint; only the axis flips. */
[data-season] .season-drift--mirror {
  background-position: 39% 7%, 20% 15%, 7% 5%;
}

/* Full-width spread, for a hero with a centred headline and nothing in either
   upper corner. Still entirely inside the top band. */
[data-season] .season-drift--wide {
  background-position: 8% 6%, 50% 13%, 91% 5%;
}

[data-season] .season-mark {
  display: block;
  position: absolute;
  /* Bottom LEFT by default.

     Bottom right is the obvious choice and it is wrong: a GHL chat bubble docks
     there on almost every site in the book, and a tall hero form reaches it on
     the rest. Two people building this independently both started right and
     both ended up left.

     Left is not free either — it is where the CTA row lands — so the figure is
     lifted clear of it rather than tucked into the corner. See `bottom` below. */
  left: clamp(12px, 3vw, 44px);
  /* Lifted above the CTA/trust row that sits in this corner on most heroes. A
     figure at 10px from the bottom sat behind Tipsy Tiger's stats panel and
     under Nanea's scroll cue; at ~9% up it clears both and still reads as
     resting on the floor of the hero rather than floating in it. */
  bottom: clamp(18px, 9%, 96px);
  z-index: 1;
  /* Fluid, like the drift. Slightly larger than the lead drift figure because
     this is the focal ornament, not atmosphere. */
  width: clamp(52px, 7vw, 108px);
  aspect-ratio: 1;
  pointer-events: none;
  background-repeat: no-repeat;
  background-position: center;
  background-size: contain;
}

/* Opt in to the right corner only after checking that corner on the real page:
   no chat bubble, no form, nothing the hero's own art puts there. */
[data-season] .season-mark--right {
  left: auto;
  right: clamp(12px, 3vw, 44px);
}

/* ── Optional rim on ONE element ───────────────────────────────────────────
   Opt-in per element on purpose: applied to every button it is a costume,
   applied to one it is a highlight. */
[data-season] .season-glow {
  box-shadow:
    0 0 0 1px color-mix(in oklch, var(--sn-b) 40%, transparent),
    0 0 28px -6px color-mix(in oklch, var(--sn-b) 55%, transparent);
}

/* ── Phones ────────────────────────────────────────────────────────────────
   Two things change below 640px and both are measured, not assumed.

   The MARK comes off. A phone hero is a headline and a full-width button, and
   the button owns the bottom of it — a corner figure at 52px overlaps the CTA
   no matter which corner it picks. Verified against a 390px hero with a
   stacked full-width button: it collides. The season still reads from the
   drift, which lives in the top band where nothing else does.

   The DRIFT spreads to full width. A stacked hero has no left copy column and
   no right-hand art, so the reason for hugging the right edge is gone; keeping
   the desktop positions clusters all three figures into one corner. */
@media (max-width: 640px) {
  [data-season] .season-mark {
    display: none;
  }

  [data-season] .season-drift,
  [data-season] .season-drift--mirror,
  [data-season] .season-drift--wide {
    background-position: 12% 6%, 52% 13%, 88% 5%;
  }
}

/* ── Contrast ──────────────────────────────────────────────────────────────
   A silhouette only works against a background it contrasts with, and a hero is
   rarely one thing: PRS is navy until a daylight beach video loads, Paintball is
   a dark copy column beside a sunlit aerial, Smart Tire is black beside a bright
   photograph. Picking one variant and hoping was wrong on three sites out of
   nine, and the failure is total — the figure is simply not there.

   So every figure carries a rim in the opposite direction to its own fill. Dark
   figures get a light halo, pale figures get a dark edge. It costs one filter,
   it is the same on every season, and it removes the question. */
[data-season] .season-drift {
  filter: drop-shadow(0 0 4px rgba(255, 255, 255, .5));
}

[data-season] .season-drift--night {
  filter: drop-shadow(0 1px 3px rgba(0, 0, 0, .6));
}

/* The mark keeps its candle glow, with the same rim underneath it. Declared
   here rather than in the base rule so the animation below has one thing to
   override instead of two. */
[data-season] .season-mark {
  filter:
    drop-shadow(0 0 4px rgba(255, 255, 255, .3))
    drop-shadow(0 0 18px color-mix(in oklch, var(--sn-b) 45%, transparent));
}

/* ── Motion ────────────────────────────────────────────────────────────────
   Transform and filter only, so everything stays on the compositor. Opt-in
   twice: the ornament has to be on the page, and the visitor must not have
   asked for less motion. */
@media (prefers-reduced-motion: no-preference) {
  [data-season] .season-drift {
    animation: sn-drift 24s ease-in-out infinite alternate;
  }

  [data-season] .season-mark {
    animation: sn-flicker 5.5s ease-in-out infinite;
  }

  [data-season] .season-glow {
    animation: sn-rim 4.5s ease-in-out infinite;
  }

  @keyframes sn-drift {
    from { transform: translate3d(0, 0, 0); }
    to   { transform: translate3d(2.6%, -1.8%, 0); }
  }

  /* Uneven stops on purpose: a candle gutters, it does not pulse on a
     metronome, and a symmetric ease reads as a notification badge. */
  /* Each stop restates the white rim as well as the glow. A keyframe replaces
     the whole `filter` value, so listing only the glow here would switch the
     contrast rim off for the entire animation — which is to say, always. */
  @keyframes sn-flicker {
    0%, 100% { filter:
      drop-shadow(0 0 4px rgba(255, 255, 255, .3))
      drop-shadow(0 0 18px color-mix(in oklch, var(--sn-b) 45%, transparent)); }
    41%      { filter:
      drop-shadow(0 0 4px rgba(255, 255, 255, .3))
      drop-shadow(0 0 27px color-mix(in oklch, var(--sn-b) 66%, transparent)); }
    63%      { filter:
      drop-shadow(0 0 4px rgba(255, 255, 255, .3))
      drop-shadow(0 0 15px color-mix(in oklch, var(--sn-b) 38%, transparent)); }
  }

  @keyframes sn-rim {
    0%, 100% { box-shadow:
      0 0 0 1px color-mix(in oklch, var(--sn-b) 40%, transparent),
      0 0 28px -6px color-mix(in oklch, var(--sn-b) 55%, transparent); }
    48%      { box-shadow:
      0 0 0 1px color-mix(in oklch, var(--sn-b) 52%, transparent),
      0 0 38px -4px color-mix(in oklch, var(--sn-b) 68%, transparent); }
  }
}

/* Print gets none of it. A quoted estimate or an invoice printed from the site
   should not arrive with a seasonal wash across it. */
@media print {
  :root[data-season] body::before,
  [data-season] .season-drift,
  [data-season] .season-mark { display: none; }
  [data-season] .season-glow { box-shadow: none; animation: none; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   PER-SEASON PALETTE + ART
   Two custom properties and two images per season. Adding a season means
   adding one block here and one row to the WINDOWS table in season.js.
   ═══════════════════════════════════════════════════════════════════════════ */

/* New Year · Dec 27 - Jan 6 */
[data-season="newyear"] {
  --sn-a: #3B4FD8;
  --sn-b: #E9C46A;
}
[data-season="newyear"] .season-drift {
  background-image:
    url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><path fill='%23e9c46a' d='M50 6l9 33 33 9-33 9-9 33-9-33-33-9 33-9z'/></svg>"),
    url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><path fill='%23e9c46a' d='M50 6l9 33 33 9-33 9-9 33-9-33-33-9 33-9z'/></svg>"),
    url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><path fill='%23e9c46a' d='M50 6l9 33 33 9-33 9-9 33-9-33-33-9 33-9z'/></svg>");
}
[data-season="newyear"] .season-mark {
  background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><path fill='%23e9c46a' d='M50 4l10 34 34 10-34 10-10 34-10-34L6 48l34-10z'/><path fill='%23f5dda0' d='M50 26l5 17 17 5-17 5-5 17-5-17-17-5 17-5z'/><circle cx='20' cy='22' r='4' fill='%23e9c46a'/><circle cx='82' cy='26' r='3' fill='%23f5dda0'/><circle cx='26' cy='82' r='3.5' fill='%23f5dda0'/></svg>");
}

/* Deep winter · Jan 7 - Jan 31 */
[data-season="winter"] {
  --sn-a: #6E96C4;
  --sn-b: #DCE9F5;
}
[data-season="winter"] .season-drift {
  background-image:
    url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><g stroke='%238fb8e0' stroke-width='6' stroke-linecap='round' fill='none'><path d='M50 10v80M15 30l70 40M85 30L15 70'/><path d='M50 26l-11-10M50 26l11-10M50 74l-11 10M50 74l11 10'/><path d='M32 40l-15-1M32 40l-6-13M68 60l15 1M68 60l6 13'/><path d='M68 40l15-1M68 40l6-13M32 60l-15 1M32 60l-6 13'/></g></svg>"),
    url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><g stroke='%238fb8e0' stroke-width='6' stroke-linecap='round' fill='none'><path d='M50 10v80M15 30l70 40M85 30L15 70'/><path d='M50 26l-11-10M50 26l11-10M50 74l-11 10M50 74l11 10'/><path d='M32 40l-15-1M32 40l-6-13M68 60l15 1M68 60l6 13'/><path d='M68 40l15-1M68 40l6-13M32 60l-15 1M32 60l-6 13'/></g></svg>"),
    url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><g stroke='%238fb8e0' stroke-width='6' stroke-linecap='round' fill='none'><path d='M50 10v80M15 30l70 40M85 30L15 70'/><path d='M50 26l-11-10M50 26l11-10M50 74l-11 10M50 74l11 10'/><path d='M32 40l-15-1M32 40l-6-13M68 60l15 1M68 60l6 13'/><path d='M68 40l15-1M68 40l6-13M32 60l-15 1M32 60l-6 13'/></g></svg>");
}
[data-season="winter"] .season-mark {
  background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><g stroke='%23a9cdea' stroke-width='7' stroke-linecap='round' fill='none'><path d='M50 8v84M13 29l74 42M87 29L13 71'/><path d='M50 28l-13-12M50 28l13-12M50 72l-13 12M50 72l13 12'/><path d='M30 40l-17-2M30 40l-7-15M70 60l17 2M70 60l7 15'/><path d='M70 40l17-2M70 40l7-15M30 60l-17 2M30 60l-7 15'/></g></svg>");
}

/* Valentine's · Feb 1 - Feb 14 */
[data-season="valentines"] {
  --sn-a: #D64A6E;
  --sn-b: #F2A0B5;
}
[data-season="valentines"] .season-drift {
  background-image:
    url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><path fill='%23e87a97' d='M50 84 C 20 62, 8 48, 8 33 C 8 20, 18 11, 30 11 C 39 11, 46 16, 50 24 C 54 16, 61 11, 70 11 C 82 11, 92 20, 92 33 C 92 48, 80 62, 50 84 Z'/></svg>"),
    url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><path fill='%23e87a97' d='M50 84 C 20 62, 8 48, 8 33 C 8 20, 18 11, 30 11 C 39 11, 46 16, 50 24 C 54 16, 61 11, 70 11 C 82 11, 92 20, 92 33 C 92 48, 80 62, 50 84 Z'/></svg>"),
    url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><path fill='%23e87a97' d='M50 84 C 20 62, 8 48, 8 33 C 8 20, 18 11, 30 11 C 39 11, 46 16, 50 24 C 54 16, 61 11, 70 11 C 82 11, 92 20, 92 33 C 92 48, 80 62, 50 84 Z'/></svg>");
}
[data-season="valentines"] .season-mark {
  background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><path fill='%23d64a6e' d='M50 84 C 20 62, 8 48, 8 33 C 8 20, 18 11, 30 11 C 39 11, 46 16, 50 24 C 54 16, 61 11, 70 11 C 82 11, 92 20, 92 33 C 92 48, 80 62, 50 84 Z'/></svg>");
}

/* Late winter · Feb 15 - Feb 29 */
[data-season="latewinter"] {
  --sn-a: #6E96C4;
  --sn-b: #DCE9F5;
}
[data-season="latewinter"] .season-drift {
  background-image:
    url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><g stroke='%238fb8e0' stroke-width='6' stroke-linecap='round' fill='none'><path d='M50 10v80M15 30l70 40M85 30L15 70'/><path d='M50 26l-11-10M50 26l11-10M50 74l-11 10M50 74l11 10'/><path d='M32 40l-15-1M32 40l-6-13M68 60l15 1M68 60l6 13'/><path d='M68 40l15-1M68 40l6-13M32 60l-15 1M32 60l-6 13'/></g></svg>"),
    url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><g stroke='%238fb8e0' stroke-width='6' stroke-linecap='round' fill='none'><path d='M50 10v80M15 30l70 40M85 30L15 70'/><path d='M50 26l-11-10M50 26l11-10M50 74l-11 10M50 74l11 10'/><path d='M32 40l-15-1M32 40l-6-13M68 60l15 1M68 60l6 13'/><path d='M68 40l15-1M68 40l6-13M32 60l-15 1M32 60l-6 13'/></g></svg>"),
    url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><g stroke='%238fb8e0' stroke-width='6' stroke-linecap='round' fill='none'><path d='M50 10v80M15 30l70 40M85 30L15 70'/><path d='M50 26l-11-10M50 26l11-10M50 74l-11 10M50 74l11 10'/><path d='M32 40l-15-1M32 40l-6-13M68 60l15 1M68 60l6 13'/><path d='M68 40l15-1M68 40l6-13M32 60l-15 1M32 60l-6 13'/></g></svg>");
}
[data-season="latewinter"] .season-mark {
  background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><g stroke='%23a9cdea' stroke-width='7' stroke-linecap='round' fill='none'><path d='M50 8v84M13 29l74 42M87 29L13 71'/><path d='M50 28l-13-12M50 28l13-12M50 72l-13 12M50 72l13 12'/><path d='M30 40l-17-2M30 40l-7-15M70 60l17 2M70 60l7 15'/><path d='M70 40l17-2M70 40l7-15M30 60l-17 2M30 60l-7 15'/></g></svg>");
}

/* Spring · Mar 1 - May 31 */
[data-season="spring"] {
  --sn-a: #58A65C;
  --sn-b: #F2A7C3;
}
[data-season="spring"] .season-drift {
  background-image:
    url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><g fill='%23f2a7c3'><ellipse cx='50' cy='26' rx='13' ry='20'/><ellipse cx='50' cy='26' rx='13' ry='20' transform='rotate%2872 50 50%29'/><ellipse cx='50' cy='26' rx='13' ry='20' transform='rotate%28144 50 50%29'/><ellipse cx='50' cy='26' rx='13' ry='20' transform='rotate%28216 50 50%29'/><ellipse cx='50' cy='26' rx='13' ry='20' transform='rotate%28288 50 50%29'/></g><circle cx='50' cy='50' r='11' fill='%23f7d774'/></svg>"),
    url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><g fill='%23f2a7c3'><ellipse cx='50' cy='26' rx='13' ry='20'/><ellipse cx='50' cy='26' rx='13' ry='20' transform='rotate%2872 50 50%29'/><ellipse cx='50' cy='26' rx='13' ry='20' transform='rotate%28144 50 50%29'/><ellipse cx='50' cy='26' rx='13' ry='20' transform='rotate%28216 50 50%29'/><ellipse cx='50' cy='26' rx='13' ry='20' transform='rotate%28288 50 50%29'/></g><circle cx='50' cy='50' r='11' fill='%23f7d774'/></svg>"),
    url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><g fill='%23f2a7c3'><ellipse cx='50' cy='26' rx='13' ry='20'/><ellipse cx='50' cy='26' rx='13' ry='20' transform='rotate%2872 50 50%29'/><ellipse cx='50' cy='26' rx='13' ry='20' transform='rotate%28144 50 50%29'/><ellipse cx='50' cy='26' rx='13' ry='20' transform='rotate%28216 50 50%29'/><ellipse cx='50' cy='26' rx='13' ry='20' transform='rotate%28288 50 50%29'/></g><circle cx='50' cy='50' r='11' fill='%23f7d774'/></svg>");
}
[data-season="spring"] .season-mark {
  background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><path stroke='%234a8b3f' stroke-width='6' stroke-linecap='round' fill='none' d='M50 46v48'/><path fill='%234a8b3f' d='M50 70c-14-2-22-10-24-22 14 0 22 8 24 22zM50 82c14-2 22-10 24-22-14 0-22 8-24 22z'/><path fill='%23e0567f' d='M26 30c0-12 11-22 24-22s24 10 24 22c0 14-11 26-24 26S26 44 26 30z'/><path fill='%23f07fa0' d='M38 14c4 10 4 26 0 38-8-6-12-14-12-22 0-6 4-12 12-16z'/><path fill='%23f07fa0' d='M62 14c-4 10-4 26 0 38 8-6 12-14 12-22 0-6-4-12-12-16z'/></svg>");
}

/* Summer · Jun 1 - Aug 20 */
[data-season="summer"] {
  --sn-a: #2FA8C9;
  --sn-b: #F5B83D;
}
[data-season="summer"] .season-drift {
  background-image:
    url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><g stroke='%23f5b83d' stroke-width='7' stroke-linecap='round'><path d='M50 6v14M50 80v14M6 50h14M80 50h14M19 19l10 10M71 71l10 10M81 19L71 29M29 71L19 81'/></g><circle cx='50' cy='50' r='24' fill='%23f7c948'/><circle cx='50' cy='50' r='16' fill='%23fbdc7d'/></svg>"),
    url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><g stroke='%23f5b83d' stroke-width='7' stroke-linecap='round'><path d='M50 6v14M50 80v14M6 50h14M80 50h14M19 19l10 10M71 71l10 10M81 19L71 29M29 71L19 81'/></g><circle cx='50' cy='50' r='24' fill='%23f7c948'/><circle cx='50' cy='50' r='16' fill='%23fbdc7d'/></svg>"),
    url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><g stroke='%23f5b83d' stroke-width='7' stroke-linecap='round'><path d='M50 6v14M50 80v14M6 50h14M80 50h14M19 19l10 10M71 71l10 10M81 19L71 29M29 71L19 81'/></g><circle cx='50' cy='50' r='24' fill='%23f7c948'/><circle cx='50' cy='50' r='16' fill='%23fbdc7d'/></svg>");
}
[data-season="summer"] .season-mark {
  background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><g stroke='%23f5b83d' stroke-width='7' stroke-linecap='round'><path d='M50 6v14M50 80v14M6 50h14M80 50h14M19 19l10 10M71 71l10 10M81 19L71 29M29 71L19 81'/></g><circle cx='50' cy='50' r='24' fill='%23f7c948'/><circle cx='50' cy='50' r='16' fill='%23fbdc7d'/></svg>");
}

/* Late summer / back to school · Aug 21 - Sep 24 */
[data-season="harvest"] {
  --sn-a: #C77A2B;
  --sn-b: #E0A93C;
}
[data-season="harvest"] .season-drift {
  background-image:
    url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><path fill='%23c2712a' d='M50 8c14 14 26 28 26 44 0 17-12 28-26 40C36 80 24 69 24 52 24 36 36 22 50 8z'/><path fill='%23a3561d' d='M50 8c14 14 26 28 26 44 0 17-12 28-26 40z'/><path stroke='%237d3f12' stroke-width='2.5' stroke-linecap='round' fill='none' d='M50 20v68M50 44l14-10M50 60l16-12M50 44L36 34M50 60L34 48'/></svg>"),
    url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><path fill='%23c2712a' d='M50 8c14 14 26 28 26 44 0 17-12 28-26 40C36 80 24 69 24 52 24 36 36 22 50 8z'/><path fill='%23a3561d' d='M50 8c14 14 26 28 26 44 0 17-12 28-26 40z'/><path stroke='%237d3f12' stroke-width='2.5' stroke-linecap='round' fill='none' d='M50 20v68M50 44l14-10M50 60l16-12M50 44L36 34M50 60L34 48'/></svg>"),
    url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><path fill='%23c2712a' d='M50 8c14 14 26 28 26 44 0 17-12 28-26 40C36 80 24 69 24 52 24 36 36 22 50 8z'/><path fill='%23a3561d' d='M50 8c14 14 26 28 26 44 0 17-12 28-26 40z'/><path stroke='%237d3f12' stroke-width='2.5' stroke-linecap='round' fill='none' d='M50 20v68M50 44l14-10M50 60l16-12M50 44L36 34M50 60L34 48'/></svg>");
}
[data-season="harvest"] .season-mark {
  background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><path fill='%234a7c2f' d='M47 20c0-7 4-12 11-14l3 6c-4 1-7 4-7 9z'/><path fill='none' stroke='%234a7c2f' stroke-width='3' stroke-linecap='round' d='M61 12c6-3 11-1 12 3s-3 7-7 5'/><ellipse cx='28' cy='62' rx='22' ry='33' fill='%23d46a17'/><ellipse cx='72' cy='62' rx='22' ry='33' fill='%23d46a17'/><ellipse cx='39' cy='62' rx='21' ry='35' fill='%23ea7f1e'/><ellipse cx='61' cy='62' rx='21' ry='35' fill='%23ea7f1e'/><ellipse cx='50' cy='62' rx='23' ry='36' fill='%23f7941d'/><path stroke='%23c96c14' stroke-width='2.5' fill='none' stroke-linecap='round' d='M39 34c-4 16-4 40 0 56M61 34c4 16 4 40 0 56'/></svg>");
}

/* Halloween · Sep 25 - Oct 31 */
[data-season="halloween"] {
  --sn-a: #8B5CF6;
  --sn-b: #F59E0B;
}
[data-season="halloween"] .season-drift {
  background-image:
    url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 40'><path fill='%23141a24' d='M50 12c3 0 5 2 6 5 4-6 10-10 17-11-3 3-4 7-3 11 5-3 11-3 16 0-6 1-10 5-12 10-4-4-9-6-15-5-3 1-6 3-9 6-3-3-6-5-9-6-6-1-11 1-15 5-2-5-6-9-12-10 5-3 11-3 16 0-1-4 0-8-3-11 7 1 13 5 17 11 1-3 3-5 6-5z'/></svg>"),
    url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 40'><path fill='%23141a24' d='M50 12c3 0 5 2 6 5 4-6 10-10 17-11-3 3-4 7-3 11 5-3 11-3 16 0-6 1-10 5-12 10-4-4-9-6-15-5-3 1-6 3-9 6-3-3-6-5-9-6-6-1-11 1-15 5-2-5-6-9-12-10 5-3 11-3 16 0-1-4 0-8-3-11 7 1 13 5 17 11 1-3 3-5 6-5z'/></svg>"),
    url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 40'><path fill='%23141a24' d='M50 12c3 0 5 2 6 5 4-6 10-10 17-11-3 3-4 7-3 11 5-3 11-3 16 0-6 1-10 5-12 10-4-4-9-6-15-5-3 1-6 3-9 6-3-3-6-5-9-6-6-1-11 1-15 5-2-5-6-9-12-10 5-3 11-3 16 0-1-4 0-8-3-11 7 1 13 5 17 11 1-3 3-5 6-5z'/></svg>");
}
[data-season="halloween"] .season-mark {
  background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><path fill='%234a7c2f' d='M47 20c0-7 4-12 11-14l3 6c-4 1-7 4-7 9z'/><path fill='none' stroke='%234a7c2f' stroke-width='3' stroke-linecap='round' d='M61 12c6-3 11-1 12 3s-3 7-7 5'/><ellipse cx='28' cy='62' rx='22' ry='33' fill='%23d46a17'/><ellipse cx='72' cy='62' rx='22' ry='33' fill='%23d46a17'/><ellipse cx='39' cy='62' rx='21' ry='35' fill='%23ea7f1e'/><ellipse cx='61' cy='62' rx='21' ry='35' fill='%23ea7f1e'/><ellipse cx='50' cy='62' rx='23' ry='36' fill='%23f7941d'/><circle cx='40' cy='54' r='6' fill='%235c2708'/><circle cx='60' cy='54' r='6' fill='%235c2708'/><path fill='%235c2708' d='M34 70c5 8 11 12 16 12s11-4 16-12c-4 2-7 3-9 3l-1-5-3 5h-6l-3-5-1 5c-2 0-5-1-9-3z'/></svg>");
}
[data-season="halloween"] .season-drift {
  opacity: .5;
}
/* Dark hero: the silhouette has to flip or it vanishes into the night. */
[data-season="halloween"] .season-drift--night {
  opacity: .34;
  background-image:
    url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 40'><path fill='%23cfe0f2' d='M50 12c3 0 5 2 6 5 4-6 10-10 17-11-3 3-4 7-3 11 5-3 11-3 16 0-6 1-10 5-12 10-4-4-9-6-15-5-3 1-6 3-9 6-3-3-6-5-9-6-6-1-11 1-15 5-2-5-6-9-12-10 5-3 11-3 16 0-1-4 0-8-3-11 7 1 13 5 17 11 1-3 3-5 6-5z'/></svg>"),
    url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 40'><path fill='%23cfe0f2' d='M50 12c3 0 5 2 6 5 4-6 10-10 17-11-3 3-4 7-3 11 5-3 11-3 16 0-6 1-10 5-12 10-4-4-9-6-15-5-3 1-6 3-9 6-3-3-6-5-9-6-6-1-11 1-15 5-2-5-6-9-12-10 5-3 11-3 16 0-1-4 0-8-3-11 7 1 13 5 17 11 1-3 3-5 6-5z'/></svg>"),
    url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 40'><path fill='%23cfe0f2' d='M50 12c3 0 5 2 6 5 4-6 10-10 17-11-3 3-4 7-3 11 5-3 11-3 16 0-6 1-10 5-12 10-4-4-9-6-15-5-3 1-6 3-9 6-3-3-6-5-9-6-6-1-11 1-15 5-2-5-6-9-12-10 5-3 11-3 16 0-1-4 0-8-3-11 7 1 13 5 17 11 1-3 3-5 6-5z'/></svg>");
}

/* Thanksgiving · Nov 1 - Nov 30 */
[data-season="thanksgiving"] {
  --sn-a: #A8562B;
  --sn-b: #D99B3C;
}
[data-season="thanksgiving"] .season-drift {
  background-image:
    url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><path fill='%23c2712a' d='M50 8c14 14 26 28 26 44 0 17-12 28-26 40C36 80 24 69 24 52 24 36 36 22 50 8z'/><path fill='%23a3561d' d='M50 8c14 14 26 28 26 44 0 17-12 28-26 40z'/><path stroke='%237d3f12' stroke-width='2.5' stroke-linecap='round' fill='none' d='M50 20v68M50 44l14-10M50 60l16-12M50 44L36 34M50 60L34 48'/></svg>"),
    url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><path fill='%23c2712a' d='M50 8c14 14 26 28 26 44 0 17-12 28-26 40C36 80 24 69 24 52 24 36 36 22 50 8z'/><path fill='%23a3561d' d='M50 8c14 14 26 28 26 44 0 17-12 28-26 40z'/><path stroke='%237d3f12' stroke-width='2.5' stroke-linecap='round' fill='none' d='M50 20v68M50 44l14-10M50 60l16-12M50 44L36 34M50 60L34 48'/></svg>"),
    url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><path fill='%23c2712a' d='M50 8c14 14 26 28 26 44 0 17-12 28-26 40C36 80 24 69 24 52 24 36 36 22 50 8z'/><path fill='%23a3561d' d='M50 8c14 14 26 28 26 44 0 17-12 28-26 40z'/><path stroke='%237d3f12' stroke-width='2.5' stroke-linecap='round' fill='none' d='M50 20v68M50 44l14-10M50 60l16-12M50 44L36 34M50 60L34 48'/></svg>");
}
[data-season="thanksgiving"] .season-mark {
  background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><path fill='%234a7c2f' d='M47 20c0-7 4-12 11-14l3 6c-4 1-7 4-7 9z'/><path fill='none' stroke='%234a7c2f' stroke-width='3' stroke-linecap='round' d='M61 12c6-3 11-1 12 3s-3 7-7 5'/><ellipse cx='28' cy='62' rx='22' ry='33' fill='%23d46a17'/><ellipse cx='72' cy='62' rx='22' ry='33' fill='%23d46a17'/><ellipse cx='39' cy='62' rx='21' ry='35' fill='%23ea7f1e'/><ellipse cx='61' cy='62' rx='21' ry='35' fill='%23ea7f1e'/><ellipse cx='50' cy='62' rx='23' ry='36' fill='%23f7941d'/><path stroke='%23c96c14' stroke-width='2.5' fill='none' stroke-linecap='round' d='M39 34c-4 16-4 40 0 56M61 34c4 16 4 40 0 56'/></svg>");
}

/* Christmas · Dec 1 - Dec 26 */
[data-season="christmas"] {
  --sn-a: #1E6E3C;
  --sn-b: #C6303A;
}
[data-season="christmas"] .season-drift {
  background-image:
    url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><g stroke='%238fb8e0' stroke-width='6' stroke-linecap='round' fill='none'><path d='M50 10v80M15 30l70 40M85 30L15 70'/><path d='M50 26l-11-10M50 26l11-10M50 74l-11 10M50 74l11 10'/><path d='M32 40l-15-1M32 40l-6-13M68 60l15 1M68 60l6 13'/><path d='M68 40l15-1M68 40l6-13M32 60l-15 1M32 60l-6 13'/></g></svg>"),
    url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><g stroke='%238fb8e0' stroke-width='6' stroke-linecap='round' fill='none'><path d='M50 10v80M15 30l70 40M85 30L15 70'/><path d='M50 26l-11-10M50 26l11-10M50 74l-11 10M50 74l11 10'/><path d='M32 40l-15-1M32 40l-6-13M68 60l15 1M68 60l6 13'/><path d='M68 40l15-1M68 40l6-13M32 60l-15 1M32 60l-6 13'/></g></svg>"),
    url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><g stroke='%238fb8e0' stroke-width='6' stroke-linecap='round' fill='none'><path d='M50 10v80M15 30l70 40M85 30L15 70'/><path d='M50 26l-11-10M50 26l11-10M50 74l-11 10M50 74l11 10'/><path d='M32 40l-15-1M32 40l-6-13M68 60l15 1M68 60l6 13'/><path d='M68 40l15-1M68 40l6-13M32 60l-15 1M32 60l-6 13'/></g></svg>");
}
[data-season="christmas"] .season-mark {
  background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><path fill='%237a5230' d='M44 84h12v12H44z'/><path fill='%231e6e3c' d='M50 6l22 30H28zM50 28l26 32H24zM50 50l30 36H20z'/><circle cx='50' cy='8' r='6' fill='%23e9c46a'/><circle cx='38' cy='44' r='4' fill='%23c6303a'/><circle cx='63' cy='55' r='4' fill='%23e9c46a'/><circle cx='44' cy='70' r='4.5' fill='%23c6303a'/><circle cx='62' cy='76' r='4' fill='%23dce9f5'/></svg>");
}
