/* VENDORED — do not edit by hand; re-copy from the source and bump ?v= in index.html.
   source: /home/crandellws/projects/ai/gwa_slots/myproject/gwa-slots-website/static-pages/brand/tokens.css
   commit: 607883f32e278ed93b0bde36940a15086842cb94 (gwa-slots-website master, 2026-10-02 18:15 -0400)
   version: ?v=20261002c (the file's own header; identical to 20261002b except that comment)
   Body below is byte-for-byte the source. Its "link it, never copy it" note is
   overridden here on purpose: robthealchemist.com loads no cross-site CSS/fonts.
*/
/* ===========================================================================
   GWA Slots — brand tokens
   Single source of truth. Link it, never copy it:
       <link rel="stylesheet" href="https://gwaslots.com/brand/tokens.css">
   Plain custom properties, so it works on the static pages, the React site,
   the engagement platform, OBS overlays and the Discord activity alike — no
   build step, no framework.

   Machine-readable twin: /brand/tokens.json (same values, for JS/Unity/canvas).

   THE NEON RULE: a tube needs padding WIDER than its outermost bloom, or the
   glow clips and the letters look cramped. --gwa-bloom below reports that
   distance for the current glow strength, so layouts can size off it.

   Fonts are NOT imported here — a page loads only the faces it uses. The
   wordmark face is Courgette:
   <link href="https://fonts.googleapis.com/css2?family=Courgette&display=swap" rel="stylesheet">
   =========================================================================== */

:root {
  /* --- chrome: the blue-navy stage that makes neon read as light ---------- */
  --gwa-bg-1:#14224d;
  --gwa-bg-2:#0c1a3b;
  --gwa-bg-3:#070d23;
  --gwa-bg-4:#04030a;
  --gwa-stage-bg:#060a1c;
  --gwa-stage-glow:rgba(20,34,77,.6);
  --gwa-card-bg:rgba(8,16,40,.55);
  --gwa-card-border:rgba(120,140,200,.14);
  --gwa-text-main:#cdd6f4;
  --gwa-text-soft:#8ea0d0;
  --gwa-text-dim:#6f80b5;
  --gwa-text-faint:#5e6f9e;

  /* --- tube fill: near-white glass. A hue only reads "deep" if the glass
         itself is tinted (see --gwa-reddark-fill). ------------------------- */
  --gwa-tube-fill:#fff7fb;

  /* --- palettes: core (tight) / glow (the tube) / wide (outer bloom) ------ */
  --gwa-pink-core:#ffd6ec;   --gwa-pink-glow:#ff4fc3;   --gwa-pink-wide:#ff1493;
  --gwa-cyan-core:#d6fbff;   --gwa-cyan-glow:#36e7ff;   --gwa-cyan-wide:#00b3ff;
  --gwa-green-core:#d8ffe4;  --gwa-green-glow:#39ff9e;  --gwa-green-wide:#00e676;
  --gwa-gold-core:#fff2cc;   --gwa-gold-glow:#ffcf3f;   --gwa-gold-wide:#ffae00;
  --gwa-purple-core:#ecd9ff; --gwa-purple-glow:#b46bff; --gwa-purple-wide:#8a2be2;
  --gwa-red-core:#ffd0d6;    --gwa-red-glow:#ff5a6e;    --gwa-red-wide:#ff1d3c;
  /* Added 2026-08-21 for the primary set. Deliberately NOT the existing cyan
     or gold: cyan reads green beside red, and the gold is amber enough to
     muddy against it. Blue is the weakest tube at small sizes — give it a
     slightly higher --g than its neighbours if it has to hold a small label. */
  --gwa-blue-core:#dbe7ff;   --gwa-blue-glow:#4f8cff;   --gwa-blue-wide:#0b3ffb;
  --gwa-yellow-core:#fffbd6; --gwa-yellow-glow:#ffe83f; --gwa-yellow-wide:#ffcc00;
  --gwa-reddark-core:#ffb3bd;--gwa-reddark-glow:#e01030;--gwa-reddark-wide:#8b0018;
  --gwa-reddark-fill:#ff5f73;
  /* lightning (2026-10-02): the arc and the surge halo. Bluer and lighter than
     the blue tube, so an arc reads as electricity on top of it, not more tube. */
  --gwa-bolt-color:#6fb0ff;
  --gwa-bolt-core:#e6f1ff;
  /* fire (2026-10-02): the heat layer runs from --gwa-fire-color (orange) at
     the letters to --gwa-fire-core (amber) where it fades. */
  --gwa-fire-color:#ff5a1f;
  --gwa-fire-core:#ffb43a;

  /* --- glow strength. 1 = the house setting. 0.6 = quiet, 1.4 = blazing.
         Set --g on any element (or the page) to scale a whole sign. -------- */
  --gwa-g:1;
  --gwa-bloom:calc(64px * var(--g, var(--gwa-g)));
}

/* --- the recipe -----------------------------------------------------------
   One stack, driven by variables. Hue comes from a .gwa-<colour> class,
   strength from --g. Nothing here is hardcoded per colour, so a new palette
   is four properties, not a new rule.                                       */
.gwa-tube {
  color: var(--fill, var(--gwa-tube-fill));
  text-shadow:
    0 0 calc( 2px * var(--g, var(--gwa-g))) var(--core),
    0 0 calc( 5px * var(--g, var(--gwa-g))) var(--core),
    0 0 calc(10px * var(--g, var(--gwa-g))) var(--glow),
    0 0 calc(20px * var(--g, var(--gwa-g))) var(--glow),
    0 0 calc(38px * var(--g, var(--gwa-g))) var(--wide),
    0 0 calc(64px * var(--g, var(--gwa-g))) var(--wide);
  line-height:1.15;
  display:inline-block;
}
/* At small UI sizes drop the widest layers — they only muddy a panel. */
.gwa-tube.gwa-sm {
  text-shadow:
    0 0 calc( 2px * var(--g, var(--gwa-g))) var(--core),
    0 0 calc( 5px * var(--g, var(--gwa-g))) var(--core),
    0 0 calc(10px * var(--g, var(--gwa-g))) var(--glow),
    0 0 calc(20px * var(--g, var(--gwa-g))) var(--glow),
    0 0 calc(38px * var(--g, var(--gwa-g))) var(--wide);
}

/* --- hues ---------------------------------------------------------------- */
.gwa-pink    { --core:var(--gwa-pink-core);    --glow:var(--gwa-pink-glow);    --wide:var(--gwa-pink-wide); }
.gwa-cyan    { --core:var(--gwa-cyan-core);    --glow:var(--gwa-cyan-glow);    --wide:var(--gwa-cyan-wide); }
.gwa-green   { --core:var(--gwa-green-core);   --glow:var(--gwa-green-glow);   --wide:var(--gwa-green-wide); }
.gwa-gold    { --core:var(--gwa-gold-core);    --glow:var(--gwa-gold-glow);    --wide:var(--gwa-gold-wide); }
.gwa-purple  { --core:var(--gwa-purple-core);  --glow:var(--gwa-purple-glow);  --wide:var(--gwa-purple-wide); }
.gwa-red     { --core:var(--gwa-red-core);     --glow:var(--gwa-red-glow);     --wide:var(--gwa-red-wide); }
.gwa-blue    { --core:var(--gwa-blue-core);    --glow:var(--gwa-blue-glow);    --wide:var(--gwa-blue-wide); }
.gwa-yellow  { --core:var(--gwa-yellow-core);  --glow:var(--gwa-yellow-glow);  --wide:var(--gwa-yellow-wide); }
.gwa-reddark { --core:var(--gwa-reddark-core); --glow:var(--gwa-reddark-glow); --wide:var(--gwa-reddark-wide);
               --fill:var(--gwa-reddark-fill); }

/* --- flicker: an aging tube, never a strobe ------------------------------ */
@keyframes gwa-flicker-soft {
  0%,100%{opacity:1} 92%,94%{opacity:1} 93%{opacity:.72} 96%{opacity:.86}
}
@keyframes gwa-flicker-buzz {
  0%,19%,21%,23%,25%,54%,56%,100%{opacity:1}
  20%{opacity:.6} 22%{opacity:.85} 24%{opacity:.55} 55%{opacity:.78}
}
.gwa-flicker      { animation:gwa-flicker-soft 7s linear infinite; }
.gwa-flicker-buzz { animation:gwa-flicker-buzz 4.5s linear infinite; }
@media (prefers-reduced-motion: reduce) {
  .gwa-flicker, .gwa-flicker-buzz { animation:none; }
}

/* --- three-part signs, soft tubes, lightning and fire ---------------------
   A sign is up to three tubes side by side, each with its own hue. Put the
   word spaces BETWEEN the tubes, never inside one (an edge space inside an
   inline-block collapses away). Case is just the text you write.

     <link href="https://fonts.googleapis.com/css2?family=Courgette&display=swap" rel="stylesheet">
     <link rel="stylesheet" href="https://gwaslots.com/brand/tokens.css?v=20261002c">

     <span class="gwa-mark" style="font-size:96px">
       <span class="gwa-tube gwa-reddark gwa-fire" data-text="ROB">ROB</span>
       <span class="gwa-tube gwa-red gwa-soft">the</span>
       <span class="gwa-tube gwa-blue gwa-lightning" data-text="Alchemist">Alchemist</span>
     </span>

   gwa-soft        a pale, under-driven tube: tinted glass, shorter stack. For
                   the small word that should sit behind its neighbours.
   gwa-lightning   electric-blue glass; now and then an arc jumps across the
                   letter tops with a blue-white surge. Needs data-text equal
                   to the tube's text.
     --gwa-bolt-color      arc halo + surge halo + glass tint  default #6fb0ff
     --gwa-bolt-core       surge glass                         default #e6f1ff
     --gwa-bolt-period     one burst + its calm                default 6.5s (floor 4s)
     --gwa-bolt-delay      offset, to desync tubes             default 0s
     --gwa-bolt-intensity  0-1, scales surge + arc peaks       default 1
   gwa-fire        hot glass with ember heat licking upward off the letters
                   and a slow, irregular warm wobble. Needs data-text too.
     --gwa-fire-color      heat at the letters (orange)        default #ff5a1f
     --gwa-fire-core       heat where it fades (amber)         default #ffb43a
     --gwa-fire-delay      offset, to desync tubes             default 0s
     --gwa-fire-intensity  0-1, scales heat + ember peaks      default 1
   gwa-lightning-soft / gwa-fire-soft   add to the effect class for on-stream
                   use: one gentle 0.8s pulse every 8s, no arc / a slow 8s
                   ember breathe, no rising heat, peaking half a cycle after
                   the lightning pulse so the two never peak together.
   Both effects live on ::before/::after only, so they stack with gwa-flicker.
   They tint the glass toward their own colours whatever the hue class says.

   Flash-safe by construction. Lightning: three flicks inside ~0.75s, then
   calm for the rest of the period (5.75s by default, never under 3.5s), so no
   1-second window ever holds more than three flashes (WCAG 2.3.1); the surge
   brightens a halo around one word, never the sign to white. Fire never goes
   dark: its glow wobbles within about +/-15%, far from a flash. Only opacity,
   transform and filter animate. Reduced motion: no animation — lightning holds
   a steady blue glow, fire a steady ember glow.                              */
.gwa-tube.gwa-soft {
  color:var(--core);                                   /* fallback: no color-mix() */
  color:color-mix(in srgb, color-mix(in srgb, var(--glow) 50%, var(--core)) 80%, var(--gwa-stage-bg));
  text-shadow:
    0 0 calc( 2px * var(--g, var(--gwa-g))) var(--glow),
    0 0 calc( 8px * var(--g, var(--gwa-g))) var(--glow),
    0 0 calc(22px * var(--g, var(--gwa-g))) var(--wide);
  text-shadow:
    0 0 calc( 2px * var(--g, var(--gwa-g))) color-mix(in srgb, var(--glow) 70%, transparent),
    0 0 calc( 8px * var(--g, var(--gwa-g))) color-mix(in srgb, var(--glow) 45%, transparent),
    0 0 calc(22px * var(--g, var(--gwa-g))) color-mix(in srgb, var(--wide) 35%, transparent);
}

/* lightning ----------------------------------------------------------------- */
/* electric glass at rest: an ice-blue fill and a bolt-blue core, so the word
   reads blue at a glance — white-hot only at the peak of a surge */
.gwa-tube.gwa-lightning {
  position:relative;
  --fill:#9cc6ff;
  --fill:color-mix(in srgb, var(--gwa-bolt-color) 72%, #fff);
  --core:var(--gwa-bolt-color);
}
.gwa-lightning::before,
.gwa-lightning::after {
  position:absolute; pointer-events:none; opacity:0;
  animation-duration:max(4s, var(--gwa-bolt-period, 6.5s));
  animation-delay:var(--gwa-bolt-delay, 0s);
  animation-iteration-count:infinite;
}
/* the surge: the same word in blue-white glass with a blue halo, faded in */
.gwa-lightning::before {
  content:attr(data-text);
  content:attr(data-text) / "";          /* hidden from screen readers */
  inset:0; white-space:inherit;
  color:var(--gwa-bolt-core);
  text-shadow:
    0 0 calc( 3px * var(--g, var(--gwa-g))) var(--gwa-bolt-core),
    0 0 calc( 9px * var(--g, var(--gwa-g))) var(--gwa-bolt-color),
    0 0 calc(20px * var(--g, var(--gwa-g))) var(--gwa-bolt-color),
    0 0 calc(40px * var(--g, var(--gwa-g))) var(--gwa-bolt-color);
  animation-name:gwa-bolt-surge;
  animation-timing-function:ease-out;
}
/* the arc: two forked bolts leaping between the letter tops — a white core in
   an ice-blue body, with a static bloom in --gwa-bolt-color. Strokes and bloom
   scale with the font, so the arc holds at small sizes. It jumps between three
   poses so no two flicks look the same. */
.gwa-lightning::after {
  content:"";
  inset:-.1em 0;
  background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 196 60' preserveAspectRatio='none'%3E%3Cg fill='none' stroke-linejoin='round' stroke-linecap='round'%3E%3Cpath stroke='%239cc9ff' stroke-width='3.4' stroke-opacity='.85' d='M25 24L29 19L32 21L36 14L39 16L43 10L48 12L52 7L56 10L60 8L64 12L68 11L72 16L75 15L79 23M52 7L54 14L52 18L55 25M115 25L119 20L123 21L126 15L130 16L134 10L139 12L142 7L146 9L151 8L155 13L159 12L163 17L166 16L171 24M151 8L153 15L151 19L154 26'/%3E%3Cpath stroke='%23ffffff' stroke-width='1.3' d='M25 24L29 19L32 21L36 14L39 16L43 10L48 12L52 7L56 10L60 8L64 12L68 11L72 16L75 15L79 23M52 7L54 14L52 18L55 25M115 25L119 20L123 21L126 15L130 16L134 10L139 12L142 7L146 9L151 8L155 13L159 12L163 17L166 16L171 24M151 8L153 15L151 19L154 26'/%3E%3C/g%3E%3C/svg%3E") center / 100% 100% no-repeat;
  filter:drop-shadow(0 0 .03em var(--gwa-bolt-color)) drop-shadow(0 0 .11em var(--gwa-bolt-color));
  animation-name:gwa-bolt-arc, gwa-bolt-jump;
  animation-timing-function:linear, steps(1, end);
}
/* At the default 6.5s: flicks peak at ~80ms, ~300ms, ~570ms; dark by ~750ms. */
@keyframes gwa-bolt-surge {
  0%{opacity:0}
  1.2%{opacity:calc(.55 * var(--gwa-bolt-intensity, 1))}
  2.6%{opacity:calc(.08 * var(--gwa-bolt-intensity, 1))}
  4.6%{opacity:calc(.75 * var(--gwa-bolt-intensity, 1))}
  6.4%{opacity:calc(.15 * var(--gwa-bolt-intensity, 1))}
  8.8%{opacity:calc(.5 * var(--gwa-bolt-intensity, 1))}
  11.5%,100%{opacity:0}
}
@keyframes gwa-bolt-arc {
  0%,1%{opacity:0} 1.3%{opacity:var(--gwa-bolt-intensity, 1)} 2.1%{opacity:0}
  4.3%{opacity:0} 4.6%{opacity:var(--gwa-bolt-intensity, 1)} 5.9%{opacity:0}
  8.5%{opacity:0} 8.8%{opacity:calc(.85 * var(--gwa-bolt-intensity, 1))} 9.9%,100%{opacity:0}
}
@keyframes gwa-bolt-jump {
  0%{transform:none} 3%{transform:scaleX(-1)} 7%{transform:translateX(-12%)} 11%{transform:none}
}
/* stream-soft: one 0.8s swell and fade every 8s, no arc (~6% luminance) */
@keyframes gwa-bolt-pulse {
  0%{opacity:0} 5%{opacity:calc(.28 * var(--gwa-bolt-intensity, 1))} 10%,100%{opacity:0}
}
.gwa-lightning-soft::before {
  animation-name:gwa-bolt-pulse;
  animation-duration:max(4s, var(--gwa-bolt-period, 8s));
  animation-timing-function:ease-in-out;
}
.gwa-lightning-soft::after { display:none; }

/* fire ---------------------------------------------------------------------- */
/* hot glass: crimson-orange fill and an amber core, whatever the hue says */
.gwa-tube.gwa-fire {
  position:relative;
  --fill:#ff5a3c;
  --fill:color-mix(in srgb, var(--gwa-fire-color) 50%, #ff2a3a);
  --core:#ff8a3a;
  --core:color-mix(in srgb, var(--gwa-fire-core) 45%, var(--gwa-fire-color));
}
.gwa-fire::before,
.gwa-fire::after { position:absolute; pointer-events:none; animation-iteration-count:infinite; }
/* the ember glow: the word's shape as warm light only (transparent glyphs),
   wobbling on two out-of-step cycles so it never visibly repeats */
.gwa-fire::before {
  content:attr(data-text);
  content:attr(data-text) / "";
  inset:0; white-space:inherit;
  color:transparent;
  text-shadow:
    0 0 calc( 4px * var(--g, var(--gwa-g))) var(--gwa-fire-color),
    0 0 calc(14px * var(--g, var(--gwa-g))) var(--gwa-fire-color),
    0 0 calc(34px * var(--g, var(--gwa-g))) var(--glow);
  opacity:calc(.78 * var(--gwa-fire-intensity, 1));
  animation-name:gwa-fire-glow, gwa-fire-heat;
  animation-duration:5.3s, 3.7s;
  animation-delay:var(--gwa-fire-delay, 0s), calc(var(--gwa-fire-delay, 0s) - 1.3s);
  animation-timing-function:ease-in-out;
}
/* the heat: three soft tongues of warm air rising off the letter tops —
   gradients, not text, so it reads as heat and never as a second copy */
.gwa-fire::after {
  content:"";
  inset:auto -.05em 74% -.05em;  height:.7em;
  background:
    radial-gradient(28% 75% at 22% 100%, color-mix(in srgb, var(--gwa-fire-core) 80%, transparent), transparent 70%),
    radial-gradient(24% 95% at 52% 100%, color-mix(in srgb, var(--gwa-fire-color) 90%, transparent), transparent 70%),
    radial-gradient(26% 70% at 80% 100%, color-mix(in srgb, var(--gwa-fire-core) 75%, transparent), transparent 70%);
  filter:blur(.05em);
  transform-origin:50% 100%;
  opacity:0;
  animation-name:gwa-fire-rise;            /* not gwa-fire-heat: it would replace the blur */
  animation-duration:2.3s;
  animation-delay:var(--gwa-fire-delay, 0s);
  animation-timing-function:ease-out;
}
/* 5.3s glow: opacity .66-.90 of intensity (about +/-15% around .78) */
@keyframes gwa-fire-glow {
  0%,100%{opacity:calc(.72 * var(--gwa-fire-intensity, 1))}
  17%{opacity:calc(.86 * var(--gwa-fire-intensity, 1))}
  31%{opacity:calc(.66 * var(--gwa-fire-intensity, 1))}
  48%{opacity:calc(.82 * var(--gwa-fire-intensity, 1))}
  63%{opacity:calc(.70 * var(--gwa-fire-intensity, 1))}
  79%{opacity:calc(.90 * var(--gwa-fire-intensity, 1))}
}
/* 3.7s heat: brightness 0.92-1.12 */
@keyframes gwa-fire-heat {
  0%,100%{filter:brightness(1)} 23%{filter:brightness(1.12)} 41%{filter:brightness(.94)}
  60%{filter:brightness(1.08)} 82%{filter:brightness(.92)}
}
/* 2.3s rise: the tongues swell, lift ~.3em and stretch as they fade */
@keyframes gwa-fire-rise {
  0%{opacity:0; transform:translateY(.08em) scaleY(.8)}
  30%{opacity:calc(.9 * var(--gwa-fire-intensity, 1)); transform:translateY(0) scaleY(1)}
  100%{opacity:0; transform:translateY(-.22em) scaleY(1.5)}
}
/* stream-soft: a slow ember breathe on the SAME 8s cycle as the lightning
   swell, peaking at 55% (4.4s) — half a cycle after the swell's 5% (0.4s) —
   so the two soft effects never peak together. Opacity .62-.72 of intensity
   on the glow layer only: well under 10% luminance. */
@keyframes gwa-fire-breathe {
  0%,100%{opacity:calc(.62 * var(--gwa-fire-intensity, 1))}
  30%{opacity:calc(.645 * var(--gwa-fire-intensity, 1))}
  55%{opacity:calc(.72 * var(--gwa-fire-intensity, 1))}
  78%{opacity:calc(.66 * var(--gwa-fire-intensity, 1))}
}
.gwa-fire-soft::before {
  animation-name:gwa-fire-breathe;
  animation-duration:8s;
  animation-delay:var(--gwa-fire-delay, 0s);
}
.gwa-fire-soft::after { display:none; }

@media (prefers-reduced-motion: reduce) {
  .gwa-lightning::before { animation:none; opacity:calc(.4 * var(--gwa-bolt-intensity, 1)); }
  .gwa-lightning::after  { animation:none; opacity:0; }
  .gwa-fire::before      { animation:none; opacity:calc(.8 * var(--gwa-fire-intensity, 1)); }
  .gwa-fire::after       { animation:none; opacity:0; }
  .gwa-lightning-soft::before { opacity:calc(.22 * var(--gwa-bolt-intensity, 1)); }
  .gwa-fire-soft::before      { opacity:calc(.66 * var(--gwa-fire-intensity, 1)); }
}

/* --- surfaces ------------------------------------------------------------ */
.gwa-page {
  color:var(--gwa-text-main);
  background:
    radial-gradient(1200px 600px at 50% -10%, var(--gwa-bg-1) 0%, rgba(12,26,59,0) 60%),
    linear-gradient(180deg, var(--gwa-bg-2) 0%, var(--gwa-bg-3) 60%, var(--gwa-bg-4) 100%);
  background-attachment:fixed;
}
.gwa-card {
  background:var(--gwa-card-bg);
  border:1px solid var(--gwa-card-border);
  border-radius:14px;
}
/* Padding derives from the bloom, so a tube can never outgrow its stage. */
.gwa-stage {
  display:flex; align-items:center; justify-content:center; text-align:center;
  padding:calc(var(--gwa-bloom) * .75) calc(var(--gwa-bloom) * .6);
  background:
    radial-gradient(420px 200px at 50% 45%, var(--gwa-stage-glow), transparent 70%),
    var(--gwa-stage-bg);
  overflow:hidden;
}

/* --- presets: a finished look, referenced by name ------------------------ */
.gwa-mark { font-family:'Courgette',cursive; white-space:nowrap; }
.gwa-mark > .gwa-tube + .gwa-tube { margin-left:-.04em; }
.gwa-sign-onair {
  display:inline-flex; align-items:center; gap:.9rem;
  border:2px solid rgba(255,90,110,.5); border-radius:999px; padding:.7rem 1.8rem;
  box-shadow:0 0 26px -8px rgba(255,29,60,.75), inset 0 0 22px -12px rgba(255,29,60,.6);
}
.gwa-sign-onair .gwa-bulb {
  width:.62rem; height:.62rem; border-radius:50%; background:var(--gwa-red-glow);
  box-shadow:0 0 12px 2px rgba(255,90,110,.9);
}

/* --- letter-by-letter ------------------------------------------------------
   Wrap each glyph in its own span inside a .gwa-letters container. The glow
   itself never changes — only how lit each tube is — so a chase, a start-up
   sequence and a failing letter are all the same recipe at different timings.

     <span class="gwa-mark gwa-letters gwa-seq">
       <span class="gwa-tube gwa-pink" style="--i:0">G</span>
       <span class="gwa-tube gwa-pink" style="--i:1">W</span> ...

   --i is the letter's position (nth-child fallback below covers 1-24, so plain
   HTML works without setting it). --gwa-step is the gap between letters.       */
.gwa-letters { --gwa-step:.09s; }
.gwa-letters > * { display:inline-block; }

/* unlit → lit, once, in order: a sign starting up */
@keyframes gwa-letter-on { to { opacity:1; } }
.gwa-seq > * {
  opacity:.14;
  animation:gwa-letter-on .45s ease forwards;
  animation-delay:calc(var(--i,0) * var(--gwa-step,.09s));
}

/* a light travelling along the sign, forever */
@keyframes gwa-letter-chase { 0%,70%,100%{opacity:1} 35%{opacity:.2} }
.gwa-chase > * {
  animation:gwa-letter-chase 2.4s ease-in-out infinite;
  animation-delay:calc(var(--i,0) * var(--gwa-step,.09s));
}

/* one tube that never quite made it — put this on a single letter */
@keyframes gwa-letter-dead {
  0%,6%,8%,58%,60%,100%{opacity:1} 7%{opacity:.16} 59%{opacity:.2} 80%{opacity:.8}
}
.gwa-dead { animation:gwa-letter-dead 3.7s steps(1,end) infinite; }

@media (prefers-reduced-motion: reduce) {
  .gwa-seq > *, .gwa-chase > *, .gwa-dead { animation:none; opacity:1; }
}

.gwa-letters > :nth-child(1){--i:0}
.gwa-letters > :nth-child(2){--i:1}
.gwa-letters > :nth-child(3){--i:2}
.gwa-letters > :nth-child(4){--i:3}
.gwa-letters > :nth-child(5){--i:4}
.gwa-letters > :nth-child(6){--i:5}
.gwa-letters > :nth-child(7){--i:6}
.gwa-letters > :nth-child(8){--i:7}
.gwa-letters > :nth-child(9){--i:8}
.gwa-letters > :nth-child(10){--i:9}
.gwa-letters > :nth-child(11){--i:10}
.gwa-letters > :nth-child(12){--i:11}
.gwa-letters > :nth-child(13){--i:12}
.gwa-letters > :nth-child(14){--i:13}
.gwa-letters > :nth-child(15){--i:14}
.gwa-letters > :nth-child(16){--i:15}
.gwa-letters > :nth-child(17){--i:16}
.gwa-letters > :nth-child(18){--i:17}
.gwa-letters > :nth-child(19){--i:18}
.gwa-letters > :nth-child(20){--i:19}
.gwa-letters > :nth-child(21){--i:20}
.gwa-letters > :nth-child(22){--i:21}
.gwa-letters > :nth-child(23){--i:22}
.gwa-letters > :nth-child(24){--i:23}
